528 lines
309 KiB
JavaScript
528 lines
309 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/courrier/emails/route";
|
|
exports.ids = ["app/api/courrier/emails/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/courrier/emails/route.ts":
|
|
/*!******************************************!*\
|
|
!*** ./app/api/courrier/emails/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_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/server */ \"(rsc)/./node_modules/next/dist/api/server.js\");\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next-auth */ \"(rsc)/./node_modules/next-auth/index.js\");\n/* harmony import */ var next_auth__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_auth__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/app/api/auth/[...nextauth]/route */ \"(rsc)/./app/api/auth/[...nextauth]/route.ts\");\n/* harmony import */ var _lib_services_email_service__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/lib/services/email-service */ \"(rsc)/./lib/services/email-service.ts\");\n/* harmony import */ var _lib_redis__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/lib/redis */ \"(rsc)/./lib/redis.ts\");\n\n\n\n\n\nasync function GET(request) {\n try {\n // Authenticate user\n const session = await (0,next_auth__WEBPACK_IMPORTED_MODULE_1__.getServerSession)(_app_api_auth_nextauth_route__WEBPACK_IMPORTED_MODULE_2__.authOptions);\n if (!session || !session.user?.id) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"Not authenticated\"\n }, {\n status: 401\n });\n }\n // Extract query parameters\n const { searchParams } = new URL(request.url);\n const page = parseInt(searchParams.get(\"page\") || \"1\");\n const perPage = parseInt(searchParams.get(\"perPage\") || \"20\");\n const folder = searchParams.get(\"folder\") || \"INBOX\";\n const searchQuery = searchParams.get(\"search\") || \"\";\n const accountId = searchParams.get(\"accountId\") || \"\";\n const checkOnly = searchParams.get(\"checkOnly\") === \"true\";\n // Log exact parameters received by the API\n console.log(`[API/emails] Received request with: folder=${folder}, accountId=${accountId}, page=${page}, checkOnly=${checkOnly}`);\n // Parameter normalization\n // If folder contains an account prefix, extract it but DO NOT use it\n // Always prioritize the explicit accountId parameter\n let normalizedFolder = folder;\n let effectiveAccountId = accountId || 'default';\n if (folder.includes(':')) {\n const parts = folder.split(':');\n normalizedFolder = parts[1];\n console.log(`[API/emails] Folder has prefix, normalized to ${normalizedFolder}`);\n }\n console.log(`[API/emails] Using normalized parameters: folder=${normalizedFolder}, accountId=${effectiveAccountId}`);\n // Try to get from Redis cache first, but only if it's not a search query and not checkOnly\n if (!searchQuery && !checkOnly) {\n console.log(`[API/emails] Checking Redis cache for ${session.user.id}:${effectiveAccountId}:${normalizedFolder}:${page}:${perPage}`);\n const cachedEmails = await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_4__.getCachedEmailList)(session.user.id, effectiveAccountId, normalizedFolder, page, perPage);\n if (cachedEmails) {\n console.log(`[API/emails] Using Redis cached emails for ${session.user.id}:${effectiveAccountId}:${normalizedFolder}:${page}:${perPage}`);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json(cachedEmails);\n }\n }\n console.log(`[API/emails] Redis cache miss for ${session.user.id}:${effectiveAccountId}:${normalizedFolder}:${page}:${perPage}, fetching emails from IMAP`);\n // Use the email service to fetch emails\n const emailsResult = await (0,_lib_services_email_service__WEBPACK_IMPORTED_MODULE_3__.getEmails)(session.user.id, normalizedFolder, page, perPage, effectiveAccountId, checkOnly);\n console.log(`[API/emails] Successfully fetched ${emailsResult.emails.length} emails from IMAP for account ${effectiveAccountId}`);\n // Return result\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json(emailsResult);\n } catch (error) {\n console.error(\"[API/emails] Error fetching emails:\", error);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"Failed to fetch emails\",\n message: error.message\n }, {\n status: 500\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvYXBpL2NvdXJyaWVyL2VtYWlscy9yb3V0ZS50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQTJDO0FBQ0U7QUFDb0I7QUFDUjtBQUtwQztBQUVkLGVBQWVLLElBQUlDLE9BQWdCO0lBQ3hDLElBQUk7UUFDRixvQkFBb0I7UUFDcEIsTUFBTUMsVUFBVSxNQUFNTiwyREFBZ0JBLENBQUNDLHFFQUFXQTtRQUNsRCxJQUFJLENBQUNLLFdBQVcsQ0FBQ0EsUUFBUUMsSUFBSSxFQUFFQyxJQUFJO1lBQ2pDLE9BQU9ULHFEQUFZQSxDQUFDVSxJQUFJLENBQ3RCO2dCQUFFQyxPQUFPO1lBQW9CLEdBQzdCO2dCQUFFQyxRQUFRO1lBQUk7UUFFbEI7UUFFQSwyQkFBMkI7UUFDM0IsTUFBTSxFQUFFQyxZQUFZLEVBQUUsR0FBRyxJQUFJQyxJQUFJUixRQUFRUyxHQUFHO1FBQzVDLE1BQU1DLE9BQU9DLFNBQVNKLGFBQWFLLEdBQUcsQ0FBQyxXQUFXO1FBQ2xELE1BQU1DLFVBQVVGLFNBQVNKLGFBQWFLLEdBQUcsQ0FBQyxjQUFjO1FBQ3hELE1BQU1FLFNBQVNQLGFBQWFLLEdBQUcsQ0FBQyxhQUFhO1FBQzdDLE1BQU1HLGNBQWNSLGFBQWFLLEdBQUcsQ0FBQyxhQUFhO1FBQ2xELE1BQU1JLFlBQVlULGFBQWFLLEdBQUcsQ0FBQyxnQkFBZ0I7UUFDbkQsTUFBTUssWUFBWVYsYUFBYUssR0FBRyxDQUFDLGlCQUFpQjtRQUVwRCwyQ0FBMkM7UUFDM0NNLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLDJDQUEyQyxFQUFFTCxPQUFPLFlBQVksRUFBRUUsVUFBVSxPQUFPLEVBQUVOLEtBQUssWUFBWSxFQUFFTyxXQUFXO1FBRWhJLDBCQUEwQjtRQUMxQixxRUFBcUU7UUFDckUscURBQXFEO1FBQ3JELElBQUlHLG1CQUFtQk47UUFDdkIsSUFBSU8scUJBQXFCTCxhQUFhO1FBRXRDLElBQUlGLE9BQU9RLFFBQVEsQ0FBQyxNQUFNO1lBQ3hCLE1BQU1DLFFBQVFULE9BQU9VLEtBQUssQ0FBQztZQUMzQkosbUJBQW1CRyxLQUFLLENBQUMsRUFBRTtZQUUzQkwsUUFBUUMsR0FBRyxDQUFDLENBQUMsOENBQThDLEVBQUVDLGtCQUFrQjtRQUNqRjtRQUVBRixRQUFRQyxHQUFHLENBQUMsQ0FBQyxpREFBaUQsRUFBRUMsaUJBQWlCLFlBQVksRUFBRUMsb0JBQW9CO1FBRW5ILDJGQUEyRjtRQUMzRixJQUFJLENBQUNOLGVBQWUsQ0FBQ0UsV0FBVztZQUM5QkMsUUFBUUMsR0FBRyxDQUFDLENBQUMsc0NBQXNDLEVBQUVsQixRQUFRQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDLEVBQUVrQixtQkFBbUIsQ0FBQyxFQUFFRCxpQkFBaUIsQ0FBQyxFQUFFVixLQUFLLENBQUMsRUFBRUcsU0FBUztZQUNuSSxNQUFNWSxlQUFlLE1BQU0zQiw4REFBa0JBLENBQzNDRyxRQUFRQyxJQUFJLENBQUNDLEVBQUUsRUFDZmtCLG9CQUNBRCxrQkFDQVYsTUFDQUc7WUFFRixJQUFJWSxjQUFjO2dCQUNoQlAsUUFBUUMsR0FBRyxDQUFDLENBQUMsMkNBQTJDLEVBQUVsQixRQUFRQyxJQUFJLENBQUNDLEVBQUUsQ0FBQyxDQUFDLEVBQUVrQixtQkFBbUIsQ0FBQyxFQUFFRCxpQkFBaUIsQ0FBQyxFQUFFVixLQUFLLENBQUMsRUFBRUcsU0FBUztnQkFDeEksT0FBT25CLHFEQUFZQSxDQUFDVSxJQUFJLENBQUNxQjtZQUMzQjtRQUNGO1FBRUFQLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLGtDQUFrQyxFQUFFbEIsUUFBUUMsSUFBSSxDQUFDQyxFQUFFLENBQUMsQ0FBQyxFQUFFa0IsbUJBQW1CLENBQUMsRUFBRUQsaUJBQWlCLENBQUMsRUFBRVYsS0FBSyxDQUFDLEVBQUVHLFFBQVEsMkJBQTJCLENBQUM7UUFFMUosd0NBQXdDO1FBQ3hDLE1BQU1hLGVBQWUsTUFBTTdCLHNFQUFTQSxDQUNsQ0ksUUFBUUMsSUFBSSxDQUFDQyxFQUFFLEVBQ2ZpQixrQkFDQVYsTUFDQUcsU0FDQVEsb0JBQ0FKO1FBR0ZDLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLGtDQUFrQyxFQUFFTyxhQUFhQyxNQUFNLENBQUNDLE1BQU0sQ0FBQyw4QkFBOEIsRUFBRVAsb0JBQW9CO1FBRWhJLGdCQUFnQjtRQUNoQixPQUFPM0IscURBQVlBLENBQUNVLElBQUksQ0FBQ3NCO0lBQzNCLEVBQUUsT0FBT3JCLE9BQVk7UUFDbkJhLFFBQVFiLEtBQUssQ0FBQyx1Q0FBdUNBO1FBQ3JELE9BQU9YLHFEQUFZQSxDQUFDVSxJQUFJLENBQ3RCO1lBQUVDLE9BQU87WUFBMEJ3QixTQUFTeEIsTUFBTXdCLE9BQU87UUFBQyxHQUMxRDtZQUFFdkIsUUFBUTtRQUFJO0lBRWxCO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvYXBwL2FwaS9jb3Vycmllci9lbWFpbHMvcm91dGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmV4dFJlc3BvbnNlIH0gZnJvbSAnbmV4dC9zZXJ2ZXInO1xuaW1wb3J0IHsgZ2V0U2VydmVyU2Vzc2lvbiB9IGZyb20gJ25leHQtYXV0aCc7XG5pbXBvcnQgeyBhdXRoT3B0aW9ucyB9IGZyb20gJ0AvYXBwL2FwaS9hdXRoL1suLi5uZXh0YXV0aF0vcm91dGUnO1xuaW1wb3J0IHsgZ2V0RW1haWxzIH0gZnJvbSAnQC9saWIvc2VydmljZXMvZW1haWwtc2VydmljZSc7XG5pbXBvcnQgeyBcbiAgZ2V0Q2FjaGVkRW1haWxMaXN0LCBcbiAgY2FjaGVFbWFpbExpc3QsIFxuICBpbnZhbGlkYXRlRm9sZGVyQ2FjaGUgXG59IGZyb20gJ0AvbGliL3JlZGlzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEdFVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gIHRyeSB7XG4gICAgLy8gQXV0aGVudGljYXRlIHVzZXJcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0U2VydmVyU2Vzc2lvbihhdXRoT3B0aW9ucyk7XG4gICAgaWYgKCFzZXNzaW9uIHx8ICFzZXNzaW9uLnVzZXI/LmlkKSB7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oXG4gICAgICAgIHsgZXJyb3I6IFwiTm90IGF1dGhlbnRpY2F0ZWRcIiB9LFxuICAgICAgICB7IHN0YXR1czogNDAxIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAgY29uc3QgeyBzZWFyY2hQYXJhbXMgfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IHBhZ2UgPSBwYXJzZUludChzZWFyY2hQYXJhbXMuZ2V0KFwicGFnZVwiKSB8fCBcIjFcIik7XG4gICAgY29uc3QgcGVyUGFnZSA9IHBhcnNlSW50KHNlYXJjaFBhcmFtcy5nZXQoXCJwZXJQYWdlXCIpIHx8IFwiMjBcIik7XG4gICAgY29uc3QgZm9sZGVyID0gc2VhcmNoUGFyYW1zLmdldChcImZvbGRlclwiKSB8fCBcIklOQk9YXCI7XG4gICAgY29uc3Qgc2VhcmNoUXVlcnkgPSBzZWFyY2hQYXJhbXMuZ2V0KFwic2VhcmNoXCIpIHx8IFwiXCI7XG4gICAgY29uc3QgYWNjb3VudElkID0gc2VhcmNoUGFyYW1zLmdldChcImFjY291bnRJZFwiKSB8fCBcIlwiO1xuICAgIGNvbnN0IGNoZWNrT25seSA9IHNlYXJjaFBhcmFtcy5nZXQoXCJjaGVja09ubHlcIikgPT09IFwidHJ1ZVwiO1xuICAgIFxuICAgIC8vIExvZyBleGFjdCBwYXJhbWV0ZXJzIHJlY2VpdmVkIGJ5IHRoZSBBUElcbiAgICBjb25zb2xlLmxvZyhgW0FQSS9lbWFpbHNdIFJlY2VpdmVkIHJlcXVlc3Qgd2l0aDogZm9sZGVyPSR7Zm9sZGVyfSwgYWNjb3VudElkPSR7YWNjb3VudElkfSwgcGFnZT0ke3BhZ2V9LCBjaGVja09ubHk9JHtjaGVja09ubHl9YCk7XG4gICAgXG4gICAgLy8gUGFyYW1ldGVyIG5vcm1hbGl6YXRpb25cbiAgICAvLyBJZiBmb2xkZXIgY29udGFpbnMgYW4gYWNjb3VudCBwcmVmaXgsIGV4dHJhY3QgaXQgYnV0IERPIE5PVCB1c2UgaXRcbiAgICAvLyBBbHdheXMgcHJpb3JpdGl6ZSB0aGUgZXhwbGljaXQgYWNjb3VudElkIHBhcmFtZXRlclxuICAgIGxldCBub3JtYWxpemVkRm9sZGVyID0gZm9sZGVyO1xuICAgIGxldCBlZmZlY3RpdmVBY2NvdW50SWQgPSBhY2NvdW50SWQgfHwgJ2RlZmF1bHQnO1xuICAgIFxuICAgIGlmIChmb2xkZXIuaW5jbHVkZXMoJzonKSkge1xuICAgICAgY29uc3QgcGFydHMgPSBmb2xkZXIuc3BsaXQoJzonKTtcbiAgICAgIG5vcm1hbGl6ZWRGb2xkZXIgPSBwYXJ0c1sxXTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coYFtBUEkvZW1haWxzXSBGb2xkZXIgaGFzIHByZWZpeCwgbm9ybWFsaXplZCB0byAke25vcm1hbGl6ZWRGb2xkZXJ9YCk7XG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKGBbQVBJL2VtYWlsc10gVXNpbmcgbm9ybWFsaXplZCBwYXJhbWV0ZXJzOiBmb2xkZXI9JHtub3JtYWxpemVkRm9sZGVyfSwgYWNjb3VudElkPSR7ZWZmZWN0aXZlQWNjb3VudElkfWApO1xuICAgIFxuICAgIC8vIFRyeSB0byBnZXQgZnJvbSBSZWRpcyBjYWNoZSBmaXJzdCwgYnV0IG9ubHkgaWYgaXQncyBub3QgYSBzZWFyY2ggcXVlcnkgYW5kIG5vdCBjaGVja09ubHlcbiAgICBpZiAoIXNlYXJjaFF1ZXJ5ICYmICFjaGVja09ubHkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBbQVBJL2VtYWlsc10gQ2hlY2tpbmcgUmVkaXMgY2FjaGUgZm9yICR7c2Vzc2lvbi51c2VyLmlkfToke2VmZmVjdGl2ZUFjY291bnRJZH06JHtub3JtYWxpemVkRm9sZGVyfToke3BhZ2V9OiR7cGVyUGFnZX1gKTtcbiAgICAgIGNvbnN0IGNhY2hlZEVtYWlscyA9IGF3YWl0IGdldENhY2hlZEVtYWlsTGlzdChcbiAgICAgICAgc2Vzc2lvbi51c2VyLmlkLFxuICAgICAgICBlZmZlY3RpdmVBY2NvdW50SWQsXG4gICAgICAgIG5vcm1hbGl6ZWRGb2xkZXIsXG4gICAgICAgIHBhZ2UsXG4gICAgICAgIHBlclBhZ2VcbiAgICAgICk7XG4gICAgICBpZiAoY2FjaGVkRW1haWxzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbQVBJL2VtYWlsc10gVXNpbmcgUmVkaXMgY2FjaGVkIGVtYWlscyBmb3IgJHtzZXNzaW9uLnVzZXIuaWR9OiR7ZWZmZWN0aXZlQWNjb3VudElkfToke25vcm1hbGl6ZWRGb2xkZXJ9OiR7cGFnZX06JHtwZXJQYWdlfWApO1xuICAgICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oY2FjaGVkRW1haWxzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgW0FQSS9lbWFpbHNdIFJlZGlzIGNhY2hlIG1pc3MgZm9yICR7c2Vzc2lvbi51c2VyLmlkfToke2VmZmVjdGl2ZUFjY291bnRJZH06JHtub3JtYWxpemVkRm9sZGVyfToke3BhZ2V9OiR7cGVyUGFnZX0sIGZldGNoaW5nIGVtYWlscyBmcm9tIElNQVBgKTtcblxuICAgIC8vIFVzZSB0aGUgZW1haWwgc2VydmljZSB0byBmZXRjaCBlbWFpbHNcbiAgICBjb25zdCBlbWFpbHNSZXN1bHQgPSBhd2FpdCBnZXRFbWFpbHMoXG4gICAgICBzZXNzaW9uLnVzZXIuaWQsXG4gICAgICBub3JtYWxpemVkRm9sZGVyLFxuICAgICAgcGFnZSxcbiAgICAgIHBlclBhZ2UsXG4gICAgICBlZmZlY3RpdmVBY2NvdW50SWQsXG4gICAgICBjaGVja09ubHlcbiAgICApO1xuXG4gICAgY29uc29sZS5sb2coYFtBUEkvZW1haWxzXSBTdWNjZXNzZnVsbHkgZmV0Y2hlZCAke2VtYWlsc1Jlc3VsdC5lbWFpbHMubGVuZ3RofSBlbWFpbHMgZnJvbSBJTUFQIGZvciBhY2NvdW50ICR7ZWZmZWN0aXZlQWNjb3VudElkfWApO1xuXG4gICAgLy8gUmV0dXJuIHJlc3VsdFxuICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbihlbWFpbHNSZXN1bHQpO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcihcIltBUEkvZW1haWxzXSBFcnJvciBmZXRjaGluZyBlbWFpbHM6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oXG4gICAgICB7IGVycm9yOiBcIkZhaWxlZCB0byBmZXRjaCBlbWFpbHNcIiwgbWVzc2FnZTogZXJyb3IubWVzc2FnZSB9LFxuICAgICAgeyBzdGF0dXM6IDUwMCB9XG4gICAgKTtcbiAgfVxufSAiXSwibmFtZXMiOlsiTmV4dFJlc3BvbnNlIiwiZ2V0U2VydmVyU2Vzc2lvbiIsImF1dGhPcHRpb25zIiwiZ2V0RW1haWxzIiwiZ2V0Q2FjaGVkRW1haWxMaXN0IiwiR0VUIiwicmVxdWVzdCIsInNlc3Npb24iLCJ1c2VyIiwiaWQiLCJqc29uIiwiZXJyb3IiLCJzdGF0dXMiLCJzZWFyY2hQYXJhbXMiLCJVUkwiLCJ1cmwiLCJwYWdlIiwicGFyc2VJbnQiLCJnZXQiLCJwZXJQYWdlIiwiZm9sZGVyIiwic2VhcmNoUXVlcnkiLCJhY2NvdW50SWQiLCJjaGVja09ubHkiLCJjb25zb2xlIiwibG9nIiwibm9ybWFsaXplZEZvbGRlciIsImVmZmVjdGl2ZUFjY291bnRJZCIsImluY2x1ZGVzIiwicGFydHMiLCJzcGxpdCIsImNhY2hlZEVtYWlscyIsImVtYWlsc1Jlc3VsdCIsImVtYWlscyIsImxlbmd0aCIsIm1lc3NhZ2UiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./app/api/courrier/emails/route.ts\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./lib/env.ts":
|
|
/*!********************!*\
|
|
!*** ./lib/env.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 */ env: () => (/* binding */ env)\n/* harmony export */ });\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ \"(rsc)/./node_modules/zod/lib/index.mjs\");\n\nconst envSchema = zod__WEBPACK_IMPORTED_MODULE_0__.z.object({\n NODE_ENV: zod__WEBPACK_IMPORTED_MODULE_0__.z.enum([\n \"development\",\n \"test\",\n \"production\"\n ]).default(\"development\"),\n DATABASE_URL: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().url(),\n NEWSDB_URL: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().regex(/^postgresql:\\/\\//, \"Must be a valid PostgreSQL URL\"),\n NEWS_API_URL: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().url(),\n KEYCLOAK_CLIENT_ID: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(),\n KEYCLOAK_CLIENT_SECRET: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(),\n KEYCLOAK_REALM: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(),\n KEYCLOAK_ISSUER: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().url(),\n LEANTIME_TOKEN: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(),\n LEANTIME_API_URL: zod__WEBPACK_IMPORTED_MODULE_0__.z.string().url(),\n ROCKET_CHAT_TOKEN: zod__WEBPACK_IMPORTED_MODULE_0__.z.string(),\n ROCKET_CHAT_USER_ID: zod__WEBPACK_IMPORTED_MODULE_0__.z.string()\n});\nconst env = envSchema.parse(process.env);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9saWIvZW52LnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQXdCO0FBRXhCLE1BQU1DLFlBQVlELGtDQUFDQSxDQUFDRSxNQUFNLENBQUM7SUFDekJDLFVBQVVILGtDQUFDQSxDQUFDSSxJQUFJLENBQUM7UUFBQztRQUFlO1FBQVE7S0FBYSxFQUFFQyxPQUFPLENBQUM7SUFDaEVDLGNBQWNOLGtDQUFDQSxDQUFDTyxNQUFNLEdBQUdDLEdBQUc7SUFDNUJDLFlBQVlULGtDQUFDQSxDQUFDTyxNQUFNLEdBQUdHLEtBQUssQ0FBQyxvQkFBb0I7SUFDakRDLGNBQWNYLGtDQUFDQSxDQUFDTyxNQUFNLEdBQUdDLEdBQUc7SUFDNUJJLG9CQUFvQlosa0NBQUNBLENBQUNPLE1BQU07SUFDNUJNLHdCQUF3QmIsa0NBQUNBLENBQUNPLE1BQU07SUFDaENPLGdCQUFnQmQsa0NBQUNBLENBQUNPLE1BQU07SUFDeEJRLGlCQUFpQmYsa0NBQUNBLENBQUNPLE1BQU0sR0FBR0MsR0FBRztJQUMvQlEsZ0JBQWdCaEIsa0NBQUNBLENBQUNPLE1BQU07SUFDeEJVLGtCQUFrQmpCLGtDQUFDQSxDQUFDTyxNQUFNLEdBQUdDLEdBQUc7SUFDaENVLG1CQUFtQmxCLGtDQUFDQSxDQUFDTyxNQUFNO0lBQzNCWSxxQkFBcUJuQixrQ0FBQ0EsQ0FBQ08sTUFBTTtBQUMvQjtBQUVPLE1BQU1hLE1BQU1uQixVQUFVb0IsS0FBSyxDQUFDQyxRQUFRRixHQUFHLEVBQUUiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbGliL2Vudi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBlbnZTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIE5PREVfRU5WOiB6LmVudW0oW1wiZGV2ZWxvcG1lbnRcIiwgXCJ0ZXN0XCIsIFwicHJvZHVjdGlvblwiXSkuZGVmYXVsdChcImRldmVsb3BtZW50XCIpLFxuICBEQVRBQkFTRV9VUkw6IHouc3RyaW5nKCkudXJsKCksXG4gIE5FV1NEQl9VUkw6IHouc3RyaW5nKCkucmVnZXgoL15wb3N0Z3Jlc3FsOlxcL1xcLy8sIFwiTXVzdCBiZSBhIHZhbGlkIFBvc3RncmVTUUwgVVJMXCIpLFxuICBORVdTX0FQSV9VUkw6IHouc3RyaW5nKCkudXJsKCksXG4gIEtFWUNMT0FLX0NMSUVOVF9JRDogei5zdHJpbmcoKSxcbiAgS0VZQ0xPQUtfQ0xJRU5UX1NFQ1JFVDogei5zdHJpbmcoKSxcbiAgS0VZQ0xPQUtfUkVBTE06IHouc3RyaW5nKCksXG4gIEtFWUNMT0FLX0lTU1VFUjogei5zdHJpbmcoKS51cmwoKSxcbiAgTEVBTlRJTUVfVE9LRU46IHouc3RyaW5nKCksXG4gIExFQU5USU1FX0FQSV9VUkw6IHouc3RyaW5nKCkudXJsKCksXG4gIFJPQ0tFVF9DSEFUX1RPS0VOOiB6LnN0cmluZygpLFxuICBST0NLRVRfQ0hBVF9VU0VSX0lEOiB6LnN0cmluZygpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBlbnYgPSBlbnZTY2hlbWEucGFyc2UocHJvY2Vzcy5lbnYpOyAiXSwibmFtZXMiOlsieiIsImVudlNjaGVtYSIsIm9iamVjdCIsIk5PREVfRU5WIiwiZW51bSIsImRlZmF1bHQiLCJEQVRBQkFTRV9VUkwiLCJzdHJpbmciLCJ1cmwiLCJORVdTREJfVVJMIiwicmVnZXgiLCJORVdTX0FQSV9VUkwiLCJLRVlDTE9BS19DTElFTlRfSUQiLCJLRVlDTE9BS19DTElFTlRfU0VDUkVUIiwiS0VZQ0xPQUtfUkVBTE0iLCJLRVlDTE9BS19JU1NVRVIiLCJMRUFOVElNRV9UT0tFTiIsIkxFQU5USU1FX0FQSV9VUkwiLCJST0NLRVRfQ0hBVF9UT0tFTiIsIlJPQ0tFVF9DSEFUX1VTRVJfSUQiLCJlbnYiLCJwYXJzZSIsInByb2Nlc3MiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./lib/env.ts\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./lib/prisma.ts":
|
|
/*!***********************!*\
|
|
!*** ./lib/prisma.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 */ prisma: () => (/* binding */ prisma)\n/* harmony export */ });\n/* harmony import */ var _prisma_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @prisma/client */ \"@prisma/client\");\n/* harmony import */ var _prisma_client__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_prisma_client__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _lib_env__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/env */ \"(rsc)/./lib/env.ts\");\n// front/lib/prisma.ts\n\n\nconst globalForPrisma = globalThis;\n// Main database client\nconst prisma = globalForPrisma.prisma || new _prisma_client__WEBPACK_IMPORTED_MODULE_0__.PrismaClient({\n datasources: {\n db: {\n url: _lib_env__WEBPACK_IMPORTED_MODULE_1__.env.DATABASE_URL\n }\n },\n log: [\n 'query'\n ]\n});\nif (true) {\n globalForPrisma.prisma = prisma;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9saWIvcHJpc21hLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxzQkFBc0I7QUFDdUI7QUFDZDtBQUUvQixNQUFNRSxrQkFBa0JDO0FBSXhCLHVCQUF1QjtBQUNoQixNQUFNQyxTQUNYRixnQkFBZ0JFLE1BQU0sSUFDdEIsSUFBSUosd0RBQVlBLENBQUM7SUFDZkssYUFBYTtRQUNYQyxJQUFJO1lBQ0ZDLEtBQUtOLHlDQUFHQSxDQUFDTyxZQUFZO1FBQ3ZCO0lBQ0Y7SUFDQUMsS0FBSztRQUFDO0tBQVE7QUFDaEIsR0FBRTtBQUVKLElBQUlDLElBQXFDLEVBQUU7SUFDekNSLGdCQUFnQkUsTUFBTSxHQUFHQTtBQUMzQiIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvcHJpc21hLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZyb250L2xpYi9wcmlzbWEudHNcbmltcG9ydCB7IFByaXNtYUNsaWVudCB9IGZyb20gJ0BwcmlzbWEvY2xpZW50J1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnQC9saWIvZW52J1xuXG5jb25zdCBnbG9iYWxGb3JQcmlzbWEgPSBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMge1xuICBwcmlzbWE6IFByaXNtYUNsaWVudCB8IHVuZGVmaW5lZDtcbn1cblxuLy8gTWFpbiBkYXRhYmFzZSBjbGllbnRcbmV4cG9ydCBjb25zdCBwcmlzbWEgPVxuICBnbG9iYWxGb3JQcmlzbWEucHJpc21hIHx8XG4gIG5ldyBQcmlzbWFDbGllbnQoe1xuICAgIGRhdGFzb3VyY2VzOiB7XG4gICAgICBkYjoge1xuICAgICAgICB1cmw6IGVudi5EQVRBQkFTRV9VUkxcbiAgICAgIH1cbiAgICB9LFxuICAgIGxvZzogWydxdWVyeSddLFxuICB9KVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBnbG9iYWxGb3JQcmlzbWEucHJpc21hID0gcHJpc21hO1xufVxuIl0sIm5hbWVzIjpbIlByaXNtYUNsaWVudCIsImVudiIsImdsb2JhbEZvclByaXNtYSIsImdsb2JhbFRoaXMiLCJwcmlzbWEiLCJkYXRhc291cmNlcyIsImRiIiwidXJsIiwiREFUQUJBU0VfVVJMIiwibG9nIiwicHJvY2VzcyJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./lib/prisma.ts\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./lib/redis.ts":
|
|
/*!**********************!*\
|
|
!*** ./lib/redis.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 */ KEYS: () => (/* binding */ KEYS),\n/* harmony export */ TTL: () => (/* binding */ TTL),\n/* harmony export */ cacheEmailContent: () => (/* binding */ cacheEmailContent),\n/* harmony export */ cacheEmailCredentials: () => (/* binding */ cacheEmailCredentials),\n/* harmony export */ cacheEmailList: () => (/* binding */ cacheEmailList),\n/* harmony export */ cacheImapSession: () => (/* binding */ cacheImapSession),\n/* harmony export */ closeRedisConnection: () => (/* binding */ closeRedisConnection),\n/* harmony export */ decryptData: () => (/* binding */ decryptData),\n/* harmony export */ encryptData: () => (/* binding */ encryptData),\n/* harmony export */ getCachedEmailContent: () => (/* binding */ getCachedEmailContent),\n/* harmony export */ getCachedEmailCredentials: () => (/* binding */ getCachedEmailCredentials),\n/* harmony export */ getCachedEmailList: () => (/* binding */ getCachedEmailList),\n/* harmony export */ getCachedImapSession: () => (/* binding */ getCachedImapSession),\n/* harmony export */ getEmailCredentials: () => (/* binding */ getEmailCredentials),\n/* harmony export */ getRedisClient: () => (/* binding */ getRedisClient),\n/* harmony export */ getRedisStatus: () => (/* binding */ getRedisStatus),\n/* harmony export */ invalidateEmailContentCache: () => (/* binding */ invalidateEmailContentCache),\n/* harmony export */ invalidateFolderCache: () => (/* binding */ invalidateFolderCache),\n/* harmony export */ invalidateUserEmailCache: () => (/* binding */ invalidateUserEmailCache),\n/* harmony export */ warmupRedisCache: () => (/* binding */ warmupRedisCache)\n/* harmony export */ });\n/* harmony import */ var ioredis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ioredis */ \"(rsc)/./node_modules/ioredis/built/index.js\");\n/* harmony import */ var ioredis__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ioredis__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! crypto-js */ \"(rsc)/./node_modules/crypto-js/index.js\");\n/* harmony import */ var crypto_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto_js__WEBPACK_IMPORTED_MODULE_1__);\n\n\n// Initialize Redis client\nlet redisClient = null;\nlet isConnecting = false;\nlet connectionAttempts = 0;\nconst MAX_RECONNECT_ATTEMPTS = 5;\n/**\n * Get a Redis client instance (singleton pattern) with improved connection management\n */ function getRedisClient() {\n if (redisClient && redisClient.status === 'ready') {\n return redisClient;\n }\n if (isConnecting) {\n // If we're already trying to connect, return the existing client\n // This prevents multiple simultaneous connection attempts\n if (redisClient) return redisClient;\n // This is a fallback in case we're connecting but don't have a client yet\n console.warn('Redis connection in progress, creating temporary client');\n }\n if (!redisClient) {\n isConnecting = true;\n connectionAttempts = 0;\n // Set Redis connection parameters from environment variables only\n const redisOptions = {\n host: process.env.REDIS_HOST,\n port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : undefined,\n password: process.env.REDIS_PASSWORD,\n retryStrategy: (times)=>{\n connectionAttempts = times;\n if (times > MAX_RECONNECT_ATTEMPTS) {\n console.error(`Redis connection failed after ${times} attempts, giving up`);\n return null; // Stop trying to reconnect\n }\n const delay = Math.min(times * 100, 5000);\n console.log(`Redis reconnect attempt ${times}, retrying in ${delay}ms`);\n return delay;\n },\n maxRetriesPerRequest: 5,\n enableOfflineQueue: true,\n connectTimeout: 10000,\n disconnectTimeout: 2000,\n keepAlive: 10000,\n keyPrefix: '' // No prefix to keep keys clean\n };\n console.log('Connecting to Redis using environment variables');\n redisClient = new (ioredis__WEBPACK_IMPORTED_MODULE_0___default())(redisOptions);\n redisClient.on('error', (err)=>{\n console.error('Redis connection error:', err);\n // Only set to null if we've exceeded max attempts\n if (connectionAttempts > MAX_RECONNECT_ATTEMPTS) {\n console.error('Redis connection failed permanently, will create new client on next request');\n redisClient = null;\n isConnecting = false;\n }\n });\n redisClient.on('connect', ()=>{\n console.log('Successfully connected to Redis');\n isConnecting = false;\n connectionAttempts = 0;\n });\n redisClient.on('reconnecting', ()=>{\n console.log('Reconnecting to Redis...');\n isConnecting = true;\n });\n redisClient.on('ready', ()=>{\n console.log('Redis connection warmed up');\n isConnecting = false;\n });\n redisClient.on('end', ()=>{\n console.log('Redis connection ended');\n // Don't set to null here - let the error handler decide\n });\n }\n return redisClient;\n}\n/**\n * Close Redis connection (useful for serverless environments)\n */ async function closeRedisConnection() {\n if (redisClient) {\n await redisClient.quit();\n redisClient = null;\n }\n}\n// Encryption key from environment variable or fallback\nconst getEncryptionKey = ()=>{\n return process.env.REDIS_ENCRYPTION_KEY || 'default-encryption-key-change-in-production';\n};\n/**\n * Encrypt sensitive data before storing in Redis\n */ function encryptData(data) {\n return crypto_js__WEBPACK_IMPORTED_MODULE_1___default().AES.encrypt(data, getEncryptionKey()).toString();\n}\n/**\n * Decrypt sensitive data retrieved from Redis\n */ function decryptData(encryptedData) {\n const bytes = crypto_js__WEBPACK_IMPORTED_MODULE_1___default().AES.decrypt(encryptedData, getEncryptionKey());\n return bytes.toString((crypto_js__WEBPACK_IMPORTED_MODULE_1___default().enc).Utf8);\n}\n// Cache key definitions\nconst KEYS = {\n CREDENTIALS: (userId, accountId)=>`email:credentials:${userId}:${accountId}`,\n SESSION: (userId)=>`email:session:${userId}`,\n EMAIL_LIST: (userId, accountId, folder, page, perPage)=>`email:list:${userId}:${accountId}:${folder}:${page}:${perPage}`,\n EMAIL_CONTENT: (userId, accountId, emailId)=>`email:content:${userId}:${accountId}:${emailId}`\n};\n// TTL constants in seconds\nconst TTL = {\n CREDENTIALS: 60 * 60 * 24,\n SESSION: 60 * 60 * 4,\n EMAIL_LIST: 60 * 5,\n EMAIL_CONTENT: 60 * 15 // 15 minutes\n};\n/**\n * Cache email credentials in Redis\n */ async function cacheEmailCredentials(userId, accountId, credentials) {\n const redis = getRedisClient();\n const key = KEYS.CREDENTIALS(userId, accountId);\n // Validate credentials before caching\n if (!credentials.email || !credentials.host || !credentials.password && !credentials.useOAuth) {\n console.error(`Cannot cache incomplete credentials for user ${userId}`);\n return;\n }\n try {\n console.log(`Caching credentials for user ${userId}`);\n // Create a copy without the password to store\n const secureCredentials = {\n email: credentials.email,\n host: credentials.host,\n port: credentials.port,\n secure: credentials.secure ?? true,\n // Include the extended fields\n ...credentials.smtp_host && {\n smtp_host: credentials.smtp_host\n },\n ...credentials.smtp_port && {\n smtp_port: credentials.smtp_port\n },\n ...credentials.smtp_secure !== undefined && {\n smtp_secure: credentials.smtp_secure\n },\n ...credentials.display_name && {\n display_name: credentials.display_name\n },\n ...credentials.color && {\n color: credentials.color\n },\n // Include OAuth fields\n ...credentials.useOAuth !== undefined && {\n useOAuth: credentials.useOAuth\n },\n ...credentials.accessToken && {\n accessToken: credentials.accessToken\n },\n ...credentials.refreshToken && {\n refreshToken: credentials.refreshToken\n },\n ...credentials.tokenExpiry && {\n tokenExpiry: credentials.tokenExpiry\n }\n };\n // Encrypt password if provided\n if (credentials.password) {\n try {\n const encrypted = encryptData(credentials.password);\n console.log(`Successfully encrypted password for user ${userId}`);\n secureCredentials.encryptedPassword = encrypted;\n } catch (encryptError) {\n console.error(`Failed to encrypt password for user ${userId}:`, encryptError);\n // Continue anyway since we might have OAuth tokens\n }\n }\n await redis.set(key, JSON.stringify(secureCredentials), 'EX', TTL.CREDENTIALS);\n console.log(`Credentials cached for user ${userId}`);\n } catch (error) {\n console.error(`Error caching credentials for user ${userId}:`, error);\n }\n}\n/**\n * Get email credentials from Redis\n */ async function getEmailCredentials(userId, accountId) {\n const redis = getRedisClient();\n const key = KEYS.CREDENTIALS(userId, accountId);\n try {\n const credStr = await redis.get(key);\n if (!credStr) {\n return null;\n }\n const creds = JSON.parse(credStr);\n let password;\n // Handle OAuth accounts (they might not have a password)\n if (creds.encryptedPassword) {\n try {\n // Decrypt the password\n password = decryptData(creds.encryptedPassword);\n } catch (decryptError) {\n console.error(`Failed to decrypt password for user ${userId}:`, decryptError);\n // For OAuth accounts, we can continue without a password\n if (!creds.useOAuth) {\n return null;\n }\n }\n }\n // Return the full credentials with decrypted password if available\n const result = {\n email: creds.email,\n host: creds.host,\n port: creds.port,\n secure: creds.secure ?? true,\n ...password && {\n password\n },\n ...creds.smtp_host && {\n smtp_host: creds.smtp_host\n },\n ...creds.smtp_port && {\n smtp_port: creds.smtp_port\n },\n ...creds.smtp_secure !== undefined && {\n smtp_secure: creds.smtp_secure\n },\n ...creds.display_name && {\n display_name: creds.display_name\n },\n ...creds.color && {\n color: creds.color\n },\n // Include OAuth fields\n ...creds.useOAuth !== undefined && {\n useOAuth: creds.useOAuth\n },\n ...creds.accessToken && {\n accessToken: creds.accessToken\n },\n ...creds.refreshToken && {\n refreshToken: creds.refreshToken\n },\n ...creds.tokenExpiry && {\n tokenExpiry: creds.tokenExpiry\n }\n };\n return result;\n } catch (error) {\n console.error(`Error getting credentials for user ${userId}:`, error);\n return null;\n }\n}\n/**\n * Cache IMAP session data for quick reconnection\n */ async function cacheImapSession(userId, sessionData) {\n const redis = getRedisClient();\n const key = KEYS.SESSION(userId);\n // Always update the lastActive timestamp\n sessionData.lastActive = Date.now();\n await redis.set(key, JSON.stringify(sessionData), 'EX', TTL.SESSION);\n}\n/**\n * Get cached IMAP session data\n */ async function getCachedImapSession(userId) {\n const redis = getRedisClient();\n const key = KEYS.SESSION(userId);\n const cachedData = await redis.get(key);\n if (!cachedData) return null;\n return JSON.parse(cachedData);\n}\n/**\n * Cache email list in Redis\n */ async function cacheEmailList(userId, accountId, folder, page, perPage, data) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_LIST(userId, accountId, folder, page, perPage);\n await redis.set(key, JSON.stringify(data), 'EX', TTL.EMAIL_LIST);\n}\n/**\n * Get cached email list from Redis\n */ async function getCachedEmailList(userId, accountId, folder, page, perPage) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_LIST(userId, accountId, folder, page, perPage);\n const cachedData = await redis.get(key);\n if (!cachedData) return null;\n return JSON.parse(cachedData);\n}\n/**\n * Cache email content in Redis\n */ async function cacheEmailContent(userId, accountId, emailId, data) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_CONTENT(userId, accountId, emailId);\n await redis.set(key, JSON.stringify(data), 'EX', TTL.EMAIL_CONTENT);\n}\n/**\n * Get cached email content from Redis\n */ async function getCachedEmailContent(userId, accountId, emailId) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_CONTENT(userId, accountId, emailId);\n const cachedData = await redis.get(key);\n if (!cachedData) return null;\n return JSON.parse(cachedData);\n}\n/**\n * Invalidate all email caches for a folder\n */ async function invalidateFolderCache(userId, accountId, folder) {\n const redis = getRedisClient();\n const pattern = `email:list:${userId}:${accountId}:${folder}:*`;\n // Use SCAN to find and delete keys matching the pattern\n let cursor = '0';\n do {\n const [nextCursor, keys] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n if (keys.length > 0) {\n await redis.del(...keys);\n }\n }while (cursor !== '0');\n}\n/**\n * Invalidate email content cache\n */ async function invalidateEmailContentCache(userId, accountId, emailId) {\n const redis = getRedisClient();\n const key = KEYS.EMAIL_CONTENT(userId, accountId, emailId);\n await redis.del(key);\n}\n/**\n * Warm up Redis connection to avoid cold starts\n */ async function warmupRedisCache() {\n try {\n // Ping Redis to establish connection early\n const redis = getRedisClient();\n await redis.ping();\n console.log('Redis connection warmed up');\n return true;\n } catch (error) {\n console.error('Error warming up Redis:', error);\n return false;\n }\n}\n/**\n * Get Redis connection status\n */ async function getRedisStatus() {\n try {\n const redis = getRedisClient();\n const pong = await redis.ping();\n return {\n status: 'connected',\n ping: pong\n };\n } catch (error) {\n return {\n status: 'error',\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n/**\n * Invalidate all user email caches (email lists and content)\n */ async function invalidateUserEmailCache(userId) {\n const redis = getRedisClient();\n // Patterns to delete\n const patterns = [\n `email:list:${userId}:*`,\n `email:content:${userId}:*`\n ];\n for (const pattern of patterns){\n let cursor = '0';\n do {\n const [nextCursor, keys] = await redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);\n cursor = nextCursor;\n if (keys.length > 0) {\n await redis.del(...keys);\n }\n }while (cursor !== '0');\n }\n}\n/**\n * Get cached email credentials from Redis\n * @deprecated Use getEmailCredentials instead\n */ async function getCachedEmailCredentials(userId, accountId) {\n return getEmailCredentials(userId, accountId);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9saWIvcmVkaXMudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTRCO0FBQ0s7QUFFakMsMEJBQTBCO0FBQzFCLElBQUlFLGNBQTRCO0FBQ2hDLElBQUlDLGVBQWU7QUFDbkIsSUFBSUMscUJBQXFCO0FBQ3pCLE1BQU1DLHlCQUF5QjtBQUUvQjs7Q0FFQyxHQUNNLFNBQVNDO0lBQ2QsSUFBSUosZUFBZUEsWUFBWUssTUFBTSxLQUFLLFNBQVM7UUFDakQsT0FBT0w7SUFDVDtJQUVBLElBQUlDLGNBQWM7UUFDaEIsaUVBQWlFO1FBQ2pFLDBEQUEwRDtRQUMxRCxJQUFJRCxhQUFhLE9BQU9BO1FBRXhCLDBFQUEwRTtRQUMxRU0sUUFBUUMsSUFBSSxDQUFDO0lBQ2Y7SUFFQSxJQUFJLENBQUNQLGFBQWE7UUFDaEJDLGVBQWU7UUFDZkMscUJBQXFCO1FBRXJCLGtFQUFrRTtRQUNsRSxNQUFNTSxlQUFlO1lBQ25CQyxNQUFNQyxRQUFRQyxHQUFHLENBQUNDLFVBQVU7WUFDNUJDLE1BQU1ILFFBQVFDLEdBQUcsQ0FBQ0csVUFBVSxHQUFHQyxTQUFTTCxRQUFRQyxHQUFHLENBQUNHLFVBQVUsSUFBSUU7WUFDbEVDLFVBQVVQLFFBQVFDLEdBQUcsQ0FBQ08sY0FBYztZQUNwQ0MsZUFBZSxDQUFDQztnQkFDZGxCLHFCQUFxQmtCO2dCQUNyQixJQUFJQSxRQUFRakIsd0JBQXdCO29CQUNsQ0csUUFBUWUsS0FBSyxDQUFDLENBQUMsOEJBQThCLEVBQUVELE1BQU0sb0JBQW9CLENBQUM7b0JBQzFFLE9BQU8sTUFBTSwyQkFBMkI7Z0JBQzFDO2dCQUNBLE1BQU1FLFFBQVFDLEtBQUtDLEdBQUcsQ0FBQ0osUUFBUSxLQUFLO2dCQUNwQ2QsUUFBUW1CLEdBQUcsQ0FBQyxDQUFDLHdCQUF3QixFQUFFTCxNQUFNLGNBQWMsRUFBRUUsTUFBTSxFQUFFLENBQUM7Z0JBQ3RFLE9BQU9BO1lBQ1Q7WUFDQUksc0JBQXNCO1lBQ3RCQyxvQkFBb0I7WUFDcEJDLGdCQUFnQjtZQUNoQkMsbUJBQW1CO1lBQ25CQyxXQUFXO1lBQ1hDLFdBQVcsR0FBRywrQkFBK0I7UUFDL0M7UUFFQXpCLFFBQVFtQixHQUFHLENBQUM7UUFDWnpCLGNBQWMsSUFBSUYsZ0RBQUtBLENBQUNVO1FBRXhCUixZQUFZZ0MsRUFBRSxDQUFDLFNBQVMsQ0FBQ0M7WUFDdkIzQixRQUFRZSxLQUFLLENBQUMsMkJBQTJCWTtZQUV6QyxrREFBa0Q7WUFDbEQsSUFBSS9CLHFCQUFxQkMsd0JBQXdCO2dCQUMvQ0csUUFBUWUsS0FBSyxDQUFDO2dCQUNkckIsY0FBYztnQkFDZEMsZUFBZTtZQUNqQjtRQUNGO1FBRUFELFlBQVlnQyxFQUFFLENBQUMsV0FBVztZQUN4QjFCLFFBQVFtQixHQUFHLENBQUM7WUFDWnhCLGVBQWU7WUFDZkMscUJBQXFCO1FBQ3ZCO1FBRUFGLFlBQVlnQyxFQUFFLENBQUMsZ0JBQWdCO1lBQzdCMUIsUUFBUW1CLEdBQUcsQ0FBQztZQUNaeEIsZUFBZTtRQUNqQjtRQUVBRCxZQUFZZ0MsRUFBRSxDQUFDLFNBQVM7WUFDdEIxQixRQUFRbUIsR0FBRyxDQUFDO1lBQ1p4QixlQUFlO1FBQ2pCO1FBRUFELFlBQVlnQyxFQUFFLENBQUMsT0FBTztZQUNwQjFCLFFBQVFtQixHQUFHLENBQUM7UUFDWix3REFBd0Q7UUFDMUQ7SUFDRjtJQUVBLE9BQU96QjtBQUNUO0FBRUE7O0NBRUMsR0FDTSxlQUFla0M7SUFDcEIsSUFBSWxDLGFBQWE7UUFDZixNQUFNQSxZQUFZbUMsSUFBSTtRQUN0Qm5DLGNBQWM7SUFDaEI7QUFDRjtBQUVBLHVEQUF1RDtBQUN2RCxNQUFNb0MsbUJBQW1CO0lBQ3ZCLE9BQU8xQixRQUFRQyxHQUFHLENBQUMwQixvQkFBb0IsSUFBSTtBQUM3QztBQUVBOztDQUVDLEdBQ00sU0FBU0MsWUFBWUMsSUFBWTtJQUN0QyxPQUFPeEMsb0RBQVksQ0FBQzBDLE9BQU8sQ0FBQ0YsTUFBTUgsb0JBQW9CTSxRQUFRO0FBQ2hFO0FBRUE7O0NBRUMsR0FDTSxTQUFTQyxZQUFZQyxhQUFxQjtJQUMvQyxNQUFNQyxRQUFROUMsb0RBQVksQ0FBQytDLE9BQU8sQ0FBQ0YsZUFBZVI7SUFDbEQsT0FBT1MsTUFBTUgsUUFBUSxDQUFDM0Msc0RBQVksQ0FBQ2lELElBQUk7QUFDekM7QUFFQSx3QkFBd0I7QUFDakIsTUFBTUMsT0FBTztJQUNsQkMsYUFBYSxDQUFDQyxRQUFnQkMsWUFBc0IsQ0FBQyxrQkFBa0IsRUFBRUQsT0FBTyxDQUFDLEVBQUVDLFdBQVc7SUFDOUZDLFNBQVMsQ0FBQ0YsU0FBbUIsQ0FBQyxjQUFjLEVBQUVBLFFBQVE7SUFDdERHLFlBQVksQ0FBQ0gsUUFBZ0JDLFdBQW1CRyxRQUFnQkMsTUFBY0MsVUFDNUUsQ0FBQyxXQUFXLEVBQUVOLE9BQU8sQ0FBQyxFQUFFQyxVQUFVLENBQUMsRUFBRUcsT0FBTyxDQUFDLEVBQUVDLEtBQUssQ0FBQyxFQUFFQyxTQUFTO0lBQ2xFQyxlQUFlLENBQUNQLFFBQWdCQyxXQUFtQk8sVUFDakQsQ0FBQyxjQUFjLEVBQUVSLE9BQU8sQ0FBQyxFQUFFQyxVQUFVLENBQUMsRUFBRU8sU0FBUztBQUNyRCxFQUFFO0FBRUYsMkJBQTJCO0FBQ3BCLE1BQU1DLE1BQU07SUFDakJWLGFBQWEsS0FBSyxLQUFLO0lBQ3ZCRyxTQUFTLEtBQUssS0FBSztJQUNuQkMsWUFBWSxLQUFLO0lBQ2pCSSxlQUFlLEtBQUssR0FBTyxhQUFhO0FBQzFDLEVBQUU7QUE0QkY7O0NBRUMsR0FDTSxlQUFlRyxzQkFDcEJWLE1BQWMsRUFDZEMsU0FBaUIsRUFDakJVLFdBQTZCO0lBRTdCLE1BQU1DLFFBQVEzRDtJQUNkLE1BQU00RCxNQUFNZixLQUFLQyxXQUFXLENBQUNDLFFBQVFDO0lBRXJDLHNDQUFzQztJQUN0QyxJQUFJLENBQUNVLFlBQVlHLEtBQUssSUFBSSxDQUFDSCxZQUFZckQsSUFBSSxJQUFLLENBQUNxRCxZQUFZN0MsUUFBUSxJQUFJLENBQUM2QyxZQUFZSSxRQUFRLEVBQUc7UUFDL0Y1RCxRQUFRZSxLQUFLLENBQUMsQ0FBQyw2Q0FBNkMsRUFBRThCLFFBQVE7UUFDdEU7SUFDRjtJQUVBLElBQUk7UUFDRjdDLFFBQVFtQixHQUFHLENBQUMsQ0FBQyw2QkFBNkIsRUFBRTBCLFFBQVE7UUFFcEQsOENBQThDO1FBQzlDLE1BQU1nQixvQkFBc0M7WUFDMUNGLE9BQU9ILFlBQVlHLEtBQUs7WUFDeEJ4RCxNQUFNcUQsWUFBWXJELElBQUk7WUFDdEJJLE1BQU1pRCxZQUFZakQsSUFBSTtZQUN0QnVELFFBQVFOLFlBQVlNLE1BQU0sSUFBSTtZQUM5Qiw4QkFBOEI7WUFDOUIsR0FBSU4sWUFBWU8sU0FBUyxJQUFJO2dCQUFFQSxXQUFXUCxZQUFZTyxTQUFTO1lBQUMsQ0FBQztZQUNqRSxHQUFJUCxZQUFZUSxTQUFTLElBQUk7Z0JBQUVBLFdBQVdSLFlBQVlRLFNBQVM7WUFBQyxDQUFDO1lBQ2pFLEdBQUlSLFlBQVlTLFdBQVcsS0FBS3ZELGFBQWE7Z0JBQUV1RCxhQUFhVCxZQUFZUyxXQUFXO1lBQUMsQ0FBQztZQUNyRixHQUFJVCxZQUFZVSxZQUFZLElBQUk7Z0JBQUVBLGNBQWNWLFlBQVlVLFlBQVk7WUFBQyxDQUFDO1lBQzFFLEdBQUlWLFlBQVlXLEtBQUssSUFBSTtnQkFBRUEsT0FBT1gsWUFBWVcsS0FBSztZQUFDLENBQUM7WUFDckQsdUJBQXVCO1lBQ3ZCLEdBQUlYLFlBQVlJLFFBQVEsS0FBS2xELGFBQWE7Z0JBQUVrRCxVQUFVSixZQUFZSSxRQUFRO1lBQUMsQ0FBQztZQUM1RSxHQUFJSixZQUFZWSxXQUFXLElBQUk7Z0JBQUVBLGFBQWFaLFlBQVlZLFdBQVc7WUFBQyxDQUFDO1lBQ3ZFLEdBQUlaLFlBQVlhLFlBQVksSUFBSTtnQkFBRUEsY0FBY2IsWUFBWWEsWUFBWTtZQUFDLENBQUM7WUFDMUUsR0FBSWIsWUFBWWMsV0FBVyxJQUFJO2dCQUFFQSxhQUFhZCxZQUFZYyxXQUFXO1lBQUMsQ0FBQztRQUN6RTtRQUVBLCtCQUErQjtRQUMvQixJQUFJZCxZQUFZN0MsUUFBUSxFQUFFO1lBQ3hCLElBQUk7Z0JBQ0YsTUFBTTRELFlBQVl2QyxZQUFZd0IsWUFBWTdDLFFBQVE7Z0JBQ2xEWCxRQUFRbUIsR0FBRyxDQUFDLENBQUMseUNBQXlDLEVBQUUwQixRQUFRO2dCQUNoRWdCLGtCQUFrQlcsaUJBQWlCLEdBQUdEO1lBQ3hDLEVBQUUsT0FBT0UsY0FBYztnQkFDckJ6RSxRQUFRZSxLQUFLLENBQUMsQ0FBQyxvQ0FBb0MsRUFBRThCLE9BQU8sQ0FBQyxDQUFDLEVBQUU0QjtZQUNoRSxtREFBbUQ7WUFDckQ7UUFDRjtRQUVBLE1BQU1oQixNQUFNaUIsR0FBRyxDQUFDaEIsS0FBS2lCLEtBQUtDLFNBQVMsQ0FBQ2Ysb0JBQW9CLE1BQU1QLElBQUlWLFdBQVc7UUFDN0U1QyxRQUFRbUIsR0FBRyxDQUFDLENBQUMsNEJBQTRCLEVBQUUwQixRQUFRO0lBQ3JELEVBQUUsT0FBTzlCLE9BQU87UUFDZGYsUUFBUWUsS0FBSyxDQUFDLENBQUMsbUNBQW1DLEVBQUU4QixPQUFPLENBQUMsQ0FBQyxFQUFFOUI7SUFDakU7QUFDRjtBQUVBOztDQUVDLEdBQ00sZUFBZThELG9CQUNwQmhDLE1BQWMsRUFDZEMsU0FBaUI7SUFFakIsTUFBTVcsUUFBUTNEO0lBQ2QsTUFBTTRELE1BQU1mLEtBQUtDLFdBQVcsQ0FBQ0MsUUFBUUM7SUFFckMsSUFBSTtRQUNGLE1BQU1nQyxVQUFVLE1BQU1yQixNQUFNc0IsR0FBRyxDQUFDckI7UUFFaEMsSUFBSSxDQUFDb0IsU0FBUztZQUNaLE9BQU87UUFDVDtRQUVBLE1BQU1FLFFBQVFMLEtBQUtNLEtBQUssQ0FBQ0g7UUFFekIsSUFBSW5FO1FBRUoseURBQXlEO1FBQ3pELElBQUlxRSxNQUFNUixpQkFBaUIsRUFBRTtZQUMzQixJQUFJO2dCQUNGLHVCQUF1QjtnQkFDdkI3RCxXQUFXMEIsWUFBWTJDLE1BQU1SLGlCQUFpQjtZQUNoRCxFQUFFLE9BQU9VLGNBQWM7Z0JBQ3JCbEYsUUFBUWUsS0FBSyxDQUFDLENBQUMsb0NBQW9DLEVBQUU4QixPQUFPLENBQUMsQ0FBQyxFQUFFcUM7Z0JBQ2hFLHlEQUF5RDtnQkFDekQsSUFBSSxDQUFDRixNQUFNcEIsUUFBUSxFQUFFO29CQUNuQixPQUFPO2dCQUNUO1lBQ0Y7UUFDRjtRQUVBLG1FQUFtRTtRQUNuRSxNQUFNdUIsU0FBMkI7WUFDL0J4QixPQUFPcUIsTUFBTXJCLEtBQUs7WUFDbEJ4RCxNQUFNNkUsTUFBTTdFLElBQUk7WUFDaEJJLE1BQU15RSxNQUFNekUsSUFBSTtZQUNoQnVELFFBQVFrQixNQUFNbEIsTUFBTSxJQUFJO1lBQ3hCLEdBQUluRCxZQUFZO2dCQUFFQTtZQUFTLENBQUM7WUFDNUIsR0FBSXFFLE1BQU1qQixTQUFTLElBQUk7Z0JBQUVBLFdBQVdpQixNQUFNakIsU0FBUztZQUFDLENBQUM7WUFDckQsR0FBSWlCLE1BQU1oQixTQUFTLElBQUk7Z0JBQUVBLFdBQVdnQixNQUFNaEIsU0FBUztZQUFDLENBQUM7WUFDckQsR0FBSWdCLE1BQU1mLFdBQVcsS0FBS3ZELGFBQWE7Z0JBQUV1RCxhQUFhZSxNQUFNZixXQUFXO1lBQUMsQ0FBQztZQUN6RSxHQUFJZSxNQUFNZCxZQUFZLElBQUk7Z0JBQUVBLGNBQWNjLE1BQU1kLFlBQVk7WUFBQyxDQUFDO1lBQzlELEdBQUljLE1BQU1iLEtBQUssSUFBSTtnQkFBRUEsT0FBT2EsTUFBTWIsS0FBSztZQUFDLENBQUM7WUFDekMsdUJBQXVCO1lBQ3ZCLEdBQUlhLE1BQU1wQixRQUFRLEtBQUtsRCxhQUFhO2dCQUFFa0QsVUFBVW9CLE1BQU1wQixRQUFRO1lBQUMsQ0FBQztZQUNoRSxHQUFJb0IsTUFBTVosV0FBVyxJQUFJO2dCQUFFQSxhQUFhWSxNQUFNWixXQUFXO1lBQUMsQ0FBQztZQUMzRCxHQUFJWSxNQUFNWCxZQUFZLElBQUk7Z0JBQUVBLGNBQWNXLE1BQU1YLFlBQVk7WUFBQyxDQUFDO1lBQzlELEdBQUlXLE1BQU1WLFdBQVcsSUFBSTtnQkFBRUEsYUFBYVUsTUFBTVYsV0FBVztZQUFDLENBQUM7UUFDN0Q7UUFFQSxPQUFPYTtJQUNULEVBQUUsT0FBT3BFLE9BQU87UUFDZGYsUUFBUWUsS0FBSyxDQUFDLENBQUMsbUNBQW1DLEVBQUU4QixPQUFPLENBQUMsQ0FBQyxFQUFFOUI7UUFDL0QsT0FBTztJQUNUO0FBQ0Y7QUFFQTs7Q0FFQyxHQUNNLGVBQWVxRSxpQkFDcEJ2QyxNQUFjLEVBQ2R3QyxXQUE0QjtJQUU1QixNQUFNNUIsUUFBUTNEO0lBQ2QsTUFBTTRELE1BQU1mLEtBQUtJLE9BQU8sQ0FBQ0Y7SUFFekIseUNBQXlDO0lBQ3pDd0MsWUFBWUMsVUFBVSxHQUFHQyxLQUFLQyxHQUFHO0lBRWpDLE1BQU0vQixNQUFNaUIsR0FBRyxDQUFDaEIsS0FBS2lCLEtBQUtDLFNBQVMsQ0FBQ1MsY0FBYyxNQUFNL0IsSUFBSVAsT0FBTztBQUNyRTtBQUVBOztDQUVDLEdBQ00sZUFBZTBDLHFCQUNwQjVDLE1BQWM7SUFFZCxNQUFNWSxRQUFRM0Q7SUFDZCxNQUFNNEQsTUFBTWYsS0FBS0ksT0FBTyxDQUFDRjtJQUV6QixNQUFNNkMsYUFBYSxNQUFNakMsTUFBTXNCLEdBQUcsQ0FBQ3JCO0lBQ25DLElBQUksQ0FBQ2dDLFlBQVksT0FBTztJQUV4QixPQUFPZixLQUFLTSxLQUFLLENBQUNTO0FBQ3BCO0FBRUE7O0NBRUMsR0FDTSxlQUFlQyxlQUNwQjlDLE1BQWMsRUFDZEMsU0FBaUIsRUFDakJHLE1BQWMsRUFDZEMsSUFBWSxFQUNaQyxPQUFlLEVBQ2ZsQixJQUFTO0lBRVQsTUFBTXdCLFFBQVEzRDtJQUNkLE1BQU00RCxNQUFNZixLQUFLSyxVQUFVLENBQUNILFFBQVFDLFdBQVdHLFFBQVFDLE1BQU1DO0lBRTdELE1BQU1NLE1BQU1pQixHQUFHLENBQUNoQixLQUFLaUIsS0FBS0MsU0FBUyxDQUFDM0MsT0FBTyxNQUFNcUIsSUFBSU4sVUFBVTtBQUNqRTtBQUVBOztDQUVDLEdBQ00sZUFBZTRDLG1CQUNwQi9DLE1BQWMsRUFDZEMsU0FBaUIsRUFDakJHLE1BQWMsRUFDZEMsSUFBWSxFQUNaQyxPQUFlO0lBRWYsTUFBTU0sUUFBUTNEO0lBQ2QsTUFBTTRELE1BQU1mLEtBQUtLLFVBQVUsQ0FBQ0gsUUFBUUMsV0FBV0csUUFBUUMsTUFBTUM7SUFFN0QsTUFBTXVDLGFBQWEsTUFBTWpDLE1BQU1zQixHQUFHLENBQUNyQjtJQUNuQyxJQUFJLENBQUNnQyxZQUFZLE9BQU87SUFFeEIsT0FBT2YsS0FBS00sS0FBSyxDQUFDUztBQUNwQjtBQUVBOztDQUVDLEdBQ00sZUFBZUcsa0JBQ3BCaEQsTUFBYyxFQUNkQyxTQUFpQixFQUNqQk8sT0FBZSxFQUNmcEIsSUFBUztJQUVULE1BQU13QixRQUFRM0Q7SUFDZCxNQUFNNEQsTUFBTWYsS0FBS1MsYUFBYSxDQUFDUCxRQUFRQyxXQUFXTztJQUVsRCxNQUFNSSxNQUFNaUIsR0FBRyxDQUFDaEIsS0FBS2lCLEtBQUtDLFNBQVMsQ0FBQzNDLE9BQU8sTUFBTXFCLElBQUlGLGFBQWE7QUFDcEU7QUFFQTs7Q0FFQyxHQUNNLGVBQWUwQyxzQkFDcEJqRCxNQUFjLEVBQ2RDLFNBQWlCLEVBQ2pCTyxPQUFlO0lBRWYsTUFBTUksUUFBUTNEO0lBQ2QsTUFBTTRELE1BQU1mLEtBQUtTLGFBQWEsQ0FBQ1AsUUFBUUMsV0FBV087SUFFbEQsTUFBTXFDLGFBQWEsTUFBTWpDLE1BQU1zQixHQUFHLENBQUNyQjtJQUNuQyxJQUFJLENBQUNnQyxZQUFZLE9BQU87SUFFeEIsT0FBT2YsS0FBS00sS0FBSyxDQUFDUztBQUNwQjtBQUVBOztDQUVDLEdBQ00sZUFBZUssc0JBQ3BCbEQsTUFBYyxFQUNkQyxTQUFpQixFQUNqQkcsTUFBYztJQUVkLE1BQU1RLFFBQVEzRDtJQUNkLE1BQU1rRyxVQUFVLENBQUMsV0FBVyxFQUFFbkQsT0FBTyxDQUFDLEVBQUVDLFVBQVUsQ0FBQyxFQUFFRyxPQUFPLEVBQUUsQ0FBQztJQUUvRCx3REFBd0Q7SUFDeEQsSUFBSWdELFNBQVM7SUFDYixHQUFHO1FBQ0QsTUFBTSxDQUFDQyxZQUFZQyxLQUFLLEdBQUcsTUFBTTFDLE1BQU0yQyxJQUFJLENBQUNILFFBQVEsU0FBU0QsU0FBUyxTQUFTO1FBQy9FQyxTQUFTQztRQUVULElBQUlDLEtBQUtFLE1BQU0sR0FBRyxHQUFHO1lBQ25CLE1BQU01QyxNQUFNNkMsR0FBRyxJQUFJSDtRQUNyQjtJQUNGLFFBQVNGLFdBQVcsS0FBSztBQUMzQjtBQUVBOztDQUVDLEdBQ00sZUFBZU0sNEJBQ3BCMUQsTUFBYyxFQUNkQyxTQUFpQixFQUNqQk8sT0FBZTtJQUVmLE1BQU1JLFFBQVEzRDtJQUNkLE1BQU00RCxNQUFNZixLQUFLUyxhQUFhLENBQUNQLFFBQVFDLFdBQVdPO0lBRWxELE1BQU1JLE1BQU02QyxHQUFHLENBQUM1QztBQUNsQjtBQUVBOztDQUVDLEdBQ00sZUFBZThDO0lBQ3BCLElBQUk7UUFDRiwyQ0FBMkM7UUFDM0MsTUFBTS9DLFFBQVEzRDtRQUNkLE1BQU0yRCxNQUFNZ0QsSUFBSTtRQUNoQnpHLFFBQVFtQixHQUFHLENBQUM7UUFDWixPQUFPO0lBQ1QsRUFBRSxPQUFPSixPQUFPO1FBQ2RmLFFBQVFlLEtBQUssQ0FBQywyQkFBMkJBO1FBQ3pDLE9BQU87SUFDVDtBQUNGO0FBRUE7O0NBRUMsR0FDTSxlQUFlMkY7SUFLcEIsSUFBSTtRQUNGLE1BQU1qRCxRQUFRM0Q7UUFDZCxNQUFNNkcsT0FBTyxNQUFNbEQsTUFBTWdELElBQUk7UUFDN0IsT0FBTztZQUNMMUcsUUFBUTtZQUNSMEcsTUFBTUU7UUFDUjtJQUNGLEVBQUUsT0FBTzVGLE9BQU87UUFDZCxPQUFPO1lBQ0xoQixRQUFRO1lBQ1JnQixPQUFPQSxpQkFBaUI2RixRQUFRN0YsTUFBTThGLE9BQU8sR0FBR0MsT0FBTy9GO1FBQ3pEO0lBQ0Y7QUFDRjtBQUVBOztDQUVDLEdBQ00sZUFBZWdHLHlCQUNwQmxFLE1BQWM7SUFFZCxNQUFNWSxRQUFRM0Q7SUFFZCxxQkFBcUI7SUFDckIsTUFBTWtILFdBQVc7UUFDZixDQUFDLFdBQVcsRUFBRW5FLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLENBQUMsY0FBYyxFQUFFQSxPQUFPLEVBQUUsQ0FBQztLQUM1QjtJQUVELEtBQUssTUFBTW1ELFdBQVdnQixTQUFVO1FBQzlCLElBQUlmLFNBQVM7UUFDYixHQUFHO1lBQ0QsTUFBTSxDQUFDQyxZQUFZQyxLQUFLLEdBQUcsTUFBTTFDLE1BQU0yQyxJQUFJLENBQUNILFFBQVEsU0FBU0QsU0FBUyxTQUFTO1lBQy9FQyxTQUFTQztZQUVULElBQUlDLEtBQUtFLE1BQU0sR0FBRyxHQUFHO2dCQUNuQixNQUFNNUMsTUFBTTZDLEdBQUcsSUFBSUg7WUFDckI7UUFDRixRQUFTRixXQUFXLEtBQUs7SUFDM0I7QUFDRjtBQUVBOzs7Q0FHQyxHQUNNLGVBQWVnQiwwQkFDcEJwRSxNQUFjLEVBQ2RDLFNBQWlCO0lBRWpCLE9BQU8rQixvQkFBb0JoQyxRQUFRQztBQUNyQyIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvcmVkaXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlZGlzIGZyb20gJ2lvcmVkaXMnO1xuaW1wb3J0IENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XG5cbi8vIEluaXRpYWxpemUgUmVkaXMgY2xpZW50XG5sZXQgcmVkaXNDbGllbnQ6IFJlZGlzIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNDb25uZWN0aW5nID0gZmFsc2U7XG5sZXQgY29ubmVjdGlvbkF0dGVtcHRzID0gMDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfQVRURU1QVFMgPSA1O1xuXG4vKipcbiAqIEdldCBhIFJlZGlzIGNsaWVudCBpbnN0YW5jZSAoc2luZ2xldG9uIHBhdHRlcm4pIHdpdGggaW1wcm92ZWQgY29ubmVjdGlvbiBtYW5hZ2VtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWRpc0NsaWVudCgpOiBSZWRpcyB7XG4gIGlmIChyZWRpc0NsaWVudCAmJiByZWRpc0NsaWVudC5zdGF0dXMgPT09ICdyZWFkeScpIHtcbiAgICByZXR1cm4gcmVkaXNDbGllbnQ7XG4gIH1cbiAgXG4gIGlmIChpc0Nvbm5lY3RpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHRyeWluZyB0byBjb25uZWN0LCByZXR1cm4gdGhlIGV4aXN0aW5nIGNsaWVudFxuICAgIC8vIFRoaXMgcHJldmVudHMgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGNvbm5lY3Rpb24gYXR0ZW1wdHNcbiAgICBpZiAocmVkaXNDbGllbnQpIHJldHVybiByZWRpc0NsaWVudDtcbiAgICBcbiAgICAvLyBUaGlzIGlzIGEgZmFsbGJhY2sgaW4gY2FzZSB3ZSdyZSBjb25uZWN0aW5nIGJ1dCBkb24ndCBoYXZlIGEgY2xpZW50IHlldFxuICAgIGNvbnNvbGUud2FybignUmVkaXMgY29ubmVjdGlvbiBpbiBwcm9ncmVzcywgY3JlYXRpbmcgdGVtcG9yYXJ5IGNsaWVudCcpO1xuICB9XG4gIFxuICBpZiAoIXJlZGlzQ2xpZW50KSB7XG4gICAgaXNDb25uZWN0aW5nID0gdHJ1ZTtcbiAgICBjb25uZWN0aW9uQXR0ZW1wdHMgPSAwO1xuICAgIFxuICAgIC8vIFNldCBSZWRpcyBjb25uZWN0aW9uIHBhcmFtZXRlcnMgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb25seVxuICAgIGNvbnN0IHJlZGlzT3B0aW9ucyA9IHtcbiAgICAgIGhvc3Q6IHByb2Nlc3MuZW52LlJFRElTX0hPU1QsXG4gICAgICBwb3J0OiBwcm9jZXNzLmVudi5SRURJU19QT1JUID8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUkVESVNfUE9SVCkgOiB1bmRlZmluZWQsXG4gICAgICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuUkVESVNfUEFTU1dPUkQsXG4gICAgICByZXRyeVN0cmF0ZWd5OiAodGltZXM6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHMgPSB0aW1lcztcbiAgICAgICAgaWYgKHRpbWVzID4gTUFYX1JFQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlZGlzIGNvbm5lY3Rpb24gZmFpbGVkIGFmdGVyICR7dGltZXN9IGF0dGVtcHRzLCBnaXZpbmcgdXBgKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gU3RvcCB0cnlpbmcgdG8gcmVjb25uZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbih0aW1lcyAqIDEwMCwgNTAwMCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWRpcyByZWNvbm5lY3QgYXR0ZW1wdCAke3RpbWVzfSwgcmV0cnlpbmcgaW4gJHtkZWxheX1tc2ApO1xuICAgICAgICByZXR1cm4gZGVsYXk7XG4gICAgICB9LFxuICAgICAgbWF4UmV0cmllc1BlclJlcXVlc3Q6IDUsXG4gICAgICBlbmFibGVPZmZsaW5lUXVldWU6IHRydWUsXG4gICAgICBjb25uZWN0VGltZW91dDogMTAwMDAsIC8vIDEwIHNlY29uZHNcbiAgICAgIGRpc2Nvbm5lY3RUaW1lb3V0OiAyMDAwLCAvLyAyIHNlY29uZHNcbiAgICAgIGtlZXBBbGl2ZTogMTAwMDAsIC8vIDEwIHNlY29uZHNcbiAgICAgIGtleVByZWZpeDogJycgLy8gTm8gcHJlZml4IHRvIGtlZXAga2V5cyBjbGVhblxuICAgIH07XG4gICAgXG4gICAgY29uc29sZS5sb2coJ0Nvbm5lY3RpbmcgdG8gUmVkaXMgdXNpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gICAgcmVkaXNDbGllbnQgPSBuZXcgUmVkaXMocmVkaXNPcHRpb25zKTtcbiAgICBcbiAgICByZWRpc0NsaWVudC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdSZWRpcyBjb25uZWN0aW9uIGVycm9yOicsIGVycik7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgc2V0IHRvIG51bGwgaWYgd2UndmUgZXhjZWVkZWQgbWF4IGF0dGVtcHRzXG4gICAgICBpZiAoY29ubmVjdGlvbkF0dGVtcHRzID4gTUFYX1JFQ09OTkVDVF9BVFRFTVBUUykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdSZWRpcyBjb25uZWN0aW9uIGZhaWxlZCBwZXJtYW5lbnRseSwgd2lsbCBjcmVhdGUgbmV3IGNsaWVudCBvbiBuZXh0IHJlcXVlc3QnKTtcbiAgICAgICAgcmVkaXNDbGllbnQgPSBudWxsO1xuICAgICAgICBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICByZWRpc0NsaWVudC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIFJlZGlzJyk7XG4gICAgICBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgIGNvbm5lY3Rpb25BdHRlbXB0cyA9IDA7XG4gICAgfSk7XG4gICAgXG4gICAgcmVkaXNDbGllbnQub24oJ3JlY29ubmVjdGluZycsICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdSZWNvbm5lY3RpbmcgdG8gUmVkaXMuLi4nKTtcbiAgICAgIGlzQ29ubmVjdGluZyA9IHRydWU7XG4gICAgfSk7XG4gICAgXG4gICAgcmVkaXNDbGllbnQub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1JlZGlzIGNvbm5lY3Rpb24gd2FybWVkIHVwJyk7XG4gICAgICBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBcbiAgICByZWRpc0NsaWVudC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1JlZGlzIGNvbm5lY3Rpb24gZW5kZWQnKTtcbiAgICAgIC8vIERvbid0IHNldCB0byBudWxsIGhlcmUgLSBsZXQgdGhlIGVycm9yIGhhbmRsZXIgZGVjaWRlXG4gICAgfSk7XG4gIH1cbiAgXG4gIHJldHVybiByZWRpc0NsaWVudDtcbn1cblxuLyoqXG4gKiBDbG9zZSBSZWRpcyBjb25uZWN0aW9uICh1c2VmdWwgZm9yIHNlcnZlcmxlc3MgZW52aXJvbm1lbnRzKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VSZWRpc0Nvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChyZWRpc0NsaWVudCkge1xuICAgIGF3YWl0IHJlZGlzQ2xpZW50LnF1aXQoKTtcbiAgICByZWRpc0NsaWVudCA9IG51bGw7XG4gIH1cbn1cblxuLy8gRW5jcnlwdGlvbiBrZXkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBmYWxsYmFja1xuY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9ICgpID0+IHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LlJFRElTX0VOQ1JZUFRJT05fS0VZIHx8ICdkZWZhdWx0LWVuY3J5cHRpb24ta2V5LWNoYW5nZS1pbi1wcm9kdWN0aW9uJztcbn07XG5cbi8qKlxuICogRW5jcnlwdCBzZW5zaXRpdmUgZGF0YSBiZWZvcmUgc3RvcmluZyBpbiBSZWRpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdERhdGEoZGF0YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIENyeXB0b0pTLkFFUy5lbmNyeXB0KGRhdGEsIGdldEVuY3J5cHRpb25LZXkoKSkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IHNlbnNpdGl2ZSBkYXRhIHJldHJpZXZlZCBmcm9tIFJlZGlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyeXB0RGF0YShlbmNyeXB0ZWREYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBieXRlcyA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KGVuY3J5cHRlZERhdGEsIGdldEVuY3J5cHRpb25LZXkoKSk7XG4gIHJldHVybiBieXRlcy50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG59XG5cbi8vIENhY2hlIGtleSBkZWZpbml0aW9uc1xuZXhwb3J0IGNvbnN0IEtFWVMgPSB7XG4gIENSRURFTlRJQUxTOiAodXNlcklkOiBzdHJpbmcsIGFjY291bnRJZDogc3RyaW5nKSA9PiBgZW1haWw6Y3JlZGVudGlhbHM6JHt1c2VySWR9OiR7YWNjb3VudElkfWAsXG4gIFNFU1NJT046ICh1c2VySWQ6IHN0cmluZykgPT4gYGVtYWlsOnNlc3Npb246JHt1c2VySWR9YCxcbiAgRU1BSUxfTElTVDogKHVzZXJJZDogc3RyaW5nLCBhY2NvdW50SWQ6IHN0cmluZywgZm9sZGVyOiBzdHJpbmcsIHBhZ2U6IG51bWJlciwgcGVyUGFnZTogbnVtYmVyKSA9PiBcbiAgICBgZW1haWw6bGlzdDoke3VzZXJJZH06JHthY2NvdW50SWR9OiR7Zm9sZGVyfToke3BhZ2V9OiR7cGVyUGFnZX1gLFxuICBFTUFJTF9DT05URU5UOiAodXNlcklkOiBzdHJpbmcsIGFjY291bnRJZDogc3RyaW5nLCBlbWFpbElkOiBzdHJpbmcpID0+IFxuICAgIGBlbWFpbDpjb250ZW50OiR7dXNlcklkfToke2FjY291bnRJZH06JHtlbWFpbElkfWBcbn07XG5cbi8vIFRUTCBjb25zdGFudHMgaW4gc2Vjb25kc1xuZXhwb3J0IGNvbnN0IFRUTCA9IHtcbiAgQ1JFREVOVElBTFM6IDYwICogNjAgKiAyNCwgLy8gMjQgaG91cnNcbiAgU0VTU0lPTjogNjAgKiA2MCAqIDQsICAgICAgLy8gNCBob3VycyAoaW5jcmVhc2VkIGZyb20gMzAgbWludXRlcylcbiAgRU1BSUxfTElTVDogNjAgKiA1LCAgICAgICAgLy8gNSBtaW51dGVzXG4gIEVNQUlMX0NPTlRFTlQ6IDYwICogMTUgICAgIC8vIDE1IG1pbnV0ZXNcbn07XG5cbmludGVyZmFjZSBFbWFpbENyZWRlbnRpYWxzIHtcbiAgZW1haWw6IHN0cmluZztcbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICBzZWN1cmU/OiBib29sZWFuO1xuICBlbmNyeXB0ZWRQYXNzd29yZD86IHN0cmluZztcbiAgc210cF9ob3N0Pzogc3RyaW5nO1xuICBzbXRwX3BvcnQ/OiBudW1iZXI7XG4gIHNtdHBfc2VjdXJlPzogYm9vbGVhbjtcbiAgZGlzcGxheV9uYW1lPzogc3RyaW5nO1xuICBjb2xvcj86IHN0cmluZztcbiAgdXNlT0F1dGg/OiBib29sZWFuO1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICB0b2tlbkV4cGlyeT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEltYXBTZXNzaW9uRGF0YSB7XG4gIGNvbm5lY3Rpb25JZD86IHN0cmluZztcbiAgbGFzdEFjdGl2ZTogbnVtYmVyO1xuICBtYWlsYm94ZXM/OiBzdHJpbmdbXTtcbiAgbGFzdFZpc2l0PzogbnVtYmVyO1xuICBkZWZhdWx0QWNjb3VudElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENhY2hlIGVtYWlsIGNyZWRlbnRpYWxzIGluIFJlZGlzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZUVtYWlsQ3JlZGVudGlhbHMoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgY3JlZGVudGlhbHM6IEVtYWlsQ3JlZGVudGlhbHNcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gIGNvbnN0IGtleSA9IEtFWVMuQ1JFREVOVElBTFModXNlcklkLCBhY2NvdW50SWQpO1xuICBcbiAgLy8gVmFsaWRhdGUgY3JlZGVudGlhbHMgYmVmb3JlIGNhY2hpbmdcbiAgaWYgKCFjcmVkZW50aWFscy5lbWFpbCB8fCAhY3JlZGVudGlhbHMuaG9zdCB8fCAoIWNyZWRlbnRpYWxzLnBhc3N3b3JkICYmICFjcmVkZW50aWFscy51c2VPQXV0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY2FjaGUgaW5jb21wbGV0ZSBjcmVkZW50aWFscyBmb3IgdXNlciAke3VzZXJJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coYENhY2hpbmcgY3JlZGVudGlhbHMgZm9yIHVzZXIgJHt1c2VySWR9YCk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGEgY29weSB3aXRob3V0IHRoZSBwYXNzd29yZCB0byBzdG9yZVxuICAgIGNvbnN0IHNlY3VyZUNyZWRlbnRpYWxzOiBFbWFpbENyZWRlbnRpYWxzID0ge1xuICAgICAgZW1haWw6IGNyZWRlbnRpYWxzLmVtYWlsLFxuICAgICAgaG9zdDogY3JlZGVudGlhbHMuaG9zdCxcbiAgICAgIHBvcnQ6IGNyZWRlbnRpYWxzLnBvcnQsXG4gICAgICBzZWN1cmU6IGNyZWRlbnRpYWxzLnNlY3VyZSA/PyB0cnVlLFxuICAgICAgLy8gSW5jbHVkZSB0aGUgZXh0ZW5kZWQgZmllbGRzXG4gICAgICAuLi4oY3JlZGVudGlhbHMuc210cF9ob3N0ICYmIHsgc210cF9ob3N0OiBjcmVkZW50aWFscy5zbXRwX2hvc3QgfSksXG4gICAgICAuLi4oY3JlZGVudGlhbHMuc210cF9wb3J0ICYmIHsgc210cF9wb3J0OiBjcmVkZW50aWFscy5zbXRwX3BvcnQgfSksXG4gICAgICAuLi4oY3JlZGVudGlhbHMuc210cF9zZWN1cmUgIT09IHVuZGVmaW5lZCAmJiB7IHNtdHBfc2VjdXJlOiBjcmVkZW50aWFscy5zbXRwX3NlY3VyZSB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5kaXNwbGF5X25hbWUgJiYgeyBkaXNwbGF5X25hbWU6IGNyZWRlbnRpYWxzLmRpc3BsYXlfbmFtZSB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5jb2xvciAmJiB7IGNvbG9yOiBjcmVkZW50aWFscy5jb2xvciB9KSxcbiAgICAgIC8vIEluY2x1ZGUgT0F1dGggZmllbGRzXG4gICAgICAuLi4oY3JlZGVudGlhbHMudXNlT0F1dGggIT09IHVuZGVmaW5lZCAmJiB7IHVzZU9BdXRoOiBjcmVkZW50aWFscy51c2VPQXV0aCB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5hY2Nlc3NUb2tlbiAmJiB7IGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbiB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy5yZWZyZXNoVG9rZW4gJiYgeyByZWZyZXNoVG9rZW46IGNyZWRlbnRpYWxzLnJlZnJlc2hUb2tlbiB9KSxcbiAgICAgIC4uLihjcmVkZW50aWFscy50b2tlbkV4cGlyeSAmJiB7IHRva2VuRXhwaXJ5OiBjcmVkZW50aWFscy50b2tlbkV4cGlyeSB9KVxuICAgIH07XG4gICAgXG4gICAgLy8gRW5jcnlwdCBwYXNzd29yZCBpZiBwcm92aWRlZFxuICAgIGlmIChjcmVkZW50aWFscy5wYXNzd29yZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gZW5jcnlwdERhdGEoY3JlZGVudGlhbHMucGFzc3dvcmQpO1xuICAgICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IGVuY3J5cHRlZCBwYXNzd29yZCBmb3IgdXNlciAke3VzZXJJZH1gKTtcbiAgICAgICAgc2VjdXJlQ3JlZGVudGlhbHMuZW5jcnlwdGVkUGFzc3dvcmQgPSBlbmNyeXB0ZWQ7XG4gICAgICB9IGNhdGNoIChlbmNyeXB0RXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGVuY3J5cHQgcGFzc3dvcmQgZm9yIHVzZXIgJHt1c2VySWR9OmAsIGVuY3J5cHRFcnJvcik7XG4gICAgICAgIC8vIENvbnRpbnVlIGFueXdheSBzaW5jZSB3ZSBtaWdodCBoYXZlIE9BdXRoIHRva2Vuc1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBhd2FpdCByZWRpcy5zZXQoa2V5LCBKU09OLnN0cmluZ2lmeShzZWN1cmVDcmVkZW50aWFscyksICdFWCcsIFRUTC5DUkVERU5USUFMUyk7XG4gICAgY29uc29sZS5sb2coYENyZWRlbnRpYWxzIGNhY2hlZCBmb3IgdXNlciAke3VzZXJJZH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjYWNoaW5nIGNyZWRlbnRpYWxzIGZvciB1c2VyICR7dXNlcklkfTpgLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgZW1haWwgY3JlZGVudGlhbHMgZnJvbSBSZWRpc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxDcmVkZW50aWFscyhcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPEVtYWlsQ3JlZGVudGlhbHMgfCBudWxsPiB7XG4gIGNvbnN0IHJlZGlzID0gZ2V0UmVkaXNDbGllbnQoKTtcbiAgY29uc3Qga2V5ID0gS0VZUy5DUkVERU5USUFMUyh1c2VySWQsIGFjY291bnRJZCk7XG4gIFxuICB0cnkge1xuICAgIGNvbnN0IGNyZWRTdHIgPSBhd2FpdCByZWRpcy5nZXQoa2V5KTtcbiAgICBcbiAgICBpZiAoIWNyZWRTdHIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjcmVkcyA9IEpTT04ucGFyc2UoY3JlZFN0cikgYXMgRW1haWxDcmVkZW50aWFscztcbiAgICBcbiAgICBsZXQgcGFzc3dvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBcbiAgICAvLyBIYW5kbGUgT0F1dGggYWNjb3VudHMgKHRoZXkgbWlnaHQgbm90IGhhdmUgYSBwYXNzd29yZClcbiAgICBpZiAoY3JlZHMuZW5jcnlwdGVkUGFzc3dvcmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIERlY3J5cHQgdGhlIHBhc3N3b3JkXG4gICAgICAgIHBhc3N3b3JkID0gZGVjcnlwdERhdGEoY3JlZHMuZW5jcnlwdGVkUGFzc3dvcmQpO1xuICAgICAgfSBjYXRjaCAoZGVjcnlwdEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBkZWNyeXB0IHBhc3N3b3JkIGZvciB1c2VyICR7dXNlcklkfTpgLCBkZWNyeXB0RXJyb3IpO1xuICAgICAgICAvLyBGb3IgT0F1dGggYWNjb3VudHMsIHdlIGNhbiBjb250aW51ZSB3aXRob3V0IGEgcGFzc3dvcmRcbiAgICAgICAgaWYgKCFjcmVkcy51c2VPQXV0aCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJldHVybiB0aGUgZnVsbCBjcmVkZW50aWFscyB3aXRoIGRlY3J5cHRlZCBwYXNzd29yZCBpZiBhdmFpbGFibGVcbiAgICBjb25zdCByZXN1bHQ6IEVtYWlsQ3JlZGVudGlhbHMgPSB7XG4gICAgICBlbWFpbDogY3JlZHMuZW1haWwsXG4gICAgICBob3N0OiBjcmVkcy5ob3N0LFxuICAgICAgcG9ydDogY3JlZHMucG9ydCxcbiAgICAgIHNlY3VyZTogY3JlZHMuc2VjdXJlID8/IHRydWUsXG4gICAgICAuLi4ocGFzc3dvcmQgJiYgeyBwYXNzd29yZCB9KSxcbiAgICAgIC4uLihjcmVkcy5zbXRwX2hvc3QgJiYgeyBzbXRwX2hvc3Q6IGNyZWRzLnNtdHBfaG9zdCB9KSxcbiAgICAgIC4uLihjcmVkcy5zbXRwX3BvcnQgJiYgeyBzbXRwX3BvcnQ6IGNyZWRzLnNtdHBfcG9ydCB9KSxcbiAgICAgIC4uLihjcmVkcy5zbXRwX3NlY3VyZSAhPT0gdW5kZWZpbmVkICYmIHsgc210cF9zZWN1cmU6IGNyZWRzLnNtdHBfc2VjdXJlIH0pLFxuICAgICAgLi4uKGNyZWRzLmRpc3BsYXlfbmFtZSAmJiB7IGRpc3BsYXlfbmFtZTogY3JlZHMuZGlzcGxheV9uYW1lIH0pLFxuICAgICAgLi4uKGNyZWRzLmNvbG9yICYmIHsgY29sb3I6IGNyZWRzLmNvbG9yIH0pLFxuICAgICAgLy8gSW5jbHVkZSBPQXV0aCBmaWVsZHNcbiAgICAgIC4uLihjcmVkcy51c2VPQXV0aCAhPT0gdW5kZWZpbmVkICYmIHsgdXNlT0F1dGg6IGNyZWRzLnVzZU9BdXRoIH0pLFxuICAgICAgLi4uKGNyZWRzLmFjY2Vzc1Rva2VuICYmIHsgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuIH0pLFxuICAgICAgLi4uKGNyZWRzLnJlZnJlc2hUb2tlbiAmJiB7IHJlZnJlc2hUb2tlbjogY3JlZHMucmVmcmVzaFRva2VuIH0pLFxuICAgICAgLi4uKGNyZWRzLnRva2VuRXhwaXJ5ICYmIHsgdG9rZW5FeHBpcnk6IGNyZWRzLnRva2VuRXhwaXJ5IH0pXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGdldHRpbmcgY3JlZGVudGlhbHMgZm9yIHVzZXIgJHt1c2VySWR9OmAsIGVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIENhY2hlIElNQVAgc2Vzc2lvbiBkYXRhIGZvciBxdWljayByZWNvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhY2hlSW1hcFNlc3Npb24oXG4gIHVzZXJJZDogc3RyaW5nLFxuICBzZXNzaW9uRGF0YTogSW1hcFNlc3Npb25EYXRhXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLlNFU1NJT04odXNlcklkKTtcbiAgXG4gIC8vIEFsd2F5cyB1cGRhdGUgdGhlIGxhc3RBY3RpdmUgdGltZXN0YW1wXG4gIHNlc3Npb25EYXRhLmxhc3RBY3RpdmUgPSBEYXRlLm5vdygpO1xuICBcbiAgYXdhaXQgcmVkaXMuc2V0KGtleSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkRhdGEpLCAnRVgnLCBUVEwuU0VTU0lPTik7XG59XG5cbi8qKlxuICogR2V0IGNhY2hlZCBJTUFQIHNlc3Npb24gZGF0YVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkSW1hcFNlc3Npb24oXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEltYXBTZXNzaW9uRGF0YSB8IG51bGw+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLlNFU1NJT04odXNlcklkKTtcbiAgXG4gIGNvbnN0IGNhY2hlZERhdGEgPSBhd2FpdCByZWRpcy5nZXQoa2V5KTtcbiAgaWYgKCFjYWNoZWREYXRhKSByZXR1cm4gbnVsbDtcbiAgXG4gIHJldHVybiBKU09OLnBhcnNlKGNhY2hlZERhdGEpIGFzIEltYXBTZXNzaW9uRGF0YTtcbn1cblxuLyoqXG4gKiBDYWNoZSBlbWFpbCBsaXN0IGluIFJlZGlzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWNoZUVtYWlsTGlzdChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nLFxuICBmb2xkZXI6IHN0cmluZyxcbiAgcGFnZTogbnVtYmVyLFxuICBwZXJQYWdlOiBudW1iZXIsXG4gIGRhdGE6IGFueVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlZGlzID0gZ2V0UmVkaXNDbGllbnQoKTtcbiAgY29uc3Qga2V5ID0gS0VZUy5FTUFJTF9MSVNUKHVzZXJJZCwgYWNjb3VudElkLCBmb2xkZXIsIHBhZ2UsIHBlclBhZ2UpO1xuICBcbiAgYXdhaXQgcmVkaXMuc2V0KGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSksICdFWCcsIFRUTC5FTUFJTF9MSVNUKTtcbn1cblxuLyoqXG4gKiBHZXQgY2FjaGVkIGVtYWlsIGxpc3QgZnJvbSBSZWRpc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkRW1haWxMaXN0KFxuICB1c2VySWQ6IHN0cmluZyxcbiAgYWNjb3VudElkOiBzdHJpbmcsXG4gIGZvbGRlcjogc3RyaW5nLFxuICBwYWdlOiBudW1iZXIsXG4gIHBlclBhZ2U6IG51bWJlclxuKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gIGNvbnN0IHJlZGlzID0gZ2V0UmVkaXNDbGllbnQoKTtcbiAgY29uc3Qga2V5ID0gS0VZUy5FTUFJTF9MSVNUKHVzZXJJZCwgYWNjb3VudElkLCBmb2xkZXIsIHBhZ2UsIHBlclBhZ2UpO1xuICBcbiAgY29uc3QgY2FjaGVkRGF0YSA9IGF3YWl0IHJlZGlzLmdldChrZXkpO1xuICBpZiAoIWNhY2hlZERhdGEpIHJldHVybiBudWxsO1xuICBcbiAgcmV0dXJuIEpTT04ucGFyc2UoY2FjaGVkRGF0YSk7XG59XG5cbi8qKlxuICogQ2FjaGUgZW1haWwgY29udGVudCBpbiBSZWRpc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FjaGVFbWFpbENvbnRlbnQoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgZW1haWxJZDogc3RyaW5nLFxuICBkYXRhOiBhbnlcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gIGNvbnN0IGtleSA9IEtFWVMuRU1BSUxfQ09OVEVOVCh1c2VySWQsIGFjY291bnRJZCwgZW1haWxJZCk7XG4gIFxuICBhd2FpdCByZWRpcy5zZXQoa2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSwgJ0VYJywgVFRMLkVNQUlMX0NPTlRFTlQpO1xufVxuXG4vKipcbiAqIEdldCBjYWNoZWQgZW1haWwgY29udGVudCBmcm9tIFJlZGlzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZWRFbWFpbENvbnRlbnQoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgZW1haWxJZDogc3RyaW5nXG4pOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLkVNQUlMX0NPTlRFTlQodXNlcklkLCBhY2NvdW50SWQsIGVtYWlsSWQpO1xuICBcbiAgY29uc3QgY2FjaGVkRGF0YSA9IGF3YWl0IHJlZGlzLmdldChrZXkpO1xuICBpZiAoIWNhY2hlZERhdGEpIHJldHVybiBudWxsO1xuICBcbiAgcmV0dXJuIEpTT04ucGFyc2UoY2FjaGVkRGF0YSk7XG59XG5cbi8qKlxuICogSW52YWxpZGF0ZSBhbGwgZW1haWwgY2FjaGVzIGZvciBhIGZvbGRlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52YWxpZGF0ZUZvbGRlckNhY2hlKFxuICB1c2VySWQ6IHN0cmluZyxcbiAgYWNjb3VudElkOiBzdHJpbmcsXG4gIGZvbGRlcjogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBwYXR0ZXJuID0gYGVtYWlsOmxpc3Q6JHt1c2VySWR9OiR7YWNjb3VudElkfToke2ZvbGRlcn06KmA7XG4gIFxuICAvLyBVc2UgU0NBTiB0byBmaW5kIGFuZCBkZWxldGUga2V5cyBtYXRjaGluZyB0aGUgcGF0dGVyblxuICBsZXQgY3Vyc29yID0gJzAnO1xuICBkbyB7XG4gICAgY29uc3QgW25leHRDdXJzb3IsIGtleXNdID0gYXdhaXQgcmVkaXMuc2NhbihjdXJzb3IsICdNQVRDSCcsIHBhdHRlcm4sICdDT1VOVCcsIDEwMCk7XG4gICAgY3Vyc29yID0gbmV4dEN1cnNvcjtcbiAgICBcbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCByZWRpcy5kZWwoLi4ua2V5cyk7XG4gICAgfVxuICB9IHdoaWxlIChjdXJzb3IgIT09ICcwJyk7XG59XG5cbi8qKlxuICogSW52YWxpZGF0ZSBlbWFpbCBjb250ZW50IGNhY2hlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZhbGlkYXRlRW1haWxDb250ZW50Q2FjaGUoXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgZW1haWxJZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVkaXMgPSBnZXRSZWRpc0NsaWVudCgpO1xuICBjb25zdCBrZXkgPSBLRVlTLkVNQUlMX0NPTlRFTlQodXNlcklkLCBhY2NvdW50SWQsIGVtYWlsSWQpO1xuICBcbiAgYXdhaXQgcmVkaXMuZGVsKGtleSk7XG59XG5cbi8qKlxuICogV2FybSB1cCBSZWRpcyBjb25uZWN0aW9uIHRvIGF2b2lkIGNvbGQgc3RhcnRzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXJtdXBSZWRpc0NhY2hlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIC8vIFBpbmcgUmVkaXMgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gZWFybHlcbiAgICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gICAgYXdhaXQgcmVkaXMucGluZygpO1xuICAgIGNvbnNvbGUubG9nKCdSZWRpcyBjb25uZWN0aW9uIHdhcm1lZCB1cCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdhcm1pbmcgdXAgUmVkaXM6JywgZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBSZWRpcyBjb25uZWN0aW9uIHN0YXR1c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXNTdGF0dXMoKTogUHJvbWlzZTx7XG4gIHN0YXR1czogJ2Nvbm5lY3RlZCcgfCAnZXJyb3InO1xuICBwaW5nPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gICAgY29uc3QgcG9uZyA9IGF3YWl0IHJlZGlzLnBpbmcoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiAnY29ubmVjdGVkJyxcbiAgICAgIHBpbmc6IHBvbmdcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEludmFsaWRhdGUgYWxsIHVzZXIgZW1haWwgY2FjaGVzIChlbWFpbCBsaXN0cyBhbmQgY29udGVudClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludmFsaWRhdGVVc2VyRW1haWxDYWNoZShcbiAgdXNlcklkOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWRpcyA9IGdldFJlZGlzQ2xpZW50KCk7XG4gIFxuICAvLyBQYXR0ZXJucyB0byBkZWxldGVcbiAgY29uc3QgcGF0dGVybnMgPSBbXG4gICAgYGVtYWlsOmxpc3Q6JHt1c2VySWR9OipgLFxuICAgIGBlbWFpbDpjb250ZW50OiR7dXNlcklkfToqYFxuICBdO1xuICBcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgbGV0IGN1cnNvciA9ICcwJztcbiAgICBkbyB7XG4gICAgICBjb25zdCBbbmV4dEN1cnNvciwga2V5c10gPSBhd2FpdCByZWRpcy5zY2FuKGN1cnNvciwgJ01BVENIJywgcGF0dGVybiwgJ0NPVU5UJywgMTAwKTtcbiAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7XG4gICAgICBcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZGVsKC4uLmtleXMpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKGN1cnNvciAhPT0gJzAnKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBjYWNoZWQgZW1haWwgY3JlZGVudGlhbHMgZnJvbSBSZWRpc1xuICogQGRlcHJlY2F0ZWQgVXNlIGdldEVtYWlsQ3JlZGVudGlhbHMgaW5zdGVhZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q2FjaGVkRW1haWxDcmVkZW50aWFscyhcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPEVtYWlsQ3JlZGVudGlhbHMgfCBudWxsPiB7XG4gIHJldHVybiBnZXRFbWFpbENyZWRlbnRpYWxzKHVzZXJJZCwgYWNjb3VudElkKTtcbn0gIl0sIm5hbWVzIjpbIlJlZGlzIiwiQ3J5cHRvSlMiLCJyZWRpc0NsaWVudCIsImlzQ29ubmVjdGluZyIsImNvbm5lY3Rpb25BdHRlbXB0cyIsIk1BWF9SRUNPTk5FQ1RfQVRURU1QVFMiLCJnZXRSZWRpc0NsaWVudCIsInN0YXR1cyIsImNvbnNvbGUiLCJ3YXJuIiwicmVkaXNPcHRpb25zIiwiaG9zdCIsInByb2Nlc3MiLCJlbnYiLCJSRURJU19IT1NUIiwicG9ydCIsIlJFRElTX1BPUlQiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInBhc3N3b3JkIiwiUkVESVNfUEFTU1dPUkQiLCJyZXRyeVN0cmF0ZWd5IiwidGltZXMiLCJlcnJvciIsImRlbGF5IiwiTWF0aCIsIm1pbiIsImxvZyIsIm1heFJldHJpZXNQZXJSZXF1ZXN0IiwiZW5hYmxlT2ZmbGluZVF1ZXVlIiwiY29ubmVjdFRpbWVvdXQiLCJkaXNjb25uZWN0VGltZW91dCIsImtlZXBBbGl2ZSIsImtleVByZWZpeCIsIm9uIiwiZXJyIiwiY2xvc2VSZWRpc0Nvbm5lY3Rpb24iLCJxdWl0IiwiZ2V0RW5jcnlwdGlvbktleSIsIlJFRElTX0VOQ1JZUFRJT05fS0VZIiwiZW5jcnlwdERhdGEiLCJkYXRhIiwiQUVTIiwiZW5jcnlwdCIsInRvU3RyaW5nIiwiZGVjcnlwdERhdGEiLCJlbmNyeXB0ZWREYXRhIiwiYnl0ZXMiLCJkZWNyeXB0IiwiZW5jIiwiVXRmOCIsIktFWVMiLCJDUkVERU5USUFMUyIsInVzZXJJZCIsImFjY291bnRJZCIsIlNFU1NJT04iLCJFTUFJTF9MSVNUIiwiZm9sZGVyIiwicGFnZSIsInBlclBhZ2UiLCJFTUFJTF9DT05URU5UIiwiZW1haWxJZCIsIlRUTCIsImNhY2hlRW1haWxDcmVkZW50aWFscyIsImNyZWRlbnRpYWxzIiwicmVkaXMiLCJrZXkiLCJlbWFpbCIsInVzZU9BdXRoIiwic2VjdXJlQ3JlZGVudGlhbHMiLCJzZWN1cmUiLCJzbXRwX2hvc3QiLCJzbXRwX3BvcnQiLCJzbXRwX3NlY3VyZSIsImRpc3BsYXlfbmFtZSIsImNvbG9yIiwiYWNjZXNzVG9rZW4iLCJyZWZyZXNoVG9rZW4iLCJ0b2tlbkV4cGlyeSIsImVuY3J5cHRlZCIsImVuY3J5cHRlZFBhc3N3b3JkIiwiZW5jcnlwdEVycm9yIiwic2V0IiwiSlNPTiIsInN0cmluZ2lmeSIsImdldEVtYWlsQ3JlZGVudGlhbHMiLCJjcmVkU3RyIiwiZ2V0IiwiY3JlZHMiLCJwYXJzZSIsImRlY3J5cHRFcnJvciIsInJlc3VsdCIsImNhY2hlSW1hcFNlc3Npb24iLCJzZXNzaW9uRGF0YSIsImxhc3RBY3RpdmUiLCJEYXRlIiwibm93IiwiZ2V0Q2FjaGVkSW1hcFNlc3Npb24iLCJjYWNoZWREYXRhIiwiY2FjaGVFbWFpbExpc3QiLCJnZXRDYWNoZWRFbWFpbExpc3QiLCJjYWNoZUVtYWlsQ29udGVudCIsImdldENhY2hlZEVtYWlsQ29udGVudCIsImludmFsaWRhdGVGb2xkZXJDYWNoZSIsInBhdHRlcm4iLCJjdXJzb3IiLCJuZXh0Q3Vyc29yIiwia2V5cyIsInNjYW4iLCJsZW5ndGgiLCJkZWwiLCJpbnZhbGlkYXRlRW1haWxDb250ZW50Q2FjaGUiLCJ3YXJtdXBSZWRpc0NhY2hlIiwicGluZyIsImdldFJlZGlzU3RhdHVzIiwicG9uZyIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsImludmFsaWRhdGVVc2VyRW1haWxDYWNoZSIsInBhdHRlcm5zIiwiZ2V0Q2FjaGVkRW1haWxDcmVkZW50aWFscyJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./lib/redis.ts\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./lib/services/email-service.ts":
|
|
/*!***************************************!*\
|
|
!*** ./lib/services/email-service.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 */ getEmailContent: () => (/* binding */ getEmailContent),\n/* harmony export */ getEmails: () => (/* binding */ getEmails),\n/* harmony export */ getImapConnection: () => (/* binding */ getImapConnection),\n/* harmony export */ getMailboxes: () => (/* binding */ getMailboxes),\n/* harmony export */ getUserEmailCredentials: () => (/* binding */ getUserEmailCredentials),\n/* harmony export */ markEmailReadStatus: () => (/* binding */ markEmailReadStatus),\n/* harmony export */ saveUserEmailCredentials: () => (/* binding */ saveUserEmailCredentials),\n/* harmony export */ sendEmail: () => (/* binding */ sendEmail),\n/* harmony export */ testEmailConnection: () => (/* binding */ testEmailConnection),\n/* harmony export */ toggleEmailFlag: () => (/* binding */ toggleEmailFlag)\n/* harmony export */ });\n/* harmony import */ var private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! private-next-rsc-server-reference */ \"(rsc)/./node_modules/next/dist/build/webpack/loaders/next-flight-loader/server-reference.js\");\n/* harmony import */ var private_next_rsc_action_encryption__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! private-next-rsc-action-encryption */ \"(rsc)/./node_modules/next/dist/server/app-render/encryption.js\");\n/* harmony import */ var private_next_rsc_action_encryption__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(private_next_rsc_action_encryption__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var server_only__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! server-only */ \"(rsc)/./node_modules/next/dist/compiled/server-only/empty.js\");\n/* harmony import */ var server_only__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(server_only__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var imapflow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! imapflow */ \"(rsc)/./node_modules/imapflow/lib/imap-flow.js\");\n/* harmony import */ var nodemailer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! nodemailer */ \"(rsc)/./node_modules/nodemailer/lib/nodemailer.js\");\n/* harmony import */ var _lib_prisma__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/lib/prisma */ \"(rsc)/./lib/prisma.ts\");\n/* harmony import */ var mailparser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! mailparser */ \"(rsc)/./node_modules/mailparser/index.js\");\n/* harmony import */ var mailparser__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(mailparser__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _lib_redis__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/lib/redis */ \"(rsc)/./lib/redis.ts\");\n/* harmony import */ var _token_refresh__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./token-refresh */ \"(rsc)/./lib/services/token-refresh.ts\");\n/* harmony import */ var private_next_rsc_action_validate__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! private-next-rsc-action-validate */ \"(rsc)/./node_modules/next/dist/build/webpack/loaders/next-flight-loader/action-validate.js\");\n/* __next_internal_action_entry_do_not_use__ {\"4010844c55b83dfb1f105bebefe0eefe1e6b431900\":\"testEmailConnection\",\"60249f33dc41bab8693201a3f19f5e5fb46e641c28\":\"getImapConnection\",\"60852a4e84650a79792bf7dba8eab6e2994fad2674\":\"sendEmail\",\"608647185521cdbec25a6e83fd03959d7becd6a6cd\":\"getMailboxes\",\"609e97c061f87c9d92e6b4c180de319248e8263787\":\"getUserEmailCredentials\",\"70576421f3f1a8e0b47693f06bf0b900d321800592\":\"saveUserEmailCredentials\",\"78725b1539278f6847adbb3f678020efc4d204d6de\":\"getEmailContent\",\"7c9e86d7555bbe449b808bd2ae7479f82af99409fe\":\"markEmailReadStatus\",\"7ccc49d190a944aede514b28ad88d4a52971336211\":\"toggleEmailFlag\",\"7e6fee2e8d6b5661c87219a81dea11090773f206cd\":\"getEmails\"} */ \n\n\n\n\n\n\n\n\n// Connection pool to reuse IMAP clients\nconst connectionPool = {};\n// Track overall connection metrics\nlet totalConnectionRequests = 0;\nlet totalNewConnections = 0;\nlet totalReuseConnections = 0;\nlet totalConnectionErrors = 0;\nlet lastMetricsReset = Date.now();\n// CRITICAL PERFORMANCE FIX: Increase idle timeout from 15 minutes to 30 minutes\n// This will keep connections alive longer and reduce reconnection delays\nconst CONNECTION_TIMEOUT = 30 * 60 * 1000; // Increased to 30 minutes (was 15 minutes)\nconst MAX_POOL_SIZE = 20; // Maximum number of connections to keep in the pool\nconst CONNECTION_CHECK_INTERVAL = 60 * 1000; // Check every minute\nconst MIN_POOL_SIZE = 2; // Keep at least this many active connections per user\n// Clean up idle connections periodically\nsetInterval(()=>{\n const now = Date.now();\n const connectionKeys = Object.keys(connectionPool);\n // If we've been collecting metrics for more than an hour, log and reset\n if (now - lastMetricsReset > 60 * 60 * 1000) {\n console.log(`[IMAP METRICS] Total requests: ${totalConnectionRequests}, New connections: ${totalNewConnections}, Reused: ${totalReuseConnections}, Errors: ${totalConnectionErrors}, Success rate: ${((totalReuseConnections + totalNewConnections) / totalConnectionRequests * 100).toFixed(2)}%`);\n totalConnectionRequests = 0;\n totalNewConnections = 0;\n totalReuseConnections = 0;\n totalConnectionErrors = 0;\n lastMetricsReset = now;\n }\n // PERFORMANCE FIX: Group connections by user for better management\n const connectionsByUser = {};\n connectionKeys.forEach((key)=>{\n const userId = key.split(':')[0];\n if (!connectionsByUser[userId]) {\n connectionsByUser[userId] = [];\n }\n connectionsByUser[userId].push(key);\n });\n // PERFORMANCE FIX: Manage pool size per user\n Object.entries(connectionsByUser).forEach(([userId, userConnections])=>{\n // Sort connections by last used (oldest first)\n const sortedConnections = userConnections.map((key)=>({\n key,\n lastUsed: connectionPool[key].lastUsed\n })).sort((a, b)=>a.lastUsed - b.lastUsed);\n // Keep the most recently used connections up to the min pool size\n const connectionsToKeep = sortedConnections.slice(-MIN_POOL_SIZE);\n const keepKeys = new Set(connectionsToKeep.map((conn)=>conn.key));\n // Check the rest for idle timeout\n sortedConnections.forEach(({ key, lastUsed })=>{\n // Skip connections to keep and those that are in the process of connecting\n if (keepKeys.has(key) || connectionPool[key].isConnecting) {\n return;\n }\n // Only close connections idle for too long\n if (now - lastUsed > CONNECTION_TIMEOUT) {\n console.log(`Closing idle IMAP connection for ${key} (idle for ${Math.round((now - lastUsed) / 1000)}s)`);\n try {\n if (connectionPool[key].client.usable) {\n connectionPool[key].client.logout().catch((err)=>{\n console.error(`Error closing idle connection for ${key}:`, err);\n });\n }\n } catch (error) {\n console.error(`Error checking connection status for ${key}:`, error);\n } finally{\n delete connectionPool[key];\n console.log(`Removed idle connection for ${key} from pool (pool size: ${Object.keys(connectionPool).length})`);\n }\n }\n });\n });\n // Log connection pool status with more details\n const activeCount = connectionKeys.filter((key)=>{\n const conn = connectionPool[key];\n return !conn.isConnecting && (conn.client?.usable || false);\n }).length;\n const connectingCount = connectionKeys.filter((key)=>connectionPool[key].isConnecting).length;\n console.log(`[IMAP POOL] Size: ${connectionKeys.length}, Active: ${activeCount}, Connecting: ${connectingCount}, Max: ${MAX_POOL_SIZE}`);\n}, CONNECTION_CHECK_INTERVAL);\n/**\n * Get IMAP connection for a user, reusing existing connections when possible\n * with improved connection handling and error recovery\n */ async function getImapConnection(userId, accountId) {\n const startTime = Date.now();\n totalConnectionRequests++;\n console.log(`Getting IMAP connection for user ${userId}${accountId ? ` account ${accountId}` : ''}`);\n // Special handling for 'default' accountId - find the first available account\n if (!accountId || accountId === 'default') {\n console.log(`No specific account provided or 'default' requested, trying to find first account for user ${userId}`);\n // Try getting the account ID from cache to avoid database query\n const sessionData = await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.getCachedImapSession)(userId);\n if (sessionData && sessionData.defaultAccountId) {\n accountId = sessionData.defaultAccountId;\n console.log(`Using cached default account ID: ${accountId}`);\n } else {\n // Query to find all accounts for this user\n const accounts = await _lib_prisma__WEBPACK_IMPORTED_MODULE_5__.prisma.mailCredentials.findMany({\n where: {\n userId\n },\n orderBy: {\n createdAt: 'asc'\n },\n take: 1\n });\n if (accounts && accounts.length > 0) {\n const firstAccount = accounts[0];\n console.log(`Using first available account: ${firstAccount.id} (${firstAccount.email})`);\n accountId = firstAccount.id;\n // Cache default account ID for future use\n if (sessionData) {\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheImapSession)(userId, {\n ...sessionData,\n defaultAccountId: accountId,\n lastActive: Date.now()\n });\n } else {\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheImapSession)(userId, {\n lastActive: Date.now(),\n defaultAccountId: accountId\n });\n }\n } else {\n totalConnectionErrors++;\n throw new Error('No email accounts configured for this user');\n }\n }\n }\n // Use accountId in connection key to ensure different accounts get different connections\n const connectionKey = `${userId}:${accountId}`;\n // If we already have a connection for this key\n if (connectionPool[connectionKey]) {\n const connection = connectionPool[connectionKey];\n // If a connection is being established, wait for it\n if (connection.isConnecting && connection.connectionPromise) {\n console.log(`Connection in progress for ${connectionKey}, waiting for existing connection`);\n try {\n const client = await connection.connectionPromise;\n connection.lastUsed = Date.now();\n totalReuseConnections++;\n console.log(`[IMAP] Reused pending connection for ${connectionKey} in ${Date.now() - startTime}ms`);\n return client;\n } catch (error) {\n console.error(`Error waiting for connection for ${connectionKey}:`, error);\n // Fall through to create new connection\n }\n }\n // Try to use existing connection if it's usable\n try {\n // PERFORMANCE FIX: More robust connection status checking\n if (connection.client && connection.client.usable) {\n // Touch the connection to mark it as recently used\n connection.lastUsed = Date.now();\n console.log(`Reusing existing IMAP connection for ${connectionKey}`);\n // Update session data in Redis\n await updateSessionData(userId, accountId);\n totalReuseConnections++;\n console.log(`[IMAP] Successfully reused connection for ${connectionKey} in ${Date.now() - startTime}ms`);\n return connection.client;\n } else {\n console.log(`Existing connection for ${connectionKey} not usable, recreating`);\n // Will create a new connection below\n }\n } catch (error) {\n console.warn(`Error checking existing connection for ${connectionKey}:`, error);\n // Will create a new connection below\n }\n }\n // If we get here, we need a new connection\n console.log(`Creating new IMAP connection for ${connectionKey}`);\n // First try to get credentials from Redis cache\n let credentials = await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.getCachedEmailCredentials)(userId, accountId);\n console.log(`Retrieved credentials from Redis cache for ${userId}:${accountId}:`, credentials ? {\n email: credentials.email,\n hasPassword: !!credentials.password,\n useOAuth: !!credentials.useOAuth,\n hasAccessToken: !!credentials.accessToken,\n hasRefreshToken: !!credentials.refreshToken\n } : 'No credentials found in cache');\n // If not in cache, get from database and cache them\n if (!credentials) {\n console.log(`Credentials not found in cache for ${userId}${accountId ? ` account ${accountId}` : ''}, attempting database lookup`);\n // Fetch directly from database\n const dbCredentials = await _lib_prisma__WEBPACK_IMPORTED_MODULE_5__.prisma.mailCredentials.findFirst({\n where: {\n AND: [\n {\n userId\n },\n accountId ? {\n id: accountId\n } : {}\n ]\n }\n });\n if (!dbCredentials) {\n console.error(`No credentials found for user ${userId}${accountId ? ` account ${accountId}` : ''}`);\n totalConnectionErrors++;\n throw new Error('Email account credentials not found');\n }\n console.log(`Database lookup returned credentials for ${dbCredentials.email}:`, {\n email: dbCredentials.email,\n hasPassword: !!dbCredentials.password,\n fields: Object.keys(dbCredentials)\n });\n // Create our credentials object from database data\n credentials = {\n email: dbCredentials.email,\n password: dbCredentials.password || '',\n host: dbCredentials.host,\n port: dbCredentials.port,\n secure: dbCredentials.secure,\n smtp_host: dbCredentials.smtp_host || undefined,\n smtp_port: dbCredentials.smtp_port || undefined,\n smtp_secure: dbCredentials.smtp_secure ?? false,\n display_name: dbCredentials.display_name || undefined,\n color: dbCredentials.color || undefined\n };\n }\n // Cast to extended type\n const extendedCreds = credentials;\n // MICROSOFT FIX: Detect Microsoft accounts by hostname and set OAuth flag\n if (extendedCreds.host === 'outlook.office365.com') {\n console.log(`Microsoft account detected (${extendedCreds.email}), setting useOAuth=true`);\n extendedCreds.useOAuth = true;\n // If we have no password but useOAuth is true, we need to make sure refresh token exists in Redis\n if (!extendedCreds.password && !extendedCreds.accessToken) {\n // If running in browser edge environment (serverless), try to refresh our tokens from Redis\n try {\n const cachedCreds = await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.getCachedEmailCredentials)(userId, accountId);\n if (cachedCreds && cachedCreds.refreshToken) {\n console.log(`Found refresh token in Redis for ${extendedCreds.email}, will use it`);\n extendedCreds.refreshToken = cachedCreds.refreshToken;\n extendedCreds.accessToken = cachedCreds.accessToken;\n extendedCreds.tokenExpiry = cachedCreds.tokenExpiry;\n // Make sure we cache these credentials again with the tokens\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheEmailCredentials)(userId, accountId, extendedCreds);\n } else {\n console.warn(`No refresh token found for ${extendedCreds.email} in Redis cache`);\n }\n } catch (err) {\n console.error(`Error retrieving cached credentials for ${extendedCreds.email}:`, err);\n }\n }\n }\n // If using OAuth, ensure we have a fresh token\n if (extendedCreds.useOAuth) {\n console.log(`Account is configured to use OAuth`);\n if (!extendedCreds.accessToken) {\n console.error(`OAuth is enabled but no access token for account ${extendedCreds.email}`);\n }\n try {\n console.log(`Ensuring fresh token for OAuth account ${extendedCreds.email}`);\n const { accessToken, success } = await (0,_token_refresh__WEBPACK_IMPORTED_MODULE_8__.ensureFreshToken)(userId, extendedCreds.email);\n if (success && accessToken) {\n extendedCreds.accessToken = accessToken;\n console.log(`Successfully refreshed token for ${extendedCreds.email}`);\n } else {\n console.error(`Failed to refresh token for ${extendedCreds.email}`);\n }\n } catch (err) {\n console.error(`Error refreshing token for ${extendedCreds.email}:`, err);\n }\n }\n // Initialize connection tracking\n connectionPool[connectionKey] = {\n client: null,\n lastUsed: Date.now(),\n isConnecting: true,\n connectionAttempts: (connectionPool[connectionKey]?.connectionAttempts || 0) + 1\n };\n // PERFORMANCE FIX: Add connection timeout to prevent hanging connections\n let connectionTimeout = setTimeout(()=>{\n console.error(`[IMAP] Connection for ${connectionKey} timed out after 60 seconds`);\n if (connectionPool[connectionKey]?.isConnecting) {\n delete connectionPool[connectionKey];\n totalConnectionErrors++;\n }\n }, 60 * 1000); // 60 seconds timeout\n // Create connection promise using the extended credentials\n const connectionPromise = createImapConnection(extendedCreds, connectionKey).then((client)=>{\n // Update connection pool entry\n connectionPool[connectionKey].client = client;\n connectionPool[connectionKey].isConnecting = false;\n connectionPool[connectionKey].lastUsed = Date.now();\n // Clear timeout since connection was successful\n if (connectionTimeout) {\n clearTimeout(connectionTimeout);\n connectionTimeout = null;\n }\n // Update session data\n updateSessionData(userId, accountId).catch((err)=>{\n console.error(`Failed to update session data: ${err.message}`);\n });\n totalNewConnections++;\n console.log(`[IMAP] Created new connection for ${connectionKey} in ${Date.now() - startTime}ms (attempt #${connectionPool[connectionKey].connectionAttempts})`);\n return client;\n }).catch((error)=>{\n // Clear timeout to prevent double errors\n if (connectionTimeout) {\n clearTimeout(connectionTimeout);\n connectionTimeout = null;\n }\n // Handle connection error\n console.error(`Failed to create IMAP connection for ${connectionKey}:`, error);\n delete connectionPool[connectionKey];\n totalConnectionErrors++;\n throw error;\n });\n // Save the promise to allow other requests to wait for this connection\n connectionPool[connectionKey].connectionPromise = connectionPromise;\n return connectionPromise;\n}\n/**\n * Helper function to create a new IMAP connection\n */ async function createImapConnection(credentials, connectionKey) {\n // Cast to extended type\n const extendedCreds = credentials;\n console.log(`Creating IMAP connection with credentials:`, {\n email: extendedCreds.email,\n host: extendedCreds.host,\n port: extendedCreds.port,\n hasPassword: !!extendedCreds.password,\n useOAuth: !!extendedCreds.useOAuth,\n hasAccessToken: !!extendedCreds.accessToken,\n hasRefreshToken: !!extendedCreds.refreshToken,\n hasTokenExpiry: !!extendedCreds.tokenExpiry\n });\n let authParams;\n // Check if we have valid OAuth tokens\n if (extendedCreds.useOAuth && extendedCreds.accessToken) {\n console.log(`Using XOAUTH2 authentication for ${connectionKey} (OAuth enabled)`);\n // Set auth parameters for ImapFlow\n authParams = {\n user: extendedCreds.email,\n accessToken: extendedCreds.accessToken\n };\n console.log(`XOAUTH2 auth configured for ${connectionKey}`);\n } else if (extendedCreds.password) {\n // Use regular password authentication\n console.log(`Using password authentication for ${connectionKey} (OAuth not enabled or no token)`);\n authParams = {\n user: extendedCreds.email,\n pass: extendedCreds.password\n };\n } else {\n // No authentication method available\n console.error(`No authentication method found for ${connectionKey}:`, {\n hasPassword: !!extendedCreds.password,\n useOAuth: !!extendedCreds.useOAuth,\n hasAccessToken: !!extendedCreds.accessToken\n });\n throw new Error(`No authentication method available for ${connectionKey} - need either password or OAuth token`);\n }\n console.log(`Creating ImapFlow client for ${connectionKey} with authentication type: ${extendedCreds.useOAuth ? 'OAuth' : 'Password'}`);\n const client = new imapflow__WEBPACK_IMPORTED_MODULE_3__.ImapFlow({\n host: extendedCreds.host,\n port: extendedCreds.port,\n secure: extendedCreds.secure ?? true,\n auth: authParams,\n logger: false,\n emitLogs: false,\n tls: {\n rejectUnauthorized: false\n },\n disableAutoIdle: false\n });\n try {\n console.log(`Connecting to IMAP server: ${extendedCreds.host}:${extendedCreds.port}`);\n await client.connect();\n console.log(`Successfully connected to IMAP server for ${connectionKey}`);\n } catch (error) {\n console.error(`Failed to connect to IMAP server for ${connectionKey}:`, error);\n throw error;\n }\n // Add error handler\n client.on('error', (err)=>{\n console.error(`IMAP connection error for ${connectionKey}:`, err);\n // Remove from pool on error\n if (connectionPool[connectionKey]) {\n delete connectionPool[connectionKey];\n }\n });\n return client;\n}\n/**\n * Update session data in Redis\n */ async function updateSessionData(userId, accountId) {\n const sessionData = await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.getCachedImapSession)(userId);\n if (sessionData) {\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheImapSession)(userId, {\n ...sessionData,\n lastActive: Date.now(),\n ...accountId && {\n defaultAccountId: accountId\n }\n });\n } else {\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheImapSession)(userId, {\n lastActive: Date.now(),\n ...accountId && {\n defaultAccountId: accountId\n }\n });\n }\n}\n/**\n * Get user's email credentials from database\n */ async function getUserEmailCredentials(userId, accountId) {\n const credentials = await _lib_prisma__WEBPACK_IMPORTED_MODULE_5__.prisma.mailCredentials.findFirst({\n where: {\n AND: [\n {\n userId\n },\n accountId ? {\n id: accountId\n } : {}\n ]\n }\n });\n if (!credentials) return null;\n const mailCredentials = credentials;\n return {\n email: mailCredentials.email,\n password: mailCredentials.password,\n host: mailCredentials.host,\n port: mailCredentials.port,\n secure: mailCredentials.secure,\n smtp_host: mailCredentials.smtp_host || undefined,\n smtp_port: mailCredentials.smtp_port || undefined,\n smtp_secure: mailCredentials.smtp_secure ?? false,\n display_name: mailCredentials.display_name || undefined,\n color: mailCredentials.color || undefined\n };\n}\n/**\n * Save or update user's email credentials\n */ async function saveUserEmailCredentials(userId, accountId, credentials) {\n console.log('Saving credentials for user:', userId, 'account:', accountId);\n if (!credentials) {\n throw new Error('No credentials provided');\n }\n // Cast to extended type to access OAuth properties\n const extendedCreds = credentials;\n // Store OAuth information in a separate object for caching\n const oauthData = {\n useOAuth: extendedCreds.useOAuth,\n accessToken: extendedCreds.accessToken,\n refreshToken: extendedCreds.refreshToken,\n tokenExpiry: extendedCreds.tokenExpiry\n };\n // Extract only the fields that exist in the database schema\n // Based on the schema from 'npx prisma db pull', OAuth fields don't exist\n const dbCredentials = {\n email: credentials.email,\n password: credentials.password ?? '',\n host: credentials.host,\n port: credentials.port,\n secure: credentials.secure ?? true,\n smtp_host: credentials.smtp_host || null,\n smtp_port: credentials.smtp_port || null,\n smtp_secure: credentials.smtp_secure ?? false,\n display_name: credentials.display_name || null,\n color: credentials.color || null\n };\n try {\n console.log('Saving credentials to database:', {\n ...dbCredentials,\n password: dbCredentials.password ? '***' : null\n });\n console.log('OAuth data will be saved to Redis cache only:', {\n hasOAuth: !!oauthData.useOAuth,\n hasAccessToken: !!oauthData.accessToken,\n hasRefreshToken: !!oauthData.refreshToken\n });\n // Save to database using the unique constraint on [userId, email]\n await _lib_prisma__WEBPACK_IMPORTED_MODULE_5__.prisma.mailCredentials.upsert({\n where: {\n id: await _lib_prisma__WEBPACK_IMPORTED_MODULE_5__.prisma.mailCredentials.findFirst({\n where: {\n AND: [\n {\n userId\n },\n {\n email: accountId\n }\n ]\n },\n select: {\n id: true\n }\n }).then((result)=>result?.id ?? '')\n },\n update: dbCredentials,\n create: {\n userId,\n ...dbCredentials\n }\n });\n // Create a combined credentials object for caching\n const fullCreds = {\n ...dbCredentials,\n ...oauthData\n }; // Cast to the expected type\n // Cache the full credentials including OAuth tokens\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheEmailCredentials)(userId, accountId, fullCreds);\n console.log('Successfully saved credentials to database and cached full data with OAuth tokens');\n } catch (error) {\n console.error('Error saving credentials:', error);\n throw error;\n }\n}\n/**\n * Get list of emails for a user\n */ async function getEmails(userId, folder, page = 1, perPage = 20, accountId, checkOnly = false) {\n // Normalize folder name and handle account ID\n console.log(`[getEmails] Processing request for folder: ${folder}, normalized to ${folder}, account: ${accountId || 'default'}, checkOnly: ${checkOnly}`);\n try {\n // The getImapConnection function already handles 'default' accountId by finding the first available account\n const client = await getImapConnection(userId, accountId);\n // At this point, accountId has been resolved to an actual account ID by getImapConnection\n // Store the resolved accountId in a variable that is guaranteed to be a string\n const resolvedAccountId = accountId || 'default';\n // Attempt to select the mailbox\n try {\n const mailboxInfo = await client.mailboxOpen(folder);\n console.log(`Opened mailbox ${folder} with ${mailboxInfo.exists} messages`);\n // Get list of all mailboxes for UI\n const mailboxes = await getMailboxes(client, resolvedAccountId);\n // Calculate pagination\n const totalEmails = mailboxInfo.exists || 0;\n const totalPages = Math.ceil(totalEmails / perPage);\n // Check if mailbox is empty\n if (totalEmails === 0) {\n // Cache the empty result\n const emptyResult = {\n emails: [],\n totalEmails: 0,\n page,\n perPage,\n totalPages: 0,\n folder,\n mailboxes,\n newestEmailId: 0\n };\n // Only cache if not in checkOnly mode\n if (!checkOnly) {\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheEmailList)(userId, resolvedAccountId, folder, page, perPage, emptyResult);\n }\n return emptyResult;\n }\n // If checkOnly mode, we just fetch the most recent email's ID to compare\n if (checkOnly) {\n console.log(`[getEmails] checkOnly mode: fetching only the most recent email ID`);\n // Get the most recent message (highest sequence number)\n const lastMessageSequence = totalEmails.toString();\n console.log(`[getEmails] Fetching latest message with sequence: ${lastMessageSequence}`);\n const messages = await client.fetch(lastMessageSequence, {\n uid: true\n });\n let newestEmailId = 0;\n for await (const message of messages){\n newestEmailId = message.uid;\n }\n console.log(`[getEmails] Latest email UID: ${newestEmailId}`);\n // Return minimal result with just the newest email ID\n return {\n emails: [],\n totalEmails,\n page,\n perPage,\n totalPages,\n folder,\n mailboxes,\n newestEmailId\n };\n }\n // Calculate message range for pagination\n const start = Math.max(1, totalEmails - page * perPage + 1);\n const end = Math.max(1, totalEmails - (page - 1) * perPage);\n console.log(`Fetching messages ${start}:${end} from ${folder} for account ${resolvedAccountId}`);\n // Fetch messages\n const messages = await client.fetch(`${start}:${end}`, {\n envelope: true,\n flags: true,\n bodyStructure: true,\n uid: true\n });\n const emails = [];\n let newestEmailId = 0;\n for await (const message of messages){\n // Track the newest email ID (highest UID)\n if (message.uid > newestEmailId) {\n newestEmailId = message.uid;\n }\n const email = {\n id: message.uid.toString(),\n from: message.envelope.from?.map((addr)=>({\n name: addr.name || '',\n address: addr.address || ''\n })) || [],\n to: message.envelope.to?.map((addr)=>({\n name: addr.name || '',\n address: addr.address || ''\n })) || [],\n subject: message.envelope.subject || '',\n date: message.envelope.date || new Date(),\n flags: {\n seen: message.flags.has('\\\\Seen'),\n flagged: message.flags.has('\\\\Flagged'),\n answered: message.flags.has('\\\\Answered'),\n draft: message.flags.has('\\\\Draft'),\n deleted: message.flags.has('\\\\Deleted')\n },\n size: message.size || 0,\n hasAttachments: message.bodyStructure?.childNodes?.some((node)=>node.disposition === 'attachment') || false,\n folder: folder,\n contentFetched: false,\n accountId: resolvedAccountId,\n content: {\n text: '',\n html: '',\n isHtml: false,\n direction: 'ltr'\n }\n };\n emails.push(email);\n }\n // Prepare the result\n const result = {\n emails,\n totalEmails,\n page,\n perPage,\n totalPages: Math.ceil(totalEmails / perPage),\n folder,\n mailboxes,\n newestEmailId\n };\n // Cache the result with the effective account ID (only if not in checkOnly mode)\n if (!checkOnly) {\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheEmailList)(userId, resolvedAccountId, folder, page, perPage, result);\n }\n return result;\n } catch (error) {\n console.error('Error fetching emails:', error);\n throw error;\n }\n } catch (error) {\n console.error('Error fetching emails:', error);\n throw error;\n }\n}\n// Map email addresses safely with null checks\nfunction mapAddresses(addresses) {\n if (!addresses || !Array.isArray(addresses)) {\n return [];\n }\n return addresses.map((addr)=>({\n name: addr.name || addr.address || '',\n address: addr.address || ''\n }));\n}\n/**\n * Get a single email with full content\n */ async function getEmailContent(userId, emailId, folder = 'INBOX', accountId) {\n // Validate parameters\n if (!userId || !emailId || !folder) {\n throw new Error('Missing required parameters');\n }\n // Validate UID format\n if (!/^\\d+$/.test(emailId)) {\n throw new Error('Invalid email ID format: must be a numeric UID');\n }\n // Convert to number for IMAP\n const numericId = parseInt(emailId, 10);\n if (isNaN(numericId)) {\n throw new Error('Email ID must be a number');\n }\n // Extract account ID from folder name if present and none was explicitly provided\n const folderAccountId = folder.includes(':') ? folder.split(':')[0] : accountId;\n // Use the most specific account ID available\n const effectiveAccountId = folderAccountId || accountId || 'default';\n // Normalize folder name by removing account prefix if present\n const normalizedFolder = folder.includes(':') ? folder.split(':')[1] : folder;\n console.log(`[getEmailContent] Fetching email ${emailId} from folder ${normalizedFolder}, account ${effectiveAccountId}`);\n // Use normalized folder name and effective account ID for cache key\n const cachedEmail = await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.getCachedEmailContent)(userId, effectiveAccountId, emailId);\n if (cachedEmail) {\n console.log(`Using cached email content for ${userId}:${effectiveAccountId}:${emailId}`);\n return cachedEmail;\n }\n console.log(`Cache miss for email content ${userId}:${effectiveAccountId}:${emailId}, fetching from IMAP`);\n const client = await getImapConnection(userId, effectiveAccountId);\n try {\n await client.mailboxOpen(normalizedFolder);\n // Log connection details with account context\n console.log(`[DEBUG] Fetching email ${emailId} from folder ${normalizedFolder} for account ${effectiveAccountId}`);\n // Open mailbox with error handling\n const mailbox = await client.mailboxOpen(normalizedFolder);\n if (!mailbox || typeof mailbox === 'boolean') {\n throw new Error(`Failed to open mailbox: ${normalizedFolder} for account ${effectiveAccountId}`);\n }\n // Log mailbox status with account context\n console.log(`[DEBUG] Mailbox ${normalizedFolder} opened for account ${effectiveAccountId}, total messages: ${mailbox.exists}`);\n // Get the UIDVALIDITY and UIDNEXT values\n const uidValidity = mailbox.uidValidity;\n const uidNext = mailbox.uidNext;\n console.log(`[DEBUG] Mailbox UIDVALIDITY: ${uidValidity}, UIDNEXT: ${uidNext} for account ${effectiveAccountId}`);\n // Validate UID exists in mailbox\n if (numericId >= uidNext) {\n throw new Error(`Email ID ${numericId} is greater than or equal to the highest UID in mailbox (${uidNext}) for account ${effectiveAccountId}`);\n }\n // First, try to get the sequence number for this UID\n const searchResult = await client.search({\n uid: numericId.toString()\n });\n if (!searchResult || searchResult.length === 0) {\n throw new Error(`Email with UID ${numericId} not found in folder ${normalizedFolder} for account ${effectiveAccountId}`);\n }\n const sequenceNumber = searchResult[0];\n console.log(`[DEBUG] Found sequence number ${sequenceNumber} for UID ${numericId} in account ${effectiveAccountId}`);\n // Now fetch using the sequence number with error handling\n let message;\n try {\n message = await client.fetchOne(sequenceNumber.toString(), {\n source: true,\n envelope: true,\n flags: true,\n size: true\n });\n } catch (fetchError) {\n console.error(`Error fetching message with sequence ${sequenceNumber}:`, fetchError);\n throw new Error(`Failed to fetch email: ${fetchError instanceof Error ? fetchError.message : 'Unknown error'}`);\n }\n if (!message) {\n throw new Error(`Email not found with sequence number ${sequenceNumber} in folder ${normalizedFolder} for account ${effectiveAccountId}`);\n }\n // Check if message has required fields\n if (!message.source || !message.envelope) {\n throw new Error(`Invalid email data received: missing source or envelope data`);\n }\n const { source, envelope, flags, size } = message;\n // Validate envelope data\n if (!envelope) {\n throw new Error('Email envelope data is missing');\n }\n // Parse the email content, ensuring all styles and structure are preserved\n let parsedEmail;\n try {\n parsedEmail = await (0,mailparser__WEBPACK_IMPORTED_MODULE_6__.simpleParser)(source.toString(), {\n skipHtmlToText: true,\n keepCidLinks: true\n });\n } catch (parseError) {\n console.error(`Error parsing email content for ${emailId}:`, parseError);\n throw new Error(`Failed to parse email content: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`);\n }\n // Convert flags from Set to boolean checks\n const flagsArray = Array.from(flags);\n // Preserve the raw HTML exactly as it was in the original email\n const rawHtml = parsedEmail.html || '';\n const email = {\n id: emailId,\n messageId: envelope.messageId,\n subject: envelope.subject || \"(No Subject)\",\n from: mapAddresses(envelope.from),\n to: mapAddresses(envelope.to),\n cc: mapAddresses(envelope.cc),\n bcc: mapAddresses(envelope.bcc),\n date: envelope.date || new Date(),\n flags: {\n seen: flagsArray.includes(\"\\\\Seen\"),\n flagged: flagsArray.includes(\"\\\\Flagged\"),\n answered: flagsArray.includes(\"\\\\Answered\"),\n deleted: flagsArray.includes(\"\\\\Deleted\"),\n draft: flagsArray.includes(\"\\\\Draft\")\n },\n hasAttachments: parsedEmail.attachments?.length > 0,\n attachments: parsedEmail.attachments?.map((att)=>({\n filename: att.filename || 'attachment',\n contentType: att.contentType,\n size: att.size || 0\n })),\n content: {\n text: parsedEmail.text || '',\n html: rawHtml || '',\n isHtml: !!rawHtml,\n direction: 'ltr' // Default to left-to-right\n },\n folder: normalizedFolder,\n contentFetched: true,\n size: size || 0,\n accountId: effectiveAccountId\n };\n // Cache the email content with effective account ID\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.cacheEmailContent)(userId, effectiveAccountId, emailId, email);\n return email;\n } catch (error) {\n console.error('[ERROR] Email fetch failed:', {\n userId,\n emailId,\n folder: normalizedFolder,\n accountId: effectiveAccountId,\n error: error instanceof Error ? error.message : 'Unknown error',\n details: error instanceof Error ? error.stack : undefined\n });\n throw error;\n } finally{\n try {\n await client.mailboxClose();\n } catch (error) {\n console.error('Error closing mailbox:', error);\n }\n }\n}\n/**\n * Mark an email as read or unread\n */ async function markEmailReadStatus(userId, emailId, isRead, folder = 'INBOX', accountId) {\n // Extract account ID from folder name if present and none was explicitly provided\n const folderAccountId = folder.includes(':') ? folder.split(':')[0] : accountId;\n // Use the most specific account ID available\n const effectiveAccountId = folderAccountId || accountId || 'default';\n // Normalize folder name by removing account prefix if present\n const normalizedFolder = folder.includes(':') ? folder.split(':')[1] : folder;\n console.log(`[markEmailReadStatus] Marking email ${emailId} as ${isRead ? 'read' : 'unread'} in folder ${normalizedFolder}, account ${effectiveAccountId}`);\n const client = await getImapConnection(userId, effectiveAccountId);\n try {\n await client.mailboxOpen(normalizedFolder);\n if (isRead) {\n await client.messageFlagsAdd(emailId, [\n '\\\\Seen'\n ]);\n } else {\n await client.messageFlagsRemove(emailId, [\n '\\\\Seen'\n ]);\n }\n // Invalidate content cache since the flags changed\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.invalidateEmailContentCache)(userId, effectiveAccountId, emailId);\n // Also invalidate folder cache because unread counts may have changed\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.invalidateFolderCache)(userId, effectiveAccountId, normalizedFolder);\n return true;\n } catch (error) {\n console.error(`Error marking email ${emailId} as ${isRead ? 'read' : 'unread'} in folder ${normalizedFolder}, account ${effectiveAccountId}:`, error);\n return false;\n } finally{\n try {\n await client.mailboxClose();\n } catch (error) {\n console.error('Error closing mailbox:', error);\n }\n }\n}\n/**\n * Toggle an email's flagged (starred) status\n */ async function toggleEmailFlag(userId, emailId, flagged, folder = 'INBOX', accountId) {\n // Extract account ID from folder name if present and none was explicitly provided\n const folderAccountId = folder.includes(':') ? folder.split(':')[0] : accountId;\n // Use the most specific account ID available\n const effectiveAccountId = folderAccountId || accountId || 'default';\n // Normalize folder name by removing account prefix if present\n const normalizedFolder = folder.includes(':') ? folder.split(':')[1] : folder;\n console.log(`[toggleEmailFlag] Marking email ${emailId} as ${flagged ? 'flagged' : 'unflagged'} in folder ${normalizedFolder}, account ${effectiveAccountId}`);\n const client = await getImapConnection(userId, effectiveAccountId);\n try {\n await client.mailboxOpen(normalizedFolder);\n if (flagged) {\n await client.messageFlagsAdd(emailId, [\n '\\\\Flagged'\n ]);\n } else {\n await client.messageFlagsRemove(emailId, [\n '\\\\Flagged'\n ]);\n }\n // Invalidate content cache since the flags changed\n await (0,_lib_redis__WEBPACK_IMPORTED_MODULE_7__.invalidateEmailContentCache)(userId, effectiveAccountId, emailId);\n return true;\n } catch (error) {\n console.error(`Error toggling flag for email ${emailId} in folder ${normalizedFolder}, account ${effectiveAccountId}:`, error);\n return false;\n } finally{\n try {\n await client.mailboxClose();\n } catch (error) {\n console.error('Error closing mailbox:', error);\n }\n }\n}\nasync function sendEmail(userId, emailData) {\n const credentials = await getUserEmailCredentials(userId);\n if (!credentials) {\n return {\n success: false,\n error: 'No email credentials found'\n };\n }\n // Cast to extended type\n const extendedCreds = credentials;\n // Configure SMTP auth based on OAuth or password\n const smtpAuth = extendedCreds.useOAuth && extendedCreds.accessToken ? {\n type: 'OAuth2',\n user: extendedCreds.email,\n accessToken: extendedCreds.accessToken\n } : {\n user: extendedCreds.email,\n pass: extendedCreds.password\n };\n // Create SMTP transporter with user's SMTP settings\n const transporter = nodemailer__WEBPACK_IMPORTED_MODULE_4__.createTransport({\n host: extendedCreds.smtp_host || 'smtp.infomaniak.com',\n port: extendedCreds.smtp_port || 587,\n secure: extendedCreds.smtp_secure || false,\n auth: smtpAuth,\n tls: {\n rejectUnauthorized: false\n }\n });\n try {\n const info = await transporter.sendMail({\n from: extendedCreds.email,\n to: emailData.to,\n cc: emailData.cc,\n bcc: emailData.bcc,\n subject: emailData.subject,\n text: emailData.body,\n html: emailData.body,\n attachments: emailData.attachments?.map((att)=>({\n filename: att.name,\n content: att.content,\n contentType: att.type\n }))\n });\n return {\n success: true,\n messageId: info.messageId\n };\n } catch (error) {\n console.error('Failed to send email:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n}\n/**\n * Get list of mailboxes from an IMAP connection\n */ async function getMailboxes(client, accountId) {\n try {\n const mailboxes = await client.list();\n // If we have an accountId, prefix the folder names to prevent namespace collisions\n if (accountId) {\n return mailboxes.map((mailbox)=>`${accountId}:${mailbox.path}`);\n }\n // For backward compatibility, return unprefixed names when no accountId\n return mailboxes.map((mailbox)=>mailbox.path);\n } catch (error) {\n console.error('Error fetching mailboxes:', error);\n // Return empty array on error to avoid showing incorrect folders\n return [];\n }\n}\n/**\n * Test IMAP and SMTP connections for an email account\n */ async function testEmailConnection(credentials) {\n // Cast to extended type to use OAuth properties\n const extendedCreds = credentials;\n console.log('Testing connection with:', {\n ...extendedCreds,\n password: extendedCreds.password ? '***' : undefined,\n accessToken: extendedCreds.accessToken ? '***' : undefined,\n refreshToken: extendedCreds.refreshToken ? '***' : undefined\n });\n // Test IMAP connection\n try {\n console.log(`Testing IMAP connection to ${extendedCreds.host}:${extendedCreds.port} for ${extendedCreds.email}`);\n // Configure auth based on whether we're using OAuth or password\n let authParams;\n if (extendedCreds.useOAuth && extendedCreds.accessToken) {\n console.log('Using XOAUTH2 authentication mechanism');\n // For OAuth, pass the accessToken directly to ImapFlow\n authParams = {\n user: extendedCreds.email,\n accessToken: extendedCreds.accessToken\n };\n // Log the token length to verify it exists\n console.log(`Access token available (length: ${extendedCreds.accessToken.length})`);\n } else {\n console.log('Using password authentication mechanism');\n authParams = {\n user: extendedCreds.email,\n pass: extendedCreds.password\n };\n }\n const client = new imapflow__WEBPACK_IMPORTED_MODULE_3__.ImapFlow({\n host: extendedCreds.host,\n port: extendedCreds.port,\n secure: extendedCreds.secure ?? true,\n auth: authParams,\n logger: false,\n tls: {\n rejectUnauthorized: false\n }\n });\n console.log('Attempting to connect to IMAP server...');\n await client.connect();\n console.log('IMAP connection successful! Getting mailboxes...');\n const folders = await getMailboxes(client);\n await client.logout();\n console.log(`IMAP connection successful for ${extendedCreds.email}`);\n console.log(`Found ${folders.length} folders:`, folders);\n // Test SMTP connection if SMTP settings are provided\n let smtpSuccess = false;\n if (extendedCreds.smtp_host && extendedCreds.smtp_port) {\n try {\n console.log(`Testing SMTP connection to ${extendedCreds.smtp_host}:${extendedCreds.smtp_port}`);\n // Configure SMTP auth based on OAuth or password\n const smtpAuth = extendedCreds.useOAuth && extendedCreds.accessToken ? {\n type: 'OAuth2',\n user: extendedCreds.email,\n accessToken: extendedCreds.accessToken\n } : {\n user: extendedCreds.email,\n pass: extendedCreds.password\n };\n const transporter = nodemailer__WEBPACK_IMPORTED_MODULE_4__.createTransport({\n host: extendedCreds.smtp_host,\n port: extendedCreds.smtp_port,\n secure: extendedCreds.smtp_secure ?? false,\n auth: smtpAuth,\n tls: {\n rejectUnauthorized: false\n }\n });\n await transporter.verify();\n console.log(`SMTP connection successful for ${extendedCreds.email}`);\n smtpSuccess = true;\n } catch (smtpError) {\n console.error(`SMTP connection failed for ${extendedCreds.email}:`, smtpError);\n return {\n imap: true,\n smtp: false,\n error: `SMTP connection failed: ${smtpError instanceof Error ? smtpError.message : 'Unknown error'}`,\n folders\n };\n }\n }\n return {\n imap: true,\n smtp: smtpSuccess,\n folders\n };\n } catch (error) {\n console.error(`IMAP connection failed for ${extendedCreds.email}:`, error);\n return {\n imap: false,\n error: `IMAP connection failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n };\n }\n}\n\n(0,private_next_rsc_action_validate__WEBPACK_IMPORTED_MODULE_9__.ensureServerEntryExports)([\n getImapConnection,\n getUserEmailCredentials,\n saveUserEmailCredentials,\n getEmails,\n getEmailContent,\n markEmailReadStatus,\n toggleEmailFlag,\n sendEmail,\n getMailboxes,\n testEmailConnection\n]);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(getImapConnection, \"60249f33dc41bab8693201a3f19f5e5fb46e641c28\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(getUserEmailCredentials, \"609e97c061f87c9d92e6b4c180de319248e8263787\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(saveUserEmailCredentials, \"70576421f3f1a8e0b47693f06bf0b900d321800592\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(getEmails, \"7e6fee2e8d6b5661c87219a81dea11090773f206cd\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(getEmailContent, \"78725b1539278f6847adbb3f678020efc4d204d6de\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(markEmailReadStatus, \"7c9e86d7555bbe449b808bd2ae7479f82af99409fe\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(toggleEmailFlag, \"7ccc49d190a944aede514b28ad88d4a52971336211\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(sendEmail, \"60852a4e84650a79792bf7dba8eab6e2994fad2674\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(getMailboxes, \"608647185521cdbec25a6e83fd03959d7becd6a6cd\", null);\n(0,private_next_rsc_server_reference__WEBPACK_IMPORTED_MODULE_0__.registerServerReference)(testEmailConnection, \"4010844c55b83dfb1f105bebefe0eefe1e6b431900\", null);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFtWEFrRSwwRkFBQUEsQ0FBQUE7QUEwQ0FDLDBGQUFBQSxDQUFBQTtBQWlHQVMsMEZBQUFBLENBQUFBO0FBc01Bd0QsMEZBQUFBLENBQUFBO0FBMkxBb0MsMEZBQUFBLENBQUFBO0FBbURBSSwwRkFBQUEsQ0FBQUE7QUE0REFDLDBGQUFBQSxDQUFBQTtBQWtGQXZGLDBGQUFBQSxDQUFBQTtBQXFCQWtHLDBGQUFBQSxDQUFBQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvc2VydmljZXMvZW1haWwtc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHNlcnZlcic7XG5cbmltcG9ydCAnc2VydmVyLW9ubHknO1xuaW1wb3J0IHsgSW1hcEZsb3cgfSBmcm9tICdpbWFwZmxvdyc7XG5pbXBvcnQgbm9kZW1haWxlciBmcm9tICdub2RlbWFpbGVyJztcbmltcG9ydCB7IHByaXNtYSB9IGZyb20gJ0AvbGliL3ByaXNtYSc7XG5pbXBvcnQgeyBzaW1wbGVQYXJzZXIgfSBmcm9tICdtYWlscGFyc2VyJztcbmltcG9ydCB7IFxuICBjYWNoZUVtYWlsQ3JlZGVudGlhbHMsIFxuICBnZXRDYWNoZWRFbWFpbENyZWRlbnRpYWxzLFxuICBjYWNoZUVtYWlsTGlzdCxcbiAgZ2V0Q2FjaGVkRW1haWxMaXN0LFxuICBjYWNoZUVtYWlsQ29udGVudCxcbiAgZ2V0Q2FjaGVkRW1haWxDb250ZW50LFxuICBjYWNoZUltYXBTZXNzaW9uLFxuICBnZXRDYWNoZWRJbWFwU2Vzc2lvbixcbiAgaW52YWxpZGF0ZUZvbGRlckNhY2hlLFxuICBpbnZhbGlkYXRlRW1haWxDb250ZW50Q2FjaGVcbn0gZnJvbSAnQC9saWIvcmVkaXMnO1xuaW1wb3J0IHsgRW1haWxDcmVkZW50aWFscywgRW1haWxNZXNzYWdlLCBFbWFpbEFkZHJlc3MsIEVtYWlsQXR0YWNobWVudCB9IGZyb20gJ0AvbGliL3R5cGVzJztcbmltcG9ydCB7IGVuc3VyZUZyZXNoVG9rZW4gfSBmcm9tICcuL3Rva2VuLXJlZnJlc2gnO1xuaW1wb3J0IHsgY3JlYXRlWE9BdXRoMlRva2VuLCByZWZyZXNoQWNjZXNzVG9rZW4gYXMgcmVmcmVzaE1pY3Jvc29mdEFjY2Vzc1Rva2VuIH0gZnJvbSAnLi9taWNyb3NvZnQtb2F1dGgnO1xuaW1wb3J0IHsgTWFpbENyZWRlbnRpYWxzIH0gZnJvbSAnQHByaXNtYS9jbGllbnQnO1xuaW1wb3J0IFJlZGlzIGZyb20gJ2lvcmVkaXMnO1xuaW1wb3J0IHsgZ2V0UmVkaXNDbGllbnQgfSBmcm9tICcuLi9yZWRpcyc7XG5cbi8vIERlZmluZSBFbWFpbENyZWRlbnRpYWxzIGludGVyZmFjZSB3aXRoIE9BdXRoIHByb3BlcnRpZXNcbmludGVyZmFjZSBFbWFpbENyZWRlbnRpYWxzRXh0ZW5kZWQgZXh0ZW5kcyBFbWFpbENyZWRlbnRpYWxzIHtcbiAgdXNlT0F1dGg/OiBib29sZWFuO1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nO1xuICB0b2tlbkV4cGlyeT86IG51bWJlcjtcbn1cblxuLy8gRGVmaW5lIHRoZSBleHRlbmRlZCBNYWlsQ3JlZGVudGlhbHMgdHlwZSB0aGF0IGluY2x1ZGVzIE9BdXRoIGZpZWxkc1xuaW50ZXJmYWNlIE1haWxDcmVkZW50aWFsc1dpdGhPQXV0aCBleHRlbmRzIE1haWxDcmVkZW50aWFscyB7XG4gIHVzZU9BdXRoPzogYm9vbGVhbjtcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICB0b2tlbkV4cGlyeT86IERhdGUgfCBudWxsO1xufVxuXG4vLyBUeXBlcyBzcGVjaWZpYyB0byB0aGlzIHNlcnZpY2VcbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxMaXN0UmVzdWx0IHtcbiAgZW1haWxzOiBFbWFpbE1lc3NhZ2VbXTtcbiAgdG90YWxFbWFpbHM6IG51bWJlcjtcbiAgcGFnZTogbnVtYmVyO1xuICBwZXJQYWdlOiBudW1iZXI7XG4gIHRvdGFsUGFnZXM6IG51bWJlcjtcbiAgZm9sZGVyOiBzdHJpbmc7XG4gIG1haWxib3hlczogc3RyaW5nW107XG4gIG5ld2VzdEVtYWlsSWQ6IG51bWJlcjtcbn1cblxuLy8gQ29ubmVjdGlvbiBwb29sIHRvIHJldXNlIElNQVAgY2xpZW50c1xuY29uc3QgY29ubmVjdGlvblBvb2w6IFJlY29yZDxzdHJpbmcsIHsgXG4gIGNsaWVudDogSW1hcEZsb3c7IFxuICBsYXN0VXNlZDogbnVtYmVyO1xuICBpc0Nvbm5lY3Rpbmc6IGJvb2xlYW47XG4gIGNvbm5lY3Rpb25Qcm9taXNlPzogUHJvbWlzZTxJbWFwRmxvdz47XG4gIGNvbm5lY3Rpb25BdHRlbXB0cz86IG51bWJlcjtcbn0+ID0ge307XG5cbi8vIFRyYWNrIG92ZXJhbGwgY29ubmVjdGlvbiBtZXRyaWNzXG5sZXQgdG90YWxDb25uZWN0aW9uUmVxdWVzdHMgPSAwO1xubGV0IHRvdGFsTmV3Q29ubmVjdGlvbnMgPSAwO1xubGV0IHRvdGFsUmV1c2VDb25uZWN0aW9ucyA9IDA7XG5sZXQgdG90YWxDb25uZWN0aW9uRXJyb3JzID0gMDtcbmxldCBsYXN0TWV0cmljc1Jlc2V0ID0gRGF0ZS5ub3coKTtcblxuLy8gQ1JJVElDQUwgUEVSRk9STUFOQ0UgRklYOiBJbmNyZWFzZSBpZGxlIHRpbWVvdXQgZnJvbSAxNSBtaW51dGVzIHRvIDMwIG1pbnV0ZXNcbi8vIFRoaXMgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGxvbmdlciBhbmQgcmVkdWNlIHJlY29ubmVjdGlvbiBkZWxheXNcbmNvbnN0IENPTk5FQ1RJT05fVElNRU9VVCA9IDMwICogNjAgKiAxMDAwOyAgLy8gSW5jcmVhc2VkIHRvIDMwIG1pbnV0ZXMgKHdhcyAxNSBtaW51dGVzKVxuY29uc3QgTUFYX1BPT0xfU0laRSA9IDIwOyAgLy8gTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdG8ga2VlcCBpbiB0aGUgcG9vbFxuY29uc3QgQ09OTkVDVElPTl9DSEVDS19JTlRFUlZBTCA9IDYwICogMTAwMDsgIC8vIENoZWNrIGV2ZXJ5IG1pbnV0ZVxuY29uc3QgTUlOX1BPT0xfU0laRSA9IDI7ICAgLy8gS2VlcCBhdCBsZWFzdCB0aGlzIG1hbnkgYWN0aXZlIGNvbm5lY3Rpb25zIHBlciB1c2VyXG5cbi8vIENsZWFuIHVwIGlkbGUgY29ubmVjdGlvbnMgcGVyaW9kaWNhbGx5XG5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25LZXlzID0gT2JqZWN0LmtleXMoY29ubmVjdGlvblBvb2wpO1xuICBcbiAgLy8gSWYgd2UndmUgYmVlbiBjb2xsZWN0aW5nIG1ldHJpY3MgZm9yIG1vcmUgdGhhbiBhbiBob3VyLCBsb2cgYW5kIHJlc2V0XG4gIGlmIChub3cgLSBsYXN0TWV0cmljc1Jlc2V0ID4gNjAgKiA2MCAqIDEwMDApIHtcbiAgICBjb25zb2xlLmxvZyhgW0lNQVAgTUVUUklDU10gVG90YWwgcmVxdWVzdHM6ICR7dG90YWxDb25uZWN0aW9uUmVxdWVzdHN9LCBOZXcgY29ubmVjdGlvbnM6ICR7dG90YWxOZXdDb25uZWN0aW9uc30sIFJldXNlZDogJHt0b3RhbFJldXNlQ29ubmVjdGlvbnN9LCBFcnJvcnM6ICR7dG90YWxDb25uZWN0aW9uRXJyb3JzfSwgU3VjY2VzcyByYXRlOiAkeygodG90YWxSZXVzZUNvbm5lY3Rpb25zICsgdG90YWxOZXdDb25uZWN0aW9ucykgLyB0b3RhbENvbm5lY3Rpb25SZXF1ZXN0cyAqIDEwMCkudG9GaXhlZCgyKX0lYCk7XG4gICAgdG90YWxDb25uZWN0aW9uUmVxdWVzdHMgPSAwO1xuICAgIHRvdGFsTmV3Q29ubmVjdGlvbnMgPSAwO1xuICAgIHRvdGFsUmV1c2VDb25uZWN0aW9ucyA9IDA7XG4gICAgdG90YWxDb25uZWN0aW9uRXJyb3JzID0gMDtcbiAgICBsYXN0TWV0cmljc1Jlc2V0ID0gbm93O1xuICB9XG4gIFxuICAvLyBQRVJGT1JNQU5DRSBGSVg6IEdyb3VwIGNvbm5lY3Rpb25zIGJ5IHVzZXIgZm9yIGJldHRlciBtYW5hZ2VtZW50XG4gIGNvbnN0IGNvbm5lY3Rpb25zQnlVc2VyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgXG4gIGNvbm5lY3Rpb25LZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCB1c2VySWQgPSBrZXkuc3BsaXQoJzonKVswXTtcbiAgICBpZiAoIWNvbm5lY3Rpb25zQnlVc2VyW3VzZXJJZF0pIHtcbiAgICAgIGNvbm5lY3Rpb25zQnlVc2VyW3VzZXJJZF0gPSBbXTtcbiAgICB9XG4gICAgY29ubmVjdGlvbnNCeVVzZXJbdXNlcklkXS5wdXNoKGtleSk7XG4gIH0pO1xuICBcbiAgLy8gUEVSRk9STUFOQ0UgRklYOiBNYW5hZ2UgcG9vbCBzaXplIHBlciB1c2VyXG4gIE9iamVjdC5lbnRyaWVzKGNvbm5lY3Rpb25zQnlVc2VyKS5mb3JFYWNoKChbdXNlcklkLCB1c2VyQ29ubmVjdGlvbnNdKSA9PiB7XG4gICAgLy8gU29ydCBjb25uZWN0aW9ucyBieSBsYXN0IHVzZWQgKG9sZGVzdCBmaXJzdClcbiAgICBjb25zdCBzb3J0ZWRDb25uZWN0aW9ucyA9IHVzZXJDb25uZWN0aW9uc1xuICAgICAgLm1hcChrZXkgPT4gKHsga2V5LCBsYXN0VXNlZDogY29ubmVjdGlvblBvb2xba2V5XS5sYXN0VXNlZCB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxhc3RVc2VkIC0gYi5sYXN0VXNlZCk7XG4gICAgXG4gICAgLy8gS2VlcCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIGNvbm5lY3Rpb25zIHVwIHRvIHRoZSBtaW4gcG9vbCBzaXplXG4gICAgY29uc3QgY29ubmVjdGlvbnNUb0tlZXAgPSBzb3J0ZWRDb25uZWN0aW9ucy5zbGljZSgtTUlOX1BPT0xfU0laRSk7XG4gICAgY29uc3Qga2VlcEtleXMgPSBuZXcgU2V0KGNvbm5lY3Rpb25zVG9LZWVwLm1hcChjb25uID0+IGNvbm4ua2V5KSk7XG4gICAgXG4gICAgLy8gQ2hlY2sgdGhlIHJlc3QgZm9yIGlkbGUgdGltZW91dFxuICAgIHNvcnRlZENvbm5lY3Rpb25zLmZvckVhY2goKHsga2V5LCBsYXN0VXNlZCB9KSA9PiB7XG4gICAgICAvLyBTa2lwIGNvbm5lY3Rpb25zIHRvIGtlZXAgYW5kIHRob3NlIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmdcbiAgICAgIGlmIChrZWVwS2V5cy5oYXMoa2V5KSB8fCBjb25uZWN0aW9uUG9vbFtrZXldLmlzQ29ubmVjdGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIE9ubHkgY2xvc2UgY29ubmVjdGlvbnMgaWRsZSBmb3IgdG9vIGxvbmdcbiAgICAgIGlmIChub3cgLSBsYXN0VXNlZCA+IENPTk5FQ1RJT05fVElNRU9VVCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xvc2luZyBpZGxlIElNQVAgY29ubmVjdGlvbiBmb3IgJHtrZXl9IChpZGxlIGZvciAke01hdGgucm91bmQoKG5vdyAtIGxhc3RVc2VkKS8xMDAwKX1zKWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChjb25uZWN0aW9uUG9vbFtrZXldLmNsaWVudC51c2FibGUpIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb25Qb29sW2tleV0uY2xpZW50LmxvZ291dCgpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGNsb3NpbmcgaWRsZSBjb25uZWN0aW9uIGZvciAke2tleX06YCwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBjaGVja2luZyBjb25uZWN0aW9uIHN0YXR1cyBmb3IgJHtrZXl9OmAsIGVycm9yKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBkZWxldGUgY29ubmVjdGlvblBvb2xba2V5XTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZlZCBpZGxlIGNvbm5lY3Rpb24gZm9yICR7a2V5fSBmcm9tIHBvb2wgKHBvb2wgc2l6ZTogJHtPYmplY3Qua2V5cyhjb25uZWN0aW9uUG9vbCkubGVuZ3RofSlgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgXG4gIC8vIExvZyBjb25uZWN0aW9uIHBvb2wgc3RhdHVzIHdpdGggbW9yZSBkZXRhaWxzXG4gIGNvbnN0IGFjdGl2ZUNvdW50ID0gY29ubmVjdGlvbktleXMuZmlsdGVyKGtleSA9PiB7XG4gICAgY29uc3QgY29ubiA9IGNvbm5lY3Rpb25Qb29sW2tleV07XG4gICAgcmV0dXJuICFjb25uLmlzQ29ubmVjdGluZyAmJiAoY29ubi5jbGllbnQ/LnVzYWJsZSB8fCBmYWxzZSk7XG4gIH0pLmxlbmd0aDtcbiAgXG4gIGNvbnN0IGNvbm5lY3RpbmdDb3VudCA9IGNvbm5lY3Rpb25LZXlzLmZpbHRlcihrZXkgPT4gY29ubmVjdGlvblBvb2xba2V5XS5pc0Nvbm5lY3RpbmcpLmxlbmd0aDtcbiAgXG4gIGNvbnNvbGUubG9nKGBbSU1BUCBQT09MXSBTaXplOiAke2Nvbm5lY3Rpb25LZXlzLmxlbmd0aH0sIEFjdGl2ZTogJHthY3RpdmVDb3VudH0sIENvbm5lY3Rpbmc6ICR7Y29ubmVjdGluZ0NvdW50fSwgTWF4OiAke01BWF9QT09MX1NJWkV9YCk7XG59LCBDT05ORUNUSU9OX0NIRUNLX0lOVEVSVkFMKTtcblxuLyoqXG4gKiBHZXQgSU1BUCBjb25uZWN0aW9uIGZvciBhIHVzZXIsIHJldXNpbmcgZXhpc3RpbmcgY29ubmVjdGlvbnMgd2hlbiBwb3NzaWJsZVxuICogd2l0aCBpbXByb3ZlZCBjb25uZWN0aW9uIGhhbmRsaW5nIGFuZCBlcnJvciByZWNvdmVyeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SW1hcENvbm5lY3Rpb24oXG4gIHVzZXJJZDogc3RyaW5nLFxuICBhY2NvdW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8SW1hcEZsb3c+IHtcbiAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgdG90YWxDb25uZWN0aW9uUmVxdWVzdHMrKztcbiAgXG4gIGNvbnNvbGUubG9nKGBHZXR0aW5nIElNQVAgY29ubmVjdGlvbiBmb3IgdXNlciAke3VzZXJJZH0ke2FjY291bnRJZCA/IGAgYWNjb3VudCAke2FjY291bnRJZH1gIDogJyd9YCk7XG4gIFxuICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciAnZGVmYXVsdCcgYWNjb3VudElkIC0gZmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIGFjY291bnRcbiAgaWYgKCFhY2NvdW50SWQgfHwgYWNjb3VudElkID09PSAnZGVmYXVsdCcpIHtcbiAgICBjb25zb2xlLmxvZyhgTm8gc3BlY2lmaWMgYWNjb3VudCBwcm92aWRlZCBvciAnZGVmYXVsdCcgcmVxdWVzdGVkLCB0cnlpbmcgdG8gZmluZCBmaXJzdCBhY2NvdW50IGZvciB1c2VyICR7dXNlcklkfWApO1xuICAgIFxuICAgIC8vIFRyeSBnZXR0aW5nIHRoZSBhY2NvdW50IElEIGZyb20gY2FjaGUgdG8gYXZvaWQgZGF0YWJhc2UgcXVlcnlcbiAgICBjb25zdCBzZXNzaW9uRGF0YSA9IGF3YWl0IGdldENhY2hlZEltYXBTZXNzaW9uKHVzZXJJZCk7XG4gICAgaWYgKHNlc3Npb25EYXRhICYmIHNlc3Npb25EYXRhLmRlZmF1bHRBY2NvdW50SWQpIHtcbiAgICAgIGFjY291bnRJZCA9IHNlc3Npb25EYXRhLmRlZmF1bHRBY2NvdW50SWQ7XG4gICAgICBjb25zb2xlLmxvZyhgVXNpbmcgY2FjaGVkIGRlZmF1bHQgYWNjb3VudCBJRDogJHthY2NvdW50SWR9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFF1ZXJ5IHRvIGZpbmQgYWxsIGFjY291bnRzIGZvciB0aGlzIHVzZXJcbiAgICAgIGNvbnN0IGFjY291bnRzID0gYXdhaXQgcHJpc21hLm1haWxDcmVkZW50aWFscy5maW5kTWFueSh7XG4gICAgICAgIHdoZXJlOiB7IHVzZXJJZCB9LFxuICAgICAgICBvcmRlckJ5OiB7IGNyZWF0ZWRBdDogJ2FzYycgfSxcbiAgICAgICAgdGFrZTogMVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChhY2NvdW50cyAmJiBhY2NvdW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWNjb3VudCA9IGFjY291bnRzWzBdO1xuICAgICAgICBjb25zb2xlLmxvZyhgVXNpbmcgZmlyc3QgYXZhaWxhYmxlIGFjY291bnQ6ICR7Zmlyc3RBY2NvdW50LmlkfSAoJHtmaXJzdEFjY291bnQuZW1haWx9KWApO1xuICAgICAgICBhY2NvdW50SWQgPSBmaXJzdEFjY291bnQuaWQ7XG4gICAgICAgIFxuICAgICAgICAvLyBDYWNoZSBkZWZhdWx0IGFjY291bnQgSUQgZm9yIGZ1dHVyZSB1c2VcbiAgICAgICAgaWYgKHNlc3Npb25EYXRhKSB7XG4gICAgICAgICAgYXdhaXQgY2FjaGVJbWFwU2Vzc2lvbih1c2VySWQsIHtcbiAgICAgICAgICAgIC4uLnNlc3Npb25EYXRhLFxuICAgICAgICAgICAgZGVmYXVsdEFjY291bnRJZDogYWNjb3VudElkLFxuICAgICAgICAgICAgbGFzdEFjdGl2ZTogRGF0ZS5ub3coKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGNhY2hlSW1hcFNlc3Npb24odXNlcklkLCB7XG4gICAgICAgICAgICBsYXN0QWN0aXZlOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgZGVmYXVsdEFjY291bnRJZDogYWNjb3VudElkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdGFsQ29ubmVjdGlvbkVycm9ycysrO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVtYWlsIGFjY291bnRzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgdXNlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgLy8gVXNlIGFjY291bnRJZCBpbiBjb25uZWN0aW9uIGtleSB0byBlbnN1cmUgZGlmZmVyZW50IGFjY291bnRzIGdldCBkaWZmZXJlbnQgY29ubmVjdGlvbnNcbiAgY29uc3QgY29ubmVjdGlvbktleSA9IGAke3VzZXJJZH06JHthY2NvdW50SWR9YDtcbiAgXG4gIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBhIGNvbm5lY3Rpb24gZm9yIHRoaXMga2V5XG4gIGlmIChjb25uZWN0aW9uUG9vbFtjb25uZWN0aW9uS2V5XSkge1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0aW9uUG9vbFtjb25uZWN0aW9uS2V5XTtcbiAgICBcbiAgICAvLyBJZiBhIGNvbm5lY3Rpb24gaXMgYmVpbmcgZXN0YWJsaXNoZWQsIHdhaXQgZm9yIGl0XG4gICAgaWYgKGNvbm5lY3Rpb24uaXNDb25uZWN0aW5nICYmIGNvbm5lY3Rpb24uY29ubmVjdGlvblByb21pc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBDb25uZWN0aW9uIGluIHByb2dyZXNzIGZvciAke2Nvbm5lY3Rpb25LZXl9LCB3YWl0aW5nIGZvciBleGlzdGluZyBjb25uZWN0aW9uYCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjb25uZWN0aW9uLmNvbm5lY3Rpb25Qcm9taXNlO1xuICAgICAgICBjb25uZWN0aW9uLmxhc3RVc2VkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdG90YWxSZXVzZUNvbm5lY3Rpb25zKys7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbSU1BUF0gUmV1c2VkIHBlbmRpbmcgY29ubmVjdGlvbiBmb3IgJHtjb25uZWN0aW9uS2V5fSBpbiAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXNgKTtcbiAgICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gZm9yICR7Y29ubmVjdGlvbktleX06YCwgZXJyb3IpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gY3JlYXRlIG5ldyBjb25uZWN0aW9uXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFRyeSB0byB1c2UgZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBpdCdzIHVzYWJsZVxuICAgIHRyeSB7XG4gICAgICAvLyBQRVJGT1JNQU5DRSBGSVg6IE1vcmUgcm9idXN0IGNvbm5lY3Rpb24gc3RhdHVzIGNoZWNraW5nXG4gICAgICBpZiAoY29ubmVjdGlvbi5jbGllbnQgJiYgY29ubmVjdGlvbi5jbGllbnQudXNhYmxlKSB7XG4gICAgICAgIC8vIFRvdWNoIHRoZSBjb25uZWN0aW9uIHRvIG1hcmsgaXQgYXMgcmVjZW50bHkgdXNlZFxuICAgICAgICBjb25uZWN0aW9uLmxhc3RVc2VkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc29sZS5sb2coYFJldXNpbmcgZXhpc3RpbmcgSU1BUCBjb25uZWN0aW9uIGZvciAke2Nvbm5lY3Rpb25LZXl9YCk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgc2Vzc2lvbiBkYXRhIGluIFJlZGlzXG4gICAgICAgIGF3YWl0IHVwZGF0ZVNlc3Npb25EYXRhKHVzZXJJZCwgYWNjb3VudElkKTtcbiAgICAgICAgXG4gICAgICAgIHRvdGFsUmV1c2VDb25uZWN0aW9ucysrO1xuICAgICAgICBjb25zb2xlLmxvZyhgW0lNQVBdIFN1Y2Nlc3NmdWxseSByZXVzZWQgY29ubmVjdGlvbiBmb3IgJHtjb25uZWN0aW9uS2V5fSBpbiAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXNgKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uY2xpZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYEV4aXN0aW5nIGNvbm5lY3Rpb24gZm9yICR7Y29ubmVjdGlvbktleX0gbm90IHVzYWJsZSwgcmVjcmVhdGluZ2ApO1xuICAgICAgICAvLyBXaWxsIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGJlbG93XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRXJyb3IgY2hlY2tpbmcgZXhpc3RpbmcgY29ubmVjdGlvbiBmb3IgJHtjb25uZWN0aW9uS2V5fTpgLCBlcnJvcik7XG4gICAgICAvLyBXaWxsIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGJlbG93XG4gICAgfVxuICB9XG4gIFxuICAvLyBJZiB3ZSBnZXQgaGVyZSwgd2UgbmVlZCBhIG5ldyBjb25uZWN0aW9uXG4gIGNvbnNvbGUubG9nKGBDcmVhdGluZyBuZXcgSU1BUCBjb25uZWN0aW9uIGZvciAke2Nvbm5lY3Rpb25LZXl9YCk7XG4gIFxuICAvLyBGaXJzdCB0cnkgdG8gZ2V0IGNyZWRlbnRpYWxzIGZyb20gUmVkaXMgY2FjaGVcbiAgbGV0IGNyZWRlbnRpYWxzID0gYXdhaXQgZ2V0Q2FjaGVkRW1haWxDcmVkZW50aWFscyh1c2VySWQsIGFjY291bnRJZCk7XG4gIGNvbnNvbGUubG9nKGBSZXRyaWV2ZWQgY3JlZGVudGlhbHMgZnJvbSBSZWRpcyBjYWNoZSBmb3IgJHt1c2VySWR9OiR7YWNjb3VudElkfTpgLCBjcmVkZW50aWFscyA/IHtcbiAgICBlbWFpbDogY3JlZGVudGlhbHMuZW1haWwsXG4gICAgaGFzUGFzc3dvcmQ6ICEhY3JlZGVudGlhbHMucGFzc3dvcmQsXG4gICAgdXNlT0F1dGg6ICEhY3JlZGVudGlhbHMudXNlT0F1dGgsXG4gICAgaGFzQWNjZXNzVG9rZW46ICEhY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sXG4gICAgaGFzUmVmcmVzaFRva2VuOiAhIWNyZWRlbnRpYWxzLnJlZnJlc2hUb2tlblxuICB9IDogJ05vIGNyZWRlbnRpYWxzIGZvdW5kIGluIGNhY2hlJyk7XG4gIFxuICAvLyBJZiBub3QgaW4gY2FjaGUsIGdldCBmcm9tIGRhdGFiYXNlIGFuZCBjYWNoZSB0aGVtXG4gIGlmICghY3JlZGVudGlhbHMpIHtcbiAgICBjb25zb2xlLmxvZyhgQ3JlZGVudGlhbHMgbm90IGZvdW5kIGluIGNhY2hlIGZvciAke3VzZXJJZH0ke2FjY291bnRJZCA/IGAgYWNjb3VudCAke2FjY291bnRJZH1gIDogJyd9LCBhdHRlbXB0aW5nIGRhdGFiYXNlIGxvb2t1cGApO1xuICAgIFxuICAgIC8vIEZldGNoIGRpcmVjdGx5IGZyb20gZGF0YWJhc2VcbiAgICBjb25zdCBkYkNyZWRlbnRpYWxzID0gYXdhaXQgcHJpc21hLm1haWxDcmVkZW50aWFscy5maW5kRmlyc3Qoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgQU5EOiBbXG4gICAgICAgICAgeyB1c2VySWQgfSxcbiAgICAgICAgICBhY2NvdW50SWQgPyB7IGlkOiBhY2NvdW50SWQgfSA6IHt9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICBpZiAoIWRiQ3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE5vIGNyZWRlbnRpYWxzIGZvdW5kIGZvciB1c2VyICR7dXNlcklkfSR7YWNjb3VudElkID8gYCBhY2NvdW50ICR7YWNjb3VudElkfWAgOiAnJ31gKTtcbiAgICAgIHRvdGFsQ29ubmVjdGlvbkVycm9ycysrO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbCBhY2NvdW50IGNyZWRlbnRpYWxzIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICBcbiAgICBjb25zb2xlLmxvZyhgRGF0YWJhc2UgbG9va3VwIHJldHVybmVkIGNyZWRlbnRpYWxzIGZvciAke2RiQ3JlZGVudGlhbHMuZW1haWx9OmAsIHtcbiAgICAgIGVtYWlsOiBkYkNyZWRlbnRpYWxzLmVtYWlsLFxuICAgICAgaGFzUGFzc3dvcmQ6ICEhZGJDcmVkZW50aWFscy5wYXNzd29yZCxcbiAgICAgIGZpZWxkczogT2JqZWN0LmtleXMoZGJDcmVkZW50aWFscylcbiAgICB9KTtcbiAgICBcbiAgICAvLyBDcmVhdGUgb3VyIGNyZWRlbnRpYWxzIG9iamVjdCBmcm9tIGRhdGFiYXNlIGRhdGFcbiAgICBjcmVkZW50aWFscyA9IHtcbiAgICAgIGVtYWlsOiBkYkNyZWRlbnRpYWxzLmVtYWlsLFxuICAgICAgcGFzc3dvcmQ6IGRiQ3JlZGVudGlhbHMucGFzc3dvcmQgfHwgJycsXG4gICAgICBob3N0OiBkYkNyZWRlbnRpYWxzLmhvc3QsXG4gICAgICBwb3J0OiBkYkNyZWRlbnRpYWxzLnBvcnQsXG4gICAgICBzZWN1cmU6IGRiQ3JlZGVudGlhbHMuc2VjdXJlLFxuICAgICAgc210cF9ob3N0OiBkYkNyZWRlbnRpYWxzLnNtdHBfaG9zdCB8fCB1bmRlZmluZWQsXG4gICAgICBzbXRwX3BvcnQ6IGRiQ3JlZGVudGlhbHMuc210cF9wb3J0IHx8IHVuZGVmaW5lZCxcbiAgICAgIHNtdHBfc2VjdXJlOiBkYkNyZWRlbnRpYWxzLnNtdHBfc2VjdXJlID8/IGZhbHNlLFxuICAgICAgZGlzcGxheV9uYW1lOiBkYkNyZWRlbnRpYWxzLmRpc3BsYXlfbmFtZSB8fCB1bmRlZmluZWQsXG4gICAgICBjb2xvcjogZGJDcmVkZW50aWFscy5jb2xvciB8fCB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIFxuICAvLyBDYXN0IHRvIGV4dGVuZGVkIHR5cGVcbiAgY29uc3QgZXh0ZW5kZWRDcmVkcyA9IGNyZWRlbnRpYWxzIGFzIEVtYWlsQ3JlZGVudGlhbHNFeHRlbmRlZDtcbiAgXG4gIC8vIE1JQ1JPU09GVCBGSVg6IERldGVjdCBNaWNyb3NvZnQgYWNjb3VudHMgYnkgaG9zdG5hbWUgYW5kIHNldCBPQXV0aCBmbGFnXG4gIGlmIChleHRlbmRlZENyZWRzLmhvc3QgPT09ICdvdXRsb29rLm9mZmljZTM2NS5jb20nKSB7XG4gICAgY29uc29sZS5sb2coYE1pY3Jvc29mdCBhY2NvdW50IGRldGVjdGVkICgke2V4dGVuZGVkQ3JlZHMuZW1haWx9KSwgc2V0dGluZyB1c2VPQXV0aD10cnVlYCk7XG4gICAgZXh0ZW5kZWRDcmVkcy51c2VPQXV0aCA9IHRydWU7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG5vIHBhc3N3b3JkIGJ1dCB1c2VPQXV0aCBpcyB0cnVlLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSByZWZyZXNoIHRva2VuIGV4aXN0cyBpbiBSZWRpc1xuICAgIGlmICghZXh0ZW5kZWRDcmVkcy5wYXNzd29yZCAmJiAhZXh0ZW5kZWRDcmVkcy5hY2Nlc3NUb2tlbikge1xuICAgICAgLy8gSWYgcnVubmluZyBpbiBicm93c2VyIGVkZ2UgZW52aXJvbm1lbnQgKHNlcnZlcmxlc3MpLCB0cnkgdG8gcmVmcmVzaCBvdXIgdG9rZW5zIGZyb20gUmVkaXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhY2hlZENyZWRzID0gYXdhaXQgZ2V0Q2FjaGVkRW1haWxDcmVkZW50aWFscyh1c2VySWQsIGFjY291bnRJZCk7XG4gICAgICAgIGlmIChjYWNoZWRDcmVkcyAmJiBjYWNoZWRDcmVkcy5yZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgcmVmcmVzaCB0b2tlbiBpbiBSZWRpcyBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfSwgd2lsbCB1c2UgaXRgKTtcbiAgICAgICAgICBleHRlbmRlZENyZWRzLnJlZnJlc2hUb2tlbiA9IGNhY2hlZENyZWRzLnJlZnJlc2hUb2tlbjtcbiAgICAgICAgICBleHRlbmRlZENyZWRzLmFjY2Vzc1Rva2VuID0gY2FjaGVkQ3JlZHMuYWNjZXNzVG9rZW47XG4gICAgICAgICAgZXh0ZW5kZWRDcmVkcy50b2tlbkV4cGlyeSA9IGNhY2hlZENyZWRzLnRva2VuRXhwaXJ5O1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYWNoZSB0aGVzZSBjcmVkZW50aWFscyBhZ2FpbiB3aXRoIHRoZSB0b2tlbnNcbiAgICAgICAgICBhd2FpdCBjYWNoZUVtYWlsQ3JlZGVudGlhbHModXNlcklkLCBhY2NvdW50SWQsIGV4dGVuZGVkQ3JlZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfSBpbiBSZWRpcyBjYWNoZWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmV0cmlldmluZyBjYWNoZWQgY3JlZGVudGlhbHMgZm9yICR7ZXh0ZW5kZWRDcmVkcy5lbWFpbH06YCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8vIElmIHVzaW5nIE9BdXRoLCBlbnN1cmUgd2UgaGF2ZSBhIGZyZXNoIHRva2VuXG4gIGlmIChleHRlbmRlZENyZWRzLnVzZU9BdXRoKSB7XG4gICAgY29uc29sZS5sb2coYEFjY291bnQgaXMgY29uZmlndXJlZCB0byB1c2UgT0F1dGhgKTtcbiAgICBcbiAgICBpZiAoIWV4dGVuZGVkQ3JlZHMuYWNjZXNzVG9rZW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE9BdXRoIGlzIGVuYWJsZWQgYnV0IG5vIGFjY2VzcyB0b2tlbiBmb3IgYWNjb3VudCAke2V4dGVuZGVkQ3JlZHMuZW1haWx9YCk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhgRW5zdXJpbmcgZnJlc2ggdG9rZW4gZm9yIE9BdXRoIGFjY291bnQgJHtleHRlbmRlZENyZWRzLmVtYWlsfWApO1xuICAgICAgY29uc3QgeyBhY2Nlc3NUb2tlbiwgc3VjY2VzcyB9ID0gYXdhaXQgZW5zdXJlRnJlc2hUb2tlbih1c2VySWQsIGV4dGVuZGVkQ3JlZHMuZW1haWwpO1xuICAgICAgXG4gICAgICBpZiAoc3VjY2VzcyAmJiBhY2Nlc3NUb2tlbikge1xuICAgICAgICBleHRlbmRlZENyZWRzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgcmVmcmVzaGVkIHRva2VuIGZvciAke2V4dGVuZGVkQ3JlZHMuZW1haWx9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbiBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmVmcmVzaGluZyB0b2tlbiBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfTpgLCBlcnIpO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gSW5pdGlhbGl6ZSBjb25uZWN0aW9uIHRyYWNraW5nXG4gIGNvbm5lY3Rpb25Qb29sW2Nvbm5lY3Rpb25LZXldID0ge1xuICAgIGNsaWVudDogbnVsbCBhcyBhbnksXG4gICAgbGFzdFVzZWQ6IERhdGUubm93KCksXG4gICAgaXNDb25uZWN0aW5nOiB0cnVlLFxuICAgIGNvbm5lY3Rpb25BdHRlbXB0czogKGNvbm5lY3Rpb25Qb29sW2Nvbm5lY3Rpb25LZXldPy5jb25uZWN0aW9uQXR0ZW1wdHMgfHwgMCkgKyAxXG4gIH07XG4gIFxuICAvLyBQRVJGT1JNQU5DRSBGSVg6IEFkZCBjb25uZWN0aW9uIHRpbWVvdXQgdG8gcHJldmVudCBoYW5naW5nIGNvbm5lY3Rpb25zXG4gIGxldCBjb25uZWN0aW9uVGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgW0lNQVBdIENvbm5lY3Rpb24gZm9yICR7Y29ubmVjdGlvbktleX0gdGltZWQgb3V0IGFmdGVyIDYwIHNlY29uZHNgKTtcbiAgICBpZiAoY29ubmVjdGlvblBvb2xbY29ubmVjdGlvbktleV0/LmlzQ29ubmVjdGluZykge1xuICAgICAgZGVsZXRlIGNvbm5lY3Rpb25Qb29sW2Nvbm5lY3Rpb25LZXldO1xuICAgICAgdG90YWxDb25uZWN0aW9uRXJyb3JzKys7XG4gICAgfVxuICB9LCA2MCAqIDEwMDApOyAvLyA2MCBzZWNvbmRzIHRpbWVvdXRcbiAgXG4gIC8vIENyZWF0ZSBjb25uZWN0aW9uIHByb21pc2UgdXNpbmcgdGhlIGV4dGVuZGVkIGNyZWRlbnRpYWxzXG4gIGNvbnN0IGNvbm5lY3Rpb25Qcm9taXNlID0gY3JlYXRlSW1hcENvbm5lY3Rpb24oZXh0ZW5kZWRDcmVkcywgY29ubmVjdGlvbktleSlcbiAgICAudGhlbihjbGllbnQgPT4ge1xuICAgICAgLy8gVXBkYXRlIGNvbm5lY3Rpb24gcG9vbCBlbnRyeVxuICAgICAgY29ubmVjdGlvblBvb2xbY29ubmVjdGlvbktleV0uY2xpZW50ID0gY2xpZW50O1xuICAgICAgY29ubmVjdGlvblBvb2xbY29ubmVjdGlvbktleV0uaXNDb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICBjb25uZWN0aW9uUG9vbFtjb25uZWN0aW9uS2V5XS5sYXN0VXNlZCA9IERhdGUubm93KCk7XG4gICAgICBcbiAgICAgIC8vIENsZWFyIHRpbWVvdXQgc2luY2UgY29ubmVjdGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgaWYgKGNvbm5lY3Rpb25UaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChjb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHNlc3Npb24gZGF0YVxuICAgICAgdXBkYXRlU2Vzc2lvbkRhdGEodXNlcklkLCBhY2NvdW50SWQpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byB1cGRhdGUgc2Vzc2lvbiBkYXRhOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRvdGFsTmV3Q29ubmVjdGlvbnMrKztcbiAgICAgIGNvbnNvbGUubG9nKGBbSU1BUF0gQ3JlYXRlZCBuZXcgY29ubmVjdGlvbiBmb3IgJHtjb25uZWN0aW9uS2V5fSBpbiAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXMgKGF0dGVtcHQgIyR7Y29ubmVjdGlvblBvb2xbY29ubmVjdGlvbktleV0uY29ubmVjdGlvbkF0dGVtcHRzfSlgKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSlcbiAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgLy8gQ2xlYXIgdGltZW91dCB0byBwcmV2ZW50IGRvdWJsZSBlcnJvcnNcbiAgICAgIGlmIChjb25uZWN0aW9uVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICBjb25uZWN0aW9uVGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBjb25uZWN0aW9uIGVycm9yXG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIElNQVAgY29ubmVjdGlvbiBmb3IgJHtjb25uZWN0aW9uS2V5fTpgLCBlcnJvcik7XG4gICAgICBkZWxldGUgY29ubmVjdGlvblBvb2xbY29ubmVjdGlvbktleV07XG4gICAgICB0b3RhbENvbm5lY3Rpb25FcnJvcnMrKztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICBcbiAgLy8gU2F2ZSB0aGUgcHJvbWlzZSB0byBhbGxvdyBvdGhlciByZXF1ZXN0cyB0byB3YWl0IGZvciB0aGlzIGNvbm5lY3Rpb25cbiAgY29ubmVjdGlvblBvb2xbY29ubmVjdGlvbktleV0uY29ubmVjdGlvblByb21pc2UgPSBjb25uZWN0aW9uUHJvbWlzZTtcbiAgXG4gIHJldHVybiBjb25uZWN0aW9uUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IElNQVAgY29ubmVjdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVJbWFwQ29ubmVjdGlvbihjcmVkZW50aWFsczogRW1haWxDcmVkZW50aWFscywgY29ubmVjdGlvbktleTogc3RyaW5nKTogUHJvbWlzZTxJbWFwRmxvdz4ge1xuICAvLyBDYXN0IHRvIGV4dGVuZGVkIHR5cGVcbiAgY29uc3QgZXh0ZW5kZWRDcmVkcyA9IGNyZWRlbnRpYWxzIGFzIEVtYWlsQ3JlZGVudGlhbHNFeHRlbmRlZDtcbiAgXG4gIGNvbnNvbGUubG9nKGBDcmVhdGluZyBJTUFQIGNvbm5lY3Rpb24gd2l0aCBjcmVkZW50aWFsczpgLCB7XG4gICAgZW1haWw6IGV4dGVuZGVkQ3JlZHMuZW1haWwsXG4gICAgaG9zdDogZXh0ZW5kZWRDcmVkcy5ob3N0LFxuICAgIHBvcnQ6IGV4dGVuZGVkQ3JlZHMucG9ydCxcbiAgICBoYXNQYXNzd29yZDogISFleHRlbmRlZENyZWRzLnBhc3N3b3JkLFxuICAgIHVzZU9BdXRoOiAhIWV4dGVuZGVkQ3JlZHMudXNlT0F1dGgsXG4gICAgaGFzQWNjZXNzVG9rZW46ICEhZXh0ZW5kZWRDcmVkcy5hY2Nlc3NUb2tlbixcbiAgICBoYXNSZWZyZXNoVG9rZW46ICEhZXh0ZW5kZWRDcmVkcy5yZWZyZXNoVG9rZW4sXG4gICAgaGFzVG9rZW5FeHBpcnk6ICEhZXh0ZW5kZWRDcmVkcy50b2tlbkV4cGlyeVxuICB9KTtcbiAgXG4gIGxldCBhdXRoUGFyYW1zOiBhbnk7XG4gIFxuICAvLyBDaGVjayBpZiB3ZSBoYXZlIHZhbGlkIE9BdXRoIHRva2Vuc1xuICBpZiAoZXh0ZW5kZWRDcmVkcy51c2VPQXV0aCAmJiBleHRlbmRlZENyZWRzLmFjY2Vzc1Rva2VuKSB7XG4gICAgY29uc29sZS5sb2coYFVzaW5nIFhPQVVUSDIgYXV0aGVudGljYXRpb24gZm9yICR7Y29ubmVjdGlvbktleX0gKE9BdXRoIGVuYWJsZWQpYCk7XG4gICAgXG4gICAgLy8gU2V0IGF1dGggcGFyYW1ldGVycyBmb3IgSW1hcEZsb3dcbiAgICBhdXRoUGFyYW1zID0ge1xuICAgICAgdXNlcjogZXh0ZW5kZWRDcmVkcy5lbWFpbCxcbiAgICAgIGFjY2Vzc1Rva2VuOiBleHRlbmRlZENyZWRzLmFjY2Vzc1Rva2VuXG4gICAgfTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgWE9BVVRIMiBhdXRoIGNvbmZpZ3VyZWQgZm9yICR7Y29ubmVjdGlvbktleX1gKTtcbiAgfSBlbHNlIGlmIChleHRlbmRlZENyZWRzLnBhc3N3b3JkKSB7XG4gICAgLy8gVXNlIHJlZ3VsYXIgcGFzc3dvcmQgYXV0aGVudGljYXRpb25cbiAgICBjb25zb2xlLmxvZyhgVXNpbmcgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZm9yICR7Y29ubmVjdGlvbktleX0gKE9BdXRoIG5vdCBlbmFibGVkIG9yIG5vIHRva2VuKWApO1xuICAgIGF1dGhQYXJhbXMgPSB7XG4gICAgICB1c2VyOiBleHRlbmRlZENyZWRzLmVtYWlsLFxuICAgICAgcGFzczogZXh0ZW5kZWRDcmVkcy5wYXNzd29yZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gYXV0aGVudGljYXRpb24gbWV0aG9kIGF2YWlsYWJsZVxuICAgIGNvbnNvbGUuZXJyb3IoYE5vIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBmb3VuZCBmb3IgJHtjb25uZWN0aW9uS2V5fTpgLCB7XG4gICAgICBoYXNQYXNzd29yZDogISFleHRlbmRlZENyZWRzLnBhc3N3b3JkLFxuICAgICAgdXNlT0F1dGg6ICEhZXh0ZW5kZWRDcmVkcy51c2VPQXV0aCxcbiAgICAgIGhhc0FjY2Vzc1Rva2VuOiAhIWV4dGVuZGVkQ3JlZHMuYWNjZXNzVG9rZW5cbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBhdmFpbGFibGUgZm9yICR7Y29ubmVjdGlvbktleX0gLSBuZWVkIGVpdGhlciBwYXNzd29yZCBvciBPQXV0aCB0b2tlbmApO1xuICB9XG4gIFxuICBjb25zb2xlLmxvZyhgQ3JlYXRpbmcgSW1hcEZsb3cgY2xpZW50IGZvciAke2Nvbm5lY3Rpb25LZXl9IHdpdGggYXV0aGVudGljYXRpb24gdHlwZTogJHtleHRlbmRlZENyZWRzLnVzZU9BdXRoID8gJ09BdXRoJyA6ICdQYXNzd29yZCd9YCk7XG4gIFxuICBjb25zdCBjbGllbnQgPSBuZXcgSW1hcEZsb3coe1xuICAgIGhvc3Q6IGV4dGVuZGVkQ3JlZHMuaG9zdCxcbiAgICBwb3J0OiBleHRlbmRlZENyZWRzLnBvcnQsXG4gICAgc2VjdXJlOiBleHRlbmRlZENyZWRzLnNlY3VyZSA/PyB0cnVlLFxuICAgIGF1dGg6IGF1dGhQYXJhbXMsXG4gICAgbG9nZ2VyOiBmYWxzZSxcbiAgICBlbWl0TG9nczogZmFsc2UsXG4gICAgdGxzOiB7XG4gICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXG4gICAgfSxcbiAgICBkaXNhYmxlQXV0b0lkbGU6IGZhbHNlXG4gIH0pO1xuICBcbiAgdHJ5IHtcbiAgICBjb25zb2xlLmxvZyhgQ29ubmVjdGluZyB0byBJTUFQIHNlcnZlcjogJHtleHRlbmRlZENyZWRzLmhvc3R9OiR7ZXh0ZW5kZWRDcmVkcy5wb3J0fWApO1xuICAgIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gSU1BUCBzZXJ2ZXIgZm9yICR7Y29ubmVjdGlvbktleX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCB0byBJTUFQIHNlcnZlciBmb3IgJHtjb25uZWN0aW9uS2V5fTpgLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgXG4gIC8vIEFkZCBlcnJvciBoYW5kbGVyXG4gIGNsaWVudC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgSU1BUCBjb25uZWN0aW9uIGVycm9yIGZvciAke2Nvbm5lY3Rpb25LZXl9OmAsIGVycik7XG4gICAgLy8gUmVtb3ZlIGZyb20gcG9vbCBvbiBlcnJvclxuICAgIGlmIChjb25uZWN0aW9uUG9vbFtjb25uZWN0aW9uS2V5XSkge1xuICAgICAgZGVsZXRlIGNvbm5lY3Rpb25Qb29sW2Nvbm5lY3Rpb25LZXldO1xuICAgIH1cbiAgfSk7XG4gIFxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBzZXNzaW9uIGRhdGEgaW4gUmVkaXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2Vzc2lvbkRhdGEodXNlcklkOiBzdHJpbmcsIGFjY291bnRJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzZXNzaW9uRGF0YSA9IGF3YWl0IGdldENhY2hlZEltYXBTZXNzaW9uKHVzZXJJZCk7XG4gIFxuICBpZiAoc2Vzc2lvbkRhdGEpIHtcbiAgICBhd2FpdCBjYWNoZUltYXBTZXNzaW9uKHVzZXJJZCwge1xuICAgICAgLi4uc2Vzc2lvbkRhdGEsXG4gICAgICBsYXN0QWN0aXZlOiBEYXRlLm5vdygpLFxuICAgICAgLi4uKGFjY291bnRJZCAmJiB7IGRlZmF1bHRBY2NvdW50SWQ6IGFjY291bnRJZCB9KVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNhY2hlSW1hcFNlc3Npb24odXNlcklkLCB7XG4gICAgICBsYXN0QWN0aXZlOiBEYXRlLm5vdygpLFxuICAgICAgLi4uKGFjY291bnRJZCAmJiB7IGRlZmF1bHRBY2NvdW50SWQ6IGFjY291bnRJZCB9KVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHVzZXIncyBlbWFpbCBjcmVkZW50aWFscyBmcm9tIGRhdGFiYXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVc2VyRW1haWxDcmVkZW50aWFscyh1c2VySWQ6IHN0cmluZywgYWNjb3VudElkPzogc3RyaW5nKTogUHJvbWlzZTxFbWFpbENyZWRlbnRpYWxzIHwgbnVsbD4ge1xuICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IHByaXNtYS5tYWlsQ3JlZGVudGlhbHMuZmluZEZpcnN0KHtcbiAgICB3aGVyZToge1xuICAgICAgQU5EOiBbXG4gICAgICAgIHsgdXNlcklkIH0sXG4gICAgICAgIGFjY291bnRJZCA/IHsgaWQ6IGFjY291bnRJZCB9IDoge31cbiAgICAgIF1cbiAgICB9XG4gIH0pO1xuXG4gIGlmICghY3JlZGVudGlhbHMpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG1haWxDcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzIGFzIHVua25vd24gYXMge1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICBob3N0OiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHNlY3VyZTogYm9vbGVhbjtcbiAgICBzbXRwX2hvc3Q6IHN0cmluZyB8IG51bGw7XG4gICAgc210cF9wb3J0OiBudW1iZXIgfCBudWxsO1xuICAgIHNtdHBfc2VjdXJlOiBib29sZWFuIHwgbnVsbDtcbiAgICBkaXNwbGF5X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgY29sb3I6IHN0cmluZyB8IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBlbWFpbDogbWFpbENyZWRlbnRpYWxzLmVtYWlsLFxuICAgIHBhc3N3b3JkOiBtYWlsQ3JlZGVudGlhbHMucGFzc3dvcmQsXG4gICAgaG9zdDogbWFpbENyZWRlbnRpYWxzLmhvc3QsXG4gICAgcG9ydDogbWFpbENyZWRlbnRpYWxzLnBvcnQsXG4gICAgc2VjdXJlOiBtYWlsQ3JlZGVudGlhbHMuc2VjdXJlLFxuICAgIHNtdHBfaG9zdDogbWFpbENyZWRlbnRpYWxzLnNtdHBfaG9zdCB8fCB1bmRlZmluZWQsXG4gICAgc210cF9wb3J0OiBtYWlsQ3JlZGVudGlhbHMuc210cF9wb3J0IHx8IHVuZGVmaW5lZCxcbiAgICBzbXRwX3NlY3VyZTogbWFpbENyZWRlbnRpYWxzLnNtdHBfc2VjdXJlID8/IGZhbHNlLFxuICAgIGRpc3BsYXlfbmFtZTogbWFpbENyZWRlbnRpYWxzLmRpc3BsYXlfbmFtZSB8fCB1bmRlZmluZWQsXG4gICAgY29sb3I6IG1haWxDcmVkZW50aWFscy5jb2xvciB8fCB1bmRlZmluZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBTYXZlIG9yIHVwZGF0ZSB1c2VyJ3MgZW1haWwgY3JlZGVudGlhbHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVVc2VyRW1haWxDcmVkZW50aWFscyhcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nLFxuICBjcmVkZW50aWFsczogRW1haWxDcmVkZW50aWFsc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCdTYXZpbmcgY3JlZGVudGlhbHMgZm9yIHVzZXI6JywgdXNlcklkLCAnYWNjb3VudDonLCBhY2NvdW50SWQpO1xuICBcbiAgaWYgKCFjcmVkZW50aWFscykge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gY3JlZGVudGlhbHMgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIC8vIENhc3QgdG8gZXh0ZW5kZWQgdHlwZSB0byBhY2Nlc3MgT0F1dGggcHJvcGVydGllc1xuICBjb25zdCBleHRlbmRlZENyZWRzID0gY3JlZGVudGlhbHMgYXMgRW1haWxDcmVkZW50aWFsc0V4dGVuZGVkO1xuICBcbiAgLy8gU3RvcmUgT0F1dGggaW5mb3JtYXRpb24gaW4gYSBzZXBhcmF0ZSBvYmplY3QgZm9yIGNhY2hpbmdcbiAgY29uc3Qgb2F1dGhEYXRhID0ge1xuICAgIHVzZU9BdXRoOiBleHRlbmRlZENyZWRzLnVzZU9BdXRoLFxuICAgIGFjY2Vzc1Rva2VuOiBleHRlbmRlZENyZWRzLmFjY2Vzc1Rva2VuLFxuICAgIHJlZnJlc2hUb2tlbjogZXh0ZW5kZWRDcmVkcy5yZWZyZXNoVG9rZW4sXG4gICAgdG9rZW5FeHBpcnk6IGV4dGVuZGVkQ3JlZHMudG9rZW5FeHBpcnlcbiAgfTtcblxuICAvLyBFeHRyYWN0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGV4aXN0IGluIHRoZSBkYXRhYmFzZSBzY2hlbWFcbiAgLy8gQmFzZWQgb24gdGhlIHNjaGVtYSBmcm9tICducHggcHJpc21hIGRiIHB1bGwnLCBPQXV0aCBmaWVsZHMgZG9uJ3QgZXhpc3RcbiAgY29uc3QgZGJDcmVkZW50aWFscyA9IHtcbiAgICBlbWFpbDogY3JlZGVudGlhbHMuZW1haWwsXG4gICAgcGFzc3dvcmQ6IGNyZWRlbnRpYWxzLnBhc3N3b3JkID8/ICcnLCAvLyBSZXF1aXJlZCBmaWVsZCBpbiB0aGUgREIgc2NoZW1hXG4gICAgaG9zdDogY3JlZGVudGlhbHMuaG9zdCxcbiAgICBwb3J0OiBjcmVkZW50aWFscy5wb3J0LFxuICAgIHNlY3VyZTogY3JlZGVudGlhbHMuc2VjdXJlID8/IHRydWUsXG4gICAgc210cF9ob3N0OiBjcmVkZW50aWFscy5zbXRwX2hvc3QgfHwgbnVsbCxcbiAgICBzbXRwX3BvcnQ6IGNyZWRlbnRpYWxzLnNtdHBfcG9ydCB8fCBudWxsLFxuICAgIHNtdHBfc2VjdXJlOiBjcmVkZW50aWFscy5zbXRwX3NlY3VyZSA/PyBmYWxzZSxcbiAgICBkaXNwbGF5X25hbWU6IGNyZWRlbnRpYWxzLmRpc3BsYXlfbmFtZSB8fCBudWxsLFxuICAgIGNvbG9yOiBjcmVkZW50aWFscy5jb2xvciB8fCBudWxsXG4gIH07XG4gIFxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKCdTYXZpbmcgY3JlZGVudGlhbHMgdG8gZGF0YWJhc2U6Jywge1xuICAgICAgLi4uZGJDcmVkZW50aWFscyxcbiAgICAgIHBhc3N3b3JkOiBkYkNyZWRlbnRpYWxzLnBhc3N3b3JkID8gJyoqKicgOiBudWxsLFxuICAgIH0pO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKCdPQXV0aCBkYXRhIHdpbGwgYmUgc2F2ZWQgdG8gUmVkaXMgY2FjaGUgb25seTonLCB7XG4gICAgICBoYXNPQXV0aDogISFvYXV0aERhdGEudXNlT0F1dGgsXG4gICAgICBoYXNBY2Nlc3NUb2tlbjogISFvYXV0aERhdGEuYWNjZXNzVG9rZW4sXG4gICAgICBoYXNSZWZyZXNoVG9rZW46ICEhb2F1dGhEYXRhLnJlZnJlc2hUb2tlblxuICAgIH0pO1xuXG4gICAgLy8gU2F2ZSB0byBkYXRhYmFzZSB1c2luZyB0aGUgdW5pcXVlIGNvbnN0cmFpbnQgb24gW3VzZXJJZCwgZW1haWxdXG4gICAgYXdhaXQgcHJpc21hLm1haWxDcmVkZW50aWFscy51cHNlcnQoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgaWQ6IGF3YWl0IHByaXNtYS5tYWlsQ3JlZGVudGlhbHMuZmluZEZpcnN0KHtcbiAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgQU5EOiBbXG4gICAgICAgICAgICAgIHsgdXNlcklkIH0sXG4gICAgICAgICAgICAgIHsgZW1haWw6IGFjY291bnRJZCB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Q6IHsgaWQ6IHRydWUgfVxuICAgICAgICB9KS50aGVuKHJlc3VsdCA9PiByZXN1bHQ/LmlkID8/ICcnKVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogZGJDcmVkZW50aWFscyxcbiAgICAgIGNyZWF0ZToge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIC4uLmRiQ3JlZGVudGlhbHNcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBDcmVhdGUgYSBjb21iaW5lZCBjcmVkZW50aWFscyBvYmplY3QgZm9yIGNhY2hpbmdcbiAgICBjb25zdCBmdWxsQ3JlZHMgPSB7XG4gICAgICAuLi5kYkNyZWRlbnRpYWxzLFxuICAgICAgLi4ub2F1dGhEYXRhXG4gICAgfSBhcyBFbWFpbENyZWRlbnRpYWxzRXh0ZW5kZWQ7ICAvLyBDYXN0IHRvIHRoZSBleHBlY3RlZCB0eXBlXG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIGZ1bGwgY3JlZGVudGlhbHMgaW5jbHVkaW5nIE9BdXRoIHRva2Vuc1xuICAgIGF3YWl0IGNhY2hlRW1haWxDcmVkZW50aWFscyh1c2VySWQsIGFjY291bnRJZCwgZnVsbENyZWRzKTtcbiAgICBjb25zb2xlLmxvZygnU3VjY2Vzc2Z1bGx5IHNhdmVkIGNyZWRlbnRpYWxzIHRvIGRhdGFiYXNlIGFuZCBjYWNoZWQgZnVsbCBkYXRhIHdpdGggT0F1dGggdG9rZW5zJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3Igc2F2aW5nIGNyZWRlbnRpYWxzOicsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vLyBIZWxwZXIgdHlwZSBmb3IgSU1BUCBmZXRjaCBvcHRpb25zXG5pbnRlcmZhY2UgRmV0Y2hPcHRpb25zIHtcbiAgZW52ZWxvcGU6IGJvb2xlYW47XG4gIGZsYWdzOiBib29sZWFuO1xuICBib2R5U3RydWN0dXJlOiBib29sZWFuO1xuICBpbnRlcm5hbERhdGU6IGJvb2xlYW47XG4gIHNpemU6IGJvb2xlYW47XG4gIGJvZHlQYXJ0czogeyBwYXJ0OiBzdHJpbmc7IHF1ZXJ5OiBhbnk7IGxpbWl0PzogbnVtYmVyIH1bXTtcbn1cblxuLyoqXG4gKiBHZXQgbGlzdCBvZiBlbWFpbHMgZm9yIGEgdXNlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxzKFxuICB1c2VySWQ6IHN0cmluZyxcbiAgZm9sZGVyOiBzdHJpbmcsXG4gIHBhZ2U6IG51bWJlciA9IDEsXG4gIHBlclBhZ2U6IG51bWJlciA9IDIwLFxuICBhY2NvdW50SWQ/OiBzdHJpbmcsXG4gIGNoZWNrT25seTogYm9vbGVhbiA9IGZhbHNlXG4pOiBQcm9taXNlPEVtYWlsTGlzdFJlc3VsdD4ge1xuICAvLyBOb3JtYWxpemUgZm9sZGVyIG5hbWUgYW5kIGhhbmRsZSBhY2NvdW50IElEXG4gIGNvbnNvbGUubG9nKGBbZ2V0RW1haWxzXSBQcm9jZXNzaW5nIHJlcXVlc3QgZm9yIGZvbGRlcjogJHtmb2xkZXJ9LCBub3JtYWxpemVkIHRvICR7Zm9sZGVyfSwgYWNjb3VudDogJHthY2NvdW50SWQgfHwgJ2RlZmF1bHQnfSwgY2hlY2tPbmx5OiAke2NoZWNrT25seX1gKTtcbiAgXG4gIHRyeSB7XG4gICAgLy8gVGhlIGdldEltYXBDb25uZWN0aW9uIGZ1bmN0aW9uIGFscmVhZHkgaGFuZGxlcyAnZGVmYXVsdCcgYWNjb3VudElkIGJ5IGZpbmRpbmcgdGhlIGZpcnN0IGF2YWlsYWJsZSBhY2NvdW50XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgZ2V0SW1hcENvbm5lY3Rpb24odXNlcklkLCBhY2NvdW50SWQpO1xuICAgIFxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGFjY291bnRJZCBoYXMgYmVlbiByZXNvbHZlZCB0byBhbiBhY3R1YWwgYWNjb3VudCBJRCBieSBnZXRJbWFwQ29ubmVjdGlvblxuICAgIC8vIFN0b3JlIHRoZSByZXNvbHZlZCBhY2NvdW50SWQgaW4gYSB2YXJpYWJsZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBzdHJpbmdcbiAgICBjb25zdCByZXNvbHZlZEFjY291bnRJZCA9IGFjY291bnRJZCB8fCAnZGVmYXVsdCc7XG4gICAgXG4gICAgLy8gQXR0ZW1wdCB0byBzZWxlY3QgdGhlIG1haWxib3hcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFpbGJveEluZm8gPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oZm9sZGVyKTtcbiAgICAgIGNvbnNvbGUubG9nKGBPcGVuZWQgbWFpbGJveCAke2ZvbGRlcn0gd2l0aCAke21haWxib3hJbmZvLmV4aXN0c30gbWVzc2FnZXNgKTtcbiAgICAgIFxuICAgICAgLy8gR2V0IGxpc3Qgb2YgYWxsIG1haWxib3hlcyBmb3IgVUlcbiAgICAgIGNvbnN0IG1haWxib3hlcyA9IGF3YWl0IGdldE1haWxib3hlcyhjbGllbnQsIHJlc29sdmVkQWNjb3VudElkKTtcbiAgICAgIFxuICAgICAgLy8gQ2FsY3VsYXRlIHBhZ2luYXRpb25cbiAgICAgIGNvbnN0IHRvdGFsRW1haWxzID0gbWFpbGJveEluZm8uZXhpc3RzIHx8IDA7XG4gICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsRW1haWxzIC8gcGVyUGFnZSk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIG1haWxib3ggaXMgZW1wdHlcbiAgICAgIGlmICh0b3RhbEVtYWlscyA9PT0gMCkge1xuICAgICAgICAvLyBDYWNoZSB0aGUgZW1wdHkgcmVzdWx0XG4gICAgICAgIGNvbnN0IGVtcHR5UmVzdWx0ID0ge1xuICAgICAgICAgIGVtYWlsczogW10sXG4gICAgICAgICAgdG90YWxFbWFpbHM6IDAsXG4gICAgICAgICAgcGFnZSxcbiAgICAgICAgICBwZXJQYWdlLFxuICAgICAgICAgIHRvdGFsUGFnZXM6IDAsXG4gICAgICAgICAgZm9sZGVyLFxuICAgICAgICAgIG1haWxib3hlcyxcbiAgICAgICAgICBuZXdlc3RFbWFpbElkOiAwXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGNhY2hlIGlmIG5vdCBpbiBjaGVja09ubHkgbW9kZVxuICAgICAgICBpZiAoIWNoZWNrT25seSkge1xuICAgICAgICAgIGF3YWl0IGNhY2hlRW1haWxMaXN0KFxuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgcmVzb2x2ZWRBY2NvdW50SWQsIC8vIFVzZSB0aGUgZ3VhcmFudGVlZCBzdHJpbmcgYWNjb3VudCBJRFxuICAgICAgICAgICAgZm9sZGVyLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIHBlclBhZ2UsXG4gICAgICAgICAgICBlbXB0eVJlc3VsdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBlbXB0eVJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgY2hlY2tPbmx5IG1vZGUsIHdlIGp1c3QgZmV0Y2ggdGhlIG1vc3QgcmVjZW50IGVtYWlsJ3MgSUQgdG8gY29tcGFyZVxuICAgICAgaWYgKGNoZWNrT25seSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgW2dldEVtYWlsc10gY2hlY2tPbmx5IG1vZGU6IGZldGNoaW5nIG9ubHkgdGhlIG1vc3QgcmVjZW50IGVtYWlsIElEYCk7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2UgKGhpZ2hlc3Qgc2VxdWVuY2UgbnVtYmVyKVxuICAgICAgICBjb25zdCBsYXN0TWVzc2FnZVNlcXVlbmNlID0gdG90YWxFbWFpbHMudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtnZXRFbWFpbHNdIEZldGNoaW5nIGxhdGVzdCBtZXNzYWdlIHdpdGggc2VxdWVuY2U6ICR7bGFzdE1lc3NhZ2VTZXF1ZW5jZX1gKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgY2xpZW50LmZldGNoKGxhc3RNZXNzYWdlU2VxdWVuY2UsIHtcbiAgICAgICAgICB1aWQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgbmV3ZXN0RW1haWxJZCA9IDA7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgICAgIG5ld2VzdEVtYWlsSWQgPSBtZXNzYWdlLnVpZDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coYFtnZXRFbWFpbHNdIExhdGVzdCBlbWFpbCBVSUQ6ICR7bmV3ZXN0RW1haWxJZH1gKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldHVybiBtaW5pbWFsIHJlc3VsdCB3aXRoIGp1c3QgdGhlIG5ld2VzdCBlbWFpbCBJRFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVtYWlsczogW10sXG4gICAgICAgICAgdG90YWxFbWFpbHMsXG4gICAgICAgICAgcGFnZSxcbiAgICAgICAgICBwZXJQYWdlLFxuICAgICAgICAgIHRvdGFsUGFnZXMsXG4gICAgICAgICAgZm9sZGVyLFxuICAgICAgICAgIG1haWxib3hlcyxcbiAgICAgICAgICBuZXdlc3RFbWFpbElkXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBtZXNzYWdlIHJhbmdlIGZvciBwYWdpbmF0aW9uXG4gICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDEsIHRvdGFsRW1haWxzIC0gKHBhZ2UgKiBwZXJQYWdlKSArIDEpO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5tYXgoMSwgdG90YWxFbWFpbHMgLSAoKHBhZ2UgLSAxKSAqIHBlclBhZ2UpKTtcbiAgICAgIGNvbnNvbGUubG9nKGBGZXRjaGluZyBtZXNzYWdlcyAke3N0YXJ0fToke2VuZH0gZnJvbSAke2ZvbGRlcn0gZm9yIGFjY291bnQgJHtyZXNvbHZlZEFjY291bnRJZH1gKTtcblxuICAgICAgLy8gRmV0Y2ggbWVzc2FnZXNcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgY2xpZW50LmZldGNoKGAke3N0YXJ0fToke2VuZH1gLCB7XG4gICAgICAgIGVudmVsb3BlOiB0cnVlLFxuICAgICAgICBmbGFnczogdHJ1ZSxcbiAgICAgICAgYm9keVN0cnVjdHVyZTogdHJ1ZSxcbiAgICAgICAgdWlkOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW1haWxzOiBFbWFpbE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgbGV0IG5ld2VzdEVtYWlsSWQgPSAwO1xuICAgICAgXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICAgICAgLy8gVHJhY2sgdGhlIG5ld2VzdCBlbWFpbCBJRCAoaGlnaGVzdCBVSUQpXG4gICAgICAgIGlmIChtZXNzYWdlLnVpZCA+IG5ld2VzdEVtYWlsSWQpIHtcbiAgICAgICAgICBuZXdlc3RFbWFpbElkID0gbWVzc2FnZS51aWQ7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGVtYWlsOiBFbWFpbE1lc3NhZ2UgPSB7XG4gICAgICAgICAgaWQ6IG1lc3NhZ2UudWlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgZnJvbTogbWVzc2FnZS5lbnZlbG9wZS5mcm9tPy5tYXAoYWRkciA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYWRkci5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgYWRkcmVzczogYWRkci5hZGRyZXNzIHx8ICcnXG4gICAgICAgICAgfSkpIHx8IFtdLFxuICAgICAgICAgIHRvOiBtZXNzYWdlLmVudmVsb3BlLnRvPy5tYXAoYWRkciA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYWRkci5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgYWRkcmVzczogYWRkci5hZGRyZXNzIHx8ICcnXG4gICAgICAgICAgfSkpIHx8IFtdLFxuICAgICAgICAgIHN1YmplY3Q6IG1lc3NhZ2UuZW52ZWxvcGUuc3ViamVjdCB8fCAnJyxcbiAgICAgICAgICBkYXRlOiBtZXNzYWdlLmVudmVsb3BlLmRhdGUgfHwgbmV3IERhdGUoKSxcbiAgICAgICAgICBmbGFnczoge1xuICAgICAgICAgICAgc2VlbjogbWVzc2FnZS5mbGFncy5oYXMoJ1xcXFxTZWVuJyksXG4gICAgICAgICAgICBmbGFnZ2VkOiBtZXNzYWdlLmZsYWdzLmhhcygnXFxcXEZsYWdnZWQnKSxcbiAgICAgICAgICAgIGFuc3dlcmVkOiBtZXNzYWdlLmZsYWdzLmhhcygnXFxcXEFuc3dlcmVkJyksXG4gICAgICAgICAgICBkcmFmdDogbWVzc2FnZS5mbGFncy5oYXMoJ1xcXFxEcmFmdCcpLFxuICAgICAgICAgICAgZGVsZXRlZDogbWVzc2FnZS5mbGFncy5oYXMoJ1xcXFxEZWxldGVkJylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNpemU6IG1lc3NhZ2Uuc2l6ZSB8fCAwLFxuICAgICAgICAgIGhhc0F0dGFjaG1lbnRzOiBtZXNzYWdlLmJvZHlTdHJ1Y3R1cmU/LmNoaWxkTm9kZXM/LnNvbWUobm9kZSA9PiBub2RlLmRpc3Bvc2l0aW9uID09PSAnYXR0YWNobWVudCcpIHx8IGZhbHNlLFxuICAgICAgICAgIGZvbGRlcjogZm9sZGVyLFxuICAgICAgICAgIGNvbnRlbnRGZXRjaGVkOiBmYWxzZSxcbiAgICAgICAgICBhY2NvdW50SWQ6IHJlc29sdmVkQWNjb3VudElkLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgaHRtbDogJycsXG4gICAgICAgICAgICBpc0h0bWw6IGZhbHNlLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiAnbHRyJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZW1haWxzLnB1c2goZW1haWwpO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXN1bHRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgZW1haWxzLFxuICAgICAgICB0b3RhbEVtYWlscyxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgcGVyUGFnZSxcbiAgICAgICAgdG90YWxQYWdlczogTWF0aC5jZWlsKHRvdGFsRW1haWxzIC8gcGVyUGFnZSksXG4gICAgICAgIGZvbGRlcixcbiAgICAgICAgbWFpbGJveGVzLFxuICAgICAgICBuZXdlc3RFbWFpbElkXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IHdpdGggdGhlIGVmZmVjdGl2ZSBhY2NvdW50IElEIChvbmx5IGlmIG5vdCBpbiBjaGVja09ubHkgbW9kZSlcbiAgICAgIGlmICghY2hlY2tPbmx5KSB7XG4gICAgICAgIGF3YWl0IGNhY2hlRW1haWxMaXN0KFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICByZXNvbHZlZEFjY291bnRJZCwgLy8gVXNlIHRoZSBndWFyYW50ZWVkIHN0cmluZyBhY2NvdW50IElEXG4gICAgICAgICAgZm9sZGVyLFxuICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgcGVyUGFnZSxcbiAgICAgICAgICByZXN1bHRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgZW1haWxzOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBlbWFpbHM6JywgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIE1hcCBlbWFpbCBhZGRyZXNzZXMgc2FmZWx5IHdpdGggbnVsbCBjaGVja3NcbmZ1bmN0aW9uIG1hcEFkZHJlc3NlcyhhZGRyZXNzZXM6IGFueVtdIHwgdW5kZWZpbmVkKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGFkZHJlc3M6IHN0cmluZyB9PiB7XG4gIGlmICghYWRkcmVzc2VzIHx8ICFBcnJheS5pc0FycmF5KGFkZHJlc3NlcykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgXG4gIHJldHVybiBhZGRyZXNzZXMubWFwKChhZGRyOiBhbnkpID0+ICh7XG4gICAgbmFtZTogYWRkci5uYW1lIHx8IGFkZHIuYWRkcmVzcyB8fCAnJyxcbiAgICBhZGRyZXNzOiBhZGRyLmFkZHJlc3MgfHwgJydcbiAgfSkpO1xufVxuXG4vKipcbiAqIEdldCBhIHNpbmdsZSBlbWFpbCB3aXRoIGZ1bGwgY29udGVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RW1haWxDb250ZW50KFxuICB1c2VySWQ6IHN0cmluZyxcbiAgZW1haWxJZDogc3RyaW5nLFxuICBmb2xkZXI6IHN0cmluZyA9ICdJTkJPWCcsXG4gIGFjY291bnRJZD86IHN0cmluZ1xuKTogUHJvbWlzZTxFbWFpbE1lc3NhZ2U+IHtcbiAgLy8gVmFsaWRhdGUgcGFyYW1ldGVyc1xuICBpZiAoIXVzZXJJZCB8fCAhZW1haWxJZCB8fCAhZm9sZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMnKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIFVJRCBmb3JtYXRcbiAgaWYgKCEvXlxcZCskLy50ZXN0KGVtYWlsSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVtYWlsIElEIGZvcm1hdDogbXVzdCBiZSBhIG51bWVyaWMgVUlEJyk7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRvIG51bWJlciBmb3IgSU1BUFxuICBjb25zdCBudW1lcmljSWQgPSBwYXJzZUludChlbWFpbElkLCAxMCk7XG4gIGlmIChpc05hTihudW1lcmljSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbCBJRCBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICAvLyBFeHRyYWN0IGFjY291bnQgSUQgZnJvbSBmb2xkZXIgbmFtZSBpZiBwcmVzZW50IGFuZCBub25lIHdhcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gIGNvbnN0IGZvbGRlckFjY291bnRJZCA9IGZvbGRlci5pbmNsdWRlcygnOicpID8gZm9sZGVyLnNwbGl0KCc6JylbMF0gOiBhY2NvdW50SWQ7XG4gIFxuICAvLyBVc2UgdGhlIG1vc3Qgc3BlY2lmaWMgYWNjb3VudCBJRCBhdmFpbGFibGVcbiAgY29uc3QgZWZmZWN0aXZlQWNjb3VudElkID0gZm9sZGVyQWNjb3VudElkIHx8IGFjY291bnRJZCB8fCAnZGVmYXVsdCc7XG4gIFxuICAvLyBOb3JtYWxpemUgZm9sZGVyIG5hbWUgYnkgcmVtb3ZpbmcgYWNjb3VudCBwcmVmaXggaWYgcHJlc2VudFxuICBjb25zdCBub3JtYWxpemVkRm9sZGVyID0gZm9sZGVyLmluY2x1ZGVzKCc6JykgPyBmb2xkZXIuc3BsaXQoJzonKVsxXSA6IGZvbGRlcjtcbiAgXG4gIGNvbnNvbGUubG9nKGBbZ2V0RW1haWxDb250ZW50XSBGZXRjaGluZyBlbWFpbCAke2VtYWlsSWR9IGZyb20gZm9sZGVyICR7bm9ybWFsaXplZEZvbGRlcn0sIGFjY291bnQgJHtlZmZlY3RpdmVBY2NvdW50SWR9YCk7XG4gIFxuICAvLyBVc2Ugbm9ybWFsaXplZCBmb2xkZXIgbmFtZSBhbmQgZWZmZWN0aXZlIGFjY291bnQgSUQgZm9yIGNhY2hlIGtleVxuICBjb25zdCBjYWNoZWRFbWFpbCA9IGF3YWl0IGdldENhY2hlZEVtYWlsQ29udGVudCh1c2VySWQsIGVmZmVjdGl2ZUFjY291bnRJZCwgZW1haWxJZCk7XG4gIGlmIChjYWNoZWRFbWFpbCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2luZyBjYWNoZWQgZW1haWwgY29udGVudCBmb3IgJHt1c2VySWR9OiR7ZWZmZWN0aXZlQWNjb3VudElkfToke2VtYWlsSWR9YCk7XG4gICAgcmV0dXJuIGNhY2hlZEVtYWlsO1xuICB9XG4gIFxuICBjb25zb2xlLmxvZyhgQ2FjaGUgbWlzcyBmb3IgZW1haWwgY29udGVudCAke3VzZXJJZH06JHtlZmZlY3RpdmVBY2NvdW50SWR9OiR7ZW1haWxJZH0sIGZldGNoaW5nIGZyb20gSU1BUGApO1xuICBcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgZ2V0SW1hcENvbm5lY3Rpb24odXNlcklkLCBlZmZlY3RpdmVBY2NvdW50SWQpO1xuICBcbiAgdHJ5IHtcbiAgICBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4obm9ybWFsaXplZEZvbGRlcik7XG4gICAgXG4gICAgLy8gTG9nIGNvbm5lY3Rpb24gZGV0YWlscyB3aXRoIGFjY291bnQgY29udGV4dFxuICAgIGNvbnNvbGUubG9nKGBbREVCVUddIEZldGNoaW5nIGVtYWlsICR7ZW1haWxJZH0gZnJvbSBmb2xkZXIgJHtub3JtYWxpemVkRm9sZGVyfSBmb3IgYWNjb3VudCAke2VmZmVjdGl2ZUFjY291bnRJZH1gKTtcbiAgICBcbiAgICAvLyBPcGVuIG1haWxib3ggd2l0aCBlcnJvciBoYW5kbGluZ1xuICAgIGNvbnN0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4obm9ybWFsaXplZEZvbGRlcik7XG4gICAgaWYgKCFtYWlsYm94IHx8IHR5cGVvZiBtYWlsYm94ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIG9wZW4gbWFpbGJveDogJHtub3JtYWxpemVkRm9sZGVyfSBmb3IgYWNjb3VudCAke2VmZmVjdGl2ZUFjY291bnRJZH1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIG1haWxib3ggc3RhdHVzIHdpdGggYWNjb3VudCBjb250ZXh0XG4gICAgY29uc29sZS5sb2coYFtERUJVR10gTWFpbGJveCAke25vcm1hbGl6ZWRGb2xkZXJ9IG9wZW5lZCBmb3IgYWNjb3VudCAke2VmZmVjdGl2ZUFjY291bnRJZH0sIHRvdGFsIG1lc3NhZ2VzOiAke21haWxib3guZXhpc3RzfWApO1xuICAgIFxuICAgIC8vIEdldCB0aGUgVUlEVkFMSURJVFkgYW5kIFVJRE5FWFQgdmFsdWVzXG4gICAgY29uc3QgdWlkVmFsaWRpdHkgPSBtYWlsYm94LnVpZFZhbGlkaXR5O1xuICAgIGNvbnN0IHVpZE5leHQgPSBtYWlsYm94LnVpZE5leHQ7XG4gICAgXG4gICAgY29uc29sZS5sb2coYFtERUJVR10gTWFpbGJveCBVSURWQUxJRElUWTogJHt1aWRWYWxpZGl0eX0sIFVJRE5FWFQ6ICR7dWlkTmV4dH0gZm9yIGFjY291bnQgJHtlZmZlY3RpdmVBY2NvdW50SWR9YCk7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgVUlEIGV4aXN0cyBpbiBtYWlsYm94XG4gICAgaWYgKG51bWVyaWNJZCA+PSB1aWROZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVtYWlsIElEICR7bnVtZXJpY0lkfSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGhpZ2hlc3QgVUlEIGluIG1haWxib3ggKCR7dWlkTmV4dH0pIGZvciBhY2NvdW50ICR7ZWZmZWN0aXZlQWNjb3VudElkfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaXJzdCwgdHJ5IHRvIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGlzIFVJRFxuICAgIGNvbnN0IHNlYXJjaFJlc3VsdCA9IGF3YWl0IGNsaWVudC5zZWFyY2goeyB1aWQ6IG51bWVyaWNJZC50b1N0cmluZygpIH0pO1xuICAgIGlmICghc2VhcmNoUmVzdWx0IHx8IHNlYXJjaFJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW1haWwgd2l0aCBVSUQgJHtudW1lcmljSWR9IG5vdCBmb3VuZCBpbiBmb2xkZXIgJHtub3JtYWxpemVkRm9sZGVyfSBmb3IgYWNjb3VudCAke2VmZmVjdGl2ZUFjY291bnRJZH1gKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc2VxdWVuY2VOdW1iZXIgPSBzZWFyY2hSZXN1bHRbMF07XG4gICAgY29uc29sZS5sb2coYFtERUJVR10gRm91bmQgc2VxdWVuY2UgbnVtYmVyICR7c2VxdWVuY2VOdW1iZXJ9IGZvciBVSUQgJHtudW1lcmljSWR9IGluIGFjY291bnQgJHtlZmZlY3RpdmVBY2NvdW50SWR9YCk7XG4gICAgXG4gICAgLy8gTm93IGZldGNoIHVzaW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIgd2l0aCBlcnJvciBoYW5kbGluZ1xuICAgIGxldCBtZXNzYWdlO1xuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gYXdhaXQgY2xpZW50LmZldGNoT25lKHNlcXVlbmNlTnVtYmVyLnRvU3RyaW5nKCksIHtcbiAgICAgICAgc291cmNlOiB0cnVlLFxuICAgICAgICBlbnZlbG9wZTogdHJ1ZSxcbiAgICAgICAgZmxhZ3M6IHRydWUsXG4gICAgICAgIHNpemU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGZldGNoRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIGZldGNoaW5nIG1lc3NhZ2Ugd2l0aCBzZXF1ZW5jZSAke3NlcXVlbmNlTnVtYmVyfTpgLCBmZXRjaEVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGVtYWlsOiAke2ZldGNoRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGZldGNoRXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVtYWlsIG5vdCBmb3VuZCB3aXRoIHNlcXVlbmNlIG51bWJlciAke3NlcXVlbmNlTnVtYmVyfSBpbiBmb2xkZXIgJHtub3JtYWxpemVkRm9sZGVyfSBmb3IgYWNjb3VudCAke2VmZmVjdGl2ZUFjY291bnRJZH1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgbWVzc2FnZSBoYXMgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCFtZXNzYWdlLnNvdXJjZSB8fCAhbWVzc2FnZS5lbnZlbG9wZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVtYWlsIGRhdGEgcmVjZWl2ZWQ6IG1pc3Npbmcgc291cmNlIG9yIGVudmVsb3BlIGRhdGFgKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgeyBzb3VyY2UsIGVudmVsb3BlLCBmbGFncywgc2l6ZSB9ID0gbWVzc2FnZTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBlbnZlbG9wZSBkYXRhXG4gICAgaWYgKCFlbnZlbG9wZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbWFpbCBlbnZlbG9wZSBkYXRhIGlzIG1pc3NpbmcnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGFyc2UgdGhlIGVtYWlsIGNvbnRlbnQsIGVuc3VyaW5nIGFsbCBzdHlsZXMgYW5kIHN0cnVjdHVyZSBhcmUgcHJlc2VydmVkXG4gICAgbGV0IHBhcnNlZEVtYWlsO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWRFbWFpbCA9IGF3YWl0IHNpbXBsZVBhcnNlcihzb3VyY2UudG9TdHJpbmcoKSwge1xuICAgICAgICBza2lwSHRtbFRvVGV4dDogdHJ1ZSxcbiAgICAgICAga2VlcENpZExpbmtzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBwYXJzaW5nIGVtYWlsIGNvbnRlbnQgZm9yICR7ZW1haWxJZH06YCwgcGFyc2VFcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBlbWFpbCBjb250ZW50OiAke3BhcnNlRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHBhcnNlRXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29udmVydCBmbGFncyBmcm9tIFNldCB0byBib29sZWFuIGNoZWNrc1xuICAgIGNvbnN0IGZsYWdzQXJyYXkgPSBBcnJheS5mcm9tKGZsYWdzIGFzIFNldDxzdHJpbmc+KTtcbiAgICBcbiAgICAvLyBQcmVzZXJ2ZSB0aGUgcmF3IEhUTUwgZXhhY3RseSBhcyBpdCB3YXMgaW4gdGhlIG9yaWdpbmFsIGVtYWlsXG4gICAgY29uc3QgcmF3SHRtbCA9IHBhcnNlZEVtYWlsLmh0bWwgfHwgJyc7XG4gICAgXG4gICAgY29uc3QgZW1haWw6IEVtYWlsTWVzc2FnZSA9IHtcbiAgICAgIGlkOiBlbWFpbElkLFxuICAgICAgbWVzc2FnZUlkOiBlbnZlbG9wZS5tZXNzYWdlSWQsXG4gICAgICBzdWJqZWN0OiBlbnZlbG9wZS5zdWJqZWN0IHx8IFwiKE5vIFN1YmplY3QpXCIsXG4gICAgICBmcm9tOiBtYXBBZGRyZXNzZXMoZW52ZWxvcGUuZnJvbSksXG4gICAgICB0bzogbWFwQWRkcmVzc2VzKGVudmVsb3BlLnRvKSxcbiAgICAgIGNjOiBtYXBBZGRyZXNzZXMoZW52ZWxvcGUuY2MpLFxuICAgICAgYmNjOiBtYXBBZGRyZXNzZXMoZW52ZWxvcGUuYmNjKSxcbiAgICAgIGRhdGU6IGVudmVsb3BlLmRhdGUgfHwgbmV3IERhdGUoKSxcbiAgICAgIGZsYWdzOiB7XG4gICAgICAgIHNlZW46IGZsYWdzQXJyYXkuaW5jbHVkZXMoXCJcXFxcU2VlblwiKSxcbiAgICAgICAgZmxhZ2dlZDogZmxhZ3NBcnJheS5pbmNsdWRlcyhcIlxcXFxGbGFnZ2VkXCIpLFxuICAgICAgICBhbnN3ZXJlZDogZmxhZ3NBcnJheS5pbmNsdWRlcyhcIlxcXFxBbnN3ZXJlZFwiKSxcbiAgICAgICAgZGVsZXRlZDogZmxhZ3NBcnJheS5pbmNsdWRlcyhcIlxcXFxEZWxldGVkXCIpLFxuICAgICAgICBkcmFmdDogZmxhZ3NBcnJheS5pbmNsdWRlcyhcIlxcXFxEcmFmdFwiKSxcbiAgICAgIH0sXG4gICAgICBoYXNBdHRhY2htZW50czogcGFyc2VkRW1haWwuYXR0YWNobWVudHM/Lmxlbmd0aCA+IDAsXG4gICAgICBhdHRhY2htZW50czogcGFyc2VkRW1haWwuYXR0YWNobWVudHM/Lm1hcChhdHQgPT4gKHtcbiAgICAgICAgZmlsZW5hbWU6IGF0dC5maWxlbmFtZSB8fCAnYXR0YWNobWVudCcsXG4gICAgICAgIGNvbnRlbnRUeXBlOiBhdHQuY29udGVudFR5cGUsXG4gICAgICAgIHNpemU6IGF0dC5zaXplIHx8IDBcbiAgICAgIH0pKSxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgdGV4dDogcGFyc2VkRW1haWwudGV4dCB8fCAnJyxcbiAgICAgICAgaHRtbDogcmF3SHRtbCB8fCAnJyxcbiAgICAgICAgaXNIdG1sOiAhIXJhd0h0bWwsXG4gICAgICAgIGRpcmVjdGlvbjogJ2x0cicgLy8gRGVmYXVsdCB0byBsZWZ0LXRvLXJpZ2h0XG4gICAgICB9LFxuICAgICAgZm9sZGVyOiBub3JtYWxpemVkRm9sZGVyLFxuICAgICAgY29udGVudEZldGNoZWQ6IHRydWUsXG4gICAgICBzaXplOiBzaXplIHx8IDAsXG4gICAgICBhY2NvdW50SWQ6IGVmZmVjdGl2ZUFjY291bnRJZFxuICAgIH07XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIGVtYWlsIGNvbnRlbnQgd2l0aCBlZmZlY3RpdmUgYWNjb3VudCBJRFxuICAgIGF3YWl0IGNhY2hlRW1haWxDb250ZW50KHVzZXJJZCwgZWZmZWN0aXZlQWNjb3VudElkLCBlbWFpbElkLCBlbWFpbCk7XG4gICAgXG4gICAgcmV0dXJuIGVtYWlsO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1tFUlJPUl0gRW1haWwgZmV0Y2ggZmFpbGVkOicsIHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIGVtYWlsSWQsXG4gICAgICBmb2xkZXI6IG5vcm1hbGl6ZWRGb2xkZXIsXG4gICAgICBhY2NvdW50SWQ6IGVmZmVjdGl2ZUFjY291bnRJZCxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyxcbiAgICAgIGRldGFpbHM6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZFxuICAgIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQubWFpbGJveENsb3NlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNsb3NpbmcgbWFpbGJveDonLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWFyayBhbiBlbWFpbCBhcyByZWFkIG9yIHVucmVhZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFya0VtYWlsUmVhZFN0YXR1cyhcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGVtYWlsSWQ6IHN0cmluZyxcbiAgaXNSZWFkOiBib29sZWFuLFxuICBmb2xkZXI6IHN0cmluZyA9ICdJTkJPWCcsXG4gIGFjY291bnRJZD86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEV4dHJhY3QgYWNjb3VudCBJRCBmcm9tIGZvbGRlciBuYW1lIGlmIHByZXNlbnQgYW5kIG5vbmUgd2FzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgY29uc3QgZm9sZGVyQWNjb3VudElkID0gZm9sZGVyLmluY2x1ZGVzKCc6JykgPyBmb2xkZXIuc3BsaXQoJzonKVswXSA6IGFjY291bnRJZDtcbiAgXG4gIC8vIFVzZSB0aGUgbW9zdCBzcGVjaWZpYyBhY2NvdW50IElEIGF2YWlsYWJsZVxuICBjb25zdCBlZmZlY3RpdmVBY2NvdW50SWQgPSBmb2xkZXJBY2NvdW50SWQgfHwgYWNjb3VudElkIHx8ICdkZWZhdWx0JztcbiAgXG4gIC8vIE5vcm1hbGl6ZSBmb2xkZXIgbmFtZSBieSByZW1vdmluZyBhY2NvdW50IHByZWZpeCBpZiBwcmVzZW50XG4gIGNvbnN0IG5vcm1hbGl6ZWRGb2xkZXIgPSBmb2xkZXIuaW5jbHVkZXMoJzonKSA/IGZvbGRlci5zcGxpdCgnOicpWzFdIDogZm9sZGVyO1xuICBcbiAgY29uc29sZS5sb2coYFttYXJrRW1haWxSZWFkU3RhdHVzXSBNYXJraW5nIGVtYWlsICR7ZW1haWxJZH0gYXMgJHtpc1JlYWQgPyAncmVhZCcgOiAndW5yZWFkJ30gaW4gZm9sZGVyICR7bm9ybWFsaXplZEZvbGRlcn0sIGFjY291bnQgJHtlZmZlY3RpdmVBY2NvdW50SWR9YCk7XG4gIFxuICBjb25zdCBjbGllbnQgPSBhd2FpdCBnZXRJbWFwQ29ubmVjdGlvbih1c2VySWQsIGVmZmVjdGl2ZUFjY291bnRJZCk7XG4gIFxuICB0cnkge1xuICAgIGF3YWl0IGNsaWVudC5tYWlsYm94T3Blbihub3JtYWxpemVkRm9sZGVyKTtcbiAgICBcbiAgICBpZiAoaXNSZWFkKSB7XG4gICAgICBhd2FpdCBjbGllbnQubWVzc2FnZUZsYWdzQWRkKGVtYWlsSWQsIFsnXFxcXFNlZW4nXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGNsaWVudC5tZXNzYWdlRmxhZ3NSZW1vdmUoZW1haWxJZCwgWydcXFxcU2VlbiddKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW52YWxpZGF0ZSBjb250ZW50IGNhY2hlIHNpbmNlIHRoZSBmbGFncyBjaGFuZ2VkXG4gICAgYXdhaXQgaW52YWxpZGF0ZUVtYWlsQ29udGVudENhY2hlKHVzZXJJZCwgZWZmZWN0aXZlQWNjb3VudElkLCBlbWFpbElkKTtcbiAgICBcbiAgICAvLyBBbHNvIGludmFsaWRhdGUgZm9sZGVyIGNhY2hlIGJlY2F1c2UgdW5yZWFkIGNvdW50cyBtYXkgaGF2ZSBjaGFuZ2VkXG4gICAgYXdhaXQgaW52YWxpZGF0ZUZvbGRlckNhY2hlKHVzZXJJZCwgZWZmZWN0aXZlQWNjb3VudElkLCBub3JtYWxpemVkRm9sZGVyKTtcbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFcnJvciBtYXJraW5nIGVtYWlsICR7ZW1haWxJZH0gYXMgJHtpc1JlYWQgPyAncmVhZCcgOiAndW5yZWFkJ30gaW4gZm9sZGVyICR7bm9ybWFsaXplZEZvbGRlcn0sIGFjY291bnQgJHtlZmZlY3RpdmVBY2NvdW50SWR9OmAsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5tYWlsYm94Q2xvc2UoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2xvc2luZyBtYWlsYm94OicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUb2dnbGUgYW4gZW1haWwncyBmbGFnZ2VkIChzdGFycmVkKSBzdGF0dXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUVtYWlsRmxhZyhcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGVtYWlsSWQ6IHN0cmluZyxcbiAgZmxhZ2dlZDogYm9vbGVhbixcbiAgZm9sZGVyOiBzdHJpbmcgPSAnSU5CT1gnLFxuICBhY2NvdW50SWQ/OiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBFeHRyYWN0IGFjY291bnQgSUQgZnJvbSBmb2xkZXIgbmFtZSBpZiBwcmVzZW50IGFuZCBub25lIHdhcyBleHBsaWNpdGx5IHByb3ZpZGVkXG4gIGNvbnN0IGZvbGRlckFjY291bnRJZCA9IGZvbGRlci5pbmNsdWRlcygnOicpID8gZm9sZGVyLnNwbGl0KCc6JylbMF0gOiBhY2NvdW50SWQ7XG4gIFxuICAvLyBVc2UgdGhlIG1vc3Qgc3BlY2lmaWMgYWNjb3VudCBJRCBhdmFpbGFibGVcbiAgY29uc3QgZWZmZWN0aXZlQWNjb3VudElkID0gZm9sZGVyQWNjb3VudElkIHx8IGFjY291bnRJZCB8fCAnZGVmYXVsdCc7XG4gIFxuICAvLyBOb3JtYWxpemUgZm9sZGVyIG5hbWUgYnkgcmVtb3ZpbmcgYWNjb3VudCBwcmVmaXggaWYgcHJlc2VudFxuICBjb25zdCBub3JtYWxpemVkRm9sZGVyID0gZm9sZGVyLmluY2x1ZGVzKCc6JykgPyBmb2xkZXIuc3BsaXQoJzonKVsxXSA6IGZvbGRlcjtcbiAgXG4gIGNvbnNvbGUubG9nKGBbdG9nZ2xlRW1haWxGbGFnXSBNYXJraW5nIGVtYWlsICR7ZW1haWxJZH0gYXMgJHtmbGFnZ2VkID8gJ2ZsYWdnZWQnIDogJ3VuZmxhZ2dlZCd9IGluIGZvbGRlciAke25vcm1hbGl6ZWRGb2xkZXJ9LCBhY2NvdW50ICR7ZWZmZWN0aXZlQWNjb3VudElkfWApO1xuICBcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgZ2V0SW1hcENvbm5lY3Rpb24odXNlcklkLCBlZmZlY3RpdmVBY2NvdW50SWQpO1xuICBcbiAgdHJ5IHtcbiAgICBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4obm9ybWFsaXplZEZvbGRlcik7XG4gICAgXG4gICAgaWYgKGZsYWdnZWQpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5tZXNzYWdlRmxhZ3NBZGQoZW1haWxJZCwgWydcXFxcRmxhZ2dlZCddKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgY2xpZW50Lm1lc3NhZ2VGbGFnc1JlbW92ZShlbWFpbElkLCBbJ1xcXFxGbGFnZ2VkJ10pO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbnZhbGlkYXRlIGNvbnRlbnQgY2FjaGUgc2luY2UgdGhlIGZsYWdzIGNoYW5nZWRcbiAgICBhd2FpdCBpbnZhbGlkYXRlRW1haWxDb250ZW50Q2FjaGUodXNlcklkLCBlZmZlY3RpdmVBY2NvdW50SWQsIGVtYWlsSWQpO1xuICAgIFxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHRvZ2dsaW5nIGZsYWcgZm9yIGVtYWlsICR7ZW1haWxJZH0gaW4gZm9sZGVyICR7bm9ybWFsaXplZEZvbGRlcn0sIGFjY291bnQgJHtlZmZlY3RpdmVBY2NvdW50SWR9OmAsIGVycm9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5tYWlsYm94Q2xvc2UoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgY2xvc2luZyBtYWlsYm94OicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRGVmaW5lIEVtYWlsQ29udGVudCBpbnRlcmZhY2VcbmludGVyZmFjZSBFbWFpbENvbnRlbnQge1xuICB0bzogc3RyaW5nO1xuICBjYz86IHN0cmluZztcbiAgYmNjPzogc3RyaW5nO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIHBsYWluVGV4dDogc3RyaW5nO1xuICBodG1sQ29udGVudDogc3RyaW5nO1xuICBhdHRhY2htZW50cz86IEFycmF5PHtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBjb250ZW50VHlwZTogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRFbWFpbChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGVtYWlsRGF0YToge1xuICAgIHRvOiBzdHJpbmc7XG4gICAgY2M/OiBzdHJpbmc7XG4gICAgYmNjPzogc3RyaW5nO1xuICAgIHN1YmplY3Q6IHN0cmluZztcbiAgICBib2R5OiBzdHJpbmc7XG4gICAgYXR0YWNobWVudHM/OiBBcnJheTx7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgfT47XG4gIH1cbik6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlSWQ/OiBzdHJpbmc7IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBnZXRVc2VyRW1haWxDcmVkZW50aWFscyh1c2VySWQpO1xuICBcbiAgaWYgKCFjcmVkZW50aWFscykge1xuICAgIHJldHVybiB7IFxuICAgICAgc3VjY2VzczogZmFsc2UsIFxuICAgICAgZXJyb3I6ICdObyBlbWFpbCBjcmVkZW50aWFscyBmb3VuZCcgXG4gICAgfTtcbiAgfVxuXG4gIC8vIENhc3QgdG8gZXh0ZW5kZWQgdHlwZVxuICBjb25zdCBleHRlbmRlZENyZWRzID0gY3JlZGVudGlhbHMgYXMgRW1haWxDcmVkZW50aWFsc0V4dGVuZGVkO1xuICBcbiAgLy8gQ29uZmlndXJlIFNNVFAgYXV0aCBiYXNlZCBvbiBPQXV0aCBvciBwYXNzd29yZFxuICBjb25zdCBzbXRwQXV0aCA9IGV4dGVuZGVkQ3JlZHMudXNlT0F1dGggJiYgZXh0ZW5kZWRDcmVkcy5hY2Nlc3NUb2tlblxuICAgID8ge1xuICAgICAgICB0eXBlOiAnT0F1dGgyJyxcbiAgICAgICAgdXNlcjogZXh0ZW5kZWRDcmVkcy5lbWFpbCxcbiAgICAgICAgYWNjZXNzVG9rZW46IGV4dGVuZGVkQ3JlZHMuYWNjZXNzVG9rZW5cbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgdXNlcjogZXh0ZW5kZWRDcmVkcy5lbWFpbCxcbiAgICAgICAgcGFzczogZXh0ZW5kZWRDcmVkcy5wYXNzd29yZFxuICAgICAgfTtcbiAgXG4gIC8vIENyZWF0ZSBTTVRQIHRyYW5zcG9ydGVyIHdpdGggdXNlcidzIFNNVFAgc2V0dGluZ3NcbiAgY29uc3QgdHJhbnNwb3J0ZXIgPSBub2RlbWFpbGVyLmNyZWF0ZVRyYW5zcG9ydCh7XG4gICAgaG9zdDogZXh0ZW5kZWRDcmVkcy5zbXRwX2hvc3QgfHwgJ3NtdHAuaW5mb21hbmlhay5jb20nLFxuICAgIHBvcnQ6IGV4dGVuZGVkQ3JlZHMuc210cF9wb3J0IHx8IDU4NyxcbiAgICBzZWN1cmU6IGV4dGVuZGVkQ3JlZHMuc210cF9zZWN1cmUgfHwgZmFsc2UsXG4gICAgYXV0aDogc210cEF1dGgsXG4gICAgdGxzOiB7XG4gICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXG4gICAgfVxuICB9IGFzIG5vZGVtYWlsZXIuVHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgdHJhbnNwb3J0ZXIuc2VuZE1haWwoe1xuICAgICAgZnJvbTogZXh0ZW5kZWRDcmVkcy5lbWFpbCxcbiAgICAgIHRvOiBlbWFpbERhdGEudG8sXG4gICAgICBjYzogZW1haWxEYXRhLmNjLFxuICAgICAgYmNjOiBlbWFpbERhdGEuYmNjLFxuICAgICAgc3ViamVjdDogZW1haWxEYXRhLnN1YmplY3QsXG4gICAgICB0ZXh0OiBlbWFpbERhdGEuYm9keSxcbiAgICAgIGh0bWw6IGVtYWlsRGF0YS5ib2R5LFxuICAgICAgYXR0YWNobWVudHM6IGVtYWlsRGF0YS5hdHRhY2htZW50cz8ubWFwKGF0dCA9PiAoe1xuICAgICAgICBmaWxlbmFtZTogYXR0Lm5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IGF0dC5jb250ZW50LFxuICAgICAgICBjb250ZW50VHlwZTogYXR0LnR5cGVcbiAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZUlkOiBpbmZvLm1lc3NhZ2VJZFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHNlbmQgZW1haWw6JywgZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgbGlzdCBvZiBtYWlsYm94ZXMgZnJvbSBhbiBJTUFQIGNvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1haWxib3hlcyhjbGllbnQ6IEltYXBGbG93LCBhY2NvdW50SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFpbGJveGVzID0gYXdhaXQgY2xpZW50Lmxpc3QoKTtcbiAgICBcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFjY291bnRJZCwgcHJlZml4IHRoZSBmb2xkZXIgbmFtZXMgdG8gcHJldmVudCBuYW1lc3BhY2UgY29sbGlzaW9uc1xuICAgIGlmIChhY2NvdW50SWQpIHtcbiAgICAgIHJldHVybiBtYWlsYm94ZXMubWFwKG1haWxib3ggPT4gYCR7YWNjb3VudElkfToke21haWxib3gucGF0aH1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHJldHVybiB1bnByZWZpeGVkIG5hbWVzIHdoZW4gbm8gYWNjb3VudElkXG4gICAgcmV0dXJuIG1haWxib3hlcy5tYXAobWFpbGJveCA9PiBtYWlsYm94LnBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIG1haWxib3hlczonLCBlcnJvcik7XG4gICAgLy8gUmV0dXJuIGVtcHR5IGFycmF5IG9uIGVycm9yIHRvIGF2b2lkIHNob3dpbmcgaW5jb3JyZWN0IGZvbGRlcnNcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0IElNQVAgYW5kIFNNVFAgY29ubmVjdGlvbnMgZm9yIGFuIGVtYWlsIGFjY291bnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RFbWFpbENvbm5lY3Rpb24oY3JlZGVudGlhbHM6IEVtYWlsQ3JlZGVudGlhbHMpOiBQcm9taXNlPHtcbiAgaW1hcDogYm9vbGVhbjtcbiAgc210cD86IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuICBmb2xkZXJzPzogc3RyaW5nW107XG59PiB7XG4gIC8vIENhc3QgdG8gZXh0ZW5kZWQgdHlwZSB0byB1c2UgT0F1dGggcHJvcGVydGllc1xuICBjb25zdCBleHRlbmRlZENyZWRzID0gY3JlZGVudGlhbHMgYXMgRW1haWxDcmVkZW50aWFsc0V4dGVuZGVkO1xuICBcbiAgY29uc29sZS5sb2coJ1Rlc3RpbmcgY29ubmVjdGlvbiB3aXRoOicsIHtcbiAgICAuLi5leHRlbmRlZENyZWRzLFxuICAgIHBhc3N3b3JkOiBleHRlbmRlZENyZWRzLnBhc3N3b3JkID8gJyoqKicgOiB1bmRlZmluZWQsXG4gICAgYWNjZXNzVG9rZW46IGV4dGVuZGVkQ3JlZHMuYWNjZXNzVG9rZW4gPyAnKioqJyA6IHVuZGVmaW5lZCxcbiAgICByZWZyZXNoVG9rZW46IGV4dGVuZGVkQ3JlZHMucmVmcmVzaFRva2VuID8gJyoqKicgOiB1bmRlZmluZWRcbiAgfSk7XG5cbiAgLy8gVGVzdCBJTUFQIGNvbm5lY3Rpb25cbiAgdHJ5IHtcbiAgICBjb25zb2xlLmxvZyhgVGVzdGluZyBJTUFQIGNvbm5lY3Rpb24gdG8gJHtleHRlbmRlZENyZWRzLmhvc3R9OiR7ZXh0ZW5kZWRDcmVkcy5wb3J0fSBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfWApO1xuICAgIFxuICAgIC8vIENvbmZpZ3VyZSBhdXRoIGJhc2VkIG9uIHdoZXRoZXIgd2UncmUgdXNpbmcgT0F1dGggb3IgcGFzc3dvcmRcbiAgICBsZXQgYXV0aFBhcmFtczogYW55O1xuICAgIFxuICAgIGlmIChleHRlbmRlZENyZWRzLnVzZU9BdXRoICYmIGV4dGVuZGVkQ3JlZHMuYWNjZXNzVG9rZW4pIHtcbiAgICAgIGNvbnNvbGUubG9nKCdVc2luZyBYT0FVVEgyIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbScpO1xuICAgICAgXG4gICAgICAvLyBGb3IgT0F1dGgsIHBhc3MgdGhlIGFjY2Vzc1Rva2VuIGRpcmVjdGx5IHRvIEltYXBGbG93XG4gICAgICBhdXRoUGFyYW1zID0ge1xuICAgICAgICB1c2VyOiBleHRlbmRlZENyZWRzLmVtYWlsLFxuICAgICAgICBhY2Nlc3NUb2tlbjogZXh0ZW5kZWRDcmVkcy5hY2Nlc3NUb2tlblxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHRoZSB0b2tlbiBsZW5ndGggdG8gdmVyaWZ5IGl0IGV4aXN0c1xuICAgICAgY29uc29sZS5sb2coYEFjY2VzcyB0b2tlbiBhdmFpbGFibGUgKGxlbmd0aDogJHtleHRlbmRlZENyZWRzLmFjY2Vzc1Rva2VuLmxlbmd0aH0pYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdVc2luZyBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20nKTtcbiAgICAgIGF1dGhQYXJhbXMgPSB7XG4gICAgICAgIHVzZXI6IGV4dGVuZGVkQ3JlZHMuZW1haWwsXG4gICAgICAgIHBhc3M6IGV4dGVuZGVkQ3JlZHMucGFzc3dvcmRcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBJbWFwRmxvdyh7XG4gICAgICBob3N0OiBleHRlbmRlZENyZWRzLmhvc3QsXG4gICAgICBwb3J0OiBleHRlbmRlZENyZWRzLnBvcnQsXG4gICAgICBzZWN1cmU6IGV4dGVuZGVkQ3JlZHMuc2VjdXJlID8/IHRydWUsXG4gICAgICBhdXRoOiBhdXRoUGFyYW1zLFxuICAgICAgbG9nZ2VyOiBmYWxzZSxcbiAgICAgIHRsczoge1xuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnQXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIElNQVAgc2VydmVyLi4uJyk7XG4gICAgYXdhaXQgY2xpZW50LmNvbm5lY3QoKTtcbiAgICBjb25zb2xlLmxvZygnSU1BUCBjb25uZWN0aW9uIHN1Y2Nlc3NmdWwhIEdldHRpbmcgbWFpbGJveGVzLi4uJyk7XG4gICAgXG4gICAgY29uc3QgZm9sZGVycyA9IGF3YWl0IGdldE1haWxib3hlcyhjbGllbnQpO1xuICAgIGF3YWl0IGNsaWVudC5sb2dvdXQoKTtcblxuICAgIGNvbnNvbGUubG9nKGBJTUFQIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfWApO1xuICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke2ZvbGRlcnMubGVuZ3RofSBmb2xkZXJzOmAsIGZvbGRlcnMpO1xuXG4gICAgLy8gVGVzdCBTTVRQIGNvbm5lY3Rpb24gaWYgU01UUCBzZXR0aW5ncyBhcmUgcHJvdmlkZWRcbiAgICBsZXQgc210cFN1Y2Nlc3MgPSBmYWxzZTtcbiAgICBpZiAoZXh0ZW5kZWRDcmVkcy5zbXRwX2hvc3QgJiYgZXh0ZW5kZWRDcmVkcy5zbXRwX3BvcnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBUZXN0aW5nIFNNVFAgY29ubmVjdGlvbiB0byAke2V4dGVuZGVkQ3JlZHMuc210cF9ob3N0fToke2V4dGVuZGVkQ3JlZHMuc210cF9wb3J0fWApO1xuICAgICAgICBcbiAgICAgICAgLy8gQ29uZmlndXJlIFNNVFAgYXV0aCBiYXNlZCBvbiBPQXV0aCBvciBwYXNzd29yZFxuICAgICAgICBjb25zdCBzbXRwQXV0aCA9IGV4dGVuZGVkQ3JlZHMudXNlT0F1dGggJiYgZXh0ZW5kZWRDcmVkcy5hY2Nlc3NUb2tlblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB0eXBlOiAnT0F1dGgyJyxcbiAgICAgICAgICAgICAgdXNlcjogZXh0ZW5kZWRDcmVkcy5lbWFpbCxcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IGV4dGVuZGVkQ3JlZHMuYWNjZXNzVG9rZW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgdXNlcjogZXh0ZW5kZWRDcmVkcy5lbWFpbCxcbiAgICAgICAgICAgICAgcGFzczogZXh0ZW5kZWRDcmVkcy5wYXNzd29yZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0cmFuc3BvcnRlciA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcbiAgICAgICAgICBob3N0OiBleHRlbmRlZENyZWRzLnNtdHBfaG9zdCxcbiAgICAgICAgICBwb3J0OiBleHRlbmRlZENyZWRzLnNtdHBfcG9ydCxcbiAgICAgICAgICBzZWN1cmU6IGV4dGVuZGVkQ3JlZHMuc210cF9zZWN1cmUgPz8gZmFsc2UsXG4gICAgICAgICAgYXV0aDogc210cEF1dGgsXG4gICAgICAgICAgdGxzOiB7XG4gICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIG5vZGVtYWlsZXIuVHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgICAgICAgYXdhaXQgdHJhbnNwb3J0ZXIudmVyaWZ5KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTTVRQIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfWApO1xuICAgICAgICBzbXRwU3VjY2VzcyA9IHRydWU7XG4gICAgICB9IGNhdGNoIChzbXRwRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgU01UUCBjb25uZWN0aW9uIGZhaWxlZCBmb3IgJHtleHRlbmRlZENyZWRzLmVtYWlsfTpgLCBzbXRwRXJyb3IpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGltYXA6IHRydWUsXG4gICAgICAgICAgc210cDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IGBTTVRQIGNvbm5lY3Rpb24gZmFpbGVkOiAke3NtdHBFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gc210cEVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCxcbiAgICAgICAgICBmb2xkZXJzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGltYXA6IHRydWUsXG4gICAgICBzbXRwOiBzbXRwU3VjY2VzcyxcbiAgICAgIGZvbGRlcnNcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYElNQVAgY29ubmVjdGlvbiBmYWlsZWQgZm9yICR7ZXh0ZW5kZWRDcmVkcy5lbWFpbH06YCwgZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBpbWFwOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgSU1BUCBjb25uZWN0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgfTtcbiAgfVxufSJdLCJuYW1lcyI6WyJJbWFwRmxvdyIsIm5vZGVtYWlsZXIiLCJwcmlzbWEiLCJzaW1wbGVQYXJzZXIiLCJjYWNoZUVtYWlsQ3JlZGVudGlhbHMiLCJnZXRDYWNoZWRFbWFpbENyZWRlbnRpYWxzIiwiY2FjaGVFbWFpbExpc3QiLCJjYWNoZUVtYWlsQ29udGVudCIsImdldENhY2hlZEVtYWlsQ29udGVudCIsImNhY2hlSW1hcFNlc3Npb24iLCJnZXRDYWNoZWRJbWFwU2Vzc2lvbiIsImludmFsaWRhdGVGb2xkZXJDYWNoZSIsImludmFsaWRhdGVFbWFpbENvbnRlbnRDYWNoZSIsImVuc3VyZUZyZXNoVG9rZW4iLCJjb25uZWN0aW9uUG9vbCIsInRvdGFsQ29ubmVjdGlvblJlcXVlc3RzIiwidG90YWxOZXdDb25uZWN0aW9ucyIsInRvdGFsUmV1c2VDb25uZWN0aW9ucyIsInRvdGFsQ29ubmVjdGlvbkVycm9ycyIsImxhc3RNZXRyaWNzUmVzZXQiLCJEYXRlIiwibm93IiwiQ09OTkVDVElPTl9USU1FT1VUIiwiTUFYX1BPT0xfU0laRSIsIkNPTk5FQ1RJT05fQ0hFQ0tfSU5URVJWQUwiLCJNSU5fUE9PTF9TSVpFIiwic2V0SW50ZXJ2YWwiLCJjb25uZWN0aW9uS2V5cyIsIk9iamVjdCIsImtleXMiLCJjb25zb2xlIiwibG9nIiwidG9GaXhlZCIsImNvbm5lY3Rpb25zQnlVc2VyIiwiZm9yRWFjaCIsImtleSIsInVzZXJJZCIsInNwbGl0IiwicHVzaCIsImVudHJpZXMiLCJ1c2VyQ29ubmVjdGlvbnMiLCJzb3J0ZWRDb25uZWN0aW9ucyIsIm1hcCIsImxhc3RVc2VkIiwic29ydCIsImEiLCJiIiwiY29ubmVjdGlvbnNUb0tlZXAiLCJzbGljZSIsImtlZXBLZXlzIiwiU2V0IiwiY29ubiIsImhhcyIsImlzQ29ubmVjdGluZyIsIk1hdGgiLCJyb3VuZCIsImNsaWVudCIsInVzYWJsZSIsImxvZ291dCIsImNhdGNoIiwiZXJyIiwiZXJyb3IiLCJsZW5ndGgiLCJhY3RpdmVDb3VudCIsImZpbHRlciIsImNvbm5lY3RpbmdDb3VudCIsImdldEltYXBDb25uZWN0aW9uIiwiYWNjb3VudElkIiwic3RhcnRUaW1lIiwic2Vzc2lvbkRhdGEiLCJkZWZhdWx0QWNjb3VudElkIiwiYWNjb3VudHMiLCJtYWlsQ3JlZGVudGlhbHMiLCJmaW5kTWFueSIsIndoZXJlIiwib3JkZXJCeSIsImNyZWF0ZWRBdCIsInRha2UiLCJmaXJzdEFjY291bnQiLCJpZCIsImVtYWlsIiwibGFzdEFjdGl2ZSIsIkVycm9yIiwiY29ubmVjdGlvbktleSIsImNvbm5lY3Rpb24iLCJjb25uZWN0aW9uUHJvbWlzZSIsInVwZGF0ZVNlc3Npb25EYXRhIiwid2FybiIsImNyZWRlbnRpYWxzIiwiaGFzUGFzc3dvcmQiLCJwYXNzd29yZCIsInVzZU9BdXRoIiwiaGFzQWNjZXNzVG9rZW4iLCJhY2Nlc3NUb2tlbiIsImhhc1JlZnJlc2hUb2tlbiIsInJlZnJlc2hUb2tlbiIsImRiQ3JlZGVudGlhbHMiLCJmaW5kRmlyc3QiLCJBTkQiLCJmaWVsZHMiLCJob3N0IiwicG9ydCIsInNlY3VyZSIsInNtdHBfaG9zdCIsInVuZGVmaW5lZCIsInNtdHBfcG9ydCIsInNtdHBfc2VjdXJlIiwiZGlzcGxheV9uYW1lIiwiY29sb3IiLCJleHRlbmRlZENyZWRzIiwiY2FjaGVkQ3JlZHMiLCJ0b2tlbkV4cGlyeSIsInN1Y2Nlc3MiLCJjb25uZWN0aW9uQXR0ZW1wdHMiLCJjb25uZWN0aW9uVGltZW91dCIsInNldFRpbWVvdXQiLCJjcmVhdGVJbWFwQ29ubmVjdGlvbiIsInRoZW4iLCJjbGVhclRpbWVvdXQiLCJtZXNzYWdlIiwiaGFzVG9rZW5FeHBpcnkiLCJhdXRoUGFyYW1zIiwidXNlciIsInBhc3MiLCJhdXRoIiwibG9nZ2VyIiwiZW1pdExvZ3MiLCJ0bHMiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJkaXNhYmxlQXV0b0lkbGUiLCJjb25uZWN0Iiwib24iLCJnZXRVc2VyRW1haWxDcmVkZW50aWFscyIsInNhdmVVc2VyRW1haWxDcmVkZW50aWFscyIsIm9hdXRoRGF0YSIsImhhc09BdXRoIiwidXBzZXJ0Iiwic2VsZWN0IiwicmVzdWx0IiwidXBkYXRlIiwiY3JlYXRlIiwiZnVsbENyZWRzIiwiZ2V0RW1haWxzIiwiZm9sZGVyIiwicGFnZSIsInBlclBhZ2UiLCJjaGVja09ubHkiLCJyZXNvbHZlZEFjY291bnRJZCIsIm1haWxib3hJbmZvIiwibWFpbGJveE9wZW4iLCJleGlzdHMiLCJtYWlsYm94ZXMiLCJnZXRNYWlsYm94ZXMiLCJ0b3RhbEVtYWlscyIsInRvdGFsUGFnZXMiLCJjZWlsIiwiZW1wdHlSZXN1bHQiLCJlbWFpbHMiLCJuZXdlc3RFbWFpbElkIiwibGFzdE1lc3NhZ2VTZXF1ZW5jZSIsInRvU3RyaW5nIiwibWVzc2FnZXMiLCJmZXRjaCIsInVpZCIsInN0YXJ0IiwibWF4IiwiZW5kIiwiZW52ZWxvcGUiLCJmbGFncyIsImJvZHlTdHJ1Y3R1cmUiLCJmcm9tIiwiYWRkciIsIm5hbWUiLCJhZGRyZXNzIiwidG8iLCJzdWJqZWN0IiwiZGF0ZSIsInNlZW4iLCJmbGFnZ2VkIiwiYW5zd2VyZWQiLCJkcmFmdCIsImRlbGV0ZWQiLCJzaXplIiwiaGFzQXR0YWNobWVudHMiLCJjaGlsZE5vZGVzIiwic29tZSIsIm5vZGUiLCJkaXNwb3NpdGlvbiIsImNvbnRlbnRGZXRjaGVkIiwiY29udGVudCIsInRleHQiLCJodG1sIiwiaXNIdG1sIiwiZGlyZWN0aW9uIiwibWFwQWRkcmVzc2VzIiwiYWRkcmVzc2VzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0RW1haWxDb250ZW50IiwiZW1haWxJZCIsInRlc3QiLCJudW1lcmljSWQiLCJwYXJzZUludCIsImlzTmFOIiwiZm9sZGVyQWNjb3VudElkIiwiaW5jbHVkZXMiLCJlZmZlY3RpdmVBY2NvdW50SWQiLCJub3JtYWxpemVkRm9sZGVyIiwiY2FjaGVkRW1haWwiLCJtYWlsYm94IiwidWlkVmFsaWRpdHkiLCJ1aWROZXh0Iiwic2VhcmNoUmVzdWx0Iiwic2VhcmNoIiwic2VxdWVuY2VOdW1iZXIiLCJmZXRjaE9uZSIsInNvdXJjZSIsImZldGNoRXJyb3IiLCJwYXJzZWRFbWFpbCIsInNraXBIdG1sVG9UZXh0Iiwia2VlcENpZExpbmtzIiwicGFyc2VFcnJvciIsImZsYWdzQXJyYXkiLCJyYXdIdG1sIiwibWVzc2FnZUlkIiwiY2MiLCJiY2MiLCJhdHRhY2htZW50cyIsImF0dCIsImZpbGVuYW1lIiwiY29udGVudFR5cGUiLCJkZXRhaWxzIiwic3RhY2siLCJtYWlsYm94Q2xvc2UiLCJtYXJrRW1haWxSZWFkU3RhdHVzIiwiaXNSZWFkIiwibWVzc2FnZUZsYWdzQWRkIiwibWVzc2FnZUZsYWdzUmVtb3ZlIiwidG9nZ2xlRW1haWxGbGFnIiwic2VuZEVtYWlsIiwiZW1haWxEYXRhIiwic210cEF1dGgiLCJ0eXBlIiwidHJhbnNwb3J0ZXIiLCJjcmVhdGVUcmFuc3BvcnQiLCJpbmZvIiwic2VuZE1haWwiLCJib2R5IiwibGlzdCIsInBhdGgiLCJ0ZXN0RW1haWxDb25uZWN0aW9uIiwiZm9sZGVycyIsInNtdHBTdWNjZXNzIiwidmVyaWZ5Iiwic210cEVycm9yIiwiaW1hcCIsInNtdHAiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./lib/services/email-service.ts\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./lib/services/microsoft-oauth.ts":
|
|
/*!*****************************************!*\
|
|
!*** ./lib/services/microsoft-oauth.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 */ createXOAuth2Token: () => (/* binding */ createXOAuth2Token),\n/* harmony export */ exchangeCodeForTokens: () => (/* binding */ exchangeCodeForTokens),\n/* harmony export */ getMicrosoftAuthUrl: () => (/* binding */ getMicrosoftAuthUrl),\n/* harmony export */ refreshAccessToken: () => (/* binding */ refreshAccessToken)\n/* harmony export */ });\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! axios */ \"(rsc)/./node_modules/axios/lib/axios.js\");\n\n// Get tenant ID from env var or use a default\nconst tenantId = process.env.MICROSOFT_TENANT_ID || 'common'; // Use 'organizations' or actual tenant ID\n// Microsoft OAuth URLs with configurable tenant\nconst MICROSOFT_AUTHORIZE_URL = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/authorize`;\nconst MICROSOFT_TOKEN_URL = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;\n// Client configuration from environment variables\nconst clientId = process.env.MICROSOFT_CLIENT_ID;\nconst clientSecret = process.env.MICROSOFT_CLIENT_SECRET;\nconst redirectUri = process.env.MICROSOFT_REDIRECT_URI;\n// Log configuration for debugging\nconsole.log('Microsoft OAuth Configuration:', {\n tenantId,\n authorizeUrl: MICROSOFT_AUTHORIZE_URL,\n tokenUrl: MICROSOFT_TOKEN_URL,\n clientIdFirstChars: clientId ? clientId.substring(0, 5) + '...' : 'undefined',\n redirectUri\n});\n// Required scopes for IMAP and SMTP access\nconst REQUIRED_SCOPES = [\n 'offline_access',\n 'https://outlook.office.com/IMAP.AccessAsUser.All',\n 'https://outlook.office.com/SMTP.Send'\n].join(' ');\n/**\n * Generates the authorization URL for Microsoft OAuth\n */ function getMicrosoftAuthUrl(state) {\n const params = new URLSearchParams({\n client_id: clientId,\n response_type: 'code',\n redirect_uri: redirectUri,\n scope: REQUIRED_SCOPES,\n state,\n response_mode: 'query'\n });\n return `${MICROSOFT_AUTHORIZE_URL}?${params.toString()}`;\n}\n/**\n * Exchange authorization code for tokens\n */ async function exchangeCodeForTokens(code) {\n const params = new URLSearchParams({\n client_id: clientId,\n client_secret: clientSecret,\n code,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code'\n });\n try {\n console.log(`Exchanging code for tokens. URL: ${MICROSOFT_TOKEN_URL}`);\n const response = await axios__WEBPACK_IMPORTED_MODULE_0__[\"default\"].post(MICROSOFT_TOKEN_URL, params.toString(), {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n console.log('Token exchange successful!');\n return {\n access_token: response.data.access_token,\n refresh_token: response.data.refresh_token,\n expires_in: response.data.expires_in\n };\n } catch (error) {\n console.error('Error exchanging code for tokens:', error);\n // Enhanced error logging\n if (error.response) {\n console.error('Response data:', error.response.data);\n console.error('Response status:', error.response.status);\n console.error('Response headers:', error.response.headers);\n // Extract the error message from Microsoft's response format\n const errorData = error.response.data;\n if (errorData && errorData.error_description) {\n throw new Error(`Token exchange failed: ${errorData.error_description}`);\n }\n }\n throw new Error('Failed to exchange authorization code for tokens');\n }\n}\n/**\n * Refresh an access token using a refresh token\n */ async function refreshAccessToken(refreshToken) {\n const params = new URLSearchParams({\n client_id: clientId,\n client_secret: clientSecret,\n refresh_token: refreshToken,\n grant_type: 'refresh_token',\n scope: REQUIRED_SCOPES\n });\n try {\n console.log(`Refreshing access token. URL: ${MICROSOFT_TOKEN_URL}`);\n const response = await axios__WEBPACK_IMPORTED_MODULE_0__[\"default\"].post(MICROSOFT_TOKEN_URL, params.toString(), {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n });\n console.log('Token refresh successful!');\n return {\n access_token: response.data.access_token,\n refresh_token: response.data.refresh_token,\n expires_in: response.data.expires_in\n };\n } catch (error) {\n console.error('Error refreshing token:', error);\n // Enhanced error logging\n if (error.response) {\n console.error('Response data:', error.response.data);\n console.error('Response status:', error.response.status);\n console.error('Response headers:', error.response.headers);\n // Extract the error message from Microsoft's response format\n const errorData = error.response.data;\n if (errorData && errorData.error_description) {\n throw new Error(`Token refresh failed: ${errorData.error_description}`);\n }\n }\n throw new Error('Failed to refresh access token');\n }\n}\n/**\n * Create special XOAUTH2 string for IMAP authentication\n */ function createXOAuth2Token(email, accessToken) {\n // This creates the XOAUTH2 token in the required format for ImapFlow\n // Format: user=<email>\\x01auth=Bearer <token>\\x01\\x01\n const auth = `user=${email}\\x01auth=Bearer ${accessToken}\\x01\\x01`;\n const base64Auth = Buffer.from(auth).toString('base64');\n console.log('Generated XOAUTH2 token (length):', base64Auth.length);\n return base64Auth;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9saWIvc2VydmljZXMvbWljcm9zb2Z0LW9hdXRoLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQTBCO0FBRTFCLDhDQUE4QztBQUM5QyxNQUFNQyxXQUFXQyxRQUFRQyxHQUFHLENBQUNDLG1CQUFtQixJQUFJLFVBQVUsMENBQTBDO0FBRXhHLGdEQUFnRDtBQUNoRCxNQUFNQywwQkFBMEIsQ0FBQyxrQ0FBa0MsRUFBRUosU0FBUyxzQkFBc0IsQ0FBQztBQUNyRyxNQUFNSyxzQkFBc0IsQ0FBQyxrQ0FBa0MsRUFBRUwsU0FBUyxrQkFBa0IsQ0FBQztBQUU3RixrREFBa0Q7QUFDbEQsTUFBTU0sV0FBV0wsUUFBUUMsR0FBRyxDQUFDSyxtQkFBbUI7QUFDaEQsTUFBTUMsZUFBZVAsUUFBUUMsR0FBRyxDQUFDTyx1QkFBdUI7QUFDeEQsTUFBTUMsY0FBY1QsUUFBUUMsR0FBRyxDQUFDUyxzQkFBc0I7QUFFdEQsa0NBQWtDO0FBQ2xDQyxRQUFRQyxHQUFHLENBQUMsa0NBQWtDO0lBQzVDYjtJQUNBYyxjQUFjVjtJQUNkVyxVQUFVVjtJQUNWVyxvQkFBb0JWLFdBQVdBLFNBQVNXLFNBQVMsQ0FBQyxHQUFHLEtBQUssUUFBUTtJQUNsRVA7QUFDRjtBQUVBLDJDQUEyQztBQUMzQyxNQUFNUSxrQkFBa0I7SUFDdEI7SUFDQTtJQUNBO0NBQ0QsQ0FBQ0MsSUFBSSxDQUFDO0FBRVA7O0NBRUMsR0FDTSxTQUFTQyxvQkFBb0JDLEtBQWE7SUFDL0MsTUFBTUMsU0FBUyxJQUFJQyxnQkFBZ0I7UUFDakNDLFdBQVdsQjtRQUNYbUIsZUFBZTtRQUNmQyxjQUFjaEI7UUFDZGlCLE9BQU9UO1FBQ1BHO1FBQ0FPLGVBQWU7SUFDakI7SUFFQSxPQUFPLEdBQUd4Qix3QkFBd0IsQ0FBQyxFQUFFa0IsT0FBT08sUUFBUSxJQUFJO0FBQzFEO0FBRUE7O0NBRUMsR0FDTSxlQUFlQyxzQkFBc0JDLElBQVk7SUFLdEQsTUFBTVQsU0FBUyxJQUFJQyxnQkFBZ0I7UUFDakNDLFdBQVds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TUMsT0FBTyxDQUFDLEtBQUssRUFBRUYsTUFBTSxnQkFBZ0IsRUFBRUMsWUFBWSxRQUFRLENBQUM7SUFDbEUsTUFBTUUsYUFBYUMsT0FBT0MsSUFBSSxDQUFDSCxNQUFNdEIsUUFBUSxDQUFDO0lBRTlDakIsUUFBUUMsR0FBRyxDQUFDLHFDQUFxQ3VDLFdBQVdHLE1BQU07SUFDbEUsT0FBT0g7QUFDVCIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvc2VydmljZXMvbWljcm9zb2Z0LW9hdXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbi8vIEdldCB0ZW5hbnQgSUQgZnJvbSBlbnYgdmFyIG9yIHVzZSBhIGRlZmF1bHRcbmNvbnN0IHRlbmFudElkID0gcHJvY2Vzcy5lbnYuTUlDUk9TT0ZUX1RFTkFOVF9JRCB8fCAnY29tbW9uJzsgLy8gVXNlICdvcmdhbml6YXRpb25zJyBvciBhY3R1YWwgdGVuYW50IElEXG5cbi8vIE1pY3Jvc29mdCBPQXV0aCBVUkxzIHdpdGggY29uZmlndXJhYmxlIHRlbmFudFxuY29uc3QgTUlDUk9TT0ZUX0FVVEhPUklaRV9VUkwgPSBgaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tLyR7dGVuYW50SWR9L29hdXRoMi92Mi4wL2F1dGhvcml6ZWA7XG5jb25zdCBNSUNST1NPRlRfVE9LRU5fVVJMID0gYGh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS8ke3RlbmFudElkfS9vYXV0aDIvdjIuMC90b2tlbmA7XG5cbi8vIENsaWVudCBjb25maWd1cmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG5jb25zdCBjbGllbnRJZCA9IHByb2Nlc3MuZW52Lk1JQ1JPU09GVF9DTElFTlRfSUQ7XG5jb25zdCBjbGllbnRTZWNyZXQgPSBwcm9jZXNzLmVudi5NSUNST1NPRlRfQ0xJRU5UX1NFQ1JFVDtcbmNvbnN0IHJlZGlyZWN0VXJpID0gcHJvY2Vzcy5lbnYuTUlDUk9TT0ZUX1JFRElSRUNUX1VSSTtcblxuLy8gTG9nIGNvbmZpZ3VyYXRpb24gZm9yIGRlYnVnZ2luZ1xuY29uc29sZS5sb2coJ01pY3Jvc29mdCBPQXV0aCBDb25maWd1cmF0aW9uOicsIHtcbiAgdGVuYW50SWQsXG4gIGF1dGhvcml6ZVVybDogTUlDUk9TT0ZUX0FVVEhPUklaRV9VUkwsXG4gIHRva2VuVXJsOiBNSUNST1NPRlRfVE9LRU5fVVJMLFxuICBjbGllbnRJZEZpcnN0Q2hhcnM6IGNsaWVudElkID8gY2xpZW50SWQuc3Vic3RyaW5nKDAsIDUpICsgJy4uLicgOiAndW5kZWZpbmVkJyxcbiAgcmVkaXJlY3RVcmlcbn0pO1xuXG4vLyBSZXF1aXJlZCBzY29wZXMgZm9yIElNQVAgYW5kIFNNVFAgYWNjZXNzXG5jb25zdCBSRVFVSVJFRF9TQ09QRVMgPSBbXG4gICdvZmZsaW5lX2FjY2VzcycsXG4gICdodHRwczovL291dGxvb2sub2ZmaWNlLmNvbS9JTUFQLkFjY2Vzc0FzVXNlci5BbGwnLFxuICAnaHR0cHM6Ly9vdXRsb29rLm9mZmljZS5jb20vU01UUC5TZW5kJ1xuXS5qb2luKCcgJyk7XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBhdXRob3JpemF0aW9uIFVSTCBmb3IgTWljcm9zb2Z0IE9BdXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWNyb3NvZnRBdXRoVXJsKHN0YXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICBjbGllbnRfaWQ6IGNsaWVudElkISxcbiAgICByZXNwb25zZV90eXBlOiAnY29kZScsXG4gICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSEsXG4gICAgc2NvcGU6IFJFUVVJUkVEX1NDT1BFUyxcbiAgICBzdGF0ZSxcbiAgICByZXNwb25zZV9tb2RlOiAncXVlcnknXG4gIH0pO1xuXG4gIHJldHVybiBgJHtNSUNST1NPRlRfQVVUSE9SSVpFX1VSTH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xufVxuXG4vKipcbiAqIEV4Y2hhbmdlIGF1dGhvcml6YXRpb24gY29kZSBmb3IgdG9rZW5zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGNoYW5nZUNvZGVGb3JUb2tlbnMoY29kZTogc3RyaW5nKTogUHJvbWlzZTx7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gIGV4cGlyZXNfaW46IG51bWJlcjtcbn0+IHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgY2xpZW50X2lkOiBjbGllbnRJZCEsXG4gICAgY2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0ISxcbiAgICBjb2RlLFxuICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmkhLFxuICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coYEV4Y2hhbmdpbmcgY29kZSBmb3IgdG9rZW5zLiBVUkw6ICR7TUlDUk9TT0ZUX1RPS0VOX1VSTH1gKTtcbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoTUlDUk9TT0ZUX1RPS0VOX1VSTCwgcGFyYW1zLnRvU3RyaW5nKCksIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnVG9rZW4gZXhjaGFuZ2Ugc3VjY2Vzc2Z1bCEnKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzX3Rva2VuOiByZXNwb25zZS5kYXRhLmFjY2Vzc190b2tlbixcbiAgICAgIHJlZnJlc2hfdG9rZW46IHJlc3BvbnNlLmRhdGEucmVmcmVzaF90b2tlbixcbiAgICAgIGV4cGlyZXNfaW46IHJlc3BvbnNlLmRhdGEuZXhwaXJlc19pblxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBleGNoYW5naW5nIGNvZGUgZm9yIHRva2VuczonLCBlcnJvcik7XG4gICAgXG4gICAgLy8gRW5oYW5jZWQgZXJyb3IgbG9nZ2luZ1xuICAgIGlmIChlcnJvci5yZXNwb25zZSkge1xuICAgICAgY29uc29sZS5lcnJvcignUmVzcG9uc2UgZGF0YTonLCBlcnJvci5yZXNwb25zZS5kYXRhKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Jlc3BvbnNlIHN0YXR1czonLCBlcnJvci5yZXNwb25zZS5zdGF0dXMpO1xuICAgICAgY29uc29sZS5lcnJvcignUmVzcG9uc2UgaGVhZGVyczonLCBlcnJvci5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIFxuICAgICAgLy8gRXh0cmFjdCB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIE1pY3Jvc29mdCdzIHJlc3BvbnNlIGZvcm1hdFxuICAgICAgY29uc3QgZXJyb3JEYXRhID0gZXJyb3IucmVzcG9uc2UuZGF0YTtcbiAgICAgIGlmIChlcnJvckRhdGEgJiYgZXJyb3JEYXRhLmVycm9yX2Rlc2NyaXB0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4gZXhjaGFuZ2UgZmFpbGVkOiAke2Vycm9yRGF0YS5lcnJvcl9kZXNjcmlwdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZXhjaGFuZ2UgYXV0aG9yaXphdGlvbiBjb2RlIGZvciB0b2tlbnMnKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZnJlc2ggYW4gYWNjZXNzIHRva2VuIHVzaW5nIGEgcmVmcmVzaCB0b2tlblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEFjY2Vzc1Rva2VuKHJlZnJlc2hUb2tlbjogc3RyaW5nKTogUHJvbWlzZTx7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICByZWZyZXNoX3Rva2VuPzogc3RyaW5nO1xuICBleHBpcmVzX2luOiBudW1iZXI7XG59PiB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGNsaWVudF9pZDogY2xpZW50SWQhLFxuICAgIGNsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldCEsXG4gICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICBzY29wZTogUkVRVUlSRURfU0NPUEVTXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coYFJlZnJlc2hpbmcgYWNjZXNzIHRva2VuLiBVUkw6ICR7TUlDUk9TT0ZUX1RPS0VOX1VSTH1gKTtcbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoTUlDUk9TT0ZUX1RPS0VOX1VSTCwgcGFyYW1zLnRvU3RyaW5nKCksIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnVG9rZW4gcmVmcmVzaCBzdWNjZXNzZnVsIScpO1xuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NfdG9rZW46IHJlc3BvbnNlLmRhdGEuYWNjZXNzX3Rva2VuLFxuICAgICAgcmVmcmVzaF90b2tlbjogcmVzcG9uc2UuZGF0YS5yZWZyZXNoX3Rva2VuLFxuICAgICAgZXhwaXJlc19pbjogcmVzcG9uc2UuZGF0YS5leHBpcmVzX2luXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgdG9rZW46JywgZXJyb3IpO1xuICAgIFxuICAgIC8vIEVuaGFuY2VkIGVycm9yIGxvZ2dpbmdcbiAgICBpZiAoZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Jlc3BvbnNlIGRhdGE6JywgZXJyb3IucmVzcG9uc2UuZGF0YSk7XG4gICAgICBjb25zb2xlLmVycm9yKCdSZXNwb25zZSBzdGF0dXM6JywgZXJyb3IucmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Jlc3BvbnNlIGhlYWRlcnM6JywgZXJyb3IucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICBcbiAgICAgIC8vIEV4dHJhY3QgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSBNaWNyb3NvZnQncyByZXNwb25zZSBmb3JtYXRcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGVycm9yLnJlc3BvbnNlLmRhdGE7XG4gICAgICBpZiAoZXJyb3JEYXRhICYmIGVycm9yRGF0YS5lcnJvcl9kZXNjcmlwdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRva2VuIHJlZnJlc2ggZmFpbGVkOiAke2Vycm9yRGF0YS5lcnJvcl9kZXNjcmlwdGlvbn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCBhY2Nlc3MgdG9rZW4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBzcGVjaWFsIFhPQVVUSDIgc3RyaW5nIGZvciBJTUFQIGF1dGhlbnRpY2F0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVYT0F1dGgyVG9rZW4oZW1haWw6IHN0cmluZywgYWNjZXNzVG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoaXMgY3JlYXRlcyB0aGUgWE9BVVRIMiB0b2tlbiBpbiB0aGUgcmVxdWlyZWQgZm9ybWF0IGZvciBJbWFwRmxvd1xuICAvLyBGb3JtYXQ6IHVzZXI9PGVtYWlsPlxceDAxYXV0aD1CZWFyZXIgPHRva2VuPlxceDAxXFx4MDFcbiAgY29uc3QgYXV0aCA9IGB1c2VyPSR7ZW1haWx9XFx4MDFhdXRoPUJlYXJlciAke2FjY2Vzc1Rva2VufVxceDAxXFx4MDFgO1xuICBjb25zdCBiYXNlNjRBdXRoID0gQnVmZmVyLmZyb20oYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICBcbiAgY29uc29sZS5sb2coJ0dlbmVyYXRlZCBYT0FVVEgyIHRva2VuIChsZW5ndGgpOicsIGJhc2U2NEF1dGgubGVuZ3RoKTtcbiAgcmV0dXJuIGJhc2U2NEF1dGg7XG59ICJdLCJuYW1lcyI6WyJheGlvcyIsInRlbmFudElkIiwicHJvY2VzcyIsImVudiIsIk1JQ1JPU09GVF9URU5BTlRfSUQiLCJNSUNST1NPRlRfQVVUSE9SSVpFX1VSTCIsIk1JQ1JPU09GVF9UT0tFTl9VUkwiLCJjbGllbnRJZCIsIk1JQ1JPU09GVF9DTElFTlRfSUQiLCJjbGllbnRTZWNyZXQiLCJNSUNST1NPRlRfQ0xJRU5UX1NFQ1JFVCIsInJlZGlyZWN0VXJpIiwiTUlDUk9TT0ZUX1JFRElSRUNUX1VSSSIsImNvbnNvbGUiLCJsb2ciLCJhdXRob3JpemVVcmwiLCJ0b2tlblVybCIsImNsaWVudElkRmlyc3RDaGFycyIsInN1YnN0cmluZyIsIlJFUVVJUkVEX1NDT1BFUyIsImpvaW4iLCJnZXRNaWNyb3NvZnRBdXRoVXJsIiwic3RhdGUiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJjbGllbnRfaWQiLCJyZXNwb25zZV90eXBlIiwicmVkaXJlY3RfdXJpIiwic2NvcGUiLCJyZXNwb25zZV9tb2RlIiwidG9TdHJpbmciLCJleGNoYW5nZUNvZGVGb3JUb2tlbnMiLCJjb2RlIiwiY2xpZW50X3NlY3JldCIsImdyYW50X3R5cGUiLCJyZXNwb25zZSIsInBvc3QiLCJoZWFkZXJzIiwiYWNjZXNzX3Rva2VuIiwiZGF0YSIsInJlZnJlc2hfdG9rZW4iLCJleHBpcmVzX2luIiwiZXJyb3IiLCJzdGF0dXMiLCJlcnJvckRhdGEiLCJlcnJvcl9kZXNjcmlwdGlvbiIsIkVycm9yIiwicmVmcmVzaEFjY2Vzc1Rva2VuIiwicmVmcmVzaFRva2VuIiwiY3JlYXRlWE9BdXRoMlRva2VuIiwiZW1haWwiLCJhY2Nlc3NUb2tlbiIsImF1dGgiLCJiYXNlNjRBdXRoIiwiQnVmZmVyIiwiZnJvbSIsImxlbmd0aCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./lib/services/microsoft-oauth.ts\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./lib/services/token-refresh.ts":
|
|
/*!***************************************!*\
|
|
!*** ./lib/services/token-refresh.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 */ ensureFreshToken: () => (/* binding */ ensureFreshToken),\n/* harmony export */ isTokenExpired: () => (/* binding */ isTokenExpired)\n/* harmony export */ });\n/* harmony import */ var _microsoft_oauth__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./microsoft-oauth */ \"(rsc)/./lib/services/microsoft-oauth.ts\");\n/* harmony import */ var _lib_redis__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/redis */ \"(rsc)/./lib/redis.ts\");\n\n\n/**\n * Check if a token is expired or about to expire (within 5 minutes)\n */ function isTokenExpired(expiryTimestamp) {\n const fiveMinutesInMs = 5 * 60 * 1000;\n return Date.now() + fiveMinutesInMs >= expiryTimestamp;\n}\n/**\n * Refresh an access token if it's expired or about to expire\n */ async function ensureFreshToken(userId, email) {\n try {\n // Use Redis to get the tokens (no database lookup needed)\n console.log(`Checking if token refresh is needed for ${email}`);\n const redis = (0,_lib_redis__WEBPACK_IMPORTED_MODULE_1__.getRedisClient)();\n const key = _lib_redis__WEBPACK_IMPORTED_MODULE_1__.KEYS.CREDENTIALS(userId, email);\n const credStr = await redis.get(key);\n if (!credStr) {\n console.log(`No credentials found in Redis for ${email}`);\n return {\n accessToken: '',\n success: false\n };\n }\n const creds = JSON.parse(credStr);\n // If not OAuth or missing refresh token, return failure\n if (!creds.useOAuth || !creds.refreshToken) {\n console.log(`Account ${email} is not using OAuth or missing refresh token`);\n return {\n accessToken: '',\n success: false\n };\n }\n // If token is still valid, return current token\n if (creds.tokenExpiry && creds.accessToken && creds.tokenExpiry > Date.now() + 5 * 60 * 1000) {\n console.log(`Token for ${email} is still valid, no refresh needed`);\n return {\n accessToken: creds.accessToken,\n success: true\n };\n }\n // Token is expired or about to expire, refresh it\n console.log(`Refreshing token for ${email}`);\n const tokens = await (0,_microsoft_oauth__WEBPACK_IMPORTED_MODULE_0__.refreshAccessToken)(creds.refreshToken);\n // Update Redis cache with new tokens\n creds.accessToken = tokens.access_token;\n if (tokens.refresh_token) {\n creds.refreshToken = tokens.refresh_token;\n }\n creds.tokenExpiry = Date.now() + tokens.expires_in * 1000;\n await redis.set(key, JSON.stringify(creds), 'EX', 86400); // 24 hours\n console.log(`Token for ${email} refreshed and cached in Redis`);\n return {\n accessToken: tokens.access_token,\n success: true\n };\n } catch (error) {\n console.error(`Error refreshing token for ${email}:`, error);\n return {\n accessToken: '',\n success: false\n };\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9saWIvc2VydmljZXMvdG9rZW4tcmVmcmVzaC50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQXVEO0FBQ0o7QUFFbkQ7O0NBRUMsR0FDTSxTQUFTRyxlQUFlQyxlQUF1QjtJQUNwRCxNQUFNQyxrQkFBa0IsSUFBSSxLQUFLO0lBQ2pDLE9BQU9DLEtBQUtDLEdBQUcsS0FBS0YsbUJBQW1CRDtBQUN6QztBQUVBOztDQUVDLEdBQ00sZUFBZUksaUJBQ3BCQyxNQUFjLEVBQ2RDLEtBQWE7SUFFYixJQUFJO1FBQ0YsMERBQTBEO1FBQzFEQyxRQUFRQyxHQUFHLENBQUMsQ0FBQyx3Q0FBd0MsRUFBRUYsT0FBTztRQUM5RCxNQUFNRyxRQUFRWiwwREFBY0E7UUFDNUIsTUFBTWEsTUFBTVosNENBQUlBLENBQUNhLFdBQVcsQ0FBQ04sUUFBUUM7UUFDckMsTUFBTU0sVUFBVSxNQUFNSCxNQUFNSSxHQUFHLENBQUNIO1FBRWhDLElBQUksQ0FBQ0UsU0FBUztZQUNaTCxRQUFRQyxHQUFHLENBQUMsQ0FBQyxrQ0FBa0MsRUFBRUYsT0FBTztZQUN4RCxPQUFPO2dCQUFFUSxhQUFhO2dCQUFJQyxTQUFTO1lBQU07UUFDM0M7UUFFQSxNQUFNQyxRQUFRQyxLQUFLQyxLQUFLLENBQUNOO1FBRXpCLHdEQUF3RDtRQUN4RCxJQUFJLENBQUNJLE1BQU1HLFFBQVEsSUFBSSxDQUFDSCxNQUFNSSxZQUFZLEVBQUU7WUFDMUNiLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRUYsTUFBTSw0Q0FBNEMsQ0FBQztZQUMxRSxPQUFPO2dCQUFFUSxhQUFhO2dCQUFJQyxTQUFTO1lBQU07UUFDM0M7UUFFQSxnREFBZ0Q7UUFDaEQsSUFBSUMsTUFBTUssV0FBVyxJQUFJTCxNQUFNRixXQUFXLElBQ3RDRSxNQUFNSyxXQUFXLEdBQUduQixLQUFLQyxHQUFHLEtBQUssSUFBSSxLQUFLLE1BQU07WUFDbERJLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRUYsTUFBTSxrQ0FBa0MsQ0FBQztZQUNsRSxPQUFPO2dCQUFFUSxhQUFhRSxNQUFNRixXQUFXO2dCQUFFQyxTQUFTO1lBQUs7UUFDekQ7UUFFQSxrREFBa0Q7UUFDbERSLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQixFQUFFRixPQUFPO1FBQzNDLE1BQU1nQixTQUFTLE1BQU0xQixvRUFBa0JBLENBQUNvQixNQUFNSSxZQUFZO1FBRTFELHFDQUFxQztRQUNyQ0osTUFBTUYsV0FBVyxHQUFHUSxPQUFPQyxZQUFZO1FBQ3ZDLElBQUlELE9BQU9FLGFBQWEsRUFBRTtZQUN4QlIsTUFBTUksWUFBWSxHQUFHRSxPQUFPRSxhQUFhO1FBQzNDO1FBQ0FSLE1BQU1LLFdBQVcsR0FBR25CLEtBQUtDLEdBQUcsS0FBTW1CLE9BQU9HLFVBQVUsR0FBRztRQUV0RCxNQUFNaEIsTUFBTWlCLEdBQUcsQ0FBQ2hCLEtBQUtPLEtBQUtVLFNBQVMsQ0FBQ1gsUUFBUSxNQUFNLFFBQVEsV0FBVztRQUNyRVQsUUFBUUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFRixNQUFNLDhCQUE4QixDQUFDO1FBRTlELE9BQU87WUFBRVEsYUFBYVEsT0FBT0MsWUFBWTtZQUFFUixTQUFTO1FBQUs7SUFDM0QsRUFBRSxPQUFPYSxPQUFPO1FBQ2RyQixRQUFRcUIsS0FBSyxDQUFDLENBQUMsMkJBQTJCLEVBQUV0QixNQUFNLENBQUMsQ0FBQyxFQUFFc0I7UUFDdEQsT0FBTztZQUFFZCxhQUFhO1lBQUlDLFNBQVM7UUFBTTtJQUMzQztBQUNGIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2xpYi9zZXJ2aWNlcy90b2tlbi1yZWZyZXNoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlZnJlc2hBY2Nlc3NUb2tlbiB9IGZyb20gJy4vbWljcm9zb2Z0LW9hdXRoJztcbmltcG9ydCB7IGdldFJlZGlzQ2xpZW50LCBLRVlTIH0gZnJvbSAnQC9saWIvcmVkaXMnO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgdG9rZW4gaXMgZXhwaXJlZCBvciBhYm91dCB0byBleHBpcmUgKHdpdGhpbiA1IG1pbnV0ZXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rva2VuRXhwaXJlZChleHBpcnlUaW1lc3RhbXA6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBmaXZlTWludXRlc0luTXMgPSA1ICogNjAgKiAxMDAwO1xuICByZXR1cm4gRGF0ZS5ub3coKSArIGZpdmVNaW51dGVzSW5NcyA+PSBleHBpcnlUaW1lc3RhbXA7XG59XG5cbi8qKlxuICogUmVmcmVzaCBhbiBhY2Nlc3MgdG9rZW4gaWYgaXQncyBleHBpcmVkIG9yIGFib3V0IHRvIGV4cGlyZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRnJlc2hUb2tlbihcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGVtYWlsOiBzdHJpbmdcbik6IFByb21pc2U8eyBhY2Nlc3NUb2tlbjogc3RyaW5nOyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgUmVkaXMgdG8gZ2V0IHRoZSB0b2tlbnMgKG5vIGRhdGFiYXNlIGxvb2t1cCBuZWVkZWQpXG4gICAgY29uc29sZS5sb2coYENoZWNraW5nIGlmIHRva2VuIHJlZnJlc2ggaXMgbmVlZGVkIGZvciAke2VtYWlsfWApO1xuICAgIGNvbnN0IHJlZGlzID0gZ2V0UmVkaXNDbGllbnQoKTtcbiAgICBjb25zdCBrZXkgPSBLRVlTLkNSRURFTlRJQUxTKHVzZXJJZCwgZW1haWwpO1xuICAgIGNvbnN0IGNyZWRTdHIgPSBhd2FpdCByZWRpcy5nZXQoa2V5KTtcbiAgICBcbiAgICBpZiAoIWNyZWRTdHIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBObyBjcmVkZW50aWFscyBmb3VuZCBpbiBSZWRpcyBmb3IgJHtlbWFpbH1gKTtcbiAgICAgIHJldHVybiB7IGFjY2Vzc1Rva2VuOiAnJywgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY3JlZHMgPSBKU09OLnBhcnNlKGNyZWRTdHIpO1xuICAgIFxuICAgIC8vIElmIG5vdCBPQXV0aCBvciBtaXNzaW5nIHJlZnJlc2ggdG9rZW4sIHJldHVybiBmYWlsdXJlXG4gICAgaWYgKCFjcmVkcy51c2VPQXV0aCB8fCAhY3JlZHMucmVmcmVzaFRva2VuKSB7XG4gICAgICBjb25zb2xlLmxvZyhgQWNjb3VudCAke2VtYWlsfSBpcyBub3QgdXNpbmcgT0F1dGggb3IgbWlzc2luZyByZWZyZXNoIHRva2VuYCk7XG4gICAgICByZXR1cm4geyBhY2Nlc3NUb2tlbjogJycsIHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdG9rZW4gaXMgc3RpbGwgdmFsaWQsIHJldHVybiBjdXJyZW50IHRva2VuXG4gICAgaWYgKGNyZWRzLnRva2VuRXhwaXJ5ICYmIGNyZWRzLmFjY2Vzc1Rva2VuICYmIFxuICAgICAgICBjcmVkcy50b2tlbkV4cGlyeSA+IERhdGUubm93KCkgKyA1ICogNjAgKiAxMDAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhgVG9rZW4gZm9yICR7ZW1haWx9IGlzIHN0aWxsIHZhbGlkLCBubyByZWZyZXNoIG5lZWRlZGApO1xuICAgICAgcmV0dXJuIHsgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLCBzdWNjZXNzOiB0cnVlIH07XG4gICAgfVxuXG4gICAgLy8gVG9rZW4gaXMgZXhwaXJlZCBvciBhYm91dCB0byBleHBpcmUsIHJlZnJlc2ggaXRcbiAgICBjb25zb2xlLmxvZyhgUmVmcmVzaGluZyB0b2tlbiBmb3IgJHtlbWFpbH1gKTtcbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4oY3JlZHMucmVmcmVzaFRva2VuKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgUmVkaXMgY2FjaGUgd2l0aCBuZXcgdG9rZW5zXG4gICAgY3JlZHMuYWNjZXNzVG9rZW4gPSB0b2tlbnMuYWNjZXNzX3Rva2VuO1xuICAgIGlmICh0b2tlbnMucmVmcmVzaF90b2tlbikge1xuICAgICAgY3JlZHMucmVmcmVzaFRva2VuID0gdG9rZW5zLnJlZnJlc2hfdG9rZW47XG4gICAgfVxuICAgIGNyZWRzLnRva2VuRXhwaXJ5ID0gRGF0ZS5ub3coKSArICh0b2tlbnMuZXhwaXJlc19pbiAqIDEwMDApO1xuICAgIFxuICAgIGF3YWl0IHJlZGlzLnNldChrZXksIEpTT04uc3RyaW5naWZ5KGNyZWRzKSwgJ0VYJywgODY0MDApOyAvLyAyNCBob3Vyc1xuICAgIGNvbnNvbGUubG9nKGBUb2tlbiBmb3IgJHtlbWFpbH0gcmVmcmVzaGVkIGFuZCBjYWNoZWQgaW4gUmVkaXNgKTtcblxuICAgIHJldHVybiB7IGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzX3Rva2VuLCBzdWNjZXNzOiB0cnVlIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmVmcmVzaGluZyB0b2tlbiBmb3IgJHtlbWFpbH06YCwgZXJyb3IpO1xuICAgIHJldHVybiB7IGFjY2Vzc1Rva2VuOiAnJywgc3VjY2VzczogZmFsc2UgfTtcbiAgfVxufSAiXSwibmFtZXMiOlsicmVmcmVzaEFjY2Vzc1Rva2VuIiwiZ2V0UmVkaXNDbGllbnQiLCJLRVlTIiwiaXNUb2tlbkV4cGlyZWQiLCJleHBpcnlUaW1lc3RhbXAiLCJmaXZlTWludXRlc0luTXMiLCJEYXRlIiwibm93IiwiZW5zdXJlRnJlc2hUb2tlbiIsInVzZXJJZCIsImVtYWlsIiwiY29uc29sZSIsImxvZyIsInJlZGlzIiwia2V5IiwiQ1JFREVOVElBTFMiLCJjcmVkU3RyIiwiZ2V0IiwiYWNjZXNzVG9rZW4iLCJzdWNjZXNzIiwiY3JlZHMiLCJKU09OIiwicGFyc2UiLCJ1c2VPQXV0aCIsInJlZnJlc2hUb2tlbiIsInRva2VuRXhwaXJ5IiwidG9rZW5zIiwiYWNjZXNzX3Rva2VuIiwicmVmcmVzaF90b2tlbiIsImV4cGlyZXNfaW4iLCJzZXQiLCJzdHJpbmdpZnkiLCJlcnJvciJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./lib/services/token-refresh.ts\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fcourrier%2Femails%2Froute&page=%2Fapi%2Fcourrier%2Femails%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fcourrier%2Femails%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%2Fcourrier%2Femails%2Froute&page=%2Fapi%2Fcourrier%2Femails%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fcourrier%2Femails%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_courrier_emails_route_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app/api/courrier/emails/route.ts */ \"(rsc)/./app/api/courrier/emails/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/courrier/emails/route\",\n pathname: \"/api/courrier/emails\",\n filename: \"route\",\n bundlePath: \"app/api/courrier/emails/route\"\n },\n resolvedPagePath: \"/home/alma/nextgen/Neah-mail/app/api/courrier/emails/route.ts\",\n nextConfigOutput,\n userland: _home_alma_nextgen_Neah_mail_app_api_courrier_emails_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/bmFtZT1hcHAlMkZhcGklMkZjb3VycmllciUyRmVtYWlscyUyRnJvdXRlJnBhZ2U9JTJGYXBpJTJGY291cnJpZXIlMkZlbWFpbHMlMkZyb3V0ZSZhcHBQYXRocz0mcGFnZVBhdGg9cHJpdmF0ZS1uZXh0LWFwcC1kaXIlMkZhcGklMkZjb3VycmllciUyRmVtYWlscyUyRnJvdXRlLnRzJmFwcERpcj0lMkZob21lJTJGYWxtYSUyRm5leHRnZW4lMkZOZWFoLW1haWwlMkZhcHAmcGFnZUV4dGVuc2lvbnM9dHN4JnBhZ2VFeHRlbnNpb25zPXRzJnBhZ2VFeHRlbnNpb25zPWpzeCZwYWdlRXh0ZW5zaW9ucz1qcyZyb290RGlyPSUyRmhvbWUlMkZhbG1hJTJGbmV4dGdlbiUyRk5lYWgtbWFpbCZpc0Rldj10cnVlJnRzY29uZmlnUGF0aD10c2NvbmZpZy5qc29uJmJhc2VQYXRoPSZhc3NldFByZWZpeD0mbmV4dENvbmZpZ091dHB1dD0mcHJlZmVycmVkUmVnaW9uPSZtaWRkbGV3YXJlQ29uZmlnPWUzMCUzRCEiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBK0Y7QUFDdkM7QUFDcUI7QUFDYTtBQUMxRjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IseUdBQW1CO0FBQzNDO0FBQ0EsY0FBYyxrRUFBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsWUFBWTtBQUNaLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxRQUFRLHNEQUFzRDtBQUM5RDtBQUNBLFdBQVcsNEVBQVc7QUFDdEI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUMwRjs7QUFFMUYiLCJzb3VyY2VzIjpbIiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBSb3V0ZVJvdXRlTW9kdWxlIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcm91dGUtbW9kdWxlcy9hcHAtcm91dGUvbW9kdWxlLmNvbXBpbGVkXCI7XG5pbXBvcnQgeyBSb3V0ZUtpbmQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yb3V0ZS1raW5kXCI7XG5pbXBvcnQgeyBwYXRjaEZldGNoIGFzIF9wYXRjaEZldGNoIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL3BhdGNoLWZldGNoXCI7XG5pbXBvcnQgKiBhcyB1c2VybGFuZCBmcm9tIFwiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9hcHAvYXBpL2NvdXJyaWVyL2VtYWlscy9yb3V0ZS50c1wiO1xuLy8gV2UgaW5qZWN0IHRoZSBuZXh0Q29uZmlnT3V0cHV0IGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gaW4gdGhlIHJvdXRlXG4vLyBtb2R1bGUuXG5jb25zdCBuZXh0Q29uZmlnT3V0cHV0ID0gXCJcIlxuY29uc3Qgcm91dGVNb2R1bGUgPSBuZXcgQXBwUm91dGVSb3V0ZU1vZHVsZSh7XG4gICAgZGVmaW5pdGlvbjoge1xuICAgICAgICBraW5kOiBSb3V0ZUtpbmQuQVBQX1JPVVRFLFxuICAgICAgICBwYWdlOiBcIi9hcGkvY291cnJpZXIvZW1haWxzL3JvdXRlXCIsXG4gICAgICAgIHBhdGhuYW1lOiBcIi9hcGkvY291cnJpZXIvZW1haWxzXCIsXG4gICAgICAgIGZpbGVuYW1lOiBcInJvdXRlXCIsXG4gICAgICAgIGJ1bmRsZVBhdGg6IFwiYXBwL2FwaS9jb3Vycmllci9lbWFpbHMvcm91dGVcIlxuICAgIH0sXG4gICAgcmVzb2x2ZWRQYWdlUGF0aDogXCIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2FwcC9hcGkvY291cnJpZXIvZW1haWxzL3JvdXRlLnRzXCIsXG4gICAgbmV4dENvbmZpZ091dHB1dCxcbiAgICB1c2VybGFuZFxufSk7XG4vLyBQdWxsIG91dCB0aGUgZXhwb3J0cyB0aGF0IHdlIG5lZWQgdG8gZXhwb3NlIGZyb20gdGhlIG1vZHVsZS4gVGhpcyBzaG91bGRcbi8vIGJlIGVsaW1pbmF0ZWQgd2hlbiB3ZSd2ZSBtb3ZlZCB0aGUgb3RoZXIgcm91dGVzIHRvIHRoZSBuZXcgZm9ybWF0LiBUaGVzZVxuLy8gYXJlIHVzZWQgdG8gaG9vayBpbnRvIHRoZSByb3V0ZS5cbmNvbnN0IHsgd29ya0FzeW5jU3RvcmFnZSwgd29ya1VuaXRBc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzIH0gPSByb3V0ZU1vZHVsZTtcbmZ1bmN0aW9uIHBhdGNoRmV0Y2goKSB7XG4gICAgcmV0dXJuIF9wYXRjaEZldGNoKHtcbiAgICAgICAgd29ya0FzeW5jU3RvcmFnZSxcbiAgICAgICAgd29ya1VuaXRBc3luY1N0b3JhZ2VcbiAgICB9KTtcbn1cbmV4cG9ydCB7IHJvdXRlTW9kdWxlLCB3b3JrQXN5bmNTdG9yYWdlLCB3b3JrVW5pdEFzeW5jU3RvcmFnZSwgc2VydmVySG9va3MsIHBhdGNoRmV0Y2gsICB9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHAtcm91dGUuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fcourrier%2Femails%2Froute&page=%2Fapi%2Fcourrier%2Femails%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fcourrier%2Femails%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-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Flib%2Fservices%2Femail-service.ts%22%2C%5B%7B%22id%22%3A%224010844c55b83dfb1f105bebefe0eefe1e6b431900%22%2C%22exportedName%22%3A%22testEmailConnection%22%7D%2C%7B%22id%22%3A%2260249f33dc41bab8693201a3f19f5e5fb46e641c28%22%2C%22exportedName%22%3A%22getImapConnection%22%7D%2C%7B%22id%22%3A%2260852a4e84650a79792bf7dba8eab6e2994fad2674%22%2C%22exportedName%22%3A%22sendEmail%22%7D%2C%7B%22id%22%3A%22608647185521cdbec25a6e83fd03959d7becd6a6cd%22%2C%22exportedName%22%3A%22getMailboxes%22%7D%2C%7B%22id%22%3A%22609e97c061f87c9d92e6b4c180de319248e8263787%22%2C%22exportedName%22%3A%22getUserEmailCredentials%22%7D%2C%7B%22id%22%3A%2270576421f3f1a8e0b47693f06bf0b900d321800592%22%2C%22exportedName%22%3A%22saveUserEmailCredentials%22%7D%2C%7B%22id%22%3A%2278725b1539278f6847adbb3f678020efc4d204d6de%22%2C%22exportedName%22%3A%22getEmailContent%22%7D%2C%7B%22id%22%3A%227c9e86d7555bbe449b808bd2ae7479f82af99409fe%22%2C%22exportedName%22%3A%22markEmailReadStatus%22%7D%2C%7B%22id%22%3A%227ccc49d190a944aede514b28ad88d4a52971336211%22%2C%22exportedName%22%3A%22toggleEmailFlag%22%7D%2C%7B%22id%22%3A%227e6fee2e8d6b5661c87219a81dea11090773f206cd%22%2C%22exportedName%22%3A%22getEmails%22%7D%5D%5D%5D&__client_imported__=!":
|
|
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Flib%2Fservices%2Femail-service.ts%22%2C%5B%7B%22id%22%3A%224010844c55b83dfb1f105bebefe0eefe1e6b431900%22%2C%22exportedName%22%3A%22testEmailConnection%22%7D%2C%7B%22id%22%3A%2260249f33dc41bab8693201a3f19f5e5fb46e641c28%22%2C%22exportedName%22%3A%22getImapConnection%22%7D%2C%7B%22id%22%3A%2260852a4e84650a79792bf7dba8eab6e2994fad2674%22%2C%22exportedName%22%3A%22sendEmail%22%7D%2C%7B%22id%22%3A%22608647185521cdbec25a6e83fd03959d7becd6a6cd%22%2C%22exportedName%22%3A%22getMailboxes%22%7D%2C%7B%22id%22%3A%22609e97c061f87c9d92e6b4c180de319248e8263787%22%2C%22exportedName%22%3A%22getUserEmailCredentials%22%7D%2C%7B%22id%22%3A%2270576421f3f1a8e0b47693f06bf0b900d321800592%22%2C%22exportedName%22%3A%22saveUserEmailCredentials%22%7D%2C%7B%22id%22%3A%2278725b1539278f6847adbb3f678020efc4d204d6de%22%2C%22exportedName%22%3A%22getEmailContent%22%7D%2C%7B%22id%22%3A%227c9e86d7555bbe449b808bd2ae7479f82af99409fe%22%2C%22exportedName%22%3A%22markEmailReadStatus%22%7D%2C%7B%22id%22%3A%227ccc49d190a944aede514b28ad88d4a52971336211%22%2C%22exportedName%22%3A%22toggleEmailFlag%22%7D%2C%7B%22id%22%3A%227e6fee2e8d6b5661c87219a81dea11090773f206cd%22%2C%22exportedName%22%3A%22getEmails%22%7D%5D%5D%5D&__client_imported__=! ***!
|
|
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((__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 */ \"4010844c55b83dfb1f105bebefe0eefe1e6b431900\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.testEmailConnection),\n/* harmony export */ \"60249f33dc41bab8693201a3f19f5e5fb46e641c28\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.getImapConnection),\n/* harmony export */ \"60852a4e84650a79792bf7dba8eab6e2994fad2674\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.sendEmail),\n/* harmony export */ \"608647185521cdbec25a6e83fd03959d7becd6a6cd\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.getMailboxes),\n/* harmony export */ \"609e97c061f87c9d92e6b4c180de319248e8263787\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.getUserEmailCredentials),\n/* harmony export */ \"70576421f3f1a8e0b47693f06bf0b900d321800592\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.saveUserEmailCredentials),\n/* harmony export */ \"78725b1539278f6847adbb3f678020efc4d204d6de\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.getEmailContent),\n/* harmony export */ \"7c9e86d7555bbe449b808bd2ae7479f82af99409fe\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.markEmailReadStatus),\n/* harmony export */ \"7ccc49d190a944aede514b28ad88d4a52971336211\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.toggleEmailFlag),\n/* harmony export */ \"7e6fee2e8d6b5661c87219a81dea11090773f206cd\": () => (/* reexport safe */ _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__.getEmails)\n/* harmony export */ });\n/* harmony import */ var _home_alma_nextgen_Neah_mail_lib_services_email_service_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/services/email-service.ts */ \"(rsc)/./lib/services/email-service.ts\");\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWZsaWdodC1hY3Rpb24tZW50cnktbG9hZGVyLmpzP2FjdGlvbnM9JTVCJTVCJTIyJTJGaG9tZSUyRmFsbWElMkZuZXh0Z2VuJTJGTmVhaC1tYWlsJTJGbGliJTJGc2VydmljZXMlMkZlbWFpbC1zZXJ2aWNlLnRzJTIyJTJDJTVCJTdCJTIyaWQlMjIlM0ElMjI0MDEwODQ0YzU1YjgzZGZiMWYxMDViZWJlZmUwZWVmZTFlNmI0MzE5MDAlMjIlMkMlMjJleHBvcnRlZE5hbWUlMjIlM0ElMjJ0ZXN0RW1haWxDb25uZWN0aW9uJTIyJTdEJTJDJTdCJTIyaWQlMjIlM0ElMjI2MDI0OWYzM2RjNDFiYWI4NjkzMjAxYTNmMTlmNWU1ZmI0NmU2NDFjMjglMjIlMkMlMjJleHBvcnRlZE5hbWUlMjIlM0ElMjJnZXRJbWFwQ29ubmVjdGlvbiUyMiU3RCUyQyU3QiUyMmlkJTIyJTNBJTIyNjA4NTJhNGU4NDY1MGE3OTc5MmJmN2RiYThlYWI2ZTI5OTRmYWQyNjc0JTIyJTJDJTIyZXhwb3J0ZWROYW1lJTIyJTNBJTIyc2VuZEVtYWlsJTIyJTdEJTJDJTdCJTIyaWQlMjIlM0ElMjI2MDg2NDcxODU1MjFjZGJlYzI1YTZlODNmZDAzOTU5ZDdiZWNkNmE2Y2QlMjIlMkMlMjJleHBvcnRlZE5hbWUlMjIlM0ElMjJnZXRNYWlsYm94ZXMlMjIlN0QlMkMlN0IlMjJpZCUyMiUzQSUyMjYwOWU5N2MwNjFmODdjOWQ5MmU2YjRjMTgwZGUzMTkyNDhlODI2Mzc4NyUyMiUyQyUyMmV4cG9ydGVkTmFtZSUyMiUzQSUyMmdldFVzZXJFbWFpbENyZWRlbnRpYWxzJTIyJTdEJTJDJTdCJTIyaWQlMjIlM0ElMjI3MDU3NjQyMWYzZjFhOGUwYjQ3NjkzZjA2YmYwYjkwMGQzMjE4MDA1OTIlMjIlMkMlMjJleHBvcnRlZE5hbWUlMjIlM0ElMjJzYXZlVXNlckVtYWlsQ3JlZGVudGlhbHMlMjIlN0QlMkMlN0IlMjJpZCUyMiUzQSUyMjc4NzI1YjE1MzkyNzhmNjg0N2FkYmIzZjY3ODAyMGVmYzRkMjA0ZDZkZSUyMiUyQyUyMmV4cG9ydGVkTmFtZSUyMiUzQSUyMmdldEVtYWlsQ29udGVudCUyMiU3RCUyQyU3QiUyMmlkJTIyJTNBJTIyN2M5ZTg2ZDc1NTViYmU0NDliODA4YmQyYWU3NDc5ZjgyYWY5OTQwOWZlJTIyJTJDJTIyZXhwb3J0ZWROYW1lJTIyJTNBJTIybWFya0VtYWlsUmVhZFN0YXR1cyUyMiU3RCUyQyU3QiUyMmlkJTIyJTNBJTIyN2NjYzQ5ZDE5MGE5NDRhZWRlNTE0YjI4YWQ4OGQ0YTUyOTcxMzM2MjExJTIyJTJDJTIyZXhwb3J0ZWROYW1lJTIyJTNBJTIydG9nZ2xlRW1haWxGbGFnJTIyJTdEJTJDJTdCJTIyaWQlMjIlM0ElMjI3ZTZmZWUyZThkNmI1NjYxYzg3MjE5YTgxZGVhMTEwOTA3NzNmMjA2Y2QlMjIlMkMlMjJleHBvcnRlZE5hbWUlMjIlM0ElMjJnZXRFbWFpbHMlMjIlN0QlNUQlNUQlNUQmX19jbGllbnRfaW1wb3J0ZWRfXz0hIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUNnSjtBQUNGO0FBQ1I7QUFDRztBQUNXO0FBQ0M7QUFDVDtBQUNJO0FBQ0o7QUFDTiIsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IHsgdGVzdEVtYWlsQ29ubmVjdGlvbiBhcyBcIjQwMTA4NDRjNTViODNkZmIxZjEwNWJlYmVmZTBlZWZlMWU2YjQzMTkwMFwiIH0gZnJvbSBcIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbGliL3NlcnZpY2VzL2VtYWlsLXNlcnZpY2UudHNcIlxuZXhwb3J0IHsgZ2V0SW1hcENvbm5lY3Rpb24gYXMgXCI2MDI0OWYzM2RjNDFiYWI4NjkzMjAxYTNmMTlmNWU1ZmI0NmU2NDFjMjhcIiB9IGZyb20gXCIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2xpYi9zZXJ2aWNlcy9lbWFpbC1zZXJ2aWNlLnRzXCJcbmV4cG9ydCB7IHNlbmRFbWFpbCBhcyBcIjYwODUyYTRlODQ2NTBhNzk3OTJiZjdkYmE4ZWFiNmUyOTk0ZmFkMjY3NFwiIH0gZnJvbSBcIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbGliL3NlcnZpY2VzL2VtYWlsLXNlcnZpY2UudHNcIlxuZXhwb3J0IHsgZ2V0TWFpbGJveGVzIGFzIFwiNjA4NjQ3MTg1NTIxY2RiZWMyNWE2ZTgzZmQwMzk1OWQ3YmVjZDZhNmNkXCIgfSBmcm9tIFwiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvc2VydmljZXMvZW1haWwtc2VydmljZS50c1wiXG5leHBvcnQgeyBnZXRVc2VyRW1haWxDcmVkZW50aWFscyBhcyBcIjYwOWU5N2MwNjFmODdjOWQ5MmU2YjRjMTgwZGUzMTkyNDhlODI2Mzc4N1wiIH0gZnJvbSBcIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbGliL3NlcnZpY2VzL2VtYWlsLXNlcnZpY2UudHNcIlxuZXhwb3J0IHsgc2F2ZVVzZXJFbWFpbENyZWRlbnRpYWxzIGFzIFwiNzA1NzY0MjFmM2YxYThlMGI0NzY5M2YwNmJmMGI5MDBkMzIxODAwNTkyXCIgfSBmcm9tIFwiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvc2VydmljZXMvZW1haWwtc2VydmljZS50c1wiXG5leHBvcnQgeyBnZXRFbWFpbENvbnRlbnQgYXMgXCI3ODcyNWIxNTM5Mjc4ZjY4NDdhZGJiM2Y2NzgwMjBlZmM0ZDIwNGQ2ZGVcIiB9IGZyb20gXCIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2xpYi9zZXJ2aWNlcy9lbWFpbC1zZXJ2aWNlLnRzXCJcbmV4cG9ydCB7IG1hcmtFbWFpbFJlYWRTdGF0dXMgYXMgXCI3YzllODZkNzU1NWJiZTQ0OWI4MDhiZDJhZTc0NzlmODJhZjk5NDA5ZmVcIiB9IGZyb20gXCIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL2xpYi9zZXJ2aWNlcy9lbWFpbC1zZXJ2aWNlLnRzXCJcbmV4cG9ydCB7IHRvZ2dsZUVtYWlsRmxhZyBhcyBcIjdjY2M0OWQxOTBhOTQ0YWVkZTUxNGIyOGFkODhkNGE1Mjk3MTMzNjIxMVwiIH0gZnJvbSBcIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbGliL3NlcnZpY2VzL2VtYWlsLXNlcnZpY2UudHNcIlxuZXhwb3J0IHsgZ2V0RW1haWxzIGFzIFwiN2U2ZmVlMmU4ZDZiNTY2MWM4NzIxOWE4MWRlYTExMDkwNzczZjIwNmNkXCIgfSBmcm9tIFwiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9saWIvc2VydmljZXMvZW1haWwtc2VydmljZS50c1wiXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-flight-action-entry-loader.js?actions=%5B%5B%22%2Fhome%2Falma%2Fnextgen%2FNeah-mail%2Flib%2Fservices%2Femail-service.ts%22%2C%5B%7B%22id%22%3A%224010844c55b83dfb1f105bebefe0eefe1e6b431900%22%2C%22exportedName%22%3A%22testEmailConnection%22%7D%2C%7B%22id%22%3A%2260249f33dc41bab8693201a3f19f5e5fb46e641c28%22%2C%22exportedName%22%3A%22getImapConnection%22%7D%2C%7B%22id%22%3A%2260852a4e84650a79792bf7dba8eab6e2994fad2674%22%2C%22exportedName%22%3A%22sendEmail%22%7D%2C%7B%22id%22%3A%22608647185521cdbec25a6e83fd03959d7becd6a6cd%22%2C%22exportedName%22%3A%22getMailboxes%22%7D%2C%7B%22id%22%3A%22609e97c061f87c9d92e6b4c180de319248e8263787%22%2C%22exportedName%22%3A%22getUserEmailCredentials%22%7D%2C%7B%22id%22%3A%2270576421f3f1a8e0b47693f06bf0b900d321800592%22%2C%22exportedName%22%3A%22saveUserEmailCredentials%22%7D%2C%7B%22id%22%3A%2278725b1539278f6847adbb3f678020efc4d204d6de%22%2C%22exportedName%22%3A%22getEmailContent%22%7D%2C%7B%22id%22%3A%227c9e86d7555bbe449b808bd2ae7479f82af99409fe%22%2C%22exportedName%22%3A%22markEmailReadStatus%22%7D%2C%7B%22id%22%3A%227ccc49d190a944aede514b28ad88d4a52971336211%22%2C%22exportedName%22%3A%22toggleEmailFlag%22%7D%2C%7B%22id%22%3A%227e6fee2e8d6b5661c87219a81dea11090773f206cd%22%2C%22exportedName%22%3A%22getEmails%22%7D%5D%5D%5D&__client_imported__=!\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");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "?d272":
|
|
/*!********************************!*\
|
|
!*** supports-color (ignored) ***!
|
|
\********************************/
|
|
/***/ (() => {
|
|
|
|
/* (ignored) */
|
|
|
|
/***/ }),
|
|
|
|
/***/ "@prisma/client":
|
|
/*!*********************************!*\
|
|
!*** external "@prisma/client" ***!
|
|
\*********************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("@prisma/client");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "assert":
|
|
/*!*************************!*\
|
|
!*** external "assert" ***!
|
|
\*************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("assert");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "buffer":
|
|
/*!*************************!*\
|
|
!*** external "buffer" ***!
|
|
\*************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("buffer");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "child_process":
|
|
/*!********************************!*\
|
|
!*** external "child_process" ***!
|
|
\********************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("child_process");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "crypto":
|
|
/*!*************************!*\
|
|
!*** external "crypto" ***!
|
|
\*************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("crypto");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "dns":
|
|
/*!**********************!*\
|
|
!*** external "dns" ***!
|
|
\**********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("dns");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "events":
|
|
/*!*************************!*\
|
|
!*** external "events" ***!
|
|
\*************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("events");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fs":
|
|
/*!*********************!*\
|
|
!*** external "fs" ***!
|
|
\*********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("fs");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "http":
|
|
/*!***********************!*\
|
|
!*** external "http" ***!
|
|
\***********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("http");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "https":
|
|
/*!************************!*\
|
|
!*** external "https" ***!
|
|
\************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("https");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "module":
|
|
/*!*************************!*\
|
|
!*** external "module" ***!
|
|
\*************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("module");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "net":
|
|
/*!**********************!*\
|
|
!*** external "net" ***!
|
|
\**********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("net");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "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");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "node:buffer":
|
|
/*!******************************!*\
|
|
!*** external "node:buffer" ***!
|
|
\******************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("node:buffer");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "node:events":
|
|
/*!******************************!*\
|
|
!*** external "node:events" ***!
|
|
\******************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("node:events");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "node:os":
|
|
/*!**************************!*\
|
|
!*** external "node:os" ***!
|
|
\**************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("node:os");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "node:path":
|
|
/*!****************************!*\
|
|
!*** external "node:path" ***!
|
|
\****************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("node:path");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "node:stream":
|
|
/*!******************************!*\
|
|
!*** external "node:stream" ***!
|
|
\******************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("node:stream");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "os":
|
|
/*!*********************!*\
|
|
!*** external "os" ***!
|
|
\*********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("os");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "path":
|
|
/*!***********************!*\
|
|
!*** external "path" ***!
|
|
\***********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("path");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "querystring":
|
|
/*!******************************!*\
|
|
!*** external "querystring" ***!
|
|
\******************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("querystring");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "stream":
|
|
/*!*************************!*\
|
|
!*** external "stream" ***!
|
|
\*************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("stream");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "string_decoder":
|
|
/*!*********************************!*\
|
|
!*** external "string_decoder" ***!
|
|
\*********************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("string_decoder");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "tls":
|
|
/*!**********************!*\
|
|
!*** external "tls" ***!
|
|
\**********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("tls");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "tty":
|
|
/*!**********************!*\
|
|
!*** external "tty" ***!
|
|
\**********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("tty");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "url":
|
|
/*!**********************!*\
|
|
!*** external "url" ***!
|
|
\**********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("url");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "util":
|
|
/*!***********************!*\
|
|
!*** external "util" ***!
|
|
\***********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("util");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "worker_threads":
|
|
/*!*********************************!*\
|
|
!*** external "worker_threads" ***!
|
|
\*********************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("worker_threads");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "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","vendor-chunks/crypto-js","vendor-chunks/ioredis","vendor-chunks/@ioredis","vendor-chunks/debug","vendor-chunks/lodash.defaults","vendor-chunks/redis-parser","vendor-chunks/denque","vendor-chunks/cluster-key-slot","vendor-chunks/lodash.isarguments","vendor-chunks/redis-errors","vendor-chunks/ms","vendor-chunks/standard-as-callback","vendor-chunks/nodemailer","vendor-chunks/imapflow","vendor-chunks/encoding-japanese","vendor-chunks/iconv-lite","vendor-chunks/form-data","vendor-chunks/zod","vendor-chunks/axios","vendor-chunks/libmime","vendor-chunks/entities","vendor-chunks/he","vendor-chunks/html-to-text","vendor-chunks/htmlparser2","vendor-chunks/ip-address","vendor-chunks/mailparser","vendor-chunks/socks","vendor-chunks/smart-buffer","vendor-chunks/pino","vendor-chunks/mailsplit","vendor-chunks/jsbn","vendor-chunks/domutils","vendor-chunks/linkify-it","vendor-chunks/domhandler","vendor-chunks/follow-redirects","vendor-chunks/fast-redact","vendor-chunks/safe-stable-stringify","vendor-chunks/sonic-boom","vendor-chunks/thread-stream","vendor-chunks/selderee","vendor-chunks/get-intrinsic","vendor-chunks/parseley","vendor-chunks/punycode.js","vendor-chunks/peberminta","vendor-chunks/tlds","vendor-chunks/pino-std-serializers","vendor-chunks/dom-serializer","vendor-chunks/sprintf-js","vendor-chunks/libqp","vendor-chunks/asynckit","vendor-chunks/libbase64","vendor-chunks/uc.micro","vendor-chunks/combined-stream","vendor-chunks/deepmerge","vendor-chunks/proxy-from-env","vendor-chunks/@selderee","vendor-chunks/quick-format-unescaped","vendor-chunks/has-symbols","vendor-chunks/delayed-stream","vendor-chunks/function-bind","vendor-chunks/safer-buffer","vendor-chunks/domelementtype","vendor-chunks/on-exit-leak-free","vendor-chunks/leac","vendor-chunks/es-set-tostringtag","vendor-chunks/atomic-sleep","vendor-chunks/get-proto","vendor-chunks/call-bind-apply-helpers","vendor-chunks/dunder-proto","vendor-chunks/math-intrinsics","vendor-chunks/es-errors","vendor-chunks/gopd","vendor-chunks/es-define-property","vendor-chunks/hasown","vendor-chunks/has-tostringtag","vendor-chunks/es-object-atoms"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fcourrier%2Femails%2Froute&page=%2Fapi%2Fcourrier%2Femails%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fcourrier%2Femails%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__;
|
|
|
|
})(); |