From 1cf827211f27a03049f22ad368cccec51c038098 Mon Sep 17 00:00:00 2001 From: paychex-ssmithrand <108530706+paychex-ssmithrand@users.noreply.github.com> Date: Thu, 11 Apr 2024 09:18:26 -0400 Subject: [PATCH] Downstream (#12) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🚀 feat: Support for GPT-4 Turbo/0125 Models (#1643) * 🧹 Clean Up OpenAI Config and Show 'Set Azure Key' for Plugins (#1649) * refactor(gptPlugins): prevent edge case where exact word `azure` could be found in azure api Key detection when not an azure key * refactor(SetKeyDialog): cleanup OpenAI config, show \'set azure key\' when `PLUGINS_USE_AZURE` env var is enabled * 🐞 fix: Bump `@langchain/google-genai` to Address Chinese Text Bug (#1654) * 📋 feat: Log Custom Config File and Add Known Model Limits to Custom Endpoint (#1657) * refactor(custom): add all recognized models to maxTokensMap for custom endpoint * feat(librechat.yaml): log the custom config file on initial load * fix(OpenAIClient): pass endpointType/endpoint to `getModelMaxTokens` call * 👤 fix: Avatar Check in User Auth (#1677) * 🌍 : Update Japanese translation (#1666) * Language translation: japanese * Language translation: japanese * 🔝fix: Re-order System Message to Top for Mistral API Payloads (#1678) * fix: re-order System Message if Mistral AI API as it only allows System Message at start of Payload * fix: re-introduce singular system message change role to `user` if `system` * 🛡️ : Security Enhancements (#1681) * fix: sanitize HTTP params and do not send whole error objects backs * fix: prevent path traversal * fix: send custom error message for tokenizer route * chore: handle info exposure vector * chore(oauth): skip check due to false positive as oauth routes are rate-limited * chore(app): disable `x-powered-by` * chore: disable false positives or flagging of hardcoded secrets when they are fake values * chore: add path traversal safety check * 📝 docs update: remove ChatGPTbrowser and other small fixes (#1686) * 🧼 docs: remove references to ChatGPTbrowser and PandoraNext * docs: clean up .env file Update OpenAI models with the list of automatically fetched models, update Plugin models with the list of models supporting functions, comment out ToC in custom_config.md since it conflicts with mkdock right sidebar ToC * 🖋️ docs: fix formatting in linux_install.md * docs: update example model lists in dotenv.md * docs: update breaking_changesv.md * 🤖 docs: add `copilot-gpt4-service` AI setup info (#1695) Adds information and setup details for [aaamon's copilot-gpt4-service](https://github.com/aaamoon/copilot-gpt4-service) to Unofficial APIs section of the documentation. Utilizes Github's Copilot to access OpenAI api. * 🥷 docs: Ninja - ChatGPT-browser reverse proxy (#1697) * 🥷 docs: Ninja ChatGPT-browser reverse proxy * 🥷 docs: breaking changes * 🌍 : Update German Translations (#1683) Co-authored-by: marlonka * 🪙 feat: Use OpenRouter Model Data for Token Cost and Context (#1703) * feat: use openrouter data for model token cost/context * chore: add ttl for tokenConfig and refetch models if cache expired * 🚀 feat: Support for GPT-3.5 Turbo/0125 Model (#1704) * 🚀 feat: Support for GPT-3.5 Turbo/0125 Model * ci: fix tx test * 📷 fix: Pass Base64 to Gemini Vision Payload when using CDN URLs (#1705) * 🖌️feat: ScrolltoBottom & Mobile Improvements; Translation Update (#1651) * 🖌️feat: Scrolltobottom Style * 🖌️feat: ScrolltoBottom Style * 📱Settings tab now centered on mobile / selection bug fixed 🐞, 🌍 Updated Translation * 🛠️fix: Adjust the width of the settings dialog and address the issue of not seeing selection on the desktop. * 🎨 Update settings tabs background color for dark mode. Adjusts background color dynamically based on screen size. * 🛠️fix: Reverted changes in ScrolltoBottom file * 🪙 fix(getModelMaxTokens): Retrieve Correct Context Tokens for Azure OpenAI (#1710) * 🖊️ README.md: update button layout (#1709) change size and position of the one click deployment buttons * ♾️ style: Infinite Scroll Nav and Sort Convos by Date/Usage (#1708) * Style: Infinite Scroll and Group convos by date * Style: Infinite Scroll and Group convos by date- Redesign NavBar * Style: Infinite Scroll and Group convos by date- Redesign NavBar - Clean code * Style: Infinite Scroll and Group convos by date- Redesign NavBar - Redesign NewChat Component * Style: Infinite Scroll and Group convos by date- Redesign NavBar - Redesign NewChat Component * Style: Infinite Scroll and Group convos by date- Redesign NavBar - Redesign NewChat Component * Including OpenRouter and Mistral icon * refactor(Conversations): cleanup use of utility functions and typing * refactor(Nav/NewChat): use localStorage `lastConversationSetup` to determine the endpoint to use, as well as icons -> JSX components, remove use of `endpointSelected` * refactor: remove use of `isFirstToday` * refactor(Nav): remove use of `endpointSelected`, consolidate scrolling logic to its own hook `useNavScrolling`, remove use of recoil `conversation` * refactor: Add spinner to bottom of list, throttle fetching, move query hooks to client workspace * chore: sort by `updatedAt` field * refactor: optimize conversation infinite query, use optimistic updates, add conversation helpers for managing pagination, remove unnecessary operations * feat: gen_title route for generating the title for the conversation * style(Convo): change hover bg-color * refactor: memoize groupedConversations and return as array of tuples, correctly update convos pre/post message stream, only call genTitle if conversation is new, make `addConversation` dynamically either add/update depending if convo exists in pages already, reorganize type definitions * style: rename Header NewChat Button -> HeaderNewChat, add NewChatIcon, closely match main Nav New Chat button to ChatGPT * style(NewChat): add hover bg color * style: cleanup comments, match ChatGPT nav styling, redesign search bar, make part of new chat sticky header, move Nav under same parent as outlet/mobilenav, remove legacy code, search only if searchQuery is not empty * feat: add tests for conversation helpers and ensure no duplicate conversations are ever grouped * style: hover bg-color * feat: alt-click on convo item to open conversation in new tab * chore: send error message when `gen_title` fails --------- Co-authored-by: Walber Cardoso * 🔧 fix: Patch incorrect Package Installation (#1720) * 🐳 fix: Update `.devcontainer` Files (#1712) * fix: modify the base docker image for devcontainer * fix: restore package-lock.json from main * 📱 style: Settings UI Enhancements for Mobile (#1721) * Fix the interface for the mobile version. * Make uniform margins for buttons. * 🐳 docs: How to Authenticate MongoDB (#1724) * refactor: remove `--noauth` flag from `mongod` command * docs: add mongodb auth instructions * Update manage_your_database.md * chore: add example * Update manage_your_database.md * 🐳 docs: Formatting Fix (#1725) * 🐳 docs: Add deploy to Zeabur button and guide (#1727) * 🐳 docs: Add deploy to Zeabur button in README.md * 🐳 docs: Add deploy to Zeabur guide in docs * 🖋️ docs: Formatting Fix (#1726) * 🍃 docs: Formatting Fix * 🖋️ docs: Formatting Fix * 🖋️ docs: Formatting Fix * 🔒✉️ feat: allow only certain domain (#1562) * feat: allow only certain domain * Update dotenv.md * refactor( registrationController) & handle ALLOWED_REGISTRATION_DOMAINS not specified * cleanup and moved to AuthService for better error handling * refactor: replace environment variable with librechat config item, add typedef for custom config, update docs for new registration object and allowedDomains values * ci(AuthService): test for `isDomainAllowed` --------- Co-authored-by: Danny Avila * 🔄🔐 refactor: auth; style: match OpenAI; feat: custom social login order (#1421) * refactor(Login & Registration) * fix(Registration) test errors * refactor(LoginForm & ResetPassword) * fix(LoginForm): display 'undefined' when loading page; style(SocialButton): match OpenAI's graphics * some refactor and style update for social logins * style: width like OpenAI; feat: custom social login order; refactor: alphabetical socials * fix(Registration & Login) test * Update .env.example * Update .env.example * Update dotenv.md * refactor: remove `SOCIAL_LOGIN_ORDER` for `socialLogins` configured from `librechat.yaml` - initialized by AppService, attached as app.locals property - rename socialLoginOrder and loginOrder to socialLogins app-wide for consistency - update types and docs - initialize config variable as array and not singular string to parse - bump data-provider to 0.3.9 --------- Co-authored-by: Danny Avila * 🔧 fix: socialLogins default value (#1730) * fix: socialLogins default value * ci: add test for `AppService` * 📇 refactor(convoSchema): index `updatedAt` field (#1732) * 📖 docs: fix link pointing to dotenv guide (#1739) * ✏️ update dotenv.md (#1740) update the note about rebuilding LibreChat after configuration changes since the .env file is now mounted into the volume * 🛠️ chore: Refactor Update Script to Utilize Docker Compose v2 (#1752) * 👤 feat: User ID in Model Query; chore: cleanup ModelService (#1753) * feat: send the LibreChat user ID as a query param when fetching the list of models * chore: update bun * chore: change bun command for building data-provider * refactor: prefer use of `getCustomConfig` to access custom config, also move to `server/services/Config` * refactor: make endpoints/custom option for the config optional, add userIdQuery, and use modelQueries log store in ModelService * refactor(ModelService): use env variables at runtime, use default models from data-provider, and add tests * docs: add `userIdQuery` * fix(ci): import changed * 🦙 docs: Ollama Docs Update (#1756) * Update to use docker-compose.overridge.yml Add GPU Acceleration links * Update litellm.md * 🧩 feat: Support Alternate API Keys for Plugins (#1760) * refactor(DALL-E): retrieve env variables at runtime and not from memory * feat(plugins): add alternate env variable handling to allow setting one api key for multiple plugins * docs: update docs * 🐳 feat: Push Container Images to DockerHub (#1762) * ⬤ style: Circular Streaming Cursor (#1736) * Updated Style Cursor like ChatGPT * style(Markdown.tsx): add space before cursor when there is text * fix: revert OpenAIClient.tokens.js change * fix:(Markdown.tsx): revert change of unused file * fix(convos.spec.ts): test fix * chore: remove raw HTML for cursor animations --------- Co-authored-by: Danny Avila Co-authored-by: Danny Avila * 🔌 fix: Minor Plugins Improvements (#1766) * fix(PluginsClient): don't invoke `getFunctionModelName` when using Azure OpenAI * fix: plugins styling fix with new cursor * ci(PluginsClient): test azure exception for getFunctionModelName * 🧪 ci: Fix Conversation Grouping Tests * 🖌️ style: Update conversation history groups (#1770) * style: Add month groups to conversation history * style: Change "Last x days" to "Previous x days" to match ChatGPT * style: Add "Yesterday" to conversation groups to match ChatGPT * fix: use startOfDay for Yesterday conversation group * fix: Output month name instead of number in conversation group name * test: Validate new conversation groups are created properly * fix: Formatting of month category string was wrong * 🎉 happy birthday LibreChat (#1768) * happy birthday LibreChat * Refactor endpoint condition in Landing component * Update birthday message in Eng.tsx * fix(/config): avoid nesting ternaries * refactor(/config): check birthday --------- Co-authored-by: Danny Avila * 🐳 docs: update to compose v2 (#1767) * ✔️ docs: update custom_config.md (#1774) Add link to https://yamlchecker.com/ * 📝 docs: clarifications - override file & balance/token count (#1783) * 📝 docs: override file clarification * 📝 docs: override file clarification * 📝 docs: balance & token count clarification * ✨ Release: v0.6.9 (#1789) * chore: Update Docker build and push actions (#1790) * 🐋 chore: add tag for `latest` for ci/cd docker builds (#1791) * ✨ feat: Assistants API, General File Support, Side Panel, File Explorer (#1696) * feat: assistant name/icon in Landing & Header * feat: assistname in textarea placeholder, and use `Assistant` as default name * feat: display non-image files in user messages * fix: only render files if files.length is > 0 * refactor(config -> file-config): move file related configuration values to separate module, add excel types * chore: spreadsheet file rendering * fix(Landing): dark mode style for Assistant Name * refactor: move progress incrementing to own hook, start smaller, cap near limit \(1\) * refactor(useContentHandler): add empty Text part if last part was completed tool or image * chore: add accordion trigger border styling for dark mode * feat: Assistant Builder model selection * chore: use Spinner when Assistant is mutating * fix(get/assistants): return correct response object `AssistantListResponse` * refactor(Spinner): pass size as prop * refactor: make assistant crud mutations optimistic, add types for options * chore: remove assistants route and view * chore: move assistant builder components to separate directory * feat(ContextButton): delete Assistant via context button/dialog, add localization * refactor: conditionally show use and context menu buttons, add localization for create assistant * feat: save side panel states to localStorage * style(SidePanel): improve avatar menu and assistant select styling for dark mode * refactor: make NavToggle reusable for either side (left or right), add SidePanel Toggle with ability to close it completely * fix: resize handle and navToggle behavior * fix(/avatar/:assistant_id): await `deleteFile` and assign unique name to uploaded image * WIP: file UI components from PR #576 * refactor(OpenAIMinimalIcon): pass className * feat: formatDate helper fn * feat: DataTableColumnHeader * feat: add row selection, formatted row values, number of rows selected * WIP: add files to Side panel temporarily * feat: `LB_QueueAsyncCall`: Leaky Bucket queue for external APIs, use in `processDeleteRequest` * fix(TFile): correct `source` type with `FileSources` * fix(useFileHandling): use `continue` instead of return when iterating multiple files, add file type to extendedFile * chore: add generic setter type * refactor(processDeleteRequest): settle promises to prevent rejections from processing deletions, log errors * feat: `useFileDeletion` to reuse file deletion logic * refactor(useFileDeletion): make `setFiles` an optional param and use object as param * feat: useDeleteFilesFromTable * feat: use real `files` data and add deletion action to data table * fix(Table): make headers sticky * feat: add dynamic filtering for columns; only show to user Host or OpenAI storage type * style(DropdownMenu): replace `slate` with `gray` * style(DataTable): apply dark mode themes and other misc styling * style(Columns): add color to OpenAI Storage option * refactor(FileContainer): make file preview reusable * refactor(Images): make image preview reusable * refactor(FilePreview): make file prop optional for FileIcon and FilePreview, fix relative style * feat(Columns): add file/image previews, set a minimum size to show for file size in bytes * WIP: File Panel with real files and formatted * feat: open files dialog from panel * style: file data table mobile and general column styling fixes * refactor(api/files): return files sorted by the most recently updated * refactor: provide fileMap through context to prevent re-selecting files to map in different areas; remove unused imports commented out in PanelColumns * refactor(ExtendFile): make File type optional, add `attached` to prevent attached files from being deleted on remove, make Message.files a partial TFile type * feat: attach files through file panel * refactor(useFileHandling): move files to the start of cache list when uploaded * refactor(useDeleteFilesMutation): delete files from cache when successfully deleted from server * fix(FileRow): handle possible edge case of duplication due to attaching recently uploaded file * style(SidePanel): make resize grip border transparent, remove unnecessary styling on close sidepanel button * feat: action utilities and tests * refactor(actions): add `ValidationResult` type and change wording for no server URL found * refactor(actions): check for empty server URL * fix(data-provider): revert tsconfig to fix type issue resolution * feat(client): first pass of actions input for assistants * refactor(FunctionSignature): change method to output object instead of string * refactor(models/Assistant): add actions field to schema, use searchParams object for methods, and add `getAssistant` * feat: post actions input first pass - create new Action document - add actions to Assistant DB document - create /action/:assistant_id POST route - pass more props down from PanelSwitcher, derive assistant_id from switcher - move privacy policy to ActionInput - reset data on input change/validation - add `useUpdateAction` - conform FunctionSignature type to FunctionTool - add action, assistant doc, update hook related types * refactor: optimize assistant/actions relationship - past domain in metadata as hostname and not a URL - include domain in tool name - add `getActions` for actions retrieval by user - add `getAssistants` for assistant docs retrieval by user - add `assistant_id` to Action schema - move actions to own module as a subroute to `api/assistants` - add `useGetActionsQuery` and `useGetAssistantDocsQuery` hooks - fix Action type def * feat: show assistant actions in assistant builder * feat: switch to actions on action click, editing action styling * fix: add Assistant state for builder panel to allow immediate selection of newly created assistants as well as retaining the current assistant when switching to a different panel within the builder * refactor(SidePanel/NavToggle): offset less from right when SidePanel is completely collapsed * chore: rename `processActions` -> `processRequiredActions` * chore: rename Assistant API Action to RequiredAction * refactor(actions): avoid nesting actual API params under generic `requestBody` to optimize LLM token usage * fix(handleTools): avoid calling `validTool` if not defined, add optional param to skip the loading of specs, which throws an error in the context of assistants * WIP: working first pass of toolCalls generated from openapi specs * WIP: first pass ToolCall styling * feat: programmatic iv encryption/decryption helpers * fix: correct ActionAuth types/enums, and define type for AuthForm * feat: encryption/decryption helpers for Action AuthMetadata * refactor(getActions): remove sensitive fields from query response * refactor(POST/actions): encrypt and remove sensitive fields from mutation response * fix(ActionService): change ESM import to CJS * feat: frontend auth handling for actions + optimistic update on action update/creation * refactor(actions): use the correct variables and types for setAuth method * refactor: POST /:assistant_id action can now handle updating an existing action, add `saved_auth_fields` to determine when user explicitly saves new auth creds. only send auth metadata if user explicitly saved fields * refactor(createActionTool): catch errors and send back meaningful error message, add flag to `getActions` to determine whether to retrieve sensitive values or not * refactor(ToolService): add `action` property to ToolCall PartMetadata to determine if the tool call was an action, fix parsing function name issue with actionDelimiter * fix(ActionRequest): use URL class to correctly join endpoint parts for `execute` call * feat: delete assistant actions * refactor: conditionally show Available actions * refactor: show `retrieval` and `code_interpreter` as Capabilities, swap `Switch` for `Checkbox` * chore: remove shadow-stroke from messages * WIP: first pass of Assistants Knowledge attachments * refactor: remove AssistantsProvider in favor of FormProvider, fix selectedAssistant re-render bug, map Assistant file_ids to files via fileMap, initialize Knowledge component with mapped files if any exist * fix: prevent deleting files on assistant file upload * chore: remove console.log * refactor(useUploadFileMutation): update files and assistants cache on upload * chore: disable oauth option as not supported yet * feat: cancel assistant runs * refactor: initialize OpenAI client with helper function, resolve all related circular dependencies * fix(DALL-E): initialization * fix(process): openai client initialization * fix: select an existing Assistant when the active one is deleted * chore: allow attaching files for assistant endpoint, send back relevant OpenAI error message when uploading, deconstruct openAI initialization correctly, add `message_file` to formData when a file is attached to the message but not the assistant * fix: add assistant_id on newConvo * fix(initializeClient): import fix * chore: swap setAssistant for setOption in useEffect * fix(DALL-E): add processFileURL to loadTools call * chore: add customConfig to debug logs * feat: delete threads on convo delete * chore: replace Assistants icon * chore: remove console.dir() in `abortRun` * feat(AssistantService): accumulate text values from run in openai.responseText * feat: titling for assistants endpoint * chore: move panel file components to appropriate directory, add file checks for attaching files, change icon for Attach Files * refactor: add localizations to tools, plugins, add condition for adding/remove user plugins so tool selections don't affect this value * chore: disable `import from url` action for now * chore: remove textMimeTypes from default fileConfig for now * fix: catch tool errors and send as outputs with error messages * fix: React warning about button as descendant of button * style: retrieval and cancelled icon * WIP: pass isSubmitting to Parts, use InProgressCall to display cancelled tool calls correctly, show domain/function name * fix(meilisearch): fix `postSaveHook` issue where indexing expects a mongo document, and join all text content parts for meili indexing * ci: fix dall-e tests * ci: fix client tests * fix: button types in actions panel * fix: plugin auth form persisting across tool selections * fix(ci): update AppService spec with `loadAndFormatTools` * fix(clearConvos): add id check earlier on * refactor(AssistantAvatar): set previewURL dynamically when emtadata.avatar changes * feat(assistants): addTitle cache setting * fix(useSSE): resolve rebase conflicts * fix: delete mutation * style(SidePanel): make grip visible on active and hover, invisible otherwise * ci: add data-provider tests to workflow, also update eslint/tsconfig to recognize specs, and add `text/csv` to fileConfig * fix: handle edge case where auth object is undefined, and log errors * refactor(actions): resolve schemas, add tests for resolving refs, import specs from separate file for tests * chore: remove comment * fix(ActionsInput): re-render bug when initializing states with action fields * fix(patch/assistant): filter undefined tools * chore: add logging for errors in assistants routes * fix(updateAssistant): map actions to functions to avoid overwriting * fix(actions): properly handle GET paths * fix(convos): unhandled delete thread exception * refactor(AssistantService): pass both thread_id and conversationId when sending intermediate assistant messages, remove `mapMessagesToSteps` from AssistantService * refactor(useSSE): replace all messages with runMessages and pass latestMessageId to abortRun; fix(checkMessageGaps): include tool calls when syncing messages * refactor(assistants/chat): invoke `createOnTextProgress` after thread creation * chore: add typing * style: sidepanel styling * style: action tool call domain styling * feat(assistants): default models, limit retrieval to certain models, add env variables to to env.example * feat: assistants api key in EndpointService * refactor: set assistant model to conversation on assistant switch * refactor: set assistant model to conversation on assistant select from panel * fix(retrieveAndProcessFile): catch attempt to download file with `assistant` purpose which is not allowed; add logging * feat: retrieval styling, handling, and logging * chore: rename ASSISTANTS_REVERSE_PROXY to ASSISTANTS_BASE_URL * feat: FileContext for file metadata * feat: context file mgmt and filtering * style(Select): hover/rounded changes * refactor: explicit conversation switch, endpoint dependent, through `useSelectAssistant`, which does not create new chat if current endpoint is assistant endpoint * fix(AssistantAvatar): make empty previewURL if no avatar present * refactor: side panel mobile styling * style: merge tool and action section, optimize mobile styling for action/tool buttons * fix: localStorage issues * fix(useSelectAssistant): invoke react query hook directly in select hook as Map was not being updated in time * style: light mode fixes * fix: prevent sidepanel nav styling from shifting layout up * refactor: change default layout (collapsed by default) * style: mobile optimization of DataTable * style: datatable * feat: client-side hide right-side panel * chore(useNewConvo): add partial typing for preset * fix(useSelectAssistant): pass correct model name by using template as preset * WIP: assistant presets * refactor(ToolService): add native solution for `TavilySearchResults` and log tool output errors * refactor: organize imports and use native TavilySearchResults * fix(TavilySearchResults): stringify result * fix(ToolCall): show tool call outputs when not an action * chore: rename Prompt Prefix to custom instructions (in user facing text only) * refactor(EditPresetDialog): Optimize setting title by debouncing, reset preset on dialog close to avoid state mixture * feat: add `presetOverride` to overwrite active conversation settings when saving a Preset (relevant for client side updates only) * feat: Assistant preset settings (client-side) * fix(Switcher): only set assistant_id and model if current endpoint is Assistants * feat: use `useDebouncedInput` for updating conversation settings, starting with EditPresetDialog title setting and Assistant instructions setting * feat(Assistants): add instructions field to settings * feat(chat/assistants): pass conversation settings to run body * wip: begin localization and only allow actions if the assistant is created * refactor(AssistantsPanel): knowledge localization, allow tools on creation * feat: experimental: allow 'priming' values before assistant is created, that would normally require an assistant_id to be defined * chore: trim console logs and make more meaningful * chore: toast messages * fix(ci): date test * feat: create file when uploading Assistant Avatar * feat: file upload rate limiting from custom config with dynamic file route initialization * refactor: use file upload limiters on post routes only * refactor(fileConfig): add endpoints field for endpoint specific fileconfigs, add mergeConfig function, add tests * refactor: fileConfig route, dynamic multer instances used on all '/' and '/images' POST routes, data service and query hook * feat: supportedMimeTypesSchema, test for array of regex * feat: configurable file config limits * chore: clarify assistants file knowledge prereq. * chore(useTextarea): default to localized 'Assistant' if assistant name is empty * feat: configurable file limits and toggle file upload per endpoint * fix(useUploadFileMutation): prevent updating assistant.files cache if file upload is a message_file attachment * fix(AssistantSelect): set last selected assistant only when timeout successfully runs * refactor(queries): disable assistant queries if assistants endpoint is not enabled * chore(Switcher): add localization * chore: pluralize `assistant` for `EModelEndpoint key and value * feat: show/hide assistant UI components based on endpoint availability; librechat.yaml config for disabling builder section and setting polling/timeout intervals * fix(compactEndpointSchemas): use EModelEndpoint for schema access * feat(runAssistant): use configured values from `librechat.yaml` for `pollIntervalMs` and `timeout` * fix: naming issue * wip: revert landing * 🎉 happy birthday LibreChat (#1768) * happy birthday LibreChat * Refactor endpoint condition in Landing component * Update birthday message in Eng.tsx * fix(/config): avoid nesting ternaries * refactor(/config): check birthday --------- Co-authored-by: Danny Avila * fix: landing * fix: landing * fix(useMessageHelpers): hardcoded check to use EModelEndpoint instead * fix(ci): convo test revert to main * fix(assistants/chat): fix issue where assistant_id was being saved as model for convo * chore: added logging, promises racing to prevent longer timeouts, explicit setting of maxRetries and timeouts, robust catching of invalid abortRun params * refactor: use recoil state for `showStopButton` and only show for assistants endpoint after syncing conversation data * refactor: optimize abortRun strategy using localStorage, refactor `abortConversation` to use async/await and await the result, refactor how the abortKey cache is set for runs * fix(checkMessageGaps): assign `assistant_id` to synced messages if defined; prevents UI from showing blank assistant for cancelled messages * refactor: re-order sequence of chat route, only allow aborting messages after run is created, cancel abortRun if there was a cancelling error (likely due already cancelled in chat route), and add extra logging * chore(typedefs): add httpAgent type to OpenAIClient * refactor: use custom implementation of retrieving run with axios to allow for timing out run query * fix(waitForRun): handle timed out run retrieval query * refactor: update preset conditions: - presets will retain settings when a different endpoint is selected; for existing convos, either when modular or is assistant switch - no longer use `navigateToConvo` on preset select * fix: temporary calculator hack as expects string input when invoked * fix: cancel abortRun only when cancelling error is a result of the run already being cancelled * chore: remove use of `fileMaxSizeMB` and total counterpart (redundant) * docs: custom config documentation update * docs: assistants api setup and dotenv, new custom config fields * refactor(Switcher): make Assistant switcher sticky in SidePanel * chore(useSSE): remove console log of data and message index * refactor(AssistantPanel): button styling and add secondary select button to bottom of panel * refactor(OpenAIClient): allow passing conversationId to RunManager through titleConvo and initializeLLM to properly record title context tokens used in cases where conversationId was not defined by the client * feat(assistants): token tracking for assistant runs * chore(spendTokens): improve logging * feat: support/exclude specific assistant Ids * chore: add update `librechat.example.yaml`, optimize `AppService` handling, new tests for `AppService`, optimize missing/outdate config logging * chore: mount docker logs to root of project * chore: condense axios errors * chore: bump vite * chore: vite hot reload fix using latest version * chore(getOpenAIModels): sort instruct models to the end of models list * fix(assistants): user provided key * fix(assistants): user provided key, invalidate more queries on revoke --------- Co-authored-by: Marco Beretta <81851188+Berry-13@users.noreply.github.com> * 🔧 fix(data-provider): add openapi-types dependency (#1797) * fix(data-provider): add openapi-types dependency * chore: Bump version to 0.4.1 in package.json * 🤖 docs(assistants): Additional Setup & Tool Selection Info (#1798) * 📝 docs: Enhance LibreChat Docker deployment guide (#1796) - Revise the description for clarity and conciseness. - Provide a direct comparison between the advanced Docker Compose deployment and the simpler `docker-compose.override.yml` setup. - Update screenshot link for visual reference. * ✏️ fix(Convo): Rename Title UX (#1793) * 🤖 chore: Improve Assistants Run Logging (#1801) * 👥 fix: Reinstate Default Social Login Values (#1811) * fix: social logins accidentally removed default in AppService, reinstated and added test * chore: move birthday to OTHER section and make disabled by default * 📝 docs: Update docker-compose.override.yml.example * fix: necessary font changes (#1818) * fix: necessary font changes * chore: minor bump * 🐋 chore: Add Docker Compose Build Latest Main Image workflow (#1819) * Update main-image-workflow.yml * Update main-image-workflow.yml * Update main-image-workflow.yml * Update main-image-workflow.yml * 🔀 fix: Endpoint Type Mismatch when Switching Conversations (#1834) * refactor(useUpdateUserKeysMutation): only invalidate the endpoint whose key is being updated by user * fix(assistants): await `getUserKeyExpiry` call * chore: fix spinner loading color * refactor(initializeClient): make known which endpoint api Key is missing * fix: prevent an `endpointType` mismatch by making it impossible to assign when the `endpointsConfig` doesn't have a `type` defined, also prefer `getQueryData` call to useQuery in useChatHelpers * 📝 docs: add env changes to breaking_changes.md and minor fixes (#1812) * 📝 docs: add env changes to breacking_changes.md * 📝 docs: replace example in docker_override.md * 📝 docs: fix images in zeabur.md * 🔗 chore: Add Stable Discord and Homepage Links (#1835) * 📝 chore: Update README.md * 📤 refactor: Utilize `intermediateReply` when `message.content` is Empty * 🛡️ feat: Model Validation Middleware (#1841) * refactor: add ViolationTypes enum and add new violation for illegal model requests * feat: validateModel middleware to protect the backend against illicit requests for unlisted models * ⬤ style: Uniform Display of Result-Streaming Cursor (#1842) * 📋 feat: Accumulate Text Parts to Clipboard for Assistant Outputs (#1847) * 🛠️ refactor: Model Loading and Custom Endpoint Error Handling (#1849) * fix: handle non-assistant role ChatCompletionMessage error * refactor(ModelController): decouple res.send from loading/caching models * fix(custom/initializeClient): only fetch custom endpoint models if models.fetch is true * refactor(validateModel): load models if modelsConfig is not yet cached * docs: update on file upload rate limiting * 🐛 fix: Preserve Default Model in Message Requests (#1857) * fix: do not remove default model from message request * chore: bump data-provider * 🐋 Feat: docker pre-built image by default (#1860) * 🐋 Feat: docker pre-built image by default * 🐋 Feat: docker LibreChat ports from .env * 🎨 feat: Create Avatars of Initials Locally (#1869) * ✏️docs: add tavily to env.example and dotenv.md (#1866) * update .env.example add "TAVILY_API_KEY=" to .env.example * update dotenv.md add Tavily to dotenv.md * 🗨️ fix: Prevent Resetting Title to 'New Chat' on Follow-Up Message (#1870) * fix: prevent reseting title to 'New Chat' on follow up message * chore(useSSE): remove empty line * 🐋 docs: update breaking_changes.md (#1864) add note about the use of the pre-built image in docker-compose.yml * 🔀 fix: Correct Expected Behavior for Modular Chat Feature (#1871) * 📒 docs: Add newline for list to be correctly rendered in UI (#1873) Currently in the documentation page the bullet list is not rendered correctly. (See first paragraph on this docs page: https://docs.librechat.ai/install/configuration/litellm.html) * 🔧 feat: optional librechat.yaml path via environment variable (#1858) Co-authored-by: afel * 🅰️ feat: Azure Config to Allow Different Deployments per Model (#1863) * wip: first pass for azure endpoint schema * refactor: azure config to return groupMap and modelConfigMap * wip: naming and schema changes * refactor(errorsToString): move to data-provider * feat: rename to azureGroups, add additional tests, tests all expected outcomes, return errors * feat(AppService): load Azure groups * refactor(azure): use imported types, write `mapModelToAzureConfig` * refactor: move `extractEnvVariable` to data-provider * refactor(validateAzureGroups): throw on duplicate groups or models; feat(mapModelToAzureConfig): throw if env vars not present, add tests * refactor(AppService): ensure each model is properly configured on startup * refactor: deprecate azureOpenAI environment variables in favor of librechat.yaml config * feat: use helper functions to handle and order enabled/default endpoints; initialize azureOpenAI from config file * refactor: redefine types as well as load azureOpenAI models from config file * chore(ci): fix test description naming * feat(azureOpenAI): use validated model grouping for request authentication * chore: bump data-provider following rebase * chore: bump config file version noting significant changes * feat: add title options and switch azure configs for titling and vision requests * feat: enable azure plugins from config file * fix(ci): pass tests * chore(.env.example): mark `PLUGINS_USE_AZURE` as deprecated * fix(fetchModels): early return if apiKey not passed * chore: fix azure config typing * refactor(mapModelToAzureConfig): return baseURL and headers as well as azureOptions * feat(createLLM): use `azureOpenAIBasePath` * feat(parsers): resolveHeaders * refactor(extractBaseURL): handle invalid input * feat(OpenAIClient): handle headers and baseURL for azureConfig * fix(ci): pass `OpenAIClient` tests * chore: extract env var for azureOpenAI group config, baseURL * docs: azureOpenAI config setup docs * feat: safe check of potential conflicting env vars that map to unique placeholders * fix: reset apiKey when model switches from originally requested model (vision or title) * chore: linting * docs: CONFIG_PATH notes in custom_config.md * 🖌️ style: auth dark theme (#1862) * Remove minLength validation and update login link style * Add theme selector component and update login form styles * Update styling in Login and LoginForm components * Update ResetPassword component styles and text color * Refactor login component and add theme selector * Add ThemeSelector component to Registration, RequestPasswordReset, and ResetPassword pages * chore(Login.tsx): remove unused `useCallback` * chore(Login.tsx) import order * Update ResetPassword.tsx import order * Update RequestPasswordReset.tsx import order * Update Registration.tsx import order --------- Co-authored-by: Danny Avila * 🔥chore: bump firebase dependency (#1900) * 🌍 : Update Portuguese Translations (#1867) * 🌍 : Update Portuguese Translations * 🌍 : Fix Portuguese Translations * fix(Br): lint errors --------- Co-authored-by: Berry-13 <81851188+Berry-13@users.noreply.github.com> * 🅰️ feat: Azure AI Studio, Models as a Service Support (#1902) * feat(data-provider): add Azure serverless inference handling through librechat.yaml * feat(azureOpenAI): serverless inference handling in api * docs: update docs with new azureOpenAI endpoint config fields and serverless inference endpoint setup * chore: remove unnecessary checks for apiKey as schema would not allow apiKey to be undefined * ci(azureOpenAI): update tests for serverless configurations * 🛠️ chore: Abort AI Requests on Close & Remove Verbose Logs for Plugins (#1914) * chore: remove verbose logging of ChatOpenAI * feat: abort AI requests on request close * 🤖 docs: Add Groq and other Compatible AI Endpoints (#1915) * chore: bump bun dependencies * feat: make `groq` a known endpoint * docs: compatible ai endpoints * Update ai_endpoints.md * Update ai_endpoints.md * 🍞 fix: Minor fixes and improved Bun support (#1916) * fix(bun): fix bun compatibility to allow gzip header: https://github.com/oven-sh/bun/issues/267#issuecomment-1854460357 * chore: update custom config examples * fix(OpenAIClient.chatCompletion): remove redundant call of stream.controller.abort() as `break` aborts the request and prevents abort errors when not called redundantly * chore: bump bun.lockb * fix: remove result-thinking class when message is no longer streaming * fix(bun): improve Bun support by forcing use of old method in bun env, also update old methods with new customizable params * fix(ci): pass tests * 🔗 feat: NavLinks customization for Help & Faq URL (#1872) * help and faq * fix: using only one var * revert(types.ts): showHelpAndFaq * Update dotenv.md * Update dotenv.md * 🤖feat: add multiple known endpoints (#1917) * feat: add known endpoints * docs: add known endpoints * update ai_endpoints.md remove the groq icon from the example * Update ai_endpoints.md --------- Co-authored-by: Danny Avila * 🔗 feat: User Provided Base URL for OpenAI endpoints (#1919) * chore: bump browserslist-db@latest * refactor(EndpointService): simplify with `generateConfig`, utilize optional baseURL for OpenAI-based endpoints, use `isUserProvided` helper fn wherever needed * refactor(custom/initializeClient): use standardized naming for common variables * feat: user provided baseURL for openAI-based endpoints * refactor(custom/initializeClient): re-order operations * fix: knownendpoints enum definition and add FetchTokenConfig, bump data-provider * refactor(custom): use tokenKey dependent on userProvided conditions for caching and fetching endpointTokenConfig, anticipate token rates from custom config * refactor(custom): assure endpointTokenConfig is only accessed from cache if qualifies for fetching * fix(ci): update tests for initializeClient based on userProvideURL changes * fix(EndpointService): correct baseURL env var for assistants: `ASSISTANTS_BASE_URL` * fix: unnecessary run cancellation on res.close() when response.run is completed * feat(assistants): user provided URL option * ci: update tests and add test for `assistants` endpoint * chore: leaner condition for request closing * chore: more descriptive error message to provide keys again * 🌍 feat: Extend regex to support international usernames (#1918) * 🌍 Extend regex to support international usernames * update validators.spec.js * 🛠️ fix: RunManager, AssistantService and useContentHandler Issues (#1920) * fix(useContentHandler): retain undefined parts and handle them within `ContentParts` rendering * fix(AssistantService/in_progress): skip empty messages * refactor(RunManager): create highly specific `seenSteps` Set keys for RunSteps with use of `getDetailsSignature` and `getToolCallSignature`,to ensure changes from polling are always captured * 🐳 experimental: Dev Image Workflow & Remove Unused Code (#1928) * chore: remove unused code in progressCallback, as well as handle reply.trim(), post `getCompletion` * chore(Dockerfile): remove curl installation * experimental: dev image parallelized with matrix strategy and building for amd64/arm64 support * make platforms explicit * 🐳 chore(Dockerfile): replace `npm ci` with `npm install` for OS specific builds * 🐳chore(Dockerfile): add additional steps to prevent arm64 build failure * 🔎docs: update meilisearch instruction (#1930) * 🔎docs: update meilisearch in mac_install.md Update the Meilisearch .env variables in `mac_install.md` * 🔎🐧 * 📝 feat: Improved Textarea Functionality (#1942) * feat: paste plain text from apps with rich paste data, improved edit message textarea, improved height resizing for long text * feat(EditMessage): autofocus * chore: retain user text color when entering edit mode * 👤 feat: Show Default Icon if No Avatar or Username provided (#1943) * 🖥️ feat: Match STDOUT Logs with Debug File Logs (#1944) * chore: improve token balance logging post-request * feat: match stdout logging with file debug logging when using DEBUG_CONSOLE * 📚 docs: Separate LiteLLM and Ollama Documentation (#1948) * Separate LiteLLM and Ollama Documentation * Clarify Ollama Setup * Fix litellm config * 🔧 fix(useTextarea): duplicate text when pasting on chromium (#1951) * 🔧 fix(EditMessage): duplicate text when pasting (#1970) * fix(EditMessage): duplicate text when pasting on chromium * add back paste data handling, prevent default behavior --------- Co-authored-by: Danny Avila * 🪙 fix(config): use new field for balance * 🧩 fix(Plugins): Keep User `agentModel` and Model Validation (#1972) * fix: do not override model * temp fix for secondary model validation * 🦙 doc: add Ollama to index and update icon (#1967) * 🌍 : Add Hebrew Translation (#1953) * feat: add hebrew * fix: review issues * fix language options * 🥷🪦 docs: remove ninja and chatgptBrowser (#1973) * 🧪 fix(ci): update failing `initializeClient` tests with new expected values (#1982) * fix(ci): update failing tests with new expected values from `getUserKey` * refactor: safer optional chaining, and ensure apiKey is defined * 🔎 update meilisearch to v1.6 / 0.37.0 (#1981) * 🔎 update meilisearch to v1.6 / 0.37.0 * 🔎 update meilisearch to v1.6 / 0.37.0 * 🛠️ refactor(loadConfigModels): make apiKey and baseURL pairings more versatile (#1985) * 🤖 feat(Anthropic): Claude 3 & Vision Support (#1984) * chore: bump anthropic SDK * chore: update anthropic config settings (fileSupport, default models) * feat: anthropic multi modal formatting * refactor: update vision models and use endpoint specific max long side resizing * feat(anthropic): multimodal messages, retry logic, and messages payload * chore: add more safety to trimming content due to whitespace error for assistant messages * feat(anthropic): token accounting and resending multiple images in progress * chore: bump data-provider * feat(anthropic): resendImages feature * chore: optimize Edit/Ask controllers, switch model back to req model * fix: false positive of invalid model * refactor(validateVisionModel): use object as arg, pass in additional/available models * refactor(validateModel): use helper function, `getModelsConfig` * feat: add modelsConfig to endpointOption so it gets passed to all clients, use for properly validating vision models * refactor: initialize default vision model and make sure it's available before assigning it * refactor(useSSE): avoid resetting model if user selected a new model between request and response * feat: show rate in transaction logging * fix: return tokenCountMap regardless of payload shape * 🖋️ fix(OpenAIClient): remove typo * 🔎 feat: Traversaal Search Tool (#1991) * wip: Traversaal Search Tool * fix(traversaal): properly handle tool error, show error to LLM, log * feat(traversaal): finish implementation of structured tool * chore: change traversaal order * 🔎 fix(Traversaal): Recognize `authField` during Tool Initialization * 🖌️ style: Update Light/Dark UI Themes (#1754) * BIG UI UPDATE * fix: search bar, dialog template, new chat icon, convo icon and delete/rename button * moved some color config and a lot of files * small text fixes and tailwind config refactor * Update localization and UI styles * Update styles and add user-select:none to Tooltip component * Update mobile.css styles for navigation mask and background color * Update component imports and styles * Update DeleteButton imports and references * Update UI components * Update tooltip delay duration * Fix styling and update text in various components * fixed assistant style * minor style fixes * revert: removed CreationHeader & CreationPanel * style: match new styling for SidePanel * style: match bg-gray-800 to ChatGPT (#212121) * style: remove slate for gray where applicable to match new light theme --------- Co-authored-by: Danny Avila * 📝 docs update: Anthropic models + Traversaal (#1995) * 📝 docs update: Anthropic models + Traversaal * 📝 docs update: Anthropic models * 🖌️ style: update dialog position (#1999) * style(ChatForm): update styling and fixed style bug * style:(Dialog): reduced max height style(Settings): fixed dialog position height * style(Settings): fixed large screen position * 🔧 style: Improve UI and UX with Style Fixes and Code Refactors (#2002) * refactor(useSSE): add useCallback to all event handlers * chore: remove modelName in defaultAssistantFormValues * fix(SidePanel): fix layout shift on chrome my removing sidenav scrollbar * style(ChatForm): match ChatGPT textarea effect styling * style: fix flickering of old background color on refresh * 📝 docs: additions to deployment guide (#2001) * docs: add intro to deployment guide * doc: update intro * doc: Add NGINX deployment guide and update reverse proxy link * doc:: add reverse proxy pages and weight for the pages * doc: Update NGINX configuration file * doc: imporve new doc * Doc: fix file names * doc: fix references names + improve the introduction with chatgpt :-) * doc: update introduction guide headings * 💾 chore: Update .env.example (#2004) * Update .env.example Make assistants show in the UI by default * Update dotenv.md * 🌊 docs: refactor DigitalOcean guide (#2006) * 🔍 feat: Add Google Search Tool for Assistants (#1994) * 👥 fix(assistants): Improve Error handling (#2012) * feat: make assistants endpoint appendable since message state is not managed by LibreChat * fix(ask): search currentMessages for thread_id if it's not defined * refactor(abortMiddleware): remove use of `overrideProps` and spread unknown fields instead * chore: remove console.log in `abortConversation` * refactor(assistants): improve error handling/cancellation flow * 🖼️ fix: Clipboard Files & File Name Issues (#2015) * fix: ensure image handling fetchs image to base64 for multiple images * fix: append file_id's when writing uploaded files * feat: timestamp files uploaded from clipboard * chore: add a different fileid+name separator * 🖊️chore: fix deployment guides (#2021) * 🔖 chore: update groq models (#2031) * 🔧 fix(ThemeContext): Listen for Theme Changes (#2037) * fix(ThemeContext): listen for changes * fix(Dropdown): theme auto-update not working * ✏️ docs: Railway, Traefik, and Improvements (#2060) * docs: documentation guidelines * docs: deploy documentation update * 📧 update email templates (#2057) * 📧 chore: update email templates * 📧 update password reset confirmation * ✍️ refactor(Textarea): Optimize Text Input & Enhance UX (#2058) * refactor(useDebouncedInput): make object as input arg and accept setter * refactor(ChatForm/Textarea): consolidate textarea/form logic to one component, use react-hook-form, programmatically click send button instead of passing submitMessage, forwardRef and memoize SendButton * refactor(Textarea): use Controller field value to avoid manual update of ref * chore: remove forms provider * chore: memoize AttachFile * refactor(ChatForm/SendButton): only re-render SendButton when there is text input * chore: make iconURL bigger * chore: optimize Root/Nav * refactor(SendButton): memoize disabled prop based on text * chore: memoize Nav and ChatForm * chore: remove textarea ref text on submission * feat(EditMessage): Make Esc exit the edit mode and dismiss changes when editing a message * style(MenuItem): Display the ☑️ icon only on the selected model * 🔧 style(SidePanel): Center buttons when collapsed (#2045) * feat: Improve Google search plugin to assistants * 🔧 fix(Nav SidePanel): Center buttons when collapsed * 🖌️ style: Minor UI Updates (#2011) * UI Design update * Add an error icon next to the avatar. * fix * Change the style of buttons * fix: avatar * 🌐 feat: librechat.yaml from URL (#2064) * feat: librechat.yaml from URL * doc update: librechat.yaml from URL * update dotenv.md - typo * Update loadCustomConfig.js * ci: specs for loadCustomConfig * fix(processFileURL): safe destructuring of saveURL result --------- Co-authored-by: fuegovic Co-authored-by: Fuegovic <32828263+fuegovic@users.noreply.github.com> * 🌑 style(AnthropicIcon): adjust for Dark Mode * 🧊 style: Adjust Endpoint Icons (#2070) * 🧊 style: Adjust Endpoint Icons * Update MessageParts.tsx * 🧹 chore: remove unused import (#2072) * chore: Update AnthropicIcon.tsx * 🔧 fix: Convo Corners & Updated Colors (#2046) * 🔧 fix: Convo Corners & Updated Colors * refactored code * chore: JSON.parse with a try/catch block, removed useless useEffect & and restored Focus * restored typescript * import all back * ⛔ style: Auth Error and Preset Items Styling (#2069) * Change the style of the error message. * ui preset items * fix style * Change the color of the border and adjust the background of the selected input * 🌍 : Update Russian Translation (#2061) * feat(chore): add missing translations in Ru.tsx * feat(chore): add missing translation for My Files menu and headers * change com_ui_my_files to com_ui_nav_files * move useLocalize above utils * feat(chore): add missing translation for My Files menu and headers * 📜 feat: Customize Privacy Policy & Terms of Service (#2091) * 🅰️ feat: Azure OpenAI Assistants API Support (#1992) * chore: rename dir from `assistant` to plural * feat: `assistants` field for azure config, spread options in AppService * refactor: rename constructAzureURL param for azure as `azureOptions` * chore: bump openai and bun * chore(loadDefaultModels): change naming of assistant -> assistants * feat: load azure settings with currect baseURL for assistants' initializeClient * refactor: add `assistants` flags to groups and model configs, add mapGroupToAzureConfig * feat(loadConfigEndpoints): initialize assistants endpoint if azure flag `assistants` is enabled * feat(AppService): determine assistant models on startup, throw Error if none * refactor(useDeleteAssistantMutation): send model along with assistant id for delete mutations * feat: support listing and deleting assistants with azure * feat: add model query to assistant avatar upload * feat: add azure support for retrieveRun method * refactor: update OpenAIClient initialization * chore: update README * fix(ci): tests passing * refactor(uploadOpenAIFile): improve logging and use more efficient REST API method * refactor(useFileHandling): add model to metadata to target Azure region compatible with current model * chore(files): add azure naming pattern for valid file id recognition * fix(assistants): initialize openai with first available assistant model if none provided * refactor(uploadOpenAIFile): add content type for azure, initialize formdata before azure options * refactor(sleep): move sleep function out of Runs and into `~/server/utils` * fix(azureOpenAI/assistants): make sure to only overwrite models with assistant models if `assistants` flag is enabled * refactor(uploadOpenAIFile): revert to old method * chore(uploadOpenAIFile): use enum for file purpose * docs: azureOpenAI update guide with more info, examples * feat: enable/disable assistant capabilities and specify retrieval models * refactor: optional chain conditional statement in loadConfigModels.js * docs: add assistants examples * chore: update librechat.example.yaml * docs(azure): update note of file upload behavior in Azure OpenAI Assistants * chore: update docs and add descriptive message about assistant errors * fix: prevent message submission with invalid assistant or if files loading * style: update Landing icon & text when assistant is not selected * chore: bump librechat-data-provider to 0.4.8 * fix(assistants/azure): assign req.body.model for proper azure init to abort runs * 🤖 fix(assistants): Default Capabilities and Retrieval Models (#2102) * 📑 docs: update .env.example (#2109) * 🌍 : Update Chinese Translations (#2098) * 🪙 feat: Assistants Token Balance & other improvements (#2114) * chore: add assistants to supportsBalanceCheck * feat(Transaction): getTransactions and refactor export of model * refactor: use enum: ViolationTypes.TOKEN_BALANCE * feat(assistants): check balance * refactor(assistants): only add promptBuffer if new convo (for title), and remove endpoint definition * refactor(assistants): Count tokens up to the current context window * fix(Switcher): make Select list explicitly controlled * feat(assistants): use assistant's default model when no model is specified instead of the last selected assistant, prevent assistant_id from being recorded in non-assistant endpoints * chore(assistants/chat): import order * chore: bump librechat-data-provider due to changes * 🎨 style: Privacy Policy & Terms of Service (#2111) * 🖊️ fix(MessageContent): Error Message typo (#2112) * 🔧 feat: Share Assistant Actions between Users (#2116) * fix: remove unique field from assistant_id, which can be shared between different users * refactor: remove unique user fields from actions/assistant queries * feat: only allow user who saved action to delete it * refactor: allow deletions for anyone with builder access * refactor: update user.id when updating assistants/actions records, instead of searching with it * fix: stringify response data in case it's an object * fix: correctly handle path input * fix(decryptV2): handle edge case where value is already decrypted * 🔧 fix: Remove `Unique` Index from Actions Model and Initialize Empty Actions for Deletion (#2118) * 🔧 feat(actions): Allow Multiple Actions from Same Domain per Assistant (#2120) * 🪰 fix: Azure Parsing and Assistants Payload (#2133) * fix(azure): fix regex to prevent edge cases * fix(assistants): pass relevant endpoint options to avoid sending them to API * 🔍 feat: Filter MultiSelect and SelectDropDown (+variants) + CSS fixes for Scrollbar (#2138) * Initial implementation of MultiSearch. Added implementation to MultiSelect and SelectDropDown and variants * Update scrollbar styles to prevent breakages on Chrome * Revert changes to vite.config.ts (redundant for now) * chore(New Chat): organize imports * style(scrollbar-transparent): use webkit as standard, expected behavior * chore: useCallback for mouse enter/leave * fix(Footer): resolve map key error * chore: memoize Conversations * style(MultiSearch): improve multisearch styling * style: dark mode search input * fix: react warnings due to unrecognize html props * chore: debounce OpenAI settings inputs * fix(useDebouncedInput): only use event value as newValue if not object --------- Co-authored-by: Flynn * 📋 chore: add requirements.txt to documentation (#2122) * chore: add requirements.txt to documentation, to ease maintenance * docs: Update documentation_guidelines.md * 🔧 style(fix): Convo Title Fade Effect (#2117) * feat: Improve Google search plugin to assistants * 🔧 fix(Nav SidePanel): Center buttons when collapsed * 🔧(fix) Convo title fade effect * 🔧(fix) Convo title fade effect / remove deletion * 🔧(fix) Convo title fade effect / remove deletion .env.example * 🔧(fix) Convo title fade effect --------- Co-authored-by: Danny Avila * Revert "🔧 style(fix): Convo Title Fade Effect (#2117)" (#2139) This reverts commit 1796821888ff09fbe0e9912408cb1387822ee866. * 🎨 style: HoverButton UI adjustment, change code font (#2017) * style: HoverButton UI adjustment * style: make Consolas as default code font --------- Co-authored-by: Danny Avila * 🗃️ feat: General File Support for OpenAI, Azure, Custom, Anthropic and Google (RAG) (#2143) * refactor: re-purpose `resendImages` as `resendFiles` * refactor: re-purpose `resendImages` as `resendFiles` * feat: upload general files * feat: embed file during upload * feat: delete file embeddings on file deletion * chore(fileConfig): add epub+zip type * feat(encodeAndFormat): handle non-image files * feat(createContextHandlers): build context prompt from file attachments and successful RAG * fix: prevent non-temp files as well as embedded files to be deleted on new conversation * fix: remove temp_file_id on usage, prevent non-temp files as well as embedded files to be deleted on new conversation * fix: prevent non-temp files as well as embedded files to be deleted on new conversation * feat(OpenAI/Anthropic/Google): basic RAG support * fix: delete `resendFiles` only when true (Default) * refactor(RAG): update endpoints and pass JWT * fix(resendFiles): default values * fix(context/processFile): query unique ids only * feat: rag-api.yaml * feat: file upload improved ux for longer uploads * chore: await embed call and catch embedding errors * refactor: store augmentedPrompt in Client * refactor(processFileUpload): throw error if not assistant file upload * fix(useFileHandling): handle markdown empty mimetype issue * chore: necessary compose file changes * 📧 fix: Correct Handling of Self-Signed Certificates in `sendEmail` (#2148) - note: To put it in a different way, if you put rejectUnauthorized: true, it means that self-signed certificates should not be allowed. This means, that EMAIL_ALLOW_SELFSIGNED is set to false * ➰ fix(sendEmail): circular dependency * 🔬 chore: Add Circular Dependency Check to `backend-review` (#2149) * 🔬 chore: Add Circular Dependency check to `backend-review` * chore: touch random file for workflow trigger * chore: workflow step order * chore: update workflow to create empty auth.json file * fix: attempt empty auth.json creation * chore: add test_bundle ESLint ignore pattern * 🔧 style(fix): Convo Fade Effect (#2147) * 🔧 (fix) Convo Fade Effect * 🔧style(fix): Convo Fade Effect (#2117) * 🔧 style(fix): Convo Fade Effect (#2117) * 🖌️ style: Improve Dark Theme Accessibility (#2125) * style: all landing page components * chore: converted all slate to gray, since slate doesnt work * style: assistant panel * style: basic UI components, userprovided, preset * style: update in multiple components * fix(PluginStoreDialog): justify-center * fixed some minor Ui styles * style(MultiSearch): update dark bg * style: update Convo styling * style: lower textarea max height slightly --------- Co-authored-by: Danny Avila * 🔧 fix(menu): Menu Item Filter Improvements (#2153) * small-fix: Ensure that fake seperators in model lists do not show in search * Ensure Plugin search uses correct placeholder and key filtering in search * 🚀 feat: Add ShuttleAI as Known Endpoint (#2152) Added new Official Known Endpoint (ShuttleAI) * 🌑 style(File Manager): Localize and Update Dark Mode Stylings (#2155) * 🌑 style: Update Dark Mode Stylings for File Manager * 🌐 feat: localize file manager text * 🌐 feat: file panel table localization * 🐋 chore: Cleanup Dockerfile (#2156) * 🐋 fix(Dockerfile): add back additional deps., handle permissions, use `--no-audit` flag on install (#2157) * 🐋 chore: Revise of PR #2157, move step earlier * chore: Revise of PR #2157, move global steps earlier, execute as root * 📖 docs: Update ShuttleAI Fibonacci Image (#2160) * 🚀 feat: Assistants Streaming (#2159) * chore: bump openai to 4.29.0 and npm audit fix * chore: remove unnecessary stream field from ContentData * feat: new enum and types for AssistantStreamEvent * refactor(AssistantService): remove stream field and add conversationId to text ContentData > - return `finalMessage` and `text` on run completion > - move `processMessages` to services/Threads to avoid circular dependencies with new stream handling > - refactor(processMessages/retrieveAndProcessFile): add new `client` field to differentiate new RunClient type * WIP: new assistants stream handling * chore: stores messages to StreamRunManager * chore: add additional typedefs * fix: pass req and openai to StreamRunManager * fix(AssistantService): pass openai as client to `retrieveAndProcessFile` * WIP: streaming tool i/o, handle in_progress and completed run steps * feat(assistants): process required actions with streaming enabled * chore: condense early return check for useSSE useEffect * chore: remove unnecessary comments and only handle completed tool calls when not function * feat: add TTL for assistants run abort cacheKey * feat: abort stream runs * fix(assistants): render streaming cursor * fix(assistants): hide edit icon as functionality is not supported * fix(textArea): handle pasting edge cases; first, when onChange events wouldn't fire; second, when textarea wouldn't resize * chore: memoize Conversations * chore(useTextarea): reverse args order * fix: load default capabilities when an azure is configured to support assistants, but `assistants` endpoint is not configured * fix(AssistantSelect): update form assistant model on assistant form select * fix(actions): handle azure strict validation for function names to fix crud for actions * chore: remove content data debug log as it fires in rapid succession * feat: improve UX for assistant errors mid-request * feat: add tool call localizations and replace any domain separators from azure action names * refactor(chat): error out tool calls without outputs during handleError * fix(ToolService): handle domain separators allowing Azure use of actions * refactor(StreamRunManager): types and throw Error if tool submission fails * 📂 feat: RAG Improvements (#2169) * feat: new vector file processing strategy * chore: remove unused client files * chore: remove more unused client files * chore: remove more unused client files and move used to new dir * chore(DataIcon): add className * WIP: Model Endpoint Settings Update, draft additional context settings * feat: improve parsing for augmented prompt, add full context option * chore: remove volume mounting from rag.yml as no longer necessary * 📚 docs: Fix Broken Links (#2171) Fix broken links to the custom config file on `timeoutMs` and `supportedIds`. * 🎉 feat: Optimizations and Anthropic Title Generation (#2184) * feat: add claude-3-haiku-20240307 to default anthropic list * refactor: optimize `saveMessage` calls mid-stream via throttling * chore: remove addMetadata operations and consolidate in BaseClient * fix(listAssistantsForAzure): attempt to specify correct model mapping as accurately as possible (#2177) * refactor(client): update last conversation setup with current assistant model, call newConvo again when assistants load to allow fast initial load and ensure assistant model is always the default, not the last selected model * refactor(cache): explicitly add TTL of 2 minutes when setting titleCache and add default TTL of 10 minutes to abortKeys cache * feat(AnthropicClient): conversation titling using Anthropic Function Calling * chore: remove extraneous token usage logging * fix(convos): unhandled edge case for conversation grouping (undefined conversation) * style: Improved style of Search Bar after recent UI update * chore: remove unused code, content part helpers * feat: always show code option * 👓 feat: Vision Support for Assistants (#2195) * refactor(assistants/chat): use promises to speed up initialization, initialize shared variables, include `attachedFileIds` to streamRunManager * chore: additional typedefs * fix(OpenAIClient): handle edge case where attachments promise is resolved * feat: createVisionPrompt * feat: Vision Support for Assistants * 🔧 fix(assistants): Vision minor fix & Add Docs (#2196) * 👓 fix(assistants): Only Retrieve Assistant Data for Vision Requests if attachments exist in Host Storage * docs: add capability * 🧑‍💻docs: Update General Docs and Contribution Guidelines (#2194) * doc upddate: documentation_guidelines.md * doc upddate: how_to_contribute.md * doc upddate: testing.md / how_to_contribute.md * doc upddate: translation_contribution.md/testing.md/how_to_contribute.md * doc upddate: coding_conventions.md * fix formatting: how_to_contribute.md * fix formatting (again) : how_to_contribute.md * 🌟 fix: Handle Assistants Edge Cases, Improve Filter Styling (#2201) * fix(assistants): default query to limit of 100 and `desc` order * refactor(useMultiSearch): use object as params and fix styling for assistants * feat: informative message for thread initialization failing due to long message * 🐞 fix(client): Prevent Async Reset of Latest Message (#2203) * refactor: use debug statement runStepCompleted message * fix(ChatRoute): prevent use of `newConversation` from reseting `latestMessage`, which would fire asynchronously and finalize after `latestMessage` was already correctly set * 📖 docs: Add details for Azure OpenAI Assistants (#2173) The default `.env` contains the line `ASSISTANTS_API_KEY=user_provided`. When pre-configuring Azure OpenAI models, this setting makes it impossible to use assistants due to a missing user provided key. Only by commenting the line out the Azure setup works. * 🎨 style: Refine SidePanel and Textarea Styling (#2209) * experimental: use TextareaAutosize wrapper with useLayoutEffect to hopefully fix random textarea jankiness * fix(Textarea): force a resize when placeholder text changes * style(ScrollToBottom): update styling for scroll button * style: memoize values and improve side panel toggle states * refactor(SidePanel): more control for toggle states, new hide panel button, and improve toggle state logic * chore: hide resizable panel handle on smaller screens * 🎨 style: Ensure Side Panel state Remains on Refresh (#2210) * 🧹 chore: Update Docker Docs & Make `cache` field Optional for Custom Config (#2211) * docs: updating docker * fix(customConfig): make `cache` field optional as intended (though not recommended for local setups) * 🚀 feat: Add GitHub Actions Workflow for Generating Docs Embeddings (#2216) * 🔍 chore: Clean Up Documentation (#2217) * fix(initializeClient.spec.js): remove condition failing test on local installations * docs: remove comments and invalid html as is required by embeddings generator and add new documentation guidelines * 🔍 chore: Clean Up Documentation Part 2 (#2218) * 🔍 chore: Clean Up Documentation Part 3 (#2219) * 🔍 chore: Clean Up Documentation Pt. 4 (#2220) * 🔗 docs: Fix Link to Code of Conduct (#2206) Fix link to Code of Conduct * 💽 feat: Add CONSOLE_JSON for deploying to GCP K8S env (#2146) * Add CONSOLE_JSON * Update example env * Moved to utils * 🔎 chore: bump meilisearch v1.7 / v0.38.0 (#2175) * 🔎 chore: bump meilisearch v1.7 / v0.38.0 * ✏️ breaking_changes.md * 💽 feat: Add Script for User Stats (#2224) * ✏️ doc update: dotenv.md (#2226) * ⬇️ feat: Assistant File Downloads (#2234) * WIP: basic route for file downloads and file strategy for generating readablestream to pipe as res * chore(DALLE3): add typing for OpenAI client * chore: add `CONSOLE_JSON` notes to dotenv.md * WIP: first pass OpenAI Assistants File Output handling * feat: first pass assistants output file download from openai * chore: yml vs. yaml variation to .gitignore for `librechat.yml` * refactor(retrieveAndProcessFile): remove redundancies * fix(syncMessages): explicit sort of apiMessages to fix message order on abort * chore: add logs for warnings and errors, show toast on frontend * chore: add logger where console was still being used * ⚓ refactor(loadConfigModels): Fallback to Default Models if Fetch Fails (#2236) * 🌍 : Updated & Added new Portuguese and Spanish Translations (#2228) * 🌍 : Updated & Added news Portuguese and Spanish Translations * fix: \' to " * fix(Br.tsx): revert Snyk placeholders * fix(Es.tsx): revert Snyk placeholders --------- Co-authored-by: Danny Avila * 🗨️ fix(useSSE): Prevent 'New Chat' Title after Regenerating Initial Message (#2238) * ⚓ refactor(loadConfigModels): Stricter Default Model Fallback (#2239) * chore: add TEndpoint type/typedef * refactor(loadConfigModels.spec): stricter default model matching (fails with current impl.) * refactor(loadConfigModels): return default models on endpoint basis and not fetch basis * refactor: rename `uniqueKeyToNameMap` to `uniqueKeyToEndpointsMap` for clarity * 🌍 fix(Translations): Map Partial `langCode` and Add Unit Tests (#2240) * 🔧 fix: Improve Assistants File Citation & Download Handling (#2248) * fix(processMessages): properly handle assistant file citations and add sources list * feat: improve file download UX by making any downloaded files accessible within the app post-download * refactor(processOpenAIImageOutput): correctly handle two different outputs for images since OpenAI generates a file in their storage, shares filepath for image rendering * refactor: create `addFileToCache` helper to use across frontend * refactor: add ImageFile parts to cache on processing content stream * 🐳 feat: RAG for Default Docker Compose Files + Docs Update (#2246) * refactor(deploy-compose.yml): use long-syntax to avoid implicit folder creation of librechat.yaml * refactor(docker-compose.override.yml.example): use long-syntax to avoid implicit folder creation of librechat.yaml * chore: add simple health check for RAG_API_URL * chore: improve axios error handling, adding `logAxiosError` * chore: more informative message detailing RAG_API_URL path * feat: add rag_api and vectordb to default compose file * chore(rag.yml): update standalone rag compose file to use RAG_PORT * chore: documentation updates * docs: Update rag_api.md with images * Update rag_api.md * Update rag_api.md, assistants clarification * add RAG API note to breaking changes * 🎨 fix: Optimize StableDiffusion API Tool and Fix for Assistants Usage (#2253) * chore: update docs * fix(StableDiffusion): optimize API responses and file handling, return expected metadata for Assistants endpoint * 🚀 feat: Add CLI Helper Scripts to API Container Image (#2257) * 🐞 fix: Handle Garbled Chinese Characters in File Upload (#2261) Co-authored-by: 彭修照 * 🐞 fix: Handle Empty Model Error in Assistants Form (#2265) * 📋 fix: Ensure Textarea Resizes in Clipboard Edge Case (#2268) * chore: ts-ignore fake conversation data used for testing * chore(useTextarea): import helper functions to declutter hook * fix(Textarea): reset textarea value explicitly by resetting `textAreaRef.current.value` * ✨ v0.7.0 (#2266) * ✨ v0.7.0 * chore: gitignore * 🐳 ci: update release image workflows * 🐞Fix: Stable Diffusion User Directory (#2270) * 🐳 hotfix: Necessary Dockerfile Update (#2271) * chore: remove version comment from pre-commit shell script * chore: Dockerfile update * 🐳 hotfix: Tag Images Workflow Update (#2272) * ✨ v0.7.0 (#2273) * 🛂 feat: Required OpenID Role (#2279) * feat: add possibility to filter by roles for OpenID provider --------- Co-authored-by: Sirius * 📗 docs: Update NagaAI (#2278) * 🐋 fix(Dockerfile): Create Necessary Directories at Build time (#2277) When creating volumes for /app/client/public/images and /app/api/logs docker will inherit the permissions from the existing directores in the image. Since they are missing it defaults to root, and since librechat now uses the "node" user instead of "root" storing images, files and logs will fail. Fix by creating those directories in the docker image with the node user, so that if docker creates the volumes the permissions are inherited and the directories are owned by "node" and not "root". * 📖 docs: Note on 'host.docker.internal' for Ollama Config (#2274) * docs: update URL to access ollama and comment on 'host.docker.internal' * Update ai_endpoints.md --------- Co-authored-by: Danny Avila * 📝 docs: Remove Google Domains Reference (#2267) * 🔨 fix(ToolService): remove userId filter from `loadActionSets` & Docs Update (#2286) * fix(ToolService): remove userId filter from `loadActionSets` * docs: updates to rag_api and docker_override explaining key variable conflicts * 🔗 docs: Fix Link to Docker Compose Override File (#2287) * 🌍: Add new Japanese Localization entries (#2282) * 🛠️ fix: Correct Unwanted Newlines after Undo in Textarea (#2289) * docs: edit docker_override note for deploy-compose * 🛠️ fix: Correct Unwanted Newlines after Undo in Textarea * 🔄 chore: converted translation files to `.ts` (#2288) * chore: converted translation files to * chore(Sv.ts): removed and the comment * chore: add comment * 🔧 fix: Catch `deleteVectors` Errors & Update RAG API docs (#2299) * fix(deleteVectors): handle errors gracefully * chore: update docs based on new alternate env vars prefixed with RAG to avoid conflicts with LibreChat keys * 🚥 docs: fixed Traefik web layout (#2305) Fixed Traefik config for broken web rending * 🦙 docs: Update Ollama + LiteLLM Instructions (#2302) * Update litellm.md * set OPENAI_API_KEY of litellm service (needs to be set if ollama's openai api compatibility is used) * 🐋 refactor(Dockerfile.multi): Optimize client build by caching npm install step (#2275) * 🐋 fix(Dockerfile): Optimize client build by caching npm install step * 🐋 fix(Dockerfile): Possible interference from librechat-data-provider in client build * 📝 docs: Correct Google OAuth Callback URL Example (#2311) * 🧠 feat: Cohere support as Custom Endpoint (#2328) * chore: bump cohere-ai, fix firebase vulnerabilities by going down versions * feat: cohere rates and context windows * feat(createCoherePayload): transform openai payload for cohere compatibility * feat: cohere backend support * refactor(UnknownIcon): optimize icon render and add cohere * docs: add cohere to Compatible AI Endpoints * Update ai_endpoints.md * 🧠 fix(Cohere): map to expected SDK params (#2329) * 💽 refactor(client): Optimize ModelsConfig Query Cache (#2330) * refactor(client): remove double caching of models via recoil to rely exclusively on react-query * chore(useConversation): add modelsQuery.data dep to callback * 🚦 docs: Update `traefik.md` - Documentation Fix for edge case race condition (#2322) Sometimes Traefik created a race condition where LibreChat was up on tcp/3080, and while Traefik was up on tcp/443, it could not route to the LibreChat container due to the multiple interfaces -- depending on how they came up. This is easily solved by simply using one interface. * 🚅 docs: Working Examples for LiteLLM, Docker, LibreChat and LiteLLM models for AWS, Azure, GCP (#2323) Updated documentation with working config examples and clarifying many details. Added working examples for: * LiteLLM (litellm/litellm-config.yaml) * Docker (docker-compose.override.yml) * LibreChat (librechat.yaml) Added LiteLLM "ready to use" model for: * AWS Bedrock * Azure OpenAI * OpenAI * GCP * 🚅 docs(ai_endpoints): Reflect correct LiteLLM baseURL when using docker-compose (#2324) Added note to LiteLLM baseURL to reflect docker-compose usage * 🚧 refactor: Attempt Default Preset Fix & Other Changes (#2342) * fix(useTextarea): trigger SendButton re-render on undo and clearing text * refactor(PresetItems): show pin icon for default preset * fix(ChatRoute): do not use conversation.model for useEffect, do not set default Preset if real model list is not yet fetched * 📘 docs: Add Note to `nginx.md` (#2341) added reference for the need to do 'sudo apt update' * ⚠️ docs: Default Value Warnings & Docker Docs Update (#2343) * feat(AppService): default secret value warnings * docs: update docker/ubuntu related guides * 🚀 feat: Enhance Message Editing with File Resubmission (#2347) * chore: fix type issue with File Table fakeData * refactor: new lazy loading image strategy and load images/files as part of Message Container * feat: resubmit files when editing messages with attached files * 🐞 fix: Balance and Token Usage Improvements (#2350) * fix(processModelData): handle `openrouter/auto` edge case * fix(Tx.create): prevent negative multiplier edge case and prevent balance from becoming negative * fix(NavLinks): render 0 balance properly * refactor(NavLinks): show only up to 2 decimal places for balance * fix(OpenAIClient/titleConvo): fix cohere condition and record token usage for `this.options.titleMethod === 'completion'` * 🎨 feat: Title Improvements (#2363) * fix(assistants): keep generated title upon continued messages in active conversation * feat: update document.title on successful gentitle mutation * ⬇️ refactor: Assistant File Downloads (#2364) * refactor(getFiledownload): explicit accept of `application/octet-stream` * chore: test compose file * chore: test compose file fix * chore(files/download): add more logs * Fix proxy_pass URLs in nginx.conf * fix: proxy_pass URLs in nginx.conf to fix file downloads from URL * chore: move test compose file to utils dir * refactor(useFileDownload): simplify API request by passing `file_id` instead of `filepath` * 🌍: Update Chinese Translation (#2351) Update Simplified Chinese Translation * 👟 style: CodeAnalyze Animation (#2348) * refactor(CodeAnaluzer SVG) * refactor(CodeAnalyzer SVG) * style: center terminal animation, reduce scaling --------- Co-authored-by: Danny Avila Co-authored-by: Danny Avila * 🧑‍🎨 style: Remove Plugins Icon Background (#2368) * 📦 feat: Model & Assistants Combobox for Side Panel (#2380) * WIP: dynamic settings * WIP: update tests and validations * refactor(SidePanel): use hook for Links * WIP: dynamic settings, slider implemented * feat(useDebouncedInput): dynamic typing with generic * refactor(generate): add `custom` optionType to be non-conforming to conversation schema * feat: DynamicDropdown * refactor(DynamicSlider): custom optionType handling and useEffect for conversation updates elsewhere * refactor(Panel): add more test cases * chore(DynamicSlider): note * refactor(useDebouncedInput): import defaultDebouncedDelay from ~/common` * WIP: implement remaining ComponentTypes * chore: add com_sidepanel_parameters * refactor: add langCode handling for dynamic settings * chore(useOriginNavigate): change path to '/c/' * refactor: explicit textarea focus on new convo, share textarea idea via ~/common * refactor: useParameterEffects: reset if convo or preset Ids change, share and maintain statefulness in side panel * wip: combobox * chore: minor styling for Select components * wip: combobox select styling for side panel * feat: complete combobox * refactor: model select for side panel switcher * refactor(Combobox): add portal * chore: comment out dynamic parameters panel for future PR and delete prompt files * refactor(Combobox): add icon field for options, change hover bg-color, add displayValue * fix(useNewConvo): proper textarea focus with setTimeout * refactor(AssistantSwitcher): use Combobox * refactor(ModelSwitcher): add textarea focus on model switch * 🤖 feat: Update Context Limit for `gpt-3.5-turbo` (#2381) * 👷 fix: Minor Fixes and Refactors (#2388) * refactor(useTextarea): set Textarea disabled message due to key higher in priority * fix(SidePanel): intended behavior for non-user provided keys * fix: generate specs * style: update combobox styling as before, with better dynamic height * chore: remove unused import * 🔒 feat: Authenticated Image Requests (#2389) * 🔒 feat: Authenticated Image Requests * fix: reserved keyword `static` * pulling in latest from upstream --------- Co-authored-by: Danny Avila Co-authored-by: Linus Gasser Co-authored-by: Kakenyan <38045575+Kakenyan@users.noreply.github.com> Co-authored-by: Fuegovic <32828263+fuegovic@users.noreply.github.com> Co-authored-by: zimmra Co-authored-by: marlonka <153027575+marlonka@users.noreply.github.com> Co-authored-by: marlonka Co-authored-by: Raí Santos <140329135+itzraiss@users.noreply.github.com> Co-authored-by: Walber Cardoso Co-authored-by: Ryohei Kamiya Co-authored-by: MACHINSOFT <110278369+machinsoft@users.noreply.github.com> Co-authored-by: Yuanlin Lin Co-authored-by: Marco Beretta <81851188+Berry-13@users.noreply.github.com> Co-authored-by: Aleksei Lisikhin <475367+Nihisil@users.noreply.github.com> Co-authored-by: bsu3338 Co-authored-by: Danny Avila Co-authored-by: Trevor Swanson <83826109+trevorswanson@users.noreply.github.com> Co-authored-by: CXwudi Co-authored-by: Walber Cardoso <50842245+walbercardoso@users.noreply.github.com> Co-authored-by: Arno Angerer Co-authored-by: Andreas <21068727+ndrsfel@users.noreply.github.com> Co-authored-by: afel Co-authored-by: Ido Ophir Co-authored-by: fuegovic Co-authored-by: Vilmondes Queiroz Co-authored-by: Alexei Smirnov Co-authored-by: Flynn Co-authored-by: SailFlorve Co-authored-by: Hermes Trismegistus <91907013+herumes@users.noreply.github.com> Co-authored-by: Florian Kohrt Co-authored-by: suzuki.sh Co-authored-by: Ivan Dachev Co-authored-by: pxz2016 <303796828@qq.com> Co-authored-by: 彭修照 Co-authored-by: Sirius Co-authored-by: Zentix <65168490+ZentixUA@users.noreply.github.com> Co-authored-by: Christoph Reiter Co-authored-by: Till Zoppke Co-authored-by: illgitthat Co-authored-by: Andi Co-authored-by: happy_ryo Co-authored-by: Ventz Petkov <901168+ventz@users.noreply.github.com> Co-authored-by: Marius <90092216+mariusgau@users.noreply.github.com> Co-authored-by: ochen1 <59662605+ochen1@users.noreply.github.com> Co-authored-by: Paul Co-authored-by: David LaPorte Co-authored-by: chrislbrown84 <129366063+chrislbrown84@users.noreply.github.com> Co-authored-by: Melaton <77706174+HundSimon@users.noreply.github.com> Co-authored-by: Danny Avila Co-authored-by: matt burnett --- .devcontainer/Dockerfile | 5 + .devcontainer/devcontainer.json | 3 +- .devcontainer/docker-compose.yml | 8 +- .env.example | 163 +- .eslintrc.js | 7 + .github/CODE_OF_CONDUCT.md | 2 +- .github/CONTRIBUTING.md | 2 +- .github/ISSUE_TEMPLATE/BUG-REPORT.yml | 2 +- .github/SECURITY.md | 6 +- .github/pull_request_template.md | 6 +- .github/workflows/backend-review.yml | 18 + .github/workflows/container.yml | 83 - .github/workflows/dev-images.yml | 63 +- .github/workflows/generate_embeddings.yml | 20 + .github/workflows/latest-images-main.yml | 40 - .github/workflows/main-image-workflow.yml | 69 + .github/workflows/tag-images.yml | 67 + .gitignore | 10 +- .husky/pre-commit | 2 +- Dockerfile | 25 +- Dockerfile.multi | 7 +- README.md | 77 +- api/app/chatgpt-browser.js | 3 +- api/app/clients/AnthropicClient.js | 492 +- api/app/clients/BaseClient.js | 74 +- api/app/clients/ChatGPTClient.js | 203 +- api/app/clients/GoogleClient.js | 82 +- api/app/clients/OpenAIClient.js | 363 +- api/app/clients/PluginsClient.js | 6 +- api/app/clients/llm/createCoherePayload.js | 85 + api/app/clients/llm/createLLM.js | 8 +- api/app/clients/llm/index.js | 2 + .../clients/prompts/createContextHandlers.js | 159 + api/app/clients/prompts/createVisionPrompt.js | 34 + api/app/clients/prompts/formatMessages.js | 18 +- .../clients/prompts/formatMessages.spec.js | 5 +- api/app/clients/prompts/index.js | 4 + api/app/clients/prompts/titlePrompts.js | 56 + api/app/clients/specs/BaseClient.test.js | 5 +- api/app/clients/specs/PluginsClient.test.js | 41 +- api/app/clients/tools/DALL-E.js | 66 +- api/app/clients/tools/GoogleSearch.js | 121 - api/app/clients/tools/index.js | 43 +- api/app/clients/tools/manifest.json | 30 +- .../clients/tools/structured/AzureAISearch.js | 18 +- api/app/clients/tools/structured/DALLE3.js | 55 +- .../clients/tools/structured/GoogleSearch.js | 65 + .../tools/structured/StableDiffusion.js | 93 +- .../tools/structured/TavilySearchResults.js | 92 + .../tools/structured/TraversaalSearch.js | 89 + api/app/clients/tools/structured/Wolfram.js | 5 +- .../tools/structured/specs/DALLE3.spec.js | 14 +- api/app/clients/tools/util/handleTools.js | 127 +- .../clients/tools/util/handleTools.test.js | 121 +- api/app/clients/tools/util/loadToolSuite.js | 44 +- api/cache/getLogStores.js | 28 +- api/config/parsers.js | 4 + api/config/paths.js | 7 + api/config/winston.js | 28 +- api/models/Action.js | 68 + api/models/Assistant.js | 47 + api/models/Balance.js | 4 +- api/models/Conversation.js | 6 +- api/models/File.js | 28 +- api/models/Message.js | 40 +- api/models/Transaction.js | 46 +- api/models/checkBalance.js | 6 +- api/models/index.js | 9 +- api/models/plugins/mongoMeili.js | 9 + api/models/schema/action.js | 59 + api/models/schema/assistant.js | 33 + api/models/schema/convoSchema.js | 2 +- api/models/schema/defaults.js | 41 +- api/models/schema/fileSchema.js | 17 + api/models/schema/messageSchema.js | 11 +- api/models/spendTokens.js | 23 +- api/models/tx.js | 28 +- api/models/tx.spec.js | 9 + api/models/userMethods.js | 46 + api/package.json | 25 +- api/server/controllers/AskController.js | 59 +- api/server/controllers/AuthController.js | 10 +- api/server/controllers/EditController.js | 53 +- api/server/controllers/EndpointController.js | 21 +- api/server/controllers/ErrorController.js | 15 +- api/server/controllers/ModelController.js | 31 +- api/server/controllers/PluginController.js | 84 +- api/server/controllers/UserController.js | 15 +- api/server/index.js | 17 +- api/server/middleware/abortMiddleware.js | 13 +- api/server/middleware/abortRun.js | 92 + api/server/middleware/buildEndpointOption.js | 11 +- api/server/middleware/denyRequest.js | 7 +- api/server/middleware/index.js | 6 + api/server/middleware/moderateText.js | 3 +- api/server/middleware/uploadLimiters.js | 75 + api/server/middleware/validateImageRequest.js | 37 + api/server/middleware/validateModel.js | 47 + api/server/routes/__tests__/config.spec.js | 9 +- api/server/routes/ask/anthropic.js | 16 +- api/server/routes/ask/askChatGPTBrowser.js | 5 +- api/server/routes/ask/bingAI.js | 7 +- api/server/routes/ask/custom.js | 14 +- api/server/routes/ask/google.js | 14 +- api/server/routes/ask/gptPlugins.js | 348 +- api/server/routes/ask/openAI.js | 14 +- api/server/routes/assistants/actions.js | 202 + api/server/routes/assistants/assistants.js | 199 +- api/server/routes/assistants/chat.js | 696 +- api/server/routes/assistants/tools.js | 8 + api/server/routes/config.js | 21 +- api/server/routes/convos.js | 67 +- api/server/routes/edit/anthropic.js | 14 +- api/server/routes/edit/custom.js | 14 +- api/server/routes/edit/google.js | 14 +- api/server/routes/edit/gptPlugins.js | 313 +- api/server/routes/edit/openAI.js | 14 +- api/server/routes/files/avatar.js | 32 +- api/server/routes/files/files.js | 149 +- api/server/routes/files/images.js | 48 +- api/server/routes/files/index.js | 35 +- api/server/routes/files/multer.js | 34 +- api/server/routes/index.js | 2 + api/server/routes/messages.js | 2 +- api/server/routes/models.js | 8 +- api/server/routes/oauth.js | 2 + api/server/routes/presets.js | 17 +- api/server/routes/static.js | 7 + api/server/routes/tokenizer.js | 2 +- api/server/services/ActionService.js | 148 + api/server/services/AppService.js | 183 +- api/server/services/AppService.spec.js | 436 + api/server/services/AssistantService.js | 677 +- api/server/services/AuthService.js | 36 +- api/server/services/AuthService.spec.js | 39 + api/server/services/Config/EndpointService.js | 25 +- .../services/Config}/getCustomConfig.js | 8 +- .../services/Config/handleRateLimits.js | 22 + api/server/services/Config/index.js | 2 + .../services/Config/loadAsyncEndpoints.js | 25 +- .../services/Config/loadConfigEndpoints.js | 34 +- .../services/Config/loadConfigModels.js | 76 +- .../services/Config/loadConfigModels.spec.js | 329 + .../services/Config/loadCustomConfig.js | 57 +- .../services/Config/loadCustomConfig.spec.js | 153 + .../services/Config/loadDefaultEConfig.js | 29 +- .../services/Config/loadDefaultModels.js | 25 +- .../services/Endpoints/anthropic/addTitle.js | 32 + .../Endpoints/anthropic/buildOptions.js | 3 +- .../services/Endpoints/anthropic/index.js | 3 +- .../services/Endpoints/assistants/addTitle.js | 28 + .../Endpoints/assistants/buildOptions.js | 16 + .../services/Endpoints/assistants/index.js | 96 + .../Endpoints/assistants/initializeClient.js | 148 + .../assistants/initializeClient.spec.js | 99 + .../services/Endpoints/custom/buildOptions.js | 4 +- .../Endpoints/custom/initializeClient.js | 74 +- .../Endpoints/google/initializeClient.spec.js | 2 + .../Endpoints/gptPlugins/initializeClient.js | 97 +- .../gptPlugins/initializeClient.spec.js | 183 +- .../services/Endpoints/openAI/addTitle.js | 8 +- .../services/Endpoints/openAI/buildOptions.js | 4 +- .../Endpoints/openAI/initializeClient.js | 86 +- .../Endpoints/openAI/initializeClient.spec.js | 198 +- api/server/services/Files/Firebase/crud.js | 96 +- api/server/services/Files/Firebase/images.js | 32 +- api/server/services/Files/Local/crud.js | 150 +- api/server/services/Files/Local/images.js | 39 +- api/server/services/Files/OpenAI/crud.js | 79 + api/server/services/Files/OpenAI/index.js | 5 + api/server/services/Files/VectorDB/crud.js | 102 + api/server/services/Files/VectorDB/index.js | 5 + api/server/services/Files/images/avatar.js | 28 +- api/server/services/Files/images/convert.js | 70 + api/server/services/Files/images/encode.js | 85 +- api/server/services/Files/images/index.js | 4 +- api/server/services/Files/images/resize.js | 40 +- api/server/services/Files/images/validate.js | 13 - api/server/services/Files/process.js | 508 +- api/server/services/Files/strategies.js | 75 +- api/server/services/ModelService.js | 166 +- api/server/services/ModelService.spec.js | 258 + api/server/services/PluginService.js | 3 +- .../Runs/{RunMananger.js => RunManager.js} | 73 +- api/server/services/Runs/StreamRunManager.js | 619 + api/server/services/Runs/handle.js | 264 + api/server/services/Runs/index.js | 11 + api/server/services/Runs/methods.js | 63 + api/server/services/Threads/index.js | 5 + api/server/services/Threads/manage.js | 657 + api/server/services/ToolService.js | 356 + api/server/utils/countTokens.js | 14 + api/server/utils/crypto.js | 25 +- .../utils/emails/passwordReset.handlebars | 193 +- .../emails/requestPasswordReset.handlebars | 248 +- .../utils/emails/verifyEmail.handlebars | 239 + api/server/utils/files.js | 47 + api/server/utils/handleText.js | 66 +- api/server/utils/handleText.spec.js | 49 +- api/server/utils/index.js | 4 + api/server/utils/queue.js | 69 + api/server/utils/sendEmail.js | 3 +- api/server/utils/streamResponse.js | 38 +- api/strategies/localStrategy.js | 7 +- api/strategies/openidStrategy.js | 35 +- api/strategies/process.js | 25 +- api/strategies/validators.js | 28 +- api/strategies/validators.spec.js | 7 +- api/typedefs.js | 778 +- api/utils/azureUtils.js | 15 +- api/utils/azureUtils.spec.js | 14 +- api/utils/extractBaseURL.js | 12 +- api/utils/index.js | 6 +- api/utils/logAxiosError.js | 45 + api/utils/tokens.js | 138 +- api/utils/tokens.spec.js | 90 + bun.lockb | Bin 857707 -> 885114 bytes client/index.html | 2 +- client/nginx.conf | 6 +- client/package.json | 17 +- client/public/assets/ShuttleAI_Fibonacci.png | Bin 0 -> 30879 bytes client/public/assets/anyscale.png | Bin 0 -> 70768 bytes client/public/assets/cohere.png | Bin 0 -> 26469 bytes client/public/assets/fireworks.png | Bin 0 -> 223682 bytes client/public/assets/groq.png | Bin 0 -> 23360 bytes client/public/assets/mistral.png | Bin 548 -> 4799 bytes client/public/assets/ollama.png | Bin 0 -> 39717 bytes client/public/assets/perplexity.png | Bin 0 -> 14309 bytes client/public/assets/shuttleai.png | Bin 0 -> 261079 bytes client/public/assets/together.png | Bin 0 -> 20985 bytes client/public/fonts/Inter-Bold.woff2 | Bin 0 -> 111040 bytes client/public/fonts/Inter-BoldItalic.woff2 | Bin 0 -> 118392 bytes client/public/fonts/Inter-Italic.woff2 | Bin 0 -> 114576 bytes client/public/fonts/Inter-Regular.woff2 | Bin 0 -> 108488 bytes client/public/fonts/Inter-SemiBold.woff2 | Bin 0 -> 111588 bytes .../public/fonts/Inter-SemiBoldItalic.woff2 | Bin 0 -> 118216 bytes .../fonts/roboto-mono-latin-400-italic.woff2 | Bin 0 -> 14052 bytes .../fonts/roboto-mono-latin-400-normal.woff2 | Bin 0 -> 12764 bytes .../fonts/roboto-mono-latin-700-normal.woff2 | Bin 0 -> 12740 bytes .../public/fonts/signifier-bold-italic.woff2 | Bin 56682 -> 0 bytes client/public/fonts/signifier-bold.woff2 | Bin 56021 -> 0 bytes .../public/fonts/signifier-light-italic.woff2 | Bin 56456 -> 0 bytes client/public/fonts/signifier-light.woff2 | Bin 53009 -> 0 bytes client/public/fonts/soehne-buch-kursiv.woff2 | Bin 34084 -> 0 bytes client/public/fonts/soehne-buch.woff2 | Bin 33350 -> 0 bytes .../public/fonts/soehne-halbfett-kursiv.woff2 | Bin 40456 -> 0 bytes client/public/fonts/soehne-halbfett.woff2 | Bin 37996 -> 0 bytes .../public/fonts/soehne-kraftig-kursiv.woff2 | Bin 38746 -> 0 bytes client/public/fonts/soehne-kraftig.woff2 | Bin 35690 -> 0 bytes .../fonts/soehne-mono-buch-kursiv.woff2 | Bin 28148 -> 0 bytes client/public/fonts/soehne-mono-buch.woff2 | Bin 27437 -> 0 bytes .../public/fonts/soehne-mono-halbfett.woff2 | Bin 28285 -> 0 bytes client/src/App.jsx | 16 +- client/src/Providers/AssistantsContext.tsx | 18 +- client/src/Providers/AssistantsMapContext.tsx | 8 + client/src/Providers/FileMapContext.tsx | 6 + client/src/Providers/index.ts | 2 + client/src/Providers/useCreationForm.ts | 19 - client/src/common/assistants-types.ts | 16 +- client/src/common/types.ts | 118 +- client/src/components/Auth/Login.tsx | 216 +- client/src/components/Auth/LoginForm.tsx | 71 +- client/src/components/Auth/Registration.tsx | 499 +- .../components/Auth/RequestPasswordReset.tsx | 159 +- client/src/components/Auth/ResetPassword.tsx | 41 +- client/src/components/Auth/SocialButton.tsx | 60 + .../components/Auth/__tests__/Login.spec.tsx | 23 +- .../Auth/__tests__/Registration.spec.tsx | 24 +- client/src/components/Chat/ChatView.tsx | 17 +- client/src/components/Chat/CreationHeader.tsx | 113 - client/src/components/Chat/CreationPanel.tsx | 229 - client/src/components/Chat/Footer.tsx | 77 +- client/src/components/Chat/Header.tsx | 6 +- client/src/components/Chat/Input/ChatForm.tsx | 152 +- .../Chat/Input/Files/AttachFile.tsx | 26 +- .../Chat/Input/Files/DragDropOverlay.tsx | 2 +- .../Chat/Input/Files/FileContainer.tsx | 34 + .../Chat/Input/Files/FilePreview.tsx | 45 + .../components/Chat/Input/Files/FileRow.tsx | 100 + .../Input/Files}/FileUpload.tsx | 2 +- .../components/Chat/Input/Files/FilesView.tsx | 43 + .../src/components/Chat/Input/Files/Image.tsx | 96 +- .../Chat/Input/Files/ImagePreview.tsx | 72 + .../components/Chat/Input/Files/Images.tsx | 116 - .../Chat/Input/Files/ProgressCircle.tsx | 36 + .../Chat/Input/Files/RemoveFile.tsx | 25 + .../Chat/Input/Files/Table/Columns.tsx | 201 + .../Chat/Input/Files/Table/DataTable.tsx | 243 + .../Input/Files/Table/SortFilterHeader.tsx | 118 + .../Chat/Input/Files/Table/TemplateTable.tsx | 88 + .../Chat/Input/Files/Table/fakeData.ts | 76 + .../Chat/Input/Files/Table/index.ts | 4 + .../components/Chat/Input/HeaderOptions.tsx | 9 +- .../src/components/Chat/Input/OptionsBar.tsx | 165 - .../components/Chat/Input/OptionsPopover.tsx | 8 +- .../components/Chat/Input/PopoverButtons.tsx | 115 +- .../src/components/Chat/Input/SendButton.tsx | 64 +- .../src/components/Chat/Input/StopButton.tsx | 4 +- client/src/components/Chat/Input/Textarea.tsx | 41 - client/src/components/Chat/Landing.tsx | 97 +- .../components/Chat/Menus/Endpoints/Icons.tsx | 50 +- .../Chat/Menus/Endpoints/MenuItem.tsx | 45 +- .../Chat/Menus/Endpoints/UnknownIcon.tsx | 67 +- .../components/Chat/Menus/EndpointsMenu.tsx | 21 +- .../components/Chat/Menus/HeaderNewChat.tsx | 23 + client/src/components/Chat/Menus/NewChat.tsx | 36 - .../Chat/Menus/Presets/EditPresetDialog.tsx | 49 +- .../Chat/Menus/Presets/PresetItems.tsx | 52 +- .../src/components/Chat/Menus/PresetsMenu.tsx | 8 +- .../src/components/Chat/Menus/UI/MenuItem.tsx | 47 +- .../Chat/Menus/UI/MenuSeparator.tsx | 2 +- .../components/Chat/Menus/UI/TitleButton.tsx | 2 +- client/src/components/Chat/Menus/index.ts | 2 +- .../Chat/Messages/Content/ActionIcon.tsx | 172 + .../Chat/Messages/Content/CancelledIcon.tsx | 17 + .../Chat/Messages/Content/CodeAnalyze.tsx | 152 + .../Chat/Messages/Content/Container.tsx | 7 +- .../Chat/Messages/Content/ContentParts.tsx | 50 + .../Chat/Messages/Content/EditMessage.tsx | 89 +- .../Chat/Messages/Content/Files.tsx | 39 + .../Chat/Messages/Content/FinishedIcon.tsx | 18 + .../Chat/Messages/Content/Image.tsx | 85 +- .../Chat/Messages/Content/ImageGen.tsx | 141 + .../Chat/Messages/Content/InProgressCall.tsx | 19 + .../Chat/Messages/Content/Markdown.tsx | 147 +- .../Chat/Messages/Content/MarkdownLite.tsx | 45 + .../Chat/Messages/Content/MessageContent.tsx | 62 +- .../components/Chat/Messages/Content/Part.tsx | 153 + .../Chat/Messages/Content/ProgressCircle.tsx | 38 + .../Chat/Messages/Content/ProgressText.tsx | 71 + .../Chat/Messages/Content/RetrievalCall.tsx | 53 + .../Chat/Messages/Content/RetrievalIcon.tsx | 80 + .../Chat/Messages/Content/ToolCall.tsx | 79 + .../Chat/Messages/Content/ToolPopover.tsx | 62 + .../Chat/Messages/Content/WrenchIcon.tsx | 77 + .../components/Chat/Messages/HoverButtons.tsx | 47 +- .../src/components/Chat/Messages/Message.tsx | 7 +- .../components/Chat/Messages/MessageParts.tsx | 124 + .../components/Chat/Messages/MessagesView.tsx | 4 +- .../components/Chat/Messages/MultiMessage.tsx | 16 + client/src/components/Chat/Presentation.tsx | 61 +- client/src/components/Chat/SearchView.tsx | 22 + client/src/components/Chat/SingleChatView.tsx | 41 - .../components/Conversations/Conversation.jsx | 8 +- .../Conversations/Conversations.tsx | 77 +- client/src/components/Conversations/Convo.tsx | 61 +- .../components/Conversations/DeleteButton.tsx | 23 +- .../Conversations/NewDeleteButton.tsx | 59 - .../components/Conversations/RenameButton.tsx | 8 +- client/src/components/Conversations/index.ts | 1 - .../Endpoints/AlternativeSettings.tsx | 24 + .../components/Endpoints/EditPresetDialog.tsx | 145 - .../Endpoints/EndpointOptionsDialog.tsx | 113 - .../Endpoints/EndpointOptionsPopover.tsx | 6 +- .../components/Endpoints/EndpointSettings.tsx | 9 +- client/src/components/Endpoints/Icon.tsx | 269 +- .../src/components/Endpoints/MinimalIcon.tsx | 10 +- .../components/Endpoints/PopoverButtons.tsx | 80 - .../Endpoints/SaveAsPresetDialog.tsx | 7 +- .../Endpoints/Settings/Advanced.tsx | 334 + .../Endpoints/Settings/AgentSettings.tsx | 4 +- .../Endpoints/Settings/Anthropic.tsx | 29 +- .../Endpoints/Settings/Assistants.tsx | 177 + .../Endpoints/Settings/Examples.tsx | 4 +- .../components/Endpoints/Settings/OpenAI.tsx | 92 +- .../Endpoints/Settings/OptionHover.tsx | 5 +- .../components/Endpoints/Settings/index.ts | 2 + .../components/Endpoints/Settings/settings.ts | 2 + client/src/components/Endpoints/index.ts | 4 +- .../Input/EndpointMenu/EndpointItem.tsx | 80 - .../Input/EndpointMenu/EndpointItems.tsx | 22 - .../Input/EndpointMenu/EndpointMenu.jsx | 280 - .../Input/EndpointMenu/PresetItem.tsx | 101 - .../Input/EndpointMenu/PresetItems.tsx | 20 - .../components/Input/EndpointMenu/index.ts | 1 - client/src/components/Input/Footer.tsx | 10 +- .../components/Input/ModelSelect/BingAI.tsx | 4 +- .../Input/ModelSelect/ModelSelect.tsx | 8 +- .../components/Input/ModelSelect/Plugins.tsx | 10 +- .../Input/ModelSelect/PluginsByIndex.tsx | 6 +- client/src/components/Input/OptionsBar.tsx | 155 - .../Input/SetKeyDialog/GoogleConfig.tsx | 4 +- .../Input/SetKeyDialog/HelpText.tsx | 8 +- .../Input/SetKeyDialog/InputWithLabel.tsx | 4 +- .../Input/SetKeyDialog/OpenAIConfig.tsx | 180 +- .../Input/SetKeyDialog/SetKeyDialog.tsx | 62 +- client/src/components/Input/SubmitButton.tsx | 137 - client/src/components/Input/TextChat.tsx | 212 - .../components/Messages/Content/CodeBlock.tsx | 4 +- .../src/components/Messages/Content/Error.tsx | 5 +- .../Messages/Content/MessageContent.tsx | 8 +- .../components/Messages/Content/Plugin.tsx | 8 +- .../src/components/Messages/HoverButtons.tsx | 10 +- client/src/components/Messages/Message.tsx | 6 +- .../src/components/Messages/MessageHeader.tsx | 113 - client/src/components/Messages/Messages.tsx | 124 - .../components/Messages/ScrollToBottom.tsx | 26 +- client/src/components/Nav/ClearConvos.tsx | 2 +- .../Nav/ExportConversation/ExportModal.jsx | 4 +- client/src/components/Nav/Logout.tsx | 2 +- client/src/components/Nav/MobileNav.tsx | 13 +- client/src/components/Nav/Nav.tsx | 219 +- client/src/components/Nav/NavLinks.tsx | 93 +- client/src/components/Nav/NavToggle.tsx | 39 +- client/src/components/Nav/NewChat.tsx | 98 +- client/src/components/Nav/SearchBar.tsx | 10 +- client/src/components/Nav/Settings.tsx | 44 +- .../Nav/SettingsTabs/Account/Account.tsx | 2 +- .../Nav/SettingsTabs/Account/Avatar.tsx | 18 +- .../components/Nav/SettingsTabs/Beta/Beta.tsx | 2 +- .../components/Nav/SettingsTabs/Data/Data.tsx | 2 +- .../Nav/SettingsTabs/General/General.tsx | 19 +- .../General/HideSidePanelSwitch.tsx | 33 + .../SettingsTabs/General/ShowCodeSwitch.tsx | 33 + .../Plugins/Store/PluginAuthForm.tsx | 89 +- .../Plugins/Store/PluginPagination.tsx | 3 + .../Plugins/Store/PluginStoreDialog.tsx | 134 +- .../Plugins/Store/PluginStoreItem.tsx | 16 +- .../Store/__tests__/PluginAuthForm.spec.tsx | 1 + .../Store/__tests__/PluginPagination.spec.tsx | 2 +- .../Store/__tests__/PluginStoreItem.spec.tsx | 2 +- .../SidePanel/AssistantSwitcher.tsx | 84 + .../SidePanel/Builder/ActionsAuth.tsx | 296 + .../SidePanel/Builder/ActionsInput.tsx | 287 + .../SidePanel/Builder/ActionsPanel.tsx | 193 + .../Builder/ActionsTable/Columns.tsx | 54 + .../SidePanel/Builder/ActionsTable/Table.tsx | 47 + .../SidePanel/Builder/ActionsTable/index.ts | 2 + .../SidePanel/Builder/AssistantAction.tsx | 33 + .../SidePanel/Builder/AssistantAvatar.tsx | 211 + .../SidePanel/Builder/AssistantPanel.tsx | 561 + .../SidePanel/Builder/AssistantSelect.tsx | 210 + .../SidePanel/Builder/AssistantTool.tsx | 52 + .../SidePanel/Builder/ContextButton.tsx | 149 + .../components/SidePanel/Builder/Images.tsx | 133 + .../SidePanel/Builder/Knowledge.tsx | 128 + .../SidePanel/Builder/PanelSwitch.tsx | 51 + .../src/components/SidePanel/Files/Panel.tsx | 14 + .../SidePanel/Files/PanelColumns.tsx | 47 + .../SidePanel/Files/PanelFileCell.tsx | 101 + .../components/SidePanel/Files/PanelTable.tsx | 167 + .../components/SidePanel/ModelSwitcher.tsx | 54 + client/src/components/SidePanel/Nav.tsx | 128 + .../SidePanel/Parameters/DynamicCheckbox.tsx | 97 + .../SidePanel/Parameters/DynamicDropdown.tsx | 106 + .../SidePanel/Parameters/DynamicInput.tsx | 93 + .../SidePanel/Parameters/DynamicSlider.tsx | 175 + .../SidePanel/Parameters/DynamicSwitch.tsx | 94 + .../SidePanel/Parameters/DynamicTextarea.tsx | 97 + .../SidePanel/Parameters/OptionHover.tsx | 26 + .../components/SidePanel/Parameters/Panel.tsx | 215 + client/src/components/SidePanel/SidePanel.tsx | 223 + client/src/components/SidePanel/Switcher.tsx | 14 + client/src/components/SidePanel/data.tsx | 38 + client/src/components/SidePanel/index.ts | 2 + client/src/components/Tools/ToolItem.tsx | 71 + .../src/components/Tools/ToolSelectDialog.tsx | 240 + client/src/components/Tools/index.ts | 2 + client/src/components/svg/AssistantIcon.tsx | 31 + client/src/components/svg/BirthdayIcon.tsx | 64 + client/src/components/svg/Blocks.tsx | 20 + client/src/components/svg/CheckMark.tsx | 8 +- client/src/components/svg/Clipboard.tsx | 9 +- client/src/components/svg/DataIcon.tsx | 4 +- client/src/components/svg/EditIcon.tsx | 11 +- client/src/components/svg/Files/CodePaths.tsx | 20 + client/src/components/svg/Files/FileIcon.tsx | 28 + client/src/components/svg/Files/FilePaths.tsx | 20 + .../src/components/svg/Files/SheetPaths.tsx | 13 + client/src/components/svg/Files/TextPaths.tsx | 41 + client/src/components/svg/GoogleIconChat.tsx | 26 + client/src/components/svg/NewChatIcon.tsx | 20 + client/src/components/svg/NewTrashIcon.tsx | 19 + .../src/components/svg/OpenAIMinimalIcon.tsx | 6 +- .../src/components/svg/PluginMinimalIcon.tsx | 21 - client/src/components/svg/RegenerateIcon.tsx | 10 +- client/src/components/svg/RenameIcon.tsx | 9 +- client/src/components/svg/Sparkles.tsx | 25 + client/src/components/svg/Spinner.tsx | 7 +- client/src/components/svg/TrashIcon.tsx | 13 +- client/src/components/svg/index.ts | 9 +- client/src/components/ui/Accordion.tsx | 51 + client/src/components/ui/AlertDialog.tsx | 10 +- client/src/components/ui/Button.tsx | 14 +- client/src/components/ui/Checkbox.tsx | 2 +- client/src/components/ui/Collapsible.tsx | 9 + client/src/components/ui/Combobox.tsx | 169 + .../components/ui/DataTableColumnHeader.tsx | 61 + client/src/components/ui/Dialog.tsx | 67 +- client/src/components/ui/DialogTemplate.tsx | 31 +- client/src/components/ui/Dropdown.tsx | 37 +- client/src/components/ui/DropdownMenu.tsx | 18 +- client/src/components/ui/HoverCard.tsx | 2 +- client/src/components/ui/Input.tsx | 2 +- client/src/components/ui/InputNumber.tsx | 4 +- client/src/components/ui/Landing.tsx | 12 +- client/src/components/ui/MultiSearch.tsx | 132 + .../src/components/ui/MultiSelectDropDown.tsx | 32 +- client/src/components/ui/MultiSelectPop.tsx | 36 +- client/src/components/ui/Prompt.tsx | 2 +- client/src/components/ui/QuestionMark.tsx | 15 + client/src/components/ui/Resizable.tsx | 62 + client/src/components/ui/Select.tsx | 162 + client/src/components/ui/SelectDropDown.tsx | 34 +- .../src/components/ui/SelectDropDownPop.tsx | 24 +- client/src/components/ui/Slider.tsx | 4 +- client/src/components/ui/Switch.tsx | 4 +- client/src/components/ui/Table.tsx | 89 + client/src/components/ui/Tabs.tsx | 4 +- client/src/components/ui/Templates.tsx | 12 +- client/src/components/ui/Textarea.tsx | 2 +- client/src/components/ui/TextareaAutosize.tsx | 10 + client/src/components/ui/ThemeSelector.tsx | 39 + client/src/components/ui/Tooltip.tsx | 3 +- client/src/components/ui/index.ts | 7 + client/src/data-provider/mutations.ts | 437 +- client/src/data-provider/queries.ts | 325 +- client/src/hooks/Assistants/index.ts | 2 + .../src/hooks/Assistants/useAssistantsMap.ts | 12 + .../hooks/Assistants/useSelectAssistant.ts | 51 + client/src/hooks/Config/useConfigOverride.ts | 4 +- client/src/hooks/Conversations/index.ts | 2 + .../hooks/Conversations/useDebouncedInput.ts | 54 + .../Conversations/useParameterEffects.ts | 68 + client/src/hooks/Conversations/usePresets.ts | 37 +- client/src/hooks/Files/index.ts | 7 + .../src/hooks/Files/useDelayedUploadToast.ts | 34 + .../hooks/Files/useDeleteFilesFromTable.tsx | 42 + .../src/hooks/{ => Files}/useDragHelpers.ts | 0 client/src/hooks/Files/useFileDeletion.ts | 128 + client/src/hooks/Files/useFileHandling.ts | 310 + client/src/hooks/Files/useFileMap.ts | 11 + .../hooks/{ => Files}/useSetFilesToDelete.ts | 0 client/src/hooks/Files/useUpdateFiles.ts | 72 + client/src/hooks/Input/index.ts | 1 + client/src/hooks/Input/useCombobox.ts | 37 + client/src/hooks/Input/useTextarea.ts | 161 +- client/src/hooks/Messages/index.ts | 2 + client/src/hooks/Messages/useAvatar.ts | 50 + .../src/hooks/Messages/useMessageHelpers.ts | 65 +- client/src/hooks/Messages/useProgress.ts | 36 + client/src/hooks/Nav/index.ts | 1 + client/src/hooks/Nav/useNavScrolling.ts | 64 + client/src/hooks/Nav/useSideNavLinks.ts | 71 + client/src/hooks/Plugins/index.ts | 1 + .../hooks/Plugins/usePluginDialogHelpers.ts | 79 + client/src/hooks/SSE/index.ts | 2 + client/src/hooks/SSE/useContentHandler.ts | 83 + client/src/hooks/SSE/useSSE.ts | 622 + client/src/hooks/ScreenshotContext.tsx | 2 +- client/src/hooks/ThemeContext.tsx | 13 + client/src/hooks/index.ts | 13 +- client/src/hooks/useChatHelpers.ts | 130 +- client/src/hooks/useConversation.ts | 11 +- client/src/hooks/useDefaultConvo.ts | 16 +- client/src/hooks/useFileHandling.ts | 278 - client/src/hooks/useFileHandlingResize.ts | 209 - client/src/hooks/useGenerations.ts | 2 +- client/src/hooks/useGenerationsByLatest.ts | 2 +- client/src/hooks/useMessageHandler.ts | 5 +- client/src/hooks/useNewConvo.ts | 72 +- client/src/hooks/useOriginNavigate.ts | 2 +- client/src/hooks/useSSE.ts | 458 - client/src/hooks/useSetIndexOptions.ts | 14 +- client/src/localization/Translation.spec.ts | 37 + .../{Translation.tsx => Translation.ts} | 22 +- .../localization/languages/{Ar.tsx => Ar.ts} | 2 +- client/src/localization/languages/Br.ts | 437 + client/src/localization/languages/Br.tsx | 319 - client/src/localization/languages/De.ts | 332 + client/src/localization/languages/De.tsx | 204 - .../languages/{Eng.tsx => Eng.ts} | 131 +- client/src/localization/languages/Es.ts | 443 + client/src/localization/languages/Es.tsx | 322 - .../localization/languages/{Fr.tsx => Fr.ts} | 3 + client/src/localization/languages/He.ts | 360 + .../localization/languages/{Id.tsx => Id.ts} | 3 + .../localization/languages/{It.tsx => It.ts} | 11 +- .../localization/languages/{Jp.tsx => Jp.ts} | 37 +- .../localization/languages/{Ko.tsx => Ko.ts} | 1 + .../localization/languages/{Nl.tsx => Nl.ts} | 1 + .../localization/languages/{Pl.tsx => Pl.ts} | 3 +- .../localization/languages/{Ru.tsx => Ru.ts} | 45 +- client/src/localization/languages/Sv.ts | 261 + client/src/localization/languages/Sv.tsx | 260 - .../localization/languages/{Tr.tsx => Tr.ts} | 1 + .../localization/languages/{Vi.tsx => Vi.ts} | 1 + .../localization/languages/{Zh.tsx => Zh.ts} | 65 +- .../{ZhTraditional.tsx => ZhTraditional.ts} | 1 + client/src/mobile.css | 58 +- client/src/routes/AssistantsRoute.tsx | 41 - client/src/routes/Chat.tsx | 153 - client/src/routes/ChatRoute.tsx | 42 +- client/src/routes/Root.tsx | 60 +- client/src/routes/Search.tsx | 8 +- client/src/routes/index.tsx | 20 +- client/src/store/endpoints.ts | 22 +- client/src/store/families.ts | 16 + client/src/store/index.ts | 2 - client/src/store/models.ts | 33 - client/src/store/settings.ts | 53 + client/src/style.css | 503 +- client/src/utils/buildTree.ts | 4 +- client/src/utils/cleanupPreset.ts | 6 +- client/src/utils/cn.ts | 7 +- client/src/utils/convos.fakeData.ts | 568 + client/src/utils/convos.spec.ts | 228 + client/src/utils/convos.ts | 184 + client/src/utils/endpoints.ts | 34 + client/src/utils/files.ts | 161 +- client/src/utils/index.ts | 15 +- client/src/utils/map.ts | 23 + client/src/utils/textarea.ts | 59 + client/tailwind.config.cjs | 41 +- client/vite.config.ts | 3 + config/add-balance.js | 6 +- config/update.js | 6 +- config/user-stats.js | 54 + deploy-compose.yml | 34 +- docker-compose.override.yml.example | 109 +- docker-compose.yml | 43 +- docs/contributions/coding_conventions.md | 11 +- .../contributions/documentation_guidelines.md | 133 +- docs/contributions/how_to_contribute.md | 225 +- docs/contributions/index.md | 2 +- docs/contributions/testing.md | 29 +- .../contributions/translation_contribution.md | 58 +- docs/deployment/cloudflare.md | 28 +- docs/deployment/digitalocean.md | 413 +- docs/deployment/docker_ubuntu_deploy.md | 449 + docs/deployment/heroku.md | 2 +- docs/deployment/hetzner_ubuntu.md | 4 +- docs/deployment/index.md | 32 +- docs/deployment/introduction.md | 139 + docs/deployment/linode.md | 6 +- docs/deployment/meilisearch_in_render.md | 2 +- docs/deployment/nginx.md | 312 + docs/deployment/ngrok.md | 4 +- docs/deployment/railway.md | 55 + docs/deployment/render.md | 2 +- docs/deployment/traefik.md | 91 + docs/deployment/zeabur.md | 43 + docs/features/index.md | 4 +- docs/features/manage_your_database.md | 56 +- docs/features/mod_system.md | 10 +- docs/features/pandoranext.md | 172 - .../plugins/chatgpt_plugins_openapi.md | 15 - docs/features/plugins/google_search.md | 5 +- docs/features/plugins/index.md | 2 +- docs/features/presets.md | 4 +- docs/features/rag_api.md | 149 + docs/features/third_party.md | 22 +- docs/features/token_usage.md | 36 + docs/general_info/breaking_changes.md | 347 +- docs/general_info/multilingual_information.md | 2 +- docs/index.md | 30 +- .../configuration/OAuth2-and-OIDC/aws.md | 114 + .../configuration/OAuth2-and-OIDC/azure.md | 59 + .../configuration/OAuth2-and-OIDC/discord.md | 49 + .../configuration/OAuth2-and-OIDC/facebook.md | 83 + .../configuration/OAuth2-and-OIDC/github.md | 65 + .../configuration/OAuth2-and-OIDC/google.md | 97 + .../configuration/OAuth2-and-OIDC/keycloak.md | 68 + docs/install/configuration/ai_endpoints.md | 376 + docs/install/configuration/ai_setup.md | 400 +- docs/install/configuration/azure_openai.md | 678 + docs/install/configuration/custom_config.md | 790 +- docs/install/configuration/docker_override.md | 356 +- docs/install/configuration/dotenv.md | 288 +- docs/install/configuration/free_ai_apis.md | 4 +- docs/install/configuration/index.md | 5 +- docs/install/configuration/litellm.md | 313 +- docs/install/configuration/mongodb.md | 2 +- docs/install/configuration/ollama.md | 29 + .../install/configuration/user_auth_system.md | 417 +- docs/install/index.md | 5 +- .../install/installation/container_install.md | 2 +- .../installation/docker_compose_install.md | 76 +- docs/install/installation/linux_install.md | 25 +- docs/install/installation/mac_install.md | 8 +- docs/install/installation/windows_install.md | 4 +- docs/src/requirements.txt | 4 + e2e/jestSetup.js | 2 +- index.html | 4 +- librechat.example.yaml | 129 +- mkdocs.yml | 14 +- package-lock.json | 10927 +++++++++------- package.json | 10 +- packages/data-provider/package.json | 7 +- packages/data-provider/specs/actions.spec.ts | 508 + packages/data-provider/specs/azure.spec.ts | 841 ++ .../data-provider/specs/filetypes.spec.ts | 181 + packages/data-provider/specs/generate.spec.ts | 586 + packages/data-provider/specs/openapiSpecs.ts | 350 + packages/data-provider/specs/parsers.spec.ts | 48 + packages/data-provider/src/actions.ts | 355 + packages/data-provider/src/api-endpoints.ts | 17 +- packages/data-provider/src/azure.ts | 361 + packages/data-provider/src/config.ts | 410 +- packages/data-provider/src/createPayload.ts | 6 +- packages/data-provider/src/data-service.ts | 152 +- packages/data-provider/src/file-config.ts | 265 + packages/data-provider/src/generate.ts | 474 + packages/data-provider/src/index.ts | 5 + packages/data-provider/src/keys.ts | 11 +- packages/data-provider/src/parsers.ts | 118 +- .../src/react-query/assistants.ts | 138 - .../data-provider/src/react-query/index.ts | 1 - .../src/react-query/react-query-service.ts | 110 +- packages/data-provider/src/request.ts | 5 + packages/data-provider/src/schemas.ts | 301 +- packages/data-provider/src/types.ts | 37 +- .../data-provider/src/types/assistants.ts | 275 +- packages/data-provider/src/types/files.ts | 67 +- packages/data-provider/src/types/mutations.ts | 104 +- packages/data-provider/src/types/queries.ts | 34 + packages/data-provider/tsconfig.json | 2 +- packages/data-provider/tsconfig.spec.json | 10 + prettier.config.js | 2 +- rag.yml | 31 + utils/docker/docker-build.sh | 21 + utils/docker/docker-push.sh | 31 + utils/docker/test-compose.yml | 66 + 723 files changed, 49974 insertions(+), 16749 deletions(-) create mode 100644 .devcontainer/Dockerfile delete mode 100644 .github/workflows/container.yml create mode 100644 .github/workflows/generate_embeddings.yml delete mode 100644 .github/workflows/latest-images-main.yml create mode 100644 .github/workflows/main-image-workflow.yml create mode 100644 .github/workflows/tag-images.yml create mode 100644 api/app/clients/llm/createCoherePayload.js create mode 100644 api/app/clients/prompts/createContextHandlers.js create mode 100644 api/app/clients/prompts/createVisionPrompt.js delete mode 100644 api/app/clients/tools/GoogleSearch.js create mode 100644 api/app/clients/tools/structured/GoogleSearch.js create mode 100644 api/app/clients/tools/structured/TavilySearchResults.js create mode 100644 api/app/clients/tools/structured/TraversaalSearch.js create mode 100644 api/models/Action.js create mode 100644 api/models/Assistant.js create mode 100644 api/models/schema/action.js create mode 100644 api/models/schema/assistant.js create mode 100644 api/models/userMethods.js create mode 100644 api/server/middleware/abortRun.js create mode 100644 api/server/middleware/uploadLimiters.js create mode 100644 api/server/middleware/validateImageRequest.js create mode 100644 api/server/middleware/validateModel.js create mode 100644 api/server/routes/assistants/actions.js create mode 100644 api/server/routes/assistants/tools.js create mode 100644 api/server/routes/static.js create mode 100644 api/server/services/ActionService.js create mode 100644 api/server/services/AppService.spec.js create mode 100644 api/server/services/AuthService.spec.js rename api/{cache => server/services/Config}/getCustomConfig.js (69%) create mode 100644 api/server/services/Config/handleRateLimits.js create mode 100644 api/server/services/Config/loadConfigModels.spec.js create mode 100644 api/server/services/Config/loadCustomConfig.spec.js create mode 100644 api/server/services/Endpoints/anthropic/addTitle.js create mode 100644 api/server/services/Endpoints/assistants/addTitle.js create mode 100644 api/server/services/Endpoints/assistants/buildOptions.js create mode 100644 api/server/services/Endpoints/assistants/index.js create mode 100644 api/server/services/Endpoints/assistants/initializeClient.js create mode 100644 api/server/services/Endpoints/assistants/initializeClient.spec.js create mode 100644 api/server/services/Files/OpenAI/crud.js create mode 100644 api/server/services/Files/OpenAI/index.js create mode 100644 api/server/services/Files/VectorDB/crud.js create mode 100644 api/server/services/Files/VectorDB/index.js create mode 100644 api/server/services/Files/images/convert.js delete mode 100644 api/server/services/Files/images/validate.js create mode 100644 api/server/services/ModelService.spec.js rename api/server/services/Runs/{RunMananger.js => RunManager.js} (59%) create mode 100644 api/server/services/Runs/StreamRunManager.js create mode 100644 api/server/services/Runs/handle.js create mode 100644 api/server/services/Runs/index.js create mode 100644 api/server/services/Runs/methods.js create mode 100644 api/server/services/Threads/index.js create mode 100644 api/server/services/Threads/manage.js create mode 100644 api/server/services/ToolService.js create mode 100644 api/server/utils/emails/verifyEmail.handlebars create mode 100644 api/server/utils/files.js create mode 100644 api/server/utils/queue.js create mode 100644 api/utils/logAxiosError.js create mode 100644 client/public/assets/ShuttleAI_Fibonacci.png create mode 100644 client/public/assets/anyscale.png create mode 100644 client/public/assets/cohere.png create mode 100644 client/public/assets/fireworks.png create mode 100644 client/public/assets/groq.png create mode 100644 client/public/assets/ollama.png create mode 100644 client/public/assets/perplexity.png create mode 100644 client/public/assets/shuttleai.png create mode 100644 client/public/assets/together.png create mode 100644 client/public/fonts/Inter-Bold.woff2 create mode 100644 client/public/fonts/Inter-BoldItalic.woff2 create mode 100644 client/public/fonts/Inter-Italic.woff2 create mode 100644 client/public/fonts/Inter-Regular.woff2 create mode 100644 client/public/fonts/Inter-SemiBold.woff2 create mode 100644 client/public/fonts/Inter-SemiBoldItalic.woff2 create mode 100644 client/public/fonts/roboto-mono-latin-400-italic.woff2 create mode 100644 client/public/fonts/roboto-mono-latin-400-normal.woff2 create mode 100644 client/public/fonts/roboto-mono-latin-700-normal.woff2 delete mode 100644 client/public/fonts/signifier-bold-italic.woff2 delete mode 100644 client/public/fonts/signifier-bold.woff2 delete mode 100644 client/public/fonts/signifier-light-italic.woff2 delete mode 100644 client/public/fonts/signifier-light.woff2 delete mode 100644 client/public/fonts/soehne-buch-kursiv.woff2 delete mode 100644 client/public/fonts/soehne-buch.woff2 delete mode 100644 client/public/fonts/soehne-halbfett-kursiv.woff2 delete mode 100644 client/public/fonts/soehne-halbfett.woff2 delete mode 100644 client/public/fonts/soehne-kraftig-kursiv.woff2 delete mode 100644 client/public/fonts/soehne-kraftig.woff2 delete mode 100644 client/public/fonts/soehne-mono-buch-kursiv.woff2 delete mode 100644 client/public/fonts/soehne-mono-buch.woff2 delete mode 100644 client/public/fonts/soehne-mono-halbfett.woff2 create mode 100644 client/src/Providers/AssistantsMapContext.tsx create mode 100644 client/src/Providers/FileMapContext.tsx delete mode 100644 client/src/Providers/useCreationForm.ts create mode 100644 client/src/components/Auth/SocialButton.tsx delete mode 100644 client/src/components/Chat/CreationHeader.tsx delete mode 100644 client/src/components/Chat/CreationPanel.tsx create mode 100644 client/src/components/Chat/Input/Files/FileContainer.tsx create mode 100644 client/src/components/Chat/Input/Files/FilePreview.tsx create mode 100644 client/src/components/Chat/Input/Files/FileRow.tsx rename client/src/components/{Input/EndpointMenu => Chat/Input/Files}/FileUpload.tsx (94%) create mode 100644 client/src/components/Chat/Input/Files/FilesView.tsx create mode 100644 client/src/components/Chat/Input/Files/ImagePreview.tsx delete mode 100644 client/src/components/Chat/Input/Files/Images.tsx create mode 100644 client/src/components/Chat/Input/Files/ProgressCircle.tsx create mode 100644 client/src/components/Chat/Input/Files/RemoveFile.tsx create mode 100644 client/src/components/Chat/Input/Files/Table/Columns.tsx create mode 100644 client/src/components/Chat/Input/Files/Table/DataTable.tsx create mode 100644 client/src/components/Chat/Input/Files/Table/SortFilterHeader.tsx create mode 100644 client/src/components/Chat/Input/Files/Table/TemplateTable.tsx create mode 100644 client/src/components/Chat/Input/Files/Table/fakeData.ts create mode 100644 client/src/components/Chat/Input/Files/Table/index.ts delete mode 100644 client/src/components/Chat/Input/OptionsBar.tsx delete mode 100644 client/src/components/Chat/Input/Textarea.tsx create mode 100644 client/src/components/Chat/Menus/HeaderNewChat.tsx delete mode 100644 client/src/components/Chat/Menus/NewChat.tsx create mode 100644 client/src/components/Chat/Messages/Content/ActionIcon.tsx create mode 100644 client/src/components/Chat/Messages/Content/CancelledIcon.tsx create mode 100644 client/src/components/Chat/Messages/Content/CodeAnalyze.tsx create mode 100644 client/src/components/Chat/Messages/Content/ContentParts.tsx create mode 100644 client/src/components/Chat/Messages/Content/Files.tsx create mode 100644 client/src/components/Chat/Messages/Content/FinishedIcon.tsx create mode 100644 client/src/components/Chat/Messages/Content/ImageGen.tsx create mode 100644 client/src/components/Chat/Messages/Content/InProgressCall.tsx create mode 100644 client/src/components/Chat/Messages/Content/MarkdownLite.tsx create mode 100644 client/src/components/Chat/Messages/Content/Part.tsx create mode 100644 client/src/components/Chat/Messages/Content/ProgressCircle.tsx create mode 100644 client/src/components/Chat/Messages/Content/ProgressText.tsx create mode 100644 client/src/components/Chat/Messages/Content/RetrievalCall.tsx create mode 100644 client/src/components/Chat/Messages/Content/RetrievalIcon.tsx create mode 100644 client/src/components/Chat/Messages/Content/ToolCall.tsx create mode 100644 client/src/components/Chat/Messages/Content/ToolPopover.tsx create mode 100644 client/src/components/Chat/Messages/Content/WrenchIcon.tsx create mode 100644 client/src/components/Chat/Messages/MessageParts.tsx create mode 100644 client/src/components/Chat/SearchView.tsx delete mode 100644 client/src/components/Chat/SingleChatView.tsx delete mode 100644 client/src/components/Conversations/NewDeleteButton.tsx create mode 100644 client/src/components/Endpoints/AlternativeSettings.tsx delete mode 100644 client/src/components/Endpoints/EditPresetDialog.tsx delete mode 100644 client/src/components/Endpoints/EndpointOptionsDialog.tsx delete mode 100644 client/src/components/Endpoints/PopoverButtons.tsx create mode 100644 client/src/components/Endpoints/Settings/Advanced.tsx create mode 100644 client/src/components/Endpoints/Settings/Assistants.tsx delete mode 100644 client/src/components/Input/EndpointMenu/EndpointItem.tsx delete mode 100644 client/src/components/Input/EndpointMenu/EndpointItems.tsx delete mode 100644 client/src/components/Input/EndpointMenu/EndpointMenu.jsx delete mode 100644 client/src/components/Input/EndpointMenu/PresetItem.tsx delete mode 100644 client/src/components/Input/EndpointMenu/PresetItems.tsx delete mode 100644 client/src/components/Input/EndpointMenu/index.ts delete mode 100644 client/src/components/Input/OptionsBar.tsx delete mode 100644 client/src/components/Input/SubmitButton.tsx delete mode 100644 client/src/components/Input/TextChat.tsx delete mode 100644 client/src/components/Messages/MessageHeader.tsx delete mode 100644 client/src/components/Messages/Messages.tsx create mode 100644 client/src/components/Nav/SettingsTabs/General/HideSidePanelSwitch.tsx create mode 100644 client/src/components/Nav/SettingsTabs/General/ShowCodeSwitch.tsx create mode 100644 client/src/components/SidePanel/AssistantSwitcher.tsx create mode 100644 client/src/components/SidePanel/Builder/ActionsAuth.tsx create mode 100644 client/src/components/SidePanel/Builder/ActionsInput.tsx create mode 100644 client/src/components/SidePanel/Builder/ActionsPanel.tsx create mode 100644 client/src/components/SidePanel/Builder/ActionsTable/Columns.tsx create mode 100644 client/src/components/SidePanel/Builder/ActionsTable/Table.tsx create mode 100644 client/src/components/SidePanel/Builder/ActionsTable/index.ts create mode 100644 client/src/components/SidePanel/Builder/AssistantAction.tsx create mode 100644 client/src/components/SidePanel/Builder/AssistantAvatar.tsx create mode 100644 client/src/components/SidePanel/Builder/AssistantPanel.tsx create mode 100644 client/src/components/SidePanel/Builder/AssistantSelect.tsx create mode 100644 client/src/components/SidePanel/Builder/AssistantTool.tsx create mode 100644 client/src/components/SidePanel/Builder/ContextButton.tsx create mode 100644 client/src/components/SidePanel/Builder/Images.tsx create mode 100644 client/src/components/SidePanel/Builder/Knowledge.tsx create mode 100644 client/src/components/SidePanel/Builder/PanelSwitch.tsx create mode 100644 client/src/components/SidePanel/Files/Panel.tsx create mode 100644 client/src/components/SidePanel/Files/PanelColumns.tsx create mode 100644 client/src/components/SidePanel/Files/PanelFileCell.tsx create mode 100644 client/src/components/SidePanel/Files/PanelTable.tsx create mode 100644 client/src/components/SidePanel/ModelSwitcher.tsx create mode 100644 client/src/components/SidePanel/Nav.tsx create mode 100644 client/src/components/SidePanel/Parameters/DynamicCheckbox.tsx create mode 100644 client/src/components/SidePanel/Parameters/DynamicDropdown.tsx create mode 100644 client/src/components/SidePanel/Parameters/DynamicInput.tsx create mode 100644 client/src/components/SidePanel/Parameters/DynamicSlider.tsx create mode 100644 client/src/components/SidePanel/Parameters/DynamicSwitch.tsx create mode 100644 client/src/components/SidePanel/Parameters/DynamicTextarea.tsx create mode 100644 client/src/components/SidePanel/Parameters/OptionHover.tsx create mode 100644 client/src/components/SidePanel/Parameters/Panel.tsx create mode 100644 client/src/components/SidePanel/SidePanel.tsx create mode 100644 client/src/components/SidePanel/Switcher.tsx create mode 100644 client/src/components/SidePanel/data.tsx create mode 100644 client/src/components/SidePanel/index.ts create mode 100644 client/src/components/Tools/ToolItem.tsx create mode 100644 client/src/components/Tools/ToolSelectDialog.tsx create mode 100644 client/src/components/Tools/index.ts create mode 100644 client/src/components/svg/AssistantIcon.tsx create mode 100644 client/src/components/svg/BirthdayIcon.tsx create mode 100644 client/src/components/svg/Blocks.tsx create mode 100644 client/src/components/svg/Files/CodePaths.tsx create mode 100644 client/src/components/svg/Files/FileIcon.tsx create mode 100644 client/src/components/svg/Files/FilePaths.tsx create mode 100644 client/src/components/svg/Files/SheetPaths.tsx create mode 100644 client/src/components/svg/Files/TextPaths.tsx create mode 100644 client/src/components/svg/GoogleIconChat.tsx create mode 100644 client/src/components/svg/NewChatIcon.tsx create mode 100644 client/src/components/svg/NewTrashIcon.tsx delete mode 100644 client/src/components/svg/PluginMinimalIcon.tsx create mode 100644 client/src/components/svg/Sparkles.tsx create mode 100644 client/src/components/ui/Accordion.tsx create mode 100644 client/src/components/ui/Collapsible.tsx create mode 100644 client/src/components/ui/Combobox.tsx create mode 100644 client/src/components/ui/DataTableColumnHeader.tsx create mode 100644 client/src/components/ui/MultiSearch.tsx create mode 100644 client/src/components/ui/QuestionMark.tsx create mode 100644 client/src/components/ui/Resizable.tsx create mode 100644 client/src/components/ui/Select.tsx create mode 100644 client/src/components/ui/Table.tsx create mode 100644 client/src/components/ui/TextareaAutosize.tsx create mode 100644 client/src/components/ui/ThemeSelector.tsx create mode 100644 client/src/hooks/Assistants/index.ts create mode 100644 client/src/hooks/Assistants/useAssistantsMap.ts create mode 100644 client/src/hooks/Assistants/useSelectAssistant.ts create mode 100644 client/src/hooks/Conversations/useDebouncedInput.ts create mode 100644 client/src/hooks/Conversations/useParameterEffects.ts create mode 100644 client/src/hooks/Files/index.ts create mode 100644 client/src/hooks/Files/useDelayedUploadToast.ts create mode 100644 client/src/hooks/Files/useDeleteFilesFromTable.tsx rename client/src/hooks/{ => Files}/useDragHelpers.ts (100%) create mode 100644 client/src/hooks/Files/useFileDeletion.ts create mode 100644 client/src/hooks/Files/useFileHandling.ts create mode 100644 client/src/hooks/Files/useFileMap.ts rename client/src/hooks/{ => Files}/useSetFilesToDelete.ts (100%) create mode 100644 client/src/hooks/Files/useUpdateFiles.ts create mode 100644 client/src/hooks/Input/useCombobox.ts create mode 100644 client/src/hooks/Messages/useAvatar.ts create mode 100644 client/src/hooks/Messages/useProgress.ts create mode 100644 client/src/hooks/Nav/index.ts create mode 100644 client/src/hooks/Nav/useNavScrolling.ts create mode 100644 client/src/hooks/Nav/useSideNavLinks.ts create mode 100644 client/src/hooks/Plugins/index.ts create mode 100644 client/src/hooks/Plugins/usePluginDialogHelpers.ts create mode 100644 client/src/hooks/SSE/index.ts create mode 100644 client/src/hooks/SSE/useContentHandler.ts create mode 100644 client/src/hooks/SSE/useSSE.ts delete mode 100644 client/src/hooks/useFileHandling.ts delete mode 100644 client/src/hooks/useFileHandlingResize.ts delete mode 100644 client/src/hooks/useSSE.ts create mode 100644 client/src/localization/Translation.spec.ts rename client/src/localization/{Translation.tsx => Translation.ts} (77%) rename client/src/localization/languages/{Ar.tsx => Ar.ts} (99%) create mode 100644 client/src/localization/languages/Br.ts delete mode 100644 client/src/localization/languages/Br.tsx create mode 100644 client/src/localization/languages/De.ts delete mode 100644 client/src/localization/languages/De.tsx rename client/src/localization/languages/{Eng.tsx => Eng.ts} (74%) create mode 100644 client/src/localization/languages/Es.ts delete mode 100644 client/src/localization/languages/Es.tsx rename client/src/localization/languages/{Fr.tsx => Fr.ts} (98%) create mode 100644 client/src/localization/languages/He.ts rename client/src/localization/languages/{Id.tsx => Id.ts} (97%) rename client/src/localization/languages/{It.tsx => It.ts} (97%) rename client/src/localization/languages/{Jp.tsx => Jp.ts} (89%) rename client/src/localization/languages/{Ko.tsx => Ko.ts} (99%) rename client/src/localization/languages/{Nl.tsx => Nl.ts} (99%) rename client/src/localization/languages/{Pl.tsx => Pl.ts} (99%) rename client/src/localization/languages/{Ru.tsx => Ru.ts} (88%) create mode 100644 client/src/localization/languages/Sv.ts delete mode 100644 client/src/localization/languages/Sv.tsx rename client/src/localization/languages/{Tr.tsx => Tr.ts} (99%) rename client/src/localization/languages/{Vi.tsx => Vi.ts} (99%) rename client/src/localization/languages/{Zh.tsx => Zh.ts} (81%) rename client/src/localization/languages/{ZhTraditional.tsx => ZhTraditional.ts} (99%) delete mode 100644 client/src/routes/AssistantsRoute.tsx delete mode 100644 client/src/routes/Chat.tsx delete mode 100644 client/src/store/models.ts create mode 100644 client/src/utils/convos.fakeData.ts create mode 100644 client/src/utils/convos.spec.ts create mode 100644 client/src/utils/convos.ts create mode 100644 client/src/utils/map.ts create mode 100644 client/src/utils/textarea.ts create mode 100644 config/user-stats.js create mode 100644 docs/deployment/docker_ubuntu_deploy.md create mode 100644 docs/deployment/introduction.md create mode 100644 docs/deployment/nginx.md create mode 100644 docs/deployment/railway.md create mode 100644 docs/deployment/traefik.md create mode 100644 docs/deployment/zeabur.md delete mode 100644 docs/features/pandoranext.md create mode 100644 docs/features/rag_api.md create mode 100644 docs/install/configuration/OAuth2-and-OIDC/aws.md create mode 100644 docs/install/configuration/OAuth2-and-OIDC/azure.md create mode 100644 docs/install/configuration/OAuth2-and-OIDC/discord.md create mode 100644 docs/install/configuration/OAuth2-and-OIDC/facebook.md create mode 100644 docs/install/configuration/OAuth2-and-OIDC/github.md create mode 100644 docs/install/configuration/OAuth2-and-OIDC/google.md create mode 100644 docs/install/configuration/OAuth2-and-OIDC/keycloak.md create mode 100644 docs/install/configuration/ai_endpoints.md create mode 100644 docs/install/configuration/azure_openai.md create mode 100644 docs/install/configuration/ollama.md create mode 100644 docs/src/requirements.txt create mode 100644 packages/data-provider/specs/actions.spec.ts create mode 100644 packages/data-provider/specs/azure.spec.ts create mode 100644 packages/data-provider/specs/filetypes.spec.ts create mode 100644 packages/data-provider/specs/generate.spec.ts create mode 100644 packages/data-provider/specs/openapiSpecs.ts create mode 100644 packages/data-provider/specs/parsers.spec.ts create mode 100644 packages/data-provider/src/actions.ts create mode 100644 packages/data-provider/src/azure.ts create mode 100644 packages/data-provider/src/file-config.ts create mode 100644 packages/data-provider/src/generate.ts delete mode 100644 packages/data-provider/src/react-query/assistants.ts create mode 100644 packages/data-provider/src/types/queries.ts create mode 100644 packages/data-provider/tsconfig.spec.json create mode 100644 rag.yml create mode 100755 utils/docker/docker-build.sh create mode 100755 utils/docker/docker-push.sh create mode 100644 utils/docker/test-compose.yml diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000000..7f5566fb979 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,5 @@ +FROM node:18-bullseye + +RUN useradd -m -s /bin/bash vscode +RUN mkdir -p /workspaces && chown -R vscode:vscode /workspaces +WORKDIR /workspaces diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ebfd2685ee6..a3bb7805501 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -13,5 +13,6 @@ } }, "postCreateCommand": "", - "features": { "ghcr.io/devcontainers/features/git:1": {} } + "features": { "ghcr.io/devcontainers/features/git:1": {} }, + "remoteUser": "vscode" } diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index c67fca63019..277ac84f856 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -2,7 +2,9 @@ version: "3.8" services: app: - image: node:19-bullseye + build: + context: .. + dockerfile: .devcontainer/Dockerfile # restart: always links: - mongodb @@ -30,8 +32,8 @@ services: # Use "forwardPorts" in **devcontainer.json** to forward an app port locally. # (Adding the "ports" property to this file will not forward from a Codespace.) - # Uncomment the next line to use a non-root user for all processes - See https://aka.ms/vscode-remote/containers/non-root for details. - # user: vscode + # Use a non-root user for all processes - See https://aka.ms/vscode-remote/containers/non-root for details. + user: vscode # Overrides default command so things don't shut down after the process ends. command: /bin/sh -c "while sleep 1000; do :; done" diff --git a/.env.example b/.env.example index 2e23a09a349..bd212cc7baa 100644 --- a/.env.example +++ b/.env.example @@ -1,21 +1,18 @@ -#=============================================================# -# LibreChat Configuration # -#=============================================================# -# Please refer to the reference documentation for assistance # -# with configuring your LibreChat environment. The guide is # -# available both online and within your local LibreChat # -# directory: # -# Online: https://docs.librechat.ai/install/dotenv.html # -# Locally: ./docs/install/dotenv.md # -#=============================================================# +#=====================================================================# +# LibreChat Configuration # +#=====================================================================# +# Please refer to the reference documentation for assistance # +# with configuring your LibreChat environment. The guide is # +# available both online and within your local LibreChat # +# directory: # +# Online: https://docs.librechat.ai/install/configuration/dotenv.html # +# Locally: ./docs/install/configuration/dotenv.md # +#=====================================================================# #==================================================# # Server Configuration # #==================================================# -APP_TITLE=LibreChat -# CUSTOM_FOOTER="My custom footer" - HOST=localhost PORT=3080 @@ -26,6 +23,13 @@ DOMAIN_SERVER=http://localhost:3080 NO_INDEX=true +#===============# +# JSON Logging # +#===============# + +# Use when process console logs in cloud deployment like GCP/AWS +CONSOLE_JSON=false + #===============# # Debug Logging # #===============# @@ -40,38 +44,62 @@ DEBUG_CONSOLE=false # UID=1000 # GID=1000 +#===============# +# Configuration # +#===============# +# Use an absolute path, a relative path, or a URL + +# CONFIG_PATH="/alternative/path/to/librechat.yaml" + #===================================================# # Endpoints # #===================================================# -# ENDPOINTS=openAI,azureOpenAI,bingAI,chatGPTBrowser,google,gptPlugins,anthropic +# ENDPOINTS=openAI,assistants,azureOpenAI,bingAI,google,gptPlugins,anthropic PROXY= +#===================================# +# Known Endpoints - librechat.yaml # +#===================================# +# https://docs.librechat.ai/install/configuration/ai_endpoints.html + +# GROQ_API_KEY= +# SHUTTLEAI_KEY= +# OPENROUTER_KEY= +# MISTRAL_API_KEY= +# ANYSCALE_API_KEY= +# FIREWORKS_API_KEY= +# PERPLEXITY_API_KEY= +# TOGETHERAI_API_KEY= + #============# # Anthropic # #============# ANTHROPIC_API_KEY=user_provided -ANTHROPIC_MODELS=claude-1,claude-instant-1,claude-2 +# ANTHROPIC_MODELS=claude-3-opus-20240229,claude-3-sonnet-20240229,claude-2.1,claude-2,claude-1.2,claude-1,claude-1-100k,claude-instant-1,claude-instant-1-100k # ANTHROPIC_REVERSE_PROXY= #============# # Azure # #============# -# AZURE_API_KEY= -AZURE_OPENAI_MODELS=gpt-3.5-turbo,gpt-4 -# AZURE_OPENAI_DEFAULT_MODEL=gpt-3.5-turbo -# PLUGINS_USE_AZURE="true" -AZURE_USE_MODEL_AS_DEPLOYMENT_NAME=TRUE +# Note: these variables are DEPRECATED +# Use the `librechat.yaml` configuration for `azureOpenAI` instead +# You may also continue to use them if you opt out of using the `librechat.yaml` configuration -# AZURE_OPENAI_API_INSTANCE_NAME= -# AZURE_OPENAI_API_DEPLOYMENT_NAME= -# AZURE_OPENAI_API_VERSION= -# AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME= -# AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME= +# AZURE_OPENAI_DEFAULT_MODEL=gpt-3.5-turbo # Deprecated +# AZURE_OPENAI_MODELS=gpt-3.5-turbo,gpt-4 # Deprecated +# AZURE_USE_MODEL_AS_DEPLOYMENT_NAME=TRUE # Deprecated +# AZURE_API_KEY= # Deprecated +# AZURE_OPENAI_API_INSTANCE_NAME= # Deprecated +# AZURE_OPENAI_API_DEPLOYMENT_NAME= # Deprecated +# AZURE_OPENAI_API_VERSION= # Deprecated +# AZURE_OPENAI_API_COMPLETIONS_DEPLOYMENT_NAME= # Deprecated +# AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME= # Deprecated +# PLUGINS_USE_AZURE="true" # Deprecated #============# # BingAI # @@ -80,14 +108,6 @@ AZURE_USE_MODEL_AS_DEPLOYMENT_NAME=TRUE BINGAI_TOKEN=user_provided # BINGAI_HOST=https://cn.bing.com -#============# -# ChatGPT # -#============# - -CHATGPT_TOKEN= -CHATGPT_MODELS=text-davinci-002-render-sha -# CHATGPT_REVERSE_PROXY= - #============# # Google # #============# @@ -101,7 +121,7 @@ GOOGLE_KEY=user_provided #============# OPENAI_API_KEY=user_provided -# OPENAI_MODELS=gpt-3.5-turbo-1106,gpt-4-1106-preview,gpt-3.5-turbo,gpt-3.5-turbo-16k,gpt-3.5-turbo-0301,gpt-4,gpt-4-0314,gpt-4-0613 +# OPENAI_MODELS=gpt-3.5-turbo-0125,gpt-3.5-turbo-0301,gpt-3.5-turbo,gpt-4,gpt-4-0613,gpt-4-vision-preview,gpt-3.5-turbo-0613,gpt-3.5-turbo-16k-0613,gpt-4-0125-preview,gpt-4-turbo-preview,gpt-4-1106-preview,gpt-3.5-turbo-1106,gpt-3.5-turbo-instruct,gpt-3.5-turbo-instruct-0914,gpt-3.5-turbo-16k DEBUG_OPENAI=false @@ -115,7 +135,15 @@ DEBUG_OPENAI=false # OPENAI_REVERSE_PROXY= -# OPENAI_ORGANIZATION= +# OPENAI_ORGANIZATION= + +#====================# +# Assistants API # +#====================# + +ASSISTANTS_API_KEY=user_provided +# ASSISTANTS_BASE_URL= +# ASSISTANTS_MODELS=gpt-3.5-turbo-0125,gpt-3.5-turbo-16k-0613,gpt-3.5-turbo-16k,gpt-3.5-turbo,gpt-4,gpt-4-0314,gpt-4-32k-0314,gpt-4-0613,gpt-3.5-turbo-0613,gpt-3.5-turbo-1106,gpt-4-0125-preview,gpt-4-turbo-preview,gpt-4-1106-preview #============# # OpenRouter # @@ -127,7 +155,7 @@ DEBUG_OPENAI=false # Plugins # #============# -# PLUGIN_MODELS=gpt-3.5-turbo,gpt-3.5-turbo-16k,gpt-3.5-turbo-0301,gpt-4,gpt-4-0314,gpt-4-0613 +# PLUGIN_MODELS=gpt-4,gpt-4-turbo-preview,gpt-4-0125-preview,gpt-4-1106-preview,gpt-4-0613,gpt-3.5-turbo,gpt-3.5-turbo-0125,gpt-3.5-turbo-1106,gpt-3.5-turbo-0613 DEBUG_PLUGINS=true @@ -147,20 +175,20 @@ AZURE_AI_SEARCH_SEARCH_OPTION_SELECT= # DALL·E #---------------- -# DALLE_API_KEY= # Key for both DALL-E-2 and DALL-E-3 -# DALLE3_API_KEY= # Key for DALL-E-3 only -# DALLE2_API_KEY= # Key for DALL-E-2 only -# DALLE3_SYSTEM_PROMPT="Your DALL-E-3 System Prompt here" -# DALLE2_SYSTEM_PROMPT="Your DALL-E-2 System Prompt here" -# DALLE_REVERSE_PROXY= # Reverse proxy for DALL-E-2 and DALL-E-3 -# DALLE3_BASEURL= # Base URL for DALL-E-3 -# DALLE2_BASEURL= # Base URL for DALL-E-2 +# DALLE_API_KEY= +# DALLE3_API_KEY= +# DALLE2_API_KEY= +# DALLE3_SYSTEM_PROMPT= +# DALLE2_SYSTEM_PROMPT= +# DALLE_REVERSE_PROXY= +# DALLE3_BASEURL= +# DALLE2_BASEURL= # DALL·E (via Azure OpenAI) # Note: requires some of the variables above to be set #---------------- -# DALLE3_AZURE_API_VERSION= # Azure OpenAI API version for DALL-E-3 -# DALLE2_AZURE_API_VERSION= # Azure OpenAI API versiion for DALL-E-2 +# DALLE3_AZURE_API_VERSION= +# DALLE2_AZURE_API_VERSION= # Google #----------------- @@ -175,6 +203,14 @@ SERPAPI_API_KEY= #----------------- SD_WEBUI_URL=http://host.docker.internal:7860 +# Tavily +#----------------- +TAVILY_API_KEY= + +# Traversaal +#----------------- +TRAVERSAAL_API_KEY= + # WolframAlpha #----------------- WOLFRAM_APP_ID= @@ -202,7 +238,7 @@ MEILI_MASTER_KEY=DrhYf7zENyR6AlUCKmnz0eYASOQdl6zxH7s7MKFSfFCt OPENAI_MODERATION=false OPENAI_MODERATION_API_KEY= -# OPENAI_MODERATION_REVERSE_PROXY=not working with some reverse proxys +# OPENAI_MODERATION_REVERSE_PROXY= BAN_VIOLATIONS=true BAN_DURATION=1000 * 60 * 60 * 2 @@ -230,6 +266,8 @@ LIMIT_MESSAGE_USER=false MESSAGE_USER_MAX=40 MESSAGE_USER_WINDOW=1 +ILLEGAL_MODEL_REQ_SCORE=5 + #========================# # Balance # #========================# @@ -278,6 +316,9 @@ OPENID_ISSUER= OPENID_SESSION_SECRET= OPENID_SCOPE="openid profile email" OPENID_CALLBACK_URL=/oauth/openid/callback +OPENID_REQUIRED_ROLE= +OPENID_REQUIRED_ROLE_TOKEN_KIND= +OPENID_REQUIRED_ROLE_PARAMETER_PATH= OPENID_BUTTON_LABEL= OPENID_IMAGE_URL= @@ -286,15 +327,15 @@ OPENID_IMAGE_URL= # Email Password Reset # #========================# -EMAIL_SERVICE= -EMAIL_HOST= -EMAIL_PORT=25 -EMAIL_ENCRYPTION= -EMAIL_ENCRYPTION_HOSTNAME= -EMAIL_ALLOW_SELFSIGNED= -EMAIL_USERNAME= -EMAIL_PASSWORD= -EMAIL_FROM_NAME= +EMAIL_SERVICE= +EMAIL_HOST= +EMAIL_PORT=25 +EMAIL_ENCRYPTION= +EMAIL_ENCRYPTION_HOSTNAME= +EMAIL_ALLOW_SELFSIGNED= +EMAIL_USERNAME= +EMAIL_PASSWORD= +EMAIL_FROM_NAME= EMAIL_FROM=noreply@librechat.ai #========================# @@ -308,6 +349,16 @@ FIREBASE_STORAGE_BUCKET= FIREBASE_MESSAGING_SENDER_ID= FIREBASE_APP_ID= +#===================================================# +# UI # +#===================================================# + +APP_TITLE=LibreChat +# CUSTOM_FOOTER="My custom footer" +HELP_AND_FAQ_URL=https://librechat.ai + +# SHOW_BIRTHDAY_ICON=true + #==================================================# # Others # #==================================================# diff --git a/.eslintrc.js b/.eslintrc.js index a3d71acd69f..e85e0d768ca 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -19,6 +19,7 @@ module.exports = { 'e2e/playwright-report/**/*', 'packages/data-provider/types/**/*', 'packages/data-provider/dist/**/*', + 'packages/data-provider/test_bundle/**/*', 'data-node/**/*', 'meili_data/**/*', 'node_modules/**/*', @@ -131,6 +132,12 @@ module.exports = { }, ], }, + { + files: ['./packages/data-provider/specs/**/*.ts'], + parserOptions: { + project: './packages/data-provider/tsconfig.spec.json', + }, + }, ], settings: { react: { diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 3f39cc00b3b..cb767cbd7cd 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement here on GitHub or -on the official [Discord Server](https://discord.gg/uDyZ5Tzhct). +on the official [Discord Server](https://discord.librechat.ai). All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 36618437fab..142f67c953f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -8,7 +8,7 @@ If the feature you would like to contribute has not already received prior appro Please note that a pull request involving a feature that has not been reviewed and approved by the project maintainers may be rejected. We appreciate your understanding and cooperation. -If you would like to discuss the changes you wish to make, join our [Discord community](https://discord.gg/uDyZ5Tzhct), where you can engage with other contributors and seek guidance from the community. +If you would like to discuss the changes you wish to make, join our [Discord community](https://discord.librechat.ai), where you can engage with other contributors and seek guidance from the community. ## Our Standards diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml index b6b64c3f2de..5c88b9f70dc 100644 --- a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml +++ b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml @@ -50,7 +50,7 @@ body: id: terms attributes: label: Code of Conduct - description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/danny-avila/LibreChat/blob/main/CODE_OF_CONDUCT.md) + description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/danny-avila/LibreChat/blob/main/.github/CODE_OF_CONDUCT.md) options: - label: I agree to follow this project's Code of Conduct required: true diff --git a/.github/SECURITY.md b/.github/SECURITY.md index bd105f2526c..b01e04e0160 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -12,7 +12,7 @@ When reporting a security vulnerability, you have the following options to reach - **Option 2: GitHub Issues**: You can initiate first contact via GitHub Issues. However, please note that initial contact through GitHub Issues should not include any sensitive details. -- **Option 3: Discord Server**: You can join our [Discord community](https://discord.gg/5rbRxn4uME) and initiate first contact in the `#issues` channel. However, please ensure that initial contact through Discord does not include any sensitive details. +- **Option 3: Discord Server**: You can join our [Discord community](https://discord.librechat.ai) and initiate first contact in the `#issues` channel. However, please ensure that initial contact through Discord does not include any sensitive details. _After the initial contact, we will establish a private communication channel for further discussion._ @@ -39,11 +39,11 @@ Please note that as a security-conscious community, we may not always disclose d This security policy applies to the following GitHub repository: -- Repository: [LibreChat](https://github.com/danny-avila/LibreChat) +- Repository: [LibreChat](https://github.librechat.ai) ## Contact -If you have any questions or concerns regarding the security of our project, please join our [Discord community](https://discord.gg/NGaa9RPCft) and report them in the appropriate channel. You can also reach out to us by [opening an issue](https://github.com/danny-avila/LibreChat/issues/new) on GitHub. Please note that the response time may vary depending on the nature and severity of the inquiry. +If you have any questions or concerns regarding the security of our project, please join our [Discord community](https://discord.librechat.ai) and report them in the appropriate channel. You can also reach out to us by [opening an issue](https://github.com/danny-avila/LibreChat/issues/new) on GitHub. Please note that the response time may vary depending on the nature and severity of the inquiry. ## Acknowledgments diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 06d2656bd64..a1542cb76e4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -15,8 +15,9 @@ Please delete any irrelevant options. - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] This change requires a documentation update -- [ ] Documentation update - [ ] Translation update +- [ ] Documentation update + ## Testing @@ -26,6 +27,8 @@ Please describe your test process and include instructions so that we can reprod ## Checklist +Please delete any irrelevant options. + - [ ] My code adheres to this project's style guidelines - [ ] I have performed a self-review of my own code - [ ] I have commented in any complex areas of my code @@ -34,3 +37,4 @@ Please describe your test process and include instructions so that we can reprod - [ ] I have written tests demonstrating that my changes are effective or that my feature works - [ ] Local unit tests pass with my changes - [ ] Any changes dependent on mine have been merged and published in downstream modules. +- [ ] New documents have been locally validated with mkdocs diff --git a/.github/workflows/backend-review.yml b/.github/workflows/backend-review.yml index fddb6cdac63..db46653c651 100644 --- a/.github/workflows/backend-review.yml +++ b/.github/workflows/backend-review.yml @@ -30,10 +30,28 @@ jobs: - name: Install Data Provider run: npm run build:data-provider + + - name: Create empty auth.json file + run: | + mkdir -p api/data + echo '{}' > api/data/auth.json + + - name: Check for Circular dependency in rollup + working-directory: ./packages/data-provider + run: | + output=$(npm run rollup:api) + echo "$output" + if echo "$output" | grep -q "Circular dependency"; then + echo "Error: Circular dependency detected!" + exit 1 + fi - name: Run unit tests run: cd api && npm run test:ci + - name: Run librechat-data-provider unit tests + run: cd packages/data-provider && npm run test:ci + - name: Run linters uses: wearerequired/lint-action@v2 with: diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml deleted file mode 100644 index 23c6ad48cc8..00000000000 --- a/.github/workflows/container.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Docker Compose Build on Tag - -# The workflow is triggered when a tag is pushed -on: - push: - tags: - - "*" - -jobs: - build: - runs-on: ubuntu-latest - - steps: - # Check out the repository - - name: Checkout - uses: actions/checkout@v4 - - # Set up Docker - - name: Set up Docker - uses: docker/setup-buildx-action@v3 - - # Set up QEMU for cross-platform builds - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - # Log in to GitHub Container Registry - - name: Log in to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - # Prepare Docker Build - - name: Build Docker images - run: | - cp .env.example .env - - # Tag and push librechat-api - - name: Docker metadata for librechat-api - id: meta-librechat-api - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/${{ github.repository_owner }}/librechat-api - tags: | - type=raw,value=latest - type=semver,pattern={{version}} - type=semver,pattern={{major}} - type=semver,pattern={{major}}.{{minor}} - - - name: Build and librechat-api - uses: docker/build-push-action@v5 - with: - file: Dockerfile.multi - context: . - push: true - tags: ${{ steps.meta-librechat-api.outputs.tags }} - platforms: linux/amd64,linux/arm64 - target: api-build - - # Tag and push librechat - - name: Docker metadata for librechat - id: meta-librechat - uses: docker/metadata-action@v5 - with: - images: | - ghcr.io/${{ github.repository_owner }}/librechat - tags: | - type=raw,value=latest - type=semver,pattern={{version}} - type=semver,pattern={{major}} - type=semver,pattern={{major}}.{{minor}} - - - name: Build and librechat - uses: docker/build-push-action@v5 - with: - file: Dockerfile - context: . - push: true - tags: ${{ steps.meta-librechat.outputs.tags }} - platforms: linux/amd64,linux/arm64 - target: node diff --git a/.github/workflows/dev-images.yml b/.github/workflows/dev-images.yml index e0149e05e9c..41d427c6c8b 100644 --- a/.github/workflows/dev-images.yml +++ b/.github/workflows/dev-images.yml @@ -2,18 +2,38 @@ name: Docker Dev Images Build on: workflow_dispatch: + push: + branches: + - main + paths: + - 'api/**' + - 'client/**' + - 'packages/**' jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + include: + - target: api-build + file: Dockerfile.multi + image_name: librechat-dev-api + - target: node + file: Dockerfile + image_name: librechat-dev steps: # Check out the repository - name: Checkout uses: actions/checkout@v4 - # Set up Docker - - name: Set up Docker + # Set up QEMU + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + # Set up Docker Buildx + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Log in to GitHub Container Registry @@ -24,22 +44,29 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - # Build Docker images - - name: Build Docker images + # Login to Docker Hub + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # Prepare the environment + - name: Prepare environment run: | cp .env.example .env - docker build -f Dockerfile.multi --target api-build -t librechat-dev-api . - docker build -f Dockerfile -t librechat-dev . - # Tag and push the images to GitHub Container Registry - - name: Tag and push images - run: | - docker tag librechat-dev-api:latest ghcr.io/${{ github.repository_owner }}/librechat-dev-api:${{ github.sha }} - docker push ghcr.io/${{ github.repository_owner }}/librechat-dev-api:${{ github.sha }} - docker tag librechat-dev-api:latest ghcr.io/${{ github.repository_owner }}/librechat-dev-api:latest - docker push ghcr.io/${{ github.repository_owner }}/librechat-dev-api:latest - - docker tag librechat-dev:latest ghcr.io/${{ github.repository_owner }}/librechat-dev:${{ github.sha }} - docker push ghcr.io/${{ github.repository_owner }}/librechat-dev:${{ github.sha }} - docker tag librechat-dev:latest ghcr.io/${{ github.repository_owner }}/librechat-dev:latest - docker push ghcr.io/${{ github.repository_owner }}/librechat-dev:latest + # Build and push Docker images for each target + - name: Build and push Docker images + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ matrix.file }} + push: true + tags: | + ghcr.io/${{ github.repository_owner }}/${{ matrix.image_name }}:${{ github.sha }} + ghcr.io/${{ github.repository_owner }}/${{ matrix.image_name }}:latest + ${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_name }}:${{ github.sha }} + ${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_name }}:latest + platforms: linux/amd64,linux/arm64 + target: ${{ matrix.target }} diff --git a/.github/workflows/generate_embeddings.yml b/.github/workflows/generate_embeddings.yml new file mode 100644 index 00000000000..c514f9c1d6b --- /dev/null +++ b/.github/workflows/generate_embeddings.yml @@ -0,0 +1,20 @@ +name: 'generate_embeddings' +on: + workflow_dispatch: + push: + branches: + - main + paths: + - 'docs/**' + +jobs: + generate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: supabase/embeddings-generator@v0.0.5 + with: + supabase-url: ${{ secrets.SUPABASE_URL }} + supabase-service-role-key: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }} + openai-key: ${{ secrets.OPENAI_DOC_EMBEDDINGS_KEY }} + docs-root-path: 'docs' \ No newline at end of file diff --git a/.github/workflows/latest-images-main.yml b/.github/workflows/latest-images-main.yml deleted file mode 100644 index 5149cecb0e6..00000000000 --- a/.github/workflows/latest-images-main.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Docker Compose Build on Main Branch - -on: - workflow_dispatch: # This line allows manual triggering - -jobs: - build: - runs-on: ubuntu-latest - - steps: - # Check out the repository - - name: Checkout - uses: actions/checkout@v4 - - # Set up Docker - - name: Set up Docker - uses: docker/setup-buildx-action@v3 - - # Log in to GitHub Container Registry - - name: Log in to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - # Run docker-compose build - - name: Build Docker images - run: | - cp .env.example .env - docker-compose build - docker build -f Dockerfile.multi --target api-build -t librechat-api . - - # Tag and push the images with the 'latest' tag - - name: Tag image and push - run: | - docker tag librechat:latest ghcr.io/${{ github.repository_owner }}/librechat:latest - docker push ghcr.io/${{ github.repository_owner }}/librechat:latest - docker tag librechat-api:latest ghcr.io/${{ github.repository_owner }}/librechat-api:latest - docker push ghcr.io/${{ github.repository_owner }}/librechat-api:latest diff --git a/.github/workflows/main-image-workflow.yml b/.github/workflows/main-image-workflow.yml new file mode 100644 index 00000000000..43c9d957534 --- /dev/null +++ b/.github/workflows/main-image-workflow.yml @@ -0,0 +1,69 @@ +name: Docker Compose Build Latest Main Image Tag (Manual Dispatch) + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + include: + - target: api-build + file: Dockerfile.multi + image_name: librechat-api + - target: node + file: Dockerfile + image_name: librechat + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Fetch tags and set the latest tag + run: | + git fetch --tags + echo "LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)" >> $GITHUB_ENV + + # Set up QEMU + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + # Set up Docker Buildx + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # Log in to GitHub Container Registry + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Login to Docker Hub + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # Prepare the environment + - name: Prepare environment + run: | + cp .env.example .env + + # Build and push Docker images for each target + - name: Build and push Docker images + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ matrix.file }} + push: true + tags: | + ghcr.io/${{ github.repository_owner }}/${{ matrix.image_name }}:${{ env.LATEST_TAG }} + ghcr.io/${{ github.repository_owner }}/${{ matrix.image_name }}:latest + ${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_name }}:${{ env.LATEST_TAG }} + ${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_name }}:latest + platforms: linux/amd64,linux/arm64 + target: ${{ matrix.target }} diff --git a/.github/workflows/tag-images.yml b/.github/workflows/tag-images.yml new file mode 100644 index 00000000000..e90f43978ab --- /dev/null +++ b/.github/workflows/tag-images.yml @@ -0,0 +1,67 @@ +name: Docker Images Build on Tag + +on: + push: + tags: + - '*' + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + include: + - target: api-build + file: Dockerfile.multi + image_name: librechat-api + - target: node + file: Dockerfile + image_name: librechat + + steps: + # Check out the repository + - name: Checkout + uses: actions/checkout@v4 + + # Set up QEMU + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + # Set up Docker Buildx + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # Log in to GitHub Container Registry + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Login to Docker Hub + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # Prepare the environment + - name: Prepare environment + run: | + cp .env.example .env + + # Build and push Docker images for each target + - name: Build and push Docker images + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ matrix.file }} + push: true + tags: | + ghcr.io/${{ github.repository_owner }}/${{ matrix.image_name }}:${{ github.ref_name }} + ghcr.io/${{ github.repository_owner }}/${{ matrix.image_name }}:latest + ${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_name }}:${{ github.ref_name }} + ${{ secrets.DOCKERHUB_USERNAME }}/${{ matrix.image_name }}:latest + platforms: linux/amd64,linux/arm64 + target: ${{ matrix.target }} diff --git a/.gitignore b/.gitignore index 765de5cb799..c55115988b9 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ bower_components/ #config file librechat.yaml +librechat.yml # Environment .npmrc @@ -74,6 +75,7 @@ src/style - official.css config.local.ts **/storageState.json junit.xml +**/.venv/ # docker override file docker-compose.override.yaml @@ -88,4 +90,10 @@ auth.json /packages/ux-shared/ /images -!client/src/components/Nav/SettingsTabs/Data/ \ No newline at end of file +!client/src/components/Nav/SettingsTabs/Data/ + +# User uploads +uploads/ + +# owner +release/ \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index af85628072b..67f5b002728 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ -#!/usr/bin/env sh +#!/usr/bin/env sh set -e . "$(dirname -- "$0")/_/husky.sh" [ -n "$CI" ] && exit 0 diff --git a/Dockerfile b/Dockerfile index edc79c2497a..fd087eae39d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,35 @@ +# v0.7.0 + # Base node image -FROM node:18-alpine AS node +FROM node:18-alpine3.18 AS node + +RUN apk add g++ make py3-pip +RUN npm install -g node-gyp +RUN apk --no-cache add curl -COPY . /app +RUN mkdir -p /app && chown node:node /app WORKDIR /app +USER node + +COPY --chown=node:node . . + # Allow mounting of these files, which have no default # values. RUN touch .env -# Install call deps - Install curl for health check -RUN apk --no-cache add curl && \ - npm ci +RUN npm config set fetch-retry-maxtimeout 600000 +RUN npm config set fetch-retries 5 +RUN npm config set fetch-retry-mintimeout 15000 +RUN npm install --no-audit # React client build ENV NODE_OPTIONS="--max-old-space-size=2048" RUN npm run frontend +# Create directories for the volumes to inherit +# the correct permissions +RUN mkdir -p /app/client/public/images /app/api/logs + # Node API setup EXPOSE 3080 ENV HOST=0.0.0.0 diff --git a/Dockerfile.multi b/Dockerfile.multi index 0d5ebec5e23..00ed37e3ef8 100644 --- a/Dockerfile.multi +++ b/Dockerfile.multi @@ -1,3 +1,5 @@ +# v0.7.0 + # Build API, Client and Data Provider FROM node:20-alpine AS base @@ -11,11 +13,12 @@ RUN npm run build # React client build FROM data-provider-build AS client-build WORKDIR /app/client -COPY ./client/ ./ +COPY ./client/package*.json ./ # Copy data-provider to client's node_modules RUN mkdir -p /app/client/node_modules/librechat-data-provider/ RUN cp -R /app/packages/data-provider/* /app/client/node_modules/librechat-data-provider/ RUN npm install +COPY ./client/ ./ ENV NODE_OPTIONS="--max-old-space-size=2048" RUN npm run build @@ -24,6 +27,8 @@ FROM data-provider-build AS api-build WORKDIR /app/api COPY api/package*.json ./ COPY api/ ./ +# Copy helper scripts +COPY config/ ./ # Copy data-provider to API's node_modules RUN mkdir -p /app/api/node_modules/librechat-data-provider/ RUN cp -R /app/packages/data-provider/* /app/api/node_modules/librechat-data-provider/ diff --git a/README.md b/README.md index 00cd890b073..901ddbc7c14 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@

- + - -

LibreChat

- +

+ LibreChat +

@@ -27,42 +27,48 @@

- - Deploy on Railway - -

- -

- - Deploy on Sealos - + + Deploy on Railway + + + Deploy on Zeabur + + + Deploy on Sealos +

# 📃 Features - - 🖥️ UI matching ChatGPT, including Dark mode, Streaming, and 11-2023 updates - - 💬 Multimodal Chat: - - Upload and analyze images with GPT-4 and Gemini Vision 📸 - - More filetypes and Assistants API integration in Active Development 🚧 - - 🌎 Multilingual UI: - - English, 中文, Deutsch, Español, Français, Italiano, Polski, Português Brasileiro, - - Русский, 日本語, Svenska, 한국어, Tiếng Việt, 繁體中文, العربية, Türkçe, Nederlands - - 🤖 AI model selection: OpenAI API, Azure, BingAI, ChatGPT, Google Vertex AI, Anthropic (Claude), Plugins - - 💾 Create, Save, & Share Custom Presets - - 🔄 Edit, Resubmit, and Continue messages with conversation branching - - 📤 Export conversations as screenshots, markdown, text, json. - - 🔍 Search all messages/conversations - - 🔌 Plugins, including web access, image generation with DALL-E-3 and more - - 👥 Multi-User, Secure Authentication with Moderation and Token spend tools - - ⚙️ Configure Proxy, Reverse Proxy, Docker, many Deployment options, and completely Open-Source -[For a thorough review of our features, see our docs here](https://docs.librechat.ai/features/plugins/introduction.html) 📚 +- 🖥️ UI matching ChatGPT, including Dark mode, Streaming, and latest updates +- 💬 Multimodal Chat: + - Upload and analyze images with Claude 3, GPT-4, and Gemini Vision 📸 + - Chat with Files using Custom Endpoints, OpenAI, Azure, Anthropic, & Google. 🗃️ + - Advanced Agents with Files, Code Interpreter, Tools, and API Actions 🔦 + - Available through the [OpenAI Assistants API](https://platform.openai.com/docs/assistants/overview) 🌤️ + - Non-OpenAI Agents in Active Development 🚧 +- 🌎 Multilingual UI: + - English, 中文, Deutsch, Español, Français, Italiano, Polski, Português Brasileiro, + - Русский, 日本語, Svenska, 한국어, Tiếng Việt, 繁體中文, العربية, Türkçe, Nederlands, עברית +- 🤖 AI model selection: OpenAI, Azure OpenAI, BingAI, ChatGPT, Google Vertex AI, Anthropic (Claude), Plugins, Assistants API (including Azure Assistants) +- 💾 Create, Save, & Share Custom Presets +- 🔄 Edit, Resubmit, and Continue messages with conversation branching +- 📤 Export conversations as screenshots, markdown, text, json. +- 🔍 Search all messages/conversations +- 🔌 Plugins, including web access, image generation with DALL-E-3 and more +- 👥 Multi-User, Secure Authentication with Moderation and Token spend tools +- ⚙️ Configure Proxy, Reverse Proxy, Docker, & many Deployment options +- 📖 Completely Open-Source & Built in Public +- 🧑‍🤝‍🧑 Community-driven development, support, and feedback +[For a thorough review of our features, see our docs here](https://docs.librechat.ai/features/plugins/introduction.html) 📚 ## 🪶 All-In-One AI Conversations with LibreChat + LibreChat brings together the future of assistant AIs with the revolutionary technology of OpenAI's ChatGPT. Celebrating the original styling, LibreChat gives you the ability to integrate multiple AI models. It also integrates and enhances original client features such as conversation and message search, prompt templates and plugins. With LibreChat, you no longer need to opt for ChatGPT Plus and can instead use free or pay-per-call APIs. We welcome contributions, cloning, and forking to enhance the capabilities of this advanced chatbot platform. - + [![Watch the video](https://img.youtube.com/vi/pNIOs1ovsXw/maxresdefault.jpg)](https://youtu.be/pNIOs1ovsXw) @@ -71,11 +77,13 @@ Click on the thumbnail to open the video☝️ --- ## 📚 Documentation + For more information on how to use our advanced features, install and configure our software, and access our guidelines and tutorials, please check out our documentation at [docs.librechat.ai](https://docs.librechat.ai) --- -## 📝 Changelog +## 📝 Changelog + Keep up with the latest updates by visiting the releases page - [Releases](https://github.com/danny-avila/LibreChat/releases) **⚠️ [Breaking Changes](docs/general_info/breaking_changes.md)** @@ -96,14 +104,15 @@ Please consult the breaking changes before updating. --- ## ✨ Contributions + Contributions, suggestions, bug reports and fixes are welcome! -For new features, components, or extensions, please open an issue and discuss before sending a PR. +For new features, components, or extensions, please open an issue and discuss before sending a PR. --- -💖 This project exists in its current state thanks to all the people who contribute ---- +## 💖 This project exists in its current state thanks to all the people who contribute + diff --git a/api/app/chatgpt-browser.js b/api/app/chatgpt-browser.js index 467e67785d3..818661555dc 100644 --- a/api/app/chatgpt-browser.js +++ b/api/app/chatgpt-browser.js @@ -1,5 +1,6 @@ require('dotenv').config(); const { KeyvFile } = require('keyv-file'); +const { Constants } = require('librechat-data-provider'); const { getUserKey, checkUserKeyExpiry } = require('../server/services/UserService'); const browserClient = async ({ @@ -48,7 +49,7 @@ const browserClient = async ({ options = { ...options, parentMessageId, conversationId }; } - if (parentMessageId === '00000000-0000-0000-0000-000000000000') { + if (parentMessageId === Constants.NO_PARENT) { delete options.conversationId; } diff --git a/api/app/clients/AnthropicClient.js b/api/app/clients/AnthropicClient.js index 0441a49334e..6d478defab0 100644 --- a/api/app/clients/AnthropicClient.js +++ b/api/app/clients/AnthropicClient.js @@ -1,6 +1,19 @@ const Anthropic = require('@anthropic-ai/sdk'); const { encoding_for_model: encodingForModel, get_encoding: getEncoding } = require('tiktoken'); -const { getResponseSender, EModelEndpoint } = require('librechat-data-provider'); +const { + getResponseSender, + EModelEndpoint, + validateVisionModel, +} = require('librechat-data-provider'); +const { encodeAndFormat } = require('~/server/services/Files/images/encode'); +const { + titleFunctionPrompt, + parseTitleFromPrompt, + truncateText, + formatMessage, + createContextHandlers, +} = require('./prompts'); +const spendTokens = require('~/models/spendTokens'); const { getModelMaxTokens } = require('~/utils'); const BaseClient = require('./BaseClient'); const { logger } = require('~/config'); @@ -10,12 +23,20 @@ const AI_PROMPT = '\n\nAssistant:'; const tokenizersCache = {}; +/** Helper function to introduce a delay before retrying */ +function delayBeforeRetry(attempts, baseDelay = 1000) { + return new Promise((resolve) => setTimeout(resolve, baseDelay * attempts)); +} + class AnthropicClient extends BaseClient { constructor(apiKey, options = {}) { super(apiKey, options); this.apiKey = apiKey || process.env.ANTHROPIC_API_KEY; this.userLabel = HUMAN_PROMPT; this.assistantLabel = AI_PROMPT; + this.contextStrategy = options.contextStrategy + ? options.contextStrategy.toLowerCase() + : 'discard'; this.setOptions(options); } @@ -47,6 +68,12 @@ class AnthropicClient extends BaseClient { stop: modelOptions.stop, // no stop method for now }; + this.isClaude3 = this.modelOptions.model.includes('claude-3'); + this.useMessages = this.isClaude3 || !!this.options.attachments; + + this.defaultVisionModel = this.options.visionModel ?? 'claude-3-sonnet-20240229'; + this.options.attachments?.then((attachments) => this.checkVisionRequest(attachments)); + this.maxContextTokens = getModelMaxTokens(this.modelOptions.model, EModelEndpoint.anthropic) ?? 100000; this.maxResponseTokens = this.modelOptions.maxOutputTokens || 1500; @@ -87,7 +114,12 @@ class AnthropicClient extends BaseClient { return this; } + /** + * Get the initialized Anthropic client. + * @returns {Anthropic} The Anthropic client instance. + */ getClient() { + /** @type {Anthropic.default.RequestOptions} */ const options = { apiKey: this.apiKey, }; @@ -99,6 +131,75 @@ class AnthropicClient extends BaseClient { return new Anthropic(options); } + getTokenCountForResponse(response) { + return this.getTokenCountForMessage({ + role: 'assistant', + content: response.text, + }); + } + + /** + * + * Checks if the model is a vision model based on request attachments and sets the appropriate options: + * - Sets `this.modelOptions.model` to `gpt-4-vision-preview` if the request is a vision request. + * - Sets `this.isVisionModel` to `true` if vision request. + * - Deletes `this.modelOptions.stop` if vision request. + * @param {MongoFile[]} attachments + */ + checkVisionRequest(attachments) { + const availableModels = this.options.modelsConfig?.[EModelEndpoint.anthropic]; + this.isVisionModel = validateVisionModel({ model: this.modelOptions.model, availableModels }); + + const visionModelAvailable = availableModels?.includes(this.defaultVisionModel); + if ( + attachments && + attachments.some((file) => file?.type && file?.type?.includes('image')) && + visionModelAvailable && + !this.isVisionModel + ) { + this.modelOptions.model = this.defaultVisionModel; + this.isVisionModel = true; + } + } + + /** + * Calculate the token cost in tokens for an image based on its dimensions and detail level. + * + * For reference, see: https://docs.anthropic.com/claude/docs/vision#image-costs + * + * @param {Object} image - The image object. + * @param {number} image.width - The width of the image. + * @param {number} image.height - The height of the image. + * @returns {number} The calculated token cost measured by tokens. + * + */ + calculateImageTokenCost({ width, height }) { + return Math.ceil((width * height) / 750); + } + + async addImageURLs(message, attachments) { + const { files, image_urls } = await encodeAndFormat( + this.options.req, + attachments, + EModelEndpoint.anthropic, + ); + message.image_urls = image_urls.length ? image_urls : undefined; + return files; + } + + async recordTokenUsage({ promptTokens, completionTokens, model, context = 'message' }) { + await spendTokens( + { + context, + user: this.user, + conversationId: this.conversationId, + model: model ?? this.modelOptions.model, + endpointTokenConfig: this.options.endpointTokenConfig, + }, + { promptTokens, completionTokens }, + ); + } + async buildMessages(messages, parentMessageId) { const orderedMessages = this.constructor.getMessagesForConversation({ messages, @@ -107,28 +208,145 @@ class AnthropicClient extends BaseClient { logger.debug('[AnthropicClient] orderedMessages', { orderedMessages, parentMessageId }); - const formattedMessages = orderedMessages.map((message) => ({ - author: message.isCreatedByUser ? this.userLabel : this.assistantLabel, - content: message?.content ?? message.text, - })); + if (this.options.attachments) { + const attachments = await this.options.attachments; + const images = attachments.filter((file) => file.type.includes('image')); + + if (images.length && !this.isVisionModel) { + throw new Error('Images are only supported with the Claude 3 family of models'); + } + + const latestMessage = orderedMessages[orderedMessages.length - 1]; + + if (this.message_file_map) { + this.message_file_map[latestMessage.messageId] = attachments; + } else { + this.message_file_map = { + [latestMessage.messageId]: attachments, + }; + } + + const files = await this.addImageURLs(latestMessage, attachments); + + this.options.attachments = files; + } + + if (this.message_file_map) { + this.contextHandlers = createContextHandlers( + this.options.req, + orderedMessages[orderedMessages.length - 1].text, + ); + } + + const formattedMessages = orderedMessages.map((message, i) => { + const formattedMessage = this.useMessages + ? formatMessage({ + message, + endpoint: EModelEndpoint.anthropic, + }) + : { + author: message.isCreatedByUser ? this.userLabel : this.assistantLabel, + content: message?.content ?? message.text, + }; + + const needsTokenCount = this.contextStrategy && !orderedMessages[i].tokenCount; + /* If tokens were never counted, or, is a Vision request and the message has files, count again */ + if (needsTokenCount || (this.isVisionModel && (message.image_urls || message.files))) { + orderedMessages[i].tokenCount = this.getTokenCountForMessage(formattedMessage); + } + + /* If message has files, calculate image token cost */ + if (this.message_file_map && this.message_file_map[message.messageId]) { + const attachments = this.message_file_map[message.messageId]; + for (const file of attachments) { + if (file.embedded) { + this.contextHandlers?.processFile(file); + continue; + } + + orderedMessages[i].tokenCount += this.calculateImageTokenCost({ + width: file.width, + height: file.height, + }); + } + } + + formattedMessage.tokenCount = orderedMessages[i].tokenCount; + return formattedMessage; + }); + + if (this.contextHandlers) { + this.augmentedPrompt = await this.contextHandlers.createContext(); + this.options.promptPrefix = this.augmentedPrompt + (this.options.promptPrefix ?? ''); + } + + let { context: messagesInWindow, remainingContextTokens } = + await this.getMessagesWithinTokenLimit(formattedMessages); + + const tokenCountMap = orderedMessages + .slice(orderedMessages.length - messagesInWindow.length) + .reduce((map, message, index) => { + const { messageId } = message; + if (!messageId) { + return map; + } + + map[messageId] = orderedMessages[index].tokenCount; + return map; + }, {}); + + logger.debug('[AnthropicClient]', { + messagesInWindow: messagesInWindow.length, + remainingContextTokens, + }); let lastAuthor = ''; let groupedMessages = []; - for (let message of formattedMessages) { + for (let i = 0; i < messagesInWindow.length; i++) { + const message = messagesInWindow[i]; + const author = message.role ?? message.author; // If last author is not same as current author, add to new group - if (lastAuthor !== message.author) { - groupedMessages.push({ - author: message.author, + if (lastAuthor !== author) { + const newMessage = { content: [message.content], - }); - lastAuthor = message.author; + }; + + if (message.role) { + newMessage.role = message.role; + } else { + newMessage.author = message.author; + } + + groupedMessages.push(newMessage); + lastAuthor = author; // If same author, append content to the last group } else { groupedMessages[groupedMessages.length - 1].content.push(message.content); } } + groupedMessages = groupedMessages.map((msg, i) => { + const isLast = i === groupedMessages.length - 1; + if (msg.content.length === 1) { + const content = msg.content[0]; + return { + ...msg, + // reason: final assistant content cannot end with trailing whitespace + content: + isLast && this.useMessages && msg.role === 'assistant' && typeof content === 'string' + ? content?.trim() + : content, + }; + } + + if (!this.useMessages && msg.tokenCount) { + delete msg.tokenCount; + } + + return msg; + }); + let identityPrefix = ''; if (this.options.userLabel) { identityPrefix = `\nHuman's name: ${this.options.userLabel}`; @@ -154,9 +372,10 @@ class AnthropicClient extends BaseClient { // Prompt AI to respond, empty if last message was from AI let isEdited = lastAuthor === this.assistantLabel; const promptSuffix = isEdited ? '' : `${promptPrefix}${this.assistantLabel}\n`; - let currentTokenCount = isEdited - ? this.getTokenCount(promptPrefix) - : this.getTokenCount(promptSuffix); + let currentTokenCount = + isEdited || this.useMessages + ? this.getTokenCount(promptPrefix) + : this.getTokenCount(promptSuffix); let promptBody = ''; const maxTokenCount = this.maxPromptTokens; @@ -224,7 +443,69 @@ class AnthropicClient extends BaseClient { return true; }; - await buildPromptBody(); + const messagesPayload = []; + const buildMessagesPayload = async () => { + let canContinue = true; + + if (promptPrefix) { + this.systemMessage = promptPrefix; + } + + while (currentTokenCount < maxTokenCount && groupedMessages.length > 0 && canContinue) { + const message = groupedMessages.pop(); + + let tokenCountForMessage = message.tokenCount ?? this.getTokenCountForMessage(message); + + const newTokenCount = currentTokenCount + tokenCountForMessage; + const exceededMaxCount = newTokenCount > maxTokenCount; + + if (exceededMaxCount && messagesPayload.length === 0) { + throw new Error( + `Prompt is too long. Max token count is ${maxTokenCount}, but prompt is ${newTokenCount} tokens long.`, + ); + } else if (exceededMaxCount) { + canContinue = false; + break; + } + + delete message.tokenCount; + messagesPayload.unshift(message); + currentTokenCount = newTokenCount; + + // Switch off isEdited after using it once + if (isEdited && message.role === 'assistant') { + isEdited = false; + } + + // Wait for next tick to avoid blocking the event loop + await new Promise((resolve) => setImmediate(resolve)); + } + }; + + const processTokens = () => { + // Add 2 tokens for metadata after all messages have been counted. + currentTokenCount += 2; + + // Use up to `this.maxContextTokens` tokens (prompt + response), but try to leave `this.maxTokens` tokens for the response. + this.modelOptions.maxOutputTokens = Math.min( + this.maxContextTokens - currentTokenCount, + this.maxResponseTokens, + ); + }; + + if (this.modelOptions.model.startsWith('claude-3')) { + await buildMessagesPayload(); + processTokens(); + return { + prompt: messagesPayload, + context: messagesInWindow, + promptTokens: currentTokenCount, + tokenCountMap, + }; + } else { + await buildPromptBody(); + processTokens(); + } if (nextMessage.remove) { promptBody = promptBody.replace(nextMessage.messageString, ''); @@ -234,22 +515,26 @@ class AnthropicClient extends BaseClient { let prompt = `${promptBody}${promptSuffix}`; - // Add 2 tokens for metadata after all messages have been counted. - currentTokenCount += 2; - - // Use up to `this.maxContextTokens` tokens (prompt + response), but try to leave `this.maxTokens` tokens for the response. - this.modelOptions.maxOutputTokens = Math.min( - this.maxContextTokens - currentTokenCount, - this.maxResponseTokens, - ); - - return { prompt, context }; + return { prompt, context, promptTokens: currentTokenCount, tokenCountMap }; } getCompletion() { logger.debug('AnthropicClient doesn\'t use getCompletion (all handled in sendCompletion)'); } + /** + * Creates a message or completion response using the Anthropic client. + * @param {Anthropic} client - The Anthropic client instance. + * @param {Anthropic.default.MessageCreateParams | Anthropic.default.CompletionCreateParams} options - The options for the message or completion. + * @param {boolean} useMessages - Whether to use messages or completions. Defaults to `this.useMessages`. + * @returns {Promise} The response from the Anthropic client. + */ + async createResponse(client, options, useMessages) { + return useMessages ?? this.useMessages + ? await client.messages.create(options) + : await client.completions.create(options); + } + async sendCompletion(payload, { onProgress, abortController }) { if (!abortController) { abortController = new AbortController(); @@ -279,36 +564,88 @@ class AnthropicClient extends BaseClient { topP: top_p, topK: top_k, } = this.modelOptions; + const requestOptions = { - prompt: payload, model, stream: stream || true, - max_tokens_to_sample: maxOutputTokens || 1500, stop_sequences, temperature, metadata, top_p, top_k, }; + + if (this.useMessages) { + requestOptions.messages = payload; + requestOptions.max_tokens = maxOutputTokens || 1500; + } else { + requestOptions.prompt = payload; + requestOptions.max_tokens_to_sample = maxOutputTokens || 1500; + } + + if (this.systemMessage) { + requestOptions.system = this.systemMessage; + } + logger.debug('[AnthropicClient]', { ...requestOptions }); - const response = await client.completions.create(requestOptions); - signal.addEventListener('abort', () => { - logger.debug('[AnthropicClient] message aborted!'); - response.controller.abort(); - }); + const handleChunk = (currentChunk) => { + if (currentChunk) { + text += currentChunk; + onProgress(currentChunk); + } + }; + + const maxRetries = 3; + async function processResponse() { + let attempts = 0; + + while (attempts < maxRetries) { + let response; + try { + response = await this.createResponse(client, requestOptions); + + signal.addEventListener('abort', () => { + logger.debug('[AnthropicClient] message aborted!'); + if (response.controller?.abort) { + response.controller.abort(); + } + }); + + for await (const completion of response) { + // Handle each completion as before + if (completion?.delta?.text) { + handleChunk(completion.delta.text); + } else if (completion.completion) { + handleChunk(completion.completion); + } + } - for await (const completion of response) { - // Uncomment to debug message stream - // logger.debug(completion); - text += completion.completion; - onProgress(completion.completion); + // Successful processing, exit loop + break; + } catch (error) { + attempts += 1; + logger.warn( + `User: ${this.user} | Anthropic Request ${attempts} failed: ${error.message}`, + ); + + if (attempts < maxRetries) { + await delayBeforeRetry(attempts, 350); + } else { + throw new Error(`Operation failed after ${maxRetries} attempts: ${error.message}`); + } + } finally { + signal.removeEventListener('abort', () => { + logger.debug('[AnthropicClient] message aborted!'); + if (response.controller?.abort) { + response.controller.abort(); + } + }); + } + } } - signal.removeEventListener('abort', () => { - logger.debug('[AnthropicClient] message aborted!'); - response.controller.abort(); - }); + await processResponse.bind(this)(); return text.trim(); } @@ -317,6 +654,7 @@ class AnthropicClient extends BaseClient { return { promptPrefix: this.options.promptPrefix, modelLabel: this.options.modelLabel, + resendFiles: this.options.resendFiles, ...this.modelOptions, }; } @@ -342,6 +680,78 @@ class AnthropicClient extends BaseClient { getTokenCount(text) { return this.gptEncoder.encode(text, 'all').length; } + + /** + * Generates a concise title for a conversation based on the user's input text and response. + * Involves sending a chat completion request with specific instructions for title generation. + * + * This function capitlizes on [Anthropic's function calling training](https://docs.anthropic.com/claude/docs/functions-external-tools). + * + * @param {Object} params - The parameters for the conversation title generation. + * @param {string} params.text - The user's input. + * @param {string} [params.responseText=''] - The AI's immediate response to the user. + * + * @returns {Promise} A promise that resolves to the generated conversation title. + * In case of failure, it will return the default title, "New Chat". + */ + async titleConvo({ text, responseText = '' }) { + let title = 'New Chat'; + const convo = ` + ${truncateText(text)} + + + ${JSON.stringify(truncateText(responseText))} + `; + + const { ANTHROPIC_TITLE_MODEL } = process.env ?? {}; + const model = this.options.titleModel ?? ANTHROPIC_TITLE_MODEL ?? 'claude-3-haiku-20240307'; + const system = titleFunctionPrompt; + + const titleChatCompletion = async () => { + const content = ` + ${convo} + + + Please generate a title for this conversation.`; + + const titleMessage = { role: 'user', content }; + const requestOptions = { + model, + temperature: 0.3, + max_tokens: 1024, + system, + stop_sequences: ['\n\nHuman:', '\n\nAssistant', ''], + messages: [titleMessage], + }; + + try { + const response = await this.createResponse(this.getClient(), requestOptions, true); + let promptTokens = response?.usage?.input_tokens; + let completionTokens = response?.usage?.output_tokens; + if (!promptTokens) { + promptTokens = this.getTokenCountForMessage(titleMessage); + promptTokens += this.getTokenCountForMessage({ role: 'system', content: system }); + } + if (!completionTokens) { + completionTokens = this.getTokenCountForMessage(response.content[0]); + } + await this.recordTokenUsage({ + model, + promptTokens, + completionTokens, + context: 'title', + }); + const text = response.content[0].text; + title = parseTitleFromPrompt(text); + } catch (e) { + logger.error('[AnthropicClient] There was an issue generating the title', e); + } + }; + + await titleChatCompletion(); + logger.debug('[AnthropicClient] Convo Title: ' + title); + return title; + } } module.exports = AnthropicClient; diff --git a/api/app/clients/BaseClient.js b/api/app/clients/BaseClient.js index aa39084b9fa..f7ed3b9cf18 100644 --- a/api/app/clients/BaseClient.js +++ b/api/app/clients/BaseClient.js @@ -1,8 +1,9 @@ const crypto = require('crypto'); -const { supportsBalanceCheck } = require('librechat-data-provider'); +const { supportsBalanceCheck, Constants } = require('librechat-data-provider'); const { getConvo, getMessages, saveMessage, updateMessage, saveConvo } = require('~/models'); const { addSpaceIfNeeded, isEnabled } = require('~/server/utils'); const checkBalance = require('~/models/checkBalance'); +const { getFiles } = require('~/models/File'); const TextStream = require('./TextStream'); const { logger } = require('~/config'); @@ -22,7 +23,7 @@ class BaseClient { throw new Error('Method \'setOptions\' must be implemented.'); } - getCompletion() { + async getCompletion() { throw new Error('Method \'getCompletion\' must be implemented.'); } @@ -46,10 +47,6 @@ class BaseClient { logger.debug('`[BaseClient] recordTokenUsage` not implemented.', response); } - async addPreviousAttachments(messages) { - return messages; - } - async recordTokenUsage({ promptTokens, completionTokens }) { logger.debug('`[BaseClient] recordTokenUsage` not implemented.', { promptTokens, @@ -77,7 +74,7 @@ class BaseClient { const saveOptions = this.getSaveOptions(); this.abortController = opts.abortController ?? new AbortController(); const conversationId = opts.conversationId ?? crypto.randomUUID(); - const parentMessageId = opts.parentMessageId ?? '00000000-0000-0000-0000-000000000000'; + const parentMessageId = opts.parentMessageId ?? Constants.NO_PARENT; const userMessageId = opts.overrideParentMessageId ?? crypto.randomUUID(); let responseMessageId = opts.responseMessageId ?? crypto.randomUUID(); let head = isEdited ? responseMessageId : parentMessageId; @@ -428,7 +425,10 @@ class BaseClient { await this.saveMessageToDatabase(userMessage, saveOptions, user); } - if (isEnabled(process.env.CHECK_BALANCE) && supportsBalanceCheck[this.options.endpoint]) { + if ( + isEnabled(process.env.CHECK_BALANCE) && + supportsBalanceCheck[this.options.endpointType ?? this.options.endpoint] + ) { await checkBalance({ req: this.options.req, res: this.options.res, @@ -438,11 +438,14 @@ class BaseClient { amount: promptTokens, model: this.modelOptions.model, endpoint: this.options.endpoint, + endpointTokenConfig: this.options.endpointTokenConfig, }, }); } const completion = await this.sendCompletion(payload, opts); + this.abortController.requestCompleted = true; + const responseMessage = { messageId: responseMessageId, conversationId, @@ -453,6 +456,7 @@ class BaseClient { sender: this.sender, text: addSpaceIfNeeded(generation) + completion, promptTokens, + ...(this.metadata ?? {}), }; if ( @@ -548,7 +552,7 @@ class BaseClient { * * Each message object should have an 'id' or 'messageId' property and may have a 'parentMessageId' property. * The 'parentMessageId' is the ID of the message that the current message is a reply to. - * If 'parentMessageId' is not present, null, or is '00000000-0000-0000-0000-000000000000', + * If 'parentMessageId' is not present, null, or is Constants.NO_PARENT, * the message is considered a root message. * * @param {Object} options - The options for the function. @@ -603,9 +607,7 @@ class BaseClient { } currentMessageId = - message.parentMessageId === '00000000-0000-0000-0000-000000000000' - ? null - : message.parentMessageId; + message.parentMessageId === Constants.NO_PARENT ? null : message.parentMessageId; } orderedMessages.reverse(); @@ -679,6 +681,54 @@ class BaseClient { return await this.sendCompletion(payload, opts); } + + /** + * + * @param {TMessage[]} _messages + * @returns {Promise} + */ + async addPreviousAttachments(_messages) { + if (!this.options.resendFiles) { + return _messages; + } + + /** + * + * @param {TMessage} message + */ + const processMessage = async (message) => { + if (!this.message_file_map) { + /** @type {Record */ + this.message_file_map = {}; + } + + const fileIds = message.files.map((file) => file.file_id); + const files = await getFiles({ + file_id: { $in: fileIds }, + }); + + await this.addImageURLs(message, files); + + this.message_file_map[message.messageId] = files; + return message; + }; + + const promises = []; + + for (const message of _messages) { + if (!message.files) { + promises.push(message); + continue; + } + + promises.push(processMessage(message)); + } + + const messages = await Promise.all(promises); + + this.checkVisionRequest(Object.values(this.message_file_map ?? {}).flat()); + return messages; + } } module.exports = BaseClient; diff --git a/api/app/clients/ChatGPTClient.js b/api/app/clients/ChatGPTClient.js index c1ae54fdf08..d218849513a 100644 --- a/api/app/clients/ChatGPTClient.js +++ b/api/app/clients/ChatGPTClient.js @@ -1,9 +1,19 @@ -const crypto = require('crypto'); const Keyv = require('keyv'); +const crypto = require('crypto'); +const { + EModelEndpoint, + resolveHeaders, + CohereConstants, + mapModelToAzureConfig, +} = require('librechat-data-provider'); +const { CohereClient } = require('cohere-ai'); const { encoding_for_model: encodingForModel, get_encoding: getEncoding } = require('tiktoken'); const { fetchEventSource } = require('@waylaidwanderer/fetch-event-source'); +const { createCoherePayload } = require('./llm'); const { Agent, ProxyAgent } = require('undici'); const BaseClient = require('./BaseClient'); +const { logger } = require('~/config'); +const { extractBaseURL, constructAzureURL, genAzureChatCompletion } = require('~/utils'); const CHATGPT_MODEL = 'gpt-3.5-turbo'; const tokenizersCache = {}; @@ -140,11 +150,13 @@ class ChatGPTClient extends BaseClient { return tokenizer; } - async getCompletion(input, onProgress, abortController = null) { + /** @type {getCompletion} */ + async getCompletion(input, onProgress, onTokenProgress, abortController = null) { if (!abortController) { abortController = new AbortController(); } - const modelOptions = { ...this.modelOptions }; + + let modelOptions = { ...this.modelOptions }; if (typeof onProgress === 'function') { modelOptions.stream = true; } @@ -159,56 +171,176 @@ class ChatGPTClient extends BaseClient { } const { debug } = this.options; - const url = this.completionsUrl; + let baseURL = this.completionsUrl; if (debug) { console.debug(); - console.debug(url); + console.debug(baseURL); console.debug(modelOptions); console.debug(); } - if (this.azure || this.options.azure) { - // Azure does not accept `model` in the body, so we need to remove it. - delete modelOptions.model; - } - const opts = { method: 'POST', headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify(modelOptions), dispatcher: new Agent({ bodyTimeout: 0, headersTimeout: 0, }), }; - if (this.apiKey && this.options.azure) { - opts.headers['api-key'] = this.apiKey; + if (this.isVisionModel) { + modelOptions.max_tokens = 4000; + } + + /** @type {TAzureConfig | undefined} */ + const azureConfig = this.options?.req?.app?.locals?.[EModelEndpoint.azureOpenAI]; + + const isAzure = this.azure || this.options.azure; + if ( + (isAzure && this.isVisionModel && azureConfig) || + (azureConfig && this.isVisionModel && this.options.endpoint === EModelEndpoint.azureOpenAI) + ) { + const { modelGroupMap, groupMap } = azureConfig; + const { + azureOptions, + baseURL, + headers = {}, + serverless, + } = mapModelToAzureConfig({ + modelName: modelOptions.model, + modelGroupMap, + groupMap, + }); + opts.headers = resolveHeaders(headers); + this.langchainProxy = extractBaseURL(baseURL); + this.apiKey = azureOptions.azureOpenAIApiKey; + + const groupName = modelGroupMap[modelOptions.model].group; + this.options.addParams = azureConfig.groupMap[groupName].addParams; + this.options.dropParams = azureConfig.groupMap[groupName].dropParams; + // Note: `forcePrompt` not re-assigned as only chat models are vision models + + this.azure = !serverless && azureOptions; + this.azureEndpoint = + !serverless && genAzureChatCompletion(this.azure, modelOptions.model, this); + } + + if (this.options.headers) { + opts.headers = { ...opts.headers, ...this.options.headers }; + } + + if (isAzure) { + // Azure does not accept `model` in the body, so we need to remove it. + delete modelOptions.model; + + baseURL = this.langchainProxy + ? constructAzureURL({ + baseURL: this.langchainProxy, + azureOptions: this.azure, + }) + : this.azureEndpoint.split(/(? msg.role === 'system'); + + if (systemMessageIndex > 0) { + const [systemMessage] = messages.splice(systemMessageIndex, 1); + messages.unshift(systemMessage); + } + + modelOptions.messages = messages; + + if (messages.length === 1 && messages[0].role === 'system') { + modelOptions.messages[0].role = 'user'; + } + } + + if (this.options.addParams && typeof this.options.addParams === 'object') { + modelOptions = { + ...modelOptions, + ...this.options.addParams, + }; + logger.debug('[ChatGPTClient] chatCompletion: added params', { + addParams: this.options.addParams, + modelOptions, + }); + } + + if (this.options.dropParams && Array.isArray(this.options.dropParams)) { + this.options.dropParams.forEach((param) => { + delete modelOptions[param]; + }); + logger.debug('[ChatGPTClient] chatCompletion: dropped params', { + dropParams: this.options.dropParams, + modelOptions, + }); + } + + if (baseURL.startsWith(CohereConstants.API_URL)) { + const payload = createCoherePayload({ modelOptions }); + return await this.cohereChatCompletion({ payload, onTokenProgress }); + } + + if (baseURL.includes('v1') && !baseURL.includes('/completions') && !this.isChatCompletion) { + baseURL = baseURL.split('v1')[0] + 'v1/completions'; + } else if ( + baseURL.includes('v1') && + !baseURL.includes('/chat/completions') && + this.isChatCompletion + ) { + baseURL = baseURL.split('v1')[0] + 'v1/chat/completions'; + } + + const BASE_URL = new URL(baseURL); + if (opts.defaultQuery) { + Object.entries(opts.defaultQuery).forEach(([key, value]) => { + BASE_URL.searchParams.append(key, value); + }); + delete opts.defaultQuery; + } + + const completionsURL = BASE_URL.toString(); + opts.body = JSON.stringify(modelOptions); + if (modelOptions.stream) { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { try { let done = false; - await fetchEventSource(url, { + await fetchEventSource(completionsURL, { ...opts, signal: abortController.signal, async onopen(response) { @@ -236,7 +368,6 @@ class ChatGPTClient extends BaseClient { // workaround for private API not sending [DONE] event if (!done) { onProgress('[DONE]'); - abortController.abort(); resolve(); } }, @@ -249,14 +380,13 @@ class ChatGPTClient extends BaseClient { }, onmessage(message) { if (debug) { - // console.debug(message); + console.debug(message); } if (!message.data || message.event === 'ping') { return; } if (message.data === '[DONE]') { onProgress('[DONE]'); - abortController.abort(); resolve(); done = true; return; @@ -269,7 +399,7 @@ class ChatGPTClient extends BaseClient { } }); } - const response = await fetch(url, { + const response = await fetch(completionsURL, { ...opts, signal: abortController.signal, }); @@ -287,6 +417,35 @@ class ChatGPTClient extends BaseClient { return response.json(); } + /** @type {cohereChatCompletion} */ + async cohereChatCompletion({ payload, onTokenProgress }) { + const cohere = new CohereClient({ + token: this.apiKey, + environment: this.completionsUrl, + }); + + if (!payload.stream) { + const chatResponse = await cohere.chat(payload); + return chatResponse.text; + } + + const chatStream = await cohere.chatStream(payload); + let reply = ''; + for await (const message of chatStream) { + if (!message) { + continue; + } + + if (message.eventType === 'text-generation' && message.text) { + onTokenProgress(message.text); + } else if (message.eventType === 'stream-end' && message.response) { + reply = message.response.text; + } + } + + return reply; + } + async generateTitle(userMessage, botMessage) { const instructionsPayload = { role: 'system', diff --git a/api/app/clients/GoogleClient.js b/api/app/clients/GoogleClient.js index 950cc8d1116..c5edcb275a8 100644 --- a/api/app/clients/GoogleClient.js +++ b/api/app/clients/GoogleClient.js @@ -4,16 +4,17 @@ const { GoogleVertexAI } = require('langchain/llms/googlevertexai'); const { ChatGoogleGenerativeAI } = require('@langchain/google-genai'); const { ChatGoogleVertexAI } = require('langchain/chat_models/googlevertexai'); const { AIMessage, HumanMessage, SystemMessage } = require('langchain/schema'); -const { encodeAndFormat, validateVisionModel } = require('~/server/services/Files/images'); const { encoding_for_model: encodingForModel, get_encoding: getEncoding } = require('tiktoken'); const { + validateVisionModel, getResponseSender, - EModelEndpoint, endpointSettings, + EModelEndpoint, AuthKeys, } = require('librechat-data-provider'); +const { encodeAndFormat } = require('~/server/services/Files/images'); +const { formatMessage, createContextHandlers } = require('./prompts'); const { getModelMaxTokens } = require('~/utils'); -const { formatMessage } = require('./prompts'); const BaseClient = require('./BaseClient'); const { logger } = require('~/config'); @@ -123,18 +124,11 @@ class GoogleClient extends BaseClient { // stop: modelOptions.stop // no stop method for now }; - if (this.options.attachments) { - this.modelOptions.model = 'gemini-pro-vision'; - } + this.options.attachments?.then((attachments) => this.checkVisionRequest(attachments)); // TODO: as of 12/14/23, only gemini models are "Generative AI" models provided by Google this.isGenerativeModel = this.modelOptions.model.includes('gemini'); - this.isVisionModel = validateVisionModel(this.modelOptions.model); const { isGenerativeModel } = this; - if (this.isVisionModel && !this.options.attachments) { - this.modelOptions.model = 'gemini-pro'; - this.isVisionModel = false; - } this.isChatModel = !isGenerativeModel && this.modelOptions.model.includes('chat'); const { isChatModel } = this; this.isTextModel = @@ -219,6 +213,33 @@ class GoogleClient extends BaseClient { return this; } + /** + * + * Checks if the model is a vision model based on request attachments and sets the appropriate options: + * @param {MongoFile[]} attachments + */ + checkVisionRequest(attachments) { + /* Validation vision request */ + this.defaultVisionModel = this.options.visionModel ?? 'gemini-pro-vision'; + const availableModels = this.options.modelsConfig?.[EModelEndpoint.google]; + this.isVisionModel = validateVisionModel({ model: this.modelOptions.model, availableModels }); + + if ( + attachments && + attachments.some((file) => file?.type && file?.type?.includes('image')) && + availableModels?.includes(this.defaultVisionModel) && + !this.isVisionModel + ) { + this.modelOptions.model = this.defaultVisionModel; + this.isVisionModel = true; + } + + if (this.isVisionModel && !attachments) { + this.modelOptions.model = 'gemini-pro'; + this.isVisionModel = false; + } + } + formatMessages() { return ((message) => ({ author: message?.author ?? (message.isCreatedByUser ? this.userLabel : this.modelLabel), @@ -226,18 +247,45 @@ class GoogleClient extends BaseClient { })).bind(this); } - async buildVisionMessages(messages = [], parentMessageId) { - const { prompt } = await this.buildMessagesPrompt(messages, parentMessageId); - const attachments = await this.options.attachments; + /** + * + * Adds image URLs to the message object and returns the files + * + * @param {TMessage[]} messages + * @param {MongoFile[]} files + * @returns {Promise} + */ + async addImageURLs(message, attachments) { const { files, image_urls } = await encodeAndFormat( this.options.req, - attachments.filter((file) => file.type.includes('image')), + attachments, EModelEndpoint.google, ); + message.image_urls = image_urls.length ? image_urls : undefined; + return files; + } + async buildVisionMessages(messages = [], parentMessageId) { + const attachments = await this.options.attachments; const latestMessage = { ...messages[messages.length - 1] }; + this.contextHandlers = createContextHandlers(this.options.req, latestMessage.text); + + if (this.contextHandlers) { + for (const file of attachments) { + if (file.embedded) { + this.contextHandlers?.processFile(file); + continue; + } + } + + this.augmentedPrompt = await this.contextHandlers.createContext(); + this.options.promptPrefix = this.augmentedPrompt + this.options.promptPrefix; + } + + const { prompt } = await this.buildMessagesPrompt(messages, parentMessageId); + + const files = await this.addImageURLs(latestMessage, attachments); - latestMessage.image_urls = image_urls; this.options.attachments = files; latestMessage.text = prompt; @@ -264,7 +312,7 @@ class GoogleClient extends BaseClient { ); } - if (this.options.attachments) { + if (this.options.attachments && this.isGenerativeModel) { return this.buildVisionMessages(messages, parentMessageId); } diff --git a/api/app/clients/OpenAIClient.js b/api/app/clients/OpenAIClient.js index ca0c8d84248..f66afda4abd 100644 --- a/api/app/clients/OpenAIClient.js +++ b/api/app/clients/OpenAIClient.js @@ -1,21 +1,35 @@ const OpenAI = require('openai'); const { HttpsProxyAgent } = require('https-proxy-agent'); -const { getResponseSender, ImageDetailCost, ImageDetail } = require('librechat-data-provider'); +const { + ImageDetail, + EModelEndpoint, + resolveHeaders, + ImageDetailCost, + CohereConstants, + getResponseSender, + validateVisionModel, + mapModelToAzureConfig, +} = require('librechat-data-provider'); const { encoding_for_model: encodingForModel, get_encoding: getEncoding } = require('tiktoken'); const { - getModelMaxTokens, - genAzureChatCompletion, extractBaseURL, constructAzureURL, + getModelMaxTokens, + genAzureChatCompletion, } = require('~/utils'); -const { encodeAndFormat, validateVisionModel } = require('~/server/services/Files/images'); -const { truncateText, formatMessage, CUT_OFF_PROMPT } = require('./prompts'); +const { + truncateText, + formatMessage, + createContextHandlers, + CUT_OFF_PROMPT, + titleInstruction, +} = require('./prompts'); +const { encodeAndFormat } = require('~/server/services/Files/images/encode'); const { handleOpenAIErrors } = require('./tools/util'); const spendTokens = require('~/models/spendTokens'); const { createLLM, RunManager } = require('./llm'); const ChatGPTClient = require('./ChatGPTClient'); const { isEnabled } = require('~/server/utils'); -const { getFiles } = require('~/models/File'); const { summaryBuffer } = require('./memory'); const { runTitleChain } = require('./chains'); const { tokenSplit } = require('./document'); @@ -32,7 +46,10 @@ class OpenAIClient extends BaseClient { super(apiKey, options); this.ChatGPTClient = new ChatGPTClient(); this.buildPrompt = this.ChatGPTClient.buildPrompt.bind(this); + /** @type {getCompletion} */ this.getCompletion = this.ChatGPTClient.getCompletion.bind(this); + /** @type {cohereChatCompletion} */ + this.cohereChatCompletion = this.ChatGPTClient.cohereChatCompletion.bind(this); this.contextStrategy = options.contextStrategy ? options.contextStrategy.toLowerCase() : 'discard'; @@ -40,6 +57,10 @@ class OpenAIClient extends BaseClient { /** @type {AzureOptions} */ this.azure = options.azure || false; this.setOptions(options); + this.metadata = {}; + + /** @type {string | undefined} - The API Completions URL */ + this.completionsUrl; } // TODO: PluginsClient calls this 3x, unneeded @@ -83,7 +104,12 @@ class OpenAIClient extends BaseClient { }; } - this.checkVisionRequest(this.options.attachments); + this.defaultVisionModel = this.options.visionModel ?? 'gpt-4-vision-preview'; + if (typeof this.options.attachments?.then === 'function') { + this.options.attachments.then((attachments) => this.checkVisionRequest(attachments)); + } else { + this.checkVisionRequest(this.options.attachments); + } const { OPENROUTER_API_KEY, OPENAI_FORCE_PROMPT } = process.env ?? {}; if (OPENROUTER_API_KEY && !this.azure) { @@ -131,7 +157,13 @@ class OpenAIClient extends BaseClient { const { isChatGptModel } = this; this.isUnofficialChatGptModel = model.startsWith('text-chat') || model.startsWith('text-davinci-002-render'); - this.maxContextTokens = getModelMaxTokens(model) ?? 4095; // 1 less than maximum + + this.maxContextTokens = + getModelMaxTokens( + model, + this.options.endpointType ?? this.options.endpoint, + this.options.endpointTokenConfig, + ) ?? 4095; // 1 less than maximum if (this.shouldSummarize) { this.maxContextTokens = Math.floor(this.maxContextTokens / 2); @@ -208,13 +240,20 @@ class OpenAIClient extends BaseClient { * - Sets `this.modelOptions.model` to `gpt-4-vision-preview` if the request is a vision request. * - Sets `this.isVisionModel` to `true` if vision request. * - Deletes `this.modelOptions.stop` if vision request. - * @param {Array | MongoFile[]> | Record} attachments + * @param {MongoFile[]} attachments */ checkVisionRequest(attachments) { - this.isVisionModel = validateVisionModel(this.modelOptions.model); + const availableModels = this.options.modelsConfig?.[this.options.endpoint]; + this.isVisionModel = validateVisionModel({ model: this.modelOptions.model, availableModels }); - if (attachments && !this.isVisionModel) { - this.modelOptions.model = 'gpt-4-vision-preview'; + const visionModelAvailable = availableModels?.includes(this.defaultVisionModel); + if ( + attachments && + attachments.some((file) => file?.type && file?.type?.includes('image')) && + visionModelAvailable && + !this.isVisionModel + ) { + this.modelOptions.model = this.defaultVisionModel; this.isVisionModel = true; } @@ -349,7 +388,7 @@ class OpenAIClient extends BaseClient { return { chatGptLabel: this.options.chatGptLabel, promptPrefix: this.options.promptPrefix, - resendImages: this.options.resendImages, + resendFiles: this.options.resendFiles, imageDetail: this.options.imageDetail, ...this.modelOptions, }; @@ -363,54 +402,6 @@ class OpenAIClient extends BaseClient { }; } - /** - * - * @param {TMessage[]} _messages - * @returns {TMessage[]} - */ - async addPreviousAttachments(_messages) { - if (!this.options.resendImages) { - return _messages; - } - - /** - * - * @param {TMessage} message - */ - const processMessage = async (message) => { - if (!this.message_file_map) { - /** @type {Record */ - this.message_file_map = {}; - } - - const fileIds = message.files.map((file) => file.file_id); - const files = await getFiles({ - file_id: { $in: fileIds }, - }); - - await this.addImageURLs(message, files); - - this.message_file_map[message.messageId] = files; - return message; - }; - - const promises = []; - - for (const message of _messages) { - if (!message.files) { - promises.push(message); - continue; - } - - promises.push(processMessage(message)); - } - - const messages = await Promise.all(promises); - - this.checkVisionRequest(this.message_file_map); - return messages; - } - /** * * Adds image URLs to the message object and returns the files @@ -421,8 +412,7 @@ class OpenAIClient extends BaseClient { */ async addImageURLs(message, attachments) { const { files, image_urls } = await encodeAndFormat(this.options.req, attachments); - - message.image_urls = image_urls; + message.image_urls = image_urls.length ? image_urls : undefined; return files; } @@ -450,23 +440,9 @@ class OpenAIClient extends BaseClient { let promptTokens; promptPrefix = (promptPrefix || this.options.promptPrefix || '').trim(); - if (promptPrefix) { - promptPrefix = `Instructions:\n${promptPrefix}`; - instructions = { - role: 'system', - name: 'instructions', - content: promptPrefix, - }; - - if (this.contextStrategy) { - instructions.tokenCount = this.getTokenCountForMessage(instructions); - } - } if (this.options.attachments) { - const attachments = (await this.options.attachments).filter((file) => - file.type.includes('image'), - ); + const attachments = await this.options.attachments; if (this.message_file_map) { this.message_file_map[orderedMessages[orderedMessages.length - 1].messageId] = attachments; @@ -484,6 +460,13 @@ class OpenAIClient extends BaseClient { this.options.attachments = files; } + if (this.message_file_map) { + this.contextHandlers = createContextHandlers( + this.options.req, + orderedMessages[orderedMessages.length - 1].text, + ); + } + const formattedMessages = orderedMessages.map((message, i) => { const formattedMessage = formatMessage({ message, @@ -502,6 +485,11 @@ class OpenAIClient extends BaseClient { if (this.message_file_map && this.message_file_map[message.messageId]) { const attachments = this.message_file_map[message.messageId]; for (const file of attachments) { + if (file.embedded) { + this.contextHandlers?.processFile(file); + continue; + } + orderedMessages[i].tokenCount += this.calculateImageTokenCost({ width: file.width, height: file.height, @@ -513,6 +501,24 @@ class OpenAIClient extends BaseClient { return formattedMessage; }); + if (this.contextHandlers) { + this.augmentedPrompt = await this.contextHandlers.createContext(); + promptPrefix = this.augmentedPrompt + promptPrefix; + } + + if (promptPrefix) { + promptPrefix = `Instructions:\n${promptPrefix.trim()}`; + instructions = { + role: 'system', + name: 'instructions', + content: promptPrefix, + }; + + if (this.contextStrategy) { + instructions.tokenCount = this.getTokenCountForMessage(instructions); + } + } + // TODO: need to handle interleaving instructions better if (this.contextStrategy) { ({ payload, tokenCountMap, promptTokens, messages } = await this.handleContextStrategy({ @@ -540,15 +546,16 @@ class OpenAIClient extends BaseClient { return result; } + /** @type {sendCompletion} */ async sendCompletion(payload, opts = {}) { let reply = ''; let result = null; let streamResult = null; this.modelOptions.user = this.user; const invalidBaseUrl = this.completionsUrl && extractBaseURL(this.completionsUrl) === null; - const useOldMethod = !!(invalidBaseUrl || !this.isChatCompletion); + const useOldMethod = !!(invalidBaseUrl || !this.isChatCompletion || typeof Bun !== 'undefined'); if (typeof opts.onProgress === 'function' && useOldMethod) { - await this.getCompletion( + const completionResult = await this.getCompletion( payload, (progressMessage) => { if (progressMessage === '[DONE]') { @@ -581,12 +588,16 @@ class OpenAIClient extends BaseClient { opts.onProgress(token); reply += token; }, + opts.onProgress, opts.abortController || new AbortController(), ); + + if (completionResult && typeof completionResult === 'string') { + reply = completionResult; + } } else if (typeof opts.onProgress === 'function' || this.options.useChatCompletion) { reply = await this.chatCompletion({ payload, - clientOptions: opts, onProgress: opts.onProgress, abortController: opts.abortController, }); @@ -594,9 +605,14 @@ class OpenAIClient extends BaseClient { result = await this.getCompletion( payload, null, + opts.onProgress, opts.abortController || new AbortController(), ); + if (result && typeof result === 'string') { + return result.trim(); + } + logger.debug('[OpenAIClient] sendCompletion: result', result); if (this.isChatCompletion) { @@ -606,11 +622,11 @@ class OpenAIClient extends BaseClient { } } - if (streamResult && typeof opts.addMetadata === 'function') { + if (streamResult) { const { finish_reason } = streamResult.choices[0]; - opts.addMetadata({ finish_reason }); + this.metadata = { finish_reason }; } - return reply.trim(); + return (reply ?? '').trim(); } initializeLLM({ @@ -624,6 +640,7 @@ class OpenAIClient extends BaseClient { context, tokenBuffer, initialMessageCount, + conversationId, }) { const modelOptions = { modelName: modelName ?? model, @@ -653,6 +670,16 @@ class OpenAIClient extends BaseClient { }; } + const { headers } = this.options; + if (headers && typeof headers === 'object' && !Array.isArray(headers)) { + configOptions.baseOptions = { + headers: resolveHeaders({ + ...headers, + ...configOptions?.baseOptions?.headers, + }), + }; + } + if (this.options.proxy) { configOptions.httpAgent = new HttpsProxyAgent(this.options.proxy); configOptions.httpsAgent = new HttpsProxyAgent(this.options.proxy); @@ -671,7 +698,7 @@ class OpenAIClient extends BaseClient { callbacks: runManager.createCallbacks({ context, tokenBuffer, - conversationId: this.conversationId, + conversationId: this.conversationId ?? conversationId, initialMessageCount, }), }); @@ -687,12 +714,13 @@ class OpenAIClient extends BaseClient { * * @param {Object} params - The parameters for the conversation title generation. * @param {string} params.text - The user's input. + * @param {string} [params.conversationId] - The current conversationId, if not already defined on client initialization. * @param {string} [params.responseText=''] - The AI's immediate response to the user. * * @returns {Promise} A promise that resolves to the generated conversation title. * In case of failure, it will return the default title, "New Chat". */ - async titleConvo({ text, responseText = '' }) { + async titleConvo({ text, conversationId, responseText = '' }) { let title = 'New Chat'; const convo = `||>User: "${truncateText(text)}" @@ -712,6 +740,39 @@ class OpenAIClient extends BaseClient { max_tokens: 16, }; + /** @type {TAzureConfig | undefined} */ + const azureConfig = this.options?.req?.app?.locals?.[EModelEndpoint.azureOpenAI]; + + const resetTitleOptions = !!( + (this.azure && azureConfig) || + (azureConfig && this.options.endpoint === EModelEndpoint.azureOpenAI) + ); + + if (resetTitleOptions) { + const { modelGroupMap, groupMap } = azureConfig; + const { + azureOptions, + baseURL, + headers = {}, + serverless, + } = mapModelToAzureConfig({ + modelName: modelOptions.model, + modelGroupMap, + groupMap, + }); + + this.options.headers = resolveHeaders(headers); + this.options.reverseProxyUrl = baseURL ?? null; + this.langchainProxy = extractBaseURL(this.options.reverseProxyUrl); + this.apiKey = azureOptions.azureOpenAIApiKey; + + const groupName = modelGroupMap[modelOptions.model].group; + this.options.addParams = azureConfig.groupMap[groupName].addParams; + this.options.dropParams = azureConfig.groupMap[groupName].dropParams; + this.options.forcePrompt = azureConfig.groupMap[groupName].forcePrompt; + this.azure = !serverless && azureOptions; + } + const titleChatCompletion = async () => { modelOptions.model = model; @@ -723,8 +784,7 @@ class OpenAIClient extends BaseClient { const instructionsPayload = [ { role: 'system', - content: `Detect user language and write in the same language an extremely concise title for this conversation, which you must accurately detect. -Write in the detected language. Title in 5 Words or Less. No Punctuation or Quotation. Do not mention the language. All first letters of every word should be capitalized and write the title in User Language only. + content: `Please generate ${titleInstruction} ${convo} @@ -732,10 +792,18 @@ ${convo} }, ]; + const promptTokens = this.getTokenCountForMessage(instructionsPayload[0]); + try { + let useChatCompletion = true; + if (this.options.reverseProxyUrl === CohereConstants.API_URL) { + useChatCompletion = false; + } title = ( - await this.sendPayload(instructionsPayload, { modelOptions, useChatCompletion: true }) + await this.sendPayload(instructionsPayload, { modelOptions, useChatCompletion }) ).replaceAll('"', ''); + const completionTokens = this.getTokenCount(title); + this.recordTokenUsage({ promptTokens, completionTokens, context: 'title' }); } catch (e) { logger.error( '[OpenAIClient] There was an issue generating the title with the completion method', @@ -752,7 +820,12 @@ ${convo} try { this.abortController = new AbortController(); - const llm = this.initializeLLM({ ...modelOptions, context: 'title', tokenBuffer: 150 }); + const llm = this.initializeLLM({ + ...modelOptions, + conversationId, + context: 'title', + tokenBuffer: 150, + }); title = await runTitleChain({ llm, text, convo, signal: this.abortController.signal }); } catch (e) { if (e?.message?.toLowerCase()?.includes('abort')) { @@ -779,7 +852,12 @@ ${convo} // TODO: remove the gpt fallback and make it specific to endpoint const { OPENAI_SUMMARY_MODEL = 'gpt-3.5-turbo' } = process.env ?? {}; const model = this.options.summaryModel ?? OPENAI_SUMMARY_MODEL; - const maxContextTokens = getModelMaxTokens(model) ?? 4095; + const maxContextTokens = + getModelMaxTokens( + model, + this.options.endpointType ?? this.options.endpoint, + this.options.endpointTokenConfig, + ) ?? 4095; // 1 less than maximum // 3 tokens for the assistant label, and 98 for the summarizer prompt (101) let promptBuffer = 101; @@ -877,14 +955,14 @@ ${convo} } } - async recordTokenUsage({ promptTokens, completionTokens }) { - logger.debug('[OpenAIClient] recordTokenUsage:', { promptTokens, completionTokens }); + async recordTokenUsage({ promptTokens, completionTokens, context = 'message' }) { await spendTokens( { + context, user: this.user, model: this.modelOptions.model, - context: 'message', conversationId: this.conversationId, + endpointTokenConfig: this.options.endpointTokenConfig, }, { promptTokens, completionTokens }, ); @@ -897,7 +975,7 @@ ${convo} }); } - async chatCompletion({ payload, onProgress, clientOptions, abortController = null }) { + async chatCompletion({ payload, onProgress, abortController = null }) { let error = null; const errorCallback = (err) => (error = err); let intermediateReply = ''; @@ -918,15 +996,6 @@ ${convo} } const baseURL = extractBaseURL(this.completionsUrl); - // let { messages: _msgsToLog, ...modelOptionsToLog } = modelOptions; - // if (modelOptionsToLog.messages) { - // _msgsToLog = modelOptionsToLog.messages.map((msg) => { - // let { content, ...rest } = msg; - - // if (content) - // return { ...rest, content: truncateText(content) }; - // }); - // } logger.debug('[OpenAIClient] chatCompletion', { baseURL, modelOptions }); const opts = { baseURL, @@ -951,6 +1020,38 @@ ${convo} modelOptions.max_tokens = 4000; } + /** @type {TAzureConfig | undefined} */ + const azureConfig = this.options?.req?.app?.locals?.[EModelEndpoint.azureOpenAI]; + + if ( + (this.azure && this.isVisionModel && azureConfig) || + (azureConfig && this.isVisionModel && this.options.endpoint === EModelEndpoint.azureOpenAI) + ) { + const { modelGroupMap, groupMap } = azureConfig; + const { + azureOptions, + baseURL, + headers = {}, + serverless, + } = mapModelToAzureConfig({ + modelName: modelOptions.model, + modelGroupMap, + groupMap, + }); + opts.defaultHeaders = resolveHeaders(headers); + this.langchainProxy = extractBaseURL(baseURL); + this.apiKey = azureOptions.azureOpenAIApiKey; + + const groupName = modelGroupMap[modelOptions.model].group; + this.options.addParams = azureConfig.groupMap[groupName].addParams; + this.options.dropParams = azureConfig.groupMap[groupName].dropParams; + // Note: `forcePrompt` not re-assigned as only chat models are vision models + + this.azure = !serverless && azureOptions; + this.azureEndpoint = + !serverless && genAzureChatCompletion(this.azure, modelOptions.model, this); + } + if (this.azure || this.options.azure) { // Azure does not accept `model` in the body, so we need to remove it. delete modelOptions.model; @@ -958,9 +1059,10 @@ ${convo} opts.baseURL = this.langchainProxy ? constructAzureURL({ baseURL: this.langchainProxy, - azure: this.azure, + azureOptions: this.azure, }) - : this.azureEndpoint.split(/\/(chat|completion)/)[0]; + : this.azureEndpoint.split(/(? msg.role === 'system'); + + if (systemMessageIndex > 0) { + const [systemMessage] = messages.splice(systemMessageIndex, 1); + messages.unshift(systemMessage); + } + + modelOptions.messages = messages; + if (messages.length === 1 && messages[0].role === 'system') { modelOptions.messages[0].role = 'user'; } @@ -988,12 +1104,20 @@ ${convo} ...modelOptions, ...this.options.addParams, }; + logger.debug('[OpenAIClient] chatCompletion: added params', { + addParams: this.options.addParams, + modelOptions, + }); } if (this.options.dropParams && Array.isArray(this.options.dropParams)) { this.options.dropParams.forEach((param) => { delete modelOptions[param]; }); + logger.debug('[OpenAIClient] chatCompletion: dropped params', { + dropParams: this.options.dropParams, + modelOptions, + }); } let UnexpectedRoleError = false; @@ -1009,6 +1133,16 @@ ${convo} .on('error', (err) => { handleOpenAIErrors(err, errorCallback, 'stream'); }) + .on('finalChatCompletion', (finalChatCompletion) => { + const finalMessage = finalChatCompletion?.choices?.[0]?.message; + if (finalMessage && finalMessage?.role !== 'assistant') { + finalChatCompletion.choices[0].message.role = 'assistant'; + } + + if (finalMessage && !finalMessage?.content?.trim()) { + finalChatCompletion.choices[0].message.content = intermediateReply; + } + }) .on('finalMessage', (message) => { if (message?.role !== 'assistant') { stream.messages.push({ role: 'assistant', content: intermediateReply }); @@ -1054,12 +1188,20 @@ ${convo} } const { message, finish_reason } = chatCompletion.choices[0]; - if (chatCompletion && typeof clientOptions.addMetadata === 'function') { - clientOptions.addMetadata({ finish_reason }); + if (chatCompletion) { + this.metadata = { finish_reason }; } logger.debug('[OpenAIClient] chatCompletion response', chatCompletion); + if (!message?.content?.trim() && intermediateReply.length) { + logger.debug( + '[OpenAIClient] chatCompletion: using intermediateReply due to empty message.content', + { intermediateReply }, + ); + return intermediateReply; + } + return message.content; } catch (err) { if ( @@ -1072,6 +1214,9 @@ ${convo} err?.message?.includes( 'OpenAI error: Invalid final message: OpenAI expects final message to include role=assistant', ) || + err?.message?.includes( + 'stream ended without producing a ChatCompletionMessage with role=assistant', + ) || err?.message?.includes('The server had an error processing your request') || err?.message?.includes('missing finish_reason') || err?.message?.includes('missing role') || diff --git a/api/app/clients/PluginsClient.js b/api/app/clients/PluginsClient.js index 6118c3547a1..033c122664f 100644 --- a/api/app/clients/PluginsClient.js +++ b/api/app/clients/PluginsClient.js @@ -3,6 +3,7 @@ const { CallbackManager } = require('langchain/callbacks'); const { BufferMemory, ChatMessageHistory } = require('langchain/memory'); const { initializeCustomAgent, initializeFunctionsAgent } = require('./agents'); const { addImages, buildErrorInput, buildPromptPrefix } = require('./output_parsers'); +const { processFileURL } = require('~/server/services/Files/process'); const { EModelEndpoint } = require('librechat-data-provider'); const { formatLangChainMessages } = require('./prompts'); const checkBalance = require('~/models/checkBalance'); @@ -30,10 +31,6 @@ class PluginsClient extends OpenAIClient { super.setOptions(options); - if (this.functionsAgent && this.agentOptions.model && !this.useOpenRouter) { - this.agentOptions.model = this.getFunctionModelName(this.agentOptions.model); - } - this.isGpt3 = this.modelOptions?.model?.includes('gpt-3'); if (this.options.reverseProxyUrl) { @@ -113,6 +110,7 @@ class PluginsClient extends OpenAIClient { openAIApiKey: this.openAIApiKey, conversationId: this.conversationId, fileStrategy: this.options.req.app.locals.fileStrategy, + processFileURL, message, }, }); diff --git a/api/app/clients/llm/createCoherePayload.js b/api/app/clients/llm/createCoherePayload.js new file mode 100644 index 00000000000..58803d76f3c --- /dev/null +++ b/api/app/clients/llm/createCoherePayload.js @@ -0,0 +1,85 @@ +const { CohereConstants } = require('librechat-data-provider'); +const { titleInstruction } = require('../prompts/titlePrompts'); + +// Mapping OpenAI roles to Cohere roles +const roleMap = { + user: CohereConstants.ROLE_USER, + assistant: CohereConstants.ROLE_CHATBOT, + system: CohereConstants.ROLE_SYSTEM, // Recognize and map the system role explicitly +}; + +/** + * Adjusts an OpenAI ChatCompletionPayload to conform with Cohere's expected chat payload format. + * Now includes handling for "system" roles explicitly mentioned. + * + * @param {Object} options - Object containing the model options. + * @param {ChatCompletionPayload} options.modelOptions - The OpenAI model payload options. + * @returns {CohereChatStreamRequest} Cohere-compatible chat API payload. + */ +function createCoherePayload({ modelOptions }) { + /** @type {string | undefined} */ + let preamble; + let latestUserMessageContent = ''; + const { + stream, + stop, + top_p, + temperature, + frequency_penalty, + presence_penalty, + max_tokens, + messages, + model, + ...rest + } = modelOptions; + + // Filter out the latest user message and transform remaining messages to Cohere's chat_history format + let chatHistory = messages.reduce((acc, message, index, arr) => { + const isLastUserMessage = index === arr.length - 1 && message.role === 'user'; + + const messageContent = + typeof message.content === 'string' + ? message.content + : message.content.map((part) => (part.type === 'text' ? part.text : '')).join(' '); + + if (isLastUserMessage) { + latestUserMessageContent = messageContent; + } else { + acc.push({ + role: roleMap[message.role] || CohereConstants.ROLE_USER, + message: messageContent, + }); + } + + return acc; + }, []); + + if ( + chatHistory.length === 1 && + chatHistory[0].role === CohereConstants.ROLE_SYSTEM && + !latestUserMessageContent.length + ) { + const message = chatHistory[0].message; + latestUserMessageContent = message.includes(titleInstruction) + ? CohereConstants.TITLE_MESSAGE + : '.'; + preamble = message; + } + + return { + message: latestUserMessageContent, + model: model, + chatHistory, + stream: stream ?? false, + temperature: temperature, + frequencyPenalty: frequency_penalty, + presencePenalty: presence_penalty, + maxTokens: max_tokens, + stopSequences: stop, + preamble, + p: top_p, + ...rest, + }; +} + +module.exports = createCoherePayload; diff --git a/api/app/clients/llm/createLLM.js b/api/app/clients/llm/createLLM.js index 62f2fe86f95..09b29cca8e9 100644 --- a/api/app/clients/llm/createLLM.js +++ b/api/app/clients/llm/createLLM.js @@ -55,16 +55,18 @@ function createLLM({ } if (azure && configOptions.basePath) { - configOptions.basePath = constructAzureURL({ + const azureURL = constructAzureURL({ baseURL: configOptions.basePath, - azure: azureOptions, + azureOptions, }); + azureOptions.azureOpenAIBasePath = azureURL.split( + `/${azureOptions.azureOpenAIApiDeploymentName}`, + )[0]; } return new ChatOpenAI( { streaming, - verbose: true, credentials, configuration, ...azureOptions, diff --git a/api/app/clients/llm/index.js b/api/app/clients/llm/index.js index 46478ade63b..2e09bbb841b 100644 --- a/api/app/clients/llm/index.js +++ b/api/app/clients/llm/index.js @@ -1,7 +1,9 @@ const createLLM = require('./createLLM'); const RunManager = require('./RunManager'); +const createCoherePayload = require('./createCoherePayload'); module.exports = { createLLM, RunManager, + createCoherePayload, }; diff --git a/api/app/clients/prompts/createContextHandlers.js b/api/app/clients/prompts/createContextHandlers.js new file mode 100644 index 00000000000..e48dfd8e672 --- /dev/null +++ b/api/app/clients/prompts/createContextHandlers.js @@ -0,0 +1,159 @@ +const axios = require('axios'); +const { isEnabled } = require('~/server/utils'); +const { logger } = require('~/config'); + +const footer = `Use the context as your learned knowledge to better answer the user. + +In your response, remember to follow these guidelines: +- If you don't know the answer, simply say that you don't know. +- If you are unsure how to answer, ask for clarification. +- Avoid mentioning that you obtained the information from the context. + +Answer appropriately in the user's language. +`; + +function createContextHandlers(req, userMessageContent) { + if (!process.env.RAG_API_URL) { + return; + } + + const queryPromises = []; + const processedFiles = []; + const processedIds = new Set(); + const jwtToken = req.headers.authorization.split(' ')[1]; + const useFullContext = isEnabled(process.env.RAG_USE_FULL_CONTEXT); + + const query = async (file) => { + if (useFullContext) { + return axios.get(`${process.env.RAG_API_URL}/documents/${file.file_id}/context`, { + headers: { + Authorization: `Bearer ${jwtToken}`, + }, + }); + } + + return axios.post( + `${process.env.RAG_API_URL}/query`, + { + file_id: file.file_id, + query: userMessageContent, + k: 4, + }, + { + headers: { + Authorization: `Bearer ${jwtToken}`, + 'Content-Type': 'application/json', + }, + }, + ); + }; + + const processFile = async (file) => { + if (file.embedded && !processedIds.has(file.file_id)) { + try { + const promise = query(file); + queryPromises.push(promise); + processedFiles.push(file); + processedIds.add(file.file_id); + } catch (error) { + logger.error(`Error processing file ${file.filename}:`, error); + } + } + }; + + const createContext = async () => { + try { + if (!queryPromises.length || !processedFiles.length) { + return ''; + } + + const oneFile = processedFiles.length === 1; + const header = `The user has attached ${oneFile ? 'a' : processedFiles.length} file${ + !oneFile ? 's' : '' + } to the conversation:`; + + const files = `${ + oneFile + ? '' + : ` + ` + }${processedFiles + .map( + (file) => ` + + ${file.filename} + ${file.type} + `, + ) + .join('')}${ + oneFile + ? '' + : ` + ` + }`; + + const resolvedQueries = await Promise.all(queryPromises); + + const context = resolvedQueries + .map((queryResult, index) => { + const file = processedFiles[index]; + let contextItems = queryResult.data; + + const generateContext = (currentContext) => + ` + + ${file.filename} + ${currentContext} + + `; + + if (useFullContext) { + return generateContext(`\n${contextItems}`); + } + + contextItems = queryResult.data + .map((item) => { + const pageContent = item[0].page_content; + return ` + + + `; + }) + .join(''); + + return generateContext(contextItems); + }) + .join(''); + + if (useFullContext) { + const prompt = `${header} + ${context} + ${footer}`; + + return prompt; + } + + const prompt = `${header} + ${files} + + A semantic search was executed with the user's message as the query, retrieving the following context inside XML tags. + + ${context} + + + ${footer}`; + + return prompt; + } catch (error) { + logger.error('Error creating context:', error); + throw error; + } + }; + + return { + processFile, + createContext, + }; +} + +module.exports = createContextHandlers; diff --git a/api/app/clients/prompts/createVisionPrompt.js b/api/app/clients/prompts/createVisionPrompt.js new file mode 100644 index 00000000000..5d8a7bbf51b --- /dev/null +++ b/api/app/clients/prompts/createVisionPrompt.js @@ -0,0 +1,34 @@ +/** + * Generates a prompt instructing the user to describe an image in detail, tailored to different types of visual content. + * @param {boolean} pluralized - Whether to pluralize the prompt for multiple images. + * @returns {string} - The generated vision prompt. + */ +const createVisionPrompt = (pluralized = false) => { + return `Please describe the image${ + pluralized ? 's' : '' + } in detail, covering relevant aspects such as: + + For photographs, illustrations, or artwork: + - The main subject(s) and their appearance, positioning, and actions + - The setting, background, and any notable objects or elements + - Colors, lighting, and overall mood or atmosphere + - Any interesting details, textures, or patterns + - The style, technique, or medium used (if discernible) + + For screenshots or images containing text: + - The content and purpose of the text + - The layout, formatting, and organization of the information + - Any notable visual elements, such as logos, icons, or graphics + - The overall context or message conveyed by the screenshot + + For graphs, charts, or data visualizations: + - The type of graph or chart (e.g., bar graph, line chart, pie chart) + - The variables being compared or analyzed + - Any trends, patterns, or outliers in the data + - The axis labels, scales, and units of measurement + - The title, legend, and any additional context provided + + Be as specific and descriptive as possible while maintaining clarity and concision.`; +}; + +module.exports = createVisionPrompt; diff --git a/api/app/clients/prompts/formatMessages.js b/api/app/clients/prompts/formatMessages.js index 1b97bc7ffa1..c19eee260af 100644 --- a/api/app/clients/prompts/formatMessages.js +++ b/api/app/clients/prompts/formatMessages.js @@ -1,3 +1,4 @@ +const { EModelEndpoint } = require('librechat-data-provider'); const { HumanMessage, AIMessage, SystemMessage } = require('langchain/schema'); /** @@ -7,10 +8,16 @@ const { HumanMessage, AIMessage, SystemMessage } = require('langchain/schema'); * @param {Object} params.message - The message object to format. * @param {string} [params.message.role] - The role of the message sender (must be 'user'). * @param {string} [params.message.content] - The text content of the message. + * @param {EModelEndpoint} [params.endpoint] - Identifier for specific endpoint handling * @param {Array} [params.image_urls] - The image_urls to attach to the message. * @returns {(Object)} - The formatted message. */ -const formatVisionMessage = ({ message, image_urls }) => { +const formatVisionMessage = ({ message, image_urls, endpoint }) => { + if (endpoint === EModelEndpoint.anthropic) { + message.content = [...image_urls, { type: 'text', text: message.content }]; + return message; + } + message.content = [{ type: 'text', text: message.content }, ...image_urls]; return message; @@ -29,10 +36,11 @@ const formatVisionMessage = ({ message, image_urls }) => { * @param {Array} [params.message.image_urls] - The image_urls attached to the message for Vision API. * @param {string} [params.userName] - The name of the user. * @param {string} [params.assistantName] - The name of the assistant. + * @param {string} [params.endpoint] - Identifier for specific endpoint handling * @param {boolean} [params.langChain=false] - Whether to return a LangChain message object. * @returns {(Object|HumanMessage|AIMessage|SystemMessage)} - The formatted message. */ -const formatMessage = ({ message, userName, assistantName, langChain = false }) => { +const formatMessage = ({ message, userName, assistantName, endpoint, langChain = false }) => { let { role: _role, _name, sender, text, content: _content, lc_id } = message; if (lc_id && lc_id[2] && !langChain) { const roleMapping = { @@ -51,7 +59,11 @@ const formatMessage = ({ message, userName, assistantName, langChain = false }) const { image_urls } = message; if (Array.isArray(image_urls) && image_urls.length > 0 && role === 'user') { - return formatVisionMessage({ message: formattedMessage, image_urls: message.image_urls }); + return formatVisionMessage({ + message: formattedMessage, + image_urls: message.image_urls, + endpoint, + }); } if (_name) { diff --git a/api/app/clients/prompts/formatMessages.spec.js b/api/app/clients/prompts/formatMessages.spec.js index 636cdb1c8e5..8d4956b3811 100644 --- a/api/app/clients/prompts/formatMessages.spec.js +++ b/api/app/clients/prompts/formatMessages.spec.js @@ -1,5 +1,6 @@ -const { formatMessage, formatLangChainMessages, formatFromLangChain } = require('./formatMessages'); +const { Constants } = require('librechat-data-provider'); const { HumanMessage, AIMessage, SystemMessage } = require('langchain/schema'); +const { formatMessage, formatLangChainMessages, formatFromLangChain } = require('./formatMessages'); describe('formatMessage', () => { it('formats user message', () => { @@ -61,7 +62,7 @@ describe('formatMessage', () => { isCreatedByUser: true, isEdited: false, model: null, - parentMessageId: '00000000-0000-0000-0000-000000000000', + parentMessageId: Constants.NO_PARENT, sender: 'User', text: 'hi', tokenCount: 5, diff --git a/api/app/clients/prompts/index.js b/api/app/clients/prompts/index.js index 40db3d90439..36bb6f7e283 100644 --- a/api/app/clients/prompts/index.js +++ b/api/app/clients/prompts/index.js @@ -4,6 +4,8 @@ const handleInputs = require('./handleInputs'); const instructions = require('./instructions'); const titlePrompts = require('./titlePrompts'); const truncateText = require('./truncateText'); +const createVisionPrompt = require('./createVisionPrompt'); +const createContextHandlers = require('./createContextHandlers'); module.exports = { ...formatMessages, @@ -12,4 +14,6 @@ module.exports = { ...instructions, ...titlePrompts, truncateText, + createVisionPrompt, + createContextHandlers, }; diff --git a/api/app/clients/prompts/titlePrompts.js b/api/app/clients/prompts/titlePrompts.js index 1e893ba295d..83d8909f3a7 100644 --- a/api/app/clients/prompts/titlePrompts.js +++ b/api/app/clients/prompts/titlePrompts.js @@ -27,7 +27,63 @@ ${convo}`, return titlePrompt; }; +const titleInstruction = + 'a concise, 5-word-or-less title for the conversation, using its same language, with no punctuation. Apply title case conventions appropriate for the language. For English, use AP Stylebook Title Case. Never directly mention the language name or the word "title"'; +const titleFunctionPrompt = `In this environment you have access to a set of tools you can use to generate the conversation title. + +You may call them like this: + + +$TOOL_NAME + +<$PARAMETER_NAME>$PARAMETER_VALUE +... + + + + +Here are the tools available: + + +submit_title + +Submit a brief title in the conversation's language, following the parameter description closely. + + + +title +string +${titleInstruction} + + + +`; + +/** + * Parses titles from title functions based on the provided prompt. + * @param {string} prompt - The prompt containing the title function. + * @returns {string} The parsed title. "New Chat" if no title is found. + */ +function parseTitleFromPrompt(prompt) { + const titleRegex = /(.+?)<\/title>/; + const titleMatch = prompt.match(titleRegex); + + if (titleMatch && titleMatch[1]) { + const title = titleMatch[1].trim(); + + // // Capitalize the first letter of each word; Note: unnecessary due to title case prompting + // const capitalizedTitle = title.replace(/\b\w/g, (char) => char.toUpperCase()); + + return title; + } + + return 'New Chat'; +} + module.exports = { langPrompt, + titleInstruction, createTitlePrompt, + titleFunctionPrompt, + parseTitleFromPrompt, }; diff --git a/api/app/clients/specs/BaseClient.test.js b/api/app/clients/specs/BaseClient.test.js index 889499fbc29..9ffa7e04f1b 100644 --- a/api/app/clients/specs/BaseClient.test.js +++ b/api/app/clients/specs/BaseClient.test.js @@ -1,3 +1,4 @@ +const { Constants } = require('librechat-data-provider'); const { initializeFakeClient } = require('./FakeClient'); jest.mock('../../../lib/db/connectDb'); @@ -307,7 +308,7 @@ describe('BaseClient', () => { const unorderedMessages = [ { id: '3', parentMessageId: '2', text: 'Message 3' }, { id: '2', parentMessageId: '1', text: 'Message 2' }, - { id: '1', parentMessageId: '00000000-0000-0000-0000-000000000000', text: 'Message 1' }, + { id: '1', parentMessageId: Constants.NO_PARENT, text: 'Message 1' }, ]; it('should return ordered messages based on parentMessageId', () => { @@ -316,7 +317,7 @@ describe('BaseClient', () => { parentMessageId: '3', }); expect(result).toEqual([ - { id: '1', parentMessageId: '00000000-0000-0000-0000-000000000000', text: 'Message 1' }, + { id: '1', parentMessageId: Constants.NO_PARENT, text: 'Message 1' }, { id: '2', parentMessageId: '1', text: 'Message 2' }, { id: '3', parentMessageId: '2', text: 'Message 3' }, ]); diff --git a/api/app/clients/specs/PluginsClient.test.js b/api/app/clients/specs/PluginsClient.test.js index b4e42b1fc51..dfd57b23b94 100644 --- a/api/app/clients/specs/PluginsClient.test.js +++ b/api/app/clients/specs/PluginsClient.test.js @@ -1,9 +1,10 @@ +const crypto = require('crypto'); +const { Constants } = require('librechat-data-provider'); const { HumanChatMessage, AIChatMessage } = require('langchain/schema'); const PluginsClient = require('../PluginsClient'); -const crypto = require('crypto'); -jest.mock('../../../lib/db/connectDb'); -jest.mock('../../../models/Conversation', () => { +jest.mock('~/lib/db/connectDb'); +jest.mock('~/models/Conversation', () => { return function () { return { save: jest.fn(), @@ -12,6 +13,12 @@ jest.mock('../../../models/Conversation', () => { }; }); +const defaultAzureOptions = { + azureOpenAIApiInstanceName: 'your-instance-name', + azureOpenAIApiDeploymentName: 'your-deployment-name', + azureOpenAIApiVersion: '2020-07-01-preview', +}; + describe('PluginsClient', () => { let TestAgent; let options = { @@ -60,7 +67,7 @@ describe('PluginsClient', () => { TestAgent.setOptions(opts); } const conversationId = opts.conversationId || crypto.randomUUID(); - const parentMessageId = opts.parentMessageId || '00000000-0000-0000-0000-000000000000'; + const parentMessageId = opts.parentMessageId || Constants.NO_PARENT; const userMessageId = opts.overrideParentMessageId || crypto.randomUUID(); this.pastMessages = await TestAgent.loadHistory( conversationId, @@ -187,4 +194,30 @@ describe('PluginsClient', () => { expect(client.getFunctionModelName('')).toBe('gpt-3.5-turbo'); }); }); + describe('Azure OpenAI tests specific to Plugins', () => { + // TODO: add more tests for Azure OpenAI integration with Plugins + // let client; + // beforeEach(() => { + // client = new PluginsClient('dummy_api_key'); + // }); + + test('should not call getFunctionModelName when azure options are set', () => { + const spy = jest.spyOn(PluginsClient.prototype, 'getFunctionModelName'); + const model = 'gpt-4-turbo'; + + // note, without the azure change in PR #1766, `getFunctionModelName` is called twice + const testClient = new PluginsClient('dummy_api_key', { + agentOptions: { + model, + agent: 'functions', + }, + azure: defaultAzureOptions, + }); + + expect(spy).not.toHaveBeenCalled(); + expect(testClient.agentOptions.model).toBe(model); + + spy.mockRestore(); + }); + }); }); diff --git a/api/app/clients/tools/DALL-E.js b/api/app/clients/tools/DALL-E.js index 4eca7f7932e..4600bdb026e 100644 --- a/api/app/clients/tools/DALL-E.js +++ b/api/app/clients/tools/DALL-E.js @@ -3,42 +3,39 @@ const OpenAI = require('openai'); const { v4: uuidv4 } = require('uuid'); const { Tool } = require('langchain/tools'); const { HttpsProxyAgent } = require('https-proxy-agent'); +const { FileContext } = require('librechat-data-provider'); const { getImageBasename } = require('~/server/services/Files/images'); -const { processFileURL } = require('~/server/services/Files/process'); const extractBaseURL = require('~/utils/extractBaseURL'); const { logger } = require('~/config'); -const { - DALLE2_SYSTEM_PROMPT, - DALLE_REVERSE_PROXY, - PROXY, - DALLE2_AZURE_API_VERSION, - DALLE2_BASEURL, - DALLE2_API_KEY, - DALLE_API_KEY, -} = process.env; class OpenAICreateImage extends Tool { constructor(fields = {}) { super(); this.userId = fields.userId; this.fileStrategy = fields.fileStrategy; + if (fields.processFileURL) { + this.processFileURL = fields.processFileURL.bind(this); + } let apiKey = fields.DALLE2_API_KEY ?? fields.DALLE_API_KEY ?? this.getApiKey(); const config = { apiKey }; - if (DALLE_REVERSE_PROXY) { - config.baseURL = extractBaseURL(DALLE_REVERSE_PROXY); + if (process.env.DALLE_REVERSE_PROXY) { + config.baseURL = extractBaseURL(process.env.DALLE_REVERSE_PROXY); } - if (DALLE2_AZURE_API_VERSION && DALLE2_BASEURL) { - config.baseURL = DALLE2_BASEURL; - config.defaultQuery = { 'api-version': DALLE2_AZURE_API_VERSION }; - config.defaultHeaders = { 'api-key': DALLE2_API_KEY, 'Content-Type': 'application/json' }; - config.apiKey = DALLE2_API_KEY; + if (process.env.DALLE2_AZURE_API_VERSION && process.env.DALLE2_BASEURL) { + config.baseURL = process.env.DALLE2_BASEURL; + config.defaultQuery = { 'api-version': process.env.DALLE2_AZURE_API_VERSION }; + config.defaultHeaders = { + 'api-key': process.env.DALLE2_API_KEY, + 'Content-Type': 'application/json', + }; + config.apiKey = process.env.DALLE2_API_KEY; } - if (PROXY) { - config.httpAgent = new HttpsProxyAgent(PROXY); + if (process.env.PROXY) { + config.httpAgent = new HttpsProxyAgent(process.env.PROXY); } this.openai = new OpenAI(config); @@ -51,7 +48,7 @@ Guidelines: "Subject: [subject], Style: [style], Color: [color], Details: [details], Emotion: [emotion]" - Generate images only once per human query unless explicitly requested by the user`; this.description_for_model = - DALLE2_SYSTEM_PROMPT ?? + process.env.DALLE2_SYSTEM_PROMPT ?? `// Whenever a description of an image is given, generate prompts (following these rules), and use dalle to create the image. If the user does not ask for a specific number of images, default to creating 2 prompts to send to dalle that are written to be as diverse as possible. All prompts sent to dalle must abide by the following policies: // 1. Prompts must be in English. Translate to English if needed. // 2. One image per function call. Create only 1 image per request unless explicitly told to generate more than 1 image. @@ -67,7 +64,7 @@ Guidelines: } getApiKey() { - const apiKey = DALLE2_API_KEY ?? DALLE_API_KEY ?? ''; + const apiKey = process.env.DALLE2_API_KEY ?? process.env.DALLE_API_KEY ?? ''; if (!apiKey) { throw new Error('Missing DALLE_API_KEY environment variable.'); } @@ -86,13 +83,21 @@ Guidelines: } async _call(input) { - const resp = await this.openai.images.generate({ - prompt: this.replaceUnwantedChars(input), - // TODO: Future idea -- could we ask an LLM to extract these arguments from an input that might contain them? - n: 1, - // size: '1024x1024' - size: '512x512', - }); + let resp; + + try { + resp = await this.openai.images.generate({ + prompt: this.replaceUnwantedChars(input), + // TODO: Future idea -- could we ask an LLM to extract these arguments from an input that might contain them? + n: 1, + // size: '1024x1024' + size: '512x512', + }); + } catch (error) { + logger.error('[DALL-E] Problem generating the image:', error); + return `Something went wrong when trying to generate the image. The DALL-E API may be unavailable: +Error Message: ${error.message}`; + } const theImageUrl = resp.data[0].url; @@ -116,15 +121,16 @@ Guidelines: }); try { - const result = await processFileURL({ + const result = await this.processFileURL({ fileStrategy: this.fileStrategy, userId: this.userId, URL: theImageUrl, fileName: imageName, basePath: 'images', + context: FileContext.image_generation, }); - this.result = this.wrapInMarkdown(result); + this.result = this.wrapInMarkdown(result.filepath); } catch (error) { logger.error('Error while saving the image:', error); this.result = `Failed to save the image locally. ${error.message}`; diff --git a/api/app/clients/tools/GoogleSearch.js b/api/app/clients/tools/GoogleSearch.js deleted file mode 100644 index 3d7574b6c19..00000000000 --- a/api/app/clients/tools/GoogleSearch.js +++ /dev/null @@ -1,121 +0,0 @@ -const { google } = require('googleapis'); -const { Tool } = require('langchain/tools'); -const { logger } = require('~/config'); - -/** - * Represents a tool that allows an agent to use the Google Custom Search API. - * @extends Tool - */ -class GoogleSearchAPI extends Tool { - constructor(fields = {}) { - super(); - this.cx = fields.GOOGLE_CSE_ID || this.getCx(); - this.apiKey = fields.GOOGLE_API_KEY || this.getApiKey(); - this.customSearch = undefined; - } - - /** - * The name of the tool. - * @type {string} - */ - name = 'google'; - - /** - * A description for the agent to use - * @type {string} - */ - description = - 'Use the \'google\' tool to retrieve internet search results relevant to your input. The results will return links and snippets of text from the webpages'; - description_for_model = - 'Use the \'google\' tool to retrieve internet search results relevant to your input. The results will return links and snippets of text from the webpages'; - - getCx() { - const cx = process.env.GOOGLE_CSE_ID || ''; - if (!cx) { - throw new Error('Missing GOOGLE_CSE_ID environment variable.'); - } - return cx; - } - - getApiKey() { - const apiKey = process.env.GOOGLE_API_KEY || ''; - if (!apiKey) { - throw new Error('Missing GOOGLE_API_KEY environment variable.'); - } - return apiKey; - } - - getCustomSearch() { - if (!this.customSearch) { - const version = 'v1'; - this.customSearch = google.customsearch(version); - } - return this.customSearch; - } - - resultsToReadableFormat(results) { - let output = 'Results:\n'; - - results.forEach((resultObj, index) => { - output += `Title: ${resultObj.title}\n`; - output += `Link: ${resultObj.link}\n`; - if (resultObj.snippet) { - output += `Snippet: ${resultObj.snippet}\n`; - } - - if (index < results.length - 1) { - output += '\n'; - } - }); - - return output; - } - - /** - * Calls the tool with the provided input and returns a promise that resolves with a response from the Google Custom Search API. - * @param {string} input - The input to provide to the API. - * @returns {Promise<String>} A promise that resolves with a response from the Google Custom Search API. - */ - async _call(input) { - try { - const metadataResults = []; - const response = await this.getCustomSearch().cse.list({ - q: input, - cx: this.cx, - auth: this.apiKey, - num: 5, // Limit the number of results to 5 - }); - - // return response.data; - // logger.debug(response.data); - - if (!response.data.items || response.data.items.length === 0) { - return this.resultsToReadableFormat([ - { title: 'No good Google Search Result was found', link: '' }, - ]); - } - - // const results = response.items.slice(0, numResults); - const results = response.data.items; - - for (const result of results) { - const metadataResult = { - title: result.title || '', - link: result.link || '', - }; - if (result.snippet) { - metadataResult.snippet = result.snippet; - } - metadataResults.push(metadataResult); - } - - return this.resultsToReadableFormat(metadataResults); - } catch (error) { - logger.error('[GoogleSearchAPI]', error); - // throw error; - return 'There was an error searching Google.'; - } - } -} - -module.exports = GoogleSearchAPI; diff --git a/api/app/clients/tools/index.js b/api/app/clients/tools/index.js index f5410e89eec..f16d229e6b7 100644 --- a/api/app/clients/tools/index.js +++ b/api/app/clients/tools/index.js @@ -1,35 +1,44 @@ -const GoogleSearchAPI = require('./GoogleSearch'); +const availableTools = require('./manifest.json'); +// Basic Tools +const CodeBrew = require('./CodeBrew'); +const WolframAlphaAPI = require('./Wolfram'); +const AzureAiSearch = require('./AzureAiSearch'); const OpenAICreateImage = require('./DALL-E'); -const DALLE3 = require('./structured/DALLE3'); -const StructuredSD = require('./structured/StableDiffusion'); const StableDiffusionAPI = require('./StableDiffusion'); -const WolframAlphaAPI = require('./Wolfram'); -const StructuredWolfram = require('./structured/Wolfram'); const SelfReflectionTool = require('./SelfReflection'); -const AzureAiSearch = require('./AzureAiSearch'); -const StructuredACS = require('./structured/AzureAISearch'); + +// Structured Tools +const DALLE3 = require('./structured/DALLE3'); const ChatTool = require('./structured/ChatTool'); const E2BTools = require('./structured/E2BTools'); const CodeSherpa = require('./structured/CodeSherpa'); +const StructuredSD = require('./structured/StableDiffusion'); +const StructuredACS = require('./structured/AzureAISearch'); const CodeSherpaTools = require('./structured/CodeSherpaTools'); -const availableTools = require('./manifest.json'); -const CodeBrew = require('./CodeBrew'); +const GoogleSearchAPI = require('./structured/GoogleSearch'); +const StructuredWolfram = require('./structured/Wolfram'); +const TavilySearchResults = require('./structured/TavilySearchResults'); +const TraversaalSearch = require('./structured/TraversaalSearch'); module.exports = { availableTools, + // Basic Tools + CodeBrew, + AzureAiSearch, GoogleSearchAPI, + WolframAlphaAPI, OpenAICreateImage, - DALLE3, StableDiffusionAPI, - StructuredSD, - WolframAlphaAPI, - StructuredWolfram, SelfReflectionTool, - AzureAiSearch, - StructuredACS, - E2BTools, + // Structured Tools + DALLE3, ChatTool, + E2BTools, CodeSherpa, + StructuredSD, + StructuredACS, CodeSherpaTools, - CodeBrew, + StructuredWolfram, + TavilySearchResults, + TraversaalSearch, }; diff --git a/api/app/clients/tools/manifest.json b/api/app/clients/tools/manifest.json index bde4c8a87a9..3daaf9dd3bc 100644 --- a/api/app/clients/tools/manifest.json +++ b/api/app/clients/tools/manifest.json @@ -1,4 +1,17 @@ [ + { + "name": "Traversaal", + "pluginKey": "traversaal_search", + "description": "Traversaal is a robust search API tailored for LLM Agents. Get an API key here: https://api.traversaal.ai", + "icon": "https://traversaal.ai/favicon.ico", + "authConfig": [ + { + "authField": "TRAVERSAAL_API_KEY", + "label": "Traversaal API Key", + "description": "Get your API key here: <a href=\"https://api.traversaal.ai\" target=\"_blank\">https://api.traversaal.ai</a>" + } + ] + }, { "name": "Google", "pluginKey": "google", @@ -89,7 +102,7 @@ "icon": "https://i.imgur.com/u2TzXzH.png", "authConfig": [ { - "authField": "DALLE2_API_KEY", + "authField": "DALLE2_API_KEY||DALLE_API_KEY", "label": "OpenAI API Key", "description": "You can use DALL-E with your API Key from OpenAI." } @@ -102,12 +115,25 @@ "icon": "https://i.imgur.com/u2TzXzH.png", "authConfig": [ { - "authField": "DALLE3_API_KEY", + "authField": "DALLE3_API_KEY||DALLE_API_KEY", "label": "OpenAI API Key", "description": "You can use DALL-E with your API Key from OpenAI." } ] }, + { + "name": "Tavily Search", + "pluginKey": "tavily_search_results_json", + "description": "Tavily Search is a robust search API tailored for LLM Agents. It seamlessly integrates with diverse data sources to ensure a superior, relevant search experience.", + "icon": "https://tavily.com/favicon.ico", + "authConfig": [ + { + "authField": "TAVILY_API_KEY", + "label": "Tavily API Key", + "description": "Get your API key here: https://app.tavily.com/" + } + ] + }, { "name": "Calculator", "pluginKey": "calculator", diff --git a/api/app/clients/tools/structured/AzureAISearch.js b/api/app/clients/tools/structured/AzureAISearch.js index 9b50aa2c433..0ce7b43fb21 100644 --- a/api/app/clients/tools/structured/AzureAISearch.js +++ b/api/app/clients/tools/structured/AzureAISearch.js @@ -19,6 +19,13 @@ class AzureAISearch extends StructuredTool { this.name = 'azure-ai-search'; this.description = 'Use the \'azure-ai-search\' tool to retrieve search results relevant to your input'; + /* Used to initialize the Tool without necessary variables. */ + this.override = fields.override ?? false; + + // Define schema + this.schema = z.object({ + query: z.string().describe('Search word or phrase to Azure AI Search'), + }); // Initialize properties using helper function this.serviceEndpoint = this._initializeField( @@ -51,12 +58,16 @@ class AzureAISearch extends StructuredTool { ); // Check for required fields - if (!this.serviceEndpoint || !this.indexName || !this.apiKey) { + if (!this.override && (!this.serviceEndpoint || !this.indexName || !this.apiKey)) { throw new Error( 'Missing AZURE_AI_SEARCH_SERVICE_ENDPOINT, AZURE_AI_SEARCH_INDEX_NAME, or AZURE_AI_SEARCH_API_KEY environment variable.', ); } + if (this.override) { + return; + } + // Create SearchClient this.client = new SearchClient( this.serviceEndpoint, @@ -64,11 +75,6 @@ class AzureAISearch extends StructuredTool { new AzureKeyCredential(this.apiKey), { apiVersion: this.apiVersion }, ); - - // Define schema - this.schema = z.object({ - query: z.string().describe('Search word or phrase to Azure AI Search'), - }); } // Improved error handling and logging diff --git a/api/app/clients/tools/structured/DALLE3.js b/api/app/clients/tools/structured/DALLE3.js index 33df93e7fcf..3155992ca9b 100644 --- a/api/app/clients/tools/structured/DALLE3.js +++ b/api/app/clients/tools/structured/DALLE3.js @@ -4,42 +4,47 @@ const OpenAI = require('openai'); const { v4: uuidv4 } = require('uuid'); const { Tool } = require('langchain/tools'); const { HttpsProxyAgent } = require('https-proxy-agent'); +const { FileContext } = require('librechat-data-provider'); const { getImageBasename } = require('~/server/services/Files/images'); -const { processFileURL } = require('~/server/services/Files/process'); const extractBaseURL = require('~/utils/extractBaseURL'); const { logger } = require('~/config'); -const { - DALLE3_SYSTEM_PROMPT, - DALLE_REVERSE_PROXY, - PROXY, - DALLE3_AZURE_API_VERSION, - DALLE3_BASEURL, - DALLE3_API_KEY, -} = process.env; class DALLE3 extends Tool { constructor(fields = {}) { super(); + /** @type {boolean} Used to initialize the Tool without necessary variables. */ + this.override = fields.override ?? false; + /** @type {boolean} Necessary for output to contain all image metadata. */ + this.returnMetadata = fields.returnMetadata ?? false; this.userId = fields.userId; this.fileStrategy = fields.fileStrategy; + if (fields.processFileURL) { + /** @type {processFileURL} Necessary for output to contain all image metadata. */ + this.processFileURL = fields.processFileURL.bind(this); + } + let apiKey = fields.DALLE3_API_KEY ?? fields.DALLE_API_KEY ?? this.getApiKey(); const config = { apiKey }; - if (DALLE_REVERSE_PROXY) { - config.baseURL = extractBaseURL(DALLE_REVERSE_PROXY); + if (process.env.DALLE_REVERSE_PROXY) { + config.baseURL = extractBaseURL(process.env.DALLE_REVERSE_PROXY); } - if (DALLE3_AZURE_API_VERSION && DALLE3_BASEURL) { - config.baseURL = DALLE3_BASEURL; - config.defaultQuery = { 'api-version': DALLE3_AZURE_API_VERSION }; - config.defaultHeaders = { 'api-key': DALLE3_API_KEY, 'Content-Type': 'application/json' }; - config.apiKey = DALLE3_API_KEY; + if (process.env.DALLE3_AZURE_API_VERSION && process.env.DALLE3_BASEURL) { + config.baseURL = process.env.DALLE3_BASEURL; + config.defaultQuery = { 'api-version': process.env.DALLE3_AZURE_API_VERSION }; + config.defaultHeaders = { + 'api-key': process.env.DALLE3_API_KEY, + 'Content-Type': 'application/json', + }; + config.apiKey = process.env.DALLE3_API_KEY; } - if (PROXY) { - config.httpAgent = new HttpsProxyAgent(PROXY); + if (process.env.PROXY) { + config.httpAgent = new HttpsProxyAgent(process.env.PROXY); } + /** @type {OpenAI} */ this.openai = new OpenAI(config); this.name = 'dalle'; this.description = `Use DALLE to create images from text descriptions. @@ -47,7 +52,7 @@ class DALLE3 extends Tool { - Create only one image, without repeating or listing descriptions outside the "prompts" field. - Maintains the original intent of the description, with parameters for image style, quality, and size to tailor the output.`; this.description_for_model = - DALLE3_SYSTEM_PROMPT ?? + process.env.DALLE3_SYSTEM_PROMPT ?? `// Whenever a description of an image is given, generate prompts (following these rules), and use dalle to create the image. If the user does not ask for a specific number of images, default to creating 2 prompts to send to dalle that are written to be as diverse as possible. All prompts sent to dalle must abide by the following policies: // 1. Prompts must be in English. Translate to English if needed. // 2. One image per function call. Create only 1 image per request unless explicitly told to generate more than 1 image. @@ -86,7 +91,7 @@ class DALLE3 extends Tool { getApiKey() { const apiKey = process.env.DALLE3_API_KEY ?? process.env.DALLE_API_KEY ?? ''; - if (!apiKey) { + if (!apiKey && !this.override) { throw new Error('Missing DALLE_API_KEY environment variable.'); } return apiKey; @@ -120,6 +125,7 @@ class DALLE3 extends Tool { n: 1, }); } catch (error) { + logger.error('[DALL-E-3] Problem generating the image:', error); return `Something went wrong when trying to generate the image. The DALL-E API may be unavailable: Error Message: ${error.message}`; } @@ -150,15 +156,20 @@ Error Message: ${error.message}`; }); try { - const result = await processFileURL({ + const result = await this.processFileURL({ fileStrategy: this.fileStrategy, userId: this.userId, URL: theImageUrl, fileName: imageName, basePath: 'images', + context: FileContext.image_generation, }); - this.result = this.wrapInMarkdown(result); + if (this.returnMetadata) { + this.result = result; + } else { + this.result = this.wrapInMarkdown(result.filepath); + } } catch (error) { logger.error('Error while saving the image:', error); this.result = `Failed to save the image locally. ${error.message}`; diff --git a/api/app/clients/tools/structured/GoogleSearch.js b/api/app/clients/tools/structured/GoogleSearch.js new file mode 100644 index 00000000000..92d33272c83 --- /dev/null +++ b/api/app/clients/tools/structured/GoogleSearch.js @@ -0,0 +1,65 @@ +const { z } = require('zod'); +const { Tool } = require('@langchain/core/tools'); +const { getEnvironmentVariable } = require('@langchain/core/utils/env'); + +class GoogleSearchResults extends Tool { + static lc_name() { + return 'GoogleSearchResults'; + } + + constructor(fields = {}) { + super(fields); + this.envVarApiKey = 'GOOGLE_API_KEY'; + this.envVarSearchEngineId = 'GOOGLE_CSE_ID'; + this.override = fields.override ?? false; + this.apiKey = fields.apiKey ?? getEnvironmentVariable(this.envVarApiKey); + this.searchEngineId = + fields.searchEngineId ?? getEnvironmentVariable(this.envVarSearchEngineId); + + this.kwargs = fields?.kwargs ?? {}; + this.name = 'google'; + this.description = + 'A search engine optimized for comprehensive, accurate, and trusted results. Useful for when you need to answer questions about current events.'; + + this.schema = z.object({ + query: z.string().min(1).describe('The search query string.'), + max_results: z + .number() + .min(1) + .max(10) + .optional() + .describe('The maximum number of search results to return. Defaults to 10.'), + // Note: Google API has its own parameters for search customization, adjust as needed. + }); + } + + async _call(input) { + const validationResult = this.schema.safeParse(input); + if (!validationResult.success) { + throw new Error(`Validation failed: ${JSON.stringify(validationResult.error.issues)}`); + } + + const { query, max_results = 5 } = validationResult.data; + + const response = await fetch( + `https://www.googleapis.com/customsearch/v1?key=${this.apiKey}&cx=${ + this.searchEngineId + }&q=${encodeURIComponent(query)}&num=${max_results}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + + const json = await response.json(); + if (!response.ok) { + throw new Error(`Request failed with status ${response.status}: ${json.error.message}`); + } + + return JSON.stringify(json); + } +} + +module.exports = GoogleSearchResults; diff --git a/api/app/clients/tools/structured/StableDiffusion.js b/api/app/clients/tools/structured/StableDiffusion.js index 1fc5096730e..e891cbb398a 100644 --- a/api/app/clients/tools/structured/StableDiffusion.js +++ b/api/app/clients/tools/structured/StableDiffusion.js @@ -4,12 +4,28 @@ const { z } = require('zod'); const path = require('path'); const axios = require('axios'); const sharp = require('sharp'); +const { v4: uuidv4 } = require('uuid'); const { StructuredTool } = require('langchain/tools'); +const { FileContext } = require('librechat-data-provider'); +const paths = require('~/config/paths'); const { logger } = require('~/config'); class StableDiffusionAPI extends StructuredTool { constructor(fields) { super(); + /** @type {string} User ID */ + this.userId = fields.userId; + /** @type {Express.Request | undefined} Express Request object, only provided by ToolService */ + this.req = fields.req; + /** @type {boolean} Used to initialize the Tool without necessary variables. */ + this.override = fields.override ?? false; + /** @type {boolean} Necessary for output to contain all image metadata. */ + this.returnMetadata = fields.returnMetadata ?? false; + if (fields.uploadImageBuffer) { + /** @type {uploadImageBuffer} Necessary for output to contain all image metadata. */ + this.uploadImageBuffer = fields.uploadImageBuffer.bind(this); + } + this.name = 'stable-diffusion'; this.url = fields.SD_WEBUI_URL || this.getServerURL(); this.description_for_model = `// Generate images and visuals using text. @@ -44,7 +60,7 @@ class StableDiffusionAPI extends StructuredTool { getMarkdownImageUrl(imageName) { const imageUrl = path - .join(this.relativeImageUrl, imageName) + .join(this.relativePath, this.userId, imageName) .replace(/\\/g, '/') .replace('public/', ''); return `![generated image](/${imageUrl})`; @@ -52,7 +68,7 @@ class StableDiffusionAPI extends StructuredTool { getServerURL() { const url = process.env.SD_WEBUI_URL || ''; - if (!url) { + if (!url && !this.override) { throw new Error('Missing SD_WEBUI_URL environment variable.'); } return url; @@ -70,46 +86,67 @@ class StableDiffusionAPI extends StructuredTool { width: 1024, height: 1024, }; - const response = await axios.post(`${url}/sdapi/v1/txt2img`, payload); - const image = response.data.images[0]; - const pngPayload = { image: `data:image/png;base64,${image}` }; - const response2 = await axios.post(`${url}/sdapi/v1/png-info`, pngPayload); - const info = response2.data.info; + const generationResponse = await axios.post(`${url}/sdapi/v1/txt2img`, payload); + const image = generationResponse.data.images[0]; + + /** @type {{ height: number, width: number, seed: number, infotexts: string[] }} */ + let info = {}; + try { + info = JSON.parse(generationResponse.data.info); + } catch (error) { + logger.error('[StableDiffusion] Error while getting image metadata:', error); + } - // Generate unique name - const imageName = `${Date.now()}.png`; - this.outputPath = path.resolve( - __dirname, - '..', - '..', - '..', - '..', - '..', - 'client', - 'public', - 'images', - ); - const appRoot = path.resolve(__dirname, '..', '..', '..', '..', '..', 'client'); - this.relativeImageUrl = path.relative(appRoot, this.outputPath); + const file_id = uuidv4(); + const imageName = `${file_id}.png`; + const { imageOutput: imageOutputPath, clientPath } = paths; + const filepath = path.join(imageOutputPath, this.userId, imageName); + this.relativePath = path.relative(clientPath, imageOutputPath); - // Check if directory exists, if not create it - if (!fs.existsSync(this.outputPath)) { - fs.mkdirSync(this.outputPath, { recursive: true }); + if (!fs.existsSync(path.join(imageOutputPath, this.userId))) { + fs.mkdirSync(path.join(imageOutputPath, this.userId), { recursive: true }); } try { const buffer = Buffer.from(image.split(',', 1)[0], 'base64'); + if (this.returnMetadata && this.uploadImageBuffer && this.req) { + const file = await this.uploadImageBuffer({ + req: this.req, + context: FileContext.image_generation, + resize: false, + metadata: { + buffer, + height: info.height, + width: info.width, + bytes: Buffer.byteLength(buffer), + filename: imageName, + type: 'image/png', + file_id, + }, + }); + + const generationInfo = info.infotexts[0].split('\n').pop(); + return { + ...file, + prompt, + metadata: { + negative_prompt, + seed: info.seed, + info: generationInfo, + }, + }; + } + await sharp(buffer) .withMetadata({ iptcpng: { - parameters: info, + parameters: info.infotexts[0], }, }) - .toFile(this.outputPath + '/' + imageName); + .toFile(filepath); this.result = this.getMarkdownImageUrl(imageName); } catch (error) { logger.error('[StableDiffusion] Error while saving the image:', error); - // this.result = theImageUrl; } return this.result; diff --git a/api/app/clients/tools/structured/TavilySearchResults.js b/api/app/clients/tools/structured/TavilySearchResults.js new file mode 100644 index 00000000000..3945ac1d00f --- /dev/null +++ b/api/app/clients/tools/structured/TavilySearchResults.js @@ -0,0 +1,92 @@ +const { z } = require('zod'); +const { Tool } = require('@langchain/core/tools'); +const { getEnvironmentVariable } = require('@langchain/core/utils/env'); + +class TavilySearchResults extends Tool { + static lc_name() { + return 'TavilySearchResults'; + } + + constructor(fields = {}) { + super(fields); + this.envVar = 'TAVILY_API_KEY'; + /* Used to initialize the Tool without necessary variables. */ + this.override = fields.override ?? false; + this.apiKey = fields.apiKey ?? this.getApiKey(); + + this.kwargs = fields?.kwargs ?? {}; + this.name = 'tavily_search_results_json'; + this.description = + 'A search engine optimized for comprehensive, accurate, and trusted results. Useful for when you need to answer questions about current events.'; + + this.schema = z.object({ + query: z.string().min(1).describe('The search query string.'), + max_results: z + .number() + .min(1) + .max(10) + .optional() + .describe('The maximum number of search results to return. Defaults to 5.'), + search_depth: z + .enum(['basic', 'advanced']) + .optional() + .describe( + 'The depth of the search, affecting result quality and response time (`basic` or `advanced`). Default is basic for quick results and advanced for indepth high quality results but longer response time. Advanced calls equals 2 requests.', + ), + include_images: z + .boolean() + .optional() + .describe( + 'Whether to include a list of query-related images in the response. Default is False.', + ), + include_answer: z + .boolean() + .optional() + .describe('Whether to include answers in the search results. Default is False.'), + // include_raw_content: z.boolean().optional().describe('Whether to include raw content in the search results. Default is False.'), + // include_domains: z.array(z.string()).optional().describe('A list of domains to specifically include in the search results.'), + // exclude_domains: z.array(z.string()).optional().describe('A list of domains to specifically exclude from the search results.'), + }); + } + + getApiKey() { + const apiKey = getEnvironmentVariable(this.envVar); + if (!apiKey && !this.override) { + throw new Error(`Missing ${this.envVar} environment variable.`); + } + return apiKey; + } + + async _call(input) { + const validationResult = this.schema.safeParse(input); + if (!validationResult.success) { + throw new Error(`Validation failed: ${JSON.stringify(validationResult.error.issues)}`); + } + + const { query, ...rest } = validationResult.data; + + const requestBody = { + api_key: this.apiKey, + query, + ...rest, + ...this.kwargs, + }; + + const response = await fetch('https://api.tavily.com/search', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody), + }); + + const json = await response.json(); + if (!response.ok) { + throw new Error(`Request failed with status ${response.status}: ${json.error}`); + } + + return JSON.stringify(json); + } +} + +module.exports = TavilySearchResults; diff --git a/api/app/clients/tools/structured/TraversaalSearch.js b/api/app/clients/tools/structured/TraversaalSearch.js new file mode 100644 index 00000000000..e8ceeda134f --- /dev/null +++ b/api/app/clients/tools/structured/TraversaalSearch.js @@ -0,0 +1,89 @@ +const { z } = require('zod'); +const { Tool } = require('@langchain/core/tools'); +const { getEnvironmentVariable } = require('@langchain/core/utils/env'); +const { logger } = require('~/config'); + +/** + * Tool for the Traversaal AI search API, Ares. + */ +class TraversaalSearch extends Tool { + static lc_name() { + return 'TraversaalSearch'; + } + constructor(fields) { + super(fields); + this.name = 'traversaal_search'; + this.description = `An AI search engine optimized for comprehensive, accurate, and trusted results. + Useful for when you need to answer questions about current events. Input should be a search query.`; + this.description_for_model = + '\'Please create a specific sentence for the AI to understand and use as a query to search the web based on the user\'s request. For example, "Find information about the highest mountains in the world." or "Show me the latest news articles about climate change and its impact on polar ice caps."\''; + this.schema = z.object({ + query: z + .string() + .describe( + 'A properly written sentence to be interpreted by an AI to search the web according to the user\'s request.', + ), + }); + + this.apiKey = fields?.TRAVERSAAL_API_KEY ?? this.getApiKey(); + } + + getApiKey() { + const apiKey = getEnvironmentVariable('TRAVERSAAL_API_KEY'); + if (!apiKey && this.override) { + throw new Error( + 'No Traversaal API key found. Either set an environment variable named "TRAVERSAAL_API_KEY" or pass an API key as "apiKey".', + ); + } + return apiKey; + } + + // eslint-disable-next-line no-unused-vars + async _call({ query }, _runManager) { + const body = { + query: [query], + }; + try { + const response = await fetch('https://api-ares.traversaal.ai/live/predict', { + method: 'POST', + headers: { + 'content-type': 'application/json', + 'x-api-key': this.apiKey, + }, + body: JSON.stringify({ ...body }), + }); + const json = await response.json(); + if (!response.ok) { + throw new Error( + `Request failed with status code ${response.status}: ${json.error ?? json.message}`, + ); + } + if (!json.data) { + throw new Error('Could not parse Traversaal API results. Please try again.'); + } + + const baseText = json.data?.response_text ?? ''; + const sources = json.data?.web_url; + const noResponse = 'No response found in Traversaal API results'; + + if (!baseText && !sources) { + return noResponse; + } + + const sourcesText = sources?.length ? '\n\nSources:\n - ' + sources.join('\n - ') : ''; + + const result = baseText + sourcesText; + + if (!result) { + return noResponse; + } + + return result; + } catch (error) { + logger.error('Traversaal API request failed', error); + return `Traversaal API request failed: ${error.message}`; + } + } +} + +module.exports = TraversaalSearch; diff --git a/api/app/clients/tools/structured/Wolfram.js b/api/app/clients/tools/structured/Wolfram.js index 2c5c6e023a1..fc857b35cb2 100644 --- a/api/app/clients/tools/structured/Wolfram.js +++ b/api/app/clients/tools/structured/Wolfram.js @@ -7,6 +7,9 @@ const { logger } = require('~/config'); class WolframAlphaAPI extends StructuredTool { constructor(fields) { super(); + /* Used to initialize the Tool without necessary variables. */ + this.override = fields.override ?? false; + this.name = 'wolfram'; this.apiKey = fields.WOLFRAM_APP_ID || this.getAppId(); this.description_for_model = `// Access dynamic computation and curated data from WolframAlpha and Wolfram Cloud. @@ -55,7 +58,7 @@ class WolframAlphaAPI extends StructuredTool { getAppId() { const appId = process.env.WOLFRAM_APP_ID || ''; - if (!appId) { + if (!appId && !this.override) { throw new Error('Missing WOLFRAM_APP_ID environment variable.'); } return appId; diff --git a/api/app/clients/tools/structured/specs/DALLE3.spec.js b/api/app/clients/tools/structured/specs/DALLE3.spec.js index 58771b1459e..1b28de2faf1 100644 --- a/api/app/clients/tools/structured/specs/DALLE3.spec.js +++ b/api/app/clients/tools/structured/specs/DALLE3.spec.js @@ -1,14 +1,11 @@ const OpenAI = require('openai'); const DALLE3 = require('../DALLE3'); -const { processFileURL } = require('~/server/services/Files/process'); const { logger } = require('~/config'); jest.mock('openai'); -jest.mock('~/server/services/Files/process', () => ({ - processFileURL: jest.fn(), -})); +const processFileURL = jest.fn(); jest.mock('~/server/services/Files/images', () => ({ getImageBasename: jest.fn().mockImplementation((url) => { @@ -69,7 +66,7 @@ describe('DALLE3', () => { jest.resetModules(); process.env = { ...originalEnv, DALLE_API_KEY: mockApiKey }; // Instantiate DALLE3 for tests that do not depend on DALLE3_SYSTEM_PROMPT - dalle = new DALLE3(); + dalle = new DALLE3({ processFileURL }); }); afterEach(() => { @@ -78,7 +75,8 @@ describe('DALLE3', () => { process.env = originalEnv; }); - it('should throw an error if DALLE_API_KEY is missing', () => { + it('should throw an error if all potential API keys are missing', () => { + delete process.env.DALLE3_API_KEY; delete process.env.DALLE_API_KEY; expect(() => new DALLE3()).toThrow('Missing DALLE_API_KEY environment variable.'); }); @@ -112,7 +110,9 @@ describe('DALLE3', () => { }; generate.mockResolvedValue(mockResponse); - processFileURL.mockResolvedValue('http://example.com/img-test.png'); + processFileURL.mockResolvedValue({ + filepath: 'http://example.com/img-test.png', + }); const result = await dalle._call(mockData); diff --git a/api/app/clients/tools/util/handleTools.js b/api/app/clients/tools/util/handleTools.js index 1d9a3a00749..7ed18658711 100644 --- a/api/app/clients/tools/util/handleTools.js +++ b/api/app/clients/tools/util/handleTools.js @@ -6,19 +6,23 @@ const { OpenAIEmbeddings } = require('langchain/embeddings/openai'); const { getUserPluginAuthValue } = require('~/server/services/PluginService'); const { availableTools, + // Basic Tools + CodeBrew, + AzureAISearch, GoogleSearchAPI, WolframAlphaAPI, - StructuredWolfram, OpenAICreateImage, StableDiffusionAPI, + // Structured Tools DALLE3, - StructuredSD, - AzureAISearch, - StructuredACS, E2BTools, CodeSherpa, + StructuredSD, + StructuredACS, CodeSherpaTools, - CodeBrew, + TraversaalSearch, + StructuredWolfram, + TavilySearchResults, } = require('../'); const { loadToolSuite } = require('./loadToolSuite'); const { loadSpecs } = require('./loadSpecs'); @@ -30,6 +34,14 @@ const getOpenAIKey = async (options, user) => { return openAIApiKey || (await getUserPluginAuthValue(user, 'OPENAI_API_KEY')); }; +/** + * Validates the availability and authentication of tools for a user based on environment variables or user-specific plugin authentication values. + * Tools without required authentication or with valid authentication are considered valid. + * + * @param {Object} user The user object for whom to validate tool access. + * @param {Array<string>} tools An array of tool identifiers to validate. Defaults to an empty array. + * @returns {Promise<Array<string>>} A promise that resolves to an array of valid tool identifiers. + */ const validateTools = async (user, tools = []) => { try { const validToolsSet = new Set(tools); @@ -37,16 +49,34 @@ const validateTools = async (user, tools = []) => { validToolsSet.has(tool.pluginKey), ); + /** + * Validates the credentials for a given auth field or set of alternate auth fields for a tool. + * If valid admin or user authentication is found, the function returns early. Otherwise, it removes the tool from the set of valid tools. + * + * @param {string} authField The authentication field or fields (separated by "||" for alternates) to validate. + * @param {string} toolName The identifier of the tool being validated. + */ const validateCredentials = async (authField, toolName) => { - const adminAuth = process.env[authField]; - if (adminAuth && adminAuth.length > 0) { - return; + const fields = authField.split('||'); + for (const field of fields) { + const adminAuth = process.env[field]; + if (adminAuth && adminAuth.length > 0) { + return; + } + + let userAuth = null; + try { + userAuth = await getUserPluginAuthValue(user, field); + } catch (err) { + if (field === fields[fields.length - 1] && !userAuth) { + throw err; + } + } + if (userAuth && userAuth.length > 0) { + return; + } } - const userAuth = await getUserPluginAuthValue(user, authField); - if (userAuth && userAuth.length > 0) { - return; - } validToolsSet.delete(toolName); }; @@ -63,20 +93,55 @@ const validateTools = async (user, tools = []) => { return Array.from(validToolsSet.values()); } catch (err) { logger.error('[validateTools] There was a problem validating tools', err); - throw new Error(err); + throw new Error('There was a problem validating tools'); } }; -const loadToolWithAuth = async (userId, authFields, ToolConstructor, options = {}) => { +/** + * Initializes a tool with authentication values for the given user, supporting alternate authentication fields. + * Authentication fields can have alternates separated by "||", and the first defined variable will be used. + * + * @param {string} userId The user ID for which the tool is being loaded. + * @param {Array<string>} authFields Array of strings representing the authentication fields. Supports alternate fields delimited by "||". + * @param {typeof import('langchain/tools').Tool} ToolConstructor The constructor function for the tool to be initialized. + * @param {Object} options Optional parameters to be passed to the tool constructor alongside authentication values. + * @returns {Function} An Async function that, when called, asynchronously initializes and returns an instance of the tool with authentication. + */ +const loadToolWithAuth = (userId, authFields, ToolConstructor, options = {}) => { return async function () { let authValues = {}; - for (const authField of authFields) { - let authValue = process.env[authField]; - if (!authValue) { - authValue = await getUserPluginAuthValue(userId, authField); + /** + * Finds the first non-empty value for the given authentication field, supporting alternate fields. + * @param {string[]} fields Array of strings representing the authentication fields. Supports alternate fields delimited by "||". + * @returns {Promise<{ authField: string, authValue: string} | null>} An object containing the authentication field and value, or null if not found. + */ + const findAuthValue = async (fields) => { + for (const field of fields) { + let value = process.env[field]; + if (value) { + return { authField: field, authValue: value }; + } + try { + value = await getUserPluginAuthValue(userId, field); + } catch (err) { + if (field === fields[fields.length - 1] && !value) { + throw err; + } + } + if (value) { + return { authField: field, authValue: value }; + } + } + return null; + }; + + for (let authField of authFields) { + const fields = authField.split('||'); + const result = await findAuthValue(fields); + if (result) { + authValues[result.authField] = result.authValue; } - authValues[authField] = authValue; } return new ToolConstructor({ ...options, ...authValues, userId }); @@ -90,8 +155,10 @@ const loadTools = async ({ returnMap = false, tools = [], options = {}, + skipSpecs = false, }) => { const toolConstructors = { + tavily_search_results_json: TavilySearchResults, calculator: Calculator, google: GoogleSearchAPI, wolfram: functions ? StructuredWolfram : WolframAlphaAPI, @@ -99,6 +166,7 @@ const loadTools = async ({ 'stable-diffusion': functions ? StructuredSD : StableDiffusionAPI, 'azure-ai-search': functions ? StructuredACS : AzureAISearch, CodeBrew: CodeBrew, + traversaal_search: TraversaalSearch, }; const openAIApiKey = await getOpenAIKey(options, user); @@ -168,10 +236,19 @@ const loadTools = async ({ toolConstructors.codesherpa = CodeSherpa; } + const imageGenOptions = { + req: options.req, + fileStrategy: options.fileStrategy, + processFileURL: options.processFileURL, + returnMetadata: options.returnMetadata, + uploadImageBuffer: options.uploadImageBuffer, + }; + const toolOptions = { serpapi: { location: 'Austin,Texas,United States', hl: 'en', gl: 'us' }, - dalle: { fileStrategy: options.fileStrategy }, - 'dall-e': { fileStrategy: options.fileStrategy }, + dalle: imageGenOptions, + 'dall-e': imageGenOptions, + 'stable-diffusion': imageGenOptions, }; const toolAuthFields = {}; @@ -194,7 +271,7 @@ const loadTools = async ({ if (toolConstructors[tool]) { const options = toolOptions[tool] || {}; - const toolInstance = await loadToolWithAuth( + const toolInstance = loadToolWithAuth( user, toolAuthFields[tool], toolConstructors[tool], @@ -210,7 +287,7 @@ const loadTools = async ({ } let specs = null; - if (functions && remainingTools.length > 0) { + if (functions && remainingTools.length > 0 && skipSpecs !== true) { specs = await loadSpecs({ llm: model, user, @@ -237,6 +314,9 @@ const loadTools = async ({ let result = []; for (const tool of tools) { const validTool = requestedTools[tool]; + if (!validTool) { + continue; + } const plugin = await validTool(); if (Array.isArray(plugin)) { @@ -250,6 +330,7 @@ const loadTools = async ({ }; module.exports = { + loadToolWithAuth, validateTools, loadTools, }; diff --git a/api/app/clients/tools/util/handleTools.test.js b/api/app/clients/tools/util/handleTools.test.js index 40d8bc6129e..2c977714275 100644 --- a/api/app/clients/tools/util/handleTools.test.js +++ b/api/app/clients/tools/util/handleTools.test.js @@ -4,26 +4,33 @@ const mockUser = { findByIdAndDelete: jest.fn(), }; -var mockPluginService = { +const mockPluginService = { updateUserPluginAuth: jest.fn(), deleteUserPluginAuth: jest.fn(), getUserPluginAuthValue: jest.fn(), }; -jest.mock('../../../../models/User', () => { +jest.mock('~/models/User', () => { return function () { return mockUser; }; }); -jest.mock('../../../../server/services/PluginService', () => mockPluginService); +jest.mock('~/server/services/PluginService', () => mockPluginService); -const User = require('../../../../models/User'); -const { validateTools, loadTools } = require('./'); -const PluginService = require('../../../../server/services/PluginService'); -const { BaseChatModel } = require('langchain/chat_models/openai'); const { Calculator } = require('langchain/tools/calculator'); -const { availableTools, OpenAICreateImage, GoogleSearchAPI, StructuredSD } = require('../'); +const { BaseChatModel } = require('langchain/chat_models/openai'); + +const User = require('~/models/User'); +const PluginService = require('~/server/services/PluginService'); +const { validateTools, loadTools, loadToolWithAuth } = require('./handleTools'); +const { + availableTools, + OpenAICreateImage, + GoogleSearchAPI, + StructuredSD, + WolframAlphaAPI, +} = require('../'); describe('Tool Handlers', () => { let fakeUser; @@ -44,7 +51,10 @@ describe('Tool Handlers', () => { }); mockPluginService.updateUserPluginAuth.mockImplementation( (userId, authField, _pluginKey, credential) => { - userAuthValues[`${userId}-${authField}`] = credential; + const fields = authField.split('||'); + fields.forEach((field) => { + userAuthValues[`${userId}-${field}`] = credential; + }); }, ); @@ -53,6 +63,7 @@ describe('Tool Handlers', () => { username: 'fakeuser', email: 'fakeuser@example.com', emailVerified: false, + // file deepcode ignore NoHardcodedPasswords/test: fake value password: 'fakepassword123', avatar: '', provider: 'local', @@ -133,6 +144,18 @@ describe('Tool Handlers', () => { loadTool2 = toolFunctions[sampleTools[1]]; loadTool3 = toolFunctions[sampleTools[2]]; }); + + let originalEnv; + + beforeEach(() => { + originalEnv = process.env; + process.env = { ...originalEnv }; + }); + + afterEach(() => { + process.env = originalEnv; + }); + it('returns the expected load functions for requested tools', async () => { expect(loadTool1).toBeDefined(); expect(loadTool2).toBeDefined(); @@ -149,6 +172,86 @@ describe('Tool Handlers', () => { expect(authTool).toBeInstanceOf(ToolClass); expect(tool).toBeInstanceOf(ToolClass2); }); + + it('should initialize an authenticated tool with primary auth field', async () => { + process.env.DALLE2_API_KEY = 'mocked_api_key'; + const initToolFunction = loadToolWithAuth( + 'userId', + ['DALLE2_API_KEY||DALLE_API_KEY'], + ToolClass, + ); + const authTool = await initToolFunction(); + + expect(authTool).toBeInstanceOf(ToolClass); + expect(mockPluginService.getUserPluginAuthValue).not.toHaveBeenCalled(); + }); + + it('should initialize an authenticated tool with alternate auth field when primary is missing', async () => { + delete process.env.DALLE2_API_KEY; // Ensure the primary key is not set + process.env.DALLE_API_KEY = 'mocked_alternate_api_key'; + const initToolFunction = loadToolWithAuth( + 'userId', + ['DALLE2_API_KEY||DALLE_API_KEY'], + ToolClass, + ); + const authTool = await initToolFunction(); + + expect(authTool).toBeInstanceOf(ToolClass); + expect(mockPluginService.getUserPluginAuthValue).toHaveBeenCalledTimes(1); + expect(mockPluginService.getUserPluginAuthValue).toHaveBeenCalledWith( + 'userId', + 'DALLE2_API_KEY', + ); + }); + + it('should fallback to getUserPluginAuthValue when env vars are missing', async () => { + mockPluginService.updateUserPluginAuth('userId', 'DALLE_API_KEY', 'dalle', 'mocked_api_key'); + const initToolFunction = loadToolWithAuth( + 'userId', + ['DALLE2_API_KEY||DALLE_API_KEY'], + ToolClass, + ); + const authTool = await initToolFunction(); + + expect(authTool).toBeInstanceOf(ToolClass); + expect(mockPluginService.getUserPluginAuthValue).toHaveBeenCalledTimes(2); + }); + + it('should initialize an authenticated tool with singular auth field', async () => { + process.env.WOLFRAM_APP_ID = 'mocked_app_id'; + const initToolFunction = loadToolWithAuth('userId', ['WOLFRAM_APP_ID'], WolframAlphaAPI); + const authTool = await initToolFunction(); + + expect(authTool).toBeInstanceOf(WolframAlphaAPI); + expect(mockPluginService.getUserPluginAuthValue).not.toHaveBeenCalled(); + }); + + it('should initialize an authenticated tool when env var is set', async () => { + process.env.WOLFRAM_APP_ID = 'mocked_app_id'; + const initToolFunction = loadToolWithAuth('userId', ['WOLFRAM_APP_ID'], WolframAlphaAPI); + const authTool = await initToolFunction(); + + expect(authTool).toBeInstanceOf(WolframAlphaAPI); + expect(mockPluginService.getUserPluginAuthValue).not.toHaveBeenCalledWith( + 'userId', + 'WOLFRAM_APP_ID', + ); + }); + + it('should fallback to getUserPluginAuthValue when singular env var is missing', async () => { + delete process.env.WOLFRAM_APP_ID; // Ensure the environment variable is not set + mockPluginService.getUserPluginAuthValue.mockResolvedValue('mocked_user_auth_value'); + const initToolFunction = loadToolWithAuth('userId', ['WOLFRAM_APP_ID'], WolframAlphaAPI); + const authTool = await initToolFunction(); + + expect(authTool).toBeInstanceOf(WolframAlphaAPI); + expect(mockPluginService.getUserPluginAuthValue).toHaveBeenCalledTimes(1); + expect(mockPluginService.getUserPluginAuthValue).toHaveBeenCalledWith( + 'userId', + 'WOLFRAM_APP_ID', + ); + }); + it('should throw an error for an unauthenticated tool', async () => { try { await loadTool2(); diff --git a/api/app/clients/tools/util/loadToolSuite.js b/api/app/clients/tools/util/loadToolSuite.js index 2b4500a4f77..4392d61b9a6 100644 --- a/api/app/clients/tools/util/loadToolSuite.js +++ b/api/app/clients/tools/util/loadToolSuite.js @@ -1,17 +1,49 @@ -const { getUserPluginAuthValue } = require('../../../../server/services/PluginService'); +const { getUserPluginAuthValue } = require('~/server/services/PluginService'); const { availableTools } = require('../'); +const { logger } = require('~/config'); -const loadToolSuite = async ({ pluginKey, tools, user, options }) => { +/** + * Loads a suite of tools with authentication values for a given user, supporting alternate authentication fields. + * Authentication fields can have alternates separated by "||", and the first defined variable will be used. + * + * @param {Object} params Parameters for loading the tool suite. + * @param {string} params.pluginKey Key identifying the plugin whose tools are to be loaded. + * @param {Array<Function>} params.tools Array of tool constructor functions. + * @param {Object} params.user User object for whom the tools are being loaded. + * @param {Object} [params.options={}] Optional parameters to be passed to each tool constructor. + * @returns {Promise<Array>} A promise that resolves to an array of instantiated tools. + */ +const loadToolSuite = async ({ pluginKey, tools, user, options = {} }) => { const authConfig = availableTools.find((tool) => tool.pluginKey === pluginKey).authConfig; const suite = []; const authValues = {}; + const findAuthValue = async (authField) => { + const fields = authField.split('||'); + for (const field of fields) { + let value = process.env[field]; + if (value) { + return value; + } + try { + value = await getUserPluginAuthValue(user, field); + if (value) { + return value; + } + } catch (err) { + logger.error(`Error fetching plugin auth value for ${field}: ${err.message}`); + } + } + return null; + }; + for (const auth of authConfig) { - let authValue = process.env[auth.authField]; - if (!authValue) { - authValue = await getUserPluginAuthValue(user, auth.authField); + const authValue = await findAuthValue(auth.authField); + if (authValue !== null) { + authValues[auth.authField] = authValue; + } else { + logger.warn(`[loadToolSuite] No auth value found for ${auth.authField}`); } - authValues[auth.authField] = authValue; } for (const tool of tools) { diff --git a/api/cache/getLogStores.js b/api/cache/getLogStores.js index 016c7700009..786bb1f1f74 100644 --- a/api/cache/getLogStores.js +++ b/api/cache/getLogStores.js @@ -1,5 +1,5 @@ const Keyv = require('keyv'); -const { CacheKeys } = require('librechat-data-provider'); +const { CacheKeys, ViolationTypes } = require('librechat-data-provider'); const { logFile, violationFile } = require('./keyvFiles'); const { math, isEnabled } = require('~/server/utils'); const keyvRedis = require('./keyvRedis'); @@ -23,6 +23,22 @@ const config = isEnabled(USE_REDIS) ? new Keyv({ store: keyvRedis }) : new Keyv({ namespace: CacheKeys.CONFIG_STORE }); +const tokenConfig = isEnabled(USE_REDIS) // ttl: 30 minutes + ? new Keyv({ store: keyvRedis, ttl: 1800000 }) + : new Keyv({ namespace: CacheKeys.TOKEN_CONFIG, ttl: 1800000 }); + +const genTitle = isEnabled(USE_REDIS) // ttl: 2 minutes + ? new Keyv({ store: keyvRedis, ttl: 120000 }) + : new Keyv({ namespace: CacheKeys.GEN_TITLE, ttl: 120000 }); + +const modelQueries = isEnabled(process.env.USE_REDIS) + ? new Keyv({ store: keyvRedis }) + : new Keyv({ namespace: CacheKeys.MODEL_QUERIES }); + +const abortKeys = isEnabled(USE_REDIS) + ? new Keyv({ store: keyvRedis }) + : new Keyv({ namespace: CacheKeys.ABORT_KEYS, ttl: 600000 }); + const namespaces = { [CacheKeys.CONFIG_STORE]: config, pending_req, @@ -31,9 +47,17 @@ const namespaces = { concurrent: createViolationInstance('concurrent'), non_browser: createViolationInstance('non_browser'), message_limit: createViolationInstance('message_limit'), - token_balance: createViolationInstance('token_balance'), + token_balance: createViolationInstance(ViolationTypes.TOKEN_BALANCE), registrations: createViolationInstance('registrations'), + [ViolationTypes.FILE_UPLOAD_LIMIT]: createViolationInstance(ViolationTypes.FILE_UPLOAD_LIMIT), + [ViolationTypes.ILLEGAL_MODEL_REQUEST]: createViolationInstance( + ViolationTypes.ILLEGAL_MODEL_REQUEST, + ), logins: createViolationInstance('logins'), + [CacheKeys.ABORT_KEYS]: abortKeys, + [CacheKeys.TOKEN_CONFIG]: tokenConfig, + [CacheKeys.GEN_TITLE]: genTitle, + [CacheKeys.MODEL_QUERIES]: modelQueries, }; /** diff --git a/api/config/parsers.js b/api/config/parsers.js index 59685eab0bf..16c85cba4f4 100644 --- a/api/config/parsers.js +++ b/api/config/parsers.js @@ -33,6 +33,10 @@ function getMatchingSensitivePatterns(valueStr) { * @returns {string} - The redacted console message. */ function redactMessage(str) { + if (!str) { + return ''; + } + const patterns = getMatchingSensitivePatterns(str); if (patterns.length === 0) { diff --git a/api/config/paths.js b/api/config/paths.js index 41e3ac5054f..165e9e6cd4f 100644 --- a/api/config/paths.js +++ b/api/config/paths.js @@ -1,7 +1,14 @@ const path = require('path'); module.exports = { + root: path.resolve(__dirname, '..', '..'), + uploads: path.resolve(__dirname, '..', '..', 'uploads'), + clientPath: path.resolve(__dirname, '..', '..', 'client'), dist: path.resolve(__dirname, '..', '..', 'client', 'dist'), publicPath: path.resolve(__dirname, '..', '..', 'client', 'public'), + fonts: path.resolve(__dirname, '..', '..', 'client', 'public', 'fonts'), + assets: path.resolve(__dirname, '..', '..', 'client', 'public', 'assets'), imageOutput: path.resolve(__dirname, '..', '..', 'client', 'public', 'images'), + structuredTools: path.resolve(__dirname, '..', 'app', 'clients', 'tools', 'structured'), + pluginManifest: path.resolve(__dirname, '..', 'app', 'clients', 'tools', 'manifest.json'), }; diff --git a/api/config/winston.js b/api/config/winston.js index 6cba153f163..81e972fbbc3 100644 --- a/api/config/winston.js +++ b/api/config/winston.js @@ -5,7 +5,15 @@ const { redactFormat, redactMessage, debugTraverse } = require('./parsers'); const logDir = path.join(__dirname, '..', 'logs'); -const { NODE_ENV, DEBUG_LOGGING = true, DEBUG_CONSOLE = false } = process.env; +const { NODE_ENV, DEBUG_LOGGING = true, DEBUG_CONSOLE = false, CONSOLE_JSON = false } = process.env; + +const useConsoleJson = + (typeof CONSOLE_JSON === 'string' && CONSOLE_JSON?.toLowerCase() === 'true') || + CONSOLE_JSON === true; + +const useDebugConsole = + (typeof DEBUG_CONSOLE === 'string' && DEBUG_CONSOLE?.toLowerCase() === 'true') || + DEBUG_CONSOLE === true; const levels = { error: 0, @@ -33,7 +41,7 @@ const level = () => { const fileFormat = winston.format.combine( redactFormat(), - winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), + winston.format.timestamp({ format: () => new Date().toISOString() }), winston.format.errors({ stack: true }), winston.format.splat(), // redactErrors(), @@ -99,14 +107,20 @@ const consoleFormat = winston.format.combine( }), ); -if ( - (typeof DEBUG_CONSOLE === 'string' && DEBUG_CONSOLE?.toLowerCase() === 'true') || - DEBUG_CONSOLE === true -) { +if (useDebugConsole) { transports.push( new winston.transports.Console({ level: 'debug', - format: winston.format.combine(consoleFormat, debugTraverse), + format: useConsoleJson + ? winston.format.combine(fileFormat, debugTraverse, winston.format.json()) + : winston.format.combine(fileFormat, debugTraverse), + }), + ); +} else if (useConsoleJson) { + transports.push( + new winston.transports.Console({ + level: 'info', + format: winston.format.combine(fileFormat, winston.format.json()), }), ); } else { diff --git a/api/models/Action.js b/api/models/Action.js new file mode 100644 index 00000000000..5141569c103 --- /dev/null +++ b/api/models/Action.js @@ -0,0 +1,68 @@ +const mongoose = require('mongoose'); +const actionSchema = require('./schema/action'); + +const Action = mongoose.model('action', actionSchema); + +/** + * Update an action with new data without overwriting existing properties, + * or create a new action if it doesn't exist. + * + * @param {Object} searchParams - The search parameters to find the action to update. + * @param {string} searchParams.action_id - The ID of the action to update. + * @param {string} searchParams.user - The user ID of the action's author. + * @param {Object} updateData - An object containing the properties to update. + * @returns {Promise<Object>} The updated or newly created action document as a plain object. + */ +const updateAction = async (searchParams, updateData) => { + return await Action.findOneAndUpdate(searchParams, updateData, { + new: true, + upsert: true, + }).lean(); +}; + +/** + * Retrieves all actions that match the given search parameters. + * + * @param {Object} searchParams - The search parameters to find matching actions. + * @param {boolean} includeSensitive - Flag to include sensitive data in the metadata. + * @returns {Promise<Array<Object>>} A promise that resolves to an array of action documents as plain objects. + */ +const getActions = async (searchParams, includeSensitive = false) => { + const actions = await Action.find(searchParams).lean(); + + if (!includeSensitive) { + for (let i = 0; i < actions.length; i++) { + const metadata = actions[i].metadata; + if (!metadata) { + continue; + } + + const sensitiveFields = ['api_key', 'oauth_client_id', 'oauth_client_secret']; + for (let field of sensitiveFields) { + if (metadata[field]) { + delete metadata[field]; + } + } + } + } + + return actions; +}; + +/** + * Deletes an action by its ID. + * + * @param {Object} searchParams - The search parameters to find the action to update. + * @param {string} searchParams.action_id - The ID of the action to update. + * @param {string} searchParams.user - The user ID of the action's author. + * @returns {Promise<Object>} A promise that resolves to the deleted action document as a plain object, or null if no document was found. + */ +const deleteAction = async (searchParams) => { + return await Action.findOneAndDelete(searchParams).lean(); +}; + +module.exports = { + updateAction, + getActions, + deleteAction, +}; diff --git a/api/models/Assistant.js b/api/models/Assistant.js new file mode 100644 index 00000000000..fa6192eee93 --- /dev/null +++ b/api/models/Assistant.js @@ -0,0 +1,47 @@ +const mongoose = require('mongoose'); +const assistantSchema = require('./schema/assistant'); + +const Assistant = mongoose.model('assistant', assistantSchema); + +/** + * Update an assistant with new data without overwriting existing properties, + * or create a new assistant if it doesn't exist. + * + * @param {Object} searchParams - The search parameters to find the assistant to update. + * @param {string} searchParams.assistant_id - The ID of the assistant to update. + * @param {string} searchParams.user - The user ID of the assistant's author. + * @param {Object} updateData - An object containing the properties to update. + * @returns {Promise<Object>} The updated or newly created assistant document as a plain object. + */ +const updateAssistant = async (searchParams, updateData) => { + return await Assistant.findOneAndUpdate(searchParams, updateData, { + new: true, + upsert: true, + }).lean(); +}; + +/** + * Retrieves an assistant document based on the provided ID. + * + * @param {Object} searchParams - The search parameters to find the assistant to update. + * @param {string} searchParams.assistant_id - The ID of the assistant to update. + * @param {string} searchParams.user - The user ID of the assistant's author. + * @returns {Promise<Object|null>} The assistant document as a plain object, or null if not found. + */ +const getAssistant = async (searchParams) => await Assistant.findOne(searchParams).lean(); + +/** + * Retrieves all assistants that match the given search parameters. + * + * @param {Object} searchParams - The search parameters to find matching assistants. + * @returns {Promise<Array<Object>>} A promise that resolves to an array of action documents as plain objects. + */ +const getAssistants = async (searchParams) => { + return await Assistant.find(searchParams).lean(); +}; + +module.exports = { + updateAssistant, + getAssistants, + getAssistant, +}; diff --git a/api/models/Balance.js b/api/models/Balance.js index 45dec696304..24d9087b77f 100644 --- a/api/models/Balance.js +++ b/api/models/Balance.js @@ -10,8 +10,9 @@ balanceSchema.statics.check = async function ({ valueKey, tokenType, amount, + endpointTokenConfig, }) { - const multiplier = getMultiplier({ valueKey, tokenType, model, endpoint }); + const multiplier = getMultiplier({ valueKey, tokenType, model, endpoint, endpointTokenConfig }); const tokenCost = amount * multiplier; const { tokenCredits: balance } = (await this.findOne({ user }, 'tokenCredits').lean()) ?? {}; @@ -24,6 +25,7 @@ balanceSchema.statics.check = async function ({ amount, balance, multiplier, + endpointTokenConfig: !!endpointTokenConfig, }); if (!balance) { diff --git a/api/models/Conversation.js b/api/models/Conversation.js index f1aa7bfe718..1ef47241cac 100644 --- a/api/models/Conversation.js +++ b/api/models/Conversation.js @@ -30,12 +30,12 @@ module.exports = { return { message: 'Error saving conversation' }; } }, - getConvosByPage: async (user, pageNumber = 1, pageSize = 14) => { + getConvosByPage: async (user, pageNumber = 1, pageSize = 25) => { try { const totalConvos = (await Conversation.countDocuments({ user })) || 1; const totalPages = Math.ceil(totalConvos / pageSize); const convos = await Conversation.find({ user }) - .sort({ createdAt: -1 }) + .sort({ updatedAt: -1 }) .skip((pageNumber - 1) * pageSize) .limit(pageSize) .lean(); @@ -45,7 +45,7 @@ module.exports = { return { message: 'Error getting conversations' }; } }, - getConvosQueried: async (user, convoIds, pageNumber = 1, pageSize = 14) => { + getConvosQueried: async (user, convoIds, pageNumber = 1, pageSize = 25) => { try { if (!convoIds || convoIds.length === 0) { return { conversations: [], pages: 1, pageNumber, pageSize }; diff --git a/api/models/File.js b/api/models/File.js index 4c353fd70b0..16e9ab6a0e8 100644 --- a/api/models/File.js +++ b/api/models/File.js @@ -14,24 +14,32 @@ const findFileById = async (file_id, options = {}) => { }; /** - * Retrieves files matching a given filter. + * Retrieves files matching a given filter, sorted by the most recently updated. * @param {Object} filter - The filter criteria to apply. + * @param {Object} [_sortOptions] - Optional sort parameters. * @returns {Promise<Array<MongoFile>>} A promise that resolves to an array of file documents. */ -const getFiles = async (filter) => { - return await File.find(filter).lean(); +const getFiles = async (filter, _sortOptions) => { + const sortOptions = { updatedAt: -1, ..._sortOptions }; + return await File.find(filter).sort(sortOptions).lean(); }; /** * Creates a new file with a TTL of 1 hour. * @param {MongoFile} data - The file data to be created, must contain file_id. + * @param {boolean} disableTTL - Whether to disable the TTL. * @returns {Promise<MongoFile>} A promise that resolves to the created file document. */ -const createFile = async (data) => { +const createFile = async (data, disableTTL) => { const fileData = { ...data, expiresAt: new Date(Date.now() + 3600 * 1000), }; + + if (disableTTL) { + delete fileData.expiresAt; + } + return await File.findOneAndUpdate({ file_id: data.file_id }, fileData, { new: true, upsert: true, @@ -61,7 +69,7 @@ const updateFileUsage = async (data) => { const { file_id, inc = 1 } = data; const updateOperation = { $inc: { usage: inc }, - $unset: { expiresAt: '' }, + $unset: { expiresAt: '', temp_file_id: '' }, }; return await File.findOneAndUpdate({ file_id }, updateOperation, { new: true }).lean(); }; @@ -75,6 +83,15 @@ const deleteFile = async (file_id) => { return await File.findOneAndDelete({ file_id }).lean(); }; +/** + * Deletes a file identified by a filter. + * @param {object} filter - The filter criteria to apply. + * @returns {Promise<MongoFile>} A promise that resolves to the deleted file document or null. + */ +const deleteFileByFilter = async (filter) => { + return await File.findOneAndDelete(filter).lean(); +}; + /** * Deletes multiple files identified by an array of file_ids. * @param {Array<string>} file_ids - The unique identifiers of the files to delete. @@ -93,4 +110,5 @@ module.exports = { updateFileUsage, deleteFile, deleteFiles, + deleteFileByFilter, }; diff --git a/api/models/Message.js b/api/models/Message.js index fe615f3283f..a8e1acdf149 100644 --- a/api/models/Message.js +++ b/api/models/Message.js @@ -72,11 +72,49 @@ module.exports = { throw new Error('Failed to save message.'); } }, + /** + * Records a message in the database. + * + * @async + * @function recordMessage + * @param {Object} params - The message data object. + * @param {string} params.user - The identifier of the user. + * @param {string} params.endpoint - The endpoint where the message originated. + * @param {string} params.messageId - The unique identifier for the message. + * @param {string} params.conversationId - The identifier of the conversation. + * @param {string} [params.parentMessageId] - The identifier of the parent message, if any. + * @param {Partial<TMessage>} rest - Any additional properties from the TMessage typedef not explicitly listed. + * @returns {Promise<Object>} The updated or newly inserted message document. + * @throws {Error} If there is an error in saving the message. + */ + async recordMessage({ user, endpoint, messageId, conversationId, parentMessageId, ...rest }) { + try { + // No parsing of convoId as may use threadId + const message = { + user, + endpoint, + messageId, + conversationId, + parentMessageId, + ...rest, + }; + + return await Message.findOneAndUpdate({ user, messageId }, message, { + upsert: true, + new: true, + }); + } catch (err) { + logger.error('Error saving message:', err); + throw new Error('Failed to save message.'); + } + }, async updateMessage(message) { try { const { messageId, ...update } = message; update.isEdited = true; - const updatedMessage = await Message.findOneAndUpdate({ messageId }, update, { new: true }); + const updatedMessage = await Message.findOneAndUpdate({ messageId }, update, { + new: true, + }); if (!updatedMessage) { throw new Error('Message not found.'); diff --git a/api/models/Transaction.js b/api/models/Transaction.js index 0bc26fc37ee..0d11ab5374c 100644 --- a/api/models/Transaction.js +++ b/api/models/Transaction.js @@ -2,6 +2,7 @@ const mongoose = require('mongoose'); const { isEnabled } = require('../server/utils/handleText'); const transactionSchema = require('./schema/transaction'); const { getMultiplier } = require('./tx'); +const { logger } = require('~/config'); const Balance = require('./Balance'); const cancelRate = 1.15; @@ -10,8 +11,8 @@ transactionSchema.methods.calculateTokenValue = function () { if (!this.valueKey || !this.tokenType) { this.tokenValue = this.rawAmount; } - const { valueKey, tokenType, model } = this; - const multiplier = getMultiplier({ valueKey, tokenType, model }); + const { valueKey, tokenType, model, endpointTokenConfig } = this; + const multiplier = Math.abs(getMultiplier({ valueKey, tokenType, model, endpointTokenConfig })); this.rate = multiplier; this.tokenValue = this.rawAmount * multiplier; if (this.context && this.tokenType === 'completion' && this.context === 'incomplete') { @@ -25,6 +26,7 @@ transactionSchema.statics.create = async function (transactionData) { const Transaction = this; const transaction = new Transaction(transactionData); + transaction.endpointTokenConfig = transactionData.endpointTokenConfig; transaction.calculateTokenValue(); // Save the transaction @@ -34,12 +36,44 @@ transactionSchema.statics.create = async function (transactionData) { return; } - // Adjust the user's balance - return await Balance.findOneAndUpdate( + let balance = await Balance.findOne({ user: transaction.user }).lean(); + let incrementValue = transaction.tokenValue; + + if (balance && balance?.tokenCredits + incrementValue < 0) { + incrementValue = -balance.tokenCredits; + } + + balance = await Balance.findOneAndUpdate( { user: transaction.user }, - { $inc: { tokenCredits: transaction.tokenValue } }, + { $inc: { tokenCredits: incrementValue } }, { upsert: true, new: true }, ).lean(); + + return { + rate: transaction.rate, + user: transaction.user.toString(), + balance: balance.tokenCredits, + [transaction.tokenType]: incrementValue, + }; }; -module.exports = mongoose.model('Transaction', transactionSchema); +const Transaction = mongoose.model('Transaction', transactionSchema); + +/** + * Queries and retrieves transactions based on a given filter. + * @async + * @function getTransactions + * @param {Object} filter - MongoDB filter object to apply when querying transactions. + * @returns {Promise<Array>} A promise that resolves to an array of matched transactions. + * @throws {Error} Throws an error if querying the database fails. + */ +async function getTransactions(filter) { + try { + return await Transaction.find(filter).lean(); + } catch (error) { + logger.error('Error querying transactions:', error); + throw error; + } +} + +module.exports = { Transaction, getTransactions }; diff --git a/api/models/checkBalance.js b/api/models/checkBalance.js index c0bbd060bfb..5af77bbb192 100644 --- a/api/models/checkBalance.js +++ b/api/models/checkBalance.js @@ -1,5 +1,6 @@ +const { ViolationTypes } = require('librechat-data-provider'); +const { logViolation } = require('~/cache'); const Balance = require('./Balance'); -const { logViolation } = require('../cache'); /** * Checks the balance for a user and determines if they can spend a certain amount. * If the user cannot spend the amount, it logs a violation and denies the request. @@ -14,6 +15,7 @@ const { logViolation } = require('../cache'); * @param {('prompt' | 'completion')} params.txData.tokenType - The type of token. * @param {number} params.txData.amount - The amount of tokens. * @param {string} params.txData.model - The model name or identifier. + * @param {string} [params.txData.endpointTokenConfig] - The token configuration for the endpoint. * @returns {Promise<boolean>} Returns true if the user can spend the amount, otherwise denies the request. * @throws {Error} Throws an error if there's an issue with the balance check. */ @@ -24,7 +26,7 @@ const checkBalance = async ({ req, res, txData }) => { return true; } - const type = 'token_balance'; + const type = ViolationTypes.TOKEN_BALANCE; const errorMessage = { type, balance, diff --git a/api/models/index.js b/api/models/index.js index 1fa7513540c..bf88193823e 100644 --- a/api/models/index.js +++ b/api/models/index.js @@ -1,12 +1,14 @@ const { getMessages, saveMessage, + recordMessage, updateMessage, deleteMessagesSince, deleteMessages, } = require('./Message'); const { getConvoTitle, getConvo, saveConvo, deleteConvos } = require('./Conversation'); const { getPreset, getPresets, savePreset, deletePresets } = require('./Preset'); +const { hashPassword, getUser, updateUser } = require('./userMethods'); const { findFileById, createFile, @@ -20,17 +22,20 @@ const Key = require('./Key'); const User = require('./User'); const Session = require('./Session'); const Balance = require('./Balance'); -const Transaction = require('./Transaction'); module.exports = { User, Key, Session, Balance, - Transaction, + + hashPassword, + updateUser, + getUser, getMessages, saveMessage, + recordMessage, updateMessage, deleteMessagesSince, deleteMessages, diff --git a/api/models/plugins/mongoMeili.js b/api/models/plugins/mongoMeili.js index abba8486148..79dd30b11cc 100644 --- a/api/models/plugins/mongoMeili.js +++ b/api/models/plugins/mongoMeili.js @@ -183,6 +183,15 @@ const createMeiliMongooseModel = function ({ index, attributesToIndex }) { if (object.conversationId && object.conversationId.includes('|')) { object.conversationId = object.conversationId.replace(/\|/g, '--'); } + + if (object.content && Array.isArray(object.content)) { + object.text = object.content + .filter((item) => item.type === 'text' && item.text && item.text.value) + .map((item) => item.text.value) + .join(' '); + delete object.content; + } + return object; } diff --git a/api/models/schema/action.js b/api/models/schema/action.js new file mode 100644 index 00000000000..9e9109adf78 --- /dev/null +++ b/api/models/schema/action.js @@ -0,0 +1,59 @@ +const mongoose = require('mongoose'); + +const { Schema } = mongoose; + +const AuthSchema = new Schema( + { + authorization_type: String, + custom_auth_header: String, + type: { + type: String, + enum: ['service_http', 'oauth', 'none'], + }, + authorization_content_type: String, + authorization_url: String, + client_url: String, + scope: String, + token_exchange_method: { + type: String, + enum: ['default_post', 'basic_auth_header', null], + }, + }, + { _id: false }, +); + +const actionSchema = new Schema({ + user: { + type: mongoose.Schema.Types.ObjectId, + ref: 'User', + index: true, + required: true, + }, + action_id: { + type: String, + index: true, + required: true, + }, + type: { + type: String, + default: 'action_prototype', + }, + settings: Schema.Types.Mixed, + assistant_id: String, + metadata: { + api_key: String, // private, encrypted + auth: AuthSchema, + domain: { + type: String, + required: true, + }, + // json_schema: Schema.Types.Mixed, + privacy_policy_url: String, + raw_spec: String, + oauth_client_id: String, // private, encrypted + oauth_client_secret: String, // private, encrypted + }, +}); +// }, { minimize: false }); // Prevent removal of empty objects + +module.exports = actionSchema; diff --git a/api/models/schema/assistant.js b/api/models/schema/assistant.js new file mode 100644 index 00000000000..67eb8e8e720 --- /dev/null +++ b/api/models/schema/assistant.js @@ -0,0 +1,33 @@ +const mongoose = require('mongoose'); + +const assistantSchema = mongoose.Schema( + { + user: { + type: mongoose.Schema.Types.ObjectId, + ref: 'User', + required: true, + }, + assistant_id: { + type: String, + index: true, + required: true, + }, + avatar: { + type: { + filepath: String, + source: String, + }, + default: undefined, + }, + access_level: { + type: Number, + }, + file_ids: { type: [String], default: undefined }, + actions: { type: [String], default: undefined }, + }, + { + timestamps: true, + }, +); + +module.exports = assistantSchema; diff --git a/api/models/schema/convoSchema.js b/api/models/schema/convoSchema.js index a282287eccb..4810f68321a 100644 --- a/api/models/schema/convoSchema.js +++ b/api/models/schema/convoSchema.js @@ -55,7 +55,7 @@ if (process.env.MEILI_HOST && process.env.MEILI_MASTER_KEY) { }); } -convoSchema.index({ createdAt: 1 }); +convoSchema.index({ createdAt: 1, updatedAt: 1 }); const Conversation = mongoose.models.Conversation || mongoose.model('Conversation', convoSchema); diff --git a/api/models/schema/defaults.js b/api/models/schema/defaults.js index 39a6430f46b..b2ea3a12c70 100644 --- a/api/models/schema/defaults.js +++ b/api/models/schema/defaults.js @@ -11,152 +11,137 @@ const conversationPreset = { // for azureOpenAI, openAI, chatGPTBrowser only model: { type: String, - // default: null, required: false, }, // for azureOpenAI, openAI only chatGptLabel: { type: String, - // default: null, required: false, }, // for google only modelLabel: { type: String, - // default: null, required: false, }, promptPrefix: { type: String, - // default: null, required: false, }, temperature: { type: Number, - // default: 1, required: false, }, top_p: { type: Number, - // default: 1, required: false, }, // for google only topP: { type: Number, - // default: 0.95, required: false, }, topK: { type: Number, - // default: 40, required: false, }, maxOutputTokens: { type: Number, - // default: 1024, required: false, }, presence_penalty: { type: Number, - // default: 0, required: false, }, frequency_penalty: { type: Number, - // default: 0, required: false, }, // for bingai only jailbreak: { type: Boolean, - // default: false, }, context: { type: String, - // default: null, }, systemMessage: { type: String, - // default: null, }, toneStyle: { type: String, - // default: null, }, + file_ids: { type: [{ type: String }], default: undefined }, + // deprecated resendImages: { type: Boolean, }, + // files + resendFiles: { + type: Boolean, + }, imageDetail: { type: String, }, + /* assistants */ + assistant_id: { + type: String, + }, + instructions: { + type: String, + }, }; const agentOptions = { model: { type: String, - // default: null, required: false, }, // for azureOpenAI, openAI only chatGptLabel: { type: String, - // default: null, required: false, }, modelLabel: { type: String, - // default: null, required: false, }, promptPrefix: { type: String, - // default: null, required: false, }, temperature: { type: Number, - // default: 1, required: false, }, top_p: { type: Number, - // default: 1, required: false, }, // for google only topP: { type: Number, - // default: 0.95, required: false, }, topK: { type: Number, - // default: 40, required: false, }, maxOutputTokens: { type: Number, - // default: 1024, required: false, }, presence_penalty: { type: Number, - // default: 0, required: false, }, frequency_penalty: { type: Number, - // default: 0, required: false, }, context: { type: String, - // default: null, }, systemMessage: { type: String, - // default: null, }, }; diff --git a/api/models/schema/fileSchema.js b/api/models/schema/fileSchema.js index 471b7bfd70a..93a8815e53b 100644 --- a/api/models/schema/fileSchema.js +++ b/api/models/schema/fileSchema.js @@ -3,6 +3,8 @@ const mongoose = require('mongoose'); /** * @typedef {Object} MongoFile + * @property {mongoose.Schema.Types.ObjectId} [_id] - MongoDB Document ID + * @property {number} [__v] - MongoDB Version Key * @property {mongoose.Schema.Types.ObjectId} user - User ID * @property {string} [conversationId] - Optional conversation ID * @property {string} file_id - File identifier @@ -13,10 +15,15 @@ const mongoose = require('mongoose'); * @property {'file'} object - Type of object, always 'file' * @property {string} type - Type of file * @property {number} usage - Number of uses of the file + * @property {string} [context] - Context of the file origin + * @property {boolean} [embedded] - Whether or not the file is embedded in vector db + * @property {string} [model] - The model to identify the group region of the file (for Azure OpenAI hosting) * @property {string} [source] - The source of the file * @property {number} [width] - Optional width of the file * @property {number} [height] - Optional height of the file * @property {Date} [expiresAt] - Optional height of the file + * @property {Date} [createdAt] - Date when the file was created + * @property {Date} [updatedAt] - Date when the file was updated */ const fileSchema = mongoose.Schema( { @@ -57,10 +64,17 @@ const fileSchema = mongoose.Schema( required: true, default: 'file', }, + embedded: { + type: Boolean, + }, type: { type: String, required: true, }, + context: { + type: String, + // required: true, + }, usage: { type: Number, required: true, @@ -70,6 +84,9 @@ const fileSchema = mongoose.Schema( type: String, default: FileSources.local, }, + model: { + type: String, + }, width: Number, height: Number, expiresAt: { diff --git a/api/models/schema/messageSchema.js b/api/models/schema/messageSchema.js index 06da19e476d..fc745499fe5 100644 --- a/api/models/schema/messageSchema.js +++ b/api/models/schema/messageSchema.js @@ -17,6 +17,7 @@ const messageSchema = mongoose.Schema( user: { type: String, index: true, + required: true, default: null, }, model: { @@ -46,12 +47,10 @@ const messageSchema = mongoose.Schema( }, sender: { type: String, - required: true, meiliIndex: true, }, text: { type: String, - required: true, meiliIndex: true, }, summary: { @@ -103,6 +102,14 @@ const messageSchema = mongoose.Schema( default: undefined, }, plugins: { type: [{ type: mongoose.Schema.Types.Mixed }], default: undefined }, + content: { + type: [{ type: mongoose.Schema.Types.Mixed }], + default: undefined, + meiliIndex: true, + }, + thread_id: { + type: String, + }, }, { timestamps: true }, ); diff --git a/api/models/spendTokens.js b/api/models/spendTokens.js index fe3a2be87ae..e37aa41d0cc 100644 --- a/api/models/spendTokens.js +++ b/api/models/spendTokens.js @@ -1,4 +1,4 @@ -const Transaction = require('./Transaction'); +const { Transaction } = require('./Transaction'); const { logger } = require('~/config'); /** @@ -11,6 +11,7 @@ const { logger } = require('~/config'); * @param {String} txData.conversationId - The ID of the conversation. * @param {String} txData.model - The model name. * @param {String} txData.context - The context in which the transaction is made. + * @param {String} [txData.endpointTokenConfig] - The current endpoint token config. * @param {String} [txData.valueKey] - The value key (optional). * @param {Object} tokenUsage - The number of tokens used. * @param {Number} tokenUsage.promptTokens - The number of prompt tokens used. @@ -20,6 +21,15 @@ const { logger } = require('~/config'); */ const spendTokens = async (txData, tokenUsage) => { const { promptTokens, completionTokens } = tokenUsage; + logger.debug( + `[spendTokens] conversationId: ${txData.conversationId}${ + txData?.context ? ` | Context: ${txData?.context}` : '' + } | Token usage: `, + { + promptTokens, + completionTokens, + }, + ); let prompt, completion; try { if (promptTokens >= 0) { @@ -41,7 +51,16 @@ const spendTokens = async (txData, tokenUsage) => { rawAmount: -completionTokens, }); - logger.debug('[spendTokens] post-transaction', { prompt, completion }); + prompt && + completion && + logger.debug('[spendTokens] Transaction data record against balance:', { + user: prompt.user, + prompt: prompt.prompt, + promptRate: prompt.rate, + completion: completion.completion, + completionRate: completion.rate, + balance: completion.balance, + }); } catch (err) { logger.error('[spendTokens]', err); } diff --git a/api/models/tx.js b/api/models/tx.js index f6f3b7f5522..bc993290f44 100644 --- a/api/models/tx.js +++ b/api/models/tx.js @@ -3,6 +3,7 @@ const defaultRate = 6; /** * Mapping of model token sizes to their respective multipliers for prompt and completion. + * The rates are 1 USD per 1M tokens. * @type {Object.<string, {prompt: number, completion: number}>} */ const tokenValues = { @@ -12,6 +13,18 @@ const tokenValues = { '16k': { prompt: 3, completion: 4 }, 'gpt-3.5-turbo-1106': { prompt: 1, completion: 2 }, 'gpt-4-1106': { prompt: 10, completion: 30 }, + 'gpt-3.5-turbo-0125': { prompt: 0.5, completion: 1.5 }, + 'claude-3-opus': { prompt: 15, completion: 75 }, + 'claude-3-sonnet': { prompt: 3, completion: 15 }, + 'claude-3-haiku': { prompt: 0.25, completion: 1.25 }, + 'claude-2.1': { prompt: 8, completion: 24 }, + 'claude-2': { prompt: 8, completion: 24 }, + 'claude-': { prompt: 0.8, completion: 2.4 }, + 'command-r-plus': { prompt: 3, completion: 15 }, + 'command-r': { prompt: 0.5, completion: 1.5 }, + /* cohere doesn't have rates for the older command models, + so this was from https://artificialanalysis.ai/models/command-light/providers */ + command: { prompt: 0.38, completion: 0.38 }, }; /** @@ -29,16 +42,24 @@ const getValueKey = (model, endpoint) => { if (modelName.includes('gpt-3.5-turbo-16k')) { return '16k'; + } else if (modelName.includes('gpt-3.5-turbo-0125')) { + return 'gpt-3.5-turbo-0125'; } else if (modelName.includes('gpt-3.5-turbo-1106')) { return 'gpt-3.5-turbo-1106'; } else if (modelName.includes('gpt-3.5')) { return '4k'; } else if (modelName.includes('gpt-4-1106')) { return 'gpt-4-1106'; + } else if (modelName.includes('gpt-4-0125')) { + return 'gpt-4-1106'; + } else if (modelName.includes('gpt-4-turbo')) { + return 'gpt-4-1106'; } else if (modelName.includes('gpt-4-32k')) { return '32k'; } else if (modelName.includes('gpt-4')) { return '8k'; + } else if (tokenValues[modelName]) { + return modelName; } return undefined; @@ -53,9 +74,14 @@ const getValueKey = (model, endpoint) => { * @param {string} [params.tokenType] - The type of token (e.g., 'prompt' or 'completion'). * @param {string} [params.model] - The model name to derive the value key from if not provided. * @param {string} [params.endpoint] - The endpoint name to derive the value key from if not provided. + * @param {EndpointTokenConfig} [params.endpointTokenConfig] - The token configuration for the endpoint. * @returns {number} The multiplier for the given parameters, or a default value if not found. */ -const getMultiplier = ({ valueKey, tokenType, model, endpoint }) => { +const getMultiplier = ({ valueKey, tokenType, model, endpoint, endpointTokenConfig }) => { + if (endpointTokenConfig) { + return endpointTokenConfig?.[model]?.[tokenType] ?? defaultRate; + } + if (valueKey && tokenType) { return tokenValues[valueKey][tokenType] ?? defaultRate; } diff --git a/api/models/tx.spec.js b/api/models/tx.spec.js index 135298bf2b2..36533a11dd4 100644 --- a/api/models/tx.spec.js +++ b/api/models/tx.spec.js @@ -84,6 +84,15 @@ describe('getMultiplier', () => { expect(getMultiplier({ tokenType: 'completion', model: 'gpt-4-1106-vision-preview' })).toBe( tokenValues['gpt-4-1106'].completion, ); + expect(getMultiplier({ tokenType: 'completion', model: 'gpt-4-0125-preview' })).toBe( + tokenValues['gpt-4-1106'].completion, + ); + expect(getMultiplier({ tokenType: 'completion', model: 'gpt-4-turbo-vision-preview' })).toBe( + tokenValues['gpt-4-1106'].completion, + ); + expect(getMultiplier({ tokenType: 'completion', model: 'gpt-3.5-turbo-0125' })).toBe( + tokenValues['gpt-3.5-turbo-0125'].completion, + ); }); it('should return defaultRate if derived valueKey does not match any known patterns', () => { diff --git a/api/models/userMethods.js b/api/models/userMethods.js new file mode 100644 index 00000000000..c1ccce5b523 --- /dev/null +++ b/api/models/userMethods.js @@ -0,0 +1,46 @@ +const bcrypt = require('bcryptjs'); +const User = require('./User'); + +const hashPassword = async (password) => { + const hashedPassword = await new Promise((resolve, reject) => { + bcrypt.hash(password, 10, function (err, hash) { + if (err) { + reject(err); + } else { + resolve(hash); + } + }); + }); + + return hashedPassword; +}; + +/** + * Retrieve a user by ID and convert the found user document to a plain object. + * + * @param {string} userId - The ID of the user to find and return as a plain object. + * @returns {Promise<Object>} A plain object representing the user document, or `null` if no user is found. + */ +const getUser = async function (userId) { + return await User.findById(userId).lean(); +}; + +/** + * Update a user with new data without overwriting existing properties. + * + * @param {string} userId - The ID of the user to update. + * @param {Object} updateData - An object containing the properties to update. + * @returns {Promise<Object>} The updated user document as a plain object, or `null` if no user is found. + */ +const updateUser = async function (userId, updateData) { + return await User.findByIdAndUpdate(userId, updateData, { + new: true, + runValidators: true, + }).lean(); +}; + +module.exports = { + hashPassword, + updateUser, + getUser, +}; diff --git a/api/package.json b/api/package.json index 292a3f5a1c3..31df31f7c5f 100644 --- a/api/package.json +++ b/api/package.json @@ -1,13 +1,19 @@ { "name": "@librechat/backend", - "version": "0.6.6", + "version": "0.7.0", "description": "", "scripts": { "start": "echo 'please run this from the root directory'", "server-dev": "echo 'please run this from the root directory'", "test": "cross-env NODE_ENV=test jest", "b:test": "NODE_ENV=test bun jest", - "test:ci": "jest --ci" + "test:ci": "jest --ci", + "add-balance": "node ./add-balance.js", + "list-balances": "node ./list-balances.js", + "user-stats": "node ./user-stats.js", + "create-user": "node ./create-user.js", + "ban-user": "node ./ban-user.js", + "delete-user": "node ./delete-user.js" }, "repository": { "type": "git", @@ -25,17 +31,18 @@ "bugs": { "url": "https://github.com/danny-avila/LibreChat/issues" }, - "homepage": "https://github.com/danny-avila/LibreChat#readme", + "homepage": "https://librechat.ai", "dependencies": { - "@anthropic-ai/sdk": "^0.5.4", + "@anthropic-ai/sdk": "^0.16.1", "@azure/search-documents": "^12.0.0", "@keyv/mongo": "^2.1.8", "@keyv/redis": "^2.8.1", - "@langchain/google-genai": "^0.0.7", + "@langchain/community": "^0.0.17", + "@langchain/google-genai": "^0.0.8", "axios": "^1.3.4", "bcryptjs": "^2.4.3", "cheerio": "^1.0.0-rc.12", - "cohere-ai": "^6.0.0", + "cohere-ai": "^7.9.1", "connect-redis": "^7.1.0", "cookie": "^0.5.0", "cors": "^2.8.5", @@ -44,6 +51,7 @@ "express-mongo-sanitize": "^2.2.0", "express-rate-limit": "^6.9.0", "express-session": "^1.17.3", + "file-type": "^18.7.0", "firebase": "^10.6.0", "googleapis": "^126.0.1", "handlebars": "^4.7.7", @@ -57,13 +65,14 @@ "langchain": "^0.0.214", "librechat-data-provider": "*", "lodash": "^4.17.21", - "meilisearch": "^0.33.0", + "meilisearch": "^0.38.0", + "mime": "^3.0.0", "module-alias": "^2.2.3", "mongoose": "^7.1.1", "multer": "^1.4.5-lts.1", "nodejs-gpt": "^1.37.4", "nodemailer": "^6.9.4", - "openai": "^4.20.1", + "openai": "^4.29.0", "openai-chat-tokens": "^0.2.8", "openid-client": "^5.4.2", "passport": "^0.6.0", diff --git a/api/server/controllers/AskController.js b/api/server/controllers/AskController.js index 67d7c67e9f7..171e7aaae74 100644 --- a/api/server/controllers/AskController.js +++ b/api/server/controllers/AskController.js @@ -1,7 +1,8 @@ -const { getResponseSender } = require('librechat-data-provider'); -const { sendMessage, createOnProgress } = require('~/server/utils'); -const { saveMessage, getConvoTitle, getConvo } = require('~/models'); +const throttle = require('lodash/throttle'); +const { getResponseSender, Constants } = require('librechat-data-provider'); const { createAbortController, handleAbortError } = require('~/server/middleware'); +const { sendMessage, createOnProgress } = require('~/server/utils'); +const { saveMessage, getConvo } = require('~/models'); const { logger } = require('~/config'); const AskController = async (req, res, next, initializeClient, addTitle) => { @@ -16,13 +17,10 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { logger.debug('[AskController]', { text, conversationId, ...endpointOption }); - let metadata; let userMessage; let promptTokens; let userMessageId; let responseMessageId; - let lastSavedTimestamp = 0; - let saveDelay = 100; const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model, @@ -31,8 +29,6 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { const newConvo = !conversationId; const user = req.user.id; - const addMetadata = (data) => (metadata = data); - const getReqData = (data = {}) => { for (let key in data) { if (key === 'userMessage') { @@ -54,11 +50,8 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { const { client } = await initializeClient({ req, res, endpointOption }); const { onProgress: progressCallback, getPartialText } = createOnProgress({ - onProgress: ({ text: partialText }) => { - const currentTimestamp = Date.now(); - - if (currentTimestamp - lastSavedTimestamp > saveDelay) { - lastSavedTimestamp = currentTimestamp; + onProgress: throttle( + ({ text: partialText }) => { saveMessage({ messageId: responseMessageId, sender, @@ -70,12 +63,10 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { error: false, user, }); - } - - if (saveDelay < 500) { - saveDelay = 500; - } - }, + }, + 3000, + { trailing: false }, + ), }); getText = getPartialText; @@ -92,6 +83,20 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { const { abortController, onStart } = createAbortController(req, res, getAbortData); + res.on('close', () => { + logger.debug('[AskController] Request closed'); + if (!abortController) { + return; + } else if (abortController.signal.aborted) { + return; + } else if (abortController.requestCompleted) { + return; + } + + abortController.abort(); + logger.debug('[AskController] Request aborted on close'); + }); + const messageOptions = { user, parentMessageId, @@ -99,7 +104,6 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { overrideParentMessageId, getReqData, onStart, - addMetadata, abortController, onProgress: progressCallback.call(null, { res, @@ -114,22 +118,23 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { response.parentMessageId = overrideParentMessageId; } - if (metadata) { - response = { ...response, ...metadata }; - } - response.endpoint = endpointOption.endpoint; + const conversation = await getConvo(user, conversationId); + conversation.title = + conversation && !conversation.title ? null : conversation?.title || 'New Chat'; + if (client.options.attachments) { userMessage.files = client.options.attachments; + conversation.model = endpointOption.modelOptions.model; delete userMessage.image_urls; } if (!abortController.signal.aborted) { sendMessage(res, { - title: await getConvoTitle(user, conversationId), final: true, - conversation: await getConvo(user, conversationId), + conversation, + title: conversation.title, requestMessage: userMessage, responseMessage: response, }); @@ -140,7 +145,7 @@ const AskController = async (req, res, next, initializeClient, addTitle) => { await saveMessage(userMessage); - if (addTitle && parentMessageId === '00000000-0000-0000-0000-000000000000' && newConvo) { + if (addTitle && parentMessageId === Constants.NO_PARENT && newConvo) { addTitle(req, { text, response, diff --git a/api/server/controllers/AuthController.js b/api/server/controllers/AuthController.js index 921ba3d8388..ee1751442c1 100644 --- a/api/server/controllers/AuthController.js +++ b/api/server/controllers/AuthController.js @@ -76,14 +76,14 @@ const refreshController = async (req, res) => { } try { - let payload; - payload = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET); - const userId = payload.id; - const user = await User.findOne({ _id: userId }); + const payload = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET); + const user = await User.findOne({ _id: payload.id }); if (!user) { return res.status(401).redirect('/login'); } + const userId = payload.id; + if (process.env.NODE_ENV === 'CI') { const token = await setAuthTokens(userId, res); const userObj = user.toJSON(); @@ -118,6 +118,6 @@ module.exports = { getUserController, refreshController, registrationController, - resetPasswordRequestController, resetPasswordController, + resetPasswordRequestController, }; diff --git a/api/server/controllers/EditController.js b/api/server/controllers/EditController.js index 43b82e7193f..28a35185ffb 100644 --- a/api/server/controllers/EditController.js +++ b/api/server/controllers/EditController.js @@ -1,7 +1,8 @@ +const throttle = require('lodash/throttle'); const { getResponseSender } = require('librechat-data-provider'); -const { sendMessage, createOnProgress } = require('~/server/utils'); -const { saveMessage, getConvoTitle, getConvo } = require('~/models'); const { createAbortController, handleAbortError } = require('~/server/middleware'); +const { sendMessage, createOnProgress } = require('~/server/utils'); +const { saveMessage, getConvo } = require('~/models'); const { logger } = require('~/config'); const EditController = async (req, res, next, initializeClient) => { @@ -25,11 +26,8 @@ const EditController = async (req, res, next, initializeClient) => { ...endpointOption, }); - let metadata; let userMessage; let promptTokens; - let lastSavedTimestamp = 0; - let saveDelay = 100; const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model, @@ -38,7 +36,6 @@ const EditController = async (req, res, next, initializeClient) => { const userMessageId = parentMessageId; const user = req.user.id; - const addMetadata = (data) => (metadata = data); const getReqData = (data = {}) => { for (let key in data) { if (key === 'userMessage') { @@ -53,11 +50,8 @@ const EditController = async (req, res, next, initializeClient) => { const { onProgress: progressCallback, getPartialText } = createOnProgress({ generation, - onProgress: ({ text: partialText }) => { - const currentTimestamp = Date.now(); - - if (currentTimestamp - lastSavedTimestamp > saveDelay) { - lastSavedTimestamp = currentTimestamp; + onProgress: throttle( + ({ text: partialText }) => { saveMessage({ messageId: responseMessageId, sender, @@ -70,12 +64,10 @@ const EditController = async (req, res, next, initializeClient) => { error: false, user, }); - } - - if (saveDelay < 500) { - saveDelay = 500; - } - }, + }, + 3000, + { trailing: false }, + ), }); const getAbortData = () => ({ @@ -90,6 +82,20 @@ const EditController = async (req, res, next, initializeClient) => { const { abortController, onStart } = createAbortController(req, res, getAbortData); + res.on('close', () => { + logger.debug('[EditController] Request closed'); + if (!abortController) { + return; + } else if (abortController.signal.aborted) { + return; + } else if (abortController.requestCompleted) { + return; + } + + abortController.abort(); + logger.debug('[EditController] Request aborted on close'); + }); + try { const { client } = await initializeClient({ req, res, endpointOption }); @@ -104,7 +110,6 @@ const EditController = async (req, res, next, initializeClient) => { overrideParentMessageId, getReqData, onStart, - addMetadata, abortController, onProgress: progressCallback.call(null, { res, @@ -113,15 +118,19 @@ const EditController = async (req, res, next, initializeClient) => { }), }); - if (metadata) { - response = { ...response, ...metadata }; + const conversation = await getConvo(user, conversationId); + conversation.title = + conversation && !conversation.title ? null : conversation?.title || 'New Chat'; + + if (client.options.attachments) { + conversation.model = endpointOption.modelOptions.model; } if (!abortController.signal.aborted) { sendMessage(res, { - title: await getConvoTitle(user, conversationId), final: true, - conversation: await getConvo(user, conversationId), + conversation, + title: conversation.title, requestMessage: userMessage, responseMessage: response, }); diff --git a/api/server/controllers/EndpointController.js b/api/server/controllers/EndpointController.js index 5069bb33e0b..b99dd5eda9c 100644 --- a/api/server/controllers/EndpointController.js +++ b/api/server/controllers/EndpointController.js @@ -1,4 +1,4 @@ -const { CacheKeys } = require('librechat-data-provider'); +const { CacheKeys, EModelEndpoint, orderEndpointsConfig } = require('librechat-data-provider'); const { loadDefaultEndpointsConfig, loadConfigEndpoints } = require('~/server/services/Config'); const { getLogStores } = require('~/cache'); @@ -10,10 +10,23 @@ async function endpointController(req, res) { return; } - const defaultEndpointsConfig = await loadDefaultEndpointsConfig(); - const customConfigEndpoints = await loadConfigEndpoints(); + const defaultEndpointsConfig = await loadDefaultEndpointsConfig(req); + const customConfigEndpoints = await loadConfigEndpoints(req); - const endpointsConfig = { ...defaultEndpointsConfig, ...customConfigEndpoints }; + /** @type {TEndpointsConfig} */ + const mergedConfig = { ...defaultEndpointsConfig, ...customConfigEndpoints }; + if (mergedConfig[EModelEndpoint.assistants] && req.app.locals?.[EModelEndpoint.assistants]) { + const { disableBuilder, retrievalModels, capabilities, ..._rest } = + req.app.locals[EModelEndpoint.assistants]; + mergedConfig[EModelEndpoint.assistants] = { + ...mergedConfig[EModelEndpoint.assistants], + retrievalModels, + disableBuilder, + capabilities, + }; + } + + const endpointsConfig = orderEndpointsConfig(mergedConfig); await cache.set(CacheKeys.ENDPOINT_CONFIG, endpointsConfig); res.send(JSON.stringify(endpointsConfig)); diff --git a/api/server/controllers/ErrorController.js b/api/server/controllers/ErrorController.js index 1308527b8cd..234cb90fb37 100644 --- a/api/server/controllers/ErrorController.js +++ b/api/server/controllers/ErrorController.js @@ -3,23 +3,24 @@ const { logger } = require('~/config'); //handle duplicates const handleDuplicateKeyError = (err, res) => { logger.error('Duplicate key error:', err.keyValue); - const field = Object.keys(err.keyValue); + const field = `${JSON.stringify(Object.keys(err.keyValue))}`; const code = 409; - const error = `An document with that ${field} already exists.`; - res.status(code).send({ messages: error, fields: field }); + res + .status(code) + .send({ messages: `An document with that ${field} already exists.`, fields: field }); }; //handle validation errors const handleValidationError = (err, res) => { logger.error('Validation error:', err.errors); let errors = Object.values(err.errors).map((el) => el.message); - let fields = Object.values(err.errors).map((el) => el.path); + let fields = `${JSON.stringify(Object.values(err.errors).map((el) => el.path))}`; let code = 400; if (errors.length > 1) { - const formattedErrors = errors.join(' '); - res.status(code).send({ messages: formattedErrors, fields: fields }); + errors = errors.join(' '); + res.status(code).send({ messages: `${JSON.stringify(errors)}`, fields: fields }); } else { - res.status(code).send({ messages: errors, fields: fields }); + res.status(code).send({ messages: `${JSON.stringify(errors)}`, fields: fields }); } }; diff --git a/api/server/controllers/ModelController.js b/api/server/controllers/ModelController.js index 2d23961e154..022ece4c103 100644 --- a/api/server/controllers/ModelController.js +++ b/api/server/controllers/ModelController.js @@ -2,20 +2,39 @@ const { CacheKeys } = require('librechat-data-provider'); const { loadDefaultModels, loadConfigModels } = require('~/server/services/Config'); const { getLogStores } = require('~/cache'); -async function modelController(req, res) { +const getModelsConfig = async (req) => { + const cache = getLogStores(CacheKeys.CONFIG_STORE); + let modelsConfig = await cache.get(CacheKeys.MODELS_CONFIG); + if (!modelsConfig) { + modelsConfig = await loadModels(req); + } + + return modelsConfig; +}; + +/** + * Loads the models from the config. + * @param {Express.Request} req - The Express request object. + * @returns {Promise<TModelsConfig>} The models config. + */ +async function loadModels(req) { const cache = getLogStores(CacheKeys.CONFIG_STORE); const cachedModelsConfig = await cache.get(CacheKeys.MODELS_CONFIG); if (cachedModelsConfig) { - res.send(cachedModelsConfig); - return; + return cachedModelsConfig; } - const defaultModelsConfig = await loadDefaultModels(); - const customModelsConfig = await loadConfigModels(); + const defaultModelsConfig = await loadDefaultModels(req); + const customModelsConfig = await loadConfigModels(req); const modelConfig = { ...defaultModelsConfig, ...customModelsConfig }; await cache.set(CacheKeys.MODELS_CONFIG, modelConfig); + return modelConfig; +} + +async function modelController(req, res) { + const modelConfig = await loadModels(req); res.send(modelConfig); } -module.exports = modelController; +module.exports = { modelController, loadModels, getModelsConfig }; diff --git a/api/server/controllers/PluginController.js b/api/server/controllers/PluginController.js index c37b36974e0..803d89923ba 100644 --- a/api/server/controllers/PluginController.js +++ b/api/server/controllers/PluginController.js @@ -1,9 +1,14 @@ -const path = require('path'); const { promises: fs } = require('fs'); const { CacheKeys } = require('librechat-data-provider'); const { addOpenAPISpecs } = require('~/app/clients/tools/util/addOpenAPISpecs'); const { getLogStores } = require('~/cache'); +/** + * Filters out duplicate plugins from the list of plugins. + * + * @param {TPlugin[]} plugins The list of plugins to filter. + * @returns {TPlugin[]} The list of plugins with duplicates removed. + */ const filterUniquePlugins = (plugins) => { const seen = new Set(); return plugins.filter((plugin) => { @@ -13,17 +18,31 @@ const filterUniquePlugins = (plugins) => { }); }; +/** + * Determines if a plugin is authenticated by checking if all required authentication fields have non-empty values. + * Supports alternate authentication fields, allowing validation against multiple possible environment variables. + * + * @param {TPlugin} plugin The plugin object containing the authentication configuration. + * @returns {boolean} True if the plugin is authenticated for all required fields, false otherwise. + */ const isPluginAuthenticated = (plugin) => { if (!plugin.authConfig || plugin.authConfig.length === 0) { return false; } return plugin.authConfig.every((authFieldObj) => { - const envValue = process.env[authFieldObj.authField]; - if (envValue === 'user_provided') { - return false; + const authFieldOptions = authFieldObj.authField.split('||'); + let isFieldAuthenticated = false; + + for (const fieldOption of authFieldOptions) { + const envValue = process.env[fieldOption]; + if (envValue && envValue.trim() !== '' && envValue !== 'user_provided') { + isFieldAuthenticated = true; + break; + } } - return envValue && envValue.trim() !== ''; + + return isFieldAuthenticated; }); }; @@ -36,12 +55,10 @@ const getAvailablePluginsController = async (req, res) => { return; } - const manifestFile = await fs.readFile( - path.join(__dirname, '..', '..', 'app', 'clients', 'tools', 'manifest.json'), - 'utf8', - ); + const pluginManifest = await fs.readFile(req.app.locals.paths.pluginManifest, 'utf8'); - const jsonData = JSON.parse(manifestFile); + const jsonData = JSON.parse(pluginManifest); + /** @type {TPlugin[]} */ const uniquePlugins = filterUniquePlugins(jsonData); const authenticatedPlugins = uniquePlugins.map((plugin) => { if (isPluginAuthenticated(plugin)) { @@ -58,6 +75,53 @@ const getAvailablePluginsController = async (req, res) => { } }; +/** + * Retrieves and returns a list of available tools, either from a cache or by reading a plugin manifest file. + * + * This function first attempts to retrieve the list of tools from a cache. If the tools are not found in the cache, + * it reads a plugin manifest file, filters for unique plugins, and determines if each plugin is authenticated. + * Only plugins that are marked as available in the application's local state are included in the final list. + * The resulting list of tools is then cached and sent to the client. + * + * @param {object} req - The request object, containing information about the HTTP request. + * @param {object} res - The response object, used to send back the desired HTTP response. + * @returns {Promise<void>} A promise that resolves when the function has completed. + */ +const getAvailableTools = async (req, res) => { + try { + const cache = getLogStores(CacheKeys.CONFIG_STORE); + const cachedTools = await cache.get(CacheKeys.TOOLS); + if (cachedTools) { + res.status(200).json(cachedTools); + return; + } + + const pluginManifest = await fs.readFile(req.app.locals.paths.pluginManifest, 'utf8'); + + const jsonData = JSON.parse(pluginManifest); + /** @type {TPlugin[]} */ + const uniquePlugins = filterUniquePlugins(jsonData); + + const authenticatedPlugins = uniquePlugins.map((plugin) => { + if (isPluginAuthenticated(plugin)) { + return { ...plugin, authenticated: true }; + } else { + return plugin; + } + }); + + const tools = authenticatedPlugins.filter( + (plugin) => req.app.locals.availableTools[plugin.pluginKey] !== undefined, + ); + + await cache.set(CacheKeys.TOOLS, tools); + res.status(200).json(tools); + } catch (error) { + res.status(500).json({ message: error.message }); + } +}; + module.exports = { + getAvailableTools, getAvailablePluginsController, }; diff --git a/api/server/controllers/UserController.js b/api/server/controllers/UserController.js index fa08cd54529..ac20ca627a1 100644 --- a/api/server/controllers/UserController.js +++ b/api/server/controllers/UserController.js @@ -8,16 +8,19 @@ const getUserController = async (req, res) => { const updateUserPluginsController = async (req, res) => { const { user } = req; - const { pluginKey, action, auth } = req.body; + const { pluginKey, action, auth, isAssistantTool } = req.body; let authService; try { - const userPluginsService = await updateUserPluginsService(user, pluginKey, action); + if (!isAssistantTool) { + const userPluginsService = await updateUserPluginsService(user, pluginKey, action); - if (userPluginsService instanceof Error) { - logger.error('[userPluginsService]', userPluginsService); - const { status, message } = userPluginsService; - res.status(status).send({ message }); + if (userPluginsService instanceof Error) { + logger.error('[userPluginsService]', userPluginsService); + const { status, message } = userPluginsService; + res.status(status).send({ message }); + } } + if (auth) { const keys = Object.keys(auth); const values = Object.values(auth); diff --git a/api/server/index.js b/api/server/index.js index 86806b59146..4e85c508010 100644 --- a/api/server/index.js +++ b/api/server/index.js @@ -2,15 +2,18 @@ require('dotenv').config(); const path = require('path'); require('module-alias')({ base: path.resolve(__dirname, '..') }); const cors = require('cors'); +const axios = require('axios'); const express = require('express'); const passport = require('passport'); const mongoSanitize = require('express-mongo-sanitize'); +const validateImageRequest = require('./middleware/validateImageRequest'); const errorController = require('./controllers/ErrorController'); const { jwtLogin, passportLogin } = require('~/strategies'); const configureSocialLogins = require('./socialLogins'); const { connectDb, indexSync } = require('~/lib/db'); const AppService = require('./services/AppService'); const noIndex = require('./middleware/noIndex'); +const { isEnabled } = require('~/server/utils'); const { logger } = require('~/config'); const routes = require('./routes'); @@ -21,13 +24,19 @@ const port = Number(PORT) || 3080; const host = HOST || 'localhost'; const startServer = async () => { + if (typeof Bun !== 'undefined') { + axios.defaults.headers.common['Accept-Encoding'] = 'gzip'; + } await connectDb(); logger.info('Connected to MongoDB'); await indexSync(); const app = express(); + app.disable('x-powered-by'); await AppService(app); + app.get('/health', (_req, res) => res.status(200).send('OK')); + // Middleware app.use(noIndex); app.use(errorController); @@ -35,7 +44,8 @@ const startServer = async () => { app.use(mongoSanitize()); app.use(express.urlencoded({ extended: true, limit: '3mb' })); app.use(express.static(app.locals.paths.dist)); - app.use(express.static(app.locals.paths.publicPath)); + app.use(express.static(app.locals.paths.fonts)); + app.use(express.static(app.locals.paths.assets)); app.set('trust proxy', 1); // trust first proxy app.use(cors()); @@ -50,7 +60,7 @@ const startServer = async () => { passport.use(await jwtLogin()); passport.use(passportLogin()); - if (ALLOW_SOCIAL_LOGIN?.toLowerCase() === 'true') { + if (isEnabled(ALLOW_SOCIAL_LOGIN)) { configureSocialLogins(app); } @@ -73,7 +83,8 @@ const startServer = async () => { app.use('/api/plugins', routes.plugins); app.use('/api/config', routes.config); app.use('/api/assistants', routes.assistants); - app.use('/api/files', routes.files); + app.use('/api/files', await routes.files.initialize()); + app.use('/images/', validateImageRequest, routes.staticRoute); app.use((req, res) => { res.status(404).sendFile(path.join(app.locals.paths.dist, 'index.html')); diff --git a/api/server/middleware/abortMiddleware.js b/api/server/middleware/abortMiddleware.js index cc9b9fc0513..a2be50ee82d 100644 --- a/api/server/middleware/abortMiddleware.js +++ b/api/server/middleware/abortMiddleware.js @@ -1,18 +1,24 @@ +const { EModelEndpoint } = require('librechat-data-provider'); const { sendMessage, sendError, countTokens, isEnabled } = require('~/server/utils'); const { saveMessage, getConvo, getConvoTitle } = require('~/models'); const clearPendingReq = require('~/cache/clearPendingReq'); const abortControllers = require('./abortControllers'); const { redactMessage } = require('~/config/parsers'); const spendTokens = require('~/models/spendTokens'); +const { abortRun } = require('./abortRun'); const { logger } = require('~/config'); async function abortMessage(req, res) { - let { abortKey, conversationId } = req.body; + let { abortKey, conversationId, endpoint } = req.body; if (!abortKey && conversationId) { abortKey = conversationId; } + if (endpoint === EModelEndpoint.assistants) { + return await abortRun(req, res); + } + if (!abortControllers.has(abortKey) && !res.headersSent) { return res.status(204).send({ message: 'Request not found' }); } @@ -104,7 +110,7 @@ const handleAbortError = async (res, req, error, data) => { } const respondWithError = async (partialText) => { - const options = { + let options = { sender, messageId, conversationId, @@ -115,7 +121,8 @@ const handleAbortError = async (res, req, error, data) => { }; if (partialText) { - options.overrideProps = { + options = { + ...options, error: false, unfinished: true, text: partialText, diff --git a/api/server/middleware/abortRun.js b/api/server/middleware/abortRun.js new file mode 100644 index 00000000000..6db6329d44c --- /dev/null +++ b/api/server/middleware/abortRun.js @@ -0,0 +1,92 @@ +const { CacheKeys, RunStatus, isUUID } = require('librechat-data-provider'); +const { initializeClient } = require('~/server/services/Endpoints/assistants'); +const { checkMessageGaps, recordUsage } = require('~/server/services/Threads'); +const { getConvo } = require('~/models/Conversation'); +const getLogStores = require('~/cache/getLogStores'); +const { sendMessage } = require('~/server/utils'); +const { logger } = require('~/config'); + +const three_minutes = 1000 * 60 * 3; + +async function abortRun(req, res) { + res.setHeader('Content-Type', 'application/json'); + const { abortKey } = req.body; + const [conversationId, latestMessageId] = abortKey.split(':'); + const conversation = await getConvo(req.user.id, conversationId); + + if (conversation?.model) { + req.body.model = conversation.model; + } + + if (!isUUID.safeParse(conversationId).success) { + logger.error('[abortRun] Invalid conversationId', { conversationId }); + return res.status(400).send({ message: 'Invalid conversationId' }); + } + + const cacheKey = `${req.user.id}:${conversationId}`; + const cache = getLogStores(CacheKeys.ABORT_KEYS); + const runValues = await cache.get(cacheKey); + const [thread_id, run_id] = runValues.split(':'); + + if (!run_id) { + logger.warn('[abortRun] Couldn\'t find run for cancel request', { thread_id }); + return res.status(204).send({ message: 'Run not found' }); + } else if (run_id === 'cancelled') { + logger.warn('[abortRun] Run already cancelled', { thread_id }); + return res.status(204).send({ message: 'Run already cancelled' }); + } + + let runMessages = []; + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + + try { + await cache.set(cacheKey, 'cancelled', three_minutes); + const cancelledRun = await openai.beta.threads.runs.cancel(thread_id, run_id); + logger.debug('[abortRun] Cancelled run:', cancelledRun); + } catch (error) { + logger.error('[abortRun] Error cancelling run', error); + if ( + error?.message?.includes(RunStatus.CANCELLED) || + error?.message?.includes(RunStatus.CANCELLING) + ) { + return res.end(); + } + } + + try { + const run = await openai.beta.threads.runs.retrieve(thread_id, run_id); + await recordUsage({ + ...run.usage, + model: run.model, + user: req.user.id, + conversationId, + }); + } catch (error) { + logger.error('[abortRun] Error fetching or processing run', error); + } + + runMessages = await checkMessageGaps({ + openai, + latestMessageId, + thread_id, + run_id, + conversationId, + }); + + const finalEvent = { + final: true, + conversation, + runMessages, + }; + + if (res.headersSent && finalEvent) { + return sendMessage(res, finalEvent); + } + + res.json(finalEvent); +} + +module.exports = { + abortRun, +}; diff --git a/api/server/middleware/buildEndpointOption.js b/api/server/middleware/buildEndpointOption.js index 91d0caceaaf..e0ae6c8534d 100644 --- a/api/server/middleware/buildEndpointOption.js +++ b/api/server/middleware/buildEndpointOption.js @@ -1,6 +1,8 @@ const { parseConvo, EModelEndpoint } = require('librechat-data-provider'); -const { processFiles } = require('~/server/services/Files/process'); +const { getModelsConfig } = require('~/server/controllers/ModelController'); +const assistants = require('~/server/services/Endpoints/assistants'); const gptPlugins = require('~/server/services/Endpoints/gptPlugins'); +const { processFiles } = require('~/server/services/Files/process'); const anthropic = require('~/server/services/Endpoints/anthropic'); const openAI = require('~/server/services/Endpoints/openAI'); const custom = require('~/server/services/Endpoints/custom'); @@ -13,9 +15,10 @@ const buildFunction = { [EModelEndpoint.azureOpenAI]: openAI.buildOptions, [EModelEndpoint.anthropic]: anthropic.buildOptions, [EModelEndpoint.gptPlugins]: gptPlugins.buildOptions, + [EModelEndpoint.assistants]: assistants.buildOptions, }; -function buildEndpointOption(req, res, next) { +async function buildEndpointOption(req, res, next) { const { endpoint, endpointType } = req.body; const parsedBody = parseConvo({ endpoint, endpointType, conversation: req.body }); req.body.endpointOption = buildFunction[endpointType ?? endpoint]( @@ -23,6 +26,10 @@ function buildEndpointOption(req, res, next) { parsedBody, endpointType, ); + + const modelsConfig = await getModelsConfig(req); + req.body.endpointOption.modelsConfig = modelsConfig; + if (req.body.files) { // hold the promise req.body.endpointOption.attachments = processFiles(req.body.files); diff --git a/api/server/middleware/denyRequest.js b/api/server/middleware/denyRequest.js index 8000aa2b107..37952176bfa 100644 --- a/api/server/middleware/denyRequest.js +++ b/api/server/middleware/denyRequest.js @@ -1,7 +1,7 @@ const crypto = require('crypto'); -const { saveMessage } = require('~/models'); +const { getResponseSender, Constants } = require('librechat-data-provider'); const { sendMessage, sendError } = require('~/server/utils'); -const { getResponseSender } = require('librechat-data-provider'); +const { saveMessage } = require('~/models'); /** * Denies a request by sending an error message and optionally saves the user's message. @@ -38,8 +38,7 @@ const denyRequest = async (req, res, errorMessage) => { }; sendMessage(res, { message: userMessage, created: true }); - const shouldSaveMessage = - _convoId && parentMessageId && parentMessageId !== '00000000-0000-0000-0000-000000000000'; + const shouldSaveMessage = _convoId && parentMessageId && parentMessageId !== Constants.NO_PARENT; if (shouldSaveMessage) { await saveMessage({ ...userMessage, user: req.user.id }); diff --git a/api/server/middleware/index.js b/api/server/middleware/index.js index 77afd971650..b9960a237af 100644 --- a/api/server/middleware/index.js +++ b/api/server/middleware/index.js @@ -3,7 +3,9 @@ const checkBan = require('./checkBan'); const uaParser = require('./uaParser'); const setHeaders = require('./setHeaders'); const loginLimiter = require('./loginLimiter'); +const validateModel = require('./validateModel'); const requireJwtAuth = require('./requireJwtAuth'); +const uploadLimiters = require('./uploadLimiters'); const registerLimiter = require('./registerLimiter'); const messageLimiters = require('./messageLimiters'); const requireLocalAuth = require('./requireLocalAuth'); @@ -12,10 +14,12 @@ const concurrentLimiter = require('./concurrentLimiter'); const validateMessageReq = require('./validateMessageReq'); const buildEndpointOption = require('./buildEndpointOption'); const validateRegistration = require('./validateRegistration'); +const validateImageRequest = require('./validateImageRequest'); const moderateText = require('./moderateText'); const noIndex = require('./noIndex'); module.exports = { + ...uploadLimiters, ...abortMiddleware, ...messageLimiters, checkBan, @@ -30,6 +34,8 @@ module.exports = { validateMessageReq, buildEndpointOption, validateRegistration, + validateImageRequest, + validateModel, moderateText, noIndex, }; diff --git a/api/server/middleware/moderateText.js b/api/server/middleware/moderateText.js index c4bfd8a13ae..40bc5e9430b 100644 --- a/api/server/middleware/moderateText.js +++ b/api/server/middleware/moderateText.js @@ -1,5 +1,6 @@ const axios = require('axios'); const denyRequest = require('./denyRequest'); +const { logger } = require('~/config'); async function moderateText(req, res, next) { if (process.env.OPENAI_MODERATION === 'true') { @@ -28,7 +29,7 @@ async function moderateText(req, res, next) { return await denyRequest(req, res, errorMessage); } } catch (error) { - console.error('Error in moderateText:', error); + logger.error('Error in moderateText:', error); const errorMessage = 'error in moderation check'; return await denyRequest(req, res, errorMessage); } diff --git a/api/server/middleware/uploadLimiters.js b/api/server/middleware/uploadLimiters.js new file mode 100644 index 00000000000..71af164fde4 --- /dev/null +++ b/api/server/middleware/uploadLimiters.js @@ -0,0 +1,75 @@ +const rateLimit = require('express-rate-limit'); +const { ViolationTypes } = require('librechat-data-provider'); +const logViolation = require('~/cache/logViolation'); + +const getEnvironmentVariables = () => { + const FILE_UPLOAD_IP_MAX = parseInt(process.env.FILE_UPLOAD_IP_MAX) || 100; + const FILE_UPLOAD_IP_WINDOW = parseInt(process.env.FILE_UPLOAD_IP_WINDOW) || 15; + const FILE_UPLOAD_USER_MAX = parseInt(process.env.FILE_UPLOAD_USER_MAX) || 50; + const FILE_UPLOAD_USER_WINDOW = parseInt(process.env.FILE_UPLOAD_USER_WINDOW) || 15; + + const fileUploadIpWindowMs = FILE_UPLOAD_IP_WINDOW * 60 * 1000; + const fileUploadIpMax = FILE_UPLOAD_IP_MAX; + const fileUploadIpWindowInMinutes = fileUploadIpWindowMs / 60000; + + const fileUploadUserWindowMs = FILE_UPLOAD_USER_WINDOW * 60 * 1000; + const fileUploadUserMax = FILE_UPLOAD_USER_MAX; + const fileUploadUserWindowInMinutes = fileUploadUserWindowMs / 60000; + + return { + fileUploadIpWindowMs, + fileUploadIpMax, + fileUploadIpWindowInMinutes, + fileUploadUserWindowMs, + fileUploadUserMax, + fileUploadUserWindowInMinutes, + }; +}; + +const createFileUploadHandler = (ip = true) => { + const { + fileUploadIpMax, + fileUploadIpWindowInMinutes, + fileUploadUserMax, + fileUploadUserWindowInMinutes, + } = getEnvironmentVariables(); + + return async (req, res) => { + const type = ViolationTypes.FILE_UPLOAD_LIMIT; + const errorMessage = { + type, + max: ip ? fileUploadIpMax : fileUploadUserMax, + limiter: ip ? 'ip' : 'user', + windowInMinutes: ip ? fileUploadIpWindowInMinutes : fileUploadUserWindowInMinutes, + }; + + await logViolation(req, res, type, errorMessage); + res.status(429).json({ message: 'Too many file upload requests. Try again later' }); + }; +}; + +const createFileLimiters = () => { + const { fileUploadIpWindowMs, fileUploadIpMax, fileUploadUserWindowMs, fileUploadUserMax } = + getEnvironmentVariables(); + + const fileUploadIpLimiter = rateLimit({ + windowMs: fileUploadIpWindowMs, + max: fileUploadIpMax, + handler: createFileUploadHandler(), + }); + + const fileUploadUserLimiter = rateLimit({ + windowMs: fileUploadUserWindowMs, + max: fileUploadUserMax, + handler: createFileUploadHandler(false), + keyGenerator: function (req) { + return req.user?.id; // Use the user ID or NULL if not available + }, + }); + + return { fileUploadIpLimiter, fileUploadUserLimiter }; +}; + +module.exports = { + createFileLimiters, +}; diff --git a/api/server/middleware/validateImageRequest.js b/api/server/middleware/validateImageRequest.js new file mode 100644 index 00000000000..03482b4b118 --- /dev/null +++ b/api/server/middleware/validateImageRequest.js @@ -0,0 +1,37 @@ +const cookies = require('cookie'); +const jwt = require('jsonwebtoken'); +const { logger } = require('~/config'); + +/** + * Middleware to validate image request + */ +function validateImageRequest(req, res, next) { + const refreshToken = req.headers.cookie ? cookies.parse(req.headers.cookie).refreshToken : null; + if (!refreshToken) { + logger.warn('[validateImageRequest] Refresh token not provided'); + return res.status(401).send('Unauthorized'); + } + + let payload; + try { + payload = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET); + } catch (err) { + logger.warn('[validateImageRequest]', err); + return res.status(403).send('Access Denied'); + } + + const currentTimeInSeconds = Math.floor(Date.now() / 1000); + if (payload.exp < currentTimeInSeconds) { + logger.warn('[validateImageRequest] Refresh token expired'); + return res.status(403).send('Access Denied'); + } + + if (req.path.includes(payload.id)) { + logger.debug('[validateImageRequest] Image request validated'); + next(); + } else { + res.status(403).send('Access Denied'); + } +} + +module.exports = validateImageRequest; diff --git a/api/server/middleware/validateModel.js b/api/server/middleware/validateModel.js new file mode 100644 index 00000000000..dacbb826297 --- /dev/null +++ b/api/server/middleware/validateModel.js @@ -0,0 +1,47 @@ +const { ViolationTypes } = require('librechat-data-provider'); +const { getModelsConfig } = require('~/server/controllers/ModelController'); +const { handleError } = require('~/server/utils'); +const { logViolation } = require('~/cache'); +/** + * Validates the model of the request. + * + * @async + * @param {Express.Request} req - The Express request object. + * @param {Express.Response} res - The Express response object. + * @param {Function} next - The Express next function. + */ +const validateModel = async (req, res, next) => { + const { model, endpoint } = req.body; + if (!model) { + return handleError(res, { text: 'Model not provided' }); + } + + const modelsConfig = await getModelsConfig(req); + + if (!modelsConfig) { + return handleError(res, { text: 'Models not loaded' }); + } + + const availableModels = modelsConfig[endpoint]; + if (!availableModels) { + return handleError(res, { text: 'Endpoint models not loaded' }); + } + + let validModel = !!availableModels.find((availableModel) => availableModel === model); + + if (validModel) { + return next(); + } + + const { ILLEGAL_MODEL_REQ_SCORE: score = 5 } = process.env ?? {}; + + const type = ViolationTypes.ILLEGAL_MODEL_REQUEST; + const errorMessage = { + type, + }; + + await logViolation(req, res, type, errorMessage, score); + return handleError(res, { text: 'Illegal model request' }); +}; + +module.exports = validateModel; diff --git a/api/server/routes/__tests__/config.spec.js b/api/server/routes/__tests__/config.spec.js index 4833b83d105..bc3742dfffc 100644 --- a/api/server/routes/__tests__/config.spec.js +++ b/api/server/routes/__tests__/config.spec.js @@ -1,7 +1,9 @@ const request = require('supertest'); const express = require('express'); const routes = require('../'); +// file deepcode ignore UseCsurfForExpress/test: test const app = express(); +app.disable('x-powered-by'); app.use('/api/config', routes.config); afterEach(() => { @@ -54,13 +56,14 @@ describe.skip('GET /', () => { expect(response.statusCode).toBe(200); expect(response.body).toEqual({ appTitle: 'Test Title', - googleLoginEnabled: true, + socialLogins: ['google', 'facebook', 'openid', 'github', 'discord'], + discordLoginEnabled: true, facebookLoginEnabled: true, + githubLoginEnabled: true, + googleLoginEnabled: true, openidLoginEnabled: true, openidLabel: 'Test OpenID', openidImageUrl: 'http://test-server.com', - githubLoginEnabled: true, - discordLoginEnabled: true, serverDomain: 'http://test-server.com', emailLoginEnabled: 'true', registrationEnabled: 'true', diff --git a/api/server/routes/ask/anthropic.js b/api/server/routes/ask/anthropic.js index e0ea0f9857f..a08d1d25705 100644 --- a/api/server/routes/ask/anthropic.js +++ b/api/server/routes/ask/anthropic.js @@ -1,9 +1,10 @@ const express = require('express'); const AskController = require('~/server/controllers/AskController'); -const { initializeClient } = require('~/server/services/Endpoints/anthropic'); +const { addTitle, initializeClient } = require('~/server/services/Endpoints/anthropic'); const { setHeaders, handleAbort, + validateModel, validateEndpoint, buildEndpointOption, } = require('~/server/middleware'); @@ -12,8 +13,15 @@ const router = express.Router(); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await AskController(req, res, next, initializeClient); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await AskController(req, res, next, initializeClient, addTitle); + }, +); module.exports = router; diff --git a/api/server/routes/ask/askChatGPTBrowser.js b/api/server/routes/ask/askChatGPTBrowser.js index 34f1096a871..4ce1770b8ed 100644 --- a/api/server/routes/ask/askChatGPTBrowser.js +++ b/api/server/routes/ask/askChatGPTBrowser.js @@ -1,5 +1,6 @@ const crypto = require('crypto'); const express = require('express'); +const { Constants } = require('librechat-data-provider'); const { saveMessage, getConvoTitle, saveConvo, getConvo } = require('~/models'); const { handleError, sendMessage, createOnProgress, handleText } = require('~/server/utils'); const { setHeaders } = require('~/server/middleware'); @@ -27,7 +28,7 @@ router.post('/', setHeaders, async (req, res) => { const conversationId = oldConversationId || crypto.randomUUID(); const isNewConversation = !oldConversationId; const userMessageId = crypto.randomUUID(); - const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000'; + const userParentMessageId = parentMessageId || Constants.NO_PARENT; const userMessage = { messageId: userMessageId, sender: 'User', @@ -209,7 +210,7 @@ const ask = async ({ }); res.end(); - if (userParentMessageId == '00000000-0000-0000-0000-000000000000') { + if (userParentMessageId == Constants.NO_PARENT) { // const title = await titleConvo({ endpoint: endpointOption?.endpoint, text, response: responseMessage }); const title = await response.details.title; await saveConvo(user, { diff --git a/api/server/routes/ask/bingAI.js b/api/server/routes/ask/bingAI.js index 1281b56ae35..916cda4b10f 100644 --- a/api/server/routes/ask/bingAI.js +++ b/api/server/routes/ask/bingAI.js @@ -1,5 +1,6 @@ -const express = require('express'); const crypto = require('crypto'); +const express = require('express'); +const { Constants } = require('librechat-data-provider'); const { handleError, sendMessage, createOnProgress, handleText } = require('~/server/utils'); const { saveMessage, getConvoTitle, saveConvo, getConvo } = require('~/models'); const { setHeaders } = require('~/server/middleware'); @@ -28,7 +29,7 @@ router.post('/', setHeaders, async (req, res) => { const conversationId = oldConversationId || crypto.randomUUID(); const isNewConversation = !oldConversationId; const userMessageId = messageId; - const userParentMessageId = parentMessageId || '00000000-0000-0000-0000-000000000000'; + const userParentMessageId = parentMessageId || Constants.NO_PARENT; let userMessage = { messageId: userMessageId, sender: 'User', @@ -238,7 +239,7 @@ const ask = async ({ }); res.end(); - if (userParentMessageId == '00000000-0000-0000-0000-000000000000') { + if (userParentMessageId == Constants.NO_PARENT) { const title = await titleConvoBing({ text, response: responseMessage, diff --git a/api/server/routes/ask/custom.js b/api/server/routes/ask/custom.js index ef979bf0000..668a9902cb9 100644 --- a/api/server/routes/ask/custom.js +++ b/api/server/routes/ask/custom.js @@ -5,6 +5,7 @@ const { addTitle } = require('~/server/services/Endpoints/openAI'); const { handleAbort, setHeaders, + validateModel, validateEndpoint, buildEndpointOption, } = require('~/server/middleware'); @@ -13,8 +14,15 @@ const router = express.Router(); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await AskController(req, res, next, initializeClient, addTitle); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await AskController(req, res, next, initializeClient, addTitle); + }, +); module.exports = router; diff --git a/api/server/routes/ask/google.js b/api/server/routes/ask/google.js index 78c648495ff..b5425d67649 100644 --- a/api/server/routes/ask/google.js +++ b/api/server/routes/ask/google.js @@ -4,6 +4,7 @@ const { initializeClient } = require('~/server/services/Endpoints/google'); const { setHeaders, handleAbort, + validateModel, validateEndpoint, buildEndpointOption, } = require('~/server/middleware'); @@ -12,8 +13,15 @@ const router = express.Router(); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await AskController(req, res, next, initializeClient); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await AskController(req, res, next, initializeClient); + }, +); module.exports = router; diff --git a/api/server/routes/ask/gptPlugins.js b/api/server/routes/ask/gptPlugins.js index 85616cd1b31..f93a5a953bb 100644 --- a/api/server/routes/ask/gptPlugins.js +++ b/api/server/routes/ask/gptPlugins.js @@ -1,81 +1,88 @@ const express = require('express'); -const router = express.Router(); -const { getResponseSender } = require('librechat-data-provider'); -const { validateTools } = require('~/app'); -const { addTitle } = require('~/server/services/Endpoints/openAI'); +const throttle = require('lodash/throttle'); +const { getResponseSender, Constants } = require('librechat-data-provider'); const { initializeClient } = require('~/server/services/Endpoints/gptPlugins'); const { saveMessage, getConvoTitle, getConvo } = require('~/models'); const { sendMessage, createOnProgress } = require('~/server/utils'); +const { addTitle } = require('~/server/services/Endpoints/openAI'); const { handleAbort, createAbortController, handleAbortError, setHeaders, + validateModel, validateEndpoint, buildEndpointOption, moderateText, } = require('~/server/middleware'); +const { validateTools } = require('~/app'); const { logger } = require('~/config'); +const router = express.Router(); + router.use(moderateText); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res) => { - let { - text, - endpointOption, - conversationId, - parentMessageId = null, - overrideParentMessageId = null, - } = req.body; - logger.debug('[/ask/gptPlugins]', { text, conversationId, ...endpointOption }); - let metadata; - let userMessage; - let promptTokens; - let userMessageId; - let responseMessageId; - let lastSavedTimestamp = 0; - let saveDelay = 100; - const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); - const newConvo = !conversationId; - const user = req.user.id; - - const plugins = []; - - const addMetadata = (data) => (metadata = data); - const getReqData = (data = {}) => { - for (let key in data) { - if (key === 'userMessage') { - userMessage = data[key]; - userMessageId = data[key].messageId; - } else if (key === 'responseMessageId') { - responseMessageId = data[key]; - } else if (key === 'promptTokens') { - promptTokens = data[key]; - } else if (!conversationId && key === 'conversationId') { - conversationId = data[key]; - } - } - }; - - let streaming = null; - let timer = null; +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res) => { + let { + text, + endpointOption, + conversationId, + parentMessageId = null, + overrideParentMessageId = null, + } = req.body; - const { - onProgress: progressCallback, - sendIntermediateMessage, - getPartialText, - } = createOnProgress({ - onProgress: ({ text: partialText }) => { - const currentTimestamp = Date.now(); + logger.debug('[/ask/gptPlugins]', { text, conversationId, ...endpointOption }); - if (timer) { - clearTimeout(timer); + let userMessage; + let promptTokens; + let userMessageId; + let responseMessageId; + const sender = getResponseSender({ + ...endpointOption, + model: endpointOption.modelOptions.model, + }); + const newConvo = !conversationId; + const user = req.user.id; + + const plugins = []; + + const getReqData = (data = {}) => { + for (let key in data) { + if (key === 'userMessage') { + userMessage = data[key]; + userMessageId = data[key].messageId; + } else if (key === 'responseMessageId') { + responseMessageId = data[key]; + } else if (key === 'promptTokens') { + promptTokens = data[key]; + } else if (!conversationId && key === 'conversationId') { + conversationId = data[key]; + } } + }; + + const throttledSaveMessage = throttle(saveMessage, 3000, { trailing: false }); + let streaming = null; + let timer = null; - if (currentTimestamp - lastSavedTimestamp > saveDelay) { - lastSavedTimestamp = currentTimestamp; - saveMessage({ + const { + onProgress: progressCallback, + sendIntermediateMessage, + getPartialText, + } = createOnProgress({ + onProgress: ({ text: partialText }) => { + if (timer) { + clearTimeout(timer); + } + + throttledSaveMessage({ messageId: responseMessageId, sender, conversationId, @@ -87,140 +94,131 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, plugins, user, }); + + streaming = new Promise((resolve) => { + timer = setTimeout(() => { + resolve(); + }, 250); + }); + }, + }); + + const pluginMap = new Map(); + const onAgentAction = async (action, runId) => { + pluginMap.set(runId, action.tool); + sendIntermediateMessage(res, { plugins }); + }; + + const onToolStart = async (tool, input, runId, parentRunId) => { + const pluginName = pluginMap.get(parentRunId); + const latestPlugin = { + runId, + loading: true, + inputs: [input], + latest: pluginName, + outputs: null, + }; + + if (streaming) { + await streaming; } + const extraTokens = ':::plugin:::\n'; + plugins.push(latestPlugin); + sendIntermediateMessage(res, { plugins }, extraTokens); + }; - if (saveDelay < 500) { - saveDelay = 500; + const onToolEnd = async (output, runId) => { + if (streaming) { + await streaming; } - streaming = new Promise((resolve) => { - timer = setTimeout(() => { - resolve(); - }, 250); - }); - }, - }); - - const pluginMap = new Map(); - const onAgentAction = async (action, runId) => { - pluginMap.set(runId, action.tool); - sendIntermediateMessage(res, { plugins }); - }; - - const onToolStart = async (tool, input, runId, parentRunId) => { - const pluginName = pluginMap.get(parentRunId); - const latestPlugin = { - runId, - loading: true, - inputs: [input], - latest: pluginName, - outputs: null, - }; + const pluginIndex = plugins.findIndex((plugin) => plugin.runId === runId); - if (streaming) { - await streaming; - } - const extraTokens = ':::plugin:::\n'; - plugins.push(latestPlugin); - sendIntermediateMessage(res, { plugins }, extraTokens); - }; - - const onToolEnd = async (output, runId) => { - if (streaming) { - await streaming; - } + if (pluginIndex !== -1) { + plugins[pluginIndex].loading = false; + plugins[pluginIndex].outputs = output; + } + }; - const pluginIndex = plugins.findIndex((plugin) => plugin.runId === runId); + const onChainEnd = () => { + saveMessage({ ...userMessage, user }); + sendIntermediateMessage(res, { plugins }); + }; - if (pluginIndex !== -1) { - plugins[pluginIndex].loading = false; - plugins[pluginIndex].outputs = output; - } - }; - - const onChainEnd = () => { - saveMessage({ ...userMessage, user }); - sendIntermediateMessage(res, { plugins }); - }; - - const getAbortData = () => ({ - sender, - conversationId, - messageId: responseMessageId, - parentMessageId: overrideParentMessageId ?? userMessageId, - text: getPartialText(), - plugins: plugins.map((p) => ({ ...p, loading: false })), - userMessage, - promptTokens, - }); - const { abortController, onStart } = createAbortController(req, res, getAbortData); - - try { - endpointOption.tools = await validateTools(user, endpointOption.tools); - const { client } = await initializeClient({ req, res, endpointOption }); - - let response = await client.sendMessage(text, { - user, + const getAbortData = () => ({ + sender, conversationId, - parentMessageId, - overrideParentMessageId, - getReqData, - onAgentAction, - onChainEnd, - onToolStart, - onToolEnd, - onStart, - addMetadata, - getPartialText, - ...endpointOption, - onProgress: progressCallback.call(null, { - res, - text, - parentMessageId: overrideParentMessageId || userMessageId, - plugins, - }), - abortController, + messageId: responseMessageId, + parentMessageId: overrideParentMessageId ?? userMessageId, + text: getPartialText(), + plugins: plugins.map((p) => ({ ...p, loading: false })), + userMessage, + promptTokens, }); + const { abortController, onStart } = createAbortController(req, res, getAbortData); + + try { + endpointOption.tools = await validateTools(user, endpointOption.tools); + const { client } = await initializeClient({ req, res, endpointOption }); + + let response = await client.sendMessage(text, { + user, + conversationId, + parentMessageId, + overrideParentMessageId, + getReqData, + onAgentAction, + onChainEnd, + onToolStart, + onToolEnd, + onStart, + getPartialText, + ...endpointOption, + onProgress: progressCallback.call(null, { + res, + text, + parentMessageId: overrideParentMessageId || userMessageId, + plugins, + }), + abortController, + }); - if (overrideParentMessageId) { - response.parentMessageId = overrideParentMessageId; - } - - if (metadata) { - response = { ...response, ...metadata }; - } + if (overrideParentMessageId) { + response.parentMessageId = overrideParentMessageId; + } - logger.debug('[/ask/gptPlugins]', response); + logger.debug('[/ask/gptPlugins]', response); - response.plugins = plugins.map((p) => ({ ...p, loading: false })); - await saveMessage({ ...response, user }); + response.plugins = plugins.map((p) => ({ ...p, loading: false })); + await saveMessage({ ...response, user }); - sendMessage(res, { - title: await getConvoTitle(user, conversationId), - final: true, - conversation: await getConvo(user, conversationId), - requestMessage: userMessage, - responseMessage: response, - }); - res.end(); + sendMessage(res, { + title: await getConvoTitle(user, conversationId), + final: true, + conversation: await getConvo(user, conversationId), + requestMessage: userMessage, + responseMessage: response, + }); + res.end(); - if (parentMessageId === '00000000-0000-0000-0000-000000000000' && newConvo) { - addTitle(req, { - text, - response, - client, + if (parentMessageId === Constants.NO_PARENT && newConvo) { + addTitle(req, { + text, + response, + client, + }); + } + } catch (error) { + const partialText = getPartialText(); + handleAbortError(res, req, error, { + partialText, + conversationId, + sender, + messageId: responseMessageId, + parentMessageId: userMessageId ?? parentMessageId, }); } - } catch (error) { - const partialText = getPartialText(); - handleAbortError(res, req, error, { - partialText, - conversationId, - sender, - messageId: responseMessageId, - parentMessageId: userMessageId ?? parentMessageId, - }); - } -}); + }, +); module.exports = router; diff --git a/api/server/routes/ask/openAI.js b/api/server/routes/ask/openAI.js index 31b3111077f..5083a08b104 100644 --- a/api/server/routes/ask/openAI.js +++ b/api/server/routes/ask/openAI.js @@ -4,6 +4,7 @@ const { addTitle, initializeClient } = require('~/server/services/Endpoints/open const { handleAbort, setHeaders, + validateModel, validateEndpoint, buildEndpointOption, moderateText, @@ -13,8 +14,15 @@ const router = express.Router(); router.use(moderateText); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await AskController(req, res, next, initializeClient, addTitle); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await AskController(req, res, next, initializeClient, addTitle); + }, +); module.exports = router; diff --git a/api/server/routes/assistants/actions.js b/api/server/routes/assistants/actions.js new file mode 100644 index 00000000000..33db6ce803a --- /dev/null +++ b/api/server/routes/assistants/actions.js @@ -0,0 +1,202 @@ +const { v4 } = require('uuid'); +const express = require('express'); +const { actionDelimiter } = require('librechat-data-provider'); +const { initializeClient } = require('~/server/services/Endpoints/assistants'); +const { encryptMetadata, domainParser } = require('~/server/services/ActionService'); +const { updateAction, getActions, deleteAction } = require('~/models/Action'); +const { updateAssistant, getAssistant } = require('~/models/Assistant'); +const { logger } = require('~/config'); + +const router = express.Router(); + +/** + * Retrieves all user's actions + * @route GET /actions/ + * @param {string} req.params.id - Assistant identifier. + * @returns {Action[]} 200 - success response - application/json + */ +router.get('/', async (req, res) => { + try { + res.json(await getActions()); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +/** + * Adds or updates actions for a specific assistant. + * @route POST /actions/:assistant_id + * @param {string} req.params.assistant_id - The ID of the assistant. + * @param {FunctionTool[]} req.body.functions - The functions to be added or updated. + * @param {string} [req.body.action_id] - Optional ID for the action. + * @param {ActionMetadata} req.body.metadata - Metadata for the action. + * @returns {Object} 200 - success response - application/json + */ +router.post('/:assistant_id', async (req, res) => { + try { + const { assistant_id } = req.params; + + /** @type {{ functions: FunctionTool[], action_id: string, metadata: ActionMetadata }} */ + const { functions, action_id: _action_id, metadata: _metadata } = req.body; + if (!functions.length) { + return res.status(400).json({ message: 'No functions provided' }); + } + + let metadata = encryptMetadata(_metadata); + + let { domain } = metadata; + /* Azure doesn't support periods in function names */ + domain = domainParser(req, domain, true); + + if (!domain) { + return res.status(400).json({ message: 'No domain provided' }); + } + + const action_id = _action_id ?? v4(); + const initialPromises = []; + + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + + initialPromises.push(getAssistant({ assistant_id })); + initialPromises.push(openai.beta.assistants.retrieve(assistant_id)); + !!_action_id && initialPromises.push(getActions({ action_id }, true)); + + /** @type {[AssistantDocument, Assistant, [Action|undefined]]} */ + const [assistant_data, assistant, actions_result] = await Promise.all(initialPromises); + + if (actions_result && actions_result.length) { + const action = actions_result[0]; + metadata = { ...action.metadata, ...metadata }; + } + + if (!assistant) { + return res.status(404).json({ message: 'Assistant not found' }); + } + + const { actions: _actions = [] } = assistant_data ?? {}; + const actions = []; + for (const action of _actions) { + const [_action_domain, current_action_id] = action.split(actionDelimiter); + if (current_action_id === action_id) { + continue; + } + + actions.push(action); + } + + actions.push(`${domain}${actionDelimiter}${action_id}`); + + /** @type {{ tools: FunctionTool[] | { type: 'code_interpreter'|'retrieval'}[]}} */ + const { tools: _tools = [] } = assistant; + + const tools = _tools + .filter( + (tool) => + !( + tool.function && + (tool.function.name.includes(domain) || tool.function.name.includes(action_id)) + ), + ) + .concat( + functions.map((tool) => ({ + ...tool, + function: { + ...tool.function, + name: `${tool.function.name}${actionDelimiter}${domain}`, + }, + })), + ); + + const promises = []; + promises.push( + updateAssistant( + { assistant_id }, + { + actions, + user: req.user.id, + }, + ), + ); + promises.push(openai.beta.assistants.update(assistant_id, { tools })); + promises.push(updateAction({ action_id }, { metadata, assistant_id, user: req.user.id })); + + /** @type {[AssistantDocument, Assistant, Action]} */ + const resolved = await Promise.all(promises); + const sensitiveFields = ['api_key', 'oauth_client_id', 'oauth_client_secret']; + for (let field of sensitiveFields) { + if (resolved[2].metadata[field]) { + delete resolved[2].metadata[field]; + } + } + res.json(resolved); + } catch (error) { + const message = 'Trouble updating the Assistant Action'; + logger.error(message, error); + res.status(500).json({ message }); + } +}); + +/** + * Deletes an action for a specific assistant. + * @route DELETE /actions/:assistant_id/:action_id + * @param {string} req.params.assistant_id - The ID of the assistant. + * @param {string} req.params.action_id - The ID of the action to delete. + * @returns {Object} 200 - success response - application/json + */ +router.delete('/:assistant_id/:action_id/:model', async (req, res) => { + try { + const { assistant_id, action_id, model } = req.params; + req.body.model = model; + + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + + const initialPromises = []; + initialPromises.push(getAssistant({ assistant_id })); + initialPromises.push(openai.beta.assistants.retrieve(assistant_id)); + + /** @type {[AssistantDocument, Assistant]} */ + const [assistant_data, assistant] = await Promise.all(initialPromises); + + const { actions = [] } = assistant_data ?? {}; + const { tools = [] } = assistant ?? {}; + + let domain = ''; + const updatedActions = actions.filter((action) => { + if (action.includes(action_id)) { + [domain] = action.split(actionDelimiter); + return false; + } + return true; + }); + + domain = domainParser(req, domain, true); + + const updatedTools = tools.filter( + (tool) => !(tool.function && tool.function.name.includes(domain)), + ); + + const promises = []; + promises.push( + updateAssistant( + { assistant_id }, + { + actions: updatedActions, + user: req.user.id, + }, + ), + ); + promises.push(openai.beta.assistants.update(assistant_id, { tools: updatedTools })); + promises.push(deleteAction({ action_id })); + + await Promise.all(promises); + res.status(200).json({ message: 'Action deleted successfully' }); + } catch (error) { + const message = 'Trouble deleting the Assistant Action'; + logger.error(message, error); + res.status(500).json({ message }); + } +}); + +module.exports = router; diff --git a/api/server/routes/assistants/assistants.js b/api/server/routes/assistants/assistants.js index b911c685aa9..70c685a97a0 100644 --- a/api/server/routes/assistants/assistants.js +++ b/api/server/routes/assistants/assistants.js @@ -1,9 +1,35 @@ -const OpenAI = require('openai'); +const multer = require('multer'); const express = require('express'); +const { FileContext, EModelEndpoint } = require('librechat-data-provider'); +const { + initializeClient, + listAssistantsForAzure, + listAssistants, +} = require('~/server/services/Endpoints/assistants'); +const { getStrategyFunctions } = require('~/server/services/Files/strategies'); +const { uploadImageBuffer } = require('~/server/services/Files/process'); +const { updateAssistant, getAssistants } = require('~/models/Assistant'); +const { deleteFileByFilter } = require('~/models/File'); const { logger } = require('~/config'); +const actions = require('./actions'); +const tools = require('./tools'); +const upload = multer(); const router = express.Router(); +/** + * Assistant actions route. + * @route GET|POST /assistants/actions + */ +router.use('/actions', actions); + +/** + * Create an assistant. + * @route GET /assistants/tools + * @returns {TPlugin[]} 200 - application/json + */ +router.use('/tools', tools); + /** * Create an assistant. * @route POST /assistants @@ -12,12 +38,29 @@ const router = express.Router(); */ router.post('/', async (req, res) => { try { - const openai = new OpenAI(process.env.OPENAI_API_KEY); - const assistantData = req.body; + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + + const { tools = [], ...assistantData } = req.body; + assistantData.tools = tools + .map((tool) => { + if (typeof tool !== 'string') { + return tool; + } + + return req.app.locals.availableTools[tool]; + }) + .filter((tool) => tool); + + if (openai.locals?.azureOptions) { + assistantData.model = openai.locals.azureOptions.azureOpenAIApiDeploymentName; + } + const assistant = await openai.beta.assistants.create(assistantData); logger.debug('/assistants/', assistant); res.status(201).json(assistant); } catch (error) { + logger.error('[/assistants] Error creating assistant', error); res.status(500).json({ error: error.message }); } }); @@ -30,11 +73,14 @@ router.post('/', async (req, res) => { */ router.get('/:id', async (req, res) => { try { - const openai = new OpenAI(process.env.OPENAI_API_KEY); + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + const assistant_id = req.params.id; const assistant = await openai.beta.assistants.retrieve(assistant_id); res.json(assistant); } catch (error) { + logger.error('[/assistants/:id] Error retrieving assistant', error); res.status(500).json({ error: error.message }); } }); @@ -48,12 +94,29 @@ router.get('/:id', async (req, res) => { */ router.patch('/:id', async (req, res) => { try { - const openai = new OpenAI(process.env.OPENAI_API_KEY); + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + const assistant_id = req.params.id; const updateData = req.body; + updateData.tools = (updateData.tools ?? []) + .map((tool) => { + if (typeof tool !== 'string') { + return tool; + } + + return req.app.locals.availableTools[tool]; + }) + .filter((tool) => tool); + + if (openai.locals?.azureOptions && updateData.model) { + updateData.model = openai.locals.azureOptions.azureOpenAIApiDeploymentName; + } + const updatedAssistant = await openai.beta.assistants.update(assistant_id, updateData); res.json(updatedAssistant); } catch (error) { + logger.error('[/assistants/:id] Error updating assistant', error); res.status(500).json({ error: error.message }); } }); @@ -66,12 +129,15 @@ router.patch('/:id', async (req, res) => { */ router.delete('/:id', async (req, res) => { try { - const openai = new OpenAI(process.env.OPENAI_API_KEY); + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + const assistant_id = req.params.id; const deletionStatus = await openai.beta.assistants.del(assistant_id); res.json(deletionStatus); } catch (error) { - res.status(500).json({ error: error.message }); + logger.error('[/assistants/:id] Error deleting assistant', error); + res.status(500).json({ error: 'Error deleting assistant' }); } }); @@ -79,22 +145,121 @@ router.delete('/:id', async (req, res) => { * Returns a list of assistants. * @route GET /assistants * @param {AssistantListParams} req.query - The assistant list parameters for pagination and sorting. - * @returns {Array<Assistant>} 200 - success response - application/json + * @returns {AssistantListResponse} 200 - success response - application/json */ router.get('/', async (req, res) => { try { - const openai = new OpenAI(process.env.OPENAI_API_KEY); - const { limit, order, after, before } = req.query; - const assistants = await openai.beta.assistants.list({ - limit, - order, - after, - before, - }); - res.json(assistants); + const { limit = 100, order = 'desc', after, before } = req.query; + const query = { limit, order, after, before }; + + const azureConfig = req.app.locals[EModelEndpoint.azureOpenAI]; + /** @type {AssistantListResponse} */ + let body; + + if (azureConfig?.assistants) { + body = await listAssistantsForAzure({ req, res, azureConfig, query }); + } else { + ({ body } = await listAssistants({ req, res, query })); + } + + if (req.app.locals?.[EModelEndpoint.assistants]) { + /** @type {Partial<TAssistantEndpoint>} */ + const assistantsConfig = req.app.locals[EModelEndpoint.assistants]; + const { supportedIds, excludedIds } = assistantsConfig; + if (supportedIds?.length) { + body.data = body.data.filter((assistant) => supportedIds.includes(assistant.id)); + } else if (excludedIds?.length) { + body.data = body.data.filter((assistant) => !excludedIds.includes(assistant.id)); + } + } + + res.json(body); } catch (error) { + logger.error('[/assistants] Error listing assistants', error); + res.status(500).json({ message: 'Error listing assistants' }); + } +}); + +/** + * Returns a list of the user's assistant documents (metadata saved to database). + * @route GET /assistants/documents + * @returns {AssistantDocument[]} 200 - success response - application/json + */ +router.get('/documents', async (req, res) => { + try { + res.json(await getAssistants({ user: req.user.id })); + } catch (error) { + logger.error('[/assistants/documents] Error listing assistant documents', error); res.status(500).json({ error: error.message }); } }); +/** + * Uploads and updates an avatar for a specific assistant. + * @route POST /avatar/:assistant_id + * @param {string} req.params.assistant_id - The ID of the assistant. + * @param {Express.Multer.File} req.file - The avatar image file. + * @param {string} [req.body.metadata] - Optional metadata for the assistant's avatar. + * @returns {Object} 200 - success response - application/json + */ +router.post('/avatar/:assistant_id', upload.single('file'), async (req, res) => { + try { + const { assistant_id } = req.params; + if (!assistant_id) { + return res.status(400).json({ message: 'Assistant ID is required' }); + } + + let { metadata: _metadata = '{}' } = req.body; + /** @type {{ openai: OpenAI }} */ + const { openai } = await initializeClient({ req, res }); + + const image = await uploadImageBuffer({ req, context: FileContext.avatar }); + + try { + _metadata = JSON.parse(_metadata); + } catch (error) { + logger.error('[/avatar/:assistant_id] Error parsing metadata', error); + _metadata = {}; + } + + if (_metadata.avatar && _metadata.avatar_source) { + const { deleteFile } = getStrategyFunctions(_metadata.avatar_source); + try { + await deleteFile(req, { filepath: _metadata.avatar }); + await deleteFileByFilter({ filepath: _metadata.avatar }); + } catch (error) { + logger.error('[/avatar/:assistant_id] Error deleting old avatar', error); + } + } + + const metadata = { + ..._metadata, + avatar: image.filepath, + avatar_source: req.app.locals.fileStrategy, + }; + + const promises = []; + promises.push( + updateAssistant( + { assistant_id }, + { + avatar: { + filepath: image.filepath, + source: req.app.locals.fileStrategy, + }, + user: req.user.id, + }, + ), + ); + promises.push(openai.beta.assistants.update(assistant_id, { metadata })); + + const resolved = await Promise.all(promises); + res.status(201).json(resolved[1]); + } catch (error) { + const message = 'An error occurred while updating the Assistant Avatar'; + logger.error(message, error); + res.status(500).json({ message }); + } +}); + module.exports = router; diff --git a/api/server/routes/assistants/chat.js b/api/server/routes/assistants/chat.js index e45bad191e9..69be8a7b3e4 100644 --- a/api/server/routes/assistants/chat.js +++ b/api/server/routes/assistants/chat.js @@ -1,108 +1,658 @@ -const crypto = require('crypto'); -const OpenAI = require('openai'); -const { logger } = require('~/config'); -const { sendMessage } = require('../../utils'); -const { initThread, createRun, handleRun } = require('../../services/AssistantService'); +const { v4 } = require('uuid'); const express = require('express'); +const { + Constants, + RunStatus, + CacheKeys, + FileSources, + ContentTypes, + EModelEndpoint, + ViolationTypes, + ImageVisionTool, + AssistantStreamEvents, +} = require('librechat-data-provider'); +const { + initThread, + recordUsage, + saveUserMessage, + checkMessageGaps, + addThreadMetadata, + saveAssistantMessage, +} = require('~/server/services/Threads'); +const { sendResponse, sendMessage, sleep, isEnabled, countTokens } = require('~/server/utils'); +const { runAssistant, createOnTextProgress } = require('~/server/services/AssistantService'); +const { addTitle, initializeClient } = require('~/server/services/Endpoints/assistants'); +const { formatMessage, createVisionPrompt } = require('~/app/clients/prompts'); +const { createRun, StreamRunManager } = require('~/server/services/Runs'); +const { getTransactions } = require('~/models/Transaction'); +const checkBalance = require('~/models/checkBalance'); +const { getConvo } = require('~/models/Conversation'); +const getLogStores = require('~/cache/getLogStores'); +const { getModelMaxTokens } = require('~/utils'); +const { logger } = require('~/config'); + const router = express.Router(); const { setHeaders, - // handleAbort, - // handleAbortError, + handleAbort, + validateModel, + handleAbortError, // validateEndpoint, - // buildEndpointOption, - // createAbortController, -} = require('../../middleware'); + buildEndpointOption, +} = require('~/server/middleware'); + +router.post('/abort', handleAbort()); -// const thread = { -// id: 'thread_LexzJUVugYFqfslS7c7iL3Zo', -// "thread_nZoiCbPauU60LqY1Q0ME1elg" -// }; +const ten_minutes = 1000 * 60 * 10; /** - * Chat with an assistant. + * @route POST / + * @desc Chat with an assistant + * @access Public + * @param {express.Request} req - The request object, containing the request data. + * @param {express.Response} res - The response object, used to send back a response. + * @returns {void} */ -router.post('/', setHeaders, async (req, res) => { +router.post('/', validateModel, buildEndpointOption, setHeaders, async (req, res) => { + logger.debug('[/assistants/chat/] req.body', req.body); + + const { + text, + model, + files = [], + promptPrefix, + assistant_id, + instructions, + thread_id: _thread_id, + messageId: _messageId, + conversationId: convoId, + parentMessageId: _parentId = Constants.NO_PARENT, + } = req.body; + + /** @type {Partial<TAssistantEndpoint>} */ + const assistantsConfig = req.app.locals?.[EModelEndpoint.assistants]; + + if (assistantsConfig) { + const { supportedIds, excludedIds } = assistantsConfig; + const error = { message: 'Assistant not supported' }; + if (supportedIds?.length && !supportedIds.includes(assistant_id)) { + return await handleAbortError(res, req, error, { + sender: 'System', + conversationId: convoId, + messageId: v4(), + parentMessageId: _messageId, + error, + }); + } else if (excludedIds?.length && excludedIds.includes(assistant_id)) { + return await handleAbortError(res, req, error, { + sender: 'System', + conversationId: convoId, + messageId: v4(), + parentMessageId: _messageId, + }); + } + } + + /** @type {OpenAIClient} */ + let openai; + /** @type {string|undefined} - the current thread id */ + let thread_id = _thread_id; + /** @type {string|undefined} - the current run id */ + let run_id; + /** @type {string|undefined} - the parent messageId */ + let parentMessageId = _parentId; + /** @type {TMessage[]} */ + let previousMessages = []; + /** @type {import('librechat-data-provider').TConversation | null} */ + let conversation = null; + /** @type {string[]} */ + let file_ids = []; + /** @type {Set<string>} */ + let attachedFileIds = new Set(); + /** @type {TMessage | null} */ + let requestMessage = null; + /** @type {undefined | Promise<ChatCompletion>} */ + let visionPromise; + + const userMessageId = v4(); + const responseMessageId = v4(); + + /** @type {string} - The conversation UUID - created if undefined */ + const conversationId = convoId ?? v4(); + + const cache = getLogStores(CacheKeys.ABORT_KEYS); + const cacheKey = `${req.user.id}:${conversationId}`; + + /** @type {Run | undefined} - The completed run, undefined if incomplete */ + let completedRun; + + const handleError = async (error) => { + const defaultErrorMessage = + 'The Assistant run failed to initialize. Try sending a message in a new conversation.'; + const messageData = { + thread_id, + assistant_id, + conversationId, + parentMessageId, + sender: 'System', + user: req.user.id, + shouldSaveMessage: false, + messageId: responseMessageId, + endpoint: EModelEndpoint.assistants, + }; + + if (error.message === 'Run cancelled') { + return res.end(); + } else if (error.message === 'Request closed' && completedRun) { + return; + } else if (error.message === 'Request closed') { + logger.debug('[/assistants/chat/] Request aborted on close'); + } else if (/Files.*are invalid/.test(error.message)) { + const errorMessage = `Files are invalid, or may not have uploaded yet.${ + req.app.locals?.[EModelEndpoint.azureOpenAI].assistants + ? ' If using Azure OpenAI, files are only available in the region of the assistant\'s model at the time of upload.' + : '' + }`; + return sendResponse(res, messageData, errorMessage); + } else if (error?.message?.includes('string too long')) { + return sendResponse( + res, + messageData, + 'Message too long. The Assistants API has a limit of 32,768 characters per message. Please shorten it and try again.', + ); + } else if (error?.message?.includes(ViolationTypes.TOKEN_BALANCE)) { + return sendResponse(res, messageData, error.message); + } else { + logger.error('[/assistants/chat/]', error); + } + + if (!openai || !thread_id || !run_id) { + return sendResponse(res, messageData, defaultErrorMessage); + } + + await sleep(2000); + + try { + const status = await cache.get(cacheKey); + if (status === 'cancelled') { + logger.debug('[/assistants/chat/] Run already cancelled'); + return res.end(); + } + await cache.delete(cacheKey); + const cancelledRun = await openai.beta.threads.runs.cancel(thread_id, run_id); + logger.debug('[/assistants/chat/] Cancelled run:', cancelledRun); + } catch (error) { + logger.error('[/assistants/chat/] Error cancelling run', error); + } + + await sleep(2000); + + let run; + try { + run = await openai.beta.threads.runs.retrieve(thread_id, run_id); + await recordUsage({ + ...run.usage, + model: run.model, + user: req.user.id, + conversationId, + }); + } catch (error) { + logger.error('[/assistants/chat/] Error fetching or processing run', error); + } + + let finalEvent; + try { + const runMessages = await checkMessageGaps({ + openai, + run_id, + thread_id, + conversationId, + latestMessageId: responseMessageId, + }); + + const errorContentPart = { + text: { + value: + error?.message ?? 'There was an error processing your request. Please try again later.', + }, + type: ContentTypes.ERROR, + }; + + if (!Array.isArray(runMessages[runMessages.length - 1]?.content)) { + runMessages[runMessages.length - 1].content = [errorContentPart]; + } else { + const contentParts = runMessages[runMessages.length - 1].content; + for (let i = 0; i < contentParts.length; i++) { + const currentPart = contentParts[i]; + /** @type {CodeToolCall | RetrievalToolCall | FunctionToolCall | undefined} */ + const toolCall = currentPart?.[ContentTypes.TOOL_CALL]; + if ( + toolCall && + toolCall?.function && + !(toolCall?.function?.output || toolCall?.function?.output?.length) + ) { + contentParts[i] = { + ...currentPart, + [ContentTypes.TOOL_CALL]: { + ...toolCall, + function: { + ...toolCall.function, + output: 'error processing tool', + }, + }, + }; + } + } + runMessages[runMessages.length - 1].content.push(errorContentPart); + } + + finalEvent = { + final: true, + conversation: await getConvo(req.user.id, conversationId), + runMessages, + }; + } catch (error) { + logger.error('[/assistants/chat/] Error finalizing error process', error); + return sendResponse(res, messageData, 'The Assistant run failed'); + } + + return sendResponse(res, finalEvent); + }; + try { - logger.debug('[/assistants/chat/] req.body', req.body); - // test message: - // How many polls of 500 ms intervals are there in 18 seconds? + res.on('close', async () => { + if (!completedRun) { + await handleError(new Error('Request closed')); + } + }); - const { assistant_id, messages, text: userMessage, messageId } = req.body; - const conversationId = req.body.conversationId || crypto.randomUUID(); - // let thread_id = req.body.thread_id ?? 'thread_nZoiCbPauU60LqY1Q0ME1elg'; // for testing - let thread_id = req.body.thread_id; + if (convoId && !_thread_id) { + completedRun = true; + throw new Error('Missing thread_id for existing conversation'); + } if (!assistant_id) { + completedRun = true; throw new Error('Missing assistant_id'); } - const openai = new OpenAI(process.env.OPENAI_API_KEY); - console.log(messages); - - const initThreadBody = { - messages: [ - { - role: 'user', - content: userMessage, - metadata: { - messageId, - }, + const checkBalanceBeforeRun = async () => { + if (!isEnabled(process.env.CHECK_BALANCE)) { + return; + } + const transactions = + (await getTransactions({ + user: req.user.id, + context: 'message', + conversationId, + })) ?? []; + + const totalPreviousTokens = Math.abs( + transactions.reduce((acc, curr) => acc + curr.rawAmount, 0), + ); + + // TODO: make promptBuffer a config option; buffer for titles, needs buffer for system instructions + const promptBuffer = parentMessageId === Constants.NO_PARENT && !_thread_id ? 200 : 0; + // 5 is added for labels + let promptTokens = (await countTokens(text + (promptPrefix ?? ''))) + 5; + promptTokens += totalPreviousTokens + promptBuffer; + // Count tokens up to the current context window + promptTokens = Math.min(promptTokens, getModelMaxTokens(model)); + + await checkBalance({ + req, + res, + txData: { + model, + user: req.user.id, + tokenType: 'prompt', + amount: promptTokens, }, - ], + }); + }; + + /** @type {{ openai: OpenAIClient }} */ + const { openai: _openai, client } = await initializeClient({ + req, + res, + endpointOption: req.body.endpointOption, + initAppClient: true, + }); + + openai = _openai; + + if (previousMessages.length) { + parentMessageId = previousMessages[previousMessages.length - 1].messageId; + } + + let userMessage = { + role: 'user', + content: text, metadata: { - conversationId, + messageId: userMessageId, }, }; - const result = await initThread({ openai, body: initThreadBody, thread_id }); - // const { messages: _messages } = result; - thread_id = result.thread_id; + /** @type {CreateRunBody | undefined} */ + const body = { + assistant_id, + model, + }; - /* NOTE: - * By default, a Run will use the model and tools configuration specified in Assistant object, - * but you can override most of these when creating the Run for added flexibility: - */ - const run = await createRun({ - openai, - thread_id, - body: { assistant_id, model: 'gpt-3.5-turbo-1106' }, + if (promptPrefix) { + body.additional_instructions = promptPrefix; + } + + if (instructions) { + body.instructions = instructions; + } + + const getRequestFileIds = async () => { + let thread_file_ids = []; + if (convoId) { + const convo = await getConvo(req.user.id, convoId); + if (convo && convo.file_ids) { + thread_file_ids = convo.file_ids; + } + } + + file_ids = files.map(({ file_id }) => file_id); + if (file_ids.length || thread_file_ids.length) { + userMessage.file_ids = file_ids; + attachedFileIds = new Set([...file_ids, ...thread_file_ids]); + } + }; + + const addVisionPrompt = async () => { + if (!req.body.endpointOption.attachments) { + return; + } + + /** @type {MongoFile[]} */ + const attachments = await req.body.endpointOption.attachments; + if ( + attachments && + attachments.every((attachment) => attachment.source === FileSources.openai) + ) { + return; + } + + const assistant = await openai.beta.assistants.retrieve(assistant_id); + const visionToolIndex = assistant.tools.findIndex( + (tool) => tool?.function && tool?.function?.name === ImageVisionTool.function.name, + ); + + if (visionToolIndex === -1) { + return; + } + + let visionMessage = { + role: 'user', + content: '', + }; + const files = await client.addImageURLs(visionMessage, attachments); + if (!visionMessage.image_urls?.length) { + return; + } + + const imageCount = visionMessage.image_urls.length; + const plural = imageCount > 1; + visionMessage.content = createVisionPrompt(plural); + visionMessage = formatMessage({ message: visionMessage, endpoint: EModelEndpoint.openAI }); + + visionPromise = openai.chat.completions.create({ + model: 'gpt-4-vision-preview', + messages: [visionMessage], + max_tokens: 4000, + }); + + const pluralized = plural ? 's' : ''; + body.additional_instructions = `${ + body.additional_instructions ? `${body.additional_instructions}\n` : '' + }The user has uploaded ${imageCount} image${pluralized}. + Use the \`${ImageVisionTool.function.name}\` tool to retrieve ${ + plural ? '' : 'a ' +}detailed text description${pluralized} for ${plural ? 'each' : 'the'} image${pluralized}.`; + + return files; + }; + + const initializeThread = async () => { + /** @type {[ undefined | MongoFile[]]}*/ + const [processedFiles] = await Promise.all([addVisionPrompt(), getRequestFileIds()]); + // TODO: may allow multiple messages to be created beforehand in a future update + const initThreadBody = { + messages: [userMessage], + metadata: { + user: req.user.id, + conversationId, + }, + }; + + if (processedFiles) { + for (const file of processedFiles) { + if (file.source !== FileSources.openai) { + attachedFileIds.delete(file.file_id); + const index = file_ids.indexOf(file.file_id); + if (index > -1) { + file_ids.splice(index, 1); + } + } + } + + userMessage.file_ids = file_ids; + } + + const result = await initThread({ openai, body: initThreadBody, thread_id }); + thread_id = result.thread_id; + + createOnTextProgress({ + openai, + conversationId, + userMessageId, + messageId: responseMessageId, + thread_id, + }); + + requestMessage = { + user: req.user.id, + text, + messageId: userMessageId, + parentMessageId, + // TODO: make sure client sends correct format for `files`, use zod + files, + file_ids, + conversationId, + isCreatedByUser: true, + assistant_id, + thread_id, + model: assistant_id, + }; + + previousMessages.push(requestMessage); + + /* asynchronous */ + saveUserMessage({ ...requestMessage, model }); + + conversation = { + conversationId, + endpoint: EModelEndpoint.assistants, + promptPrefix: promptPrefix, + instructions: instructions, + assistant_id, + // model, + }; + + if (file_ids.length) { + conversation.file_ids = file_ids; + } + }; + + const promises = [initializeThread(), checkBalanceBeforeRun()]; + await Promise.all(promises); + + const sendInitialResponse = () => { + sendMessage(res, { + sync: true, + conversationId, + // messages: previousMessages, + requestMessage, + responseMessage: { + user: req.user.id, + messageId: openai.responseMessage.messageId, + parentMessageId: userMessageId, + conversationId, + assistant_id, + thread_id, + model: assistant_id, + }, + }); + }; + + /** @type {RunResponse | typeof StreamRunManager | undefined} */ + let response; + + const processRun = async (retry = false) => { + if (req.app.locals[EModelEndpoint.azureOpenAI]?.assistants) { + openai.attachedFileIds = attachedFileIds; + openai.visionPromise = visionPromise; + if (retry) { + response = await runAssistant({ + openai, + thread_id, + run_id, + in_progress: openai.in_progress, + }); + return; + } + + /* NOTE: + * By default, a Run will use the model and tools configuration specified in Assistant object, + * but you can override most of these when creating the Run for added flexibility: + */ + const run = await createRun({ + openai, + thread_id, + body, + }); + + run_id = run.id; + await cache.set(cacheKey, `${thread_id}:${run_id}`, ten_minutes); + sendInitialResponse(); + + // todo: retry logic + response = await runAssistant({ openai, thread_id, run_id }); + return; + } + + /** @type {{[AssistantStreamEvents.ThreadRunCreated]: (event: ThreadRunCreated) => Promise<void>}} */ + const handlers = { + [AssistantStreamEvents.ThreadRunCreated]: async (event) => { + await cache.set(cacheKey, `${thread_id}:${event.data.id}`, ten_minutes); + run_id = event.data.id; + sendInitialResponse(); + }, + }; + + const streamRunManager = new StreamRunManager({ + req, + res, + openai, + handlers, + thread_id, + visionPromise, + attachedFileIds, + responseMessage: openai.responseMessage, + // streamOptions: { + + // }, + }); + + await streamRunManager.runAssistant({ + thread_id, + body, + }); + + response = streamRunManager; + }; + + await processRun(); + logger.debug('[/assistants/chat/] response', { + run: response.run, + steps: response.steps, }); - const response = await handleRun({ openai, thread_id, run_id: run.id }); - // TODO: parse responses, save to db, send to user + if (response.run.status === RunStatus.CANCELLED) { + logger.debug('[/assistants/chat/] Run cancelled, handled by `abortRun`'); + return res.end(); + } + + if (response.run.status === RunStatus.IN_PROGRESS) { + processRun(true); + } + + completedRun = response.run; + + /** @type {ResponseMessage} */ + const responseMessage = { + ...(response.responseMessage ?? response.finalMessage), + parentMessageId: userMessageId, + conversationId, + user: req.user.id, + assistant_id, + thread_id, + model: assistant_id, + }; sendMessage(res, { - title: 'New Chat', final: true, - conversation: { - conversationId: 'fake-convo-id', - title: 'New Chat', - }, + conversation, requestMessage: { - messageId: 'fake-user-message-id', - parentMessageId: '00000000-0000-0000-0000-000000000000', - conversationId: 'fake-convo-id', - sender: 'User', - text: req.body.text, - isCreatedByUser: true, - }, - responseMessage: { - messageId: 'fake-response-id', - conversationId: 'fake-convo-id', - parentMessageId: 'fake-user-message-id', - isCreatedByUser: false, - isEdited: false, - model: 'gpt-3.5-turbo-1106', - sender: 'Assistant', - text: response.choices[0].text, + parentMessageId, + thread_id, }, }); res.end(); + + await saveAssistantMessage({ ...responseMessage, model }); + + if (parentMessageId === Constants.NO_PARENT && !_thread_id) { + addTitle(req, { + text, + responseText: response.text, + conversationId, + client, + }); + } + + await addThreadMetadata({ + openai, + thread_id, + messageId: responseMessage.messageId, + messages: response.messages, + }); + + if (!response.run.usage) { + await sleep(3000); + completedRun = await openai.beta.threads.runs.retrieve(thread_id, response.run.id); + if (completedRun.usage) { + await recordUsage({ + ...completedRun.usage, + user: req.user.id, + model: completedRun.model ?? model, + conversationId, + }); + } + } else { + await recordUsage({ + ...response.run.usage, + user: req.user.id, + model: response.run.model ?? model, + conversationId, + }); + } } catch (error) { - // res.status(500).json({ error: error.message }); - logger.error('[/assistants/chat/]', error); - res.end(); + await handleError(error); } }); diff --git a/api/server/routes/assistants/tools.js b/api/server/routes/assistants/tools.js new file mode 100644 index 00000000000..324b6209589 --- /dev/null +++ b/api/server/routes/assistants/tools.js @@ -0,0 +1,8 @@ +const express = require('express'); +const { getAvailableTools } = require('~/server/controllers/PluginController'); + +const router = express.Router(); + +router.get('/', getAvailableTools); + +module.exports = router; diff --git a/api/server/routes/config.js b/api/server/routes/config.js index 85889f4b818..a9f6772deea 100644 --- a/api/server/routes/config.js +++ b/api/server/routes/config.js @@ -1,4 +1,5 @@ const express = require('express'); +const { defaultSocialLogins } = require('librechat-data-provider'); const { isEnabled } = require('~/server/utils'); const { logger } = require('~/config'); @@ -7,21 +8,27 @@ const emailLoginEnabled = process.env.ALLOW_EMAIL_LOGIN === undefined || isEnabled(process.env.ALLOW_EMAIL_LOGIN); router.get('/', async function (req, res) { + const isBirthday = () => { + const today = new Date(); + return today.getMonth() === 1 && today.getDate() === 11; + }; + try { const payload = { appTitle: process.env.APP_TITLE || 'LibreChat', - googleLoginEnabled: !!process.env.GOOGLE_CLIENT_ID && !!process.env.GOOGLE_CLIENT_SECRET, + socialLogins: req.app.locals.socialLogins ?? defaultSocialLogins, + discordLoginEnabled: !!process.env.DISCORD_CLIENT_ID && !!process.env.DISCORD_CLIENT_SECRET, facebookLoginEnabled: !!process.env.FACEBOOK_CLIENT_ID && !!process.env.FACEBOOK_CLIENT_SECRET, + githubLoginEnabled: !!process.env.GITHUB_CLIENT_ID && !!process.env.GITHUB_CLIENT_SECRET, + googleLoginEnabled: !!process.env.GOOGLE_CLIENT_ID && !!process.env.GOOGLE_CLIENT_SECRET, openidLoginEnabled: !!process.env.OPENID_CLIENT_ID && !!process.env.OPENID_CLIENT_SECRET && !!process.env.OPENID_ISSUER && !!process.env.OPENID_SESSION_SECRET, - openidLabel: process.env.OPENID_BUTTON_LABEL || 'Login with OpenID', + openidLabel: process.env.OPENID_BUTTON_LABEL || 'Continue with OpenID', openidImageUrl: process.env.OPENID_IMAGE_URL, - githubLoginEnabled: !!process.env.GITHUB_CLIENT_ID && !!process.env.GITHUB_CLIENT_SECRET, - discordLoginEnabled: !!process.env.DISCORD_CLIENT_ID && !!process.env.DISCORD_CLIENT_SECRET, serverDomain: process.env.DOMAIN_SERVER || 'http://localhost:3080', emailLoginEnabled, registrationEnabled: isEnabled(process.env.ALLOW_REGISTRATION), @@ -32,6 +39,12 @@ router.get('/', async function (req, res) { !!process.env.EMAIL_PASSWORD && !!process.env.EMAIL_FROM, checkBalance: isEnabled(process.env.CHECK_BALANCE), + showBirthdayIcon: + isBirthday() || + isEnabled(process.env.SHOW_BIRTHDAY_ICON) || + process.env.SHOW_BIRTHDAY_ICON === '', + helpAndFaqURL: process.env.HELP_AND_FAQ_URL || 'https://librechat.ai', + interface: req.app.locals.interface, }; if (typeof process.env.CUSTOM_FOOTER === 'string') { diff --git a/api/server/routes/convos.js b/api/server/routes/convos.js index 4395df0fee1..0fa45223805 100644 --- a/api/server/routes/convos.js +++ b/api/server/routes/convos.js @@ -1,14 +1,23 @@ const express = require('express'); -const router = express.Router(); -const { getConvosByPage, deleteConvos } = require('~/models/Conversation'); +const { CacheKeys } = require('librechat-data-provider'); +const { initializeClient } = require('~/server/services/Endpoints/assistants'); +const { getConvosByPage, deleteConvos, getConvo, saveConvo } = require('~/models/Conversation'); const requireJwtAuth = require('~/server/middleware/requireJwtAuth'); -const { getConvo, saveConvo } = require('~/models'); +const getLogStores = require('~/cache/getLogStores'); +const { sleep } = require('~/server/utils'); const { logger } = require('~/config'); +const router = express.Router(); router.use(requireJwtAuth); router.get('/', async (req, res) => { - const pageNumber = req.query.pageNumber || 1; + let pageNumber = req.query.pageNumber || 1; + pageNumber = parseInt(pageNumber, 10); + + if (isNaN(pageNumber) || pageNumber < 1) { + return res.status(400).json({ error: 'Invalid page number' }); + } + res.status(200).send(await getConvosByPage(req.user.id, pageNumber)); }); @@ -17,32 +26,64 @@ router.get('/:conversationId', async (req, res) => { const convo = await getConvo(req.user.id, conversationId); if (convo) { - res.status(200).send(convo); + res.status(200).json(convo); } else { res.status(404).end(); } }); +router.post('/gen_title', async (req, res) => { + const { conversationId } = req.body; + const titleCache = getLogStores(CacheKeys.GEN_TITLE); + const key = `${req.user.id}-${conversationId}`; + let title = await titleCache.get(key); + + if (!title) { + await sleep(2500); + title = await titleCache.get(key); + } + + if (title) { + await titleCache.delete(key); + res.status(200).json({ title }); + } else { + res.status(404).json({ + message: 'Title not found or method not implemented for the conversation\'s endpoint', + }); + } +}); + router.post('/clear', async (req, res) => { let filter = {}; - const { conversationId, source } = req.body.arg; + const { conversationId, source, thread_id } = req.body.arg; if (conversationId) { filter = { conversationId }; } - // for debugging deletion source - // logger.debug('source:', source); - if (source === 'button' && !conversationId) { return res.status(200).send('No conversationId provided'); } + if (thread_id) { + /** @type {{ openai: OpenAI}} */ + const { openai } = await initializeClient({ req, res }); + try { + const response = await openai.beta.threads.del(thread_id); + logger.debug('Deleted OpenAI thread:', response); + } catch (error) { + logger.error('Error deleting OpenAI thread:', error); + } + } + + // for debugging deletion source + // logger.debug('source:', source); + try { const dbResponse = await deleteConvos(req.user.id, filter); - res.status(201).send(dbResponse); + res.status(201).json(dbResponse); } catch (error) { logger.error('Error clearing conversations', error); - res.status(500).send(error); + res.status(500).send('Error clearing conversations'); } }); @@ -51,10 +92,10 @@ router.post('/update', async (req, res) => { try { const dbResponse = await saveConvo(req.user.id, update); - res.status(201).send(dbResponse); + res.status(201).json(dbResponse); } catch (error) { logger.error('Error updating conversation', error); - res.status(500).send(error); + res.status(500).send('Error updating conversation'); } }); diff --git a/api/server/routes/edit/anthropic.js b/api/server/routes/edit/anthropic.js index 34dd9d6dfac..c7bf128d7cb 100644 --- a/api/server/routes/edit/anthropic.js +++ b/api/server/routes/edit/anthropic.js @@ -4,6 +4,7 @@ const { initializeClient } = require('~/server/services/Endpoints/anthropic'); const { setHeaders, handleAbort, + validateModel, validateEndpoint, buildEndpointOption, } = require('~/server/middleware'); @@ -12,8 +13,15 @@ const router = express.Router(); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await EditController(req, res, next, initializeClient); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await EditController(req, res, next, initializeClient); + }, +); module.exports = router; diff --git a/api/server/routes/edit/custom.js b/api/server/routes/edit/custom.js index dd63c96c8f9..0bf97ba1800 100644 --- a/api/server/routes/edit/custom.js +++ b/api/server/routes/edit/custom.js @@ -5,6 +5,7 @@ const { addTitle } = require('~/server/services/Endpoints/openAI'); const { handleAbort, setHeaders, + validateModel, validateEndpoint, buildEndpointOption, } = require('~/server/middleware'); @@ -13,8 +14,15 @@ const router = express.Router(); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await EditController(req, res, next, initializeClient, addTitle); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await EditController(req, res, next, initializeClient, addTitle); + }, +); module.exports = router; diff --git a/api/server/routes/edit/google.js b/api/server/routes/edit/google.js index e4dfbcd1412..7482f11b4c0 100644 --- a/api/server/routes/edit/google.js +++ b/api/server/routes/edit/google.js @@ -4,6 +4,7 @@ const { initializeClient } = require('~/server/services/Endpoints/google'); const { setHeaders, handleAbort, + validateModel, validateEndpoint, buildEndpointOption, } = require('~/server/middleware'); @@ -12,8 +13,15 @@ const router = express.Router(); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await EditController(req, res, next, initializeClient); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await EditController(req, res, next, initializeClient); + }, +); module.exports = router; diff --git a/api/server/routes/edit/gptPlugins.js b/api/server/routes/edit/gptPlugins.js index 8ddf92c2507..61d76178f4f 100644 --- a/api/server/routes/edit/gptPlugins.js +++ b/api/server/routes/edit/gptPlugins.js @@ -1,88 +1,94 @@ const express = require('express'); -const router = express.Router(); -const { validateTools } = require('~/app'); +const throttle = require('lodash/throttle'); const { getResponseSender } = require('librechat-data-provider'); -const { saveMessage, getConvoTitle, getConvo } = require('~/models'); -const { initializeClient } = require('~/server/services/Endpoints/gptPlugins'); -const { sendMessage, createOnProgress, formatSteps, formatAction } = require('~/server/utils'); const { handleAbort, createAbortController, handleAbortError, setHeaders, + validateModel, validateEndpoint, buildEndpointOption, moderateText, } = require('~/server/middleware'); +const { sendMessage, createOnProgress, formatSteps, formatAction } = require('~/server/utils'); +const { initializeClient } = require('~/server/services/Endpoints/gptPlugins'); +const { saveMessage, getConvoTitle, getConvo } = require('~/models'); +const { validateTools } = require('~/app'); const { logger } = require('~/config'); +const router = express.Router(); + router.use(moderateText); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res) => { - let { - text, - generation, - endpointOption, - conversationId, - responseMessageId, - isContinued = false, - parentMessageId = null, - overrideParentMessageId = null, - } = req.body; - - logger.debug('[/edit/gptPlugins]', { - text, - generation, - isContinued, - conversationId, - ...endpointOption, - }); - let metadata; - let userMessage; - let promptTokens; - let lastSavedTimestamp = 0; - let saveDelay = 100; - const sender = getResponseSender({ ...endpointOption, model: endpointOption.modelOptions.model }); - const userMessageId = parentMessageId; - const user = req.user.id; - - const plugin = { - loading: true, - inputs: [], - latest: null, - outputs: null, - }; - - const addMetadata = (data) => (metadata = data); - const getReqData = (data = {}) => { - for (let key in data) { - if (key === 'userMessage') { - userMessage = data[key]; - } else if (key === 'responseMessageId') { - responseMessageId = data[key]; - } else if (key === 'promptTokens') { - promptTokens = data[key]; - } - } - }; - - const { - onProgress: progressCallback, - sendIntermediateMessage, - getPartialText, - } = createOnProgress({ - generation, - onProgress: ({ text: partialText }) => { - const currentTimestamp = Date.now(); - - if (plugin.loading === true) { - plugin.loading = false; +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res) => { + let { + text, + generation, + endpointOption, + conversationId, + responseMessageId, + isContinued = false, + parentMessageId = null, + overrideParentMessageId = null, + } = req.body; + + logger.debug('[/edit/gptPlugins]', { + text, + generation, + isContinued, + conversationId, + ...endpointOption, + }); + + let userMessage; + let promptTokens; + const sender = getResponseSender({ + ...endpointOption, + model: endpointOption.modelOptions.model, + }); + const userMessageId = parentMessageId; + const user = req.user.id; + + const plugin = { + loading: true, + inputs: [], + latest: null, + outputs: null, + }; + + const getReqData = (data = {}) => { + for (let key in data) { + if (key === 'userMessage') { + userMessage = data[key]; + } else if (key === 'responseMessageId') { + responseMessageId = data[key]; + } else if (key === 'promptTokens') { + promptTokens = data[key]; + } } + }; + + const throttledSaveMessage = throttle(saveMessage, 3000, { trailing: false }); + const { + onProgress: progressCallback, + sendIntermediateMessage, + getPartialText, + } = createOnProgress({ + generation, + onProgress: ({ text: partialText }) => { + if (plugin.loading === true) { + plugin.loading = false; + } - if (currentTimestamp - lastSavedTimestamp > saveDelay) { - lastSavedTimestamp = currentTimestamp; - saveMessage({ + throttledSaveMessage({ messageId: responseMessageId, sender, conversationId, @@ -94,104 +100,95 @@ router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, error: false, user, }); - } + }, + }); - if (saveDelay < 500) { - saveDelay = 500; + const onAgentAction = (action, start = false) => { + const formattedAction = formatAction(action); + plugin.inputs.push(formattedAction); + plugin.latest = formattedAction.plugin; + if (!start) { + saveMessage({ ...userMessage, user }); } - }, - }); - - const onAgentAction = (action, start = false) => { - const formattedAction = formatAction(action); - plugin.inputs.push(formattedAction); - plugin.latest = formattedAction.plugin; - if (!start) { + sendIntermediateMessage(res, { plugin }); + // logger.debug('PLUGIN ACTION', formattedAction); + }; + + const onChainEnd = (data) => { + let { intermediateSteps: steps } = data; + plugin.outputs = steps && steps[0].action ? formatSteps(steps) : 'An error occurred.'; + plugin.loading = false; saveMessage({ ...userMessage, user }); - } - sendIntermediateMessage(res, { plugin }); - // logger.debug('PLUGIN ACTION', formattedAction); - }; - - const onChainEnd = (data) => { - let { intermediateSteps: steps } = data; - plugin.outputs = steps && steps[0].action ? formatSteps(steps) : 'An error occurred.'; - plugin.loading = false; - saveMessage({ ...userMessage, user }); - sendIntermediateMessage(res, { plugin }); - // logger.debug('CHAIN END', plugin.outputs); - }; - - const getAbortData = () => ({ - sender, - conversationId, - messageId: responseMessageId, - parentMessageId: overrideParentMessageId ?? userMessageId, - text: getPartialText(), - plugin: { ...plugin, loading: false }, - userMessage, - promptTokens, - }); - const { abortController, onStart } = createAbortController(req, res, getAbortData); - - try { - endpointOption.tools = await validateTools(user, endpointOption.tools); - const { client } = await initializeClient({ req, res, endpointOption }); - - let response = await client.sendMessage(text, { - user, - generation, - isContinued, - isEdited: true, + sendIntermediateMessage(res, { plugin }); + // logger.debug('CHAIN END', plugin.outputs); + }; + + const getAbortData = () => ({ + sender, conversationId, - parentMessageId, - responseMessageId, - overrideParentMessageId, - getReqData, - onAgentAction, - onChainEnd, - onStart, - addMetadata, - ...endpointOption, - onProgress: progressCallback.call(null, { - res, - text, - plugin, - parentMessageId: overrideParentMessageId || userMessageId, - }), - abortController, + messageId: responseMessageId, + parentMessageId: overrideParentMessageId ?? userMessageId, + text: getPartialText(), + plugin: { ...plugin, loading: false }, + userMessage, + promptTokens, }); + const { abortController, onStart } = createAbortController(req, res, getAbortData); + + try { + endpointOption.tools = await validateTools(user, endpointOption.tools); + const { client } = await initializeClient({ req, res, endpointOption }); + + let response = await client.sendMessage(text, { + user, + generation, + isContinued, + isEdited: true, + conversationId, + parentMessageId, + responseMessageId, + overrideParentMessageId, + getReqData, + onAgentAction, + onChainEnd, + onStart, + ...endpointOption, + onProgress: progressCallback.call(null, { + res, + text, + plugin, + parentMessageId: overrideParentMessageId || userMessageId, + }), + abortController, + }); - if (overrideParentMessageId) { - response.parentMessageId = overrideParentMessageId; - } + if (overrideParentMessageId) { + response.parentMessageId = overrideParentMessageId; + } - if (metadata) { - response = { ...response, ...metadata }; + logger.debug('[/edit/gptPlugins] CLIENT RESPONSE', response); + response.plugin = { ...plugin, loading: false }; + await saveMessage({ ...response, user }); + + sendMessage(res, { + title: await getConvoTitle(user, conversationId), + final: true, + conversation: await getConvo(user, conversationId), + requestMessage: userMessage, + responseMessage: response, + }); + res.end(); + } catch (error) { + const partialText = getPartialText(); + handleAbortError(res, req, error, { + partialText, + conversationId, + sender, + messageId: responseMessageId, + parentMessageId: userMessageId ?? parentMessageId, + }); } - - logger.debug('[/edit/gptPlugins] CLIENT RESPONSE', response); - response.plugin = { ...plugin, loading: false }; - await saveMessage({ ...response, user }); - - sendMessage(res, { - title: await getConvoTitle(user, conversationId), - final: true, - conversation: await getConvo(user, conversationId), - requestMessage: userMessage, - responseMessage: response, - }); - res.end(); - } catch (error) { - const partialText = getPartialText(); - handleAbortError(res, req, error, { - partialText, - conversationId, - sender, - messageId: responseMessageId, - parentMessageId: userMessageId ?? parentMessageId, - }); - } -}); + }, +); module.exports = router; diff --git a/api/server/routes/edit/openAI.js b/api/server/routes/edit/openAI.js index e54881148dc..ae26b235c79 100644 --- a/api/server/routes/edit/openAI.js +++ b/api/server/routes/edit/openAI.js @@ -4,6 +4,7 @@ const { initializeClient } = require('~/server/services/Endpoints/openAI'); const { handleAbort, setHeaders, + validateModel, validateEndpoint, buildEndpointOption, moderateText, @@ -13,8 +14,15 @@ const router = express.Router(); router.use(moderateText); router.post('/abort', handleAbort()); -router.post('/', validateEndpoint, buildEndpointOption, setHeaders, async (req, res, next) => { - await EditController(req, res, next, initializeClient); -}); +router.post( + '/', + validateEndpoint, + validateModel, + buildEndpointOption, + setHeaders, + async (req, res, next) => { + await EditController(req, res, next, initializeClient); + }, +); module.exports = router; diff --git a/api/server/routes/files/avatar.js b/api/server/routes/files/avatar.js index 5abba85f9e8..71ade965cde 100644 --- a/api/server/routes/files/avatar.js +++ b/api/server/routes/files/avatar.js @@ -1,38 +1,36 @@ -const express = require('express'); const multer = require('multer'); - -const uploadAvatar = require('~/server/services/Files/images/avatar'); -const { requireJwtAuth } = require('~/server/middleware/'); -const User = require('~/models/User'); +const express = require('express'); +const { getStrategyFunctions } = require('~/server/services/Files/strategies'); +const { resizeAvatar } = require('~/server/services/Files/images/avatar'); +const { logger } = require('~/config'); const upload = multer(); const router = express.Router(); -router.post('/', requireJwtAuth, upload.single('input'), async (req, res) => { +router.post('/', upload.single('input'), async (req, res) => { try { const userId = req.user.id; const { manual } = req.body; const input = req.file.buffer; + if (!userId) { throw new Error('User ID is undefined'); } - // TODO: do not use Model directly, instead use a service method that uses the model - const user = await User.findById(userId).lean(); - - if (!user) { - throw new Error('User not found'); - } - const url = await uploadAvatar({ - input, + const fileStrategy = req.app.locals.fileStrategy; + const webPBuffer = await resizeAvatar({ userId, - manual, - fileStrategy: req.app.locals.fileStrategy, + input, }); + const { processAvatar } = getStrategyFunctions(fileStrategy); + const url = await processAvatar({ buffer: webPBuffer, userId, manual }); + res.json({ url }); } catch (error) { - res.status(500).json({ message: 'An error occurred while uploading the profile picture' }); + const message = 'An error occurred while uploading the profile picture'; + logger.error(message, error); + res.status(500).json({ message }); } }); diff --git a/api/server/routes/files/files.js b/api/server/routes/files/files.js index 3fea2e5d07b..812d4bd33d7 100644 --- a/api/server/routes/files/files.js +++ b/api/server/routes/files/files.js @@ -1,14 +1,18 @@ -const { z } = require('zod'); +const fs = require('fs').promises; const express = require('express'); -const { FileSources } = require('librechat-data-provider'); +const { isUUID, FileSources } = require('librechat-data-provider'); +const { + filterFile, + processFileUpload, + processDeleteRequest, +} = require('~/server/services/Files/process'); +const { initializeClient } = require('~/server/services/Endpoints/assistants'); const { getStrategyFunctions } = require('~/server/services/Files/strategies'); -const { deleteFiles, getFiles } = require('~/models'); +const { getFiles } = require('~/models/File'); const { logger } = require('~/config'); const router = express.Router(); -const isUUID = z.string().uuid(); - router.get('/', async (req, res) => { try { const files = await getFiles({ user: req.user.id }); @@ -19,6 +23,15 @@ router.get('/', async (req, res) => { } }); +router.get('/config', async (req, res) => { + try { + res.status(200).json(req.app.locals.fileConfig); + } catch (error) { + logger.error('[/files] Error getting fileConfig', error); + res.status(400).json({ message: 'Error in request', error: error.message }); + } +}); + router.delete('/', async (req, res) => { try { const { files: _files } = req.body; @@ -31,6 +44,11 @@ router.delete('/', async (req, res) => { if (!file.filepath) { return false; } + + if (/^(file|assistant)-/.test(file.file_id)) { + return true; + } + return isUUID.safeParse(file.file_id).success; }); @@ -39,33 +57,114 @@ router.delete('/', async (req, res) => { return; } - const file_ids = files.map((file) => file.file_id); - const deletionMethods = {}; - const promises = []; - promises.push(await deleteFiles(file_ids)); + await processDeleteRequest({ req, files }); + + res.status(200).json({ message: 'Files deleted successfully' }); + } catch (error) { + logger.error('[/files] Error deleting files:', error); + res.status(400).json({ message: 'Error in request', error: error.message }); + } +}); + +router.get('/download/:userId/:file_id', async (req, res) => { + try { + const { userId, file_id } = req.params; + logger.debug(`File download requested by user ${userId}: ${file_id}`); - for (const file of files) { - const source = file.source ?? FileSources.local; + if (userId !== req.user.id) { + logger.warn(`${errorPrefix} forbidden: ${file_id}`); + return res.status(403).send('Forbidden'); + } - if (deletionMethods[source]) { - promises.push(deletionMethods[source](req, file)); - continue; - } + const [file] = await getFiles({ file_id }); + const errorPrefix = `File download requested by user ${userId}`; - const { deleteFile } = getStrategyFunctions(source); - if (!deleteFile) { - throw new Error(`Delete function not implemented for ${source}`); - } + if (!file) { + logger.warn(`${errorPrefix} not found: ${file_id}`); + return res.status(404).send('File not found'); + } - deletionMethods[source] = deleteFile; - promises.push(deleteFile(req, file)); + if (!file.filepath.includes(userId)) { + logger.warn(`${errorPrefix} forbidden: ${file_id}`); + return res.status(403).send('Forbidden'); } - await Promise.all(promises); - res.status(200).json({ message: 'Files deleted successfully' }); + if (file.source === FileSources.openai && !file.model) { + logger.warn(`${errorPrefix} has no associated model: ${file_id}`); + return res.status(400).send('The model used when creating this file is not available'); + } + + const { getDownloadStream } = getStrategyFunctions(file.source); + if (!getDownloadStream) { + logger.warn(`${errorPrefix} has no stream method implemented: ${file.source}`); + return res.status(501).send('Not Implemented'); + } + + const setHeaders = () => { + res.setHeader('Content-Disposition', `attachment; filename="${file.filename}"`); + res.setHeader('Content-Type', 'application/octet-stream'); + res.setHeader('X-File-Metadata', JSON.stringify(file)); + }; + + /** @type {{ body: import('stream').PassThrough } | undefined} */ + let passThrough; + /** @type {ReadableStream | undefined} */ + let fileStream; + if (file.source === FileSources.openai) { + req.body = { model: file.model }; + const { openai } = await initializeClient({ req, res }); + logger.debug(`Downloading file ${file_id} from OpenAI`); + passThrough = await getDownloadStream(file_id, openai); + setHeaders(); + logger.debug(`File ${file_id} downloaded from OpenAI`); + passThrough.body.pipe(res); + } else { + fileStream = getDownloadStream(file_id); + setHeaders(); + fileStream.pipe(res); + } } catch (error) { - logger.error('[/files] Error deleting files:', error); - res.status(400).json({ message: 'Error in request', error: error.message }); + logger.error('Error downloading file:', error); + res.status(500).send('Error downloading file'); + } +}); + +router.post('/', async (req, res) => { + const file = req.file; + const metadata = req.body; + let cleanup = true; + + try { + filterFile({ req, file }); + + metadata.temp_file_id = metadata.file_id; + metadata.file_id = req.file_id; + + await processFileUpload({ req, res, file, metadata }); + } catch (error) { + let message = 'Error processing file'; + logger.error('[/files] Error processing file:', error); + cleanup = false; + + if (error.message?.includes('file_ids')) { + message += ': ' + error.message; + } + + // TODO: delete remote file if it exists + try { + await fs.unlink(file.path); + } catch (error) { + logger.error('[/files] Error deleting file:', error); + } + res.status(500).json({ message }); + } + + if (cleanup) { + try { + await fs.unlink(file.path); + } catch (error) { + logger.error('[/files/images] Error deleting file after file processing:', error); + } } }); diff --git a/api/server/routes/files/images.js b/api/server/routes/files/images.js index 30d3c3cac60..374711c4acd 100644 --- a/api/server/routes/files/images.js +++ b/api/server/routes/files/images.js @@ -1,60 +1,36 @@ -const { z } = require('zod'); +const path = require('path'); const fs = require('fs').promises; const express = require('express'); -const upload = require('./multer'); -const { processImageUpload } = require('~/server/services/Files/process'); +const { filterFile, processImageFile } = require('~/server/services/Files/process'); const { logger } = require('~/config'); const router = express.Router(); -router.post('/', upload.single('file'), async (req, res) => { - const file = req.file; +router.post('/', async (req, res) => { const metadata = req.body; - // TODO: add file size/type validation - - const uuidSchema = z.string().uuid(); try { - if (!file) { - throw new Error('No file provided'); - } + filterFile({ req, file: req.file, image: true }); - if (!metadata.file_id) { - throw new Error('No file_id provided'); - } - - if (!metadata.width) { - throw new Error('No width provided'); - } - - if (!metadata.height) { - throw new Error('No height provided'); - } - /* parse to validate api call */ - uuidSchema.parse(metadata.file_id); metadata.temp_file_id = metadata.file_id; metadata.file_id = req.file_id; - await processImageUpload({ req, res, file, metadata }); + await processImageFile({ req, res, file: req.file, metadata }); } catch (error) { + // TODO: delete remote file if it exists logger.error('[/files/images] Error processing file:', error); try { - await fs.unlink(file.path); + const filepath = path.join( + req.app.locals.paths.imageOutput, + req.user.id, + path.basename(req.file.filename), + ); + await fs.unlink(filepath); } catch (error) { logger.error('[/files/images] Error deleting file:', error); } res.status(500).json({ message: 'Error processing file' }); } - - // do this if strategy is not local - // finally { - // try { - // // await fs.unlink(file.path); - // } catch (error) { - // logger.error('[/files/images] Error deleting file:', error); - - // } - // } }); module.exports = router; diff --git a/api/server/routes/files/index.js b/api/server/routes/files/index.js index 9afb900bbe6..c9f5ce1679e 100644 --- a/api/server/routes/files/index.js +++ b/api/server/routes/files/index.js @@ -1,24 +1,27 @@ const express = require('express'); -const router = express.Router(); -const { - uaParser, - checkBan, - requireJwtAuth, - // concurrentLimiter, - // messageIpLimiter, - // messageUserLimiter, -} = require('../../middleware'); +const createMulterInstance = require('./multer'); +const { uaParser, checkBan, requireJwtAuth, createFileLimiters } = require('~/server/middleware'); const files = require('./files'); const images = require('./images'); const avatar = require('./avatar'); -router.use(requireJwtAuth); -router.use(checkBan); -router.use(uaParser); +const initialize = async () => { + const router = express.Router(); + router.use(requireJwtAuth); + router.use(checkBan); + router.use(uaParser); -router.use('/', files); -router.use('/images', images); -router.use('/images/avatar', avatar); + const upload = await createMulterInstance(); + const { fileUploadIpLimiter, fileUploadUserLimiter } = createFileLimiters(); + router.post('*', fileUploadIpLimiter, fileUploadUserLimiter); + router.post('/', upload.single('file')); + router.post('/images', upload.single('file')); -module.exports = router; + router.use('/', files); + router.use('/images', images); + router.use('/images/avatar', avatar); + return router; +}; + +module.exports = { initialize }; diff --git a/api/server/routes/files/multer.js b/api/server/routes/files/multer.js index d5aea05a373..2162a0d8075 100644 --- a/api/server/routes/files/multer.js +++ b/api/server/routes/files/multer.js @@ -2,13 +2,12 @@ const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); const multer = require('multer'); - -const supportedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp']; -const sizeLimit = 20 * 1024 * 1024; // 20 MB +const { fileConfig: defaultFileConfig, mergeFileConfig } = require('librechat-data-provider'); +const getCustomConfig = require('~/server/services/Config/getCustomConfig'); const storage = multer.diskStorage({ destination: function (req, file, cb) { - const outputPath = path.join(req.app.locals.paths.imageOutput, 'temp'); + const outputPath = path.join(req.app.locals.paths.uploads, 'temp', req.user.id); if (!fs.existsSync(outputPath)) { fs.mkdirSync(outputPath, { recursive: true }); } @@ -16,22 +15,31 @@ const storage = multer.diskStorage({ }, filename: function (req, file, cb) { req.file_id = crypto.randomUUID(); - const fileExt = path.extname(file.originalname); - cb(null, `img-${req.file_id}${fileExt}`); + file.originalname = decodeURIComponent(file.originalname); + cb(null, `${file.originalname}`); }, }); const fileFilter = (req, file, cb) => { - if (!supportedTypes.includes(file.mimetype)) { - return cb( - new Error('Unsupported file type. Only JPEG, JPG, PNG, and WEBP files are allowed.'), - false, - ); + if (!file) { + return cb(new Error('No file provided'), false); + } + + if (!defaultFileConfig.checkType(file.mimetype)) { + return cb(new Error('Unsupported file type: ' + file.mimetype), false); } cb(null, true); }; -const upload = multer({ storage, fileFilter, limits: { fileSize: sizeLimit } }); +const createMulterInstance = async () => { + const customConfig = await getCustomConfig(); + const fileConfig = mergeFileConfig(customConfig?.fileConfig); + return multer({ + storage, + fileFilter, + limits: { fileSize: fileConfig.serverFileSizeLimit }, + }); +}; -module.exports = upload; +module.exports = createMulterInstance; diff --git a/api/server/routes/index.js b/api/server/routes/index.js index 05a4595b02d..8b1ffd8fe8c 100644 --- a/api/server/routes/index.js +++ b/api/server/routes/index.js @@ -17,6 +17,7 @@ const user = require('./user'); const config = require('./config'); const assistants = require('./assistants'); const files = require('./files'); +const staticRoute = require('./static'); module.exports = { search, @@ -38,4 +39,5 @@ module.exports = { config, assistants, files, + staticRoute, }; diff --git a/api/server/routes/messages.js b/api/server/routes/messages.js index 1e2faafe7bf..d53dacae495 100644 --- a/api/server/routes/messages.js +++ b/api/server/routes/messages.js @@ -36,7 +36,7 @@ router.put('/:conversationId/:messageId', validateMessageReq, async (req, res) = const { messageId, model } = req.params; const { text } = req.body; const tokenCount = await countTokens(text, model); - res.status(201).send(await updateMessage({ messageId, text, tokenCount })); + res.status(201).json(await updateMessage({ messageId, text, tokenCount })); }); // DELETE diff --git a/api/server/routes/models.js b/api/server/routes/models.js index 383a63c1136..e3272087a76 100644 --- a/api/server/routes/models.js +++ b/api/server/routes/models.js @@ -1,8 +1,8 @@ const express = require('express'); -const router = express.Router(); -const controller = require('../controllers/ModelController'); -const { requireJwtAuth } = require('../middleware/'); +const { modelController } = require('~/server/controllers/ModelController'); +const { requireJwtAuth } = require('~/server/middleware/'); -router.get('/', requireJwtAuth, controller); +const router = express.Router(); +router.get('/', requireJwtAuth, modelController); module.exports = router; diff --git a/api/server/routes/oauth.js b/api/server/routes/oauth.js index 816fc7200f3..e85d83d8883 100644 --- a/api/server/routes/oauth.js +++ b/api/server/routes/oauth.js @@ -1,3 +1,5 @@ +// file deepcode ignore NoRateLimitingForLogin: Rate limiting is handled by the `loginLimiter` middleware + const passport = require('passport'); const express = require('express'); const router = express.Router(); diff --git a/api/server/routes/presets.js b/api/server/routes/presets.js index 76aaed698cd..19214a3a7d1 100644 --- a/api/server/routes/presets.js +++ b/api/server/routes/presets.js @@ -5,27 +5,28 @@ const requireJwtAuth = require('~/server/middleware/requireJwtAuth'); const { logger } = require('~/config'); const router = express.Router(); +router.use(requireJwtAuth); -router.get('/', requireJwtAuth, async (req, res) => { +router.get('/', async (req, res) => { const presets = (await getPresets(req.user.id)).map((preset) => preset); - res.status(200).send(presets); + res.status(200).json(presets); }); -router.post('/', requireJwtAuth, async (req, res) => { +router.post('/', async (req, res) => { const update = req.body || {}; update.presetId = update?.presetId || crypto.randomUUID(); try { const preset = await savePreset(req.user.id, update); - res.status(201).send(preset); + res.status(201).json(preset); } catch (error) { logger.error('[/presets] error saving preset', error); - res.status(500).send(error); + res.status(500).send('There was an error when saving the preset'); } }); -router.post('/delete', requireJwtAuth, async (req, res) => { +router.post('/delete', async (req, res) => { let filter = {}; const { presetId } = req.body || {}; @@ -37,10 +38,10 @@ router.post('/delete', requireJwtAuth, async (req, res) => { try { const deleteCount = await deletePresets(req.user.id, filter); - res.status(201).send(deleteCount); + res.status(201).json(deleteCount); } catch (error) { logger.error('[/presets/delete] error deleting presets', error); - res.status(500).send(error); + res.status(500).send('There was an error deleting the presets'); } }); diff --git a/api/server/routes/static.js b/api/server/routes/static.js new file mode 100644 index 00000000000..116f7c8dd06 --- /dev/null +++ b/api/server/routes/static.js @@ -0,0 +1,7 @@ +const express = require('express'); +const paths = require('~/config/paths'); + +const router = express.Router(); +router.use(express.static(paths.imageOutput)); + +module.exports = router; diff --git a/api/server/routes/tokenizer.js b/api/server/routes/tokenizer.js index 581f82bf2ad..e12a86bde16 100644 --- a/api/server/routes/tokenizer.js +++ b/api/server/routes/tokenizer.js @@ -11,7 +11,7 @@ router.post('/', requireJwtAuth, async (req, res) => { res.send({ count }); } catch (e) { logger.error('[/tokenizer] Error counting tokens', e); - res.status(500).send(e.message); + res.status(500).json('Error counting tokens'); } }); diff --git a/api/server/services/ActionService.js b/api/server/services/ActionService.js new file mode 100644 index 00000000000..22770f15500 --- /dev/null +++ b/api/server/services/ActionService.js @@ -0,0 +1,148 @@ +const { AuthTypeEnum, EModelEndpoint, actionDomainSeparator } = require('librechat-data-provider'); +const { encryptV2, decryptV2 } = require('~/server/utils/crypto'); +const { getActions } = require('~/models/Action'); +const { logger } = require('~/config'); + +/** + * Parses the domain for an action. + * + * Azure OpenAI Assistants API doesn't support periods in function + * names due to `[a-zA-Z0-9_-]*` Regex Validation. + * + * @param {Express.Request} req - Express Request object + * @param {string} domain - The domain for the actoin + * @param {boolean} inverse - If true, replaces periods with `actionDomainSeparator` + * @returns {string} The parsed domain + */ +function domainParser(req, domain, inverse = false) { + if (!domain) { + return; + } + + if (!req.app.locals[EModelEndpoint.azureOpenAI]?.assistants) { + return domain; + } + + if (inverse) { + return domain.replace(/\./g, actionDomainSeparator); + } + + return domain.replace(actionDomainSeparator, '.'); +} + +/** + * Loads action sets based on the user and assistant ID. + * + * @param {Object} searchParams - The parameters for loading action sets. + * @param {string} searchParams.user - The user identifier. + * @param {string} searchParams.assistant_id - The assistant identifier. + * @returns {Promise<Action[] | null>} A promise that resolves to an array of actions or `null` if no match. + */ +async function loadActionSets(searchParams) { + return await getActions(searchParams, true); +} + +/** + * Creates a general tool for an entire action set. + * + * @param {Object} params - The parameters for loading action sets. + * @param {Action} params.action - The action set. Necessary for decrypting authentication values. + * @param {ActionRequest} params.requestBuilder - The ActionRequest builder class to execute the API call. + * @returns { { _call: (toolInput: Object) => unknown} } An object with `_call` method to execute the tool input. + */ +function createActionTool({ action, requestBuilder }) { + action.metadata = decryptMetadata(action.metadata); + const _call = async (toolInput) => { + try { + requestBuilder.setParams(toolInput); + if (action.metadata.auth && action.metadata.auth.type !== AuthTypeEnum.None) { + await requestBuilder.setAuth(action.metadata); + } + const res = await requestBuilder.execute(); + if (typeof res.data === 'object') { + return JSON.stringify(res.data); + } + return res.data; + } catch (error) { + logger.error(`API call to ${action.metadata.domain} failed`, error); + if (error.response) { + const { status, data } = error.response; + return `API call to ${ + action.metadata.domain + } failed with status ${status}: ${JSON.stringify(data)}`; + } + + return `API call to ${action.metadata.domain} failed.`; + } + }; + + return { + _call, + }; +} + +/** + * Encrypts sensitive metadata values for an action. + * + * @param {ActionMetadata} metadata - The action metadata to encrypt. + * @returns {ActionMetadata} The updated action metadata with encrypted values. + */ +function encryptMetadata(metadata) { + const encryptedMetadata = { ...metadata }; + + // ServiceHttp + if (metadata.auth && metadata.auth.type === AuthTypeEnum.ServiceHttp) { + if (metadata.api_key) { + encryptedMetadata.api_key = encryptV2(metadata.api_key); + } + } + + // OAuth + else if (metadata.auth && metadata.auth.type === AuthTypeEnum.OAuth) { + if (metadata.oauth_client_id) { + encryptedMetadata.oauth_client_id = encryptV2(metadata.oauth_client_id); + } + if (metadata.oauth_client_secret) { + encryptedMetadata.oauth_client_secret = encryptV2(metadata.oauth_client_secret); + } + } + + return encryptedMetadata; +} + +/** + * Decrypts sensitive metadata values for an action. + * + * @param {ActionMetadata} metadata - The action metadata to decrypt. + * @returns {ActionMetadata} The updated action metadata with decrypted values. + */ +function decryptMetadata(metadata) { + const decryptedMetadata = { ...metadata }; + + // ServiceHttp + if (metadata.auth && metadata.auth.type === AuthTypeEnum.ServiceHttp) { + if (metadata.api_key) { + decryptedMetadata.api_key = decryptV2(metadata.api_key); + } + } + + // OAuth + else if (metadata.auth && metadata.auth.type === AuthTypeEnum.OAuth) { + if (metadata.oauth_client_id) { + decryptedMetadata.oauth_client_id = decryptV2(metadata.oauth_client_id); + } + if (metadata.oauth_client_secret) { + decryptedMetadata.oauth_client_secret = decryptV2(metadata.oauth_client_secret); + } + } + + return decryptedMetadata; +} + +module.exports = { + loadActionSets, + createActionTool, + encryptMetadata, + decryptMetadata, + domainParser, +}; diff --git a/api/server/services/AppService.js b/api/server/services/AppService.js index b1f7cf57d8b..e4cb416b416 100644 --- a/api/server/services/AppService.js +++ b/api/server/services/AppService.js @@ -1,7 +1,28 @@ -const { FileSources } = require('librechat-data-provider'); +const { + Constants, + FileSources, + Capabilities, + EModelEndpoint, + defaultSocialLogins, + validateAzureGroups, + mapModelToAzureConfig, + assistantEndpointSchema, + deprecatedAzureVariables, + conflictingAzureVariables, +} = require('librechat-data-provider'); const { initializeFirebase } = require('./Files/Firebase/initialize'); const loadCustomConfig = require('./Config/loadCustomConfig'); +const handleRateLimits = require('./Config/handleRateLimits'); +const { loadAndFormatTools } = require('./ToolService'); const paths = require('~/config/paths'); +const { logger } = require('~/config'); + +const secretDefaults = { + CREDS_KEY: 'f34be427ebb29de8d88c107a71546019685ed8b241d8f2ed00c3df97ad2566f0', + CREDS_IV: 'e2341419ec3dd3d19b13a1a87fafcbfb', + JWT_SECRET: '16f8c0ef4a5d391b26034086c628469d3f9f497f08163ab9b40137092f2909ef', + JWT_REFRESH_SECRET: 'eaa5191f2914e30b9387fd84e254e4ba6fc51b4654968a9b0803b456a54b8418', +}; /** * @@ -10,7 +31,9 @@ const paths = require('~/config/paths'); * @param {Express.Application} app - The Express application object. */ const AppService = async (app) => { + /** @type {TCustomConfig}*/ const config = (await loadCustomConfig()) ?? {}; + const fileStrategy = config.fileStrategy ?? FileSources.local; process.env.CDN_PROVIDER = fileStrategy; @@ -18,10 +41,168 @@ const AppService = async (app) => { initializeFirebase(); } + /** @type {Record<string, FunctionTool} */ + const availableTools = loadAndFormatTools({ + directory: paths.structuredTools, + filter: new Set([ + 'ChatTool.js', + 'CodeSherpa.js', + 'CodeSherpaTools.js', + 'E2BTools.js', + 'extractionChain.js', + ]), + }); + + const socialLogins = config?.registration?.socialLogins ?? defaultSocialLogins; + + if (!Object.keys(config).length) { + app.locals = { + availableTools, + fileStrategy, + socialLogins, + paths, + }; + + return; + } + + if (config.version !== Constants.CONFIG_VERSION) { + logger.info( + `\nOutdated Config version: ${config.version}. Current version: ${Constants.CONFIG_VERSION}\n\nCheck out the latest config file guide for new options and features.\nhttps://docs.librechat.ai/install/configuration/custom_config.html\n\n`, + ); + } + + handleRateLimits(config?.rateLimits); + + const endpointLocals = {}; + + if (config?.endpoints?.[EModelEndpoint.azureOpenAI]) { + const { groups, ...azureConfiguration } = config.endpoints[EModelEndpoint.azureOpenAI]; + const { isValid, modelNames, modelGroupMap, groupMap, errors } = validateAzureGroups(groups); + + if (!isValid) { + const errorString = errors.join('\n'); + const errorMessage = 'Invalid Azure OpenAI configuration:\n' + errorString; + logger.error(errorMessage); + throw new Error(errorMessage); + } + + const assistantModels = []; + const assistantGroups = new Set(); + for (const modelName of modelNames) { + mapModelToAzureConfig({ modelName, modelGroupMap, groupMap }); + const groupName = modelGroupMap?.[modelName]?.group; + const modelGroup = groupMap?.[groupName]; + let supportsAssistants = modelGroup?.assistants || modelGroup?.[modelName]?.assistants; + if (supportsAssistants) { + assistantModels.push(modelName); + !assistantGroups.has(groupName) && assistantGroups.add(groupName); + } + } + + if (azureConfiguration.assistants && assistantModels.length === 0) { + throw new Error( + 'No Azure models are configured to support assistants. Please remove the `assistants` field or configure at least one model to support assistants.', + ); + } + + endpointLocals[EModelEndpoint.azureOpenAI] = { + modelNames, + modelGroupMap, + groupMap, + assistantModels, + assistantGroups: Array.from(assistantGroups), + ...azureConfiguration, + }; + + deprecatedAzureVariables.forEach(({ key, description }) => { + if (process.env[key]) { + logger.warn( + `The \`${key}\` environment variable (related to ${description}) should not be used in combination with the \`azureOpenAI\` endpoint configuration, as you will experience conflicts and errors.`, + ); + } + }); + + conflictingAzureVariables.forEach(({ key }) => { + if (process.env[key]) { + logger.warn( + `The \`${key}\` environment variable should not be used in combination with the \`azureOpenAI\` endpoint configuration, as you may experience with the defined placeholders for mapping to the current model grouping using the same name.`, + ); + } + }); + + if (azureConfiguration.assistants) { + endpointLocals[EModelEndpoint.assistants] = { + // Note: may need to add retrieval models here in the future + capabilities: [Capabilities.tools, Capabilities.actions, Capabilities.code_interpreter], + }; + } + } + + if (config?.endpoints?.[EModelEndpoint.assistants]) { + const assistantsConfig = config.endpoints[EModelEndpoint.assistants]; + const parsedConfig = assistantEndpointSchema.parse(assistantsConfig); + if (assistantsConfig.supportedIds?.length && assistantsConfig.excludedIds?.length) { + logger.warn( + `Both \`supportedIds\` and \`excludedIds\` are defined for the ${EModelEndpoint.assistants} endpoint; \`excludedIds\` field will be ignored.`, + ); + } + + const prevConfig = endpointLocals[EModelEndpoint.assistants] ?? {}; + + /** @type {Partial<TAssistantEndpoint>} */ + endpointLocals[EModelEndpoint.assistants] = { + ...prevConfig, + retrievalModels: parsedConfig.retrievalModels, + disableBuilder: parsedConfig.disableBuilder, + pollIntervalMs: parsedConfig.pollIntervalMs, + supportedIds: parsedConfig.supportedIds, + capabilities: parsedConfig.capabilities, + excludedIds: parsedConfig.excludedIds, + timeoutMs: parsedConfig.timeoutMs, + }; + } + + try { + const response = await fetch(`${process.env.RAG_API_URL}/health`); + if (response?.ok && response?.status === 200) { + logger.info(`RAG API is running and reachable at ${process.env.RAG_API_URL}.`); + } + } catch (error) { + logger.warn( + `RAG API is either not running or not reachable at ${process.env.RAG_API_URL}, you may experience errors with file uploads.`, + ); + } + app.locals = { + socialLogins, + availableTools, fileStrategy, + fileConfig: config?.fileConfig, + interface: config?.interface, paths, + ...endpointLocals, }; + + let hasDefaultSecrets = false; + for (const [key, value] of Object.entries(secretDefaults)) { + if (process.env[key] === value) { + logger.warn(`Default value for ${key} is being used.`); + !hasDefaultSecrets && (hasDefaultSecrets = true); + } + } + + if (hasDefaultSecrets) { + logger.info( + `Please replace any default secret values. + + For your conveninence, fork & run this replit to generate your own secret values: + + https://replit.com/@daavila/crypto#index.js + + `, + ); + } }; module.exports = AppService; diff --git a/api/server/services/AppService.spec.js b/api/server/services/AppService.spec.js new file mode 100644 index 00000000000..3a40a49b3e7 --- /dev/null +++ b/api/server/services/AppService.spec.js @@ -0,0 +1,436 @@ +const { + FileSources, + EModelEndpoint, + defaultSocialLogins, + validateAzureGroups, + deprecatedAzureVariables, + conflictingAzureVariables, +} = require('librechat-data-provider'); + +const AppService = require('./AppService'); + +jest.mock('./Config/loadCustomConfig', () => { + return jest.fn(() => + Promise.resolve({ + registration: { socialLogins: ['testLogin'] }, + fileStrategy: 'testStrategy', + }), + ); +}); +jest.mock('./Files/Firebase/initialize', () => ({ + initializeFirebase: jest.fn(), +})); +jest.mock('./ToolService', () => ({ + loadAndFormatTools: jest.fn().mockReturnValue({ + ExampleTool: { + type: 'function', + function: { + description: 'Example tool function', + name: 'exampleFunction', + parameters: { + type: 'object', + properties: { + param1: { type: 'string', description: 'An example parameter' }, + }, + required: ['param1'], + }, + }, + }, + }), +})); + +const azureGroups = [ + { + group: 'librechat-westus', + apiKey: '${WESTUS_API_KEY}', + instanceName: 'librechat-westus', + version: '2023-12-01-preview', + models: { + 'gpt-4-vision-preview': { + deploymentName: 'gpt-4-vision-preview', + version: '2024-02-15-preview', + }, + 'gpt-3.5-turbo': { + deploymentName: 'gpt-35-turbo', + }, + 'gpt-3.5-turbo-1106': { + deploymentName: 'gpt-35-turbo-1106', + }, + 'gpt-4': { + deploymentName: 'gpt-4', + }, + 'gpt-4-1106-preview': { + deploymentName: 'gpt-4-1106-preview', + }, + }, + }, + { + group: 'librechat-eastus', + apiKey: '${EASTUS_API_KEY}', + instanceName: 'librechat-eastus', + deploymentName: 'gpt-4-turbo', + version: '2024-02-15-preview', + models: { + 'gpt-4-turbo': true, + }, + }, +]; + +describe('AppService', () => { + let app; + + beforeEach(() => { + app = { locals: {} }; + process.env.CDN_PROVIDER = undefined; + }); + + it('should correctly assign process.env and app.locals based on custom config', async () => { + await AppService(app); + + expect(process.env.CDN_PROVIDER).toEqual('testStrategy'); + + expect(app.locals).toEqual({ + socialLogins: ['testLogin'], + fileStrategy: 'testStrategy', + availableTools: { + ExampleTool: { + type: 'function', + function: expect.objectContaining({ + description: 'Example tool function', + name: 'exampleFunction', + parameters: expect.objectContaining({ + type: 'object', + properties: expect.any(Object), + required: expect.arrayContaining(['param1']), + }), + }), + }, + }, + paths: expect.anything(), + }); + }); + + it('should log a warning if the config version is outdated', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + version: '0.9.0', // An outdated version for this test + registration: { socialLogins: ['testLogin'] }, + fileStrategy: 'testStrategy', + }), + ); + + await AppService(app); + + const { logger } = require('~/config'); + expect(logger.info).toHaveBeenCalledWith(expect.stringContaining('Outdated Config version')); + }); + + it('should initialize Firebase when fileStrategy is firebase', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + fileStrategy: FileSources.firebase, + }), + ); + + await AppService(app); + + const { initializeFirebase } = require('./Files/Firebase/initialize'); + expect(initializeFirebase).toHaveBeenCalled(); + + expect(process.env.CDN_PROVIDER).toEqual(FileSources.firebase); + }); + + it('should load and format tools accurately with defined structure', async () => { + const { loadAndFormatTools } = require('./ToolService'); + await AppService(app); + + expect(loadAndFormatTools).toHaveBeenCalledWith({ + directory: expect.anything(), + filter: expect.anything(), + }); + + expect(app.locals.availableTools.ExampleTool).toBeDefined(); + expect(app.locals.availableTools.ExampleTool).toEqual({ + type: 'function', + function: { + description: 'Example tool function', + name: 'exampleFunction', + parameters: { + type: 'object', + properties: { + param1: { type: 'string', description: 'An example parameter' }, + }, + required: ['param1'], + }, + }, + }); + }); + + it('should correctly configure Assistants endpoint based on custom config', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.assistants]: { + disableBuilder: true, + pollIntervalMs: 5000, + timeoutMs: 30000, + supportedIds: ['id1', 'id2'], + }, + }, + }), + ); + + await AppService(app); + + expect(app.locals).toHaveProperty(EModelEndpoint.assistants); + expect(app.locals[EModelEndpoint.assistants]).toEqual( + expect.objectContaining({ + disableBuilder: true, + pollIntervalMs: 5000, + timeoutMs: 30000, + supportedIds: expect.arrayContaining(['id1', 'id2']), + }), + ); + }); + + it('should correctly configure Azure OpenAI endpoint based on custom config', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.azureOpenAI]: { + groups: azureGroups, + }, + }, + }), + ); + + process.env.WESTUS_API_KEY = 'westus-key'; + process.env.EASTUS_API_KEY = 'eastus-key'; + + await AppService(app); + + expect(app.locals).toHaveProperty(EModelEndpoint.azureOpenAI); + const azureConfig = app.locals[EModelEndpoint.azureOpenAI]; + expect(azureConfig).toHaveProperty('modelNames'); + expect(azureConfig).toHaveProperty('modelGroupMap'); + expect(azureConfig).toHaveProperty('groupMap'); + + const { modelNames, modelGroupMap, groupMap } = validateAzureGroups(azureGroups); + expect(azureConfig.modelNames).toEqual(modelNames); + expect(azureConfig.modelGroupMap).toEqual(modelGroupMap); + expect(azureConfig.groupMap).toEqual(groupMap); + }); + + it('should not modify FILE_UPLOAD environment variables without rate limits', async () => { + // Setup initial environment variables + process.env.FILE_UPLOAD_IP_MAX = '10'; + process.env.FILE_UPLOAD_IP_WINDOW = '15'; + process.env.FILE_UPLOAD_USER_MAX = '5'; + process.env.FILE_UPLOAD_USER_WINDOW = '20'; + + const initialEnv = { ...process.env }; + + await AppService(app); + + // Expect environment variables to remain unchanged + expect(process.env.FILE_UPLOAD_IP_MAX).toEqual(initialEnv.FILE_UPLOAD_IP_MAX); + expect(process.env.FILE_UPLOAD_IP_WINDOW).toEqual(initialEnv.FILE_UPLOAD_IP_WINDOW); + expect(process.env.FILE_UPLOAD_USER_MAX).toEqual(initialEnv.FILE_UPLOAD_USER_MAX); + expect(process.env.FILE_UPLOAD_USER_WINDOW).toEqual(initialEnv.FILE_UPLOAD_USER_WINDOW); + }); + + it('should correctly set FILE_UPLOAD environment variables based on rate limits', async () => { + // Define and mock a custom configuration with rate limits + const rateLimitsConfig = { + rateLimits: { + fileUploads: { + ipMax: '100', + ipWindowInMinutes: '60', + userMax: '50', + userWindowInMinutes: '30', + }, + }, + }; + + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve(rateLimitsConfig), + ); + + await AppService(app); + + // Verify that process.env has been updated according to the rate limits config + expect(process.env.FILE_UPLOAD_IP_MAX).toEqual('100'); + expect(process.env.FILE_UPLOAD_IP_WINDOW).toEqual('60'); + expect(process.env.FILE_UPLOAD_USER_MAX).toEqual('50'); + expect(process.env.FILE_UPLOAD_USER_WINDOW).toEqual('30'); + }); + + it('should fallback to default FILE_UPLOAD environment variables when rate limits are unspecified', async () => { + // Setup initial environment variables to non-default values + process.env.FILE_UPLOAD_IP_MAX = 'initialMax'; + process.env.FILE_UPLOAD_IP_WINDOW = 'initialWindow'; + process.env.FILE_UPLOAD_USER_MAX = 'initialUserMax'; + process.env.FILE_UPLOAD_USER_WINDOW = 'initialUserWindow'; + + // Mock a custom configuration without specific rate limits + require('./Config/loadCustomConfig').mockImplementationOnce(() => Promise.resolve({})); + + await AppService(app); + + // Verify that process.env falls back to the initial values + expect(process.env.FILE_UPLOAD_IP_MAX).toEqual('initialMax'); + expect(process.env.FILE_UPLOAD_IP_WINDOW).toEqual('initialWindow'); + expect(process.env.FILE_UPLOAD_USER_MAX).toEqual('initialUserMax'); + expect(process.env.FILE_UPLOAD_USER_WINDOW).toEqual('initialUserWindow'); + }); +}); + +describe('AppService updating app.locals and issuing warnings', () => { + let app; + let initialEnv; + + beforeEach(() => { + // Store initial environment variables to restore them after each test + initialEnv = { ...process.env }; + + app = { locals: {} }; + process.env.CDN_PROVIDER = undefined; + }); + + afterEach(() => { + // Restore initial environment variables + process.env = { ...initialEnv }; + }); + + it('should update app.locals with default values if loadCustomConfig returns undefined', async () => { + // Mock loadCustomConfig to return undefined + require('./Config/loadCustomConfig').mockImplementationOnce(() => Promise.resolve(undefined)); + + await AppService(app); + + expect(app.locals).toBeDefined(); + expect(app.locals.paths).toBeDefined(); + expect(app.locals.availableTools).toBeDefined(); + expect(app.locals.fileStrategy).toEqual(FileSources.local); + expect(app.locals.socialLogins).toEqual(defaultSocialLogins); + }); + + it('should update app.locals with values from loadCustomConfig', async () => { + // Mock loadCustomConfig to return a specific config object + const customConfig = { + fileStrategy: 'firebase', + registration: { socialLogins: ['testLogin'] }, + }; + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve(customConfig), + ); + + await AppService(app); + + expect(app.locals).toBeDefined(); + expect(app.locals.paths).toBeDefined(); + expect(app.locals.availableTools).toBeDefined(); + expect(app.locals.fileStrategy).toEqual(customConfig.fileStrategy); + expect(app.locals.socialLogins).toEqual(customConfig.registration.socialLogins); + }); + + it('should apply the assistants endpoint configuration correctly to app.locals', async () => { + const mockConfig = { + endpoints: { + assistants: { + disableBuilder: true, + pollIntervalMs: 5000, + timeoutMs: 30000, + supportedIds: ['id1', 'id2'], + }, + }, + }; + require('./Config/loadCustomConfig').mockImplementationOnce(() => Promise.resolve(mockConfig)); + + const app = { locals: {} }; + await AppService(app); + + expect(app.locals).toHaveProperty('assistants'); + const { assistants } = app.locals; + expect(assistants.disableBuilder).toBe(true); + expect(assistants.pollIntervalMs).toBe(5000); + expect(assistants.timeoutMs).toBe(30000); + expect(assistants.supportedIds).toEqual(['id1', 'id2']); + expect(assistants.excludedIds).toBeUndefined(); + }); + + it('should log a warning when both supportedIds and excludedIds are provided', async () => { + const mockConfig = { + endpoints: { + assistants: { + disableBuilder: false, + pollIntervalMs: 3000, + timeoutMs: 20000, + supportedIds: ['id1', 'id2'], + excludedIds: ['id3'], + }, + }, + }; + require('./Config/loadCustomConfig').mockImplementationOnce(() => Promise.resolve(mockConfig)); + + const app = { locals: {} }; + await require('./AppService')(app); + + const { logger } = require('~/config'); + expect(logger.warn).toHaveBeenCalledWith( + expect.stringContaining('Both `supportedIds` and `excludedIds` are defined'), + ); + }); + + it('should issue expected warnings when loading Azure Groups with deprecated Environment Variables', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.azureOpenAI]: { + groups: azureGroups, + }, + }, + }), + ); + + deprecatedAzureVariables.forEach((varInfo) => { + process.env[varInfo.key] = 'test'; + }); + + const app = { locals: {} }; + await require('./AppService')(app); + + const { logger } = require('~/config'); + deprecatedAzureVariables.forEach(({ key, description }) => { + expect(logger.warn).toHaveBeenCalledWith( + `The \`${key}\` environment variable (related to ${description}) should not be used in combination with the \`azureOpenAI\` endpoint configuration, as you will experience conflicts and errors.`, + ); + }); + }); + + it('should issue expected warnings when loading conflicting Azure Envrionment Variables', async () => { + require('./Config/loadCustomConfig').mockImplementationOnce(() => + Promise.resolve({ + endpoints: { + [EModelEndpoint.azureOpenAI]: { + groups: azureGroups, + }, + }, + }), + ); + + conflictingAzureVariables.forEach((varInfo) => { + process.env[varInfo.key] = 'test'; + }); + + const app = { locals: {} }; + await require('./AppService')(app); + + const { logger } = require('~/config'); + conflictingAzureVariables.forEach(({ key }) => { + expect(logger.warn).toHaveBeenCalledWith( + `The \`${key}\` environment variable should not be used in combination with the \`azureOpenAI\` endpoint configuration, as you may experience with the defined placeholders for mapping to the current model grouping using the same name.`, + ); + }); + }); +}); diff --git a/api/server/services/AssistantService.js b/api/server/services/AssistantService.js index 4b929193481..41e88dc8bdb 100644 --- a/api/server/services/AssistantService.js +++ b/api/server/services/AssistantService.js @@ -1,256 +1,91 @@ -const RunManager = require('./Runs/RunMananger'); +const { klona } = require('klona'); +const { + StepTypes, + RunStatus, + StepStatus, + ContentTypes, + ToolCallTypes, + imageGenTools, + EModelEndpoint, + defaultOrderQuery, +} = require('librechat-data-provider'); +const { retrieveAndProcessFile } = require('~/server/services/Files/process'); +const { processRequiredActions } = require('~/server/services/ToolService'); +const { createOnProgress, sendMessage, sleep } = require('~/server/utils'); +const { RunManager, waitForRun } = require('~/server/services/Runs'); +const { processMessages } = require('~/server/services/Threads'); +const { TextStream } = require('~/app/clients'); +const { logger } = require('~/config'); /** - * @typedef {Object} Message - * @property {string} id - The identifier of the message. - * @property {string} object - The object type, always 'thread.message'. - * @property {number} created_at - The Unix timestamp (in seconds) for when the message was created. - * @property {string} thread_id - The thread ID that this message belongs to. - * @property {string} role - The entity that produced the message. One of 'user' or 'assistant'. - * @property {Object[]} content - The content of the message in an array of text and/or images. - * @property {string} content[].type - The type of content, either 'text' or 'image_file'. - * @property {Object} [content[].text] - The text content, present if type is 'text'. - * @property {string} content[].text.value - The data that makes up the text. - * @property {Object[]} [content[].text.annotations] - Annotations for the text content. - * @property {Object} [content[].image_file] - The image file content, present if type is 'image_file'. - * @property {string} content[].image_file.file_id - The File ID of the image in the message content. - * @property {string[]} [file_ids] - Optional list of File IDs for the message. - * @property {string|null} [assistant_id] - If applicable, the ID of the assistant that authored this message. - * @property {string|null} [run_id] - If applicable, the ID of the run associated with the authoring of this message. - * @property {Object} [metadata] - Optional metadata for the message, a map of key-value pairs. - */ - -/** - * @typedef {Object} FunctionTool - * @property {string} type - The type of tool, 'function'. - * @property {Object} function - The function definition. - * @property {string} function.description - A description of what the function does. - * @property {string} function.name - The name of the function to be called. - * @property {Object} function.parameters - The parameters the function accepts, described as a JSON Schema object. - */ - -/** - * @typedef {Object} Tool - * @property {string} type - The type of tool, can be 'code_interpreter', 'retrieval', or 'function'. - * @property {FunctionTool} [function] - The function tool, present if type is 'function'. - */ - -/** - * @typedef {Object} Run - * @property {string} id - The identifier of the run. - * @property {string} object - The object type, always 'thread.run'. - * @property {number} created_at - The Unix timestamp (in seconds) for when the run was created. - * @property {string} thread_id - The ID of the thread that was executed on as a part of this run. - * @property {string} assistant_id - The ID of the assistant used for execution of this run. - * @property {string} status - The status of the run (e.g., 'queued', 'completed'). - * @property {Object} [required_action] - Details on the action required to continue the run. - * @property {string} required_action.type - The type of required action, always 'submit_tool_outputs'. - * @property {Object} required_action.submit_tool_outputs - Details on the tool outputs needed for the run to continue. - * @property {Object[]} required_action.submit_tool_outputs.tool_calls - A list of the relevant tool calls. - * @property {string} required_action.submit_tool_outputs.tool_calls[].id - The ID of the tool call. - * @property {string} required_action.submit_tool_outputs.tool_calls[].type - The type of tool call the output is required for, always 'function'. - * @property {Object} required_action.submit_tool_outputs.tool_calls[].function - The function definition. - * @property {string} required_action.submit_tool_outputs.tool_calls[].function.name - The name of the function. - * @property {string} required_action.submit_tool_outputs.tool_calls[].function.arguments - The arguments that the model expects you to pass to the function. - * @property {Object} [last_error] - The last error associated with this run. - * @property {string} last_error.code - One of 'server_error' or 'rate_limit_exceeded'. - * @property {string} last_error.message - A human-readable description of the error. - * @property {number} [expires_at] - The Unix timestamp (in seconds) for when the run will expire. - * @property {number} [started_at] - The Unix timestamp (in seconds) for when the run was started. - * @property {number} [cancelled_at] - The Unix timestamp (in seconds) for when the run was cancelled. - * @property {number} [failed_at] - The Unix timestamp (in seconds) for when the run failed. - * @property {number} [completed_at] - The Unix timestamp (in seconds) for when the run was completed. - * @property {string} [model] - The model that the assistant used for this run. - * @property {string} [instructions] - The instructions that the assistant used for this run. - * @property {Tool[]} [tools] - The list of tools used for this run. - * @property {string[]} [file_ids] - The list of File IDs used for this run. - * @property {Object} [metadata] - Metadata associated with this run. - */ - -/** - * @typedef {Object} RunStep - * @property {string} id - The identifier of the run step. - * @property {string} object - The object type, always 'thread.run.step'. - * @property {number} created_at - The Unix timestamp (in seconds) for when the run step was created. - * @property {string} assistant_id - The ID of the assistant associated with the run step. - * @property {string} thread_id - The ID of the thread that was run. - * @property {string} run_id - The ID of the run that this run step is a part of. - * @property {string} type - The type of run step, either 'message_creation' or 'tool_calls'. - * @property {string} status - The status of the run step, can be 'in_progress', 'cancelled', 'failed', 'completed', or 'expired'. - * @property {Object} step_details - The details of the run step. - * @property {Object} [last_error] - The last error associated with this run step. - * @property {string} last_error.code - One of 'server_error' or 'rate_limit_exceeded'. - * @property {string} last_error.message - A human-readable description of the error. - * @property {number} [expired_at] - The Unix timestamp (in seconds) for when the run step expired. - * @property {number} [cancelled_at] - The Unix timestamp (in seconds) for when the run step was cancelled. - * @property {number} [failed_at] - The Unix timestamp (in seconds) for when the run step failed. - * @property {number} [completed_at] - The Unix timestamp (in seconds) for when the run step completed. - * @property {Object} [metadata] - Metadata associated with this run step, a map of up to 16 key-value pairs. - */ - -/** - * @typedef {Object} StepMessage - * @property {Message} message - The complete message object created by the step. - * @property {string} id - The identifier of the run step. - * @property {string} object - The object type, always 'thread.run.step'. - * @property {number} created_at - The Unix timestamp (in seconds) for when the run step was created. - * @property {string} assistant_id - The ID of the assistant associated with the run step. - * @property {string} thread_id - The ID of the thread that was run. - * @property {string} run_id - The ID of the run that this run step is a part of. - * @property {string} type - The type of run step, either 'message_creation' or 'tool_calls'. - * @property {string} status - The status of the run step, can be 'in_progress', 'cancelled', 'failed', 'completed', or 'expired'. - * @property {Object} step_details - The details of the run step. - * @property {Object} [last_error] - The last error associated with this run step. - * @property {string} last_error.code - One of 'server_error' or 'rate_limit_exceeded'. - * @property {string} last_error.message - A human-readable description of the error. - * @property {number} [expired_at] - The Unix timestamp (in seconds) for when the run step expired. - * @property {number} [cancelled_at] - The Unix timestamp (in seconds) for when the run step was cancelled. - * @property {number} [failed_at] - The Unix timestamp (in seconds) for when the run step failed. - * @property {number} [completed_at] - The Unix timestamp (in seconds) for when the run step completed. - * @property {Object} [metadata] - Metadata associated with this run step, a map of up to 16 key-value pairs. - */ - -/** - * Initializes a new thread or adds messages to an existing thread. - * - * @param {Object} params - The parameters for initializing a thread. - * @param {OpenAI} params.openai - The OpenAI client instance. - * @param {Object} params.body - The body of the request. - * @param {Message[]} params.body.messages - A list of messages to start the thread with. - * @param {Object} [params.body.metadata] - Optional metadata for the thread. - * @param {string} [params.thread_id] - Optional existing thread ID. If provided, a message will be added to this thread. - * @return {Promise<Thread>} A promise that resolves to the newly created thread object or the updated thread object. - */ -async function initThread({ openai, body, thread_id: _thread_id }) { - let thread = {}; - const messages = []; - if (_thread_id) { - const message = await openai.beta.threads.messages.create(_thread_id, body.messages[0]); - messages.push(message); - } else { - thread = await openai.beta.threads.create(body); - } - - const thread_id = _thread_id ?? thread.id; - return { messages, thread_id, ...thread }; -} - -/** - * Creates a run on a thread using the OpenAI API. + * Sorts, processes, and flattens messages to a single string. * - * @param {Object} params - The parameters for creating a run. - * @param {OpenAI} params.openai - The OpenAI client instance. - * @param {string} params.thread_id - The ID of the thread to run. - * @param {Object} params.body - The body of the request to create a run. - * @param {string} params.body.assistant_id - The ID of the assistant to use for this run. - * @param {string} [params.body.model] - Optional. The ID of the model to be used for this run. - * @param {string} [params.body.instructions] - Optional. Override the default system message of the assistant. - * @param {Object[]} [params.body.tools] - Optional. Override the tools the assistant can use for this run. - * @param {string[]} [params.body.file_ids] - Optional. List of File IDs the assistant can use for this run. - * @param {Object} [params.body.metadata] - Optional. Metadata for the run. - * @return {Promise<Run>} A promise that resolves to the created run object. + * @param {Object} params - Params for creating the onTextProgress function. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {string} params.conversationId - The current conversation ID. + * @param {string} params.userMessageId - The user message ID; response's `parentMessageId`. + * @param {string} params.messageId - The response message ID. + * @param {string} params.thread_id - The current thread ID. + * @returns {void} */ -async function createRun({ openai, thread_id, body }) { - const run = await openai.beta.threads.runs.create(thread_id, body); - return run; -} - -// /** -// * Retrieves all steps of a run. -// * -// * @param {Object} params - The parameters for the retrieveRunSteps function. -// * @param {OpenAI} params.openai - The OpenAI client instance. -// * @param {string} params.thread_id - The ID of the thread associated with the run. -// * @param {string} params.run_id - The ID of the run to retrieve steps for. -// * @return {Promise<RunStep[]>} A promise that resolves to an array of RunStep objects. -// */ -// async function retrieveRunSteps({ openai, thread_id, run_id }) { -// const runSteps = await openai.beta.threads.runs.steps.list(thread_id, run_id); -// return runSteps; -// } - -/** - * Delays the execution for a specified number of milliseconds. - * - * @param {number} ms - The number of milliseconds to delay. - * @return {Promise<void>} A promise that resolves after the specified delay. - */ -function sleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -/** - * Waits for a run to complete by repeatedly checking its status. It uses a RunManager instance to fetch and manage run steps based on the run status. - * - * @param {Object} params - The parameters for the waitForRun function. - * @param {OpenAI} params.openai - The OpenAI client instance. - * @param {string} params.run_id - The ID of the run to wait for. - * @param {string} params.thread_id - The ID of the thread associated with the run. - * @param {RunManager} params.runManager - The RunManager instance to manage run steps. - * @param {number} params.pollIntervalMs - The interval for polling the run status, default is 500 milliseconds. - * @return {Promise<Run>} A promise that resolves to the last fetched run object. - */ -async function waitForRun({ openai, run_id, thread_id, runManager, pollIntervalMs = 500 }) { - const timeout = 18000; // 18 seconds - let timeElapsed = 0; - let run; - - // this runManager will be passed in from the caller - // const runManager = new RunManager({ - // 'in_progress': (step) => { /* ... */ }, - // 'queued': (step) => { /* ... */ }, - // }); - - while (timeElapsed < timeout) { - run = await openai.beta.threads.runs.retrieve(thread_id, run_id); - console.log(`Run status: ${run.status}`); - - if (!['in_progress', 'queued'].includes(run.status)) { - await runManager.fetchRunSteps({ - openai, - thread_id: thread_id, - run_id: run_id, - runStatus: run.status, - final: true, - }); - break; +async function createOnTextProgress({ + openai, + conversationId, + userMessageId, + messageId, + thread_id, +}) { + openai.responseMessage = { + conversationId, + parentMessageId: userMessageId, + role: 'assistant', + messageId, + content: [], + }; + + openai.responseText = ''; + + openai.addContentData = (data) => { + const { type, index } = data; + openai.responseMessage.content[index] = { type, [type]: data[type] }; + + if (type === ContentTypes.TEXT) { + openai.responseText += data[type].value; + return; } - // may use in future - // await runManager.fetchRunSteps({ - // openai, - // thread_id: thread_id, - // run_id: run_id, - // runStatus: run.status, - // }); - - await sleep(pollIntervalMs); - timeElapsed += pollIntervalMs; - } - - return run; + const contentData = { + index, + type, + [type]: data[type], + messageId, + thread_id, + conversationId, + }; + + logger.debug('Content data:', contentData); + sendMessage(openai.res, contentData); + }; } /** * Retrieves the response from an OpenAI run. * * @param {Object} params - The parameters for getting the response. - * @param {OpenAI} params.openai - The OpenAI client instance. + * @param {OpenAIClient} params.openai - The OpenAI client instance. * @param {string} params.run_id - The ID of the run to get the response for. * @param {string} params.thread_id - The ID of the thread associated with the run. - * @return {Promise<OpenAIAssistantFinish | OpenAIAssistantAction[] | Message[] | RequiredActionFunctionToolCall[]>} + * @return {Promise<OpenAIAssistantFinish | OpenAIAssistantAction[] | ThreadMessage[] | RequiredActionFunctionToolCall[]>} */ async function getResponse({ openai, run_id, thread_id }) { const run = await waitForRun({ openai, run_id, thread_id, pollIntervalMs: 500 }); - if (run.status === 'completed') { - const messages = await openai.beta.threads.messages.list(thread_id, { - order: 'asc', - }); + if (run.status === RunStatus.COMPLETED) { + const messages = await openai.beta.threads.messages.list(thread_id, defaultOrderQuery); const newMessages = messages.data.filter((msg) => msg.run_id === run_id); return newMessages; - } else if (run.status === 'requires_action') { + } else if (run.status === RunStatus.REQUIRES_ACTION) { const actions = []; run.required_action?.submit_tool_outputs.tool_calls.forEach((item) => { const functionCall = item.function; @@ -259,7 +94,6 @@ async function getResponse({ openai, run_id, thread_id }) { tool: functionCall.name, toolInput: args, toolCallId: item.id, - log: '', run_id, thread_id, }); @@ -272,90 +106,349 @@ async function getResponse({ openai, run_id, thread_id }) { throw new Error(`Unexpected run status ${run.status}.\nFull run info:\n\n${runInfo}`); } +/** + * Filters the steps to keep only the most recent instance of each unique step. + * @param {RunStep[]} steps - The array of RunSteps to filter. + * @return {RunStep[]} The filtered array of RunSteps. + */ +function filterSteps(steps = []) { + if (steps.length <= 1) { + return steps; + } + const stepMap = new Map(); + + steps.forEach((step) => { + if (!step) { + return; + } + + const effectiveTimestamp = Math.max( + step.created_at, + step.expired_at || 0, + step.cancelled_at || 0, + step.failed_at || 0, + step.completed_at || 0, + ); + + if (!stepMap.has(step.id) || effectiveTimestamp > stepMap.get(step.id).effectiveTimestamp) { + const latestStep = { ...step, effectiveTimestamp }; + if (latestStep.last_error) { + // testing to see if we ever step into this + } + stepMap.set(step.id, latestStep); + } + }); + + return Array.from(stepMap.values()).map((step) => { + delete step.effectiveTimestamp; + return step; + }); +} + +/** + * @callback InProgressFunction + * @param {Object} params - The parameters for the in progress step. + * @param {RunStep} params.step - The step object with details about the message creation. + * @returns {Promise<void>} - A promise that resolves when the step is processed. + */ + +function hasToolCallChanged(previousCall, currentCall) { + return JSON.stringify(previousCall) !== JSON.stringify(currentCall); +} + +/** + * Creates a handler function for steps in progress, specifically for + * processing messages and managing seen completed messages. + * + * @param {OpenAIClient} openai - The OpenAI client instance. + * @param {string} thread_id - The ID of the thread the run is in. + * @param {ThreadMessage[]} messages - The accumulated messages for the run. + * @return {InProgressFunction} a function to handle steps in progress. + */ +function createInProgressHandler(openai, thread_id, messages) { + openai.index = 0; + openai.mappedOrder = new Map(); + openai.seenToolCalls = new Map(); + openai.processedFileIds = new Set(); + openai.completeToolCallSteps = new Set(); + openai.seenCompletedMessages = new Set(); + + /** + * The in_progress function for handling message creation steps. + * + * @type {InProgressFunction} + */ + async function in_progress({ step }) { + if (step.type === StepTypes.TOOL_CALLS) { + const { tool_calls } = step.step_details; + + for (const _toolCall of tool_calls) { + /** @type {StepToolCall} */ + const toolCall = _toolCall; + const previousCall = openai.seenToolCalls.get(toolCall.id); + + // If the tool call isn't new and hasn't changed + if (previousCall && !hasToolCallChanged(previousCall, toolCall)) { + continue; + } + + let toolCallIndex = openai.mappedOrder.get(toolCall.id); + if (toolCallIndex === undefined) { + // New tool call + toolCallIndex = openai.index; + openai.mappedOrder.set(toolCall.id, openai.index); + openai.index++; + } + + if (step.status === StepStatus.IN_PROGRESS) { + toolCall.progress = + previousCall && previousCall.progress + ? Math.min(previousCall.progress + 0.2, 0.95) + : 0.01; + } else { + toolCall.progress = 1; + openai.completeToolCallSteps.add(step.id); + } + + if ( + toolCall.type === ToolCallTypes.CODE_INTERPRETER && + step.status === StepStatus.COMPLETED + ) { + const { outputs } = toolCall[toolCall.type]; + + for (const output of outputs) { + if (output.type !== 'image') { + continue; + } + + if (openai.processedFileIds.has(output.image?.file_id)) { + continue; + } + + const { file_id } = output.image; + const file = await retrieveAndProcessFile({ + openai, + client: openai, + file_id, + basename: `${file_id}.png`, + }); + + const prelimImage = file; + + // check if every key has a value before adding to content + const prelimImageKeys = Object.keys(prelimImage); + const validImageFile = prelimImageKeys.every((key) => prelimImage[key]); + + if (!validImageFile) { + continue; + } + + const image_file = { + [ContentTypes.IMAGE_FILE]: prelimImage, + type: ContentTypes.IMAGE_FILE, + index: openai.index, + }; + openai.addContentData(image_file); + openai.processedFileIds.add(file_id); + openai.index++; + } + } else if ( + toolCall.type === ToolCallTypes.FUNCTION && + step.status === StepStatus.COMPLETED && + imageGenTools.has(toolCall[toolCall.type].name) + ) { + /* If a change is detected, skip image generation tools as already processed */ + openai.seenToolCalls.set(toolCall.id, toolCall); + continue; + } + + openai.addContentData({ + [ContentTypes.TOOL_CALL]: toolCall, + index: toolCallIndex, + type: ContentTypes.TOOL_CALL, + }); + + // Update the stored tool call + openai.seenToolCalls.set(toolCall.id, toolCall); + } + } else if (step.type === StepTypes.MESSAGE_CREATION && step.status === StepStatus.COMPLETED) { + const { message_id } = step.step_details.message_creation; + if (openai.seenCompletedMessages.has(message_id)) { + return; + } + + openai.seenCompletedMessages.add(message_id); + + const message = await openai.beta.threads.messages.retrieve(thread_id, message_id); + if (!message?.content?.length) { + return; + } + messages.push(message); + + let messageIndex = openai.mappedOrder.get(step.id); + if (messageIndex === undefined) { + // New message + messageIndex = openai.index; + openai.mappedOrder.set(step.id, openai.index); + openai.index++; + } + + const result = await processMessages({ openai, client: openai, messages: [message] }); + openai.addContentData({ + [ContentTypes.TEXT]: { value: result.text }, + type: ContentTypes.TEXT, + index: messageIndex, + }); + + // Create the Factory Function to stream the message + const { onProgress: progressCallback } = createOnProgress({ + // todo: add option to save partialText to db + // onProgress: () => {}, + }); + + // This creates a function that attaches all of the parameters + // specified here to each SSE message generated by the TextStream + const onProgress = progressCallback({ + res: openai.res, + index: messageIndex, + messageId: openai.responseMessage.messageId, + conversationId: openai.responseMessage.conversationId, + type: ContentTypes.TEXT, + thread_id, + }); + + // Create a small buffer before streaming begins + await sleep(500); + + const stream = new TextStream(result.text, { delay: 9 }); + await stream.processTextStream(onProgress); + } + } + + return in_progress; +} + /** * Initializes a RunManager with handlers, then invokes waitForRun to monitor and manage an OpenAI run. * * @param {Object} params - The parameters for managing and monitoring the run. - * @param {OpenAI} params.openai - The OpenAI client instance. + * @param {OpenAIClient} params.openai - The OpenAI client instance. * @param {string} params.run_id - The ID of the run to manage and monitor. * @param {string} params.thread_id - The ID of the thread associated with the run. - * @return {Promise<Object>} A promise that resolves to an object containing the run and managed steps. + * @param {RunStep[]} params.accumulatedSteps - The accumulated steps for the run. + * @param {ThreadMessage[]} params.accumulatedMessages - The accumulated messages for the run. + * @param {InProgressFunction} [params.in_progress] - The `in_progress` function from a previous run. + * @return {Promise<RunResponse>} A promise that resolves to an object containing the run and managed steps. */ -async function handleRun({ openai, run_id, thread_id }) { - let steps; - let messages; +async function runAssistant({ + openai, + run_id, + thread_id, + accumulatedSteps = [], + accumulatedMessages = [], + in_progress: inProgress, +}) { + let steps = accumulatedSteps; + let messages = accumulatedMessages; + const in_progress = inProgress ?? createInProgressHandler(openai, thread_id, messages); + openai.in_progress = in_progress; + const runManager = new RunManager({ - // 'in_progress': async ({ step, final, isLast }) => { - // // Define logic for handling steps with 'in_progress' status - // }, - // 'queued': async ({ step, final, isLast }) => { - // // Define logic for handling steps with 'queued' status - // }, + in_progress, final: async ({ step, runStatus, stepsByStatus }) => { - console.log(`Final step for ${run_id} with status ${runStatus}`); - console.dir(step, { depth: null }); + logger.debug(`[runAssistant] Final step for ${run_id} with status ${runStatus}`, step); const promises = []; - promises.push( - openai.beta.threads.messages.list(thread_id, { - order: 'asc', - }), - ); + // promises.push( + // openai.beta.threads.messages.list(thread_id, defaultOrderQuery), + // ); - const finalSteps = stepsByStatus[runStatus]; - - // loop across all statuses, may use in the future - // for (const [_status, stepsPromises] of Object.entries(stepsByStatus)) { - // promises.push(...stepsPromises); + // const finalSteps = stepsByStatus[runStatus]; + // for (const stepPromise of finalSteps) { + // promises.push(stepPromise); // } - for (const stepPromise of finalSteps) { - promises.push(stepPromise); + + // loop across all statuses + for (const [_status, stepsPromises] of Object.entries(stepsByStatus)) { + promises.push(...stepsPromises); } const resolved = await Promise.all(promises); - const res = resolved.shift(); - messages = res.data.filter((msg) => msg.run_id === run_id); + const finalSteps = filterSteps(steps.concat(resolved)); + + if (step.type === StepTypes.MESSAGE_CREATION) { + const incompleteToolCallSteps = finalSteps.filter( + (s) => s && s.type === StepTypes.TOOL_CALLS && !openai.completeToolCallSteps.has(s.id), + ); + for (const incompleteToolCallStep of incompleteToolCallSteps) { + await in_progress({ step: incompleteToolCallStep }); + } + } + await in_progress({ step }); + // const res = resolved.shift(); + // messages = messages.concat(res.data.filter((msg) => msg && msg.run_id === run_id)); resolved.push(step); - steps = resolved; + /* Note: no issues without deep cloning, but it's safer to do so */ + steps = klona(finalSteps); }, }); - const run = await waitForRun({ openai, run_id, thread_id, runManager, pollIntervalMs: 500 }); + /** @type {TCustomConfig.endpoints.assistants} */ + const assistantsEndpointConfig = openai.req.app.locals?.[EModelEndpoint.assistants] ?? {}; + const { pollIntervalMs, timeoutMs } = assistantsEndpointConfig; + + const run = await waitForRun({ + openai, + run_id, + thread_id, + runManager, + pollIntervalMs, + timeout: timeoutMs, + }); - return { run, steps, messages }; -} + if (!run.required_action) { + // const { messages: sortedMessages, text } = await processMessages(openai, messages); + // return { run, steps, messages: sortedMessages, text }; + const sortedMessages = messages.sort((a, b) => a.created_at - b.created_at); + return { + run, + steps, + messages: sortedMessages, + finalMessage: openai.responseMessage, + text: openai.responseText, + }; + } -/** - * Maps messages to their corresponding steps. Steps with message creation will be paired with their messages, - * while steps without message creation will be returned as is. - * - * @param {RunStep[]} steps - An array of steps from the run. - * @param {Message[]} messages - An array of message objects. - * @returns {(StepMessage | RunStep)[]} An array where each element is either a step with its corresponding message (StepMessage) or a step without a message (RunStep). - */ -function mapMessagesToSteps(steps, messages) { - // Create a map of messages indexed by their IDs for efficient lookup - const messageMap = messages.reduce((acc, msg) => { - acc[msg.id] = msg; - return acc; - }, {}); - - // Map each step to its corresponding message, or return the step as is if no message ID is present - return steps.map((step) => { - const messageId = step.step_details?.message_creation?.message_id; - - if (messageId && messageMap[messageId]) { - return { step, message: messageMap[messageId] }; - } - return step; + const { submit_tool_outputs } = run.required_action; + const actions = submit_tool_outputs.tool_calls.map((item) => { + const functionCall = item.function; + const args = JSON.parse(functionCall.arguments); + return { + tool: functionCall.name, + toolInput: args, + toolCallId: item.id, + run_id, + thread_id, + }; + }); + + const outputs = await processRequiredActions(openai, actions); + + const toolRun = await openai.beta.threads.runs.submitToolOutputs(run.thread_id, run.id, outputs); + + // Recursive call with accumulated steps and messages + return await runAssistant({ + openai, + run_id: toolRun.id, + thread_id, + accumulatedSteps: steps, + accumulatedMessages: messages, + in_progress, }); } module.exports = { - initThread, - createRun, - waitForRun, getResponse, - handleRun, - mapMessagesToSteps, + runAssistant, + createOnTextProgress, }; diff --git a/api/server/services/AuthService.js b/api/server/services/AuthService.js index a60ae370efe..098110df0d4 100644 --- a/api/server/services/AuthService.js +++ b/api/server/services/AuthService.js @@ -1,6 +1,8 @@ const crypto = require('crypto'); const bcrypt = require('bcryptjs'); -const { registerSchema, errorsToString } = require('~/strategies/validators'); +const { errorsToString } = require('librechat-data-provider'); +const { registerSchema } = require('~/strategies/validators'); +const getCustomConfig = require('~/server/services/Config/getCustomConfig'); const Token = require('~/models/schema/tokenSchema'); const { sendEmail } = require('~/server/utils'); const Session = require('~/models/Session'); @@ -12,6 +14,27 @@ const domains = { server: process.env.DOMAIN_SERVER, }; +async function isDomainAllowed(email) { + if (!email) { + return false; + } + + const domain = email.split('@')[1]; + + if (!domain) { + return false; + } + + const customConfig = await getCustomConfig(); + if (!customConfig) { + return true; + } else if (!customConfig?.registration?.allowedDomains) { + return true; + } + + return customConfig.registration.allowedDomains.includes(domain); +} + const isProduction = process.env.NODE_ENV === 'production'; /** @@ -80,6 +103,12 @@ const registerUser = async (user) => { return { status: 500, message: 'Something went wrong' }; } + if (!(await isDomainAllowed(email))) { + const errorMessage = 'Registration from this domain is not allowed.'; + logger.error(`[registerUser] [Registration not allowed] [Email: ${user.email}]`); + return { status: 403, message: errorMessage }; + } + //determine if this is the first registered user (not counting anonymous_user) const isFirstRegisteredUser = (await User.countDocuments({})) === 0; @@ -143,8 +172,10 @@ const requestPasswordReset = async (email) => { user.email, 'Password Reset Request', { + appName: process.env.APP_TITLE || 'LibreChat', name: user.name, link: link, + year: new Date().getFullYear(), }, 'requestPasswordReset.handlebars', ); @@ -185,7 +216,9 @@ const resetPassword = async (userId, token, password) => { user.email, 'Password Reset Successfully', { + appName: process.env.APP_TITLE || 'LibreChat', name: user.name, + year: new Date().getFullYear(), }, 'passwordReset.handlebars', ); @@ -239,6 +272,7 @@ const setAuthTokens = async (userId, res, sessionId = null) => { module.exports = { registerUser, logoutUser, + isDomainAllowed, requestPasswordReset, resetPassword, setAuthTokens, diff --git a/api/server/services/AuthService.spec.js b/api/server/services/AuthService.spec.js new file mode 100644 index 00000000000..fb5d8e2533c --- /dev/null +++ b/api/server/services/AuthService.spec.js @@ -0,0 +1,39 @@ +const getCustomConfig = require('~/server/services/Config/getCustomConfig'); +const { isDomainAllowed } = require('./AuthService'); + +jest.mock('~/server/services/Config/getCustomConfig', () => jest.fn()); + +describe('isDomainAllowed', () => { + it('should allow domain when customConfig is not available', async () => { + getCustomConfig.mockResolvedValue(null); + await expect(isDomainAllowed('test@domain1.com')).resolves.toBe(true); + }); + + it('should allow domain when allowedDomains is not defined in customConfig', async () => { + getCustomConfig.mockResolvedValue({}); + await expect(isDomainAllowed('test@domain1.com')).resolves.toBe(true); + }); + + it('should reject an email if it is falsy', async () => { + getCustomConfig.mockResolvedValue({}); + await expect(isDomainAllowed('')).resolves.toBe(false); + }); + + it('should allow a domain if it is included in the allowedDomains', async () => { + getCustomConfig.mockResolvedValue({ + registration: { + allowedDomains: ['domain1.com', 'domain2.com'], + }, + }); + await expect(isDomainAllowed('user@domain1.com')).resolves.toBe(true); + }); + + it('should reject a domain if it is not included in the allowedDomains', async () => { + getCustomConfig.mockResolvedValue({ + registration: { + allowedDomains: ['domain1.com', 'domain2.com'], + }, + }); + await expect(isDomainAllowed('user@domain3.com')).resolves.toBe(false); + }); +}); diff --git a/api/server/services/Config/EndpointService.js b/api/server/services/Config/EndpointService.js index 998e7a83d03..987fbb88517 100644 --- a/api/server/services/Config/EndpointService.js +++ b/api/server/services/Config/EndpointService.js @@ -1,24 +1,25 @@ const { EModelEndpoint } = require('librechat-data-provider'); +const { isUserProvided, generateConfig } = require('~/server/utils'); const { OPENAI_API_KEY: openAIApiKey, + ASSISTANTS_API_KEY: assistantsApiKey, AZURE_API_KEY: azureOpenAIApiKey, ANTHROPIC_API_KEY: anthropicApiKey, CHATGPT_TOKEN: chatGPTToken, BINGAI_TOKEN: bingToken, PLUGINS_USE_AZURE, GOOGLE_KEY: googleKey, + OPENAI_REVERSE_PROXY, + AZURE_OPENAI_BASEURL, + ASSISTANTS_BASE_URL, } = process.env ?? {}; const useAzurePlugins = !!PLUGINS_USE_AZURE; const userProvidedOpenAI = useAzurePlugins - ? azureOpenAIApiKey === 'user_provided' - : openAIApiKey === 'user_provided'; - -function isUserProvided(key) { - return key ? { userProvide: key === 'user_provided' } : false; -} + ? isUserProvided(azureOpenAIApiKey) + : isUserProvided(openAIApiKey); module.exports = { config: { @@ -27,11 +28,11 @@ module.exports = { useAzurePlugins, userProvidedOpenAI, googleKey, - [EModelEndpoint.openAI]: isUserProvided(openAIApiKey), - [EModelEndpoint.assistant]: isUserProvided(openAIApiKey), - [EModelEndpoint.azureOpenAI]: isUserProvided(azureOpenAIApiKey), - [EModelEndpoint.chatGPTBrowser]: isUserProvided(chatGPTToken), - [EModelEndpoint.anthropic]: isUserProvided(anthropicApiKey), - [EModelEndpoint.bingAI]: isUserProvided(bingToken), + [EModelEndpoint.openAI]: generateConfig(openAIApiKey, OPENAI_REVERSE_PROXY), + [EModelEndpoint.assistants]: generateConfig(assistantsApiKey, ASSISTANTS_BASE_URL, true), + [EModelEndpoint.azureOpenAI]: generateConfig(azureOpenAIApiKey, AZURE_OPENAI_BASEURL), + [EModelEndpoint.chatGPTBrowser]: generateConfig(chatGPTToken), + [EModelEndpoint.anthropic]: generateConfig(anthropicApiKey), + [EModelEndpoint.bingAI]: generateConfig(bingToken), }, }; diff --git a/api/cache/getCustomConfig.js b/api/server/services/Config/getCustomConfig.js similarity index 69% rename from api/cache/getCustomConfig.js rename to api/server/services/Config/getCustomConfig.js index 62082c5cbae..a479ca37b71 100644 --- a/api/cache/getCustomConfig.js +++ b/api/server/services/Config/getCustomConfig.js @@ -1,10 +1,12 @@ const { CacheKeys } = require('librechat-data-provider'); -const loadCustomConfig = require('~/server/services/Config/loadCustomConfig'); -const getLogStores = require('./getLogStores'); +const loadCustomConfig = require('./loadCustomConfig'); +const getLogStores = require('~/cache/getLogStores'); /** * Retrieves the configuration object - * @function getCustomConfig */ + * @function getCustomConfig + * @returns {Promise<TCustomConfig | null>} + * */ async function getCustomConfig() { const cache = getLogStores(CacheKeys.CONFIG_STORE); let customConfig = await cache.get(CacheKeys.CUSTOM_CONFIG); diff --git a/api/server/services/Config/handleRateLimits.js b/api/server/services/Config/handleRateLimits.js new file mode 100644 index 00000000000..d40ccfb4f33 --- /dev/null +++ b/api/server/services/Config/handleRateLimits.js @@ -0,0 +1,22 @@ +/** + * + * @param {TCustomConfig['rateLimits'] | undefined} rateLimits + */ +const handleRateLimits = (rateLimits) => { + if (!rateLimits) { + return; + } + const { fileUploads } = rateLimits; + if (!fileUploads) { + return; + } + + process.env.FILE_UPLOAD_IP_MAX = fileUploads.ipMax ?? process.env.FILE_UPLOAD_IP_MAX; + process.env.FILE_UPLOAD_IP_WINDOW = + fileUploads.ipWindowInMinutes ?? process.env.FILE_UPLOAD_IP_WINDOW; + process.env.FILE_UPLOAD_USER_MAX = fileUploads.userMax ?? process.env.FILE_UPLOAD_USER_MAX; + process.env.FILE_UPLOAD_USER_WINDOW = + fileUploads.userWindowInMinutes ?? process.env.FILE_UPLOAD_USER_WINDOW; +}; + +module.exports = handleRateLimits; diff --git a/api/server/services/Config/index.js b/api/server/services/Config/index.js index 57a00bf515e..2e8ccb1433c 100644 --- a/api/server/services/Config/index.js +++ b/api/server/services/Config/index.js @@ -1,4 +1,5 @@ const { config } = require('./EndpointService'); +const getCustomConfig = require('./getCustomConfig'); const loadCustomConfig = require('./loadCustomConfig'); const loadConfigModels = require('./loadConfigModels'); const loadDefaultModels = require('./loadDefaultModels'); @@ -9,6 +10,7 @@ const loadDefaultEndpointsConfig = require('./loadDefaultEConfig'); module.exports = { config, + getCustomConfig, loadCustomConfig, loadConfigModels, loadDefaultModels, diff --git a/api/server/services/Config/loadAsyncEndpoints.js b/api/server/services/Config/loadAsyncEndpoints.js index 9e92f487fad..409b9485de2 100644 --- a/api/server/services/Config/loadAsyncEndpoints.js +++ b/api/server/services/Config/loadAsyncEndpoints.js @@ -1,12 +1,16 @@ -const { availableTools } = require('~/app/clients/tools'); +const { EModelEndpoint } = require('librechat-data-provider'); const { addOpenAPISpecs } = require('~/app/clients/tools/util/addOpenAPISpecs'); -const { openAIApiKey, azureOpenAIApiKey, useAzurePlugins, userProvidedOpenAI, googleKey } = - require('./EndpointService').config; +const { availableTools } = require('~/app/clients/tools'); +const { isUserProvided } = require('~/server/utils'); +const { config } = require('./EndpointService'); + +const { openAIApiKey, azureOpenAIApiKey, useAzurePlugins, userProvidedOpenAI, googleKey } = config; /** * Load async endpoints and return a configuration object + * @param {Express.Request} req - The request object */ -async function loadAsyncEndpoints() { +async function loadAsyncEndpoints(req) { let i = 0; let serviceKey, googleUserProvides; try { @@ -17,7 +21,7 @@ async function loadAsyncEndpoints() { } } - if (googleKey === 'user_provided') { + if (isUserProvided(googleKey)) { googleUserProvides = true; if (i <= 1) { i++; @@ -35,13 +39,18 @@ async function loadAsyncEndpoints() { const google = serviceKey || googleKey ? { userProvide: googleUserProvides } : false; + const useAzure = req.app.locals[EModelEndpoint.azureOpenAI]?.plugins; const gptPlugins = - openAIApiKey || azureOpenAIApiKey + useAzure || openAIApiKey || azureOpenAIApiKey ? { plugins, availableAgents: ['classic', 'functions'], - userProvide: userProvidedOpenAI, - azure: useAzurePlugins, + userProvide: useAzure ? false : userProvidedOpenAI, + userProvideURL: useAzure + ? false + : config[EModelEndpoint.openAI]?.userProvideURL || + config[EModelEndpoint.azureOpenAI]?.userProvideURL, + azure: useAzurePlugins || useAzure, } : false; diff --git a/api/server/services/Config/loadConfigEndpoints.js b/api/server/services/Config/loadConfigEndpoints.js index 1b435e144e9..cd05cb9acb4 100644 --- a/api/server/services/Config/loadConfigEndpoints.js +++ b/api/server/services/Config/loadConfigEndpoints.js @@ -1,18 +1,14 @@ -const { CacheKeys, EModelEndpoint } = require('librechat-data-provider'); -const { isUserProvided, extractEnvVariable } = require('~/server/utils'); -const loadCustomConfig = require('./loadCustomConfig'); -const { getLogStores } = require('~/cache'); +const { EModelEndpoint, extractEnvVariable } = require('librechat-data-provider'); +const { isUserProvided } = require('~/server/utils'); +const getCustomConfig = require('./getCustomConfig'); /** * Load config endpoints from the cached configuration object - * @function loadConfigEndpoints */ -async function loadConfigEndpoints() { - const cache = getLogStores(CacheKeys.CONFIG_STORE); - let customConfig = await cache.get(CacheKeys.CUSTOM_CONFIG); - - if (!customConfig) { - customConfig = await loadCustomConfig(); - } + * @param {Express.Request} req - The request object + * @returns {Promise<TEndpointsConfig>} A promise that resolves to an object containing the endpoints configuration + */ +async function loadConfigEndpoints(req) { + const customConfig = await getCustomConfig(); if (!customConfig) { return {}; @@ -48,6 +44,20 @@ async function loadConfigEndpoints() { } } + if (req.app.locals[EModelEndpoint.azureOpenAI]) { + /** @type {Omit<TConfig, 'order'>} */ + endpointsConfig[EModelEndpoint.azureOpenAI] = { + userProvide: false, + }; + } + + if (req.app.locals[EModelEndpoint.azureOpenAI]?.assistants) { + /** @type {Omit<TConfig, 'order'>} */ + endpointsConfig[EModelEndpoint.assistants] = { + userProvide: false, + }; + } + return endpointsConfig; } diff --git a/api/server/services/Config/loadConfigModels.js b/api/server/services/Config/loadConfigModels.js index 0abe15a8a1f..b3997a2ada0 100644 --- a/api/server/services/Config/loadConfigModels.js +++ b/api/server/services/Config/loadConfigModels.js @@ -1,19 +1,15 @@ -const { CacheKeys, EModelEndpoint } = require('librechat-data-provider'); -const { isUserProvided, extractEnvVariable } = require('~/server/utils'); +const { EModelEndpoint, extractEnvVariable } = require('librechat-data-provider'); const { fetchModels } = require('~/server/services/ModelService'); -const loadCustomConfig = require('./loadCustomConfig'); -const { getLogStores } = require('~/cache'); +const { isUserProvided } = require('~/server/utils'); +const getCustomConfig = require('./getCustomConfig'); /** * Load config endpoints from the cached configuration object - * @function loadConfigModels */ -async function loadConfigModels() { - const cache = getLogStores(CacheKeys.CONFIG_STORE); - let customConfig = await cache.get(CacheKeys.CUSTOM_CONFIG); - - if (!customConfig) { - customConfig = await loadCustomConfig(); - } + * @function loadConfigModels + * @param {Express.Request} req - The Express request object. + */ +async function loadConfigModels(req) { + const customConfig = await getCustomConfig(); if (!customConfig) { return {}; @@ -21,6 +17,21 @@ async function loadConfigModels() { const { endpoints = {} } = customConfig ?? {}; const modelsConfig = {}; + const azureEndpoint = endpoints[EModelEndpoint.azureOpenAI]; + const azureConfig = req.app.locals[EModelEndpoint.azureOpenAI]; + const { modelNames } = azureConfig ?? {}; + + if (modelNames && azureEndpoint) { + modelsConfig[EModelEndpoint.azureOpenAI] = modelNames; + } + + if (modelNames && azureEndpoint && azureEndpoint.plugins) { + modelsConfig[EModelEndpoint.gptPlugins] = modelNames; + } + + if (azureEndpoint?.assistants && azureConfig.assistantModels) { + modelsConfig[EModelEndpoint.assistants] = azureConfig.assistantModels; + } if (!Array.isArray(endpoints[EModelEndpoint.custom])) { return modelsConfig; @@ -35,23 +46,43 @@ async function loadConfigModels() { (endpoint.models.fetch || endpoint.models.default), ); - const fetchPromisesMap = {}; // Map for promises keyed by baseURL - const baseUrlToNameMap = {}; // Map to associate baseURLs with names + /** + * @type {Record<string, string[]>} + * Map for promises keyed by unique combination of baseURL and apiKey */ + const fetchPromisesMap = {}; + /** + * @type {Record<string, string[]>} + * Map to associate unique keys with endpoint names; note: one key may can correspond to multiple endpoints */ + const uniqueKeyToEndpointsMap = {}; + /** + * @type {Record<string, Partial<TEndpoint>>} + * Map to associate endpoint names to their configurations */ + const endpointsMap = {}; for (let i = 0; i < customEndpoints.length; i++) { const endpoint = customEndpoints[i]; const { models, name, baseURL, apiKey } = endpoint; + endpointsMap[name] = endpoint; const API_KEY = extractEnvVariable(apiKey); const BASE_URL = extractEnvVariable(baseURL); + const uniqueKey = `${BASE_URL}__${API_KEY}`; + modelsConfig[name] = []; if (models.fetch && !isUserProvided(API_KEY) && !isUserProvided(BASE_URL)) { - fetchPromisesMap[BASE_URL] = - fetchPromisesMap[BASE_URL] || fetchModels({ baseURL: BASE_URL, apiKey: API_KEY }); - baseUrlToNameMap[BASE_URL] = baseUrlToNameMap[BASE_URL] || []; - baseUrlToNameMap[BASE_URL].push(name); + fetchPromisesMap[uniqueKey] = + fetchPromisesMap[uniqueKey] || + fetchModels({ + user: req.user.id, + baseURL: BASE_URL, + apiKey: API_KEY, + name, + userIdQuery: models.userIdQuery, + }); + uniqueKeyToEndpointsMap[uniqueKey] = uniqueKeyToEndpointsMap[uniqueKey] || []; + uniqueKeyToEndpointsMap[uniqueKey].push(name); continue; } @@ -61,15 +92,16 @@ async function loadConfigModels() { } const fetchedData = await Promise.all(Object.values(fetchPromisesMap)); - const baseUrls = Object.keys(fetchPromisesMap); + const uniqueKeys = Object.keys(fetchPromisesMap); for (let i = 0; i < fetchedData.length; i++) { - const currentBaseUrl = baseUrls[i]; + const currentKey = uniqueKeys[i]; const modelData = fetchedData[i]; - const associatedNames = baseUrlToNameMap[currentBaseUrl]; + const associatedNames = uniqueKeyToEndpointsMap[currentKey]; for (const name of associatedNames) { - modelsConfig[name] = modelData; + const endpoint = endpointsMap[name]; + modelsConfig[name] = !modelData?.length ? endpoint.models.default ?? [] : modelData; } } diff --git a/api/server/services/Config/loadConfigModels.spec.js b/api/server/services/Config/loadConfigModels.spec.js new file mode 100644 index 00000000000..1b7dec5fd71 --- /dev/null +++ b/api/server/services/Config/loadConfigModels.spec.js @@ -0,0 +1,329 @@ +const { fetchModels } = require('~/server/services/ModelService'); +const loadConfigModels = require('./loadConfigModels'); +const getCustomConfig = require('./getCustomConfig'); + +jest.mock('~/server/services/ModelService'); +jest.mock('./getCustomConfig'); + +const exampleConfig = { + endpoints: { + custom: [ + { + name: 'Mistral', + apiKey: '${MY_PRECIOUS_MISTRAL_KEY}', + baseURL: 'https://api.mistral.ai/v1', + models: { + default: ['mistral-tiny', 'mistral-small', 'mistral-medium', 'mistral-large-latest'], + fetch: true, + }, + dropParams: ['stop', 'user', 'frequency_penalty', 'presence_penalty'], + }, + { + name: 'OpenRouter', + apiKey: '${MY_OPENROUTER_API_KEY}', + baseURL: 'https://openrouter.ai/api/v1', + models: { + default: ['gpt-3.5-turbo'], + fetch: true, + }, + dropParams: ['stop'], + }, + { + name: 'groq', + apiKey: 'user_provided', + baseURL: 'https://api.groq.com/openai/v1/', + models: { + default: ['llama2-70b-4096', 'mixtral-8x7b-32768'], + fetch: false, + }, + }, + { + name: 'Ollama', + apiKey: 'user_provided', + baseURL: 'http://localhost:11434/v1/', + models: { + default: ['mistral', 'llama2:13b'], + fetch: false, + }, + }, + ], + }, +}; + +describe('loadConfigModels', () => { + const mockRequest = { app: { locals: {} }, user: { id: 'testUserId' } }; + + const originalEnv = process.env; + + beforeEach(() => { + jest.resetAllMocks(); + jest.resetModules(); + process.env = { ...originalEnv }; + }); + + afterEach(() => { + process.env = originalEnv; + }); + + it('should return an empty object if customConfig is null', async () => { + getCustomConfig.mockResolvedValue(null); + const result = await loadConfigModels(mockRequest); + expect(result).toEqual({}); + }); + + it('handles azure models and endpoint correctly', async () => { + mockRequest.app.locals.azureOpenAI = { modelNames: ['model1', 'model2'] }; + getCustomConfig.mockResolvedValue({ + endpoints: { + azureOpenAI: { + models: ['model1', 'model2'], + }, + }, + }); + + const result = await loadConfigModels(mockRequest); + expect(result.azureOpenAI).toEqual(['model1', 'model2']); + }); + + it('fetches custom models based on the unique key', async () => { + process.env.BASE_URL = 'http://example.com'; + process.env.API_KEY = 'some-api-key'; + const customEndpoints = { + custom: [ + { + baseURL: '${BASE_URL}', + apiKey: '${API_KEY}', + name: 'CustomModel', + models: { fetch: true }, + }, + ], + }; + + getCustomConfig.mockResolvedValue({ endpoints: customEndpoints }); + fetchModels.mockResolvedValue(['customModel1', 'customModel2']); + + const result = await loadConfigModels(mockRequest); + expect(fetchModels).toHaveBeenCalled(); + expect(result.CustomModel).toEqual(['customModel1', 'customModel2']); + }); + + it('correctly associates models to names using unique keys', async () => { + getCustomConfig.mockResolvedValue({ + endpoints: { + custom: [ + { + baseURL: 'http://example.com', + apiKey: 'API_KEY1', + name: 'Model1', + models: { fetch: true }, + }, + { + baseURL: 'http://example.com', + apiKey: 'API_KEY2', + name: 'Model2', + models: { fetch: true }, + }, + ], + }, + }); + fetchModels.mockImplementation(({ apiKey }) => + Promise.resolve(apiKey === 'API_KEY1' ? ['model1Data'] : ['model2Data']), + ); + + const result = await loadConfigModels(mockRequest); + expect(result.Model1).toEqual(['model1Data']); + expect(result.Model2).toEqual(['model2Data']); + }); + + it('correctly handles multiple endpoints with the same baseURL but different apiKeys', async () => { + // Mock the custom configuration to simulate the user's scenario + getCustomConfig.mockResolvedValue({ + endpoints: { + custom: [ + { + name: 'LiteLLM', + apiKey: '${LITELLM_ALL_MODELS}', + baseURL: '${LITELLM_HOST}', + models: { fetch: true }, + }, + { + name: 'OpenAI', + apiKey: '${LITELLM_OPENAI_MODELS}', + baseURL: '${LITELLM_SECOND_HOST}', + models: { fetch: true }, + }, + { + name: 'Google', + apiKey: '${LITELLM_GOOGLE_MODELS}', + baseURL: '${LITELLM_SECOND_HOST}', + models: { fetch: true }, + }, + ], + }, + }); + + // Mock `fetchModels` to return different models based on the apiKey + fetchModels.mockImplementation(({ apiKey }) => { + switch (apiKey) { + case '${LITELLM_ALL_MODELS}': + return Promise.resolve(['AllModel1', 'AllModel2']); + case '${LITELLM_OPENAI_MODELS}': + return Promise.resolve(['OpenAIModel']); + case '${LITELLM_GOOGLE_MODELS}': + return Promise.resolve(['GoogleModel']); + default: + return Promise.resolve([]); + } + }); + + const result = await loadConfigModels(mockRequest); + + // Assert that the models are correctly fetched and mapped based on unique keys + expect(result.LiteLLM).toEqual(['AllModel1', 'AllModel2']); + expect(result.OpenAI).toEqual(['OpenAIModel']); + expect(result.Google).toEqual(['GoogleModel']); + + // Ensure that fetchModels was called with correct parameters + expect(fetchModels).toHaveBeenCalledTimes(3); + expect(fetchModels).toHaveBeenCalledWith( + expect.objectContaining({ apiKey: '${LITELLM_ALL_MODELS}' }), + ); + expect(fetchModels).toHaveBeenCalledWith( + expect.objectContaining({ apiKey: '${LITELLM_OPENAI_MODELS}' }), + ); + expect(fetchModels).toHaveBeenCalledWith( + expect.objectContaining({ apiKey: '${LITELLM_GOOGLE_MODELS}' }), + ); + }); + + it('loads models based on custom endpoint configuration respecting fetch rules', async () => { + process.env.MY_PRECIOUS_MISTRAL_KEY = 'actual_mistral_api_key'; + process.env.MY_OPENROUTER_API_KEY = 'actual_openrouter_api_key'; + // Setup custom configuration with specific API keys for Mistral and OpenRouter + // and "user_provided" for groq and Ollama, indicating no fetch for the latter two + getCustomConfig.mockResolvedValue(exampleConfig); + + // Assuming fetchModels would be called only for Mistral and OpenRouter + fetchModels.mockImplementation(({ name }) => { + switch (name) { + case 'Mistral': + return Promise.resolve([ + 'mistral-tiny', + 'mistral-small', + 'mistral-medium', + 'mistral-large-latest', + ]); + case 'OpenRouter': + return Promise.resolve(['gpt-3.5-turbo']); + default: + return Promise.resolve([]); + } + }); + + const result = await loadConfigModels(mockRequest); + + // Since fetch is true and apiKey is not "user_provided", fetching occurs for Mistral and OpenRouter + expect(result.Mistral).toEqual([ + 'mistral-tiny', + 'mistral-small', + 'mistral-medium', + 'mistral-large-latest', + ]); + expect(fetchModels).toHaveBeenCalledWith( + expect.objectContaining({ + name: 'Mistral', + apiKey: process.env.MY_PRECIOUS_MISTRAL_KEY, + }), + ); + + expect(result.OpenRouter).toEqual(['gpt-3.5-turbo']); + expect(fetchModels).toHaveBeenCalledWith( + expect.objectContaining({ + name: 'OpenRouter', + apiKey: process.env.MY_OPENROUTER_API_KEY, + }), + ); + + // For groq and Ollama, since the apiKey is "user_provided", models should not be fetched + // Depending on your implementation's behavior regarding "default" models without fetching, + // you may need to adjust the following assertions: + expect(result.groq).toBe(exampleConfig.endpoints.custom[2].models.default); + expect(result.Ollama).toBe(exampleConfig.endpoints.custom[3].models.default); + + // Verifying fetchModels was not called for groq and Ollama + expect(fetchModels).not.toHaveBeenCalledWith( + expect.objectContaining({ + name: 'groq', + }), + ); + expect(fetchModels).not.toHaveBeenCalledWith( + expect.objectContaining({ + name: 'Ollama', + }), + ); + }); + + it('falls back to default models if fetching returns an empty array', async () => { + getCustomConfig.mockResolvedValue({ + endpoints: { + custom: [ + { + name: 'EndpointWithSameFetchKey', + apiKey: 'API_KEY', + baseURL: 'http://example.com', + models: { + fetch: true, + default: ['defaultModel1'], + }, + }, + { + name: 'EmptyFetchModel', + apiKey: 'API_KEY', + baseURL: 'http://example.com', + models: { + fetch: true, + default: ['defaultModel1', 'defaultModel2'], + }, + }, + ], + }, + }); + + fetchModels.mockResolvedValue([]); + + const result = await loadConfigModels(mockRequest); + expect(fetchModels).toHaveBeenCalledTimes(1); + expect(result.EmptyFetchModel).toEqual(['defaultModel1', 'defaultModel2']); + }); + + it('falls back to default models if fetching returns a falsy value', async () => { + getCustomConfig.mockResolvedValue({ + endpoints: { + custom: [ + { + name: 'FalsyFetchModel', + apiKey: 'API_KEY', + baseURL: 'http://example.com', + models: { + fetch: true, + default: ['defaultModel1', 'defaultModel2'], + }, + }, + ], + }, + }); + + fetchModels.mockResolvedValue(false); + + const result = await loadConfigModels(mockRequest); + + expect(fetchModels).toHaveBeenCalledWith( + expect.objectContaining({ + name: 'FalsyFetchModel', + apiKey: 'API_KEY', + }), + ); + + expect(result.FalsyFetchModel).toEqual(['defaultModel1', 'defaultModel2']); + }); +}); diff --git a/api/server/services/Config/loadCustomConfig.js b/api/server/services/Config/loadCustomConfig.js index c17d3283b47..617cd7d9469 100644 --- a/api/server/services/Config/loadCustomConfig.js +++ b/api/server/services/Config/loadCustomConfig.js @@ -1,31 +1,68 @@ const path = require('path'); const { CacheKeys, configSchema } = require('librechat-data-provider'); +const getLogStores = require('~/cache/getLogStores'); const loadYaml = require('~/utils/loadYaml'); -const { getLogStores } = require('~/cache'); const { logger } = require('~/config'); +const axios = require('axios'); +const yaml = require('js-yaml'); const projectRoot = path.resolve(__dirname, '..', '..', '..', '..'); -const configPath = path.resolve(projectRoot, 'librechat.yaml'); +const defaultConfigPath = path.resolve(projectRoot, 'librechat.yaml'); + +let i = 0; /** * Load custom configuration files and caches the object if the `cache` field at root is true. * Validation via parsing the config file with the config schema. * @function loadCustomConfig - * @returns {Promise<null | Object>} A promise that resolves to null or the custom config object. + * @returns {Promise<TCustomConfig | null>} A promise that resolves to null or the custom config object. * */ - async function loadCustomConfig() { - const customConfig = loadYaml(configPath); - if (!customConfig) { - return null; + // Use CONFIG_PATH if set, otherwise fallback to defaultConfigPath + const configPath = process.env.CONFIG_PATH || defaultConfigPath; + + let customConfig; + + if (/^https?:\/\//.test(configPath)) { + try { + const response = await axios.get(configPath); + customConfig = response.data; + } catch (error) { + i === 0 && logger.error(`Failed to fetch the remote config file from ${configPath}`, error); + i === 0 && i++; + return null; + } + } else { + customConfig = loadYaml(configPath); + if (!customConfig) { + i === 0 && + logger.info( + 'Custom config file missing or YAML format invalid.\n\nCheck out the latest config file guide for configurable options and features.\nhttps://docs.librechat.ai/install/configuration/custom_config.html\n\n', + ); + i === 0 && i++; + return null; + } + } + + if (typeof customConfig === 'string') { + try { + customConfig = yaml.load(customConfig); + } catch (parseError) { + i === 0 && logger.info(`Failed to parse the YAML config from ${configPath}`, parseError); + i === 0 && i++; + return null; + } } const result = configSchema.strict().safeParse(customConfig); if (!result.success) { - logger.error(`Invalid custom config file at ${configPath}`, result.error); + i === 0 && logger.error(`Invalid custom config file at ${configPath}`, result.error); + i === 0 && i++; return null; } else { - logger.info('Loaded custom config file'); + logger.info('Custom config file loaded:'); + logger.info(JSON.stringify(customConfig, null, 2)); + logger.debug('Custom config:', customConfig); } if (customConfig.cache) { @@ -33,8 +70,6 @@ async function loadCustomConfig() { await cache.set(CacheKeys.CUSTOM_CONFIG, customConfig); } - // TODO: handle remote config - return customConfig; } diff --git a/api/server/services/Config/loadCustomConfig.spec.js b/api/server/services/Config/loadCustomConfig.spec.js new file mode 100644 index 00000000000..24553b9f3ea --- /dev/null +++ b/api/server/services/Config/loadCustomConfig.spec.js @@ -0,0 +1,153 @@ +jest.mock('axios'); +jest.mock('~/cache/getLogStores'); +jest.mock('~/utils/loadYaml'); + +const axios = require('axios'); +const loadCustomConfig = require('./loadCustomConfig'); +const getLogStores = require('~/cache/getLogStores'); +const loadYaml = require('~/utils/loadYaml'); +const { logger } = require('~/config'); + +describe('loadCustomConfig', () => { + const mockSet = jest.fn(); + const mockCache = { set: mockSet }; + + beforeEach(() => { + jest.resetAllMocks(); + delete process.env.CONFIG_PATH; + getLogStores.mockReturnValue(mockCache); + }); + + it('should return null and log error if remote config fetch fails', async () => { + process.env.CONFIG_PATH = 'http://example.com/config.yaml'; + axios.get.mockRejectedValue(new Error('Network error')); + const result = await loadCustomConfig(); + expect(logger.error).toHaveBeenCalledTimes(1); + expect(result).toBeNull(); + }); + + it('should return null for an invalid local config file', async () => { + process.env.CONFIG_PATH = 'localConfig.yaml'; + loadYaml.mockReturnValueOnce(null); + const result = await loadCustomConfig(); + expect(result).toBeNull(); + }); + + it('should parse, validate, and cache a valid local configuration', async () => { + const mockConfig = { + version: '1.0', + cache: true, + endpoints: { + custom: [ + { + name: 'mistral', + apiKey: 'user_provided', + baseURL: 'https://api.mistral.ai/v1', + }, + ], + }, + }; + process.env.CONFIG_PATH = 'validConfig.yaml'; + loadYaml.mockReturnValueOnce(mockConfig); + const result = await loadCustomConfig(); + + expect(result).toEqual(mockConfig); + expect(mockSet).toHaveBeenCalledWith(expect.anything(), mockConfig); + }); + + it('should return null and log if config schema validation fails', async () => { + const invalidConfig = { invalidField: true }; + process.env.CONFIG_PATH = 'invalidConfig.yaml'; + loadYaml.mockReturnValueOnce(invalidConfig); + + const result = await loadCustomConfig(); + + expect(result).toBeNull(); + }); + + it('should handle and return null on YAML parse error for a string response from remote', async () => { + process.env.CONFIG_PATH = 'http://example.com/config.yaml'; + axios.get.mockResolvedValue({ data: 'invalidYAMLContent' }); + + const result = await loadCustomConfig(); + + expect(result).toBeNull(); + }); + + it('should return the custom config object for a valid remote config file', async () => { + const mockConfig = { + version: '1.0', + cache: true, + endpoints: { + custom: [ + { + name: 'mistral', + apiKey: 'user_provided', + baseURL: 'https://api.mistral.ai/v1', + }, + ], + }, + }; + process.env.CONFIG_PATH = 'http://example.com/config.yaml'; + axios.get.mockResolvedValue({ data: mockConfig }); + const result = await loadCustomConfig(); + expect(result).toEqual(mockConfig); + expect(mockSet).toHaveBeenCalledWith(expect.anything(), mockConfig); + }); + + it('should return null if the remote config file is not found', async () => { + process.env.CONFIG_PATH = 'http://example.com/config.yaml'; + axios.get.mockRejectedValue({ response: { status: 404 } }); + const result = await loadCustomConfig(); + expect(result).toBeNull(); + }); + + it('should return null if the local config file is not found', async () => { + process.env.CONFIG_PATH = 'nonExistentConfig.yaml'; + loadYaml.mockReturnValueOnce(null); + const result = await loadCustomConfig(); + expect(result).toBeNull(); + }); + + it('should not cache the config if cache is set to false', async () => { + const mockConfig = { + version: '1.0', + cache: false, + endpoints: { + custom: [ + { + name: 'mistral', + apiKey: 'user_provided', + baseURL: 'https://api.mistral.ai/v1', + }, + ], + }, + }; + process.env.CONFIG_PATH = 'validConfig.yaml'; + loadYaml.mockReturnValueOnce(mockConfig); + await loadCustomConfig(); + expect(mockSet).not.toHaveBeenCalled(); + }); + + it('should log the loaded custom config', async () => { + const mockConfig = { + version: '1.0', + cache: true, + endpoints: { + custom: [ + { + name: 'mistral', + apiKey: 'user_provided', + baseURL: 'https://api.mistral.ai/v1', + }, + ], + }, + }; + process.env.CONFIG_PATH = 'validConfig.yaml'; + loadYaml.mockReturnValueOnce(mockConfig); + await loadCustomConfig(); + expect(logger.info).toHaveBeenCalledWith('Custom config file loaded:'); + expect(logger.info).toHaveBeenCalledWith(JSON.stringify(mockConfig, null, 2)); + expect(logger.debug).toHaveBeenCalledWith('Custom config:', mockConfig); + }); +}); diff --git a/api/server/services/Config/loadDefaultEConfig.js b/api/server/services/Config/loadDefaultEConfig.js index 34ab05d8ab8..960dfb4c77a 100644 --- a/api/server/services/Config/loadDefaultEConfig.js +++ b/api/server/services/Config/loadDefaultEConfig.js @@ -1,36 +1,21 @@ -const { EModelEndpoint } = require('librechat-data-provider'); +const { EModelEndpoint, getEnabledEndpoints } = require('librechat-data-provider'); const loadAsyncEndpoints = require('./loadAsyncEndpoints'); const { config } = require('./EndpointService'); /** * Load async endpoints and return a configuration object - * @function loadDefaultEndpointsConfig + * @param {Express.Request} req - The request object * @returns {Promise<Object.<string, EndpointWithOrder>>} An object whose keys are endpoint names and values are objects that contain the endpoint configuration and an order. */ -async function loadDefaultEndpointsConfig() { - const { google, gptPlugins } = await loadAsyncEndpoints(); - const { openAI, bingAI, anthropic, azureOpenAI, chatGPTBrowser } = config; +async function loadDefaultEndpointsConfig(req) { + const { google, gptPlugins } = await loadAsyncEndpoints(req); + const { openAI, assistants, bingAI, anthropic, azureOpenAI, chatGPTBrowser } = config; - let enabledEndpoints = [ - EModelEndpoint.openAI, - EModelEndpoint.azureOpenAI, - EModelEndpoint.google, - EModelEndpoint.bingAI, - EModelEndpoint.chatGPTBrowser, - EModelEndpoint.gptPlugins, - EModelEndpoint.anthropic, - ]; - - const endpointsEnv = process.env.ENDPOINTS || ''; - if (endpointsEnv) { - enabledEndpoints = endpointsEnv - .split(',') - .filter((endpoint) => endpoint?.trim()) - .map((endpoint) => endpoint.trim()); - } + const enabledEndpoints = getEnabledEndpoints(); const endpointConfig = { [EModelEndpoint.openAI]: openAI, + [EModelEndpoint.assistants]: assistants, [EModelEndpoint.azureOpenAI]: azureOpenAI, [EModelEndpoint.google]: google, [EModelEndpoint.bingAI]: bingAI, diff --git a/api/server/services/Config/loadDefaultModels.js b/api/server/services/Config/loadDefaultModels.js index 665aa714790..e0b2ca0e4f9 100644 --- a/api/server/services/Config/loadDefaultModels.js +++ b/api/server/services/Config/loadDefaultModels.js @@ -7,17 +7,24 @@ const { getChatGPTBrowserModels, } = require('~/server/services/ModelService'); -const fitlerAssistantModels = (str) => { - return /gpt-4|gpt-3\\.5/i.test(str) && !/vision|instruct/i.test(str); -}; - -async function loadDefaultModels() { +/** + * Loads the default models for the application. + * @async + * @function + * @param {Express.Request} req - The Express request object. + */ +async function loadDefaultModels(req) { const google = getGoogleModels(); - const openAI = await getOpenAIModels(); + const openAI = await getOpenAIModels({ user: req.user.id }); const anthropic = getAnthropicModels(); const chatGPTBrowser = getChatGPTBrowserModels(); - const azureOpenAI = await getOpenAIModels({ azure: true }); - const gptPlugins = await getOpenAIModels({ azure: useAzurePlugins, plugins: true }); + const azureOpenAI = await getOpenAIModels({ user: req.user.id, azure: true }); + const gptPlugins = await getOpenAIModels({ + user: req.user.id, + azure: useAzurePlugins, + plugins: true, + }); + const assistants = await getOpenAIModels({ assistants: true }); return { [EModelEndpoint.openAI]: openAI, @@ -27,7 +34,7 @@ async function loadDefaultModels() { [EModelEndpoint.azureOpenAI]: azureOpenAI, [EModelEndpoint.bingAI]: ['BingAI', 'Sydney'], [EModelEndpoint.chatGPTBrowser]: chatGPTBrowser, - [EModelEndpoint.assistant]: openAI.filter(fitlerAssistantModels), + [EModelEndpoint.assistants]: assistants, }; } diff --git a/api/server/services/Endpoints/anthropic/addTitle.js b/api/server/services/Endpoints/anthropic/addTitle.js new file mode 100644 index 00000000000..30dddd1c3f8 --- /dev/null +++ b/api/server/services/Endpoints/anthropic/addTitle.js @@ -0,0 +1,32 @@ +const { CacheKeys } = require('librechat-data-provider'); +const getLogStores = require('~/cache/getLogStores'); +const { isEnabled } = require('~/server/utils'); +const { saveConvo } = require('~/models'); + +const addTitle = async (req, { text, response, client }) => { + const { TITLE_CONVO = 'true' } = process.env ?? {}; + if (!isEnabled(TITLE_CONVO)) { + return; + } + + if (client.options.titleConvo === false) { + return; + } + + // If the request was aborted, don't generate the title. + if (client.abortController.signal.aborted) { + return; + } + + const titleCache = getLogStores(CacheKeys.GEN_TITLE); + const key = `${req.user.id}-${response.conversationId}`; + + const title = await client.titleConvo({ text, responseText: response?.text }); + await titleCache.set(key, title, 120000); + await saveConvo(req.user.id, { + conversationId: response.conversationId, + title, + }); +}; + +module.exports = addTitle; diff --git a/api/server/services/Endpoints/anthropic/buildOptions.js b/api/server/services/Endpoints/anthropic/buildOptions.js index 2b0143d2b07..4cd9ba8b925 100644 --- a/api/server/services/Endpoints/anthropic/buildOptions.js +++ b/api/server/services/Endpoints/anthropic/buildOptions.js @@ -1,9 +1,10 @@ const buildOptions = (endpoint, parsedBody) => { - const { modelLabel, promptPrefix, ...rest } = parsedBody; + const { modelLabel, promptPrefix, resendFiles, ...rest } = parsedBody; const endpointOption = { endpoint, modelLabel, promptPrefix, + resendFiles, modelOptions: { ...rest, }, diff --git a/api/server/services/Endpoints/anthropic/index.js b/api/server/services/Endpoints/anthropic/index.js index 84e4bd5973a..772b1efb118 100644 --- a/api/server/services/Endpoints/anthropic/index.js +++ b/api/server/services/Endpoints/anthropic/index.js @@ -1,8 +1,9 @@ +const addTitle = require('./addTitle'); const buildOptions = require('./buildOptions'); const initializeClient = require('./initializeClient'); module.exports = { - // addTitle, // todo + addTitle, buildOptions, initializeClient, }; diff --git a/api/server/services/Endpoints/assistants/addTitle.js b/api/server/services/Endpoints/assistants/addTitle.js new file mode 100644 index 00000000000..7cca98cc7bc --- /dev/null +++ b/api/server/services/Endpoints/assistants/addTitle.js @@ -0,0 +1,28 @@ +const { CacheKeys } = require('librechat-data-provider'); +const { saveConvo } = require('~/models/Conversation'); +const getLogStores = require('~/cache/getLogStores'); +const { isEnabled } = require('~/server/utils'); + +const addTitle = async (req, { text, responseText, conversationId, client }) => { + const { TITLE_CONVO = 'true' } = process.env ?? {}; + if (!isEnabled(TITLE_CONVO)) { + return; + } + + if (client.options.titleConvo === false) { + return; + } + + const titleCache = getLogStores(CacheKeys.GEN_TITLE); + const key = `${req.user.id}-${conversationId}`; + + const title = await client.titleConvo({ text, conversationId, responseText }); + await titleCache.set(key, title, 120000); + + await saveConvo(req.user.id, { + conversationId, + title, + }); +}; + +module.exports = addTitle; diff --git a/api/server/services/Endpoints/assistants/buildOptions.js b/api/server/services/Endpoints/assistants/buildOptions.js new file mode 100644 index 00000000000..c670953539d --- /dev/null +++ b/api/server/services/Endpoints/assistants/buildOptions.js @@ -0,0 +1,16 @@ +const buildOptions = (endpoint, parsedBody) => { + // eslint-disable-next-line no-unused-vars + const { promptPrefix, assistant_id, ...rest } = parsedBody; + const endpointOption = { + endpoint, + promptPrefix, + assistant_id, + modelOptions: { + ...rest, + }, + }; + + return endpointOption; +}; + +module.exports = buildOptions; diff --git a/api/server/services/Endpoints/assistants/index.js b/api/server/services/Endpoints/assistants/index.js new file mode 100644 index 00000000000..10e94f2cd4f --- /dev/null +++ b/api/server/services/Endpoints/assistants/index.js @@ -0,0 +1,96 @@ +const addTitle = require('./addTitle'); +const buildOptions = require('./buildOptions'); +const initializeClient = require('./initializeClient'); + +/** + * Asynchronously lists assistants based on provided query parameters. + * + * Initializes the client with the current request and response objects and lists assistants + * according to the query parameters. This function abstracts the logic for non-Azure paths. + * + * @async + * @param {object} params - The parameters object. + * @param {object} params.req - The request object, used for initializing the client. + * @param {object} params.res - The response object, used for initializing the client. + * @param {object} params.query - The query parameters to list assistants (e.g., limit, order). + * @returns {Promise<object>} A promise that resolves to the response from the `openai.beta.assistants.list` method call. + */ +const listAssistants = async ({ req, res, query }) => { + const { openai } = await initializeClient({ req, res }); + return openai.beta.assistants.list(query); +}; + +/** + * Asynchronously lists assistants for Azure configured groups. + * + * Iterates through Azure configured assistant groups, initializes the client with the current request and response objects, + * lists assistants based on the provided query parameters, and merges their data alongside the model information into a single array. + * + * @async + * @param {object} params - The parameters object. + * @param {object} params.req - The request object, used for initializing the client and manipulating the request body. + * @param {object} params.res - The response object, used for initializing the client. + * @param {TAzureConfig} params.azureConfig - The Azure configuration object containing assistantGroups and groupMap. + * @param {object} params.query - The query parameters to list assistants (e.g., limit, order). + * @returns {Promise<AssistantListResponse>} A promise that resolves to an array of assistant data merged with their respective model information. + */ +const listAssistantsForAzure = async ({ req, res, azureConfig = {}, query }) => { + /** @type {Array<[string, TAzureModelConfig]>} */ + const groupModelTuples = []; + const promises = []; + /** @type {Array<TAzureGroup>} */ + const groups = []; + + const { groupMap, assistantGroups } = azureConfig; + + for (const groupName of assistantGroups) { + const group = groupMap[groupName]; + groups.push(group); + + const currentModelTuples = Object.entries(group?.models); + groupModelTuples.push(currentModelTuples); + + /* The specified model is only necessary to + fetch assistants for the shared instance */ + req.body.model = currentModelTuples[0][0]; + promises.push(listAssistants({ req, res, query })); + } + + const resolvedQueries = await Promise.all(promises); + const data = resolvedQueries.flatMap((res, i) => + res.data.map((assistant) => { + const deploymentName = assistant.model; + const currentGroup = groups[i]; + const currentModelTuples = groupModelTuples[i]; + const firstModel = currentModelTuples[0][0]; + + if (currentGroup.deploymentName === deploymentName) { + return { ...assistant, model: firstModel }; + } + + for (const [model, modelConfig] of currentModelTuples) { + if (modelConfig.deploymentName === deploymentName) { + return { ...assistant, model }; + } + } + + return { ...assistant, model: firstModel }; + }), + ); + + return { + first_id: data[0]?.id, + last_id: data[data.length - 1]?.id, + object: 'list', + has_more: false, + data, + }; +}; + +module.exports = { + addTitle, + buildOptions, + initializeClient, + listAssistants, + listAssistantsForAzure, +}; diff --git a/api/server/services/Endpoints/assistants/initializeClient.js b/api/server/services/Endpoints/assistants/initializeClient.js new file mode 100644 index 00000000000..05a9232f9fe --- /dev/null +++ b/api/server/services/Endpoints/assistants/initializeClient.js @@ -0,0 +1,148 @@ +const OpenAI = require('openai'); +const { HttpsProxyAgent } = require('https-proxy-agent'); +const { + EModelEndpoint, + resolveHeaders, + mapModelToAzureConfig, +} = require('librechat-data-provider'); +const { + getUserKey, + getUserKeyExpiry, + checkUserKeyExpiry, +} = require('~/server/services/UserService'); +const OpenAIClient = require('~/app/clients/OpenAIClient'); +const { isUserProvided } = require('~/server/utils'); +const { constructAzureURL } = require('~/utils'); + +const initializeClient = async ({ req, res, endpointOption, initAppClient = false }) => { + const { PROXY, OPENAI_ORGANIZATION, ASSISTANTS_API_KEY, ASSISTANTS_BASE_URL } = process.env; + + const userProvidesKey = isUserProvided(ASSISTANTS_API_KEY); + const userProvidesURL = isUserProvided(ASSISTANTS_BASE_URL); + + let userValues = null; + if (userProvidesKey || userProvidesURL) { + const expiresAt = await getUserKeyExpiry({ + userId: req.user.id, + name: EModelEndpoint.assistants, + }); + checkUserKeyExpiry( + expiresAt, + 'Your Assistants API key has expired. Please provide your API key again.', + ); + userValues = await getUserKey({ userId: req.user.id, name: EModelEndpoint.assistants }); + try { + userValues = JSON.parse(userValues); + } catch (e) { + throw new Error( + 'Invalid JSON provided for Assistants API user values. Please provide them again.', + ); + } + } + + let apiKey = userProvidesKey ? userValues.apiKey : ASSISTANTS_API_KEY; + let baseURL = userProvidesURL ? userValues.baseURL : ASSISTANTS_BASE_URL; + + const opts = {}; + + const clientOptions = { + reverseProxyUrl: baseURL ?? null, + proxy: PROXY ?? null, + req, + res, + ...endpointOption, + }; + + /** @type {TAzureConfig | undefined} */ + const azureConfig = req.app.locals[EModelEndpoint.azureOpenAI]; + + /** @type {AzureOptions | undefined} */ + let azureOptions; + + if (azureConfig && azureConfig.assistants) { + const { modelGroupMap, groupMap, assistantModels } = azureConfig; + const modelName = req.body.model ?? req.query.model ?? assistantModels[0]; + const { + azureOptions: currentOptions, + baseURL: azureBaseURL, + headers = {}, + serverless, + } = mapModelToAzureConfig({ + modelName, + modelGroupMap, + groupMap, + }); + + azureOptions = currentOptions; + + baseURL = constructAzureURL({ + baseURL: azureBaseURL ?? 'https://${INSTANCE_NAME}.openai.azure.com/openai', + azureOptions, + }); + + apiKey = azureOptions.azureOpenAIApiKey; + opts.defaultQuery = { 'api-version': azureOptions.azureOpenAIApiVersion }; + opts.defaultHeaders = resolveHeaders({ ...headers, 'api-key': apiKey }); + opts.model = azureOptions.azureOpenAIApiDeploymentName; + + if (initAppClient) { + clientOptions.titleConvo = azureConfig.titleConvo; + clientOptions.titleModel = azureConfig.titleModel; + clientOptions.titleMethod = azureConfig.titleMethod ?? 'completion'; + + const groupName = modelGroupMap[modelName].group; + clientOptions.addParams = azureConfig.groupMap[groupName].addParams; + clientOptions.dropParams = azureConfig.groupMap[groupName].dropParams; + clientOptions.forcePrompt = azureConfig.groupMap[groupName].forcePrompt; + + clientOptions.reverseProxyUrl = baseURL ?? clientOptions.reverseProxyUrl; + clientOptions.headers = opts.defaultHeaders; + clientOptions.azure = !serverless && azureOptions; + } + } + + if (!apiKey) { + throw new Error('Assistants API key not provided. Please provide it again.'); + } + + if (baseURL) { + opts.baseURL = baseURL; + } + + if (PROXY) { + opts.httpAgent = new HttpsProxyAgent(PROXY); + } + + if (OPENAI_ORGANIZATION) { + opts.organization = OPENAI_ORGANIZATION; + } + + /** @type {OpenAIClient} */ + const openai = new OpenAI({ + apiKey, + ...opts, + }); + + openai.req = req; + openai.res = res; + + if (azureOptions) { + openai.locals = { ...(openai.locals ?? {}), azureOptions }; + } + + if (endpointOption && initAppClient) { + const client = new OpenAIClient(apiKey, clientOptions); + return { + client, + openai, + openAIApiKey: apiKey, + }; + } + + return { + openai, + openAIApiKey: apiKey, + }; +}; + +module.exports = initializeClient; diff --git a/api/server/services/Endpoints/assistants/initializeClient.spec.js b/api/server/services/Endpoints/assistants/initializeClient.spec.js new file mode 100644 index 00000000000..3a1e4692738 --- /dev/null +++ b/api/server/services/Endpoints/assistants/initializeClient.spec.js @@ -0,0 +1,99 @@ +// const OpenAI = require('openai'); +const { HttpsProxyAgent } = require('https-proxy-agent'); +const { getUserKey, getUserKeyExpiry } = require('~/server/services/UserService'); +const initializeClient = require('./initializeClient'); +// const { OpenAIClient } = require('~/app'); + +jest.mock('~/server/services/UserService', () => ({ + getUserKey: jest.fn(), + getUserKeyExpiry: jest.fn(), + checkUserKeyExpiry: jest.requireActual('~/server/services/UserService').checkUserKeyExpiry, +})); + +const today = new Date(); +const tenDaysFromToday = new Date(today.setDate(today.getDate() + 10)); +const isoString = tenDaysFromToday.toISOString(); + +describe('initializeClient', () => { + // Set up environment variables + const originalEnvironment = process.env; + const app = { + locals: {}, + }; + + beforeEach(() => { + jest.resetModules(); // Clears the cache + process.env = { ...originalEnvironment }; // Make a copy + }); + + afterAll(() => { + process.env = originalEnvironment; // Restore original env vars + }); + + test('initializes OpenAI client with default API key and URL', async () => { + process.env.ASSISTANTS_API_KEY = 'default-api-key'; + process.env.ASSISTANTS_BASE_URL = 'https://default.api.url'; + + // Assuming 'isUserProvided' to return false for this test case + jest.mock('~/server/utils', () => ({ + isUserProvided: jest.fn().mockReturnValueOnce(false), + })); + + const req = { user: { id: 'user123' }, app }; + const res = {}; + + const { openai, openAIApiKey } = await initializeClient({ req, res }); + expect(openai.apiKey).toBe('default-api-key'); + expect(openAIApiKey).toBe('default-api-key'); + expect(openai.baseURL).toBe('https://default.api.url'); + }); + + test('initializes OpenAI client with user-provided API key and URL', async () => { + process.env.ASSISTANTS_API_KEY = 'user_provided'; + process.env.ASSISTANTS_BASE_URL = 'user_provided'; + + getUserKey.mockResolvedValue( + JSON.stringify({ apiKey: 'user-api-key', baseURL: 'https://user.api.url' }), + ); + getUserKeyExpiry.mockResolvedValue(isoString); + + const req = { user: { id: 'user123' }, app }; + const res = {}; + + const { openai, openAIApiKey } = await initializeClient({ req, res }); + expect(openAIApiKey).toBe('user-api-key'); + expect(openai.apiKey).toBe('user-api-key'); + expect(openai.baseURL).toBe('https://user.api.url'); + }); + + test('throws error for invalid JSON in user-provided values', async () => { + process.env.ASSISTANTS_API_KEY = 'user_provided'; + getUserKey.mockResolvedValue('invalid-json'); + getUserKeyExpiry.mockResolvedValue(isoString); + + const req = { user: { id: 'user123' } }; + const res = {}; + + await expect(initializeClient({ req, res })).rejects.toThrow(/Invalid JSON/); + }); + + test('throws error if API key is not provided', async () => { + delete process.env.ASSISTANTS_API_KEY; // Simulate missing API key + + const req = { user: { id: 'user123' }, app }; + const res = {}; + + await expect(initializeClient({ req, res })).rejects.toThrow(/Assistants API key not/); + }); + + test('initializes OpenAI client with proxy configuration', async () => { + process.env.ASSISTANTS_API_KEY = 'test-key'; + process.env.PROXY = 'http://proxy.server'; + + const req = { user: { id: 'user123' }, app }; + const res = {}; + + const { openai } = await initializeClient({ req, res }); + expect(openai.httpAgent).toBeInstanceOf(HttpsProxyAgent); + }); +}); diff --git a/api/server/services/Endpoints/custom/buildOptions.js b/api/server/services/Endpoints/custom/buildOptions.js index 0bba48e2b95..3d937957323 100644 --- a/api/server/services/Endpoints/custom/buildOptions.js +++ b/api/server/services/Endpoints/custom/buildOptions.js @@ -1,11 +1,11 @@ const buildOptions = (endpoint, parsedBody, endpointType) => { - const { chatGptLabel, promptPrefix, resendImages, imageDetail, ...rest } = parsedBody; + const { chatGptLabel, promptPrefix, resendFiles, imageDetail, ...rest } = parsedBody; const endpointOption = { endpoint, endpointType, chatGptLabel, promptPrefix, - resendImages, + resendFiles, imageDetail, modelOptions: { ...rest, diff --git a/api/server/services/Endpoints/custom/initializeClient.js b/api/server/services/Endpoints/custom/initializeClient.js index 978506b7b47..a80f5efaa7a 100644 --- a/api/server/services/Endpoints/custom/initializeClient.js +++ b/api/server/services/Endpoints/custom/initializeClient.js @@ -1,11 +1,17 @@ -const { EModelEndpoint } = require('librechat-data-provider'); +const { + CacheKeys, + envVarRegex, + EModelEndpoint, + FetchTokenConfig, + extractEnvVariable, +} = require('librechat-data-provider'); const { getUserKey, checkUserKeyExpiry } = require('~/server/services/UserService'); -const { isUserProvided, extractEnvVariable } = require('~/server/utils'); -const getCustomConfig = require('~/cache/getCustomConfig'); +const getCustomConfig = require('~/server/services/Config/getCustomConfig'); +const { fetchModels } = require('~/server/services/ModelService'); +const getLogStores = require('~/cache/getLogStores'); +const { isUserProvided } = require('~/server/utils'); const { OpenAIClient } = require('~/app'); -const envVarRegex = /^\${(.+)}$/; - const { PROXY } = process.env; const initializeClient = async ({ req, res, endpointOption }) => { @@ -37,24 +43,11 @@ const initializeClient = async ({ req, res, endpointOption }) => { throw new Error(`Missing Base URL for ${endpoint}.`); } - const customOptions = { - headers: resolvedHeaders, - addParams: endpointConfig.addParams, - dropParams: endpointConfig.dropParams, - titleConvo: endpointConfig.titleConvo, - titleModel: endpointConfig.titleModel, - forcePrompt: endpointConfig.forcePrompt, - summaryModel: endpointConfig.summaryModel, - modelDisplayLabel: endpointConfig.modelDisplayLabel, - titleMethod: endpointConfig.titleMethod ?? 'completion', - contextStrategy: endpointConfig.summarize ? 'summarize' : null, - }; - - const useUserKey = isUserProvided(CUSTOM_API_KEY); - const useUserURL = isUserProvided(CUSTOM_BASE_URL); + const userProvidesKey = isUserProvided(CUSTOM_API_KEY); + const userProvidesURL = isUserProvided(CUSTOM_BASE_URL); let userValues = null; - if (expiresAt && (useUserKey || useUserURL)) { + if (expiresAt && (userProvidesKey || userProvidesURL)) { checkUserKeyExpiry( expiresAt, `Your API values for ${endpoint} have expired. Please configure them again.`, @@ -67,8 +60,8 @@ const initializeClient = async ({ req, res, endpointOption }) => { } } - let apiKey = useUserKey ? userValues.apiKey : CUSTOM_API_KEY; - let baseURL = useUserURL ? userValues.baseURL : CUSTOM_BASE_URL; + let apiKey = userProvidesKey ? userValues?.apiKey : CUSTOM_API_KEY; + let baseURL = userProvidesURL ? userValues?.baseURL : CUSTOM_BASE_URL; if (!apiKey) { throw new Error(`${endpoint} API key not provided.`); @@ -78,6 +71,41 @@ const initializeClient = async ({ req, res, endpointOption }) => { throw new Error(`${endpoint} Base URL not provided.`); } + const cache = getLogStores(CacheKeys.TOKEN_CONFIG); + const tokenKey = + !endpointConfig.tokenConfig && (userProvidesKey || userProvidesURL) + ? `${endpoint}:${req.user.id}` + : endpoint; + + let endpointTokenConfig = + !endpointConfig.tokenConfig && + FetchTokenConfig[endpoint.toLowerCase()] && + (await cache.get(tokenKey)); + + if ( + FetchTokenConfig[endpoint.toLowerCase()] && + endpointConfig && + endpointConfig.models.fetch && + !endpointTokenConfig + ) { + await fetchModels({ apiKey, baseURL, name: endpoint, user: req.user.id, tokenKey }); + endpointTokenConfig = await cache.get(tokenKey); + } + + const customOptions = { + headers: resolvedHeaders, + addParams: endpointConfig.addParams, + dropParams: endpointConfig.dropParams, + titleConvo: endpointConfig.titleConvo, + titleModel: endpointConfig.titleModel, + forcePrompt: endpointConfig.forcePrompt, + summaryModel: endpointConfig.summaryModel, + modelDisplayLabel: endpointConfig.modelDisplayLabel, + titleMethod: endpointConfig.titleMethod ?? 'completion', + contextStrategy: endpointConfig.summarize ? 'summarize' : null, + endpointTokenConfig, + }; + const clientOptions = { reverseProxyUrl: baseURL ?? null, proxy: PROXY ?? null, diff --git a/api/server/services/Endpoints/google/initializeClient.spec.js b/api/server/services/Endpoints/google/initializeClient.spec.js index 8587c71e2d8..e39e51b8571 100644 --- a/api/server/services/Endpoints/google/initializeClient.spec.js +++ b/api/server/services/Endpoints/google/initializeClient.spec.js @@ -1,3 +1,5 @@ +// file deepcode ignore HardcodedNonCryptoSecret: No hardcoded secrets + const initializeClient = require('./initializeClient'); const { GoogleClient } = require('~/app'); const { checkUserKeyExpiry, getUserKey } = require('../../UserService'); diff --git a/api/server/services/Endpoints/gptPlugins/initializeClient.js b/api/server/services/Endpoints/gptPlugins/initializeClient.js index 54ea822e494..2920a589176 100644 --- a/api/server/services/Endpoints/gptPlugins/initializeClient.js +++ b/api/server/services/Endpoints/gptPlugins/initializeClient.js @@ -1,7 +1,11 @@ -const { EModelEndpoint } = require('librechat-data-provider'); +const { + EModelEndpoint, + mapModelToAzureConfig, + resolveHeaders, +} = require('librechat-data-provider'); const { getUserKey, checkUserKeyExpiry } = require('~/server/services/UserService'); +const { isEnabled, isUserProvided } = require('~/server/utils'); const { getAzureCredentials } = require('~/utils'); -const { isEnabled } = require('~/server/utils'); const { PluginsClient } = require('~/app'); const initializeClient = async ({ req, res, endpointOption }) => { @@ -16,57 +20,96 @@ const initializeClient = async ({ req, res, endpointOption }) => { DEBUG_PLUGINS, } = process.env; - const { key: expiresAt } = req.body; + const { key: expiresAt, model: modelName } = req.body; const contextStrategy = isEnabled(OPENAI_SUMMARIZE) ? 'summarize' : null; - const useAzure = isEnabled(PLUGINS_USE_AZURE); - const endpoint = useAzure ? EModelEndpoint.azureOpenAI : EModelEndpoint.openAI; + let useAzure = isEnabled(PLUGINS_USE_AZURE); + let endpoint = useAzure ? EModelEndpoint.azureOpenAI : EModelEndpoint.openAI; + + /** @type {false | TAzureConfig} */ + const azureConfig = req.app.locals[EModelEndpoint.azureOpenAI]; + useAzure = useAzure || azureConfig?.plugins; + + if (useAzure && endpoint !== EModelEndpoint.azureOpenAI) { + endpoint = EModelEndpoint.azureOpenAI; + } + + const credentials = { + [EModelEndpoint.openAI]: OPENAI_API_KEY, + [EModelEndpoint.azureOpenAI]: AZURE_API_KEY, + }; const baseURLOptions = { [EModelEndpoint.openAI]: OPENAI_REVERSE_PROXY, [EModelEndpoint.azureOpenAI]: AZURE_OPENAI_BASEURL, }; - const reverseProxyUrl = baseURLOptions[endpoint] ?? null; + const userProvidesKey = isUserProvided(credentials[endpoint]); + const userProvidesURL = isUserProvided(baseURLOptions[endpoint]); + + let userValues = null; + if (expiresAt && (userProvidesKey || userProvidesURL)) { + checkUserKeyExpiry( + expiresAt, + 'Your OpenAI API values have expired. Please provide them again.', + ); + userValues = await getUserKey({ userId: req.user.id, name: endpoint }); + try { + userValues = JSON.parse(userValues); + } catch (e) { + throw new Error( + `Invalid JSON provided for ${endpoint} user values. Please provide them again.`, + ); + } + } + + let apiKey = userProvidesKey ? userValues?.apiKey : credentials[endpoint]; + let baseURL = userProvidesURL ? userValues?.baseURL : baseURLOptions[endpoint]; const clientOptions = { contextStrategy, debug: isEnabled(DEBUG_PLUGINS), - reverseProxyUrl, + reverseProxyUrl: baseURL ? baseURL : null, proxy: PROXY ?? null, req, res, ...endpointOption, }; - const credentials = { - [EModelEndpoint.openAI]: OPENAI_API_KEY, - [EModelEndpoint.azureOpenAI]: AZURE_API_KEY, - }; + if (useAzure && azureConfig) { + const { modelGroupMap, groupMap } = azureConfig; + const { + azureOptions, + baseURL, + headers = {}, + serverless, + } = mapModelToAzureConfig({ + modelName, + modelGroupMap, + groupMap, + }); - const isUserProvided = credentials[endpoint] === 'user_provided'; + clientOptions.reverseProxyUrl = baseURL ?? clientOptions.reverseProxyUrl; + clientOptions.headers = resolveHeaders({ ...headers, ...(clientOptions.headers ?? {}) }); - let userKey = null; - if (expiresAt && isUserProvided) { - checkUserKeyExpiry( - expiresAt, - 'Your OpenAI API key has expired. Please provide your API key again.', - ); - userKey = await getUserKey({ - userId: req.user.id, - name: endpoint, - }); - } + clientOptions.titleConvo = azureConfig.titleConvo; + clientOptions.titleModel = azureConfig.titleModel; + clientOptions.titleMethod = azureConfig.titleMethod ?? 'completion'; - let apiKey = isUserProvided ? userKey : credentials[endpoint]; + const groupName = modelGroupMap[modelName].group; + clientOptions.addParams = azureConfig.groupMap[groupName].addParams; + clientOptions.dropParams = azureConfig.groupMap[groupName].dropParams; + clientOptions.forcePrompt = azureConfig.groupMap[groupName].forcePrompt; - if (useAzure || (apiKey && apiKey.includes('azure') && !clientOptions.azure)) { - clientOptions.azure = isUserProvided ? JSON.parse(userKey) : getAzureCredentials(); + apiKey = azureOptions.azureOpenAIApiKey; + clientOptions.azure = !serverless && azureOptions; + } else if (useAzure || (apiKey && apiKey.includes('{"azure') && !clientOptions.azure)) { + clientOptions.azure = userProvidesKey ? JSON.parse(userValues.apiKey) : getAzureCredentials(); apiKey = clientOptions.azure.azureOpenAIApiKey; } if (!apiKey) { - throw new Error('API key not provided.'); + throw new Error(`${endpoint} API key not provided. Please provide it again.`); } const client = new PluginsClient(apiKey, clientOptions); diff --git a/api/server/services/Endpoints/gptPlugins/initializeClient.spec.js b/api/server/services/Endpoints/gptPlugins/initializeClient.spec.js index 5b772209c64..280acf5aadb 100644 --- a/api/server/services/Endpoints/gptPlugins/initializeClient.spec.js +++ b/api/server/services/Endpoints/gptPlugins/initializeClient.spec.js @@ -1,7 +1,8 @@ // gptPlugins/initializeClient.spec.js -const { PluginsClient } = require('~/app'); +const { EModelEndpoint, validateAzureGroups } = require('librechat-data-provider'); +const { getUserKey } = require('~/server/services/UserService'); const initializeClient = require('./initializeClient'); -const { getUserKey } = require('../../UserService'); +const { PluginsClient } = require('~/app'); // Mock getUserKey since it's the only function we want to mock jest.mock('~/server/services/UserService', () => ({ @@ -12,6 +13,72 @@ jest.mock('~/server/services/UserService', () => ({ describe('gptPlugins/initializeClient', () => { // Set up environment variables const originalEnvironment = process.env; + const app = { + locals: {}, + }; + + const validAzureConfigs = [ + { + group: 'librechat-westus', + apiKey: 'WESTUS_API_KEY', + instanceName: 'librechat-westus', + version: '2023-12-01-preview', + models: { + 'gpt-4-vision-preview': { + deploymentName: 'gpt-4-vision-preview', + version: '2024-02-15-preview', + }, + 'gpt-3.5-turbo': { + deploymentName: 'gpt-35-turbo', + }, + 'gpt-3.5-turbo-1106': { + deploymentName: 'gpt-35-turbo-1106', + }, + 'gpt-4': { + deploymentName: 'gpt-4', + }, + 'gpt-4-1106-preview': { + deploymentName: 'gpt-4-1106-preview', + }, + }, + }, + { + group: 'librechat-eastus', + apiKey: 'EASTUS_API_KEY', + instanceName: 'librechat-eastus', + deploymentName: 'gpt-4-turbo', + version: '2024-02-15-preview', + models: { + 'gpt-4-turbo': true, + }, + baseURL: 'https://eastus.example.com', + additionalHeaders: { + 'x-api-key': 'x-api-key-value', + }, + }, + { + group: 'mistral-inference', + apiKey: 'AZURE_MISTRAL_API_KEY', + baseURL: + 'https://Mistral-large-vnpet-serverless.region.inference.ai.azure.com/v1/chat/completions', + serverless: true, + models: { + 'mistral-large': true, + }, + }, + { + group: 'llama-70b-chat', + apiKey: 'AZURE_LLAMA2_70B_API_KEY', + baseURL: + 'https://Llama-2-70b-chat-qmvyb-serverless.region.inference.ai.azure.com/v1/chat/completions', + serverless: true, + models: { + 'llama-70b-chat': true, + }, + }, + ]; + + const { modelNames, modelGroupMap, groupMap } = validateAzureGroups(validAzureConfigs); beforeEach(() => { jest.resetModules(); // Clears the cache @@ -31,6 +98,7 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: null }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; @@ -55,6 +123,7 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: null }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'test-model' } }; @@ -72,6 +141,7 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: null }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; @@ -88,6 +158,7 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: null }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; @@ -107,12 +178,13 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: null }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow( - 'API key not provided.', + `${EModelEndpoint.openAI} API key not provided.`, ); }); @@ -128,11 +200,12 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: futureDate }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; - getUserKey.mockResolvedValue('test-user-provided-openai-api-key'); + getUserKey.mockResolvedValue(JSON.stringify({ apiKey: 'test-user-provided-openai-api-key' })); const { openAIApiKey } = await initializeClient({ req, res, endpointOption }); @@ -147,14 +220,17 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: futureDate }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'test-model' } }; getUserKey.mockResolvedValue( JSON.stringify({ - azureOpenAIApiKey: 'test-user-provided-azure-api-key', - azureOpenAIApiDeploymentName: 'test-deployment', + apiKey: JSON.stringify({ + azureOpenAIApiKey: 'test-user-provided-azure-api-key', + azureOpenAIApiDeploymentName: 'test-deployment', + }), }), ); @@ -170,13 +246,12 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: expiresAt }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; - await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow( - /Your OpenAI API key has expired/, - ); + await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow(/Your OpenAI API/); }); test('should throw an error if the user-provided Azure key is invalid JSON', async () => { @@ -186,6 +261,7 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: new Date(Date.now() + 10000).toISOString() }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; @@ -194,7 +270,7 @@ describe('gptPlugins/initializeClient', () => { getUserKey.mockResolvedValue('invalid-json'); await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow( - /Unexpected token/, + /Invalid JSON provided/, ); }); @@ -206,6 +282,7 @@ describe('gptPlugins/initializeClient', () => { const req = { body: { key: null }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'default-model' } }; @@ -215,4 +292,90 @@ describe('gptPlugins/initializeClient', () => { expect(client.options.reverseProxyUrl).toBe('http://reverse.proxy'); expect(client.options.proxy).toBe('http://proxy'); }); + + test('should throw an error when user-provided values are not valid JSON', async () => { + process.env.OPENAI_API_KEY = 'user_provided'; + const req = { + body: { key: new Date(Date.now() + 10000).toISOString(), endpoint: 'openAI' }, + user: { id: '123' }, + app, + }; + const res = {}; + const endpointOption = {}; + + // Mock getUserKey to return a non-JSON string + getUserKey.mockResolvedValue('not-a-json'); + + await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow( + /Invalid JSON provided for openAI user values/, + ); + }); + + test('should initialize client correctly for Azure OpenAI with valid configuration', async () => { + const req = { + body: { + key: null, + endpoint: EModelEndpoint.gptPlugins, + model: modelNames[0], + }, + user: { id: '123' }, + app: { + locals: { + [EModelEndpoint.azureOpenAI]: { + plugins: true, + modelNames, + modelGroupMap, + groupMap, + }, + }, + }, + }; + const res = {}; + const endpointOption = {}; + + const client = await initializeClient({ req, res, endpointOption }); + expect(client.client.options.azure).toBeDefined(); + }); + + test('should initialize client with default options when certain env vars are not set', async () => { + delete process.env.OPENAI_SUMMARIZE; + process.env.OPENAI_API_KEY = 'some-api-key'; + + const req = { + body: { key: null, endpoint: EModelEndpoint.gptPlugins }, + user: { id: '123' }, + app, + }; + const res = {}; + const endpointOption = {}; + + const client = await initializeClient({ req, res, endpointOption }); + expect(client.client.options.contextStrategy).toBe(null); + }); + + test('should correctly use user-provided apiKey and baseURL when provided', async () => { + process.env.OPENAI_API_KEY = 'user_provided'; + process.env.OPENAI_REVERSE_PROXY = 'user_provided'; + const req = { + body: { + key: new Date(Date.now() + 10000).toISOString(), + endpoint: 'openAI', + }, + user: { + id: '123', + }, + app, + }; + const res = {}; + const endpointOption = {}; + + getUserKey.mockResolvedValue( + JSON.stringify({ apiKey: 'test', baseURL: 'https://user-provided-url.com' }), + ); + + const result = await initializeClient({ req, res, endpointOption }); + + expect(result.openAIApiKey).toBe('test'); + expect(result.client.options.reverseProxyUrl).toBe('https://user-provided-url.com'); + }); }); diff --git a/api/server/services/Endpoints/openAI/addTitle.js b/api/server/services/Endpoints/openAI/addTitle.js index ab15443f942..7bd3fc07a2c 100644 --- a/api/server/services/Endpoints/openAI/addTitle.js +++ b/api/server/services/Endpoints/openAI/addTitle.js @@ -1,5 +1,7 @@ -const { saveConvo } = require('~/models'); +const { CacheKeys } = require('librechat-data-provider'); +const getLogStores = require('~/cache/getLogStores'); const { isEnabled } = require('~/server/utils'); +const { saveConvo } = require('~/models'); const addTitle = async (req, { text, response, client }) => { const { TITLE_CONVO = 'true' } = process.env ?? {}; @@ -16,7 +18,11 @@ const addTitle = async (req, { text, response, client }) => { return; } + const titleCache = getLogStores(CacheKeys.GEN_TITLE); + const key = `${req.user.id}-${response.conversationId}`; + const title = await client.titleConvo({ text, responseText: response?.text }); + await titleCache.set(key, title, 120000); await saveConvo(req.user.id, { conversationId: response.conversationId, title, diff --git a/api/server/services/Endpoints/openAI/buildOptions.js b/api/server/services/Endpoints/openAI/buildOptions.js index 80037fb4b8e..0b1fb3eabd8 100644 --- a/api/server/services/Endpoints/openAI/buildOptions.js +++ b/api/server/services/Endpoints/openAI/buildOptions.js @@ -1,10 +1,10 @@ const buildOptions = (endpoint, parsedBody) => { - const { chatGptLabel, promptPrefix, resendImages, imageDetail, ...rest } = parsedBody; + const { chatGptLabel, promptPrefix, resendFiles, imageDetail, ...rest } = parsedBody; const endpointOption = { endpoint, chatGptLabel, promptPrefix, - resendImages, + resendFiles, imageDetail, modelOptions: { ...rest, diff --git a/api/server/services/Endpoints/openAI/initializeClient.js b/api/server/services/Endpoints/openAI/initializeClient.js index b6427823e12..10a541526bd 100644 --- a/api/server/services/Endpoints/openAI/initializeClient.js +++ b/api/server/services/Endpoints/openAI/initializeClient.js @@ -1,7 +1,11 @@ -const { EModelEndpoint } = require('librechat-data-provider'); +const { + EModelEndpoint, + resolveHeaders, + mapModelToAzureConfig, +} = require('librechat-data-provider'); const { getUserKey, checkUserKeyExpiry } = require('~/server/services/UserService'); +const { isEnabled, isUserProvided } = require('~/server/utils'); const { getAzureCredentials } = require('~/utils'); -const { isEnabled } = require('~/server/utils'); const { OpenAIClient } = require('~/app'); const initializeClient = async ({ req, res, endpointOption }) => { @@ -14,51 +18,89 @@ const initializeClient = async ({ req, res, endpointOption }) => { OPENAI_SUMMARIZE, DEBUG_OPENAI, } = process.env; - const { key: expiresAt, endpoint } = req.body; + const { key: expiresAt, endpoint, model: modelName } = req.body; const contextStrategy = isEnabled(OPENAI_SUMMARIZE) ? 'summarize' : null; + const credentials = { + [EModelEndpoint.openAI]: OPENAI_API_KEY, + [EModelEndpoint.azureOpenAI]: AZURE_API_KEY, + }; + const baseURLOptions = { [EModelEndpoint.openAI]: OPENAI_REVERSE_PROXY, [EModelEndpoint.azureOpenAI]: AZURE_OPENAI_BASEURL, }; - const reverseProxyUrl = baseURLOptions[endpoint] ?? null; + const userProvidesKey = isUserProvided(credentials[endpoint]); + const userProvidesURL = isUserProvided(baseURLOptions[endpoint]); + + let userValues = null; + if (expiresAt && (userProvidesKey || userProvidesURL)) { + checkUserKeyExpiry( + expiresAt, + 'Your OpenAI API values have expired. Please provide them again.', + ); + userValues = await getUserKey({ userId: req.user.id, name: endpoint }); + try { + userValues = JSON.parse(userValues); + } catch (e) { + throw new Error( + `Invalid JSON provided for ${endpoint} user values. Please provide them again.`, + ); + } + } + + let apiKey = userProvidesKey ? userValues?.apiKey : credentials[endpoint]; + let baseURL = userProvidesURL ? userValues?.baseURL : baseURLOptions[endpoint]; const clientOptions = { debug: isEnabled(DEBUG_OPENAI), contextStrategy, - reverseProxyUrl, + reverseProxyUrl: baseURL ? baseURL : null, proxy: PROXY ?? null, req, res, ...endpointOption, }; - const credentials = { - [EModelEndpoint.openAI]: OPENAI_API_KEY, - [EModelEndpoint.azureOpenAI]: AZURE_API_KEY, - }; + const isAzureOpenAI = endpoint === EModelEndpoint.azureOpenAI; + /** @type {false | TAzureConfig} */ + const azureConfig = isAzureOpenAI && req.app.locals[EModelEndpoint.azureOpenAI]; - const isUserProvided = credentials[endpoint] === 'user_provided'; + if (isAzureOpenAI && azureConfig) { + const { modelGroupMap, groupMap } = azureConfig; + const { + azureOptions, + baseURL, + headers = {}, + serverless, + } = mapModelToAzureConfig({ + modelName, + modelGroupMap, + groupMap, + }); - let userKey = null; - if (expiresAt && isUserProvided) { - checkUserKeyExpiry( - expiresAt, - 'Your OpenAI API key has expired. Please provide your API key again.', - ); - userKey = await getUserKey({ userId: req.user.id, name: endpoint }); - } + clientOptions.reverseProxyUrl = baseURL ?? clientOptions.reverseProxyUrl; + clientOptions.headers = resolveHeaders({ ...headers, ...(clientOptions.headers ?? {}) }); + + clientOptions.titleConvo = azureConfig.titleConvo; + clientOptions.titleModel = azureConfig.titleModel; + clientOptions.titleMethod = azureConfig.titleMethod ?? 'completion'; - let apiKey = isUserProvided ? userKey : credentials[endpoint]; + const groupName = modelGroupMap[modelName].group; + clientOptions.addParams = azureConfig.groupMap[groupName].addParams; + clientOptions.dropParams = azureConfig.groupMap[groupName].dropParams; + clientOptions.forcePrompt = azureConfig.groupMap[groupName].forcePrompt; - if (endpoint === EModelEndpoint.azureOpenAI) { - clientOptions.azure = isUserProvided ? JSON.parse(userKey) : getAzureCredentials(); + apiKey = azureOptions.azureOpenAIApiKey; + clientOptions.azure = !serverless && azureOptions; + } else if (isAzureOpenAI) { + clientOptions.azure = userProvidesKey ? JSON.parse(userValues.apiKey) : getAzureCredentials(); apiKey = clientOptions.azure.azureOpenAIApiKey; } if (!apiKey) { - throw new Error('API key not provided.'); + throw new Error(`${endpoint} API key not provided. Please provide it again.`); } const client = new OpenAIClient(apiKey, clientOptions); diff --git a/api/server/services/Endpoints/openAI/initializeClient.spec.js b/api/server/services/Endpoints/openAI/initializeClient.spec.js index 03f5677441c..1a53f95b3de 100644 --- a/api/server/services/Endpoints/openAI/initializeClient.spec.js +++ b/api/server/services/Endpoints/openAI/initializeClient.spec.js @@ -1,6 +1,7 @@ -const { OpenAIClient } = require('~/app'); -const initializeClient = require('./initializeClient'); +const { EModelEndpoint, validateAzureGroups } = require('librechat-data-provider'); const { getUserKey } = require('~/server/services/UserService'); +const initializeClient = require('./initializeClient'); +const { OpenAIClient } = require('~/app'); // Mock getUserKey since it's the only function we want to mock jest.mock('~/server/services/UserService', () => ({ @@ -11,6 +12,72 @@ jest.mock('~/server/services/UserService', () => ({ describe('initializeClient', () => { // Set up environment variables const originalEnvironment = process.env; + const app = { + locals: {}, + }; + + const validAzureConfigs = [ + { + group: 'librechat-westus', + apiKey: 'WESTUS_API_KEY', + instanceName: 'librechat-westus', + version: '2023-12-01-preview', + models: { + 'gpt-4-vision-preview': { + deploymentName: 'gpt-4-vision-preview', + version: '2024-02-15-preview', + }, + 'gpt-3.5-turbo': { + deploymentName: 'gpt-35-turbo', + }, + 'gpt-3.5-turbo-1106': { + deploymentName: 'gpt-35-turbo-1106', + }, + 'gpt-4': { + deploymentName: 'gpt-4', + }, + 'gpt-4-1106-preview': { + deploymentName: 'gpt-4-1106-preview', + }, + }, + }, + { + group: 'librechat-eastus', + apiKey: 'EASTUS_API_KEY', + instanceName: 'librechat-eastus', + deploymentName: 'gpt-4-turbo', + version: '2024-02-15-preview', + models: { + 'gpt-4-turbo': true, + }, + baseURL: 'https://eastus.example.com', + additionalHeaders: { + 'x-api-key': 'x-api-key-value', + }, + }, + { + group: 'mistral-inference', + apiKey: 'AZURE_MISTRAL_API_KEY', + baseURL: + 'https://Mistral-large-vnpet-serverless.region.inference.ai.azure.com/v1/chat/completions', + serverless: true, + models: { + 'mistral-large': true, + }, + }, + { + group: 'llama-70b-chat', + apiKey: 'AZURE_LLAMA2_70B_API_KEY', + baseURL: + 'https://Llama-2-70b-chat-qmvyb-serverless.region.inference.ai.azure.com/v1/chat/completions', + serverless: true, + models: { + 'llama-70b-chat': true, + }, + }, + ]; + + const { modelNames, modelGroupMap, groupMap } = validateAzureGroups(validAzureConfigs); beforeEach(() => { jest.resetModules(); // Clears the cache @@ -27,16 +94,17 @@ describe('initializeClient', () => { process.env.OPENAI_SUMMARIZE = 'false'; const req = { - body: { key: null, endpoint: 'openAI' }, + body: { key: null, endpoint: EModelEndpoint.openAI }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = {}; - const client = await initializeClient({ req, res, endpointOption }); + const result = await initializeClient({ req, res, endpointOption }); - expect(client.openAIApiKey).toBe('test-openai-api-key'); - expect(client.client).toBeInstanceOf(OpenAIClient); + expect(result.openAIApiKey).toBe('test-openai-api-key'); + expect(result.client).toBeInstanceOf(OpenAIClient); }); test('should initialize client with Azure credentials when endpoint is azureOpenAI', async () => { @@ -53,6 +121,7 @@ describe('initializeClient', () => { const req = { body: { key: null, endpoint: 'azureOpenAI' }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = { modelOptions: { model: 'test-model' } }; @@ -68,8 +137,9 @@ describe('initializeClient', () => { process.env.DEBUG_OPENAI = 'true'; const req = { - body: { key: null, endpoint: 'openAI' }, + body: { key: null, endpoint: EModelEndpoint.openAI }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = {}; @@ -84,8 +154,9 @@ describe('initializeClient', () => { process.env.OPENAI_SUMMARIZE = 'true'; const req = { - body: { key: null, endpoint: 'openAI' }, + body: { key: null, endpoint: EModelEndpoint.openAI }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = {}; @@ -101,8 +172,9 @@ describe('initializeClient', () => { process.env.PROXY = 'http://proxy'; const req = { - body: { key: null, endpoint: 'openAI' }, + body: { key: null, endpoint: EModelEndpoint.openAI }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = {}; @@ -121,15 +193,14 @@ describe('initializeClient', () => { const expiresAt = new Date(Date.now() - 10000).toISOString(); // Expired const req = { - body: { key: expiresAt, endpoint: 'openAI' }, + body: { key: expiresAt, endpoint: EModelEndpoint.openAI }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = {}; - await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow( - 'Your OpenAI API key has expired. Please provide your API key again.', - ); + await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow(/Your OpenAI API/); }); test('should throw an error if no API keys are provided in the environment', async () => { @@ -138,14 +209,15 @@ describe('initializeClient', () => { delete process.env.AZURE_API_KEY; const req = { - body: { key: null, endpoint: 'openAI' }, + body: { key: null, endpoint: EModelEndpoint.openAI }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = {}; await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow( - 'API key not provided.', + `${EModelEndpoint.openAI} API key not provided.`, ); }); @@ -154,11 +226,12 @@ describe('initializeClient', () => { const req = { body: { key: new Date(Date.now() + 10000).toISOString(), - endpoint: 'openAI', + endpoint: EModelEndpoint.openAI, }, user: { id: '123', }, + app, }; const res = {}; @@ -168,7 +241,7 @@ describe('initializeClient', () => { process.env.OPENAI_API_KEY = 'user_provided'; // Mock getUserKey to return the expected key - getUserKey.mockResolvedValue('test-user-provided-openai-api-key'); + getUserKey.mockResolvedValue(JSON.stringify({ apiKey: 'test-user-provided-openai-api-key' })); // Call the initializeClient function const result = await initializeClient({ req, res, endpointOption }); @@ -180,8 +253,9 @@ describe('initializeClient', () => { test('should throw an error if the user-provided key is invalid', async () => { const invalidKey = new Date(Date.now() - 100000).toISOString(); const req = { - body: { key: invalidKey, endpoint: 'openAI' }, + body: { key: invalidKey, endpoint: EModelEndpoint.openAI }, user: { id: '123' }, + app, }; const res = {}; const endpointOption = {}; @@ -192,8 +266,94 @@ describe('initializeClient', () => { // Mock getUserKey to return an invalid key getUserKey.mockResolvedValue(invalidKey); + await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow(/Your OpenAI API/); + }); + + test('should throw an error when user-provided values are not valid JSON', async () => { + process.env.OPENAI_API_KEY = 'user_provided'; + const req = { + body: { key: new Date(Date.now() + 10000).toISOString(), endpoint: EModelEndpoint.openAI }, + user: { id: '123' }, + app, + }; + const res = {}; + const endpointOption = {}; + + // Mock getUserKey to return a non-JSON string + getUserKey.mockResolvedValue('not-a-json'); + await expect(initializeClient({ req, res, endpointOption })).rejects.toThrow( - /Your OpenAI API key has expired/, + /Invalid JSON provided for openAI user values/, + ); + }); + + test('should initialize client correctly for Azure OpenAI with valid configuration', async () => { + const req = { + body: { + key: null, + endpoint: EModelEndpoint.azureOpenAI, + model: modelNames[0], + }, + user: { id: '123' }, + app: { + locals: { + [EModelEndpoint.azureOpenAI]: { + modelNames, + modelGroupMap, + groupMap, + }, + }, + }, + }; + const res = {}; + const endpointOption = {}; + + const client = await initializeClient({ req, res, endpointOption }); + expect(client.client.options.azure).toBeDefined(); + }); + + test('should initialize client with default options when certain env vars are not set', async () => { + delete process.env.DEBUG_OPENAI; + delete process.env.OPENAI_SUMMARIZE; + process.env.OPENAI_API_KEY = 'some-api-key'; + + const req = { + body: { key: null, endpoint: EModelEndpoint.openAI }, + user: { id: '123' }, + app, + }; + const res = {}; + const endpointOption = {}; + + const client = await initializeClient({ req, res, endpointOption }); + + expect(client.client.options.debug).toBe(false); + expect(client.client.options.contextStrategy).toBe(null); + }); + + test('should correctly use user-provided apiKey and baseURL when provided', async () => { + process.env.OPENAI_API_KEY = 'user_provided'; + process.env.OPENAI_REVERSE_PROXY = 'user_provided'; + const req = { + body: { + key: new Date(Date.now() + 10000).toISOString(), + endpoint: EModelEndpoint.openAI, + }, + user: { + id: '123', + }, + app, + }; + const res = {}; + const endpointOption = {}; + + getUserKey.mockResolvedValue( + JSON.stringify({ apiKey: 'test', baseURL: 'https://user-provided-url.com' }), ); + + const result = await initializeClient({ req, res, endpointOption }); + + expect(result.openAIApiKey).toBe('test'); + expect(result.client.options.reverseProxyUrl).toBe('https://user-provided-url.com'); }); }); diff --git a/api/server/services/Files/Firebase/crud.js b/api/server/services/Files/Firebase/crud.js index 68f534bcb6d..43b5ec9b252 100644 --- a/api/server/services/Files/Firebase/crud.js +++ b/api/server/services/Files/Firebase/crud.js @@ -1,6 +1,11 @@ +const fs = require('fs'); +const path = require('path'); +const axios = require('axios'); const fetch = require('node-fetch'); -const { ref, uploadBytes, getDownloadURL, deleteObject } = require('firebase/storage'); +const { ref, uploadBytes, getDownloadURL, getStream, deleteObject } = require('firebase/storage'); +const { getBufferMetadata } = require('~/server/utils'); const { getFirebaseStorage } = require('./initialize'); +const { logger } = require('~/config'); /** * Deletes a file from Firebase Storage. @@ -11,7 +16,7 @@ const { getFirebaseStorage } = require('./initialize'); async function deleteFile(basePath, fileName) { const storage = getFirebaseStorage(); if (!storage) { - console.error('Firebase is not initialized. Cannot delete file from Firebase Storage.'); + logger.error('Firebase is not initialized. Cannot delete file from Firebase Storage.'); throw new Error('Firebase is not initialized'); } @@ -19,9 +24,9 @@ async function deleteFile(basePath, fileName) { try { await deleteObject(storageRef); - console.log('File deleted successfully from Firebase Storage'); + logger.debug('File deleted successfully from Firebase Storage'); } catch (error) { - console.error('Error deleting file from Firebase Storage:', error.message); + logger.error('Error deleting file from Firebase Storage:', error.message); throw error; } } @@ -41,24 +46,25 @@ async function deleteFile(basePath, fileName) { * @param {string} [params.basePath='images'] - Optional. The base basePath in Firebase Storage where the file will * be stored. Defaults to 'images' if not specified. * - * @returns {Promise<string|null>} - * A promise that resolves to the file name if the file is successfully uploaded, or null if there - * is an error in initialization or upload. + * @returns {Promise<{ bytes: number, type: string, dimensions: Record<string, number>} | null>} + * A promise that resolves to the file metadata if the file is successfully saved, or null if there is an error. */ async function saveURLToFirebase({ userId, URL, fileName, basePath = 'images' }) { const storage = getFirebaseStorage(); if (!storage) { - console.error('Firebase is not initialized. Cannot save file to Firebase Storage.'); + logger.error('Firebase is not initialized. Cannot save file to Firebase Storage.'); return null; } const storageRef = ref(storage, `${basePath}/${userId.toString()}/${fileName}`); + const response = await fetch(URL); + const buffer = await response.buffer(); try { - await uploadBytes(storageRef, await fetch(URL).then((response) => response.buffer())); - return fileName; + await uploadBytes(storageRef, buffer); + return await getBufferMetadata(buffer); } catch (error) { - console.error('Error uploading file to Firebase Storage:', error.message); + logger.error('Error uploading file to Firebase Storage:', error.message); return null; } } @@ -82,7 +88,7 @@ async function saveURLToFirebase({ userId, URL, fileName, basePath = 'images' }) async function getFirebaseURL({ fileName, basePath = 'images' }) { const storage = getFirebaseStorage(); if (!storage) { - console.error('Firebase is not initialized. Cannot get image URL from Firebase Storage.'); + logger.error('Firebase is not initialized. Cannot get image URL from Firebase Storage.'); return null; } @@ -91,7 +97,7 @@ async function getFirebaseURL({ fileName, basePath = 'images' }) { try { return await getDownloadURL(storageRef); } catch (error) { - console.error('Error fetching file URL from Firebase Storage:', error.message); + logger.error('Error fetching file URL from Firebase Storage:', error.message); return null; } } @@ -158,6 +164,18 @@ function extractFirebaseFilePath(urlString) { * Throws an error if there is an issue with deletion. */ const deleteFirebaseFile = async (req, file) => { + if (file.embedded && process.env.RAG_API_URL) { + const jwtToken = req.headers.authorization.split(' ')[1]; + axios.delete(`${process.env.RAG_API_URL}/documents`, { + headers: { + Authorization: `Bearer ${jwtToken}`, + 'Content-Type': 'application/json', + accept: 'application/json', + }, + data: [file.file_id], + }); + } + const fileName = extractFirebaseFilePath(file.filepath); if (!fileName.includes(req.user.id)) { throw new Error('Invalid file path'); @@ -165,10 +183,62 @@ const deleteFirebaseFile = async (req, file) => { await deleteFile('', fileName); }; +/** + * Uploads a file to Firebase Storage. + * + * @param {Object} params - The params object. + * @param {Express.Request} params.req - The request object from Express. It should have a `user` property with an `id` + * representing the user. + * @param {Express.Multer.File} params.file - The file object, which is part of the request. The file object should + * have a `path` property that points to the location of the uploaded file. + * @param {string} params.file_id - The file ID. + * + * @returns {Promise<{ filepath: string, bytes: number }>} + * A promise that resolves to an object containing: + * - filepath: The download URL of the uploaded file. + * - bytes: The size of the uploaded file in bytes. + */ +async function uploadFileToFirebase({ req, file, file_id }) { + const inputFilePath = file.path; + const inputBuffer = await fs.promises.readFile(inputFilePath); + const bytes = Buffer.byteLength(inputBuffer); + const userId = req.user.id; + + const fileName = `${file_id}__${path.basename(inputFilePath)}`; + + const downloadURL = await saveBufferToFirebase({ userId, buffer: inputBuffer, fileName }); + + await fs.promises.unlink(inputFilePath); + + return { filepath: downloadURL, bytes }; +} + +/** + * Retrieves a readable stream for a file from Firebase storage. + * + * @param {string} filepath - The filepath. + * @returns {ReadableStream} A readable stream of the file. + */ +function getFirebaseFileStream(filepath) { + try { + const storage = getFirebaseStorage(); + if (!storage) { + throw new Error('Firebase is not initialized'); + } + const fileRef = ref(storage, filepath); + return getStream(fileRef); + } catch (error) { + logger.error('Error getting Firebase file stream:', error); + throw error; + } +} + module.exports = { deleteFile, getFirebaseURL, saveURLToFirebase, deleteFirebaseFile, + uploadFileToFirebase, saveBufferToFirebase, + getFirebaseFileStream, }; diff --git a/api/server/services/Files/Firebase/images.js b/api/server/services/Files/Firebase/images.js index 95b600962f6..f06718063c9 100644 --- a/api/server/services/Files/Firebase/images.js +++ b/api/server/services/Files/Firebase/images.js @@ -1,7 +1,8 @@ const fs = require('fs'); const path = require('path'); const sharp = require('sharp'); -const { resizeImage } = require('../images/resize'); +const { resizeImageBuffer } = require('../images/resize'); +const { updateUser } = require('~/models/userMethods'); const { saveBufferToFirebase } = require('./crud'); const { updateFile } = require('~/models/File'); const { logger } = require('~/config'); @@ -10,12 +11,13 @@ const { logger } = require('~/config'); * Converts an image file to the WebP format. The function first resizes the image based on the specified * resolution. * - * - * @param {Object} req - The request object from Express. It should have a `user` property with an `id` + * @param {Object} params - The params object. + * @param {Express.Request} params.req - The request object from Express. It should have a `user` property with an `id` * representing the user, and an `app.locals.paths` object with an `imageOutput` path. - * @param {Express.Multer.File} file - The file object, which is part of the request. The file object should + * @param {Express.Multer.File} params.file - The file object, which is part of the request. The file object should * have a `path` property that points to the location of the uploaded file. - * @param {string} [resolution='high'] - Optional. The desired resolution for the image resizing. Default is 'high'. + * @param {EModelEndpoint} params.endpoint - The params object. + * @param {string} [params.resolution='high'] - Optional. The desired resolution for the image resizing. Default is 'high'. * * @returns {Promise<{ filepath: string, bytes: number, width: number, height: number}>} * A promise that resolves to an object containing: @@ -24,14 +26,19 @@ const { logger } = require('~/config'); * - width: The width of the converted image. * - height: The height of the converted image. */ -async function uploadImageToFirebase(req, file, resolution = 'high') { +async function uploadImageToFirebase({ req, file, file_id, endpoint, resolution = 'high' }) { const inputFilePath = file.path; - const { buffer: resizedBuffer, width, height } = await resizeImage(inputFilePath, resolution); + const inputBuffer = await fs.promises.readFile(inputFilePath); + const { + buffer: resizedBuffer, + width, + height, + } = await resizeImageBuffer(inputBuffer, resolution, endpoint); const extension = path.extname(inputFilePath); const userId = req.user.id; let webPBuffer; - let fileName = path.basename(inputFilePath); + let fileName = `${file_id}__${path.basename(inputFilePath)}`; if (extension.toLowerCase() === '.webp') { webPBuffer = resizedBuffer; } else { @@ -73,15 +80,15 @@ async function prepareImageURL(req, file) { * * @param {object} params - The parameters object. * @param {Buffer} params.buffer - The Buffer containing the avatar image in WebP format. - * @param {object} params.User - The User document (mongoose); TODO: remove direct use of Model, `User` + * @param {string} params.userId - The user ID. * @param {string} params.manual - A string flag indicating whether the update is manual ('true' or 'false'). * @returns {Promise<string>} - A promise that resolves with the URL of the uploaded avatar. * @throws {Error} - Throws an error if Firebase is not initialized or if there is an error in uploading. */ -async function processFirebaseAvatar({ buffer, User, manual }) { +async function processFirebaseAvatar({ buffer, userId, manual }) { try { const downloadURL = await saveBufferToFirebase({ - userId: User._id.toString(), + userId, buffer, fileName: 'avatar.png', }); @@ -91,8 +98,7 @@ async function processFirebaseAvatar({ buffer, User, manual }) { const url = `${downloadURL}?manual=${isManual}`; if (isManual) { - User.avatar = url; - await User.save(); + await updateUser(userId, { avatar: url }); } return url; diff --git a/api/server/services/Files/Local/crud.js b/api/server/services/Files/Local/crud.js index d81c063031a..18bf5127fd4 100644 --- a/api/server/services/Files/Local/crud.js +++ b/api/server/services/Files/Local/crud.js @@ -1,8 +1,9 @@ const fs = require('fs'); const path = require('path'); const axios = require('axios'); -const { logger } = require('~/config'); +const { getBufferMetadata } = require('~/server/utils'); const paths = require('~/config/paths'); +const { logger } = require('~/config'); /** * Saves a file to a specified output path with a new filename. @@ -13,7 +14,7 @@ const paths = require('~/config/paths'); * @returns {Promise<string>} The full path of the saved file. * @throws Will throw an error if the file saving process fails. */ -async function saveFile(file, outputPath, outputFilename) { +async function saveLocalFile(file, outputPath, outputFilename) { try { if (!fs.existsSync(outputPath)) { fs.mkdirSync(outputPath, { recursive: true }); @@ -44,9 +45,41 @@ async function saveFile(file, outputPath, outputFilename) { const saveLocalImage = async (req, file, filename) => { const imagePath = req.app.locals.paths.imageOutput; const outputPath = path.join(imagePath, req.user.id ?? ''); - await saveFile(file, outputPath, filename); + await saveLocalFile(file, outputPath, filename); }; +/** + * Saves a buffer to a specified directory on the local file system. + * + * @param {Object} params - The parameters object. + * @param {string} params.userId - The user's unique identifier. This is used to create a user-specific directory. + * @param {Buffer} params.buffer - The buffer to be saved. + * @param {string} params.fileName - The name of the file to be saved. + * @param {string} [params.basePath='images'] - Optional. The base path where the file will be stored. + * Defaults to 'images' if not specified. + * @returns {Promise<string>} - A promise that resolves to the path of the saved file. + */ +async function saveLocalBuffer({ userId, buffer, fileName, basePath = 'images' }) { + try { + const { publicPath, uploads } = paths; + + const directoryPath = path.join(basePath === 'images' ? publicPath : uploads, basePath, userId); + + if (!fs.existsSync(directoryPath)) { + fs.mkdirSync(directoryPath, { recursive: true }); + } + + fs.writeFileSync(path.join(directoryPath, fileName), buffer); + + const filePath = path.posix.join('/', basePath, userId, fileName); + + return filePath; + } catch (error) { + logger.error('[saveLocalBuffer] Error while saving the buffer:', error); + throw error; + } +} + /** * Saves a file from a given URL to a local directory. The function fetches the file using the provided URL, * determines the content type, and saves it to a specified local directory with the correct file extension. @@ -62,20 +95,18 @@ const saveLocalImage = async (req, file, filename) => { * @param {string} [params.basePath='images'] - Optional. The base directory where the file will be saved. * Defaults to 'images' if not specified. * - * @returns {Promise<string|null>} - * A promise that resolves to the file name if the file is successfully saved, or null if there is an error. + * @returns {Promise<{ bytes: number, type: string, dimensions: Record<string, number>} | null>} + * A promise that resolves to the file metadata if the file is successfully saved, or null if there is an error. */ async function saveFileFromURL({ userId, URL, fileName, basePath = 'images' }) { try { - // Fetch the file from the URL const response = await axios({ url: URL, - responseType: 'stream', + responseType: 'arraybuffer', }); - // Get the content type from the response headers - const contentType = response.headers['content-type']; - let extension = contentType.split('/').pop(); + const buffer = Buffer.from(response.data, 'binary'); + const { bytes, type, dimensions, extension } = await getBufferMetadata(buffer); // Construct the outputPath based on the basePath and userId const outputPath = path.join(paths.publicPath, basePath, userId.toString()); @@ -92,17 +123,15 @@ async function saveFileFromURL({ userId, URL, fileName, basePath = 'images' }) { fileName += `.${extension}`; } - // Create a writable stream for the output path + // Save the file to the output path const outputFilePath = path.join(outputPath, fileName); - const writer = fs.createWriteStream(outputFilePath); + fs.writeFileSync(outputFilePath, buffer); - // Pipe the response data to the output file - response.data.pipe(writer); - - return new Promise((resolve, reject) => { - writer.on('finish', () => resolve(fileName)); - writer.on('error', reject); - }); + return { + bytes, + type, + dimensions, + }; } catch (error) { logger.error('[saveFileFromURL] Error while saving the file:', error); return null; @@ -159,7 +188,26 @@ const isValidPath = (req, base, subfolder, filepath) => { * file path is invalid or if there is an error in deletion. */ const deleteLocalFile = async (req, file) => { - const { publicPath } = req.app.locals.paths; + const { publicPath, uploads } = req.app.locals.paths; + if (file.embedded && process.env.RAG_API_URL) { + const jwtToken = req.headers.authorization.split(' ')[1]; + axios.delete(`${process.env.RAG_API_URL}/documents`, { + headers: { + Authorization: `Bearer ${jwtToken}`, + 'Content-Type': 'application/json', + accept: 'application/json', + }, + data: [file.file_id], + }); + } + + if (file.filepath.startsWith(`/uploads/${req.user.id}`)) { + const basePath = file.filepath.split('/uploads/')[1]; + const filepath = path.join(uploads, basePath); + await fs.promises.unlink(filepath); + return; + } + const parts = file.filepath.split(path.sep); const subfolder = parts[1]; const filepath = path.join(publicPath, file.filepath); @@ -171,4 +219,64 @@ const deleteLocalFile = async (req, file) => { await fs.promises.unlink(filepath); }; -module.exports = { saveFile, saveLocalImage, saveFileFromURL, getLocalFileURL, deleteLocalFile }; +/** + * Uploads a file to the specified upload directory. + * + * @param {Object} params - The params object. + * @param {Object} params.req - The request object from Express. It should have a `user` property with an `id` + * representing the user, and an `app.locals.paths` object with an `uploads` path. + * @param {Express.Multer.File} params.file - The file object, which is part of the request. The file object should + * have a `path` property that points to the location of the uploaded file. + * @param {string} params.file_id - The file ID. + * + * @returns {Promise<{ filepath: string, bytes: number }>} + * A promise that resolves to an object containing: + * - filepath: The path where the file is saved. + * - bytes: The size of the file in bytes. + */ +async function uploadLocalFile({ req, file, file_id }) { + const inputFilePath = file.path; + const inputBuffer = await fs.promises.readFile(inputFilePath); + const bytes = Buffer.byteLength(inputBuffer); + + const { uploads } = req.app.locals.paths; + const userPath = path.join(uploads, req.user.id); + + if (!fs.existsSync(userPath)) { + fs.mkdirSync(userPath, { recursive: true }); + } + + const fileName = `${file_id}__${path.basename(inputFilePath)}`; + const newPath = path.join(userPath, fileName); + + await fs.promises.writeFile(newPath, inputBuffer); + const filepath = path.posix.join('/', 'uploads', req.user.id, path.basename(newPath)); + + return { filepath, bytes }; +} + +/** + * Retrieves a readable stream for a file from local storage. + * + * @param {string} filepath - The filepath. + * @returns {ReadableStream} A readable stream of the file. + */ +function getLocalFileStream(filepath) { + try { + return fs.createReadStream(filepath); + } catch (error) { + logger.error('Error getting local file stream:', error); + throw error; + } +} + +module.exports = { + saveLocalFile, + saveLocalImage, + saveLocalBuffer, + saveFileFromURL, + getLocalFileURL, + deleteLocalFile, + uploadLocalFile, + getLocalFileStream, +}; diff --git a/api/server/services/Files/Local/images.js b/api/server/services/Files/Local/images.js index 63ed5b2f64b..4d5b9565f1f 100644 --- a/api/server/services/Files/Local/images.js +++ b/api/server/services/Files/Local/images.js @@ -1,7 +1,8 @@ const fs = require('fs'); const path = require('path'); const sharp = require('sharp'); -const { resizeImage } = require('../images/resize'); +const { resizeImageBuffer } = require('../images/resize'); +const { updateUser } = require('~/models/userMethods'); const { updateFile } = require('~/models/File'); /** @@ -12,12 +13,14 @@ const { updateFile } = require('~/models/File'); * it converts the image to WebP format before saving. * * The original image is deleted after conversion. - * - * @param {Object} req - The request object from Express. It should have a `user` property with an `id` + * @param {Object} params - The params object. + * @param {Object} params.req - The request object from Express. It should have a `user` property with an `id` * representing the user, and an `app.locals.paths` object with an `imageOutput` path. - * @param {Express.Multer.File} file - The file object, which is part of the request. The file object should + * @param {Express.Multer.File} params.file - The file object, which is part of the request. The file object should * have a `path` property that points to the location of the uploaded file. - * @param {string} [resolution='high'] - Optional. The desired resolution for the image resizing. Default is 'high'. + * @param {string} params.file_id - The file ID. + * @param {EModelEndpoint} params.endpoint - The params object. + * @param {string} [params.resolution='high'] - Optional. The desired resolution for the image resizing. Default is 'high'. * * @returns {Promise<{ filepath: string, bytes: number, width: number, height: number}>} * A promise that resolves to an object containing: @@ -26,9 +29,14 @@ const { updateFile } = require('~/models/File'); * - width: The width of the converted image. * - height: The height of the converted image. */ -async function uploadLocalImage(req, file, resolution = 'high') { +async function uploadLocalImage({ req, file, file_id, endpoint, resolution = 'high' }) { const inputFilePath = file.path; - const { buffer: resizedBuffer, width, height } = await resizeImage(inputFilePath, resolution); + const inputBuffer = await fs.promises.readFile(inputFilePath); + const { + buffer: resizedBuffer, + width, + height, + } = await resizeImageBuffer(inputBuffer, resolution, endpoint); const extension = path.extname(inputFilePath); const { imageOutput } = req.app.locals.paths; @@ -38,7 +46,8 @@ async function uploadLocalImage(req, file, resolution = 'high') { fs.mkdirSync(userPath, { recursive: true }); } - const newPath = path.join(userPath, path.basename(inputFilePath)); + const fileName = `${file_id}__${path.basename(inputFilePath)}`; + const newPath = path.join(userPath, fileName); if (extension.toLowerCase() === '.webp') { const bytes = Buffer.byteLength(resizedBuffer); @@ -96,17 +105,17 @@ async function prepareImagesLocal(req, file) { } /** - * Uploads a user's avatar to Firebase Storage and returns the URL. + * Uploads a user's avatar to local server storage and returns the URL. * If the 'manual' flag is set to 'true', it also updates the user's avatar URL in the database. * * @param {object} params - The parameters object. * @param {Buffer} params.buffer - The Buffer containing the avatar image in WebP format. - * @param {object} params.User - The User document (mongoose); TODO: remove direct use of Model, `User` + * @param {string} params.userId - The user ID. * @param {string} params.manual - A string flag indicating whether the update is manual ('true' or 'false'). * @returns {Promise<string>} - A promise that resolves with the URL of the uploaded avatar. * @throws {Error} - Throws an error if Firebase is not initialized or if there is an error in uploading. */ -async function processLocalAvatar({ buffer, User, manual }) { +async function processLocalAvatar({ buffer, userId, manual }) { const userDir = path.resolve( __dirname, '..', @@ -117,10 +126,11 @@ async function processLocalAvatar({ buffer, User, manual }) { 'client', 'public', 'images', - User._id.toString(), + userId, ); + const fileName = `avatar-${new Date().getTime()}.png`; - const urlRoute = `/images/${User._id.toString()}/${fileName}`; + const urlRoute = `/images/${userId}/${fileName}`; const avatarPath = path.join(userDir, fileName); await fs.promises.mkdir(userDir, { recursive: true }); @@ -130,8 +140,7 @@ async function processLocalAvatar({ buffer, User, manual }) { let url = `${urlRoute}?manual=${isManual}`; if (isManual) { - User.avatar = url; - await User.save(); + await updateUser(userId, { avatar: url }); } return url; diff --git a/api/server/services/Files/OpenAI/crud.js b/api/server/services/Files/OpenAI/crud.js new file mode 100644 index 00000000000..346259e8215 --- /dev/null +++ b/api/server/services/Files/OpenAI/crud.js @@ -0,0 +1,79 @@ +const fs = require('fs'); +const { FilePurpose } = require('librechat-data-provider'); +const { sleep } = require('~/server/utils'); +const { logger } = require('~/config'); + +/** + * Uploads a file that can be used across various OpenAI services. + * + * @param {Object} params - The params object. + * @param {Express.Request} params.req - The request object from Express. It should have a `user` property with an `id` + * representing the user, and an `app.locals.paths` object with an `imageOutput` path. + * @param {Express.Multer.File} params.file - The file uploaded to the server via multer. + * @param {OpenAIClient} params.openai - The initialized OpenAI client. + * @returns {Promise<OpenAIFile>} + */ +async function uploadOpenAIFile({ req, file, openai }) { + const uploadedFile = await openai.files.create({ + file: fs.createReadStream(file.path), + purpose: FilePurpose.Assistants, + }); + + logger.debug( + `[uploadOpenAIFile] User ${req.user.id} successfully uploaded file to OpenAI`, + uploadedFile, + ); + + if (uploadedFile.status !== 'processed') { + const sleepTime = 2500; + logger.debug( + `[uploadOpenAIFile] File ${ + uploadedFile.id + } is not yet processed. Waiting for it to be processed (${sleepTime / 1000}s)...`, + ); + await sleep(sleepTime); + } + + return uploadedFile; +} + +/** + * Deletes a file previously uploaded to OpenAI. + * + * @param {Express.Request} req - The request object from Express. + * @param {MongoFile} file - The database representation of the uploaded file. + * @param {OpenAI} openai - The initialized OpenAI client. + * @returns {Promise<void>} + */ +async function deleteOpenAIFile(req, file, openai) { + try { + const res = await openai.files.del(file.file_id); + if (!res.deleted) { + throw new Error('OpenAI returned `false` for deleted status'); + } + logger.debug( + `[deleteOpenAIFile] User ${req.user.id} successfully deleted ${file.file_id} from OpenAI`, + ); + } catch (error) { + logger.error('[deleteOpenAIFile] Error deleting file from OpenAI: ' + error.message); + throw error; + } +} + +/** + * Retrieves a readable stream for a file from local storage. + * + * @param {string} file_id - The file_id. + * @param {OpenAI} openai - The initialized OpenAI client. + * @returns {Promise<ReadableStream>} A readable stream of the file. + */ +async function getOpenAIFileStream(file_id, openai) { + try { + return await openai.files.content(file_id); + } catch (error) { + logger.error('Error getting OpenAI file download stream:', error); + throw error; + } +} + +module.exports = { uploadOpenAIFile, deleteOpenAIFile, getOpenAIFileStream }; diff --git a/api/server/services/Files/OpenAI/index.js b/api/server/services/Files/OpenAI/index.js new file mode 100644 index 00000000000..a6223d1ee5d --- /dev/null +++ b/api/server/services/Files/OpenAI/index.js @@ -0,0 +1,5 @@ +const crud = require('./crud'); + +module.exports = { + ...crud, +}; diff --git a/api/server/services/Files/VectorDB/crud.js b/api/server/services/Files/VectorDB/crud.js new file mode 100644 index 00000000000..c9a8c315834 --- /dev/null +++ b/api/server/services/Files/VectorDB/crud.js @@ -0,0 +1,102 @@ +const fs = require('fs'); +const axios = require('axios'); +const FormData = require('form-data'); +const { FileSources } = require('librechat-data-provider'); +const { logger } = require('~/config'); + +/** + * Deletes a file from the vector database. This function takes a file object, constructs the full path, and + * verifies the path's validity before deleting the file. If the path is invalid, an error is thrown. + * + * @param {Express.Request} req - The request object from Express. It should have an `app.locals.paths` object with + * a `publicPath` property. + * @param {MongoFile} file - The file object to be deleted. It should have a `filepath` property that is + * a string representing the path of the file relative to the publicPath. + * + * @returns {Promise<void>} + * A promise that resolves when the file has been successfully deleted, or throws an error if the + * file path is invalid or if there is an error in deletion. + */ +const deleteVectors = async (req, file) => { + if (!file.embedded || !process.env.RAG_API_URL) { + return; + } + try { + const jwtToken = req.headers.authorization.split(' ')[1]; + return await axios.delete(`${process.env.RAG_API_URL}/documents`, { + headers: { + Authorization: `Bearer ${jwtToken}`, + 'Content-Type': 'application/json', + accept: 'application/json', + }, + data: [file.file_id], + }); + } catch (error) { + logger.error('Error deleting vectors', error); + throw new Error(error.message || 'An error occurred during file deletion.'); + } +}; + +/** + * Uploads a file to the configured Vector database + * + * @param {Object} params - The params object. + * @param {Object} params.req - The request object from Express. It should have a `user` property with an `id` + * representing the user, and an `app.locals.paths` object with an `uploads` path. + * @param {Express.Multer.File} params.file - The file object, which is part of the request. The file object should + * have a `path` property that points to the location of the uploaded file. + * @param {string} params.file_id - The file ID. + * + * @returns {Promise<{ filepath: string, bytes: number }>} + * A promise that resolves to an object containing: + * - filepath: The path where the file is saved. + * - bytes: The size of the file in bytes. + */ +async function uploadVectors({ req, file, file_id }) { + if (!process.env.RAG_API_URL) { + throw new Error('RAG_API_URL not defined'); + } + + try { + const jwtToken = req.headers.authorization.split(' ')[1]; + const formData = new FormData(); + formData.append('file_id', file_id); + formData.append('file', fs.createReadStream(file.path)); + + const formHeaders = formData.getHeaders(); // Automatically sets the correct Content-Type + + const response = await axios.post(`${process.env.RAG_API_URL}/embed`, formData, { + headers: { + Authorization: `Bearer ${jwtToken}`, + accept: 'application/json', + ...formHeaders, + }, + }); + + const responseData = response.data; + logger.debug('Response from embedding file', responseData); + + if (responseData.known_type === false) { + throw new Error(`File embedding failed. The filetype ${file.mimetype} is not supported`); + } + + if (!responseData.status) { + throw new Error('File embedding failed.'); + } + + return { + bytes: file.size, + filename: file.originalname, + filepath: FileSources.vectordb, + embedded: Boolean(responseData.known_type), + }; + } catch (error) { + logger.error('Error embedding file', error); + throw new Error(error.message || 'An error occurred during file upload.'); + } +} + +module.exports = { + deleteVectors, + uploadVectors, +}; diff --git a/api/server/services/Files/VectorDB/index.js b/api/server/services/Files/VectorDB/index.js new file mode 100644 index 00000000000..a6223d1ee5d --- /dev/null +++ b/api/server/services/Files/VectorDB/index.js @@ -0,0 +1,5 @@ +const crud = require('./crud'); + +module.exports = { + ...crud, +}; diff --git a/api/server/services/Files/images/avatar.js b/api/server/services/Files/images/avatar.js index 490fc86171d..8f4f65b8e29 100644 --- a/api/server/services/Files/images/avatar.js +++ b/api/server/services/Files/images/avatar.js @@ -1,42 +1,29 @@ const sharp = require('sharp'); const fs = require('fs').promises; const fetch = require('node-fetch'); -const User = require('~/models/User'); -const { getStrategyFunctions } = require('~/server/services/Files/strategies'); +const { resizeAndConvert } = require('./resize'); const { logger } = require('~/config'); -async function convertToWebP(inputBuffer) { - return sharp(inputBuffer).resize({ width: 150 }).toFormat('webp').toBuffer(); -} - /** * Uploads an avatar image for a user. This function can handle various types of input (URL, Buffer, or File object), - * processes the image to a square format, converts it to WebP format, and then uses a specified file strategy for - * further processing. It performs validation on the user ID and the input type. The function can throw errors for - * invalid input types, fetching issues, or other processing errors. + * processes the image to a square format, converts it to WebP format, and returns the resized buffer. * * @param {Object} params - The parameters object. * @param {string} params.userId - The unique identifier of the user for whom the avatar is being uploaded. - * @param {FileSources} params.fileStrategy - The file handling strategy to use, determining how the avatar is processed. * @param {(string|Buffer|File)} params.input - The input representing the avatar image. Can be a URL (string), * a Buffer, or a File object. - * @param {string} params.manual - A string flag indicating whether the upload process is manual. * * @returns {Promise<any>} - * A promise that resolves to the result of the `processAvatar` function, specific to the chosen file - * strategy. Throws an error if any step in the process fails. + * A promise that resolves to a resized buffer. * * @throws {Error} Throws an error if the user ID is undefined, the input type is invalid, the image fetching fails, * or any other error occurs during the processing. */ -async function uploadAvatar({ userId, fileStrategy, input, manual }) { +async function resizeAvatar({ userId, input }) { try { if (userId === undefined) { throw new Error('User ID is undefined'); } - const _id = userId; - // TODO: remove direct use of Model, `User` - const oldUser = await User.findOne({ _id }); let imageBuffer; if (typeof input === 'string') { @@ -66,13 +53,12 @@ async function uploadAvatar({ userId, fileStrategy, input, manual }) { }) .toBuffer(); - const webPBuffer = await convertToWebP(squaredBuffer); - const { processAvatar } = getStrategyFunctions(fileStrategy); - return await processAvatar({ buffer: webPBuffer, User: oldUser, manual }); + const { buffer } = await resizeAndConvert(squaredBuffer); + return buffer; } catch (error) { logger.error('Error uploading the avatar:', error); throw error; } } -module.exports = uploadAvatar; +module.exports = { resizeAvatar }; diff --git a/api/server/services/Files/images/convert.js b/api/server/services/Files/images/convert.js new file mode 100644 index 00000000000..744e591717f --- /dev/null +++ b/api/server/services/Files/images/convert.js @@ -0,0 +1,70 @@ +const fs = require('fs'); +const path = require('path'); +const sharp = require('sharp'); +const { resizeImageBuffer } = require('./resize'); +const { getStrategyFunctions } = require('../strategies'); +const { logger } = require('~/config'); + +/** + * Converts an image file or buffer to WebP format with specified resolution. + * + * @param {Express.Request} req - The request object, containing user and app configuration data. + * @param {Buffer | Express.Multer.File} file - The file object, containing either a path or a buffer. + * @param {'low' | 'high'} [resolution='high'] - The desired resolution for the output image. + * @param {string} [basename=''] - The basename of the input file, if it is a buffer. + * @returns {Promise<{filepath: string, bytes: number, width: number, height: number}>} An object containing the path, size, and dimensions of the converted image. + * @throws Throws an error if there is an issue during the conversion process. + */ +async function convertToWebP(req, file, resolution = 'high', basename = '') { + try { + let inputBuffer; + let outputBuffer; + let extension = path.extname(file.path ?? basename).toLowerCase(); + + // Check if the input is a buffer or a file path + if (Buffer.isBuffer(file)) { + inputBuffer = file; + } else if (file && file.path) { + const inputFilePath = file.path; + inputBuffer = await fs.promises.readFile(inputFilePath); + } else { + throw new Error('Invalid input: file must be a buffer or contain a valid path.'); + } + + // Resize the image buffer + const { + buffer: resizedBuffer, + width, + height, + } = await resizeImageBuffer(inputBuffer, resolution); + + // Check if the file is already in WebP format + // If it isn't, convert it: + if (extension === '.webp') { + outputBuffer = resizedBuffer; + } else { + outputBuffer = await sharp(resizedBuffer).toFormat('webp').toBuffer(); + extension = '.webp'; + } + + // Generate a new filename for the output file + const newFileName = + path.basename(file.path ?? basename, path.extname(file.path ?? basename)) + extension; + + const { saveBuffer } = getStrategyFunctions(req.app.locals.fileStrategy); + + const savedFilePath = await saveBuffer({ + userId: req.user.id, + buffer: outputBuffer, + fileName: newFileName, + }); + + const bytes = Buffer.byteLength(outputBuffer); + return { filepath: savedFilePath, bytes, width, height }; + } catch (err) { + logger.error(err); + throw err; + } +} + +module.exports = { convertToWebP }; diff --git a/api/server/services/Files/images/encode.js b/api/server/services/Files/images/encode.js index 809ec0e8401..ade39ac2e72 100644 --- a/api/server/services/Files/images/encode.js +++ b/api/server/services/Files/images/encode.js @@ -1,5 +1,29 @@ +const axios = require('axios'); const { EModelEndpoint, FileSources } = require('librechat-data-provider'); const { getStrategyFunctions } = require('../strategies'); +const { logger } = require('~/config'); + +/** + * Fetches an image from a URL and returns its base64 representation. + * + * @async + * @param {string} url The URL of the image. + * @returns {Promise<string>} The base64-encoded string of the image. + * @throws {Error} If there's an issue fetching the image or encoding it. + */ +async function fetchImageToBase64(url) { + try { + const response = await axios.get(url, { + responseType: 'arraybuffer', + }); + return Buffer.from(response.data).toString('base64'); + } catch (error) { + logger.error('Error fetching image to convert to base64', error); + throw error; + } +} + +const base64Only = new Set([EModelEndpoint.google, EModelEndpoint.anthropic]); /** * Encodes and formats the given files. @@ -15,18 +39,29 @@ async function encodeAndFormat(req, files, endpoint) { for (let file of files) { const source = file.source ?? FileSources.local; - if (encodingMethods[source]) { - promises.push(encodingMethods[source](req, file)); + if (!file.height) { + promises.push([file, null]); continue; } - const { prepareImagePayload } = getStrategyFunctions(source); - if (!prepareImagePayload) { - throw new Error(`Encoding function not implemented for ${source}`); + if (!encodingMethods[source]) { + const { prepareImagePayload } = getStrategyFunctions(source); + if (!prepareImagePayload) { + throw new Error(`Encoding function not implemented for ${source}`); + } + + encodingMethods[source] = prepareImagePayload; } - encodingMethods[source] = prepareImagePayload; - promises.push(prepareImagePayload(req, file)); + const preparePayload = encodingMethods[source]; + + /* Google & Anthropic don't support passing URLs to payload */ + if (source !== FileSources.local && base64Only.has(endpoint)) { + const [_file, imageURL] = await preparePayload(req, file); + promises.push([_file, await fetchImageToBase64(imageURL)]); + continue; + } + promises.push(preparePayload(req, file)); } const detail = req.body.imageDetail ?? 'auto'; @@ -40,6 +75,24 @@ async function encodeAndFormat(req, files, endpoint) { }; for (const [file, imageContent] of formattedImages) { + const fileMetadata = { + type: file.type, + file_id: file.file_id, + filepath: file.filepath, + filename: file.filename, + embedded: !!file.embedded, + }; + + if (file.height && file.width) { + fileMetadata.height = file.height; + fileMetadata.width = file.width; + } + + if (!imageContent) { + result.files.push(fileMetadata); + continue; + } + const imagePart = { type: 'image_url', image_url: { @@ -52,18 +105,18 @@ async function encodeAndFormat(req, files, endpoint) { if (endpoint && endpoint === EModelEndpoint.google) { imagePart.image_url = imagePart.image_url.url; + } else if (endpoint && endpoint === EModelEndpoint.anthropic) { + imagePart.type = 'image'; + imagePart.source = { + type: 'base64', + media_type: file.type, + data: imageContent, + }; + delete imagePart.image_url; } result.image_urls.push(imagePart); - - result.files.push({ - file_id: file.file_id, - // filepath: file.filepath, - // filename: file.filename, - // type: file.type, - // height: file.height, - // width: file.width, - }); + result.files.push(fileMetadata); } return result; } diff --git a/api/server/services/Files/images/index.js b/api/server/services/Files/images/index.js index 1438887e6d1..889b19f2060 100644 --- a/api/server/services/Files/images/index.js +++ b/api/server/services/Files/images/index.js @@ -1,13 +1,13 @@ const avatar = require('./avatar'); +const convert = require('./convert'); const encode = require('./encode'); const parse = require('./parse'); const resize = require('./resize'); -const validate = require('./validate'); module.exports = { + ...convert, ...encode, ...parse, ...resize, - ...validate, avatar, }; diff --git a/api/server/services/Files/images/resize.js b/api/server/services/Files/images/resize.js index dd6f24ceeab..ac05ba99463 100644 --- a/api/server/services/Files/images/resize.js +++ b/api/server/services/Files/images/resize.js @@ -1,9 +1,21 @@ const sharp = require('sharp'); +const { EModelEndpoint } = require('librechat-data-provider'); -async function resizeImage(inputFilePath, resolution) { +/** + * Resizes an image from a given buffer based on the specified resolution. + * + * @param {Buffer} inputBuffer - The buffer of the image to be resized. + * @param {'low' | 'high'} resolution - The resolution to resize the image to. + * 'low' for a maximum of 512x512 resolution, + * 'high' for a maximum of 768x2000 resolution. + * @param {EModelEndpoint} endpoint - Identifier for specific endpoint handling + * @returns {Promise<{buffer: Buffer, width: number, height: number}>} An object containing the resized image buffer and its dimensions. + * @throws Will throw an error if the resolution parameter is invalid. + */ +async function resizeImageBuffer(inputBuffer, resolution, endpoint) { const maxLowRes = 512; const maxShortSideHighRes = 768; - const maxLongSideHighRes = 2000; + const maxLongSideHighRes = endpoint === EModelEndpoint.anthropic ? 1568 : 2000; let newWidth, newHeight; let resizeOptions = { fit: 'inside', withoutEnlargement: true }; @@ -12,7 +24,7 @@ async function resizeImage(inputFilePath, resolution) { resizeOptions.width = maxLowRes; resizeOptions.height = maxLowRes; } else if (resolution === 'high') { - const metadata = await sharp(inputFilePath).metadata(); + const metadata = await sharp(inputBuffer).metadata(); const isWidthShorter = metadata.width < metadata.height; if (isWidthShorter) { @@ -43,10 +55,28 @@ async function resizeImage(inputFilePath, resolution) { throw new Error('Invalid resolution parameter'); } - const resizedBuffer = await sharp(inputFilePath).rotate().resize(resizeOptions).toBuffer(); + const resizedBuffer = await sharp(inputBuffer).rotate().resize(resizeOptions).toBuffer(); const resizedMetadata = await sharp(resizedBuffer).metadata(); return { buffer: resizedBuffer, width: resizedMetadata.width, height: resizedMetadata.height }; } -module.exports = { resizeImage }; +/** + * Resizes an image buffer to webp format as well as reduces by specified or default 150 px width. + * + * @param {Buffer} inputBuffer - The buffer of the image to be resized. + * @returns {Promise<{ buffer: Buffer, width: number, height: number, bytes: number }>} An object containing the resized image buffer, its size and dimensions. + * @throws Will throw an error if the resolution parameter is invalid. + */ +async function resizeAndConvert(inputBuffer, width = 150) { + const resizedBuffer = await sharp(inputBuffer).resize({ width }).toFormat('webp').toBuffer(); + const resizedMetadata = await sharp(resizedBuffer).metadata(); + return { + buffer: resizedBuffer, + width: resizedMetadata.width, + height: resizedMetadata.height, + bytes: Buffer.byteLength(resizedBuffer), + }; +} + +module.exports = { resizeImageBuffer, resizeAndConvert }; diff --git a/api/server/services/Files/images/validate.js b/api/server/services/Files/images/validate.js deleted file mode 100644 index 97ae73cf91a..00000000000 --- a/api/server/services/Files/images/validate.js +++ /dev/null @@ -1,13 +0,0 @@ -const { visionModels } = require('librechat-data-provider'); - -function validateVisionModel(model) { - if (!model) { - return false; - } - - return visionModels.some((visionModel) => model.includes(visionModel)); -} - -module.exports = { - validateVisionModel, -}; diff --git a/api/server/services/Files/process.js b/api/server/services/Files/process.js index 4ee9510b4f1..66a5e454996 100644 --- a/api/server/services/Files/process.js +++ b/api/server/services/Files/process.js @@ -1,5 +1,23 @@ -const { updateFileUsage, createFile } = require('~/models'); +const path = require('path'); +const mime = require('mime'); +const { v4 } = require('uuid'); +const { + isUUID, + megabyte, + FileContext, + FileSources, + imageExtRegex, + EModelEndpoint, + mergeFileConfig, + hostImageIdSuffix, + hostImageNamePrefix, +} = require('librechat-data-provider'); +const { convertToWebP, resizeAndConvert } = require('~/server/services/Files/images'); +const { initializeClient } = require('~/server/services/Endpoints/assistants'); +const { createFile, updateFileUsage, deleteFiles } = require('~/models/File'); +const { LB_QueueAsyncCall } = require('~/server/utils/queue'); const { getStrategyFunctions } = require('./strategies'); +const { determineFileType } = require('~/server/utils'); const { logger } = require('~/config'); const processFiles = async (files) => { @@ -13,6 +31,99 @@ const processFiles = async (files) => { return await Promise.all(promises); }; +/** + * Enqueues the delete operation to the leaky bucket queue if necessary, or adds it directly to promises. + * + * @param {Express.Request} req - The express request object. + * @param {MongoFile} file - The file object to delete. + * @param {Function} deleteFile - The delete file function. + * @param {Promise[]} promises - The array of promises to await. + * @param {OpenAI | undefined} [openai] - If an OpenAI file, the initialized OpenAI client. + */ +function enqueueDeleteOperation(req, file, deleteFile, promises, openai) { + if (file.source === FileSources.openai) { + // Enqueue to leaky bucket + promises.push( + new Promise((resolve, reject) => { + LB_QueueAsyncCall( + () => deleteFile(req, file, openai), + [], + (err, result) => { + if (err) { + logger.error('Error deleting file from OpenAI source', err); + reject(err); + } else { + resolve(result); + } + }, + ); + }), + ); + } else { + // Add directly to promises + promises.push( + deleteFile(req, file).catch((err) => { + logger.error('Error deleting file', err); + return Promise.reject(err); + }), + ); + } +} + +// TODO: refactor as currently only image files can be deleted this way +// as other filetypes will not reside in public path +/** + * Deletes a list of files from the server filesystem and the database. + * + * @param {Object} params - The params object. + * @param {MongoFile[]} params.files - The file objects to delete. + * @param {Express.Request} params.req - The express request object. + * @param {DeleteFilesBody} params.req.body - The request body. + * @param {string} [params.req.body.assistant_id] - The assistant ID if file uploaded is associated to an assistant. + * + * @returns {Promise<void>} + */ +const processDeleteRequest = async ({ req, files }) => { + const file_ids = files.map((file) => file.file_id); + + const deletionMethods = {}; + const promises = []; + promises.push(deleteFiles(file_ids)); + + /** @type {OpenAI | undefined} */ + let openai; + if (req.body.assistant_id) { + ({ openai } = await initializeClient({ req })); + } + + for (const file of files) { + const source = file.source ?? FileSources.local; + + if (source === FileSources.openai && !openai) { + ({ openai } = await initializeClient({ req })); + } + + if (req.body.assistant_id) { + promises.push(openai.beta.assistants.files.del(req.body.assistant_id, file.file_id)); + } + + if (deletionMethods[source]) { + enqueueDeleteOperation(req, file, deletionMethods[source], promises, openai); + continue; + } + + const { deleteFile } = getStrategyFunctions(source); + if (!deleteFile) { + throw new Error(`Delete function not implemented for ${source}`); + } + + deletionMethods[source] = deleteFile; + enqueueDeleteOperation(req, file, deleteFile, promises, openai); + } + + await Promise.allSettled(promises); +}; + /** * Processes a file URL using a specified file handling strategy. This function accepts a strategy name, * fetches the corresponding file processing functions (for saving and retrieving file URLs), and then @@ -21,25 +132,42 @@ const processFiles = async (files) => { * exception with an appropriate message. * * @param {Object} params - The parameters object. - * @param {FileSources} params.fileStrategy - The file handling strategy to use. Must be a value from the - * `FileSources` enum, which defines different file handling - * strategies (like saving to Firebase, local storage, etc.). + * @param {FileSources} params.fileStrategy - The file handling strategy to use. + * Must be a value from the `FileSources` enum, which defines different file + * handling strategies (like saving to Firebase, local storage, etc.). * @param {string} params.userId - The user's unique identifier. Used for creating user-specific paths or - * references in the file handling process. + * references in the file handling process. * @param {string} params.URL - The URL of the file to be processed. - * @param {string} params.fileName - The name that will be used to save the file. This should include the - * file extension. + * @param {string} params.fileName - The name that will be used to save the file (including extension) * @param {string} params.basePath - The base path or directory where the file will be saved or retrieved from. - * - * @returns {Promise<string>} - * A promise that resolves to the URL of the processed file. It throws an error if the file processing - * fails at any stage. + * @param {FileContext} params.context - The context of the file (e.g., 'avatar', 'image_generation', etc.) + * @returns {Promise<MongoFile>} A promise that resolves to the DB representation (MongoFile) + * of the processed file. It throws an error if the file processing fails at any stage. */ -const processFileURL = async ({ fileStrategy, userId, URL, fileName, basePath }) => { +const processFileURL = async ({ fileStrategy, userId, URL, fileName, basePath, context }) => { const { saveURL, getFileURL } = getStrategyFunctions(fileStrategy); try { - await saveURL({ userId, URL, fileName, basePath }); - return await getFileURL({ fileName: `${userId}/${fileName}`, basePath }); + const { + bytes = 0, + type = '', + dimensions = {}, + } = (await saveURL({ userId, URL, fileName, basePath })) || {}; + const filepath = await getFileURL({ fileName: `${userId}/${fileName}`, basePath }); + return await createFile( + { + user: userId, + file_id: v4(), + bytes, + filepath, + filename: fileName, + source: fileStrategy, + type, + context, + width: dimensions.width, + height: dimensions.height, + }, + true, + ); } catch (error) { logger.error(`Error while processing the image with ${fileStrategy}:`, error); throw new Error(`Failed to process the image with ${fileStrategy}. ${error.message}`); @@ -49,7 +177,6 @@ const processFileURL = async ({ fileStrategy, userId, URL, fileName, basePath }) /** * Applies the current strategy for image uploads. * Saves file metadata to the database with an expiry TTL. - * Files must be deleted from the server filesystem manually. * * @param {Object} params - The parameters object. * @param {Express.Request} params.req - The Express request object. @@ -58,11 +185,18 @@ const processFileURL = async ({ fileStrategy, userId, URL, fileName, basePath }) * @param {ImageMetadata} params.metadata - Additional metadata for the file. * @returns {Promise<void>} */ -const processImageUpload = async ({ req, res, file, metadata }) => { +const processImageFile = async ({ req, res, file, metadata }) => { const source = req.app.locals.fileStrategy; const { handleImageUpload } = getStrategyFunctions(source); - const { file_id, temp_file_id } = metadata; - const { filepath, bytes, width, height } = await handleImageUpload(req, file); + const { file_id, temp_file_id, endpoint } = metadata; + + const { filepath, bytes, width, height } = await handleImageUpload({ + req, + file, + file_id, + endpoint, + }); + const result = await createFile( { user: req.user.id, @@ -71,6 +205,7 @@ const processImageUpload = async ({ req, res, file, metadata }) => { bytes, filepath, filename: file.originalname, + context: FileContext.message_attachment, source, type: 'image/webp', width, @@ -81,8 +216,343 @@ const processImageUpload = async ({ req, res, file, metadata }) => { res.status(200).json({ message: 'File uploaded and processed successfully', ...result }); }; +/** + * Applies the current strategy for image uploads and + * returns minimal file metadata, without saving to the database. + * + * @param {Object} params - The parameters object. + * @param {Express.Request} params.req - The Express request object. + * @param {FileContext} params.context - The context of the file (e.g., 'avatar', 'image_generation', etc.) + * @param {boolean} [params.resize=true] - Whether to resize and convert the image to WebP. Default is `true`. + * @param {{ buffer: Buffer, width: number, height: number, bytes: number, filename: string, type: string, file_id: string }} [params.metadata] - Required metadata for the file if resize is false. + * @returns {Promise<{ filepath: string, filename: string, source: string, type: 'image/webp'}>} + */ +const uploadImageBuffer = async ({ req, context, metadata = {}, resize = true }) => { + const source = req.app.locals.fileStrategy; + const { saveBuffer } = getStrategyFunctions(source); + let { buffer, width, height, bytes, filename, file_id, type } = metadata; + if (resize) { + file_id = v4(); + type = 'image/webp'; + ({ buffer, width, height, bytes } = await resizeAndConvert(req.file.buffer)); + filename = path.basename(req.file.originalname, path.extname(req.file.originalname)) + '.webp'; + } + + const filepath = await saveBuffer({ userId: req.user.id, fileName: filename, buffer }); + return await createFile( + { + user: req.user.id, + file_id, + bytes, + filepath, + filename, + context, + source, + type, + width, + height, + }, + true, + ); +}; + +/** + * Applies the current strategy for file uploads. + * Saves file metadata to the database with an expiry TTL. + * Files must be deleted from the server filesystem manually. + * + * @param {Object} params - The parameters object. + * @param {Express.Request} params.req - The Express request object. + * @param {Express.Response} params.res - The Express response object. + * @param {Express.Multer.File} params.file - The uploaded file. + * @param {FileMetadata} params.metadata - Additional metadata for the file. + * @returns {Promise<void>} + */ +const processFileUpload = async ({ req, res, file, metadata }) => { + const isAssistantUpload = metadata.endpoint === EModelEndpoint.assistants; + const source = isAssistantUpload ? FileSources.openai : FileSources.vectordb; + const { handleFileUpload } = getStrategyFunctions(source); + const { file_id, temp_file_id } = metadata; + + /** @type {OpenAI | undefined} */ + let openai; + if (source === FileSources.openai) { + ({ openai } = await initializeClient({ req })); + } + + const { id, bytes, filename, filepath, embedded } = await handleFileUpload({ + req, + file, + file_id, + openai, + }); + + if (isAssistantUpload && !metadata.message_file) { + await openai.beta.assistants.files.create(metadata.assistant_id, { + file_id: id, + }); + } + + const result = await createFile( + { + user: req.user.id, + file_id: id ?? file_id, + temp_file_id, + bytes, + filename: filename ?? file.originalname, + filepath: isAssistantUpload ? `${openai.baseURL}/files/${id}` : filepath, + context: isAssistantUpload ? FileContext.assistants : FileContext.message_attachment, + model: isAssistantUpload ? req.body.model : undefined, + type: file.mimetype, + embedded, + source, + }, + true, + ); + res.status(200).json({ message: 'File uploaded and processed successfully', ...result }); +}; + +/** + * @param {object} params - The params object. + * @param {OpenAI} params.openai - The OpenAI client instance. + * @param {string} params.file_id - The ID of the file to retrieve. + * @param {string} params.userId - The user ID. + * @param {string} [params.filename] - The name of the file. `undefined` for `file_citation` annotations. + * @param {boolean} [params.saveFile=false] - Whether to save the file metadata to the database. + * @param {boolean} [params.updateUsage=false] - Whether to update file usage in database. + */ +const processOpenAIFile = async ({ + openai, + file_id, + userId, + filename, + saveFile = false, + updateUsage = false, +}) => { + const _file = await openai.files.retrieve(file_id); + const originalName = filename ?? (_file.filename ? path.basename(_file.filename) : undefined); + const filepath = `${openai.baseURL}/files/${userId}/${file_id}${ + originalName ? `/${originalName}` : '' + }`; + const type = mime.getType(originalName ?? file_id); + + const file = { + ..._file, + type, + file_id, + filepath, + usage: 1, + user: userId, + context: _file.purpose, + source: FileSources.openai, + model: openai.req.body.model, + filename: originalName ?? file_id, + }; + + if (saveFile) { + await createFile(file, true); + } else if (updateUsage) { + try { + await updateFileUsage({ file_id }); + } catch (error) { + logger.error('Error updating file usage', error); + } + } + + return file; +}; + +/** + * Process OpenAI image files, convert to webp, save and return file metadata. + * @param {object} params - The params object. + * @param {Express.Request} params.req - The Express request object. + * @param {Buffer} params.buffer - The image buffer. + * @param {string} params.file_id - The file ID. + * @param {string} params.filename - The filename. + * @param {string} params.fileExt - The file extension. + * @returns {Promise<MongoFile>} The file metadata. + */ +const processOpenAIImageOutput = async ({ req, buffer, file_id, filename, fileExt }) => { + const currentDate = new Date(); + const formattedDate = currentDate.toISOString(); + const _file = await convertToWebP(req, buffer, 'high', `${file_id}${fileExt}`); + const file = { + ..._file, + usage: 1, + user: req.user.id, + type: 'image/webp', + createdAt: formattedDate, + updatedAt: formattedDate, + source: req.app.locals.fileStrategy, + context: FileContext.assistants_output, + file_id: `${file_id}${hostImageIdSuffix}`, + filename: `${hostImageNamePrefix}${filename}`, + }; + createFile(file, true); + createFile( + { + ...file, + file_id, + filename, + source: FileSources.openai, + type: mime.getType(fileExt), + }, + true, + ); + return file; +}; + +/** + * Retrieves and processes an OpenAI file based on its type. + * + * @param {Object} params - The params passed to the function. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {RunClient} params.client - The LibreChat client instance: either refers to `openai` or `streamRunManager`. + * @param {string} params.file_id - The ID of the file to retrieve. + * @param {string} [params.basename] - The basename of the file (if image); e.g., 'image.jpg'. `undefined` for `file_citation` annotations. + * @param {boolean} [params.unknownType] - Whether the file type is unknown. + * @returns {Promise<{file_id: string, filepath: string, source: string, bytes?: number, width?: number, height?: number} | null>} + * - Returns null if `file_id` is not defined; else, the file metadata if successfully retrieved and processed. + */ +async function retrieveAndProcessFile({ + openai, + client, + file_id, + basename: _basename, + unknownType, +}) { + if (!file_id) { + return null; + } + + let basename = _basename; + const processArgs = { openai, file_id, filename: basename, userId: client.req.user.id }; + + // If no basename provided, return only the file metadata + if (!basename) { + return await processOpenAIFile({ ...processArgs, saveFile: true }); + } + + const fileExt = path.extname(basename); + if (client.attachedFileIds?.has(file_id) || client.processedFileIds?.has(file_id)) { + return processOpenAIFile({ ...processArgs, updateUsage: true }); + } + + /** + * @returns {Promise<Buffer>} The file data buffer. + */ + const getDataBuffer = async () => { + const response = await openai.files.content(file_id); + const arrayBuffer = await response.arrayBuffer(); + return Buffer.from(arrayBuffer); + }; + + let dataBuffer; + if (unknownType || !fileExt || imageExtRegex.test(basename)) { + try { + dataBuffer = await getDataBuffer(); + } catch (error) { + logger.error('Error downloading file from OpenAI:', error); + dataBuffer = null; + } + } + + if (!dataBuffer) { + return await processOpenAIFile({ ...processArgs, saveFile: true }); + } + + // If the filetype is unknown, inspect the file + if (dataBuffer && (unknownType || !fileExt)) { + const detectedExt = await determineFileType(dataBuffer); + const isImageOutput = detectedExt && imageExtRegex.test('.' + detectedExt); + + if (!isImageOutput) { + return await processOpenAIFile({ ...processArgs, saveFile: true }); + } + + return await processOpenAIImageOutput({ + file_id, + req: client.req, + buffer: dataBuffer, + filename: basename, + fileExt: detectedExt, + }); + } else if (dataBuffer && imageExtRegex.test(basename)) { + return await processOpenAIImageOutput({ + file_id, + req: client.req, + buffer: dataBuffer, + filename: basename, + fileExt, + }); + } else { + logger.debug(`[retrieveAndProcessFile] Non-image file type detected: ${basename}`); + return await processOpenAIFile({ ...processArgs, saveFile: true }); + } +} + +/** + * Filters a file based on its size and the endpoint origin. + * + * @param {Object} params - The parameters for the function. + * @param {Express.Request} params.req - The request object from Express. + * @param {Express.Multer.File} params.file - The file uploaded to the server via multer. + * @param {boolean} [params.image] - Whether the file expected is an image. + * @returns {void} + * + * @throws {Error} If a file exception is caught (invalid file size or type, lack of metadata). + */ +function filterFile({ req, file, image }) { + const { endpoint, file_id, width, height } = req.body; + + if (!file_id) { + throw new Error('No file_id provided'); + } + + /* parse to validate api call, throws error on fail */ + isUUID.parse(file_id); + + if (!endpoint) { + throw new Error('No endpoint provided'); + } + + const fileConfig = mergeFileConfig(req.app.locals.fileConfig); + + const { fileSizeLimit, supportedMimeTypes } = + fileConfig.endpoints[endpoint] ?? fileConfig.endpoints.default; + + if (file.size > fileSizeLimit) { + throw new Error( + `File size limit of ${fileSizeLimit / megabyte} MB exceeded for ${endpoint} endpoint`, + ); + } + + const isSupportedMimeType = fileConfig.checkType(file.mimetype, supportedMimeTypes); + + if (!isSupportedMimeType) { + throw new Error('Unsupported file type'); + } + + if (!image) { + return; + } + + if (!width) { + throw new Error('No width provided'); + } + + if (!height) { + throw new Error('No height provided'); + } +} + module.exports = { - processImageUpload, + filterFile, processFiles, processFileURL, + processImageFile, + uploadImageBuffer, + processFileUpload, + processDeleteRequest, + retrieveAndProcessFile, }; diff --git a/api/server/services/Files/strategies.js b/api/server/services/Files/strategies.js index 4e201860434..96733e4037f 100644 --- a/api/server/services/Files/strategies.js +++ b/api/server/services/Files/strategies.js @@ -4,38 +4,103 @@ const { prepareImageURL, saveURLToFirebase, deleteFirebaseFile, + saveBufferToFirebase, uploadImageToFirebase, processFirebaseAvatar, + getFirebaseFileStream, } = require('./Firebase'); const { getLocalFileURL, saveFileFromURL, + saveLocalBuffer, deleteLocalFile, uploadLocalImage, prepareImagesLocal, processLocalAvatar, + getLocalFileStream, } = require('./Local'); +const { uploadOpenAIFile, deleteOpenAIFile, getOpenAIFileStream } = require('./OpenAI'); +const { uploadVectors, deleteVectors } = require('./VectorDB'); -// Firebase Strategy Functions +/** + * Firebase Storage Strategy Functions + * + * */ const firebaseStrategy = () => ({ // saveFile: + /** @type {typeof uploadVectors | null} */ + handleFileUpload: null, saveURL: saveURLToFirebase, getFileURL: getFirebaseURL, deleteFile: deleteFirebaseFile, + saveBuffer: saveBufferToFirebase, prepareImagePayload: prepareImageURL, processAvatar: processFirebaseAvatar, handleImageUpload: uploadImageToFirebase, + getDownloadStream: getFirebaseFileStream, }); -// Local Strategy Functions +/** + * Local Server Storage Strategy Functions + * + * */ const localStrategy = () => ({ - // saveFile: , + /** @type {typeof uploadVectors | null} */ + handleFileUpload: null, saveURL: saveFileFromURL, getFileURL: getLocalFileURL, + saveBuffer: saveLocalBuffer, deleteFile: deleteLocalFile, processAvatar: processLocalAvatar, handleImageUpload: uploadLocalImage, prepareImagePayload: prepareImagesLocal, + getDownloadStream: getLocalFileStream, +}); + +/** + * VectorDB Storage Strategy Functions + * + * */ +const vectorStrategy = () => ({ + /** @type {typeof saveFileFromURL | null} */ + saveURL: null, + /** @type {typeof getLocalFileURL | null} */ + getFileURL: null, + /** @type {typeof saveLocalBuffer | null} */ + saveBuffer: null, + /** @type {typeof processLocalAvatar | null} */ + processAvatar: null, + /** @type {typeof uploadLocalImage | null} */ + handleImageUpload: null, + /** @type {typeof prepareImagesLocal | null} */ + prepareImagePayload: null, + /** @type {typeof getLocalFileStream | null} */ + getDownloadStream: null, + handleFileUpload: uploadVectors, + deleteFile: deleteVectors, +}); + +/** + * OpenAI Strategy Functions + * + * Note: null values mean that the strategy is not supported. + * */ +const openAIStrategy = () => ({ + /** @type {typeof saveFileFromURL | null} */ + saveURL: null, + /** @type {typeof getLocalFileURL | null} */ + getFileURL: null, + /** @type {typeof saveLocalBuffer | null} */ + saveBuffer: null, + /** @type {typeof processLocalAvatar | null} */ + processAvatar: null, + /** @type {typeof uploadLocalImage | null} */ + handleImageUpload: null, + /** @type {typeof prepareImagesLocal | null} */ + prepareImagePayload: null, + deleteFile: deleteOpenAIFile, + handleFileUpload: uploadOpenAIFile, + getDownloadStream: getOpenAIFileStream, }); // Strategy Selector @@ -44,6 +109,10 @@ const getStrategyFunctions = (fileSource) => { return firebaseStrategy(); } else if (fileSource === FileSources.local) { return localStrategy(); + } else if (fileSource === FileSources.openai) { + return openAIStrategy(); + } else if (fileSource === FileSources.vectordb) { + return vectorStrategy(); } else { throw new Error('Invalid file source'); } diff --git a/api/server/services/ModelService.js b/api/server/services/ModelService.js index 76ac061546d..69c71629a4a 100644 --- a/api/server/services/ModelService.js +++ b/api/server/services/ModelService.js @@ -1,76 +1,101 @@ -const Keyv = require('keyv'); const axios = require('axios'); -const HttpsProxyAgent = require('https-proxy-agent'); -const { EModelEndpoint, defaultModels } = require('librechat-data-provider'); -const { isEnabled } = require('~/server/utils'); -const keyvRedis = require('~/cache/keyvRedis'); -const { extractBaseURL } = require('~/utils'); -const { logger } = require('~/config'); - -// const { getAzureCredentials, genAzureChatCompletion } = require('~/utils/'); +const { HttpsProxyAgent } = require('https-proxy-agent'); +const { EModelEndpoint, defaultModels, CacheKeys } = require('librechat-data-provider'); +const { extractBaseURL, inputSchema, processModelData, logAxiosError } = require('~/utils'); +const getLogStores = require('~/cache/getLogStores'); const { openAIApiKey, userProvidedOpenAI } = require('./Config/EndpointService').config; -const modelsCache = isEnabled(process.env.USE_REDIS) - ? new Keyv({ store: keyvRedis }) - : new Keyv({ namespace: 'models' }); - -const { - OPENROUTER_API_KEY, - OPENAI_REVERSE_PROXY, - CHATGPT_MODELS, - ANTHROPIC_MODELS, - GOOGLE_MODELS, - PROXY, -} = process.env ?? {}; - /** * Fetches OpenAI models from the specified base API path or Azure, based on the provided configuration. * * @param {Object} params - The parameters for fetching the models. + * @param {Object} params.user - The user ID to send to the API. * @param {string} params.apiKey - The API key for authentication with the API. * @param {string} params.baseURL - The base path URL for the API. * @param {string} [params.name='OpenAI'] - The name of the API; defaults to 'OpenAI'. * @param {boolean} [params.azure=false] - Whether to fetch models from Azure. + * @param {boolean} [params.userIdQuery=false] - Whether to send the user ID as a query parameter. + * @param {boolean} [params.createTokenConfig=true] - Whether to create a token configuration from the API response. + * @param {string} [params.tokenKey] - The cache key to save the token configuration. Uses `name` if omitted. * @returns {Promise<string[]>} A promise that resolves to an array of model identifiers. * @async */ -const fetchModels = async ({ apiKey, baseURL, name = 'OpenAI', azure = false }) => { +const fetchModels = async ({ + user, + apiKey, + baseURL, + name = 'OpenAI', + azure = false, + userIdQuery = false, + createTokenConfig = true, + tokenKey, +}) => { let models = []; if (!baseURL && !azure) { return models; } + if (!apiKey) { + return models; + } + try { - const payload = { + const options = { headers: { Authorization: `Bearer ${apiKey}`, }, }; - if (PROXY) { - payload.httpsAgent = new HttpsProxyAgent(PROXY); + if (process.env.PROXY) { + options.httpsAgent = new HttpsProxyAgent(process.env.PROXY); } if (process.env.OPENAI_ORGANIZATION && baseURL.includes('openai')) { - payload.headers['OpenAI-Organization'] = process.env.OPENAI_ORGANIZATION; + options.headers['OpenAI-Organization'] = process.env.OPENAI_ORGANIZATION; } - const res = await axios.get(`${baseURL}${azure ? '' : '/models'}`, payload); - models = res.data.data.map((item) => item.id); - } catch (err) { - logger.error(`Failed to fetch models from ${azure ? 'Azure ' : ''}${name} API`, err); + const url = new URL(`${baseURL}${azure ? '' : '/models'}`); + if (user && userIdQuery) { + url.searchParams.append('user', user); + } + const res = await axios.get(url.toString(), options); + + /** @type {z.infer<typeof inputSchema>} */ + const input = res.data; + + const validationResult = inputSchema.safeParse(input); + if (validationResult.success && createTokenConfig) { + const endpointTokenConfig = processModelData(input); + const cache = getLogStores(CacheKeys.TOKEN_CONFIG); + await cache.set(tokenKey ?? name, endpointTokenConfig); + } + models = input.data.map((item) => item.id); + } catch (error) { + const logMessage = `Failed to fetch models from ${azure ? 'Azure ' : ''}${name} API`; + logAxiosError({ message: logMessage, error }); } return models; }; -const fetchOpenAIModels = async (opts = { azure: false, plugins: false }, _models = []) => { +/** + * Fetches models from the specified API path or Azure, based on the provided options. + * @async + * @function + * @param {object} opts - The options for fetching the models. + * @param {string} opts.user - The user ID to send to the API. + * @param {boolean} [opts.azure=false] - Whether to fetch models from Azure. + * @param {boolean} [opts.plugins=false] - Whether to fetch models from the plugins. + * @param {string[]} [_models=[]] - The models to use as a fallback. + */ +const fetchOpenAIModels = async (opts, _models = []) => { let models = _models.slice() ?? []; let apiKey = openAIApiKey; - let baseURL = 'https://api.openai.com/v1'; - let reverseProxyUrl = OPENAI_REVERSE_PROXY; + const openaiBaseURL = 'https://api.openai.com/v1'; + let baseURL = openaiBaseURL; + let reverseProxyUrl = process.env.OPENAI_REVERSE_PROXY; if (opts.azure) { return models; // const azure = getAzureCredentials(); @@ -78,15 +103,17 @@ const fetchOpenAIModels = async (opts = { azure: false, plugins: false }, _model // .split('/deployments')[0] // .concat(`/models?api-version=${azure.azureOpenAIApiVersion}`); // apiKey = azureOpenAIApiKey; - } else if (OPENROUTER_API_KEY) { + } else if (process.env.OPENROUTER_API_KEY) { reverseProxyUrl = 'https://openrouter.ai/api/v1'; - apiKey = OPENROUTER_API_KEY; + apiKey = process.env.OPENROUTER_API_KEY; } if (reverseProxyUrl) { baseURL = extractBaseURL(reverseProxyUrl); } + const modelsCache = getLogStores(CacheKeys.MODEL_QUERIES); + const cachedModels = await modelsCache.get(baseURL); if (cachedModels) { return cachedModels; @@ -97,34 +124,57 @@ const fetchOpenAIModels = async (opts = { azure: false, plugins: false }, _model apiKey, baseURL, azure: opts.azure, + user: opts.user, }); } - if (!reverseProxyUrl) { + if (models.length === 0) { + return _models; + } + + if (baseURL === openaiBaseURL) { const regex = /(text-davinci-003|gpt-)/; models = models.filter((model) => regex.test(model)); + const instructModels = models.filter((model) => model.includes('instruct')); + const otherModels = models.filter((model) => !model.includes('instruct')); + models = otherModels.concat(instructModels); } await modelsCache.set(baseURL, models); return models; }; -const getOpenAIModels = async (opts = { azure: false, plugins: false }) => { - let models = [ - 'gpt-4', - 'gpt-4-0613', - 'gpt-3.5-turbo', - 'gpt-3.5-turbo-16k', - 'gpt-3.5-turbo-0613', - 'gpt-3.5-turbo-0301', - ]; +/** + * Loads the default models for the application. + * @async + * @function + * @param {object} opts - The options for fetching the models. + * @param {string} opts.user - The user ID to send to the API. + * @param {boolean} [opts.azure=false] - Whether to fetch models from Azure. + * @param {boolean} [opts.plugins=false] - Whether to fetch models from the plugins. + */ +const getOpenAIModels = async (opts) => { + let models = defaultModels[EModelEndpoint.openAI]; + + if (opts.assistants) { + models = defaultModels[EModelEndpoint.assistants]; + } - if (!opts.plugins) { - models.push('text-davinci-003'); + if (opts.plugins) { + models = models.filter( + (model) => + !model.includes('text-davinci') && + !model.includes('instruct') && + !model.includes('0613') && + !model.includes('0314') && + !model.includes('0301'), + ); } let key; - if (opts.azure) { + if (opts.assistants) { + key = 'ASSISTANTS_MODELS'; + } else if (opts.azure) { key = 'AZURE_OPENAI_MODELS'; } else if (opts.plugins) { key = 'PLUGIN_MODELS'; @@ -137,7 +187,11 @@ const getOpenAIModels = async (opts = { azure: false, plugins: false }) => { return models; } - if (userProvidedOpenAI && !OPENROUTER_API_KEY) { + if (userProvidedOpenAI && !process.env.OPENROUTER_API_KEY) { + return models; + } + + if (opts.assistants) { return models; } @@ -146,8 +200,8 @@ const getOpenAIModels = async (opts = { azure: false, plugins: false }) => { const getChatGPTBrowserModels = () => { let models = ['text-davinci-002-render-sha', 'gpt-4']; - if (CHATGPT_MODELS) { - models = String(CHATGPT_MODELS).split(','); + if (process.env.CHATGPT_MODELS) { + models = String(process.env.CHATGPT_MODELS).split(','); } return models; @@ -155,8 +209,8 @@ const getChatGPTBrowserModels = () => { const getAnthropicModels = () => { let models = defaultModels[EModelEndpoint.anthropic]; - if (ANTHROPIC_MODELS) { - models = String(ANTHROPIC_MODELS).split(','); + if (process.env.ANTHROPIC_MODELS) { + models = String(process.env.ANTHROPIC_MODELS).split(','); } return models; @@ -164,8 +218,8 @@ const getAnthropicModels = () => { const getGoogleModels = () => { let models = defaultModels[EModelEndpoint.google]; - if (GOOGLE_MODELS) { - models = String(GOOGLE_MODELS).split(','); + if (process.env.GOOGLE_MODELS) { + models = String(process.env.GOOGLE_MODELS).split(','); } return models; diff --git a/api/server/services/ModelService.spec.js b/api/server/services/ModelService.spec.js new file mode 100644 index 00000000000..7c1d326fa1a --- /dev/null +++ b/api/server/services/ModelService.spec.js @@ -0,0 +1,258 @@ +const axios = require('axios'); + +const { fetchModels, getOpenAIModels } = require('./ModelService'); +jest.mock('~/utils', () => { + const originalUtils = jest.requireActual('~/utils'); + return { + ...originalUtils, + processModelData: jest.fn((...args) => { + return originalUtils.processModelData(...args); + }), + }; +}); + +jest.mock('axios'); +jest.mock('~/cache/getLogStores', () => + jest.fn().mockImplementation(() => ({ + get: jest.fn().mockResolvedValue(undefined), + set: jest.fn().mockResolvedValue(true), + })), +); +jest.mock('~/config', () => ({ + logger: { + error: jest.fn(), + }, +})); +jest.mock('./Config/EndpointService', () => ({ + config: { + openAIApiKey: 'mockedApiKey', + userProvidedOpenAI: false, + }, +})); + +axios.get.mockResolvedValue({ + data: { + data: [{ id: 'model-1' }, { id: 'model-2' }], + }, +}); + +describe('fetchModels', () => { + it('fetches models successfully from the API', async () => { + const models = await fetchModels({ + user: 'user123', + apiKey: 'testApiKey', + baseURL: 'https://api.test.com', + name: 'TestAPI', + }); + + expect(models).toEqual(['model-1', 'model-2']); + expect(axios.get).toHaveBeenCalledWith( + expect.stringContaining('https://api.test.com/models'), + expect.any(Object), + ); + }); + + it('adds the user ID to the models query when option and ID are passed', async () => { + const models = await fetchModels({ + user: 'user123', + apiKey: 'testApiKey', + baseURL: 'https://api.test.com', + userIdQuery: true, + name: 'TestAPI', + }); + + expect(models).toEqual(['model-1', 'model-2']); + expect(axios.get).toHaveBeenCalledWith( + expect.stringContaining('https://api.test.com/models?user=user123'), + expect.any(Object), + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); +}); + +describe('fetchModels with createTokenConfig true', () => { + const data = { + data: [ + { + id: 'model-1', + pricing: { + prompt: '0.002', + completion: '0.001', + }, + context_length: 1024, + }, + { + id: 'model-2', + pricing: { + prompt: '0.003', + completion: '0.0015', + }, + context_length: 2048, + }, + ], + }; + + beforeEach(() => { + // Clears the mock's history before each test + const _utils = require('~/utils'); + axios.get.mockResolvedValue({ data }); + }); + + it('creates and stores token configuration if createTokenConfig is true', async () => { + await fetchModels({ + user: 'user123', + apiKey: 'testApiKey', + baseURL: 'https://api.test.com', + createTokenConfig: true, + }); + + const { processModelData } = require('~/utils'); + expect(processModelData).toHaveBeenCalled(); + expect(processModelData).toHaveBeenCalledWith(data); + }); +}); + +describe('getOpenAIModels', () => { + let originalEnv; + + beforeEach(() => { + originalEnv = { ...process.env }; + axios.get.mockRejectedValue(new Error('Network error')); + }); + + afterEach(() => { + process.env = originalEnv; + axios.get.mockReset(); + }); + + it('returns default models when no environment configurations are provided (and fetch fails)', async () => { + const models = await getOpenAIModels({ user: 'user456' }); + expect(models).toContain('gpt-4'); + }); + + it('returns `AZURE_OPENAI_MODELS` with `azure` flag (and fetch fails)', async () => { + process.env.AZURE_OPENAI_MODELS = 'azure-model,azure-model-2'; + const models = await getOpenAIModels({ azure: true }); + expect(models).toEqual(expect.arrayContaining(['azure-model', 'azure-model-2'])); + }); + + it('returns `PLUGIN_MODELS` with `plugins` flag (and fetch fails)', async () => { + process.env.PLUGIN_MODELS = 'plugins-model,plugins-model-2'; + const models = await getOpenAIModels({ plugins: true }); + expect(models).toEqual(expect.arrayContaining(['plugins-model', 'plugins-model-2'])); + }); + + it('returns `OPENAI_MODELS` with no flags (and fetch fails)', async () => { + process.env.OPENAI_MODELS = 'openai-model,openai-model-2'; + const models = await getOpenAIModels({}); + expect(models).toEqual(expect.arrayContaining(['openai-model', 'openai-model-2'])); + }); + + it('attempts to use OPENROUTER_API_KEY if set', async () => { + process.env.OPENROUTER_API_KEY = 'test-router-key'; + const expectedModels = ['model-router-1', 'model-router-2']; + + axios.get.mockResolvedValue({ + data: { + data: expectedModels.map((id) => ({ id })), + }, + }); + + const models = await getOpenAIModels({ user: 'user456' }); + + expect(models).toEqual(expect.arrayContaining(expectedModels)); + expect(axios.get).toHaveBeenCalled(); + }); + + it('utilizes proxy configuration when PROXY is set', async () => { + axios.get.mockResolvedValue({ + data: { + data: [], + }, + }); + process.env.PROXY = 'http://localhost:8888'; + await getOpenAIModels({ user: 'user456' }); + + expect(axios.get).toHaveBeenCalledWith( + expect.any(String), + expect.objectContaining({ + httpsAgent: expect.anything(), + }), + ); + }); +}); + +describe('getOpenAIModels with mocked config', () => { + it('uses alternative behavior when userProvidedOpenAI is true', async () => { + jest.mock('./Config/EndpointService', () => ({ + config: { + openAIApiKey: 'mockedApiKey', + userProvidedOpenAI: true, + }, + })); + jest.mock('librechat-data-provider', () => { + const original = jest.requireActual('librechat-data-provider'); + return { + ...original, + defaultModels: { + [original.EModelEndpoint.openAI]: ['some-default-model'], + }, + }; + }); + + jest.resetModules(); + const { getOpenAIModels } = require('./ModelService'); + + const models = await getOpenAIModels({ user: 'user456' }); + expect(models).toContain('some-default-model'); + }); +}); + +describe('getOpenAIModels sorting behavior', () => { + beforeEach(() => { + axios.get.mockResolvedValue({ + data: { + data: [ + { id: 'gpt-3.5-turbo-instruct-0914' }, + { id: 'gpt-3.5-turbo-instruct' }, + { id: 'gpt-3.5-turbo' }, + { id: 'gpt-4-0314' }, + { id: 'gpt-4-turbo-preview' }, + ], + }, + }); + }); + + it('ensures instruct models are listed last', async () => { + const models = await getOpenAIModels({ user: 'user456' }); + + // Check if the last model is an "instruct" model + expect(models[models.length - 1]).toMatch(/instruct/); + + // Check if the "instruct" models are placed at the end + const instructIndexes = models + .map((model, index) => (model.includes('instruct') ? index : -1)) + .filter((index) => index !== -1); + const nonInstructIndexes = models + .map((model, index) => (!model.includes('instruct') ? index : -1)) + .filter((index) => index !== -1); + + expect(Math.max(...nonInstructIndexes)).toBeLessThan(Math.min(...instructIndexes)); + + const expectedOrder = [ + 'gpt-3.5-turbo', + 'gpt-4-0314', + 'gpt-4-turbo-preview', + 'gpt-3.5-turbo-instruct-0914', + 'gpt-3.5-turbo-instruct', + ]; + expect(models).toEqual(expectedOrder); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); +}); diff --git a/api/server/services/PluginService.js b/api/server/services/PluginService.js index 61582382914..efe0bb03fd8 100644 --- a/api/server/services/PluginService.js +++ b/api/server/services/PluginService.js @@ -90,8 +90,7 @@ const updateUserPluginAuth = async (userId, authField, pluginKey, value) => { const deleteUserPluginAuth = async (userId, authField) => { try { - const response = await PluginAuth.deleteOne({ userId, authField }); - return response; + return await PluginAuth.deleteOne({ userId, authField }); } catch (err) { logger.error('[deleteUserPluginAuth]', err); return err; diff --git a/api/server/services/Runs/RunMananger.js b/api/server/services/Runs/RunManager.js similarity index 59% rename from api/server/services/Runs/RunMananger.js rename to api/server/services/Runs/RunManager.js index 67a3624c187..c8deeb9264b 100644 --- a/api/server/services/Runs/RunMananger.js +++ b/api/server/services/Runs/RunManager.js @@ -1,3 +1,4 @@ +const { ToolCallTypes } = require('librechat-data-provider'); const { logger } = require('~/config'); /** @@ -18,6 +19,53 @@ const { logger } = require('~/config'); * @property {Function} handleStep - Handles a run step based on its status. */ +/** + * Generates a signature string for a given tool call object. This signature includes + * the tool call's id, type, and other distinguishing features based on its type. + * + * @param {ToolCall} toolCall The tool call object for which to generate a signature. + * @returns {string} The generated signature for the tool call. + */ +function getToolCallSignature(toolCall) { + if (toolCall.type === ToolCallTypes.CODE_INTERPRETER) { + const inputLength = toolCall.code_interpreter?.input?.length ?? 0; + const outputsLength = toolCall.code_interpreter?.outputs?.length ?? 0; + return `${toolCall.id}-${toolCall.type}-${inputLength}-${outputsLength}`; + } + if (toolCall.type === ToolCallTypes.RETRIEVAL) { + return `${toolCall.id}-${toolCall.type}`; + } + if (toolCall.type === ToolCallTypes.FUNCTION) { + const argsLength = toolCall.function?.arguments?.length ?? 0; + const hasOutput = toolCall.function?.output ? 1 : 0; + return `${toolCall.id}-${toolCall.type}-${argsLength}-${hasOutput}`; + } + + return `${toolCall.id}-unknown-type`; +} + +/** + * Generates a signature based on the specifics of the step details. + * This function supports 'message_creation' and 'tool_calls' types, and returns a default signature + * for any other type or in case the details are undefined. + * + * @param {MessageCreationStepDetails | ToolCallsStepDetails | undefined} details - The detailed content of the step, which can be undefined. + * @returns {string} A signature string derived from the content of step details. + */ +function getDetailsSignature(details) { + if (!details) { + return 'undefined-details'; + } + + if (details.type === 'message_creation') { + return `${details.type}-${details.message_creation.message_id}`; + } else if (details.type === 'tool_calls') { + const toolCallsSignature = details.tool_calls.map(getToolCallSignature).join('|'); + return `${details.type}-${toolCallsSignature}`; + } + return 'unknown-type'; +} + /** * Manages the retrieval and processing of run steps based on run status. */ @@ -44,15 +92,25 @@ class RunManager { */ async fetchRunSteps({ openai, thread_id, run_id, runStatus, final = false }) { // const { data: steps, first_id, last_id, has_more } = await openai.beta.threads.runs.steps.list(thread_id, run_id); - const { data: _steps } = await openai.beta.threads.runs.steps.list(thread_id, run_id); + const { data: _steps } = await openai.beta.threads.runs.steps.list( + thread_id, + run_id, + {}, + { + timeout: 3000, + maxRetries: 5, + }, + ); const steps = _steps.sort((a, b) => a.created_at - b.created_at); for (const [i, step] of steps.entries()) { - if (this.seenSteps.has(step.id)) { + const detailsSignature = getDetailsSignature(step.step_details); + const stepKey = `${step.id}-${step.status}-${detailsSignature}`; + if (!final && this.seenSteps.has(stepKey)) { continue; } const isLast = i === steps.length - 1; - this.seenSteps.add(step.id); + this.seenSteps.add(stepKey); this.stepsByStatus[runStatus] = this.stepsByStatus[runStatus] || []; const currentStepPromise = (async () => { @@ -64,6 +122,13 @@ class RunManager { return await currentStepPromise; } + if (step.type === 'tool_calls') { + await currentStepPromise; + } + if (step.type === 'message_creation' && step.status === 'completed') { + await currentStepPromise; + } + this.lastStepPromiseByStatus[runStatus] = currentStepPromise; this.stepsByStatus[runStatus].push(currentStepPromise); } @@ -79,7 +144,7 @@ class RunManager { */ async handleStep({ step, runStatus, final, isLast }) { if (this.handlers[runStatus]) { - return this.handlers[runStatus]({ step, final, isLast }); + return await this.handlers[runStatus]({ step, final, isLast }); } if (final && isLast && this.handlers['final']) { diff --git a/api/server/services/Runs/StreamRunManager.js b/api/server/services/Runs/StreamRunManager.js new file mode 100644 index 00000000000..ce78b593188 --- /dev/null +++ b/api/server/services/Runs/StreamRunManager.js @@ -0,0 +1,619 @@ +const { + StepTypes, + ContentTypes, + ToolCallTypes, + // StepStatus, + MessageContentTypes, + AssistantStreamEvents, +} = require('librechat-data-provider'); +const { retrieveAndProcessFile } = require('~/server/services/Files/process'); +const { processRequiredActions } = require('~/server/services/ToolService'); +const { createOnProgress, sendMessage } = require('~/server/utils'); +const { processMessages } = require('~/server/services/Threads'); +const { logger } = require('~/config'); + +/** + * Implements the StreamRunManager functionality for managing the streaming + * and processing of run steps, messages, and tool calls within a thread. + * @implements {StreamRunManager} + */ +class StreamRunManager { + constructor(fields) { + this.index = 0; + /** @type {Map<string, RunStep>} */ + this.steps = new Map(); + + /** @type {Map<string, number} */ + this.mappedOrder = new Map(); + /** @type {Map<string, StepToolCall} */ + this.orderedRunSteps = new Map(); + /** @type {Set<string>} */ + this.processedFileIds = new Set(); + /** @type {Map<string, (delta: ToolCallDelta | string) => Promise<void>} */ + this.progressCallbacks = new Map(); + /** @type {Run | null} */ + this.run = null; + + /** @type {Express.Request} */ + this.req = fields.req; + /** @type {Express.Response} */ + this.res = fields.res; + /** @type {OpenAI} */ + this.openai = fields.openai; + /** @type {string} */ + this.apiKey = this.openai.apiKey; + /** @type {string} */ + this.thread_id = fields.thread_id; + /** @type {RunCreateAndStreamParams} */ + this.initialRunBody = fields.runBody; + /** + * @type {Object.<AssistantStreamEvents, (event: AssistantStreamEvent) => Promise<void>>} + */ + this.clientHandlers = fields.handlers ?? {}; + /** @type {OpenAIRequestOptions} */ + this.streamOptions = fields.streamOptions ?? {}; + /** @type {Partial<TMessage>} */ + this.finalMessage = fields.responseMessage ?? {}; + /** @type {ThreadMessage[]} */ + this.messages = []; + /** @type {string} */ + this.text = ''; + /** @type {Set<string>} */ + this.attachedFileIds = fields.attachedFileIds; + /** @type {undefined | Promise<ChatCompletion>} */ + this.visionPromise = fields.visionPromise; + + /** + * @type {Object.<AssistantStreamEvents, (event: AssistantStreamEvent) => Promise<void>>} + */ + this.handlers = { + [AssistantStreamEvents.ThreadCreated]: this.handleThreadCreated, + [AssistantStreamEvents.ThreadRunCreated]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunQueued]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunInProgress]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunRequiresAction]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunCompleted]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunFailed]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunCancelling]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunCancelled]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunExpired]: this.handleRunEvent, + [AssistantStreamEvents.ThreadRunStepCreated]: this.handleRunStepEvent, + [AssistantStreamEvents.ThreadRunStepInProgress]: this.handleRunStepEvent, + [AssistantStreamEvents.ThreadRunStepCompleted]: this.handleRunStepEvent, + [AssistantStreamEvents.ThreadRunStepFailed]: this.handleRunStepEvent, + [AssistantStreamEvents.ThreadRunStepCancelled]: this.handleRunStepEvent, + [AssistantStreamEvents.ThreadRunStepExpired]: this.handleRunStepEvent, + [AssistantStreamEvents.ThreadRunStepDelta]: this.handleRunStepDeltaEvent, + [AssistantStreamEvents.ThreadMessageCreated]: this.handleMessageEvent, + [AssistantStreamEvents.ThreadMessageInProgress]: this.handleMessageEvent, + [AssistantStreamEvents.ThreadMessageCompleted]: this.handleMessageEvent, + [AssistantStreamEvents.ThreadMessageIncomplete]: this.handleMessageEvent, + [AssistantStreamEvents.ThreadMessageDelta]: this.handleMessageDeltaEvent, + [AssistantStreamEvents.ErrorEvent]: this.handleErrorEvent, + }; + } + + /** + * + * Sends the content data to the client via SSE. + * + * @param {StreamContentData} data + * @returns {Promise<void>} + */ + async addContentData(data) { + const { type, index, edited } = data; + /** @type {ContentPart} */ + const contentPart = data[type]; + this.finalMessage.content[index] = { type, [type]: contentPart }; + + if (type === ContentTypes.TEXT && !edited) { + this.text += contentPart.value; + return; + } + + const contentData = { + index, + type, + [type]: contentPart, + thread_id: this.thread_id, + messageId: this.finalMessage.messageId, + conversationId: this.finalMessage.conversationId, + }; + + sendMessage(this.res, contentData); + } + + /* <------------------ Main Event Handlers ------------------> */ + + /** + * Run the assistant and handle the events. + * @param {Object} params - + * The parameters for running the assistant. + * @param {string} params.thread_id - The thread id. + * @param {RunCreateAndStreamParams} params.body - The body of the run. + * @returns {Promise<void>} + */ + async runAssistant({ thread_id, body }) { + const streamRun = this.openai.beta.threads.runs.createAndStream( + thread_id, + body, + this.streamOptions, + ); + for await (const event of streamRun) { + await this.handleEvent(event); + } + } + + /** + * Handle the event. + * @param {AssistantStreamEvent} event - The stream event object. + * @returns {Promise<void>} + */ + async handleEvent(event) { + const handler = this.handlers[event.event]; + const clientHandler = this.clientHandlers[event.event]; + + if (clientHandler) { + await clientHandler.call(this, event); + } + + if (handler) { + await handler.call(this, event); + } else { + logger.warn(`Unhandled event type: ${event.event}`); + } + } + + /** + * Handle thread.created event + * @param {ThreadCreated} event - + * The thread.created event object. + */ + async handleThreadCreated(event) { + logger.debug('Thread created:', event.data); + } + + /** + * Handle Run Events + * @param {ThreadRunCreated | ThreadRunQueued | ThreadRunInProgress | ThreadRunRequiresAction | ThreadRunCompleted | ThreadRunFailed | ThreadRunCancelling | ThreadRunCancelled | ThreadRunExpired} event - + * The run event object. + */ + async handleRunEvent(event) { + this.run = event.data; + logger.debug('Run event:', this.run); + if (event.event === AssistantStreamEvents.ThreadRunRequiresAction) { + await this.onRunRequiresAction(event); + } else if (event.event === AssistantStreamEvents.ThreadRunCompleted) { + logger.debug('Run completed:', this.run); + } + } + + /** + * Handle Run Step Events + * @param {ThreadRunStepCreated | ThreadRunStepInProgress | ThreadRunStepCompleted | ThreadRunStepFailed | ThreadRunStepCancelled | ThreadRunStepExpired} event - + * The run step event object. + */ + async handleRunStepEvent(event) { + logger.debug('Run step event:', event.data); + + const step = event.data; + this.steps.set(step.id, step); + + if (event.event === AssistantStreamEvents.ThreadRunStepCreated) { + this.onRunStepCreated(event); + } else if (event.event === AssistantStreamEvents.ThreadRunStepCompleted) { + this.onRunStepCompleted(event); + } + } + + /* <------------------ Delta Events ------------------> */ + + /** @param {CodeImageOutput} */ + async handleCodeImageOutput(output) { + if (this.processedFileIds.has(output.image?.file_id)) { + return; + } + + const { file_id } = output.image; + const file = await retrieveAndProcessFile({ + openai: this.openai, + client: this, + file_id, + basename: `${file_id}.png`, + }); + + const prelimImage = file; + + // check if every key has a value before adding to content + const prelimImageKeys = Object.keys(prelimImage); + const validImageFile = prelimImageKeys.every((key) => prelimImage[key]); + + if (!validImageFile) { + return; + } + + const index = this.getStepIndex(file_id); + const image_file = { + [ContentTypes.IMAGE_FILE]: prelimImage, + type: ContentTypes.IMAGE_FILE, + index, + }; + this.addContentData(image_file); + this.processedFileIds.add(file_id); + } + + /** + * Create Tool Call Stream + * @param {number} index - The index of the tool call. + * @param {StepToolCall} toolCall - + * The current tool call object. + */ + createToolCallStream(index, toolCall) { + /** @type {StepToolCall} */ + const state = toolCall; + const type = state.type; + const data = state[type]; + + /** @param {ToolCallDelta} */ + const deltaHandler = async (delta) => { + for (const key in delta) { + if (!Object.prototype.hasOwnProperty.call(data, key)) { + logger.warn(`Unhandled tool call key "${key}", delta: `, delta); + continue; + } + + if (Array.isArray(delta[key])) { + if (!Array.isArray(data[key])) { + data[key] = []; + } + + for (const d of delta[key]) { + if (typeof d === 'object' && !Object.prototype.hasOwnProperty.call(d, 'index')) { + logger.warn('Expected an object with an \'index\' for array updates but got:', d); + continue; + } + + const imageOutput = type === ToolCallTypes.CODE_INTERPRETER && d?.type === 'image'; + + if (imageOutput) { + await this.handleCodeImageOutput(d); + continue; + } + + const { index, ...updateData } = d; + // Ensure the data at index is an object or undefined before assigning + if (typeof data[key][index] !== 'object' || data[key][index] === null) { + data[key][index] = {}; + } + // Merge the updateData into data[key][index] + for (const updateKey in updateData) { + data[key][index][updateKey] = updateData[updateKey]; + } + } + } else if (typeof delta[key] === 'string' && typeof data[key] === 'string') { + // Concatenate strings + data[key] += delta[key]; + } else if ( + typeof delta[key] === 'object' && + delta[key] !== null && + !Array.isArray(delta[key]) + ) { + // Merge objects + data[key] = { ...data[key], ...delta[key] }; + } else { + // Directly set the value for other types + data[key] = delta[key]; + } + + state[type] = data; + + this.addContentData({ + [ContentTypes.TOOL_CALL]: toolCall, + type: ContentTypes.TOOL_CALL, + index, + }); + } + }; + + return deltaHandler; + } + + /** + * @param {string} stepId - + * @param {StepToolCall} toolCall - + * + */ + handleNewToolCall(stepId, toolCall) { + const stepKey = this.generateToolCallKey(stepId, toolCall); + const index = this.getStepIndex(stepKey); + this.getStepIndex(toolCall.id, index); + toolCall.progress = 0.01; + this.orderedRunSteps.set(index, toolCall); + const progressCallback = this.createToolCallStream(index, toolCall); + this.progressCallbacks.set(stepKey, progressCallback); + + this.addContentData({ + [ContentTypes.TOOL_CALL]: toolCall, + type: ContentTypes.TOOL_CALL, + index, + }); + } + + /** + * Handle Completed Tool Call + * @param {string} stepId - The id of the step the tool_call is part of. + * @param {StepToolCall} toolCall - The tool call object. + * + */ + handleCompletedToolCall(stepId, toolCall) { + if (toolCall.type === ToolCallTypes.FUNCTION) { + return; + } + + const stepKey = this.generateToolCallKey(stepId, toolCall); + const index = this.getStepIndex(stepKey); + toolCall.progress = 1; + this.orderedRunSteps.set(index, toolCall); + this.addContentData({ + [ContentTypes.TOOL_CALL]: toolCall, + type: ContentTypes.TOOL_CALL, + index, + }); + } + + /** + * Handle Run Step Delta Event + * @param {ThreadRunStepDelta} event - + * The run step delta event object. + */ + async handleRunStepDeltaEvent(event) { + const { delta, id: stepId } = event.data; + + if (!delta.step_details) { + logger.warn('Undefined or unhandled run step delta:', delta); + return; + } + + /** @type {{ tool_calls: Array<ToolCallDeltaObject> }} */ + const { tool_calls } = delta.step_details; + + if (!tool_calls) { + logger.warn('Unhandled run step details', delta.step_details); + return; + } + + for (const toolCall of tool_calls) { + const stepKey = this.generateToolCallKey(stepId, toolCall); + + if (!this.mappedOrder.has(stepKey)) { + this.handleNewToolCall(stepId, toolCall); + continue; + } + + const toolCallDelta = toolCall[toolCall.type]; + const progressCallback = this.progressCallbacks.get(stepKey); + await progressCallback(toolCallDelta); + } + } + + /** + * Handle Message Delta Event + * @param {ThreadMessageDelta} event - + * The Message Delta event object. + */ + async handleMessageDeltaEvent(event) { + const message = event.data; + const onProgress = this.progressCallbacks.get(message.id); + const content = message.delta.content?.[0]; + + if (content && content.type === MessageContentTypes.TEXT) { + onProgress(content.text.value); + } + } + + /** + * Handle Error Event + * @param {ErrorEvent} event - + * The Error event object. + */ + async handleErrorEvent(event) { + logger.error('Error event:', event.data); + } + + /* <------------------ Misc. Helpers ------------------> */ + + /** + * Gets the step index for a given step key, creating a new index if it doesn't exist. + * @param {string} stepKey - + * The access key for the step. Either a message.id, tool_call key, or file_id. + * @param {number | undefined} [overrideIndex] - An override index to use an alternative stepKey. + * This is necessary due to the toolCall Id being unavailable in delta stream events. + * @returns {number | undefined} index - The index of the step; `undefined` if invalid key or using overrideIndex. + */ + getStepIndex(stepKey, overrideIndex) { + if (!stepKey) { + return; + } + + if (!isNaN(overrideIndex)) { + this.mappedOrder.set(stepKey, overrideIndex); + return; + } + + let index = this.mappedOrder.get(stepKey); + + if (index === undefined) { + index = this.index; + this.mappedOrder.set(stepKey, this.index); + this.index++; + } + + return index; + } + + /** + * Generate Tool Call Key + * @param {string} stepId - The id of the step the tool_call is part of. + * @param {StepToolCall} toolCall - The tool call object. + * @returns {string} key - The generated key for the tool call. + */ + generateToolCallKey(stepId, toolCall) { + return `${stepId}_tool_call_${toolCall.index}_${toolCall.type}`; + } + + /* <------------------ Run Event handlers ------------------> */ + + /** + * Handle Run Events Requiring Action + * @param {ThreadRunRequiresAction} event - + * The run event object requiring action. + */ + async onRunRequiresAction(event) { + const run = event.data; + const { submit_tool_outputs } = run.required_action; + const actions = submit_tool_outputs.tool_calls.map((item) => { + const functionCall = item.function; + const args = JSON.parse(functionCall.arguments); + return { + tool: functionCall.name, + toolInput: args, + toolCallId: item.id, + run_id: run.id, + thread_id: this.thread_id, + }; + }); + + const { tool_outputs } = await processRequiredActions(this, actions); + /** @type {AssistantStream | undefined} */ + let toolRun; + try { + toolRun = this.openai.beta.threads.runs.submitToolOutputsStream( + run.thread_id, + run.id, + { + tool_outputs, + stream: true, + }, + this.streamOptions, + ); + } catch (error) { + logger.error('Error submitting tool outputs:', error); + throw error; + } + + for await (const event of toolRun) { + await this.handleEvent(event); + } + } + + /* <------------------ RunStep Event handlers ------------------> */ + + /** + * Handle Run Step Created Events + * @param {ThreadRunStepCreated} event - + * The created run step event object. + */ + async onRunStepCreated(event) { + const step = event.data; + const isMessage = step.type === StepTypes.MESSAGE_CREATION; + + if (isMessage) { + /** @type {MessageCreationStepDetails} */ + const { message_creation } = step.step_details; + const stepKey = message_creation.message_id; + const index = this.getStepIndex(stepKey); + this.orderedRunSteps.set(index, message_creation); + // Create the Factory Function to stream the message + const { onProgress: progressCallback } = createOnProgress({ + // todo: add option to save partialText to db + // onProgress: () => {}, + }); + + // This creates a function that attaches all of the parameters + // specified here to each SSE message generated by the TextStream + const onProgress = progressCallback({ + index, + res: this.res, + messageId: this.finalMessage.messageId, + conversationId: this.finalMessage.conversationId, + thread_id: this.thread_id, + type: ContentTypes.TEXT, + }); + + this.progressCallbacks.set(stepKey, onProgress); + this.orderedRunSteps.set(index, step); + return; + } + + if (step.type !== StepTypes.TOOL_CALLS) { + logger.warn('Unhandled step creation type:', step.type); + return; + } + + /** @type {{ tool_calls: StepToolCall[] }} */ + const { tool_calls } = step.step_details; + for (const toolCall of tool_calls) { + this.handleNewToolCall(step.id, toolCall); + } + } + + /** + * Handle Run Step Completed Events + * @param {ThreadRunStepCompleted} event - + * The completed run step event object. + */ + async onRunStepCompleted(event) { + const step = event.data; + const isMessage = step.type === StepTypes.MESSAGE_CREATION; + + if (isMessage) { + logger.debug('RunStep Message completion: to be handled by Message Event.', step); + return; + } + + /** @type {{ tool_calls: StepToolCall[] }} */ + const { tool_calls } = step.step_details; + for (let i = 0; i < tool_calls.length; i++) { + const toolCall = tool_calls[i]; + toolCall.index = i; + this.handleCompletedToolCall(step.id, toolCall); + } + } + + /* <------------------ Message Event handlers ------------------> */ + + /** + * Handle Message Event + * @param {ThreadMessageCreated | ThreadMessageInProgress | ThreadMessageCompleted | ThreadMessageIncomplete} event - + * The Message event object. + */ + async handleMessageEvent(event) { + if (event.event === AssistantStreamEvents.ThreadMessageCompleted) { + await this.messageCompleted(event); + } + } + + /** + * Handle Message Completed Events + * @param {ThreadMessageCompleted} event - + * The Completed Message event object. + */ + async messageCompleted(event) { + const message = event.data; + const result = await processMessages({ + openai: this.openai, + client: this, + messages: [message], + }); + const index = this.mappedOrder.get(message.id); + this.addContentData({ + [ContentTypes.TEXT]: { value: result.text }, + type: ContentTypes.TEXT, + edited: result.edited, + index, + }); + this.messages.push(message); + } +} + +module.exports = StreamRunManager; diff --git a/api/server/services/Runs/handle.js b/api/server/services/Runs/handle.js new file mode 100644 index 00000000000..8b73b099eec --- /dev/null +++ b/api/server/services/Runs/handle.js @@ -0,0 +1,264 @@ +const { RunStatus, defaultOrderQuery, CacheKeys } = require('librechat-data-provider'); +const getLogStores = require('~/cache/getLogStores'); +const { retrieveRun } = require('./methods'); +const { sleep } = require('~/server/utils'); +const RunManager = require('./RunManager'); +const { logger } = require('~/config'); + +async function withTimeout(promise, timeoutMs, timeoutMessage) { + let timeoutHandle; + + const timeoutPromise = new Promise((_, reject) => { + timeoutHandle = setTimeout(() => { + logger.debug(timeoutMessage); + reject(new Error('Operation timed out')); + }, timeoutMs); + }); + + try { + return await Promise.race([promise, timeoutPromise]); + } finally { + clearTimeout(timeoutHandle); + } +} + +/** + * Creates a run on a thread using the OpenAI API. + * + * @param {Object} params - The parameters for creating a run. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {string} params.thread_id - The ID of the thread to run. + * @param {Object} params.body - The body of the request to create a run. + * @param {string} params.body.assistant_id - The ID of the assistant to use for this run. + * @param {string} [params.body.model] - Optional. The ID of the model to be used for this run. + * @param {string} [params.body.instructions] - Optional. Override the default system message of the assistant. + * @param {string} [params.body.additional_instructions] - Optional. Appends additional instructions + * at theend of the instructions for the run. This is useful for modifying + * the behavior on a per-run basis without overriding other instructions. + * @param {Object[]} [params.body.tools] - Optional. Override the tools the assistant can use for this run. + * @param {string[]} [params.body.file_ids] - Optional. + * List of File IDs the assistant can use for this run. + * + * **Note:** The API seems to prefer files added to messages, not runs. + * @param {Object} [params.body.metadata] - Optional. Metadata for the run. + * @return {Promise<Run>} A promise that resolves to the created run object. + */ +async function createRun({ openai, thread_id, body }) { + return await openai.beta.threads.runs.create(thread_id, body); +} + +/** + * Waits for a run to complete by repeatedly checking its status. It uses a RunManager instance to fetch and manage run steps based on the run status. + * + * @param {Object} params - The parameters for the waitForRun function. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {string} params.run_id - The ID of the run to wait for. + * @param {string} params.thread_id - The ID of the thread associated with the run. + * @param {RunManager} params.runManager - The RunManager instance to manage run steps. + * @param {number} [params.pollIntervalMs=750] - The interval for polling the run status; default is 750 milliseconds. + * @param {number} [params.timeout=180000] - The period to wait until timing out polling; default is 3 minutes (in ms). + * @return {Promise<Run>} A promise that resolves to the last fetched run object. + */ +async function waitForRun({ + openai, + run_id, + thread_id, + runManager, + pollIntervalMs = 750, + timeout = 60000 * 3, +}) { + let timeElapsed = 0; + let run; + + const cache = getLogStores(CacheKeys.ABORT_KEYS); + const cacheKey = `${openai.req.user.id}:${openai.responseMessage.conversationId}`; + + let i = 0; + let lastSeenStatus = null; + const runIdLog = `run_id: ${run_id}`; + const runInfo = `user: ${openai.req.user.id} | thread_id: ${thread_id} | ${runIdLog}`; + const raceTimeoutMs = 3000; + let maxRetries = 5; + while (timeElapsed < timeout) { + i++; + logger.debug(`[heartbeat ${i}] ${runIdLog} | Retrieving run status...`); + let updatedRun; + + let attempt = 0; + let startTime = Date.now(); + while (!updatedRun && attempt < maxRetries) { + try { + updatedRun = await withTimeout( + retrieveRun({ thread_id, run_id, timeout: raceTimeoutMs, openai }), + raceTimeoutMs, + `[heartbeat ${i}] ${runIdLog} | Run retrieval timed out after ${raceTimeoutMs} ms. Trying again (attempt ${ + attempt + 1 + } of ${maxRetries})...`, + ); + const endTime = Date.now(); + logger.debug( + `[heartbeat ${i}] ${runIdLog} | Elapsed run retrieval time: ${endTime - startTime}`, + ); + } catch (error) { + attempt++; + startTime = Date.now(); + logger.warn(`${runIdLog} | Error retrieving run status`, error); + } + } + + if (!updatedRun) { + const errorMessage = `[waitForRun] ${runIdLog} | Run retrieval failed after ${maxRetries} attempts`; + throw new Error(errorMessage); + } + + run = updatedRun; + attempt = 0; + const runStatus = `${runInfo} | status: ${run.status}`; + + if (run.status !== lastSeenStatus) { + logger.debug(`[${run.status}] ${runInfo}`); + lastSeenStatus = run.status; + } + + logger.debug(`[heartbeat ${i}] ${runStatus}`); + + let cancelStatus; + try { + const timeoutMessage = `[heartbeat ${i}] ${runIdLog} | Cancel Status check operation timed out.`; + cancelStatus = await withTimeout(cache.get(cacheKey), raceTimeoutMs, timeoutMessage); + } catch (error) { + logger.warn(`Error retrieving cancel status: ${error}`); + } + + if (cancelStatus === 'cancelled') { + logger.warn(`[waitForRun] ${runStatus} | RUN CANCELLED`); + throw new Error('Run cancelled'); + } + + if (![RunStatus.IN_PROGRESS, RunStatus.QUEUED].includes(run.status)) { + logger.debug(`[FINAL] ${runInfo} | status: ${run.status}`); + await runManager.fetchRunSteps({ + openai, + thread_id: thread_id, + run_id: run_id, + runStatus: run.status, + final: true, + }); + break; + } + + // may use in future; for now, just fetch from the final status + await runManager.fetchRunSteps({ + openai, + thread_id: thread_id, + run_id: run_id, + runStatus: run.status, + }); + + await sleep(pollIntervalMs); + timeElapsed += pollIntervalMs; + } + + if (timeElapsed >= timeout) { + const timeoutMessage = `[waitForRun] ${runInfo} | status: ${run.status} | timed out after ${timeout} ms`; + logger.warn(timeoutMessage); + throw new Error(timeoutMessage); + } + + return run; +} + +/** + * Retrieves all steps of a run. + * + * @deprecated: Steps are handled with runAssistant now. + * @param {Object} params - The parameters for the retrieveRunSteps function. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {string} params.thread_id - The ID of the thread associated with the run. + * @param {string} params.run_id - The ID of the run to retrieve steps for. + * @return {Promise<RunStep[]>} A promise that resolves to an array of RunStep objects. + */ +async function _retrieveRunSteps({ openai, thread_id, run_id }) { + const runSteps = await openai.beta.threads.runs.steps.list(thread_id, run_id); + return runSteps; +} + +/** + * Initializes a RunManager with handlers, then invokes waitForRun to monitor and manage an OpenAI run. + * + * @deprecated Use runAssistant instead. + * @param {Object} params - The parameters for managing and monitoring the run. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {string} params.run_id - The ID of the run to manage and monitor. + * @param {string} params.thread_id - The ID of the thread associated with the run. + * @return {Promise<Object>} A promise that resolves to an object containing the run and managed steps. + */ +async function _handleRun({ openai, run_id, thread_id }) { + let steps = []; + let messages = []; + const runManager = new RunManager({ + // 'in_progress': async ({ step, final, isLast }) => { + // // Define logic for handling steps with 'in_progress' status + // }, + // 'queued': async ({ step, final, isLast }) => { + // // Define logic for handling steps with 'queued' status + // }, + final: async ({ step, runStatus, stepsByStatus }) => { + console.log(`Final step for ${run_id} with status ${runStatus}`); + console.dir(step, { depth: null }); + + const promises = []; + promises.push(openai.beta.threads.messages.list(thread_id, defaultOrderQuery)); + + // const finalSteps = stepsByStatus[runStatus]; + // for (const stepPromise of finalSteps) { + // promises.push(stepPromise); + // } + + // loop across all statuses + for (const [_status, stepsPromises] of Object.entries(stepsByStatus)) { + promises.push(...stepsPromises); + } + + const resolved = await Promise.all(promises); + const res = resolved.shift(); + messages = res.data.filter((msg) => msg.run_id === run_id); + resolved.push(step); + steps = resolved; + }, + }); + + const run = await waitForRun({ + openai, + run_id, + thread_id, + runManager, + pollIntervalMs: 750, + timeout: 60000, + }); + const actions = []; + if (run.required_action) { + const { submit_tool_outputs } = run.required_action; + submit_tool_outputs.tool_calls.forEach((item) => { + const functionCall = item.function; + const args = JSON.parse(functionCall.arguments); + actions.push({ + tool: functionCall.name, + toolInput: args, + toolCallId: item.id, + run_id, + thread_id, + }); + }); + } + + return { run, steps, messages, actions }; +} + +module.exports = { + sleep, + createRun, + waitForRun, + // _handleRun, + // retrieveRunSteps, +}; diff --git a/api/server/services/Runs/index.js b/api/server/services/Runs/index.js new file mode 100644 index 00000000000..7327b271ff9 --- /dev/null +++ b/api/server/services/Runs/index.js @@ -0,0 +1,11 @@ +const handle = require('./handle'); +const methods = require('./methods'); +const RunManager = require('./RunManager'); +const StreamRunManager = require('./StreamRunManager'); + +module.exports = { + ...handle, + ...methods, + RunManager, + StreamRunManager, +}; diff --git a/api/server/services/Runs/methods.js b/api/server/services/Runs/methods.js new file mode 100644 index 00000000000..c6dfcbeddeb --- /dev/null +++ b/api/server/services/Runs/methods.js @@ -0,0 +1,63 @@ +const axios = require('axios'); +const { EModelEndpoint } = require('librechat-data-provider'); +const { logAxiosError } = require('~/utils'); + +/** + * @typedef {Object} RetrieveOptions + * @property {string} thread_id - The ID of the thread to retrieve. + * @property {string} run_id - The ID of the run to retrieve. + * @property {number} [timeout] - Optional timeout for the API call. + * @property {number} [maxRetries] - TODO: not yet implemented; Optional maximum number of retries for the API call. + * @property {OpenAIClient} openai - Configuration and credentials for OpenAI API access. + */ + +/** + * Asynchronously retrieves data from an API endpoint based on provided thread and run IDs. + * + * @param {RetrieveOptions} options - The options for the retrieve operation. + * @returns {Promise<Object>} The data retrieved from the API. + */ +async function retrieveRun({ thread_id, run_id, timeout, openai }) { + const { apiKey, baseURL, httpAgent, organization } = openai; + let url = `${baseURL}/threads/${thread_id}/runs/${run_id}`; + + let headers = { + Authorization: `Bearer ${apiKey}`, + 'OpenAI-Beta': 'assistants=v1', + }; + + if (organization) { + headers['OpenAI-Organization'] = organization; + } + + /** @type {TAzureConfig | undefined} */ + const azureConfig = openai.req.app.locals[EModelEndpoint.azureOpenAI]; + + if (azureConfig && azureConfig.assistants) { + delete headers.Authorization; + headers = { ...headers, ...openai._options.defaultHeaders }; + const queryParams = new URLSearchParams(openai._options.defaultQuery).toString(); + url = `${url}?${queryParams}`; + } + + try { + const axiosConfig = { + headers: headers, + timeout: timeout, + }; + + if (httpAgent) { + axiosConfig.httpAgent = httpAgent; + axiosConfig.httpsAgent = httpAgent; + } + + const response = await axios.get(url, axiosConfig); + return response.data; + } catch (error) { + const message = '[retrieveRun] Failed to retrieve run data:'; + logAxiosError({ message, error }); + throw error; + } +} + +module.exports = { retrieveRun }; diff --git a/api/server/services/Threads/index.js b/api/server/services/Threads/index.js new file mode 100644 index 00000000000..850cddc4e15 --- /dev/null +++ b/api/server/services/Threads/index.js @@ -0,0 +1,5 @@ +const manage = require('./manage'); + +module.exports = { + ...manage, +}; diff --git a/api/server/services/Threads/manage.js b/api/server/services/Threads/manage.js new file mode 100644 index 00000000000..f875b108412 --- /dev/null +++ b/api/server/services/Threads/manage.js @@ -0,0 +1,657 @@ +const path = require('path'); +const { v4 } = require('uuid'); +const { + Constants, + ContentTypes, + EModelEndpoint, + AnnotationTypes, + defaultOrderQuery, +} = require('librechat-data-provider'); +const { retrieveAndProcessFile } = require('~/server/services/Files/process'); +const { recordMessage, getMessages } = require('~/models/Message'); +const { saveConvo } = require('~/models/Conversation'); +const spendTokens = require('~/models/spendTokens'); +const { countTokens } = require('~/server/utils'); +const { logger } = require('~/config'); + +/** + * Initializes a new thread or adds messages to an existing thread. + * + * @param {Object} params - The parameters for initializing a thread. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {Object} params.body - The body of the request. + * @param {ThreadMessage[]} params.body.messages - A list of messages to start the thread with. + * @param {Object} [params.body.metadata] - Optional metadata for the thread. + * @param {string} [params.thread_id] - Optional existing thread ID. If provided, a message will be added to this thread. + * @return {Promise<Thread>} A promise that resolves to the newly created thread object or the updated thread object. + */ +async function initThread({ openai, body, thread_id: _thread_id }) { + let thread = {}; + const messages = []; + if (_thread_id) { + const message = await openai.beta.threads.messages.create(_thread_id, body.messages[0]); + messages.push(message); + } else { + thread = await openai.beta.threads.create(body); + } + + const thread_id = _thread_id ?? thread.id; + return { messages, thread_id, ...thread }; +} + +/** + * Saves a user message to the DB in the Assistants endpoint format. + * + * @param {Object} params - The parameters of the user message + * @param {string} params.user - The user's ID. + * @param {string} params.text - The user's prompt. + * @param {string} params.messageId - The user message Id. + * @param {string} params.model - The model used by the assistant. + * @param {string} params.assistant_id - The current assistant Id. + * @param {string} params.thread_id - The thread Id. + * @param {string} params.conversationId - The message's conversationId + * @param {string} [params.parentMessageId] - Optional if initial message. + * Defaults to Constants.NO_PARENT. + * @param {string} [params.instructions] - Optional: from preset for `instructions` field. + * Overrides the instructions of the assistant. + * @param {string} [params.promptPrefix] - Optional: from preset for `additional_instructions` field. + * @param {import('librechat-data-provider').TFile[]} [params.files] - Optional. List of Attached File Objects. + * @param {string[]} [params.file_ids] - Optional. List of File IDs attached to the userMessage. + * @return {Promise<Run>} A promise that resolves to the created run object. + */ +async function saveUserMessage(params) { + const tokenCount = await countTokens(params.text); + + // todo: do this on the frontend + // const { file_ids = [] } = params; + // let content; + // if (file_ids.length) { + // content = [ + // { + // value: params.text, + // }, + // ...( + // file_ids + // .filter(f => f) + // .map((file_id) => ({ + // file_id, + // })) + // ), + // ]; + // } + + const userMessage = { + user: params.user, + endpoint: EModelEndpoint.assistants, + messageId: params.messageId, + conversationId: params.conversationId, + parentMessageId: params.parentMessageId ?? Constants.NO_PARENT, + /* For messages, use the assistant_id instead of model */ + model: params.assistant_id, + thread_id: params.thread_id, + sender: 'User', + text: params.text, + isCreatedByUser: true, + tokenCount, + }; + + const convo = { + endpoint: EModelEndpoint.assistants, + conversationId: params.conversationId, + promptPrefix: params.promptPrefix, + instructions: params.instructions, + assistant_id: params.assistant_id, + model: params.model, + }; + + if (params.files?.length) { + userMessage.files = params.files.map(({ file_id }) => ({ file_id })); + convo.file_ids = params.file_ids; + } + + const message = await recordMessage(userMessage); + await saveConvo(params.user, convo); + + return message; +} + +/** + * Saves an Assistant message to the DB in the Assistants endpoint format. + * + * @param {Object} params - The parameters of the Assistant message + * @param {string} params.user - The user's ID. + * @param {string} params.messageId - The message Id. + * @param {string} params.assistant_id - The assistant Id. + * @param {string} params.thread_id - The thread Id. + * @param {string} params.model - The model used by the assistant. + * @param {ContentPart[]} params.content - The message content parts. + * @param {string} params.conversationId - The message's conversationId + * @param {string} params.parentMessageId - The latest user message that triggered this response. + * @param {string} [params.instructions] - Optional: from preset for `instructions` field. + * Overrides the instructions of the assistant. + * @param {string} [params.promptPrefix] - Optional: from preset for `additional_instructions` field. + * @return {Promise<Run>} A promise that resolves to the created run object. + */ +async function saveAssistantMessage(params) { + const text = params.content.reduce((acc, part) => { + if (!part.value) { + return acc; + } + + return acc + ' ' + part.value; + }, ''); + + // const tokenCount = // TODO: need to count each content part + + const message = await recordMessage({ + user: params.user, + endpoint: EModelEndpoint.assistants, + messageId: params.messageId, + conversationId: params.conversationId, + parentMessageId: params.parentMessageId, + thread_id: params.thread_id, + /* For messages, use the assistant_id instead of model */ + model: params.assistant_id, + content: params.content, + sender: 'Assistant', + isCreatedByUser: false, + text: text.trim(), + // tokenCount, + }); + + await saveConvo(params.user, { + endpoint: EModelEndpoint.assistants, + conversationId: params.conversationId, + promptPrefix: params.promptPrefix, + instructions: params.instructions, + assistant_id: params.assistant_id, + model: params.model, + }); + + return message; +} + +/** + * Records LibreChat messageId to all response messages' metadata + * + * @param {Object} params - The parameters for initializing a thread. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {string} params.thread_id - Response thread ID. + * @param {string} params.messageId - The response `messageId` generated by LibreChat. + * @param {StepMessage[] | Message[]} params.messages - A list of messages to start the thread with. + * @return {Promise<ThreadMessage[]>} A promise that resolves to the updated messages + */ +async function addThreadMetadata({ openai, thread_id, messageId, messages }) { + const promises = []; + for (const message of messages) { + promises.push( + openai.beta.threads.messages.update(thread_id, message.id, { + metadata: { + messageId, + }, + }), + ); + } + + return await Promise.all(promises); +} + +/** + * Synchronizes LibreChat messages to Thread Messages. + * Updates the LibreChat DB with any missing Thread Messages and + * updates the missing Thread Messages' metadata with their corresponding db messageId's. + * + * Also updates the existing conversation's file_ids with any new file_ids. + * + * @param {Object} params - The parameters for synchronizing messages. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {TMessage[]} params.dbMessages - The LibreChat DB messages. + * @param {ThreadMessage[]} params.apiMessages - The thread messages from the API. + * @param {string} params.conversationId - The current conversation ID. + * @param {string} params.thread_id - The current thread ID. + * @param {string} [params.assistant_id] - The current assistant ID. + * @return {Promise<TMessage[]>} A promise that resolves to the updated messages + */ +async function syncMessages({ + openai, + apiMessages, + dbMessages, + conversationId, + thread_id, + assistant_id, +}) { + let result = []; + let dbMessageMap = new Map(dbMessages.map((msg) => [msg.messageId, msg])); + + const modifyPromises = []; + const recordPromises = []; + + /** + * + * Modify API message and save newMessage to DB + * + * @param {Object} params - The parameters object + * @param {TMessage} params.dbMessage + * @param {dbMessage} params.apiMessage + */ + const processNewMessage = async ({ dbMessage, apiMessage }) => { + recordPromises.push(recordMessage({ ...dbMessage, user: openai.req.user.id })); + + if (!apiMessage.id.includes('msg_')) { + return; + } + + if (dbMessage.aggregateMessages?.length > 1) { + modifyPromises.push( + addThreadMetadata({ + openai, + thread_id, + messageId: dbMessage.messageId, + messages: dbMessage.aggregateMessages, + }), + ); + return; + } + + modifyPromises.push( + openai.beta.threads.messages.update(thread_id, apiMessage.id, { + metadata: { + messageId: dbMessage.messageId, + }, + }), + ); + }; + + let lastMessage = null; + + for (let i = 0; i < apiMessages.length; i++) { + const apiMessage = apiMessages[i]; + + // Check if the message exists in the database based on metadata + const dbMessageId = apiMessage.metadata && apiMessage.metadata.messageId; + let dbMessage = dbMessageMap.get(dbMessageId); + + if (dbMessage) { + // If message exists in DB, use its messageId and update parentMessageId + dbMessage.parentMessageId = lastMessage ? lastMessage.messageId : Constants.NO_PARENT; + lastMessage = dbMessage; + result.push(dbMessage); + continue; + } + + if (apiMessage.role === 'assistant' && lastMessage && lastMessage.role === 'assistant') { + // Aggregate assistant messages + lastMessage.content = [...lastMessage.content, ...apiMessage.content]; + lastMessage.files = [...(lastMessage.files ?? []), ...(apiMessage.files ?? [])]; + lastMessage.aggregateMessages.push({ id: apiMessage.id }); + } else { + // Handle new or missing message + const newMessage = { + thread_id, + conversationId, + messageId: v4(), + endpoint: EModelEndpoint.assistants, + parentMessageId: lastMessage ? lastMessage.messageId : Constants.NO_PARENT, + role: apiMessage.role, + isCreatedByUser: apiMessage.role === 'user', + // TODO: process generated files in content parts + content: apiMessage.content, + aggregateMessages: [{ id: apiMessage.id }], + model: apiMessage.role === 'user' ? null : apiMessage.assistant_id, + user: openai.req.user.id, + }; + + if (apiMessage.file_ids?.length) { + // TODO: retrieve file objects from API + newMessage.files = apiMessage.file_ids.map((file_id) => ({ file_id })); + } + + /* Assign assistant_id if defined */ + if (assistant_id && apiMessage.role === 'assistant' && !newMessage.model) { + apiMessage.model = assistant_id; + newMessage.model = assistant_id; + } + + result.push(newMessage); + lastMessage = newMessage; + + if (apiMessage.role === 'user') { + processNewMessage({ dbMessage: newMessage, apiMessage }); + continue; + } + } + + const nextMessage = apiMessages[i + 1]; + const processAssistant = !nextMessage || nextMessage.role === 'user'; + + if (apiMessage.role === 'assistant' && processAssistant) { + processNewMessage({ dbMessage: lastMessage, apiMessage }); + } + } + + const attached_file_ids = apiMessages.reduce((acc, msg) => { + if (msg.role === 'user' && msg.file_ids?.length) { + return [...acc, ...msg.file_ids]; + } + + return acc; + }, []); + + await Promise.all(modifyPromises); + await Promise.all(recordPromises); + + await saveConvo(openai.req.user.id, { + conversationId, + file_ids: attached_file_ids, + }); + + return result; +} + +/** + * Maps messages to their corresponding steps. Steps with message creation will be paired with their messages, + * while steps without message creation will be returned as is. + * + * @param {RunStep[]} steps - An array of steps from the run. + * @param {Message[]} messages - An array of message objects. + * @returns {(StepMessage | RunStep)[]} An array where each element is either a step with its corresponding message (StepMessage) or a step without a message (RunStep). + */ +function mapMessagesToSteps(steps, messages) { + // Create a map of messages indexed by their IDs for efficient lookup + const messageMap = messages.reduce((acc, msg) => { + acc[msg.id] = msg; + return acc; + }, {}); + + // Map each step to its corresponding message, or return the step as is if no message ID is present + return steps + .sort((a, b) => a.created_at - b.created_at) + .map((step) => { + const messageId = step.step_details?.message_creation?.message_id; + + if (messageId && messageMap[messageId]) { + return { step, message: messageMap[messageId] }; + } + return step; + }); +} + +/** + * Checks for any missing messages; if missing, + * synchronizes LibreChat messages to Thread Messages + * + * @param {Object} params - The parameters for initializing a thread. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {string} [params.latestMessageId] - Optional: The latest message ID from LibreChat. + * @param {string} params.thread_id - Response thread ID. + * @param {string} params.run_id - Response Run ID. + * @param {string} params.conversationId - LibreChat conversation ID. + * @return {Promise<TMessage[]>} A promise that resolves to the updated messages + */ +async function checkMessageGaps({ openai, latestMessageId, thread_id, run_id, conversationId }) { + const promises = []; + promises.push(openai.beta.threads.messages.list(thread_id, defaultOrderQuery)); + promises.push(openai.beta.threads.runs.steps.list(thread_id, run_id)); + /** @type {[{ data: ThreadMessage[] }, { data: RunStep[] }]} */ + const [response, stepsResponse] = await Promise.all(promises); + + const steps = mapMessagesToSteps(stepsResponse.data, response.data); + /** @type {ThreadMessage} */ + const currentMessage = { + id: v4(), + content: [], + assistant_id: null, + created_at: Math.floor(new Date().getTime() / 1000), + object: 'thread.message', + role: 'assistant', + run_id, + thread_id, + metadata: { + messageId: latestMessageId, + }, + }; + + for (const step of steps) { + if (!currentMessage.assistant_id && step.assistant_id) { + currentMessage.assistant_id = step.assistant_id; + } + if (step.message) { + currentMessage.id = step.message.id; + currentMessage.created_at = step.message.created_at; + currentMessage.content = currentMessage.content.concat(step.message.content); + } else if (step.step_details?.type === 'tool_calls' && step.step_details?.tool_calls?.length) { + currentMessage.content = currentMessage.content.concat( + step.step_details?.tool_calls.map((toolCall) => ({ + [ContentTypes.TOOL_CALL]: { + ...toolCall, + progress: 2, + }, + type: ContentTypes.TOOL_CALL, + })), + ); + } + } + + let addedCurrentMessage = false; + const apiMessages = response.data + .map((msg) => { + if (msg.id === currentMessage.id) { + addedCurrentMessage = true; + return currentMessage; + } + return msg; + }) + .sort((a, b) => new Date(a.created_at) - new Date(b.created_at)); + + if (!addedCurrentMessage) { + apiMessages.push(currentMessage); + } + + const dbMessages = await getMessages({ conversationId }); + const assistant_id = dbMessages?.[0]?.model; + + const syncedMessages = await syncMessages({ + openai, + dbMessages, + apiMessages, + thread_id, + conversationId, + assistant_id, + }); + + return Object.values( + [...dbMessages, ...syncedMessages].reduce( + (acc, message) => ({ ...acc, [message.messageId]: message }), + {}, + ), + ); +} + +/** + * Records token usage for a given completion request. + * @param {Object} params - The parameters for initializing a thread. + * @param {number} params.prompt_tokens - The number of prompt tokens used. + * @param {number} params.completion_tokens - The number of completion tokens used. + * @param {string} params.model - The model used by the assistant run. + * @param {string} params.user - The user's ID. + * @param {string} params.conversationId - LibreChat conversation ID. + * @param {string} [params.context='message'] - The context of the usage. Defaults to 'message'. + * @return {Promise<TMessage[]>} A promise that resolves to the updated messages + */ +const recordUsage = async ({ + prompt_tokens, + completion_tokens, + model, + user, + conversationId, + context = 'message', +}) => { + await spendTokens( + { + user, + model, + context, + conversationId, + }, + { promptTokens: prompt_tokens, completionTokens: completion_tokens }, + ); +}; + +/** + * Safely replaces the annotated text within the specified range denoted by start_index and end_index, + * after verifying that the text within that range matches the given annotation text. + * Proceeds with the replacement even if a mismatch is found, but logs a warning. + * + * @param {string} originalText The original text content. + * @param {number} start_index The starting index where replacement should begin. + * @param {number} end_index The ending index where replacement should end. + * @param {string} expectedText The text expected to be found in the specified range. + * @param {string} replacementText The text to insert in place of the existing content. + * @returns {string} The text with the replacement applied, regardless of text match. + */ +function replaceAnnotation(originalText, start_index, end_index, expectedText, replacementText) { + if (start_index < 0 || end_index > originalText.length || start_index > end_index) { + logger.warn(`Invalid range specified for annotation replacement. + Attempting replacement with \`replace\` method instead... + length: ${originalText.length} + start_index: ${start_index} + end_index: ${end_index}`); + return originalText.replace(originalText, replacementText); + } + + const actualTextInRange = originalText.substring(start_index, end_index); + + if (actualTextInRange !== expectedText) { + logger.warn(`The text within the specified range does not match the expected annotation text. + Attempting replacement with \`replace\` method instead... + Expected: ${expectedText} + Actual: ${actualTextInRange}`); + + return originalText.replace(originalText, replacementText); + } + + const beforeText = originalText.substring(0, start_index); + const afterText = originalText.substring(end_index); + return beforeText + replacementText + afterText; +} + +/** + * Sorts, processes, and flattens messages to a single string. + * + * @param {object} params - The OpenAI client instance. + * @param {OpenAIClient} params.openai - The OpenAI client instance. + * @param {RunClient} params.client - The LibreChat client that manages the run: either refers to `OpenAI` or `StreamRunManager`. + * @param {ThreadMessage[]} params.messages - An array of messages. + * @returns {Promise<{messages: ThreadMessage[], text: string}>} The sorted messages and the flattened text. + */ +async function processMessages({ openai, client, messages = [] }) { + const sorted = messages.sort((a, b) => a.created_at - b.created_at); + + let text = ''; + let edited = false; + const sources = []; + for (const message of sorted) { + message.files = []; + for (const content of message.content) { + const type = content.type; + const contentType = content[type]; + const currentFileId = contentType?.file_id; + + if (type === ContentTypes.IMAGE_FILE && !client.processedFileIds.has(currentFileId)) { + const file = await retrieveAndProcessFile({ + openai, + client, + file_id: currentFileId, + basename: `${currentFileId}.png`, + }); + + client.processedFileIds.add(currentFileId); + message.files.push(file); + continue; + } + + let currentText = contentType?.value ?? ''; + + /** @type {{ annotations: Annotation[] }} */ + const { annotations } = contentType ?? {}; + + // Process annotations if they exist + if (!annotations?.length) { + text += currentText + ' '; + continue; + } + + logger.debug('[processMessages] Processing annotations:', annotations); + for (const annotation of annotations) { + let file; + const type = annotation.type; + const annotationType = annotation[type]; + const file_id = annotationType?.file_id; + const alreadyProcessed = client.processedFileIds.has(file_id); + + const replaceCurrentAnnotation = (replacement = '') => { + currentText = replaceAnnotation( + currentText, + annotation.start_index, + annotation.end_index, + annotation.text, + replacement, + ); + edited = true; + }; + + if (alreadyProcessed) { + const { file_id } = annotationType || {}; + file = await retrieveAndProcessFile({ openai, client, file_id, unknownType: true }); + } else if (type === AnnotationTypes.FILE_PATH) { + const basename = path.basename(annotation.text); + file = await retrieveAndProcessFile({ + openai, + client, + file_id, + basename, + }); + replaceCurrentAnnotation(file.filepath); + } else if (type === AnnotationTypes.FILE_CITATION) { + file = await retrieveAndProcessFile({ + openai, + client, + file_id, + unknownType: true, + }); + sources.push(file.filename); + replaceCurrentAnnotation(`^${sources.length}^`); + } + + text += currentText + ' '; + + if (!file) { + continue; + } + + client.processedFileIds.add(file_id); + message.files.push(file); + } + } + } + + if (sources.length) { + text += '\n\n'; + for (let i = 0; i < sources.length; i++) { + text += `^${i + 1}.^ ${sources[i]}${i === sources.length - 1 ? '' : '\n'}`; + } + } + + return { messages: sorted, text, edited }; +} + +module.exports = { + initThread, + recordUsage, + processMessages, + saveUserMessage, + checkMessageGaps, + addThreadMetadata, + mapMessagesToSteps, + saveAssistantMessage, +}; diff --git a/api/server/services/ToolService.js b/api/server/services/ToolService.js new file mode 100644 index 00000000000..81c6ca42830 --- /dev/null +++ b/api/server/services/ToolService.js @@ -0,0 +1,356 @@ +const fs = require('fs'); +const path = require('path'); +const { StructuredTool } = require('langchain/tools'); +const { zodToJsonSchema } = require('zod-to-json-schema'); +const { Calculator } = require('langchain/tools/calculator'); +const { + Tools, + ContentTypes, + imageGenTools, + actionDelimiter, + ImageVisionTool, + openapiToFunction, + validateAndParseOpenAPISpec, +} = require('librechat-data-provider'); +const { processFileURL, uploadImageBuffer } = require('~/server/services/Files/process'); +const { loadActionSets, createActionTool, domainParser } = require('./ActionService'); +const { recordUsage } = require('~/server/services/Threads'); +const { loadTools } = require('~/app/clients/tools/util'); +const { redactMessage } = require('~/config/parsers'); +const { sleep } = require('~/server/utils'); +const { logger } = require('~/config'); + +/** + * Loads and formats tools from the specified tool directory. + * + * The directory is scanned for JavaScript files, excluding any files in the filter set. + * For each file, it attempts to load the file as a module and instantiate a class, if it's a subclass of `StructuredTool`. + * Each tool instance is then formatted to be compatible with the OpenAI Assistant. + * Additionally, instances of LangChain Tools are included in the result. + * + * @param {object} params - The parameters for the function. + * @param {string} params.directory - The directory path where the tools are located. + * @param {Set<string>} [params.filter=new Set()] - A set of filenames to exclude from loading. + * @returns {Record<string, FunctionTool>} An object mapping each tool's plugin key to its instance. + */ +function loadAndFormatTools({ directory, filter = new Set() }) { + const tools = []; + /* Structured Tools Directory */ + const files = fs.readdirSync(directory); + + for (const file of files) { + if (file.endsWith('.js') && !filter.has(file)) { + const filePath = path.join(directory, file); + let ToolClass = null; + try { + ToolClass = require(filePath); + } catch (error) { + logger.error(`[loadAndFormatTools] Error loading tool from ${filePath}:`, error); + continue; + } + + if (!ToolClass) { + continue; + } + + if (ToolClass.prototype instanceof StructuredTool) { + /** @type {StructuredTool | null} */ + let toolInstance = null; + try { + toolInstance = new ToolClass({ override: true }); + } catch (error) { + logger.error( + `[loadAndFormatTools] Error initializing \`${file}\` tool; if it requires authentication, is the \`override\` field configured?`, + error, + ); + continue; + } + + if (!toolInstance) { + continue; + } + + const formattedTool = formatToOpenAIAssistantTool(toolInstance); + tools.push(formattedTool); + } + } + } + + /** + * Basic Tools; schema: { input: string } + */ + const basicToolInstances = [new Calculator()]; + + for (const toolInstance of basicToolInstances) { + const formattedTool = formatToOpenAIAssistantTool(toolInstance); + tools.push(formattedTool); + } + + tools.push(ImageVisionTool); + + return tools.reduce((map, tool) => { + map[tool.function.name] = tool; + return map; + }, {}); +} + +/** + * Formats a `StructuredTool` instance into a format that is compatible + * with OpenAI's ChatCompletionFunctions. It uses the `zodToJsonSchema` + * function to convert the schema of the `StructuredTool` into a JSON + * schema, which is then used as the parameters for the OpenAI function. + * + * @param {StructuredTool} tool - The StructuredTool to format. + * @returns {FunctionTool} The OpenAI Assistant Tool. + */ +function formatToOpenAIAssistantTool(tool) { + return { + type: Tools.function, + [Tools.function]: { + name: tool.name, + description: tool.description, + parameters: zodToJsonSchema(tool.schema), + }, + }; +} + +/** + * Processes the required actions by calling the appropriate tools and returning the outputs. + * @param {OpenAIClient} client - OpenAI or StreamRunManager Client. + * @param {RequiredAction} requiredActions - The current required action. + * @returns {Promise<ToolOutput>} The outputs of the tools. + */ +const processVisionRequest = async (client, currentAction) => { + if (!client.visionPromise) { + return { + tool_call_id: currentAction.toolCallId, + output: 'No image details found.', + }; + } + + /** @type {ChatCompletion | undefined} */ + const completion = await client.visionPromise; + if (completion.usage) { + recordUsage({ + user: client.req.user.id, + model: client.req.body.model, + conversationId: (client.responseMessage ?? client.finalMessage).conversationId, + ...completion.usage, + }); + } + const output = completion?.choices?.[0]?.message?.content ?? 'No image details found.'; + return { + tool_call_id: currentAction.toolCallId, + output, + }; +}; + +/** + * Processes return required actions from run. + * @param {OpenAIClient | StreamRunManager} client - OpenAI (legacy) or StreamRunManager Client. + * @param {RequiredAction[]} requiredActions - The required actions to submit outputs for. + * @returns {Promise<ToolOutputs>} The outputs of the tools. + */ +async function processRequiredActions(client, requiredActions) { + logger.debug( + `[required actions] user: ${client.req.user.id} | thread_id: ${requiredActions[0].thread_id} | run_id: ${requiredActions[0].run_id}`, + requiredActions, + ); + const tools = requiredActions.map((action) => action.tool); + const loadedTools = await loadTools({ + user: client.req.user.id, + model: client.req.body.model ?? 'gpt-3.5-turbo-1106', + tools, + functions: true, + options: { + processFileURL, + req: client.req, + uploadImageBuffer, + openAIApiKey: client.apiKey, + fileStrategy: client.req.app.locals.fileStrategy, + returnMetadata: true, + }, + skipSpecs: true, + }); + + const ToolMap = loadedTools.reduce((map, tool) => { + map[tool.name] = tool; + return map; + }, {}); + + const promises = []; + + /** @type {Action[]} */ + let actionSets = []; + let isActionTool = false; + const ActionToolMap = {}; + const ActionBuildersMap = {}; + + for (let i = 0; i < requiredActions.length; i++) { + const currentAction = requiredActions[i]; + if (currentAction.tool === ImageVisionTool.function.name) { + promises.push(processVisionRequest(client, currentAction)); + continue; + } + let tool = ToolMap[currentAction.tool] ?? ActionToolMap[currentAction.tool]; + + const handleToolOutput = async (output) => { + requiredActions[i].output = output; + + /** @type {FunctionToolCall & PartMetadata} */ + const toolCall = { + function: { + name: currentAction.tool, + arguments: JSON.stringify(currentAction.toolInput), + output, + }, + id: currentAction.toolCallId, + type: 'function', + progress: 1, + action: isActionTool, + }; + + const toolCallIndex = client.mappedOrder.get(toolCall.id); + + if (imageGenTools.has(currentAction.tool)) { + const imageOutput = output; + toolCall.function.output = `${currentAction.tool} displayed an image. All generated images are already plainly visible, so don't repeat the descriptions in detail. Do not list download links as they are available in the UI already. The user may download the images by clicking on them, but do not mention anything about downloading to the user.`; + + // Streams the "Finished" state of the tool call in the UI + client.addContentData({ + [ContentTypes.TOOL_CALL]: toolCall, + index: toolCallIndex, + type: ContentTypes.TOOL_CALL, + }); + + await sleep(500); + + /** @type {ImageFile} */ + const imageDetails = { + ...imageOutput, + ...currentAction.toolInput, + }; + + const image_file = { + [ContentTypes.IMAGE_FILE]: imageDetails, + type: ContentTypes.IMAGE_FILE, + // Replace the tool call output with Image file + index: toolCallIndex, + }; + + client.addContentData(image_file); + + // Update the stored tool call + client.seenToolCalls && client.seenToolCalls.set(toolCall.id, toolCall); + + return { + tool_call_id: currentAction.toolCallId, + output: toolCall.function.output, + }; + } + + client.seenToolCalls && client.seenToolCalls.set(toolCall.id, toolCall); + client.addContentData({ + [ContentTypes.TOOL_CALL]: toolCall, + index: toolCallIndex, + type: ContentTypes.TOOL_CALL, + // TODO: to append tool properties to stream, pass metadata rest to addContentData + // result: tool.result, + }); + + return { + tool_call_id: currentAction.toolCallId, + output, + }; + }; + + if (!tool) { + // throw new Error(`Tool ${currentAction.tool} not found.`); + + if (!actionSets.length) { + actionSets = + (await loadActionSets({ + assistant_id: client.req.body.assistant_id, + })) ?? []; + } + + const actionSet = actionSets.find((action) => + currentAction.tool.includes(domainParser(client.req, action.metadata.domain, true)), + ); + + if (!actionSet) { + // TODO: try `function` if no action set is found + // throw new Error(`Tool ${currentAction.tool} not found.`); + continue; + } + + let builders = ActionBuildersMap[actionSet.metadata.domain]; + + if (!builders) { + const validationResult = validateAndParseOpenAPISpec(actionSet.metadata.raw_spec); + if (!validationResult.spec) { + throw new Error( + `Invalid spec: user: ${client.req.user.id} | thread_id: ${requiredActions[0].thread_id} | run_id: ${requiredActions[0].run_id}`, + ); + } + const { requestBuilders } = openapiToFunction(validationResult.spec); + ActionToolMap[actionSet.metadata.domain] = requestBuilders; + builders = requestBuilders; + } + + const functionName = currentAction.tool.replace( + `${actionDelimiter}${domainParser(client.req, actionSet.metadata.domain, true)}`, + '', + ); + const requestBuilder = builders[functionName]; + + if (!requestBuilder) { + // throw new Error(`Tool ${currentAction.tool} not found.`); + continue; + } + + tool = createActionTool({ action: actionSet, requestBuilder }); + isActionTool = !!tool; + ActionToolMap[currentAction.tool] = tool; + } + + if (currentAction.tool === 'calculator') { + currentAction.toolInput = currentAction.toolInput.input; + } + + try { + const promise = tool + ._call(currentAction.toolInput) + .then(handleToolOutput) + .catch((error) => { + logger.error(`Error processing tool ${currentAction.tool}`, error); + return { + tool_call_id: currentAction.toolCallId, + output: `Error processing tool ${currentAction.tool}: ${redactMessage(error.message)}`, + }; + }); + promises.push(promise); + } catch (error) { + logger.error( + `tool_call_id: ${currentAction.toolCallId} | Error processing tool ${currentAction.tool}`, + error, + ); + promises.push( + Promise.resolve({ + tool_call_id: currentAction.toolCallId, + error: error.message, + }), + ); + } + } + + return { + tool_outputs: await Promise.all(promises), + }; +} + +module.exports = { + formatToOpenAIAssistantTool, + loadAndFormatTools, + processRequiredActions, +}; diff --git a/api/server/utils/countTokens.js b/api/server/utils/countTokens.js index 34c070aa8c2..641e3861014 100644 --- a/api/server/utils/countTokens.js +++ b/api/server/utils/countTokens.js @@ -3,6 +3,20 @@ const p50k_base = require('tiktoken/encoders/p50k_base.json'); const cl100k_base = require('tiktoken/encoders/cl100k_base.json'); const logger = require('~/config/winston'); +/** + * Counts the number of tokens in a given text using a specified encoding model. + * + * This function utilizes the 'Tiktoken' library to encode text based on the selected model. + * It supports two models, 'text-davinci-003' and 'gpt-3.5-turbo', each with its own encoding strategy. + * For 'text-davinci-003', the 'p50k_base' encoder is used, whereas for other models, the 'cl100k_base' encoder is applied. + * In case of an error during encoding, the error is logged, and the function returns 0. + * + * @async + * @param {string} text - The text to be tokenized. Defaults to an empty string if not provided. + * @param {string} modelName - The name of the model used for tokenizing. Defaults to 'gpt-3.5-turbo'. + * @returns {Promise<number>} The number of tokens in the provided text. Returns 0 if an error occurs. + * @throws Logs the error to a logger and rethrows if any error occurs during tokenization. + */ const countTokens = async (text = '', modelName = 'gpt-3.5-turbo') => { let encoder = null; try { diff --git a/api/server/utils/crypto.js b/api/server/utils/crypto.js index 9b5fed67c6b..8989084e5ab 100644 --- a/api/server/utils/crypto.js +++ b/api/server/utils/crypto.js @@ -19,4 +19,27 @@ function decrypt(encryptedValue) { return decrypted; } -module.exports = { encrypt, decrypt }; +// Programatically generate iv +function encryptV2(value) { + const gen_iv = crypto.randomBytes(16); + const cipher = crypto.createCipheriv(algorithm, key, gen_iv); + let encrypted = cipher.update(value, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + return gen_iv.toString('hex') + ':' + encrypted; +} + +function decryptV2(encryptedValue) { + const parts = encryptedValue.split(':'); + // Already decrypted from an earlier invocation + if (parts.length === 1) { + return parts[0]; + } + const gen_iv = Buffer.from(parts.shift(), 'hex'); + const encrypted = parts.join(':'); + const decipher = crypto.createDecipheriv(algorithm, key, gen_iv); + let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + return decrypted; +} + +module.exports = { encrypt, decrypt, encryptV2, decryptV2 }; diff --git a/api/server/utils/emails/passwordReset.handlebars b/api/server/utils/emails/passwordReset.handlebars index 2d0d5426ccd..d41566c598e 100644 --- a/api/server/utils/emails/passwordReset.handlebars +++ b/api/server/utils/emails/passwordReset.handlebars @@ -1,11 +1,186 @@ -<html> - <head> - <style> +<!DOCTYPE HTML + PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> + +<head> + <!--[if gte mso 9]> +<xml> +<o:OfficeDocumentSettings> + <o:AllowPNG /> + <o:PixelsPerInch>96</o:PixelsPerInch> +</o:OfficeDocumentSettings> +</xml> +<![endif]--> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="x-apple-disable-message-reformatting"> + <meta name="color-scheme" content="light dark"> + <!--[if !mso]><!--> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <!--<![endif]--> + <title> + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+ +
+ + + + + + + +
+
+
Hi {{name}},
+
+
+ + + + + + +
+
+
+
Your password has been updated successfully!
+
+
+
+ + + + + + +
+
+
Best regards,
+
The {{appName}} Team
+
+
+ + + + + + +
+
+
+
© {{year}} {{appName}}. All rights + reserved.
+
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ + + - - - -

Hi {{name}},

-

Your password has been changed successfully.

- \ No newline at end of file diff --git a/api/server/utils/emails/requestPasswordReset.handlebars b/api/server/utils/emails/requestPasswordReset.handlebars index 1bf9853c684..e579ec0d5c4 100644 --- a/api/server/utils/emails/requestPasswordReset.handlebars +++ b/api/server/utils/emails/requestPasswordReset.handlebars @@ -1,13 +1,239 @@ - - - + + + + + + + + + + + +
+ +
+
+
+ + +
+
+ +
+ + + + + + + +
+ +

+
+
You have requested to reset your password. +
+
+

+ +
+ + + + + + +
+
+
Hi {{name}},
+
+
+ + + + + + +
+
+

Please click the button below to reset your password.

+
+
+ + + + + + +
+ + +
+ + + + + + +
+
+
+
If you did not request a password reset, please ignore this email.
+
+
+
+ + + + + + +
+
+
Best regards,
+
The {{appName}} Team
+
+
+ + + + + + +
+
+
+
© {{year}} {{appName}}. All rights + reserved.
+
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ + + - - - -

Hi {{name}},

-

You have requested to reset your password.

-

Please click the link below to reset your password.

- Reset Password - \ No newline at end of file diff --git a/api/server/utils/emails/verifyEmail.handlebars b/api/server/utils/emails/verifyEmail.handlebars new file mode 100644 index 00000000000..2855d4647e4 --- /dev/null +++ b/api/server/utils/emails/verifyEmail.handlebars @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+ +
+ + + + + + + +
+ +

+
+
Welcome to {{appName}}!
+
+

+ +
+ + + + + + +
+
+
+
Dear {{name}},
+
+
+
+ + + + + + +
+
+
+
Thank you for registering with {{appName}}. To complete your registration and verify your email address, please click the button below:
+
+
+
+ + + + + + +
+ + +
+ + + + + + +
+
+
+
If you did not create an account with {{appName}}, please ignore this email.
+
+
+
+ + + + + + +
+
+
Best regards,
+
The {{appName}} Team
+
+
+ + + + + + +
+
+
+
© {{year}} {{appName}}. All rights + reserved.
+
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/api/server/utils/files.js b/api/server/utils/files.js new file mode 100644 index 00000000000..63cf95d3ab9 --- /dev/null +++ b/api/server/utils/files.js @@ -0,0 +1,47 @@ +const sharp = require('sharp'); + +/** + * Determines the file type of a buffer + * @param {Buffer} dataBuffer + * @param {boolean} [returnFileType=false] - Optional. If true, returns the file type instead of the file extension. + * @returns {Promise} - Returns the file extension if found, else null + * */ +const determineFileType = async (dataBuffer, returnFileType) => { + const fileType = await import('file-type'); + const type = await fileType.fileTypeFromBuffer(dataBuffer); + if (returnFileType) { + return type; + } + return type ? type.ext : null; // Returns extension if found, else null +}; + +/** + * Get buffer metadata + * @param {Buffer} buffer + * @returns {Promise<{ bytes: number, type: string, dimensions: Record, extension: string}>} + */ +const getBufferMetadata = async (buffer) => { + const fileType = await determineFileType(buffer, true); + const bytes = buffer.length; + let extension = fileType ? fileType.ext : 'unknown'; + + /** @type {Record} */ + let dimensions = {}; + + if (fileType && fileType.mime.startsWith('image/') && extension !== 'unknown') { + const imageMetadata = await sharp(buffer).metadata(); + dimensions = { + width: imageMetadata.width, + height: imageMetadata.height, + }; + } + + return { + bytes, + type: fileType?.mime ?? 'unknown', + dimensions, + extension, + }; +}; + +module.exports = { determineFileType, getBufferMetadata }; diff --git a/api/server/utils/handleText.js b/api/server/utils/handleText.js index b8d17106622..bfa37e279f9 100644 --- a/api/server/utils/handleText.js +++ b/api/server/utils/handleText.js @@ -1,43 +1,20 @@ +const { Capabilities, defaultRetrievalModels } = require('librechat-data-provider'); +const { getCitations, citeText } = require('./citations'); const partialRight = require('lodash/partialRight'); const { sendMessage } = require('./streamResponse'); -const { getCitations, citeText } = require('./citations'); -const cursor = ''; const citationRegex = /\[\^\d+?\^]/g; const addSpaceIfNeeded = (text) => (text.length > 0 && !text.endsWith(' ') ? text + ' ' : text); const createOnProgress = ({ generation = '', onProgress: _onProgress }) => { let i = 0; - let code = ''; - let precode = ''; - let codeBlock = false; let tokens = addSpaceIfNeeded(generation); const progressCallback = async (partial, { res, text, bing = false, ...rest }) => { let chunk = partial === text ? '' : partial; tokens += chunk; - precode += chunk; tokens = tokens.replaceAll('[DONE]', ''); - if (codeBlock) { - code += chunk; - } - - if (precode.includes('```') && codeBlock) { - codeBlock = false; - precode = precode.replace(/```/g, ''); - code = ''; - } - - if (precode.includes('```') && code === '') { - precode = precode.replace(/```/g, ''); - codeBlock = true; - } - - if (tokens.match(/^\n(?!:::plugins:::)/)) { - tokens = tokens.replace(/^\n/, ''); - } - if (bing) { tokens = citeText(tokens, true); } @@ -51,7 +28,7 @@ const createOnProgress = ({ generation = '', onProgress: _onProgress }) => { const sendIntermediateMessage = (res, payload, extraTokens = '') => { tokens += extraTokens; sendMessage(res, { - text: tokens?.length === 0 ? cursor : tokens, + text: tokens?.length === 0 ? '' : tokens, message: true, initial: i === 0, ...payload, @@ -174,16 +151,35 @@ function isEnabled(value) { const isUserProvided = (value) => value === 'user_provided'; /** - * Extracts the value of an environment variable from a string. - * @param {string} value - The value to be processed, possibly containing an env variable placeholder. - * @returns {string} - The actual value from the environment variable or the original value. + * Generate the configuration for a given key and base URL. + * @param {string} key + * @param {string} baseURL + * @returns {boolean | { userProvide: boolean, userProvideURL?: boolean }} */ -function extractEnvVariable(value) { - const envVarMatch = value.match(/^\${(.+)}$/); - if (envVarMatch) { - return process.env[envVarMatch[1]] || value; +function generateConfig(key, baseURL, assistants = false) { + if (!key) { + return false; + } + + /** @type {{ userProvide: boolean, userProvideURL?: boolean }} */ + const config = { userProvide: isUserProvided(key) }; + + if (baseURL) { + config.userProvideURL = isUserProvided(baseURL); + } + + if (assistants) { + config.retrievalModels = defaultRetrievalModels; + config.capabilities = [ + Capabilities.code_interpreter, + Capabilities.image_vision, + Capabilities.retrieval, + Capabilities.actions, + Capabilities.tools, + ]; } - return value; + + return config; } module.exports = { @@ -194,5 +190,5 @@ module.exports = { formatAction, addSpaceIfNeeded, isUserProvided, - extractEnvVariable, + generateConfig, }; diff --git a/api/server/utils/handleText.spec.js b/api/server/utils/handleText.spec.js index a5566fb1b2b..ea440a89a57 100644 --- a/api/server/utils/handleText.spec.js +++ b/api/server/utils/handleText.spec.js @@ -1,4 +1,4 @@ -const { isEnabled, extractEnvVariable } = require('./handleText'); +const { isEnabled } = require('./handleText'); describe('isEnabled', () => { test('should return true when input is "true"', () => { @@ -48,51 +48,4 @@ describe('isEnabled', () => { test('should return false when input is an array', () => { expect(isEnabled([])).toBe(false); }); - - describe('extractEnvVariable', () => { - const originalEnv = process.env; - - beforeEach(() => { - jest.resetModules(); - process.env = { ...originalEnv }; - }); - - afterAll(() => { - process.env = originalEnv; - }); - - test('should return the value of the environment variable', () => { - process.env.TEST_VAR = 'test_value'; - expect(extractEnvVariable('${TEST_VAR}')).toBe('test_value'); - }); - - test('should return the original string if the envrionment variable is not defined correctly', () => { - process.env.TEST_VAR = 'test_value'; - expect(extractEnvVariable('${ TEST_VAR }')).toBe('${ TEST_VAR }'); - }); - - test('should return the original string if environment variable is not set', () => { - expect(extractEnvVariable('${NON_EXISTENT_VAR}')).toBe('${NON_EXISTENT_VAR}'); - }); - - test('should return the original string if it does not contain an environment variable', () => { - expect(extractEnvVariable('some_string')).toBe('some_string'); - }); - - test('should handle empty strings', () => { - expect(extractEnvVariable('')).toBe(''); - }); - - test('should handle strings without variable format', () => { - expect(extractEnvVariable('no_var_here')).toBe('no_var_here'); - }); - - test('should not process multiple variable formats', () => { - process.env.FIRST_VAR = 'first'; - process.env.SECOND_VAR = 'second'; - expect(extractEnvVariable('${FIRST_VAR} and ${SECOND_VAR}')).toBe( - '${FIRST_VAR} and ${SECOND_VAR}', - ); - }); - }); }); diff --git a/api/server/utils/index.js b/api/server/utils/index.js index d51cdd1d4eb..e87a4680fc9 100644 --- a/api/server/utils/index.js +++ b/api/server/utils/index.js @@ -5,6 +5,8 @@ const handleText = require('./handleText'); const cryptoUtils = require('./crypto'); const citations = require('./citations'); const sendEmail = require('./sendEmail'); +const queue = require('./queue'); +const files = require('./files'); const math = require('./math'); module.exports = { @@ -15,5 +17,7 @@ module.exports = { countTokens, removePorts, sendEmail, + ...files, + ...queue, math, }; diff --git a/api/server/utils/queue.js b/api/server/utils/queue.js new file mode 100644 index 00000000000..c32adaeffd8 --- /dev/null +++ b/api/server/utils/queue.js @@ -0,0 +1,69 @@ +/** + * A leaky bucket queue structure to manage API requests. + * @type {{queue: Array, interval: NodeJS.Timer | null}} + */ +const _LB = { + queue: [], + interval: null, +}; + +/** + * Interval in milliseconds to control the rate of API requests. + * Adjust the interval according to your rate limit needs. + */ +const _LB_INTERVAL_MS = Math.ceil(1000 / 60); // 60 req/s + +/** + * Executes the next function in the leaky bucket queue. + * This function is called at regular intervals defined by _LB_INTERVAL_MS. + */ +const _LB_EXEC_NEXT = async () => { + if (_LB.queue.length === 0) { + clearInterval(_LB.interval); + _LB.interval = null; + return; + } + + const next = _LB.queue.shift(); + if (!next) { + return; + } + + const { asyncFunc, args, callback } = next; + + try { + const data = await asyncFunc(...args); + callback(null, data); + } catch (e) { + callback(e); + } +}; + +/** + * Adds an async function call to the leaky bucket queue. + * @param {Function} asyncFunc - The async function to be executed. + * @param {Array} args - Arguments to pass to the async function. + * @param {Function} callback - Callback function for handling the result or error. + */ +function LB_QueueAsyncCall(asyncFunc, args, callback) { + _LB.queue.push({ asyncFunc, args, callback }); + + if (_LB.interval === null) { + _LB.interval = setInterval(_LB_EXEC_NEXT, _LB_INTERVAL_MS); + } +} + +/** + * Delays the execution for a specified number of milliseconds. + * + * @param {number} ms - The number of milliseconds to delay. + * @return {Promise} A promise that resolves after the specified delay. + */ +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +module.exports = { + sleep, + LB_QueueAsyncCall, +}; diff --git a/api/server/utils/sendEmail.js b/api/server/utils/sendEmail.js index 2f85f89dcd1..1ce33549299 100644 --- a/api/server/utils/sendEmail.js +++ b/api/server/utils/sendEmail.js @@ -2,6 +2,7 @@ const fs = require('fs'); const path = require('path'); const nodemailer = require('nodemailer'); const handlebars = require('handlebars'); +const { isEnabled } = require('~/server/utils/handleText'); const logger = require('~/config/winston'); const sendEmail = async (email, subject, payload, template) => { @@ -13,7 +14,7 @@ const sendEmail = async (email, subject, payload, template) => { requireTls: process.env.EMAIL_ENCRYPTION === 'starttls', tls: { // Whether to accept unsigned certificates - rejectUnauthorized: process.env.EMAIL_ALLOW_SELFSIGNED === 'true', + rejectUnauthorized: !isEnabled(process.env.EMAIL_ALLOW_SELFSIGNED), }, auth: { user: process.env.EMAIL_USERNAME, diff --git a/api/server/utils/streamResponse.js b/api/server/utils/streamResponse.js index 3511f144cc7..b7a691d91ae 100644 --- a/api/server/utils/streamResponse.js +++ b/api/server/utils/streamResponse.js @@ -16,12 +16,12 @@ const handleError = (res, message) => { /** * Sends message data in Server Sent Events format. - * @param {object} res - - The server response. - * @param {string} message - The message to be sent. + * @param {Express.Response} res - - The server response. + * @param {string | Object} message - The message to be sent. * @param {'message' | 'error' | 'cancel'} event - [Optional] The type of event. Default is 'message'. */ const sendMessage = (res, message, event = 'message') => { - if (message.length === 0) { + if (typeof message === 'string' && message.length === 0) { return; } res.write(`event: ${event}\ndata: ${JSON.stringify(message)}\n\n`); @@ -32,6 +32,13 @@ const sendMessage = (res, message, event = 'message') => { * @async * @param {object} res - The server response. * @param {object} options - The options for handling the error containing message properties. + * @param {object} options.user - The user ID. + * @param {string} options.sender - The sender of the message. + * @param {string} options.conversationId - The conversation ID. + * @param {string} options.messageId - The message ID. + * @param {string} options.parentMessageId - The parent message ID. + * @param {string} options.text - The error message. + * @param {boolean} options.shouldSaveMessage - [Optional] Whether the message should be saved. Default is true. * @param {function} callback - [Optional] The callback function to be executed. */ const sendError = async (res, options, callback) => { @@ -43,7 +50,7 @@ const sendError = async (res, options, callback) => { parentMessageId, text, shouldSaveMessage, - overrideProps = {}, + ...rest } = options; const errorMessage = { sender, @@ -55,7 +62,7 @@ const sendError = async (res, options, callback) => { final: true, text, isCreatedByUser: false, - ...overrideProps, + ...rest, }; if (callback && typeof callback === 'function') { await callback(); @@ -88,7 +95,28 @@ const sendError = async (res, options, callback) => { handleError(res, errorMessage); }; +/** + * Sends the response based on whether headers have been sent or not. + * @param {Express.Response} res - The server response. + * @param {Object} data - The data to be sent. + * @param {string} [errorMessage] - The error message, if any. + */ +const sendResponse = (res, data, errorMessage) => { + if (!res.headersSent) { + if (errorMessage) { + return res.status(500).json({ error: errorMessage }); + } + return res.json(data); + } + + if (errorMessage) { + return sendError(res, { ...data, text: errorMessage }); + } + return sendMessage(res, data); +}; + module.exports = { + sendResponse, handleError, sendMessage, sendError, diff --git a/api/strategies/localStrategy.js b/api/strategies/localStrategy.js index 916766e6287..4408382cc42 100644 --- a/api/strategies/localStrategy.js +++ b/api/strategies/localStrategy.js @@ -1,7 +1,8 @@ +const { errorsToString } = require('librechat-data-provider'); const { Strategy: PassportLocalStrategy } = require('passport-local'); -const User = require('../models/User'); -const { loginSchema, errorsToString } = require('./validators'); -const logger = require('../utils/logger'); +const { loginSchema } = require('./validators'); +const logger = require('~/utils/logger'); +const User = require('~/models/User'); async function validateLoginRequest(req) { const { error } = loginSchema.safeParse(req.body); diff --git a/api/strategies/openidStrategy.js b/api/strategies/openidStrategy.js index 7219f24ba41..b6abd8f7059 100644 --- a/api/strategies/openidStrategy.js +++ b/api/strategies/openidStrategy.js @@ -2,6 +2,7 @@ const fs = require('fs'); const path = require('path'); const axios = require('axios'); const passport = require('passport'); +const jwtDecode = require('jsonwebtoken/decode'); const { Issuer, Strategy: OpenIDStrategy } = require('openid-client'); const { logger } = require('~/config'); const User = require('~/models/User'); @@ -44,7 +45,9 @@ async function setupOpenId() { client_secret: process.env.OPENID_CLIENT_SECRET, redirect_uris: [process.env.DOMAIN_SERVER + process.env.OPENID_CALLBACK_URL], }); - + const requiredRole = process.env.OPENID_REQUIRED_ROLE; + const requiredRoleParameterPath = process.env.OPENID_REQUIRED_ROLE_PARAMETER_PATH; + const requiredRoleTokenKind = process.env.OPENID_REQUIRED_ROLE_TOKEN_KIND; const openidLogin = new OpenIDStrategy( { client, @@ -71,6 +74,36 @@ async function setupOpenId() { fullName = userinfo.username || userinfo.email; } + if (requiredRole) { + let decodedToken = ''; + if (requiredRoleTokenKind === 'access') { + decodedToken = jwtDecode(tokenset.access_token); + } else if (requiredRoleTokenKind === 'id') { + decodedToken = jwtDecode(tokenset.id_token); + } + const pathParts = requiredRoleParameterPath.split('.'); + let found = true; + let roles = pathParts.reduce((o, key) => { + if (o === null || o === undefined || !(key in o)) { + found = false; + return []; + } + return o[key]; + }, decodedToken); + + if (!found) { + console.error( + `Key '${requiredRoleParameterPath}' not found in ${requiredRoleTokenKind} token!`, + ); + } + + if (!roles.includes(requiredRole)) { + return done(null, false, { + message: `You must have the "${requiredRole}" role to log in.`, + }); + } + } + if (!user) { user = new User({ provider: 'openid', diff --git a/api/strategies/process.js b/api/strategies/process.js index f5a12a26a25..9b791023195 100644 --- a/api/strategies/process.js +++ b/api/strategies/process.js @@ -1,5 +1,6 @@ const { FileSources } = require('librechat-data-provider'); -const uploadAvatar = require('~/server/services/Files/images/avatar'); +const { getStrategyFunctions } = require('~/server/services/Files/strategies'); +const { resizeAvatar } = require('~/server/services/Files/images/avatar'); const User = require('~/models/User'); /** @@ -7,7 +8,7 @@ const User = require('~/models/User'); * '?manual=true', it updates the user's avatar with the provided URL. For local file storage, it directly updates * the avatar URL, while for other storage types, it processes the avatar URL using the specified file strategy. * - * @param {User} oldUser - The existing user object that needs to be updated. Expected to have an 'avatar' property. + * @param {User} oldUser - The existing user object that needs to be updated. * @param {string} avatarUrl - The new avatar URL to be set for the user. * * @returns {Promise} @@ -19,13 +20,17 @@ const handleExistingUser = async (oldUser, avatarUrl) => { const fileStrategy = process.env.CDN_PROVIDER; const isLocal = fileStrategy === FileSources.local; - if (isLocal && !oldUser.avatar.includes('?manual=true')) { + if (isLocal && (oldUser.avatar === null || !oldUser.avatar.includes('?manual=true'))) { oldUser.avatar = avatarUrl; await oldUser.save(); - } else if (!isLocal && !oldUser.avatar.includes('?manual=true')) { + } else if (!isLocal && (oldUser.avatar === null || !oldUser.avatar.includes('?manual=true'))) { const userId = oldUser._id; - const newavatarUrl = await uploadAvatar({ userId, input: avatarUrl, fileStrategy }); - oldUser.avatar = newavatarUrl; + const webPBuffer = await resizeAvatar({ + userId, + input: avatarUrl, + }); + const { processAvatar } = getStrategyFunctions(fileStrategy); + oldUser.avatar = await processAvatar({ buffer: webPBuffer, userId }); await oldUser.save(); } }; @@ -78,8 +83,12 @@ const createNewUser = async ({ if (!isLocal) { const userId = newUser._id; - const newavatarUrl = await uploadAvatar({ userId, input: avatarUrl, fileStrategy }); - newUser.avatar = newavatarUrl; + const webPBuffer = await resizeAvatar({ + userId, + input: avatarUrl, + }); + const { processAvatar } = getStrategyFunctions(fileStrategy); + newUser.avatar = await processAvatar({ buffer: webPBuffer, userId }); await newUser.save(); } diff --git a/api/strategies/validators.js b/api/strategies/validators.js index 22e4fa6ec5a..e8ae300f03c 100644 --- a/api/strategies/validators.js +++ b/api/strategies/validators.js @@ -1,17 +1,20 @@ const { z } = require('zod'); -function errorsToString(errors) { - return errors - .map((error) => { - let field = error.path.join('.'); - let message = error.message; - - return `${field}: ${message}`; - }) - .join(' '); -} - -const allowedCharactersRegex = /^[a-zA-Z0-9_.@#$%&*()\p{Script=Latin}\p{Script=Common}]+$/u; +const allowedCharactersRegex = new RegExp( + '^[' + + 'a-zA-Z0-9_.@#$%&*()' + // Basic Latin characters and symbols + '\\p{Script=Latin}' + // Latin script characters + '\\p{Script=Common}' + // Characters common across scripts + '\\p{Script=Cyrillic}' + // Cyrillic script for Russian, etc. + '\\p{Script=Devanagari}' + // Devanagari script for Hindi, etc. + '\\p{Script=Han}' + // Han script for Chinese characters, etc. + '\\p{Script=Arabic}' + // Arabic script + '\\p{Script=Hiragana}' + // Hiragana script for Japanese + '\\p{Script=Katakana}' + // Katakana script for Japanese + '\\p{Script=Hangul}' + // Hangul script for Korean + ']+$', // End of string + 'u', // Use Unicode mode +); const injectionPatternsRegex = /('|--|\$ne|\$gt|\$lt|\$or|\{|\}|\*|;|<|>|\/|=)/i; const usernameSchema = z @@ -72,5 +75,4 @@ const registerSchema = z module.exports = { loginSchema, registerSchema, - errorsToString, }; diff --git a/api/strategies/validators.spec.js b/api/strategies/validators.spec.js index bd4e2192fbb..312f06923d5 100644 --- a/api/strategies/validators.spec.js +++ b/api/strategies/validators.spec.js @@ -1,4 +1,6 @@ -const { loginSchema, registerSchema, errorsToString } = require('./validators'); +// file deepcode ignore NoHardcodedPasswords: No hard-coded passwords in tests +const { errorsToString } = require('librechat-data-provider'); +const { loginSchema, registerSchema } = require('./validators'); describe('Zod Schemas', () => { describe('loginSchema', () => { @@ -402,9 +404,6 @@ describe('Zod Schemas', () => { it('should reject invalid usernames', () => { const invalidUsernames = [ - 'Дмитрий', // Cyrillic characters - 'محمد', // Arabic characters - '张伟', // Chinese characters 'john{doe}', // Contains `{` and `}` 'j', // Only one character 'a'.repeat(81), // More than 80 characters diff --git a/api/typedefs.js b/api/typedefs.js index 7bb956c9aec..e844e1eb909 100644 --- a/api/typedefs.js +++ b/api/typedefs.js @@ -8,12 +8,234 @@ * @memberof typedefs */ +/** + * @exports Anthropic + * @typedef {import('@anthropic-ai/sdk').default} Anthropic + * @memberof typedefs + */ + +/** + * @exports AssistantStreamEvent + * @typedef {import('openai').default.Beta.AssistantStreamEvent} AssistantStreamEvent + * @memberof typedefs + */ + +/** + * @exports AssistantStream + * @typedef {AsyncIterable} AssistantStream + * @memberof typedefs + */ + +/** + * @exports RunCreateAndStreamParams + * @typedef {import('openai').OpenAI.Beta.Threads.RunCreateAndStreamParams} RunCreateAndStreamParams + * @memberof typedefs + */ + +/** + * @exports ChatCompletionContentPartImage + * @typedef {import('openai').OpenAI.ChatCompletionContentPartImage} ChatCompletionContentPartImage + * @memberof typedefs + */ + +/** + * @exports ChatCompletion + * @typedef {import('openai').OpenAI.ChatCompletion} ChatCompletion + * @memberof typedefs + */ + +/** + * @exports ChatCompletionPayload + * @typedef {import('openai').OpenAI.ChatCompletionCreateParams} ChatCompletionPayload + * @memberof typedefs + */ + +/** + * @exports ChatCompletionMessages + * @typedef {import('openai').OpenAI.ChatCompletionMessageParam} ChatCompletionMessages + * @memberof typedefs + */ + +/** + * @exports CohereChatStreamRequest + * @typedef {import('cohere-ai').Cohere.ChatStreamRequest} CohereChatStreamRequest + * @memberof typedefs + */ + +/** + * @exports CohereChatRequest + * @typedef {import('cohere-ai').Cohere.ChatRequest} CohereChatRequest + * @memberof typedefs + */ + +/** + * @exports OpenAIRequestOptions + * @typedef {import('openai').OpenAI.RequestOptions} OpenAIRequestOptions + * @memberof typedefs + */ + +/** + * @exports ThreadCreated + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadCreated} ThreadCreated + * @memberof typedefs + */ + +/** + * @exports ThreadRunCreated + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunCreated} ThreadRunCreated + * @memberof typedefs + */ + +/** + * @exports ThreadRunQueued + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunQueued} ThreadRunQueued + * @memberof typedefs + */ + +/** + * @exports ThreadRunInProgress + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunInProgress} ThreadRunInProgress + * @memberof typedefs + */ + +/** + * @exports ThreadRunRequiresAction + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunRequiresAction} ThreadRunRequiresAction + * @memberof typedefs + */ + +/** + * @exports ThreadRunCompleted + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunCompleted} ThreadRunCompleted + * @memberof typedefs + */ + +/** + * @exports ThreadRunFailed + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunFailed} ThreadRunFailed + * @memberof typedefs + */ + +/** + * @exports ThreadRunCancelling + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunCancelling} ThreadRunCancelling + * @memberof typedefs + */ + +/** + * @exports ThreadRunCancelled + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunCancelled} ThreadRunCancelled + * @memberof typedefs + */ + +/** + * @exports ThreadRunExpired + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunExpired} ThreadRunExpired + * @memberof typedefs + */ + +/** + * @exports ThreadRunStepCreated + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunStepCreated} ThreadRunStepCreated + * @memberof typedefs + */ + +/** + * @exports ThreadRunStepInProgress + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunStepInProgress} ThreadRunStepInProgress + * @memberof typedefs + */ + +/** + * @exports ThreadRunStepDelta + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunStepDelta} ThreadRunStepDelta + * @memberof typedefs + */ + +/** + * @exports ThreadRunStepCompleted + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunStepCompleted} ThreadRunStepCompleted + * @memberof typedefs + */ + +/** + * @exports ThreadRunStepFailed + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunStepFailed} ThreadRunStepFailed + * @memberof typedefs + */ + +/** + * @exports ThreadRunStepCancelled + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunStepCancelled} ThreadRunStepCancelled + * @memberof typedefs + */ + +/** + * @exports ThreadRunStepExpired + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadRunStepExpired} ThreadRunStepExpired + * @memberof typedefs + */ + +/** + * @exports ThreadMessageCreated + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadMessageCreated} ThreadMessageCreated + * @memberof typedefs + */ + +/** + * @exports ThreadMessageInProgress + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadMessageInProgress} ThreadMessageInProgress + * @memberof typedefs + */ + +/** + * @exports ThreadMessageDelta + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadMessageDelta} ThreadMessageDelta + * @memberof typedefs + */ + +/** + * @exports ThreadMessageCompleted + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadMessageCompleted} ThreadMessageCompleted + * @memberof typedefs + */ + +/** + * @exports ThreadMessageIncomplete + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ThreadMessageIncomplete} ThreadMessageIncomplete + * @memberof typedefs + */ + +/** + * @exports ErrorEvent + * @typedef {import('openai').default.Beta.AssistantStreamEvent.ErrorEvent} ErrorEvent + * @memberof typedefs + */ + +/** + * @exports ToolCallDeltaObject + * @typedef {import('openai').default.Beta.Threads.Runs.Steps.ToolCallDeltaObject} ToolCallDeltaObject + * @memberof typedefs + */ + +/** + * @exports ToolCallDelta + * @typedef {import('openai').default.Beta.Threads.Runs.Steps.ToolCallDelta} ToolCallDelta + * @memberof typedefs + */ + /** * @exports Assistant * @typedef {import('librechat-data-provider').Assistant} Assistant * @memberof typedefs */ +/** + * @exports AssistantDocument + * @typedef {import('librechat-data-provider').AssistantDocument} AssistantDocument + * @memberof typedefs + */ + /** * @exports OpenAIFile * @typedef {import('librechat-data-provider').File} OpenAIFile @@ -26,12 +248,83 @@ * @memberof typedefs */ +/** + * @exports TAzureModelConfig + * @typedef {import('librechat-data-provider').TAzureModelConfig} TAzureModelConfig + * @memberof typedefs + */ + +/** + * @exports TAzureGroup + * @typedef {import('librechat-data-provider').TAzureGroup} TAzureGroup + * @memberof typedefs + */ + +/** + * @exports TAzureGroups + * @typedef {import('librechat-data-provider').TAzureGroups} TAzureGroups + * @memberof typedefs + */ + +/** + * @exports TAzureModelGroupMap + * @typedef {import('librechat-data-provider').TAzureModelGroupMap} TAzureModelGroupMap + * @memberof typedefs + */ +/** + * @exports TAzureGroupMap + * @typedef {import('librechat-data-provider').TAzureGroupMap} TAzureGroupMap + * @memberof typedefs + */ + +/** + * @exports TAzureConfig + * @typedef {import('librechat-data-provider').TAzureConfig} TAzureConfig + * @memberof typedefs + */ + +/** + * @exports TModelsConfig + * @typedef {import('librechat-data-provider').TModelsConfig} TModelsConfig + * @memberof typedefs + */ + +/** + * @exports TPlugin + * @typedef {import('librechat-data-provider').TPlugin} TPlugin + * @memberof typedefs + */ + +/** + * @exports TCustomConfig + * @typedef {import('librechat-data-provider').TCustomConfig} TCustomConfig + * @memberof typedefs + */ + +/** + * @exports TEndpoint + * @typedef {import('librechat-data-provider').TEndpoint} TEndpoint + * @memberof typedefs + */ + +/** + * @exports TEndpointsConfig + * @typedef {import('librechat-data-provider').TEndpointsConfig} TEndpointsConfig + * @memberof typedefs + */ + /** * @exports TMessage * @typedef {import('librechat-data-provider').TMessage} TMessage * @memberof typedefs */ +/** + * @exports TPlugin + * @typedef {import('librechat-data-provider').TPlugin} TPlugin + * @memberof typedefs + */ + /** * @exports FileSources * @typedef {import('librechat-data-provider').FileSources} FileSources @@ -39,12 +332,75 @@ */ /** - * @exports ImageMetadata - * @typedef {Object} ImageMetadata + * @exports TMessage + * @typedef {import('librechat-data-provider').TMessage} TMessage + * @memberof typedefs + */ + +/** + * @exports ImageFile + * @typedef {import('librechat-data-provider').ImageFile} ImageFile + * @memberof typedefs + */ + +/** + * @exports TMessageContentParts + * @typedef {import('librechat-data-provider').TMessageContentParts} TMessageContentParts + * @memberof typedefs + */ + +/** + * @exports StreamContentData + * @typedef {import('librechat-data-provider').StreamContentData} StreamContentData + * @memberof typedefs + */ + +/** + * @exports ActionRequest + * @typedef {import('librechat-data-provider').ActionRequest} ActionRequest + * @memberof typedefs + */ + +/** + * @exports Action + * @typedef {import('librechat-data-provider').Action} Action + * @memberof typedefs + */ + +/** + * @exports ActionMetadata + * @typedef {import('librechat-data-provider').ActionMetadata} ActionMetadata + * @memberof typedefs + */ + +/** + * @exports ActionAuth + * @typedef {import('librechat-data-provider').ActionAuth} ActionAuth + * @memberof typedefs + */ + +/** + * @exports DeleteFilesBody + * @typedef {import('librechat-data-provider').DeleteFilesBody} DeleteFilesBody + * @memberof typedefs + */ + +/** + * @exports FileMetadata + * @typedef {Object} FileMetadata * @property {string} file_id - The identifier of the file. * @property {string} [temp_file_id] - The temporary identifier of the file. + * @property {string} endpoint - The conversation endpoint origin for the file upload. + * @property {string} [assistant_id] - The assistant ID if file upload is in the `knowledge` context. + * @memberof typedefs + */ + +/** + * @typedef {Object} ImageOnlyMetadata * @property {number} width - The width of the image. * @property {number} height - The height of the image. + * + * @typedef {FileMetadata & ImageOnlyMetadata} ImageMetadata * @memberof typedefs */ @@ -54,6 +410,18 @@ * @memberof typedefs */ +/** + * @exports uploadImageBuffer + * @typedef {import('~/server/services/Files/process').uploadImageBuffer} uploadImageBuffer + * @memberof typedefs + */ + +/** + * @exports processFileURL + * @typedef {import('~/server/services/Files/process').processFileURL} processFileURL + * @memberof typedefs + */ + /** * @exports AssistantCreateParams * @typedef {import('librechat-data-provider').AssistantCreateParams} AssistantCreateParams @@ -78,21 +446,154 @@ * @memberof typedefs */ +/** + * @exports ContentPart + * @typedef {import('librechat-data-provider').ContentPart} ContentPart + * @memberof typedefs + */ + +/** + * @exports StepTypes + * @typedef {import('librechat-data-provider').StepTypes} StepTypes + * @memberof typedefs + */ + +/** + * @exports TContentData + * @typedef {import('librechat-data-provider').TContentData} TContentData + * @memberof typedefs + */ + +/** + * @exports ContentPart + * @typedef {import('librechat-data-provider').ContentPart} ContentPart + * @memberof typedefs + */ + +/** + * @exports PartMetadata + * @typedef {import('librechat-data-provider').PartMetadata} PartMetadata + * @memberof typedefs + */ + /** * @exports ThreadMessage - * @typedef {import('openai').OpenAI.Beta.Threads.ThreadMessage} ThreadMessage + * @typedef {import('openai').OpenAI.Beta.Threads.Message} ThreadMessage + * @memberof typedefs + */ + +/** + * @exports Annotation + * @typedef {import('openai').OpenAI.Beta.Threads.Messages.Annotation} Annotation + * @memberof typedefs + */ + +/** + * @exports TAssistantEndpoint + * @typedef {import('librechat-data-provider').TAssistantEndpoint} TAssistantEndpoint + * @memberof typedefs + */ + +/** + * Represents details of the message creation by the run step, including the ID of the created message. + * + * @exports MessageCreationStepDetails + * @typedef {Object} MessageCreationStepDetails + * @property {Object} message_creation - Details of the message creation. + * @property {string} message_creation.message_id - The ID of the message that was created by this run step. + * @property {'message_creation'} type - Always 'message_creation'. + * @memberof typedefs + */ + +/** + * Represents a text log output from the Code Interpreter tool call. + * @typedef {Object} CodeLogOutput + * @property {'logs'} type - Always 'logs'. + * @property {string} logs - The text output from the Code Interpreter tool call. + */ + +/** + * Represents an image output from the Code Interpreter tool call. + * @typedef {Object} CodeImageOutput + * @property {'image'} type - Always 'image'. + * @property {Object} image - The image object. + * @property {string} image.file_id - The file ID of the image. + */ + +/** + * Details of the Code Interpreter tool call the run step was involved in. + * Includes the tool call ID, the code interpreter definition, and the type of tool call. + * + * @typedef {Object} CodeToolCall + * @property {string} id - The ID of the tool call. + * @property {Object} code_interpreter - The Code Interpreter tool call definition. + * @property {string} code_interpreter.input - The input to the Code Interpreter tool call. + * @property {Array<(CodeLogOutput | CodeImageOutput)>} code_interpreter.outputs - The outputs from the Code Interpreter tool call. + * @property {'code_interpreter'} type - The type of tool call, always 'code_interpreter'. + * @memberof typedefs + */ + +/** + * Details of a Function tool call the run step was involved in. + * Includes the tool call ID, the function definition, and the type of tool call. + * + * @typedef {Object} FunctionToolCall + * @property {string} id - The ID of the tool call object. + * @property {Object} function - The definition of the function that was called. + * @property {string} function.arguments - The arguments passed to the function. + * @property {string} function.name - The name of the function. + * @property {string|null} function.output - The output of the function, null if not submitted. + * @property {'function'} type - The type of tool call, always 'function'. * @memberof typedefs */ /** + * Details of a Retrieval tool call the run step was involved in. + * Includes the tool call ID and the type of tool call. + * + * @typedef {Object} RetrievalToolCall + * @property {string} id - The ID of the tool call object. + * @property {unknown} retrieval - An empty object for now. + * @property {'retrieval'} type - The type of tool call, always 'retrieval'. + * @memberof typedefs + */ + +/** + * Details of the tool calls involved in a run step. + * Can be associated with one of three types of tools: `code_interpreter`, `retrieval`, or `function`. + * + * @typedef {Object} ToolCallsStepDetails + * @property {Array} tool_calls - An array of tool calls the run step was involved in. + * @property {'tool_calls'} type - Always 'tool_calls'. + * @memberof typedefs + */ + +/** + * Details of the tool calls involved in a run step. + * Can be associated with one of three types of tools: `code_interpreter`, `retrieval`, or `function`. + * + * @exports StepToolCall + * @typedef {(CodeToolCall | RetrievalToolCall | FunctionToolCall) & PartMetadata} StepToolCall + * @memberof typedefs + */ + +/** + * Represents a tool call object required for certain actions in the OpenAI API, + * including the function definition and type of the tool call. + * * @exports RequiredActionFunctionToolCall - * @typedef {import('openai').OpenAI.Beta.Threads.RequiredActionFunctionToolCall} RequiredActionFunctionToolCall + * @typedef {Object} RequiredActionFunctionToolCall + * @property {string} id - The ID of the tool call, referenced when submitting tool outputs. + * @property {Object} function - The function definition associated with the tool call. + * @property {string} function.arguments - The arguments that the model expects to be passed to the function. + * @property {string} function.name - The name of the function. + * @property {'function'} type - The type of tool call the output is required for, currently always 'function'. * @memberof typedefs */ /** * @exports RunManager - * @typedef {import('./server/services/Runs/RunMananger.js').RunManager} RunManager + * @typedef {import('./server/services/Runs/RunManager.js').RunManager} RunManager * @memberof typedefs */ @@ -100,7 +601,7 @@ * @exports Thread * @typedef {Object} Thread * @property {string} id - The identifier of the thread. - * @property {string} object - The object type, always 'thread'. + * @property {'thread'} object - The object type, always 'thread'. * @property {number} created_at - The Unix timestamp (in seconds) for when the thread was created. * @property {Object} [metadata] - Optional metadata associated with the thread. * @property {Message[]} [messages] - An array of messages associated with the thread. @@ -111,12 +612,12 @@ * @exports Message * @typedef {Object} Message * @property {string} id - The identifier of the message. - * @property {string} object - The object type, always 'thread.message'. + * @property {'thread.message'} object - The object type, always 'thread.message'. * @property {number} created_at - The Unix timestamp (in seconds) for when the message was created. * @property {string} thread_id - The thread ID that this message belongs to. - * @property {string} role - The entity that produced the message. One of 'user' or 'assistant'. + * @property {'user'|'assistant'} role - The entity that produced the message. One of 'user' or 'assistant'. * @property {Object[]} content - The content of the message in an array of text and/or images. - * @property {string} content[].type - The type of content, either 'text' or 'image_file'. + * @property {'text'|'image_file'} content[].type - The type of content, either 'text' or 'image_file'. * @property {Object} [content[].text] - The text content, present if type is 'text'. * @property {string} content[].text.value - The data that makes up the text. * @property {Object[]} [content[].text.annotations] - Annotations for the text content. @@ -158,7 +659,7 @@ /** * @exports FunctionTool * @typedef {Object} FunctionTool - * @property {string} type - The type of tool, 'function'. + * @property {'function'} type - The type of tool, 'function'. * @property {Object} function - The function definition. * @property {string} function.description - A description of what the function does. * @property {string} function.name - The name of the function to be called. @@ -169,7 +670,7 @@ /** * @exports Tool * @typedef {Object} Tool - * @property {string} type - The type of tool, can be 'code_interpreter', 'retrieval', or 'function'. + * @property {'code_interpreter'|'retrieval'|'function'} type - The type of tool, can be 'code_interpreter', 'retrieval', or 'function'. * @property {FunctionTool} [function] - The function tool, present if type is 'function'. * @memberof typedefs */ @@ -182,7 +683,7 @@ * @property {number} created_at - The Unix timestamp (in seconds) for when the run was created. * @property {string} thread_id - The ID of the thread that was executed on as a part of this run. * @property {string} assistant_id - The ID of the assistant used for execution of this run. - * @property {string} status - The status of the run (e.g., 'queued', 'completed'). + * @property {'queued'|'in_progress'|'requires_action'|'cancelling'|'cancelled'|'failed'|'completed'|'expired'} status - The status of the run: queued, in_progress, requires_action, cancelling, cancelled, failed, completed, or expired. * @property {Object} [required_action] - Details on the action required to continue the run. * @property {string} required_action.type - The type of required action, always 'submit_tool_outputs'. * @property {Object} required_action.submit_tool_outputs - Details on the tool outputs needed for the run to continue. @@ -202,9 +703,15 @@ * @property {number} [completed_at] - The Unix timestamp (in seconds) for when the run was completed. * @property {string} [model] - The model that the assistant used for this run. * @property {string} [instructions] - The instructions that the assistant used for this run. + * @property {string} [additional_instructions] - Optional. Appends additional instructions + * at theend of the instructions for the run. This is useful for modifying * @property {Tool[]} [tools] - The list of tools used for this run. * @property {string[]} [file_ids] - The list of File IDs used for this run. * @property {Object} [metadata] - Metadata associated with this run. + * @property {Object} [usage] - Usage statistics related to the run. This value will be `null` if the run is not in a terminal state (i.e. `in_progress`, `queued`, etc.). + * @property {number} [usage.completion_tokens] - Number of completion tokens used over the course of the run. + * @property {number} [usage.prompt_tokens] - Number of prompt tokens used over the course of the run. + * @property {number} [usage.total_tokens] - Total number of tokens used (prompt + completion). * @memberof typedefs */ @@ -217,11 +724,11 @@ * @property {string} assistant_id - The ID of the assistant associated with the run step. * @property {string} thread_id - The ID of the thread that was run. * @property {string} run_id - The ID of the run that this run step is a part of. - * @property {string} type - The type of run step, either 'message_creation' or 'tool_calls'. - * @property {string} status - The status of the run step, can be 'in_progress', 'cancelled', 'failed', 'completed', or 'expired'. - * @property {Object} step_details - The details of the run step. + * @property {'message_creation' | 'tool_calls'} type - The type of run step. + * @property {'in_progress' | 'cancelled' | 'failed' | 'completed' | 'expired'} status - The status of the run step. + * @property {MessageCreationStepDetails | ToolCallsStepDetails} step_details - The details of the run step. * @property {Object} [last_error] - The last error associated with this run step. - * @property {string} last_error.code - One of 'server_error' or 'rate_limit_exceeded'. + * @property {'server_error' | 'rate_limit_exceeded'} last_error.code - One of 'server_error' or 'rate_limit_exceeded'. * @property {string} last_error.message - A human-readable description of the error. * @property {number} [expired_at] - The Unix timestamp (in seconds) for when the run step expired. * @property {number} [cancelled_at] - The Unix timestamp (in seconds) for when the run step was cancelled. @@ -241,8 +748,8 @@ * @property {string} assistant_id - The ID of the assistant associated with the run step. * @property {string} thread_id - The ID of the thread that was run. * @property {string} run_id - The ID of the run that this run step is a part of. - * @property {string} type - The type of run step, either 'message_creation' or 'tool_calls'. - * @property {string} status - The status of the run step, can be 'in_progress', 'cancelled', 'failed', 'completed', or 'expired'. + * @property {'message_creation'|'tool_calls'} type - The type of run step, either 'message_creation' or 'tool_calls'. + * @property {'in_progress'|'cancelled'|'failed'|'completed'|'expired'} status - The status of the run step, can be 'in_progress', 'cancelled', 'failed', 'completed', or 'expired'. * @property {Object} step_details - The details of the run step. * @property {Object} [last_error] - The last error associated with this run step. * @property {string} last_error.code - One of 'server_error' or 'rate_limit_exceeded'. @@ -350,6 +857,41 @@ * @memberof typedefs */ +/** + * @exports RequiredAction + * @typedef {Object} RequiredAction + * @property {string} tool - The name of the function. + * @property {Object} toolInput - The args to invoke the function with. + * @property {string} toolCallId - The ID of the tool call. + * @property {Run['id']} run_id - Run identifier. + * @property {Thread['id']} thread_id - Thread identifier. + * @memberof typedefs + */ + +/** + * @exports StructuredTool + * @typedef {Object} StructuredTool + * @property {string} name - The name of the function. + * @property {string} description - The description of the function. + * @property {import('zod').ZodTypeAny} schema - The structured zod schema. + * @memberof typedefs + */ + +/** + * @exports ToolOutput + * @typedef {Object} ToolOutput + * @property {string} tool_call_id - The ID of the tool call. + * @property {Object} output - The output of the tool, which can vary in structure. + * @memberof typedefs + */ + +/** + * @exports ToolOutputs + * @typedef {Object} ToolOutputs + * @property {ToolOutput[]} tool_outputs - Array of tool outputs. + * @memberof typedefs + */ + /** * @typedef {Object} ModelOptions * @property {string} modelName - The name of the model. @@ -385,3 +927,203 @@ * @property {string} [azureOpenAIApiVersion] - The Azure OpenAI API version. * @memberof typedefs */ + +/** + * @typedef {Object} TokenConfig + * A configuration object mapping model keys to their respective prompt, completion rates, and context limit. + * @property {number} prompt - The prompt rate + * @property {number} completion - The completion rate + * @property {number} context - The maximum context length supported by the model. + * @memberof typedefs + */ + +/** + * @typedef {Record} EndpointTokenConfig + * An endpoint's config object mapping model keys to their respective prompt, completion rates, and context limit. + * @memberof typedefs + */ + +/** + * @typedef {Object} ResponseMessage + * @property {string} conversationId - The ID of the conversation. + * @property {string} thread_id - The ID of the thread. + * @property {string} messageId - The ID of the message (from LibreChat). + * @property {string} parentMessageId - The ID of the parent message. + * @property {string} user - The ID of the user. + * @property {string} assistant_id - The ID of the assistant. + * @property {string} role - The role of the response. + * @property {string} model - The model used in the response. + * @property {ContentPart[]} content - The content parts accumulated from the run. + * @memberof typedefs + */ + +/** + * @typedef {Object} RunResponse + * @property {Run} run - The detailed information about the run. + * @property {RunStep[]} steps - An array of steps taken during the run. + * @property {StepMessage[]} messages - An array of messages related to the run. + * @property {ResponseMessage} finalMessage - The final response message, with all content parts. + * @property {string} text - The final response text, accumulated from message parts + * @memberof typedefs + */ + +/** + * @callback InProgressFunction + * @param {Object} params - The parameters for the in progress step. + * @param {RunStep} params.step - The step object with details about the message creation. + * @returns {Promise} - A promise that resolves when the step is processed. + * @memberof typedefs + */ + +// /** +// * @typedef {OpenAI & { +// * req: Express.Request, +// * res: Express.Response +// * getPartialText: () => string, +// * processedFileIds: Set, +// * mappedOrder: Map, +// * completeToolCallSteps: Set, +// * seenCompletedMessages: Set, +// * seenToolCalls: Map, +// * progressCallback: (options: Object) => void, +// * addContentData: (data: TContentData) => void, +// * responseMessage: ResponseMessage, +// * }} OpenAIClient - for reference only +// */ + +/** + * @typedef {Object} RunClient + * + * @property {Express.Request} req - The Express request object. + * @property {Express.Response} res - The Express response object. + * @property {?import('https-proxy-agent').HttpsProxyAgent} httpAgent - An optional HTTP proxy agent for the request. + + * @property {() => string} getPartialText - Retrieves the current tokens accumulated by `progressCallback`. + * + * Note: not used until real streaming is implemented by OpenAI. + * + * @property {string} responseText -The accumulated text values for the current run. + * @property {Set} processedFileIds - A set of IDs for processed files. + * @property {Map} mappedOrder - A map to maintain the order of individual `tool_calls` and `steps`. + * @property {Set} [attachedFileIds] - A set of user attached file ids; necessary to track which files are downloadable. + * @property {Set} completeToolCallSteps - A set of completed tool call steps. + * @property {Set} seenCompletedMessages - A set of completed messages that have been seen/processed. + * @property {Map} seenToolCalls - A map of tool calls that have been seen/processed. + * @property {object | undefined} locals - Local variables for the request. + * @property {AzureOptions} locals.azureOptions - Local Azure options for the request. + * @property {(data: TContentData) => void} addContentData - Updates the response message's relevant + * @property {InProgressFunction} in_progress - Updates the response message's relevant + * content array with the part by index & sends intermediate SSE message with content data. + * + * Note: does not send intermediate SSE message for messages, which are streamed + * (may soon be streamed) directly from OpenAI API. + * + * @property {ResponseMessage} responseMessage - A message object for responses. + * + * @typedef {OpenAI & RunClient} OpenAIClient + */ + +/** + * The body of the request to create a run, specifying the assistant, model, + * instructions, and any additional parameters needed for the run. + * + * @typedef {Object} CreateRunBody + * @property {string} assistant_id - The ID of the assistant to use for this run. + * @property {string} [model] - Optional. The ID of the model to be used for this run. + * @property {string} [instructions] - Optional. Override the default system message of the assistant. + * @property {string} [additional_instructions] - Optional. Appends additional instructions + * at the end of the instructions for the run. Useful for modifying behavior on a per-run basis without overriding other instructions. + * @property {Object[]} [tools] - Optional. Override the tools the assistant can use for this run. Should include tool call ID and the type of tool call. + * @property {string[]} [file_ids] - Optional. List of File IDs the assistant can use for this run. + * **Note:** The API seems to prefer files added to messages, not runs. + * @property {Object} [metadata] - Optional. Metadata for the run. + * @memberof typedefs + */ + +/** + * @typedef {Object} StreamRunManager + * Manages streaming and processing of run steps, messages, and tool calls within a thread. + * + * @property {number} index - Tracks the current index for step or message processing. + * @property {Map} steps - Stores run steps by their IDs. + * @property {Map} mappedOrder - Maps step or message IDs to their processing order index. + * @property {Map} orderedRunSteps - Stores run steps in order of processing. + * @property {Set} processedFileIds - Keeps track of file IDs that have been processed. + * @property {Map} progressCallbacks - Stores callbacks for reporting progress on step or message processing. + * @property {boolean} submittedToolOutputs - Indicates whether tool outputs have been submitted. + * @property {Object|null} run - Holds the current run object. + * @property {Object} req - The HTTP request object associated with the run. + * @property {Object} res - The HTTP response object for sending back data. + * @property {Object} openai - The OpenAI client instance. + * @property {string} apiKey - The API key used for OpenAI requests. + * @property {string} thread_id - The ID of the thread associated with the run. + * @property {Object} initialRunBody - The initial body of the run request. + * @property {Object.} clientHandlers - Custom handlers provided by the client. + * @property {Object} streamOptions - Options for streaming the run. + * @property {Object} finalMessage - The final message object to be constructed and sent. + * @property {Array} messages - An array of messages processed during the run. + * @property {string} text - Accumulated text from text content data. + * @property {Object.} handlers - Internal event handlers for different types of streaming events. + * + * @method addContentData Adds content data to the final message or sends it immediately depending on type. + * @method runAssistant Initializes and manages the streaming of a thread run. + * @method handleEvent Dispatches streaming events to the appropriate handlers. + * @method handleThreadCreated Handles the event when a thread is created. + * @method handleRunEvent Handles various run state events. + * @method handleRunStepEvent Handles events related to individual run steps. + * @method handleCodeImageOutput Processes and handles code-generated image outputs. + * @method createToolCallStream Initializes streaming for tool call outputs. + * @method handleNewToolCall Handles the creation of a new tool call within a run step. + * @method handleCompletedToolCall Handles the completion of tool call processing. + * @method handleRunStepDeltaEvent Handles updates (deltas) for run steps. + * @method handleMessageDeltaEvent Handles updates (deltas) for messages. + * @method handleErrorEvent Handles error events during streaming. + * @method getStepIndex Retrieves or assigns an index for a given step or message key. + * @method generateToolCallKey Generates a unique key for a tool call within a step. + * @method onRunRequiresAction Handles actions required by a run to proceed. + * @method onRunStepCreated Handles the creation of a new run step. + * @method onRunStepCompleted Handles the completion of a run step. + * @method handleMessageEvent Handles events related to messages within the run. + * @method messageCompleted Handles the completion of a message processing. + */ + +/* Native app/client methods */ + +/** + * Accumulates tokens and sends them to the client for processing. + * @callback onTokenProgress + * @param {string} token - The current token generated by the model. + * @returns {Promise} + * @memberof typedefs + */ + +/** + * Main entrypoint for API completion calls + * @callback sendCompletion + * @param {Array | string} payload - The messages or prompt to send to the model + * @param {object} opts - Options for the completion + * @param {onTokenProgress} opts.onProgress - Callback function to handle token progress + * @param {AbortController} opts.abortController - AbortController instance + * @returns {Promise} + * @memberof typedefs + */ + +/** + * Legacy completion handler for OpenAI API. + * @callback getCompletion + * @param {Array | string} input - Array of messages or a single prompt string + * @param {(event: object | string) => Promise} onProgress - SSE progress handler + * @param {onTokenProgress} onTokenProgress - Token progress handler + * @param {AbortController} [abortController] - AbortController instance + * @returns {Promise} - Completion response + * @memberof typedefs + */ + +/** + * Cohere Stream handling. Note: abortController is not supported here. + * @callback cohereChatCompletion + * @param {object} params + * @param {CohereChatStreamRequest | CohereChatRequest} params.payload + * @param {onTokenProgress} params.onTokenProgress + * @memberof typedefs + */ diff --git a/api/utils/azureUtils.js b/api/utils/azureUtils.js index 8083ff4fb3b..91d62b20e5e 100644 --- a/api/utils/azureUtils.js +++ b/api/utils/azureUtils.js @@ -6,7 +6,7 @@ const { isEnabled } = require('~/server/utils'); * @returns {string} The sanitized model name. */ const sanitizeModelName = (modelName) => { - // Replace periods with empty strings and other disallowed characters as needed + // Replace periods with empty strings and other disallowed characters as needed. return modelName.replace(/\./g, ''); }; @@ -84,16 +84,19 @@ const getAzureCredentials = () => { * * @param {Object} params - The parameters object. * @param {string} params.baseURL - The baseURL to inspect for replacement placeholders. - * @param {AzureOptions} params.azure - The baseURL to inspect for replacement placeholders. + * @param {AzureOptions} params.azureOptions - The azure options object containing the instance and deployment names. * @returns {string} The complete baseURL with credentials injected for the Azure OpenAI API. */ -function constructAzureURL({ baseURL, azure }) { +function constructAzureURL({ baseURL, azureOptions }) { let finalURL = baseURL; // Replace INSTANCE_NAME and DEPLOYMENT_NAME placeholders with actual values if available - if (azure) { - finalURL = finalURL.replace('${INSTANCE_NAME}', azure.azureOpenAIApiInstanceName ?? ''); - finalURL = finalURL.replace('${DEPLOYMENT_NAME}', azure.azureOpenAIApiDeploymentName ?? ''); + if (azureOptions) { + finalURL = finalURL.replace('${INSTANCE_NAME}', azureOptions.azureOpenAIApiInstanceName ?? ''); + finalURL = finalURL.replace( + '${DEPLOYMENT_NAME}', + azureOptions.azureOpenAIApiDeploymentName ?? '', + ); } return finalURL; diff --git a/api/utils/azureUtils.spec.js b/api/utils/azureUtils.spec.js index 77db26b0911..4d844513856 100644 --- a/api/utils/azureUtils.spec.js +++ b/api/utils/azureUtils.spec.js @@ -199,7 +199,7 @@ describe('constructAzureURL', () => { test('replaces both placeholders when both properties are provided', () => { const url = constructAzureURL({ baseURL: 'https://example.com/${INSTANCE_NAME}/${DEPLOYMENT_NAME}', - azure: { + azureOptions: { azureOpenAIApiInstanceName: 'instance1', azureOpenAIApiDeploymentName: 'deployment1', }, @@ -210,7 +210,7 @@ describe('constructAzureURL', () => { test('replaces only INSTANCE_NAME when only azureOpenAIApiInstanceName is provided', () => { const url = constructAzureURL({ baseURL: 'https://example.com/${INSTANCE_NAME}/${DEPLOYMENT_NAME}', - azure: { + azureOptions: { azureOpenAIApiInstanceName: 'instance2', }, }); @@ -220,7 +220,7 @@ describe('constructAzureURL', () => { test('replaces only DEPLOYMENT_NAME when only azureOpenAIApiDeploymentName is provided', () => { const url = constructAzureURL({ baseURL: 'https://example.com/${INSTANCE_NAME}/${DEPLOYMENT_NAME}', - azure: { + azureOptions: { azureOpenAIApiDeploymentName: 'deployment2', }, }); @@ -230,12 +230,12 @@ describe('constructAzureURL', () => { test('does not replace any placeholders when azure object is empty', () => { const url = constructAzureURL({ baseURL: 'https://example.com/${INSTANCE_NAME}/${DEPLOYMENT_NAME}', - azure: {}, + azureOptions: {}, }); expect(url).toBe('https://example.com//'); }); - test('returns baseURL as is when azure object is not provided', () => { + test('returns baseURL as is when `azureOptions` object is not provided', () => { const url = constructAzureURL({ baseURL: 'https://example.com/${INSTANCE_NAME}/${DEPLOYMENT_NAME}', }); @@ -245,7 +245,7 @@ describe('constructAzureURL', () => { test('returns baseURL as is when no placeholders are set', () => { const url = constructAzureURL({ baseURL: 'https://example.com/my_custom_instance/my_deployment', - azure: { + azureOptions: { azureOpenAIApiInstanceName: 'instance1', azureOpenAIApiDeploymentName: 'deployment1', }, @@ -258,7 +258,7 @@ describe('constructAzureURL', () => { 'https://${INSTANCE_NAME}.openai.azure.com/openai/deployments/${DEPLOYMENT_NAME}'; const url = constructAzureURL({ baseURL, - azure: { + azureOptions: { azureOpenAIApiInstanceName: 'instance1', azureOpenAIApiDeploymentName: 'deployment1', }, diff --git a/api/utils/extractBaseURL.js b/api/utils/extractBaseURL.js index 730473c4102..09bbb55056f 100644 --- a/api/utils/extractBaseURL.js +++ b/api/utils/extractBaseURL.js @@ -1,3 +1,5 @@ +const { CohereConstants } = require('librechat-data-provider'); + /** * Extracts a valid OpenAI baseURL from a given string, matching "url/v1," followed by an optional suffix. * The suffix can be one of several predefined values (e.g., 'openai', 'azure-openai', etc.), @@ -12,9 +14,17 @@ * - `https://api.example.com/v1/replicate` -> `https://api.example.com/v1/replicate` * * @param {string} url - The URL to be processed. - * @returns {string} The matched pattern or input if no match is found. + * @returns {string | undefined} The matched pattern or input if no match is found. */ function extractBaseURL(url) { + if (!url || typeof url !== 'string') { + return undefined; + } + + if (url.startsWith(CohereConstants.API_URL)) { + return null; + } + if (!url.includes('/v1')) { return url; } diff --git a/api/utils/index.js b/api/utils/index.js index a40c53b6aba..7b539cbb141 100644 --- a/api/utils/index.js +++ b/api/utils/index.js @@ -1,13 +1,15 @@ const loadYaml = require('./loadYaml'); const tokenHelpers = require('./tokens'); const azureUtils = require('./azureUtils'); +const logAxiosError = require('./logAxiosError'); const extractBaseURL = require('./extractBaseURL'); const findMessageContent = require('./findMessageContent'); module.exports = { - ...azureUtils, + loadYaml, ...tokenHelpers, + ...azureUtils, + logAxiosError, extractBaseURL, findMessageContent, - loadYaml, }; diff --git a/api/utils/logAxiosError.js b/api/utils/logAxiosError.js new file mode 100644 index 00000000000..17fac85f47d --- /dev/null +++ b/api/utils/logAxiosError.js @@ -0,0 +1,45 @@ +const { logger } = require('~/config'); + +/** + * Logs Axios errors based on the error object and a custom message. + * + * @param {Object} options - The options object. + * @param {string} options.message - The custom message to be logged. + * @param {Error} options.error - The Axios error object. + */ +const logAxiosError = ({ message, error }) => { + const timedOutMessage = 'Cannot read properties of undefined (reading \'status\')'; + if (error.response) { + logger.error( + `${message} The request was made and the server responded with a status code that falls out of the range of 2xx: ${ + error.message ? error.message : '' + }. Error response data:\n`, + { + headers: error.response?.headers, + status: error.response?.status, + data: error.response?.data, + }, + ); + } else if (error.request) { + logger.error( + `${message} The request was made but no response was received: ${ + error.message ? error.message : '' + }. Error Request:\n`, + { + request: error.request, + }, + ); + } else if (error?.message?.includes(timedOutMessage)) { + logger.error( + `${message}\nThe request either timed out or was unsuccessful. Error message:\n`, + error, + ); + } else { + logger.error( + `${message}\nSomething happened in setting up the request. Error message:\n`, + error, + ); + } +}; + +module.exports = logAxiosError; diff --git a/api/utils/tokens.js b/api/utils/tokens.js index ce6c51732aa..bc1a5a10f3a 100644 --- a/api/utils/tokens.js +++ b/api/utils/tokens.js @@ -1,3 +1,4 @@ +const z = require('zod'); const { EModelEndpoint } = require('librechat-data-provider'); const models = [ @@ -45,38 +46,61 @@ const openAIModels = { 'gpt-4-32k': 32758, // -10 from max 'gpt-4-32k-0314': 32758, // -10 from max 'gpt-4-32k-0613': 32758, // -10 from max - 'gpt-3.5-turbo': 4092, // -5 from max + 'gpt-4-1106': 127990, // -10 from max + 'gpt-4-0125': 127990, // -10 from max + 'gpt-4-turbo': 127990, // -10 from max + 'gpt-3.5-turbo': 16375, // -10 from max 'gpt-3.5-turbo-0613': 4092, // -5 from max 'gpt-3.5-turbo-0301': 4092, // -5 from max 'gpt-3.5-turbo-16k': 16375, // -10 from max 'gpt-3.5-turbo-16k-0613': 16375, // -10 from max 'gpt-3.5-turbo-1106': 16375, // -10 from max - 'gpt-4-1106': 127990, // -10 from max + 'gpt-3.5-turbo-0125': 16375, // -10 from max 'mistral-': 31990, // -10 from max }; +const cohereModels = { + 'command-light': 4086, // -10 from max + 'command-light-nightly': 8182, // -10 from max + command: 4086, // -10 from max + 'command-nightly': 8182, // -10 from max + 'command-r': 127500, // -500 from max + 'command-r-plus:': 127500, // -500 from max +}; + +const googleModels = { + /* Max I/O is combined so we subtract the amount from max response tokens for actual total */ + gemini: 32750, // -10 from max + 'text-bison-32k': 32758, // -10 from max + 'chat-bison-32k': 32758, // -10 from max + 'code-bison-32k': 32758, // -10 from max + 'codechat-bison-32k': 32758, + /* Codey, -5 from max: 6144 */ + 'code-': 6139, + 'codechat-': 6139, + /* PaLM2, -5 from max: 8192 */ + 'text-': 8187, + 'chat-': 8187, +}; + +const anthropicModels = { + 'claude-': 100000, + 'claude-2': 100000, + 'claude-2.1': 200000, + 'claude-3-haiku': 200000, + 'claude-3-sonnet': 200000, + 'claude-3-opus': 200000, +}; + +const aggregateModels = { ...openAIModels, ...googleModels, ...anthropicModels, ...cohereModels }; + // Order is important here: by model series and context size (gpt-4 then gpt-3, ascending) const maxTokensMap = { - [EModelEndpoint.openAI]: openAIModels, - [EModelEndpoint.custom]: openAIModels, - [EModelEndpoint.google]: { - /* Max I/O is combined so we subtract the amount from max response tokens for actual total */ - gemini: 32750, // -10 from max - 'text-bison-32k': 32758, // -10 from max - 'chat-bison-32k': 32758, // -10 from max - 'code-bison-32k': 32758, // -10 from max - 'codechat-bison-32k': 32758, - /* Codey, -5 from max: 6144 */ - 'code-': 6139, - 'codechat-': 6139, - /* PaLM2, -5 from max: 8192 */ - 'text-': 8187, - 'chat-': 8187, - }, - [EModelEndpoint.anthropic]: { - 'claude-2.1': 200000, - 'claude-': 100000, - }, + [EModelEndpoint.azureOpenAI]: openAIModels, + [EModelEndpoint.openAI]: aggregateModels, + [EModelEndpoint.custom]: aggregateModels, + [EModelEndpoint.google]: googleModels, + [EModelEndpoint.anthropic]: anthropicModels, }; /** @@ -85,6 +109,7 @@ const maxTokensMap = { * * @param {string} modelName - The name of the model to look up. * @param {string} endpoint - The endpoint (default is 'openAI'). + * @param {EndpointTokenConfig} [endpointTokenConfig] - Token Config for current endpoint to use for max tokens lookup * @returns {number|undefined} The maximum tokens for the given model or undefined if no match is found. * * @example @@ -92,16 +117,21 @@ const maxTokensMap = { * getModelMaxTokens('gpt-4-32k-unknown'); // Returns 32767 * getModelMaxTokens('unknown-model'); // Returns undefined */ -function getModelMaxTokens(modelName, endpoint = EModelEndpoint.openAI) { +function getModelMaxTokens(modelName, endpoint = EModelEndpoint.openAI, endpointTokenConfig) { if (typeof modelName !== 'string') { return undefined; } - const tokensMap = maxTokensMap[endpoint]; + /** @type {EndpointTokenConfig | Record} */ + const tokensMap = endpointTokenConfig ?? maxTokensMap[endpoint]; if (!tokensMap) { return undefined; } + if (tokensMap[modelName]?.context) { + return tokensMap[modelName].context; + } + if (tokensMap[modelName]) { return tokensMap[modelName]; } @@ -109,7 +139,8 @@ function getModelMaxTokens(modelName, endpoint = EModelEndpoint.openAI) { const keys = Object.keys(tokensMap); for (let i = keys.length - 1; i >= 0; i--) { if (modelName.includes(keys[i])) { - return tokensMap[keys[i]]; + const result = tokensMap[keys[i]]; + return result?.context ?? result; } } @@ -145,17 +176,70 @@ function matchModelName(modelName, endpoint = EModelEndpoint.openAI) { const keys = Object.keys(tokensMap); for (let i = keys.length - 1; i >= 0; i--) { - if (modelName.includes(keys[i])) { - return keys[i]; + const modelKey = keys[i]; + if (modelName.includes(modelKey)) { + return modelKey; } } return modelName; } +const modelSchema = z.object({ + id: z.string(), + pricing: z.object({ + prompt: z.string(), + completion: z.string(), + }), + context_length: z.number(), +}); + +const inputSchema = z.object({ + data: z.array(modelSchema), +}); + +/** + * Processes a list of model data from an API and organizes it into structured data based on URL and specifics of rates and context. + * @param {{ data: Array> }} input The input object containing base URL and data fetched from the API. + * @returns {EndpointTokenConfig} The processed model data. + */ +function processModelData(input) { + const validationResult = inputSchema.safeParse(input); + if (!validationResult.success) { + throw new Error('Invalid input data'); + } + const { data } = validationResult.data; + + /** @type {EndpointTokenConfig} */ + const tokenConfig = {}; + + for (const model of data) { + const modelKey = model.id; + if (modelKey === 'openrouter/auto') { + model.pricing = { + prompt: '0.00001', + completion: '0.00003', + }; + } + const prompt = parseFloat(model.pricing.prompt) * 1000000; + const completion = parseFloat(model.pricing.completion) * 1000000; + + tokenConfig[modelKey] = { + prompt, + completion, + context: model.context_length, + }; + } + + return tokenConfig; +} + module.exports = { tiktokenModels: new Set(models), maxTokensMap, + inputSchema, + modelSchema, getModelMaxTokens, matchModelName, + processModelData, }; diff --git a/api/utils/tokens.spec.js b/api/utils/tokens.spec.js index 2cb7985d312..641b300458a 100644 --- a/api/utils/tokens.spec.js +++ b/api/utils/tokens.spec.js @@ -80,6 +80,23 @@ describe('getModelMaxTokens', () => { ); }); + // 01/25 Update + test('should return correct tokens for gpt-4-turbo/0125 matches', () => { + expect(getModelMaxTokens('gpt-4-turbo')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-4-turbo'], + ); + expect(getModelMaxTokens('gpt-4-turbo-preview')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-4-turbo'], + ); + expect(getModelMaxTokens('gpt-4-0125')).toBe(maxTokensMap[EModelEndpoint.openAI]['gpt-4-0125']); + expect(getModelMaxTokens('gpt-4-0125-preview')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-4-0125'], + ); + expect(getModelMaxTokens('gpt-3.5-turbo-0125')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-3.5-turbo-0125'], + ); + }); + test('should return correct tokens for Anthropic models', () => { const models = [ 'claude-2.1', @@ -124,6 +141,69 @@ describe('getModelMaxTokens', () => { maxTokensMap[EModelEndpoint.google]['chat-'], ); }); + + test('should return correct tokens when using a custom endpointTokenConfig', () => { + const customTokenConfig = { + 'custom-model': 12345, + }; + expect(getModelMaxTokens('custom-model', EModelEndpoint.openAI, customTokenConfig)).toBe(12345); + }); + + test('should prioritize endpointTokenConfig over the default configuration', () => { + const customTokenConfig = { + 'gpt-4-32k': 9999, + }; + expect(getModelMaxTokens('gpt-4-32k', EModelEndpoint.openAI, customTokenConfig)).toBe(9999); + }); + + test('should return undefined if the model is not found in custom endpointTokenConfig', () => { + const customTokenConfig = { + 'custom-model': 12345, + }; + expect( + getModelMaxTokens('nonexistent-model', EModelEndpoint.openAI, customTokenConfig), + ).toBeUndefined(); + }); + + test('should return correct tokens for exact match in azureOpenAI models', () => { + expect(getModelMaxTokens('gpt-4-turbo', EModelEndpoint.azureOpenAI)).toBe( + maxTokensMap[EModelEndpoint.azureOpenAI]['gpt-4-turbo'], + ); + }); + + test('should return undefined for no match in azureOpenAI models', () => { + expect( + getModelMaxTokens('nonexistent-azure-model', EModelEndpoint.azureOpenAI), + ).toBeUndefined(); + }); + + test('should return undefined for undefined, null, or number model argument with azureOpenAI endpoint', () => { + expect(getModelMaxTokens(undefined, EModelEndpoint.azureOpenAI)).toBeUndefined(); + expect(getModelMaxTokens(null, EModelEndpoint.azureOpenAI)).toBeUndefined(); + expect(getModelMaxTokens(1234, EModelEndpoint.azureOpenAI)).toBeUndefined(); + }); + + test('should respect custom endpointTokenConfig over azureOpenAI defaults', () => { + const customTokenConfig = { + 'custom-azure-model': 4096, + }; + expect( + getModelMaxTokens('custom-azure-model', EModelEndpoint.azureOpenAI, customTokenConfig), + ).toBe(4096); + }); + + test('should return correct tokens for partial match with custom endpointTokenConfig in azureOpenAI', () => { + const customTokenConfig = { + 'azure-custom-': 1024, + }; + expect( + getModelMaxTokens('azure-custom-gpt-3', EModelEndpoint.azureOpenAI, customTokenConfig), + ).toBe(1024); + }); + + test('should return undefined for a model when using an unsupported endpoint', () => { + expect(getModelMaxTokens('azure-gpt-3', 'unsupportedEndpoint')).toBeUndefined(); + }); }); describe('matchModelName', () => { @@ -166,6 +246,16 @@ describe('matchModelName', () => { expect(matchModelName('gpt-4-1106-vision-preview')).toBe('gpt-4-1106'); }); + // 01/25 Update + it('should return the closest matching key for gpt-4-turbo/0125 matches', () => { + expect(matchModelName('openai/gpt-4-0125')).toBe('gpt-4-0125'); + expect(matchModelName('gpt-4-turbo-preview')).toBe('gpt-4-turbo'); + expect(matchModelName('gpt-4-turbo-vision-preview')).toBe('gpt-4-turbo'); + expect(matchModelName('gpt-4-0125')).toBe('gpt-4-0125'); + expect(matchModelName('gpt-4-0125-preview')).toBe('gpt-4-0125'); + expect(matchModelName('gpt-4-0125-vision-preview')).toBe('gpt-4-0125'); + }); + // Tests for Google models it('should return the exact model name if it exists in maxTokensMap - Google models', () => { expect(matchModelName('text-bison-32k', EModelEndpoint.google)).toBe('text-bison-32k'); diff --git a/bun.lockb b/bun.lockb index 9fd1d656d17158b9cfed1922ac169d1286a47eda..b85c088716c744d0b04f9a8c4cb111bcc434cff1 100755 GIT binary patch delta 142090 zcmeF4d3aRCw)S^-($F0Z5M)+B8~_oJxg%i~P(aim0!~Om0t7OVfk~kQP7p*5jc!C7 zKyg5ELIo!#MIeZtfTD<~I3Or0;)DbE{oY;GA?G~a^PKbD@A>|spL>1lT{W#*wQ5!E z+B=+Yp6vAdtS)!9J?GkuZ4WHH)$OvdQ*rr}=LfIsG352$``*dx(fQcP)1LTh?=N4M zBs%&XD;wU_f6KmSr?fjIlDy7wke1}-XXd75InE{P9VY?4z~YBsZFo^Zr!K178?N%3 zHaJcla5^-&PNz29SLJ_My;PF7B4n~Zd4E4(KB{%BU67Ik-THmz+1 z)k-UB*NEO%=hVoPc^y zFUZTzF3xwHo8ESu#_)0AY2YBsJAe)0wLz8tX`ACT0k?x^Fz%9-B$^^vU~!TyFx>JK zPz|0Ao(kUH)+q2c3Y-Z)xWg!z{H_`BT$GW4&V$RsP2P(xs@udr@7?Ijb({3wyVG&% zA$|CL(`xGv9H%aPDJa84L7DAzQ1exgS(ukSDbu-`@{+$1ZCJ0VKfF8IwO-psb#|LB z;`f-!zkXy?i{BlcRj)^AA5f`FWupHK3tv>{M<}%s>NB1OB(Kj zOM{r-7CQ6;4-i^xR3Ihz|IGvzt?Ym&erc8hZ!lkA8Z3o2b+PH zgKF;EHAcO|(E$xwL@NF;x!)W$jk?E-($6E8_qY~c8DR!L3$E$u33{zLKIdF`na}4L zr>EcNw177O)$7DKpXU_)L6tiN`AOjT!py?ajuUa>5!6KR6%DAvJzxUZhz`yM5B_e3 zvk_Fo4}y|U2G0R62hRdKgR(*hlvO_e%?xNAcqY7cg3nWY0jSy73!Xy%B`yWjP$nod zKlh{KoCo%RtHaYk)h6#e=67!{@bsn-bSz!d?_eJrhzTN z;o=bzXOmFJKm1|}R)AWVD?oKH8`Ox$gBoFXP!rn?Mb&W)xDJ>_up_eM<`?LO1z1&Wbp8C(vpL$T1+^w)dt*^SUh&w*<8Z_GOf<-xQk0pC1=7>9ypg{YjvhX(OJqY= zGq4q4UFzQjs{a{aeQ-irQRWo-iCMk?x%62cHhN#s!{xM$_H9a7DfsdiuPT z(Y=??+v{(F%aPWRFGJo>ecFkXtU#a{=?uysk1|lr$lN|gfh`x9=rpvi>F6Q2Jam?o zXM!4dFHoLe*5Bte0`oydwbPNG4%WTMc>e962735HMLT9_7m0=ldJQxc&jK}qpv4~s z7)3s`_!_7VkD#D}!*o!JuNiFQ%R!B>7br{qc!^mWT`o12yB-W7pNG7Lg39d_RELv6 znS2DOHQpfAXuPwU+3ZG-&MVF>a-93Dg{~Q5rao}FQQ$CKmdsBpD9r5aIG@66!?#)a zeM5}}=YUeM5RB9#kxBvi)@o3u=`qYS*a_5Byaj3`PmnL4EJFeLza_#a z@G9hrem7ldELs3ck?X*!3TEaOMOa6fg)yg^NyAzk*?E(*v&N1qdiiS8(U`R2YzFR( z$t%c7BTG88UL9)fECT}B!Ue+pOoeQiHOuZx%tF1XH& zq^)h}bWn4;daYSJm8X$U%!d5NDC7MfrkN3~g3B^9(#=SZg0jSqpcL2xO2H>6C(F5@ z@_i9H(p>M)Fby6)$Ka=+OqMvtR4B+~;00MzwjkHYGIBH8jLs{_EXd3#*7A&PmF>ow zhMR#3E9)pPXS-#bsh4N*S=&#fV04?}B5e6;meF)6sO7Va0@8E=sQ8tiH9C!coU93^ z+$c~DkIgPFko;E4$pX_sjrg8y(_s!=CLe9(8N`z|V{!|Jz-c#9a&oRMkX@*OI9_P#*bkR!d&0G<>cPDot;Dx5nww=7mlm73F9lVwz~a^9%kZMIKio6DD%AN#eu_)!m3qS>;Z>RXY z!%1tnR>58dQa3^(Hj<-Ljp?_Mp%I*Py&1vbX=Y@rkgLP`HyHU6%Xh$K;@NNovH~kV zI^A@%Xogu8pM!GhQc&fK!H7okGpj&zdC=lWGBnb|G@!WfKBz;(E1*m|oDRf$fhu<{ zsCMdE{Ii7_$S0s8<&qoCfVRLjfTuv!zq^Gm;+c3F0yUflY6O>oGT~b{8wL8nrTM5^ z%!mqk;LFEXF1pn?X;E51n=yrsvlA}oD=cCk&Y9v|Gu!afKn*axljp-uesPYfJ6-26 zVtMUmDyoAXwt>@1jXVTuu3iF_-Lndi@0WvG%ysEq^KrV>c645L zo)+KJcbeY*0M&bgOU+Z!D$J$wMP{^4+ZJXX(ifQahZu~MTtGq{v;;LVbwPC;2g-%N zkD7`*K+V%y%bx-@PY-~qe+#JjE4K2{pz2=+s=eNz%C)t;4%o;U>Xi6NsNmQ0&6@iV zlm#|{s<;AFRJs>bxe`!{=GgpHP>OX2wRGyVh|W5*dE}`FO!0d`HFGPd>|!fVv-}d9 z-_6QfT6t|y4twl=Q|~KK4qpLEz6Mmg%WeKbQ0m=ec%&qkgbH2_s$hRmE2V=eP;#2h z4_f}qeWro@g1ph0g@w+Gi%q@lj~ajULNzl!*bq?i zBbMiEJjl)wbiQc>7bvgCS&v|*-y2H!J%aNlOeq!^NuQw)NY!O%V zj*UFwwV6CFt*9C8%Jf&hZrZsN)Hcv6Bd@5p*q<0H}86gBo!@sEZnAkn2{*83Avgv(P{iTJ~K*#hqiE z@^lP6_>s|kFR1X)n0%S?CoFIdxCJ~HjE(d`E58BMMamVR?l-D|r-L7r`@DORwV>L$ z8H{u#F_wg$U3!9gx@!um!Y^A)NAH0e$*Z77em|)4xnMi+B2dT8vp{tm532qbn+@*5 zCp5qx_L+fffoq^En-eZH7vl?Ye@yc0elvHI6~y>0Sa0sAKLoYM#4gYGQ%-Zb%iRIvu=5Ke=CJZC6=dSVv?-bDdrD5WF4zlmCl{vW zXE{z8`KOa#Vmo;7JJVr4Tq9}wz3KRBxO`{`s8!J)lp@_gtvIGu&;46Vn|#`n_r`~TetNGevS5NeRt%OU(9r_C0h=CgDF;WNxk`Cmj*H`mc$@&08@Zrj|noJ_~dS4eo20y5Qv;%ptE9o{LW zXLAF#zlO04_fth}#$`^4orYsqbiJvklR-{ij%U&hC@lXgDoC4@$qh+S)`X(G37NV1 zS-E*M>vX7XEOHvCaxKA#O#g6_5mZBP}gzt(u#|?x^s3R*Gip9dG(W@5HXsLvVv4l zn&oqb$oLgv&-8hEGEjnil4PAtyiGNn#ubG>}zEK{G8qKZYUcW4;-pZc88!^Gvm zJ*O5O$!YX*(9D6Xfc0utCt)U>=fc&_A5HzO-81k>*rW`2T&F{3zTA8s3;4(3Tl1y>}oo?5mdRSkgHq{*PDuMMN{)L z*-V@TDJDN>g5D)K&Sfe7o?Zi&cQcyBLQL$wA@=_B8}en!tU_Kzq)l}`fy+1grbIvN z)Hd>XPm`V2%lPDrpt1||Mo-XI->J9ZS@fyjZIsvPs74>-O6j0>sdV0VD}Ms--7|9> zryA>5?dbiv5L8IrLW7#2F9sN1Oej;wJqMch&gpLq|Id*zdaQHpNNA8L((q!VTRJEeVpYa^ zn}Xx?8Eoce1*opZrcKGp!$`6Ee^O7XjvkkpS%9AgFZFw8@7P1j(MwGGv4)=-0wP+#7i-v(0_M>3tGWJu8K3WK$}nX^pn70;{WtHVW9lx6O)3dExLEw;g8 zP?Hgh>SN%VwAg^UF-da9LNog%W3oACXdNF5nu-&$^Kunn#}%2EaXaj+7F=r-o19mW zF}Z+4r{!aa(Rw~yFv?hP8mRqk+DOyU@H8{)7lQJZ9OSZ4R)%-LblM`1$bZLDQR{NB zZJ=bd@$0TuKHxeNflh<#(DZJGSqA~QBGUo#by)f))9;-M--T-mUIlfyJT%6Xiz#|L zim1OQu46}+$zmJbh2xCL%BZN3%m7ueRhHj-$`}Qg0)g>Hf%9y+x8NGcX}0{`6HNJO zpcM1la_h29x$mt4cjrWm6D8*wuVx0k_mXGl8I#qu7_fMla#Cn7D8>I_aR#UnuLd>Z zWuVGML9L3Gpr&9>j+ufSP>Su0pouhZR%j}|0at}BaIK2dicG~>pq!@&l>BMRsl$R| zBVPiSe4TZ!TP7K&eFs#>TmiF?J32!q8wDmH*8%>FXQ?1BC1SKGOdFHAaEkGA@2y#J zLH4jI(cjN+a!P;1YA3eoJrMFo&+XbcQhL4VcLu1%!R3M%c?vAQ64c_!5L19rW zBzCv*52u@YV>laVQ_3t#^CqCV&2J29adN%HE8MBh#6k-3%RtU}BPBVRMdR`^3Z07( zXhzzDQlyxJY(Akf$?{{<%#8d9N}+-q+`%B6c>TSdkfUWP!6VAqXiMqvB;^n z8-61wMK{ee4Y$6-?>!1W2G?%h@-~xSa;L!zP#xYvz8)3R^Cojs$E7`7yWjvYB2BxH zkh3=f<&&pJ4WA0iw}Z%qmn<+ow-%HlwNX&zyTG+*dZK_vdI%Jc<$qxLI*ZFd`R+}( z5k8uc7>_^|uLR`-CxO!No4Ll6?}F;^MNr}64p6rr#h~g917(4UBaA{5?lsQ73RHeK zTkh$_rsF$7m7lbj@Sy_#xY>+&G*h6b>)QQH{JFqR$(a^^pZMoQ%^z%CNf;aYMVDEwEar)<=S(debc+@PD*t*VmEIP19 zlQU8uGwojlYWapi&5T~@umGG_mq$x`G^zc_azrGo`56tO&*Y4XZq9BHsnzBDo38AiTI<{k>P$Lq z#=TRooRf5O^;&23Z17ss7w*6C;YPlJL%MvrqRz?hKN4O1#r(Wir_}pta^aTePuV;8 z@xK<`{_Oq1o=;!@!jY0|G6#%$WpPE^!wtHwTK2(tAHB7$-N2W6H`)6_{B?nY!@I;M zB|fw0hN*k2HLQL4eOGq5d(nvH*RD7>`TK%Moi$0($o{sC&tLakv|915g#{^d`kwbe z!%5eq4cnSFxM*CjOMaR#{hHEvL5(&AR@qZAGuQI?!ud(*a}F3~HEN`^+X6e$+njVv7eJDY>oYAMXx$ zdHeP)KdtExIZs`x@72A4_uM<++znnyKGCa z)w;WfzBj1kC+FiYS5BVU@2+#A3yM}Ym{Q^k)_7z4OPdZ4{dMKSsridT{a7jI;lgpz zq))=3BG?76lcQy&Vc#luKs{g2(1`Vp(+#0NnzTB(x+SjfllXSgUekl2gGeqmEzAgq zlDQLT2XmrjH-Sa~z3Wp|>*8%24Q)h)kkHflDvQH{m#q@Bf?nZ7l$U}#@;Xnqg zM|56EN^mKui;%k$lk7c|^c;1Dc1I=Cby)N(T^2ONdfDxEdyV zxn-}#ndvx!M7>p0eyH76(>T+6TR1cwro6al+3w^Z#MqP3hQ5bsDDly;W#O1=8IND!=V|lTyJ<4 zjOb^WnK!xFh3}g2#kr~V@gb=Wo9Otz>6BZ`V7fpIA>|5>5Img%2 zcg*Fpqn`dNKXemX;Yjy?7}Ffv`L?@rT9Mgjw_C2v`MZsx)!njRP#Y#QCwK-3d}Q;Y zNo$gW5REV7t@p_=qZ5|$z2**RO`CQ0xO`vPBQ$J}DH`;g>JQjORE%@WQkjsCS(dPP z&!{tD-C?!72(bp%7RF#0=x;DhM$q%0^2qvvr%V_W?Ooos1oT1M?qX8vv4u?u$ z$}Rxe4o2px?sS_foQ^p9)Y%BJI>^2;)aw!zi+q|i6(AM32Y^GRdn9=l)%{s zS-S4ve!gz;q^|eM)%cdB@6Njv8L0wyTNhtS;A4`byrjR!ckaORneAoY@%-fuKA&>m zJI(;F?r)@KczsMhOJ!pCiKS8@F>aaRDhq4|F5P5zpve9J$x+!lMxzC8~A+A zR8RZ+NcD;)-j)&?<0qHOo}&dnf{llnD7J2EC>ZDS!lB9b$NQWamDz0E{?d3ip%)|G zOpay^B?&yg!+LtG;_h(h{D99H4fA%J&|+9O7}j_)9QXj1?U}J}HQH9nx53@go87Hr z^;p&eq>8*krv%Z@9o&OyA~n*J?ItzNOI;B{SugcEsVsL}Z|0ThB883jglh19*xl9_N19D? zyw~AjQpPj0YWkdFll?KtIVL%_md_dEmE1 zyy+=EXRc{zImvXd(#dsv&IBWzOww5Kb5hrNQ{1Pn&zWwr*ODxb&fAd^=v0p(dbJOd zih2bj^?gpBDfk`9v0lL|8dRE+lo?~2hV)`pBRR!uC#jLoN%Pt%AT`;vbATlFqr)pt zWn^B#t)y)2@M(6c122%8)~&Gt~(G6U3sqgs}B?V%V3JbtTNWiZrCL-4kXWoL)}{Y zyj_hL{dU-2uZ>$ely=hExaDBzxi&uU?`EjEDjfO=*2C0X7!LGk>thE?d>|!MM9Rpu z%|8cIEUxZF-_Ky$eB<4UJmU0uK5w_ErdSm>^E_X4(5&vkcaZ9U;vI9{bvu2bU^}08 z;H>7BweTnV+PS5}nUuLm`*^#~Zc?hjQK>asUCs7pNapl&EldjVFu;~H52k=%@^-@d zm^@T%(81^QgVl6Xo3X*eOz6;QY!%G3qCtHHyUc5)Vn#R^?q~*Fc`o;tbaYFv!eGym zW5W-9e+$!DiW3hfq>h~`8E2^pu)dxq+OpQc>=Zqp9PI4#P7@s1cyLIDDcZAtp~zI2 zRQ9>4eHr;0sA9R2vj>cVX#&Z+ zD>(?!!7M?I_=CxA=|~2ak!-4S*qa#+JOWFP&bu)s5Impxjc$vkg!+)uoOrQ3Gzr!V zW==~l+C27tM)Wnznikfmt5FkG=x=9Nw|o?H9iKv(=-@>up-!aC*-GP2hnf95iR1JF zmGTsq5#N9r4fJ4l1g0s&&&j)}o6kF*8ny@~)4*u+Fl<Ihuf!{-c*CeBR>93s^znm8vVbXHHFGb+|t;62zlH*uV=Tdh7% z%xvH){yvwwr8xx1n=W>m2_(wKhOK5)%t=;yWk9H}v0|C*DIsm3bI z&~4#h8B7j({7Gyt663&{>$*eC>{g2=@l2Zq>l00!of10b^4KU;YB)^(L3|^|EQ6^9 z>X5e!rlUNOa7H-p?4iEs*6H0tD~B3iFrHZb3Zn%N2F%oO*ibhy9e*XIFyQwdCO(4= zfmL@?e`l_T84b+hz7wXHN5H4gFJQ7BK6w+{%W$)g5%3xRWSD|NHMb&{R$z*GJTcw~ z8)14darz0EY=fnUU4OtbU?$4lf2Hvgj_`z!-(eafy3l+7tL*0HR`_WXCTmoWrhe^_ zWUrtuS)8kxR(CMRtWZ~ydO*Me#Qj+?6~j8^T=u{ed{6SW&g$2g;N#gdbUsY2bB}Zz z&t%uQ<&z0qE0K2f=Kfn!L&=YK%eoV)FTS=i$nrE)3X=;5wKc^3el2cP(mga}WThLi zh@OKCak>@^`M#}zy+CRW#vjlH`I%HI>Hw$LggYFZWW}0ZqoZl4oXJ)zsXAoo8 zBh`%ZV1E_6@)+YY)!m9dhG}*@n}^EC)5B*ix9nAB8>VZgTAuIs9UI#yc=+^B8tW#M z(Dw64wS5}j`3S}pPsg_n zq`Y;gBVg#X+*s*~2zQaNcDjoUEg+?Jjpca+I|#FzE8fs8&*uyvFBmP`8V=n9yRedd z3e#+w{iI-`IY!iurj~{S&%>^92hStg6vWz7{2T@A&l>W?CeX|2{zN?9Ybt3*aPw~##PI7<#f%n;Po zc9>a}3Tcfdo5A|svN&82CWqoyLN`V*^PH;1Rbz_JyD>6n@p(?%*s8M9Q43%RLdXkBvZU?TRF_*t=u)mi5Ixh{t9NCS|z*RTxm#-zw>T(OBWC)_9NA3 zh|3te`7LJL)!n4qXbmQZV87*p?z3Cm((kD;^i~rm9q*=g0Ze-n(Tg5Gg?Z81OgU-z`j?y=!gkBp3R%y!C18Y2gZ`R z#BIMQ(9!L+mM9F>a`d}N)d>wSwc&SDOPJ9+jRDQ|=X6*H@-X1+aOf47H#|3~7oCU7 zVz%bc5gH7$ZgN{VFjq`ZWuYykq%pyoMf5AoY*%u)f(53I=RTol{)v4Dlf_M5tGkR7 z8#V)0>2{$FFu8!qi@&>S4+CLxaFh4oKjrO%X*edYxm&frbeN)&$$JiVyyRin@%}n3 ztg6ct*m13&|EIhoFfClu=D>TZwsIRx-e~eZgvpkMHCR-&hihQRTX_n0T$e*Ig%ne- z@4Z#)&4wMf#K*A8dGMdL*iE>LWq4$<`S%KVrT0+Sf6;wzsicwn>;iVnMsnl7<~}#! zZX9{t1Ds#n#Jf5C1s>Ebke9re9<&^IU3?y3`2wkR0sJyBFa@l}$|~Y3sjC(zg27ap^@5tCpt~DXZ#7BnO#RTP*Xs zx|>!>+5TVigx;vCJ)%~(E%J5qJ>n)T#wa%;(S&i9ARv75sF?=uOyqC&m|LzgBOi-} z18utZ!%S#W9Q_QYQyeF>hqyR?JXTW6Vk%72Z=S)o!ps`v86$WUCdaJ2?+FfGZa2Kj zH?uAhO|G}(f_q?HRKvW3em)d@!ekR|N|Qz8K)e~|+;=bRnrPyJZW5clT@NBXpNxfY z3WW+`-oe$o0t~H&Y9s_hPF&+xm<7PGqb1Pj7Ff+@Vvmar)7iBbzwE1(fvFYS69;R6e zxD_{}mCfTRgr5I|sZFyDbz5orGxr|_FpY*hHmql0dZu7ga>Jp7=VNyg>OBKycSZES zAI6m@_IQ_+W*e;t!;M~u?fuk=D|o@X)(pLf)NC-)^=p{1i~O?fi?Ll_Q#}J_&&c#r z4&zKQBPCF46`>)TSdkL!O-lV8KVaR8M6H|awl`o_Pki~9%`ht;N}c?KT?(>Voy zpyV?!xt!MTnRzHVlk*ue>QF-#qpbKVCqH4^8Rt>@_e2Hxr>uHuM9N~O%n_BNP&g+V^V zCo3@xS$cuQjau*u4}&(k<*Nw~Q<1c%Ft@=Rc9z4`0glDO`3$DzM-alL>%3`#8V`Xi zzhSV>BipYY7F z;>O-Z#TPIQ$Y<{VPv0D~Nd>073T7g?V#`99))x06`@*5MZ^w=pNtn6jJLW;ldl?*> zXqkEWzXPTi%}abr*8PWRCC*KnL!^OSL!K8~g0ES2d~G(Y!1c&K$(!gIu&ZFW1TB34 z(@JJ)VNJFheTajc_13^{@JgnV*L8>KliiBjD~P&;V9(EBI*%|9uxsCqZG@@2_-@2% z>fOG412b_-qiFx0X~f)j%!BFRVn(qS=IwEnUrn{&X>H|}HDt^%b!n{w8*l3JfyMjg zYJh7twvf9j8Pgf6^+D|FP99SPyP9f=o?+gBsY|Xu2t~bi8K+=`)O!#%va-8lFrA}9 zZW4|i{Lpl6-srD^X`;-PinE*dfG~nNx@5!Tp=h?6!vJgq%nacdm{y}PM%RyGD_`~I z!_+2UlW-;S2TVp}Ye%!*d+g?6d@ll3qo_?-cpt`_L>^u){Mg*FnGCa3u8299_j5&keSz;i}9DxWTf%&j2qT5!b zgnlHYQvhGZ5L`kBj5W==y#m&TJXY%ceES5`hdHc0cGmZ8NgQBaIC$pQRi0y`CA&k_ z5ol(QAMEalN%Xavxq3sQSi|hU5)O6##%!Oa>j=yoGPq9gZ~n$De}|aa z4cA-#frnweyv_X!Qf+m48>;Uc-F4mkq3YioD^(jedwJpUMUHkRRNH_b|^*NHsw2HmLg|OiPW2 zf7JFLHfj^CVLf1Kw@x(myW}85LDgK{Zii_|EUy*3Zu-#_^qem+9@fYEfbvOFT6V_= zRsAP3t5)_lChg?^m~61$H1Z51jhwso4?Jxp#{k$c1(DK7a5pKjM~u z$YuR+N8E(n;Dq1Yfx?G=b4!JLesjygKr4rTrleOOFo4AL{S0BT)Cb@)UuGeI!=3i#aHN5@zT9~dx3HfYX@4+tc%&)z< zf#dgXQj($-4lkW2IVn5FBt*=Ud2~I|$6<#R`tw$m?yj2%C zD(2lMogeRa^xA{%^nq}28ca@pyxx;YJoVkw#{Oh~yx%?POGY&?;P)1IWAEu>7R=a3 zv2i_2_Tl+v73aBXe&=fMvyZr&s$r9T)P4(@RuAX*XgID$b-%k+;(pbQ0SJjZ!-2

9_%nlaDiYOpgyWtGqRoEa^w3uce($Uj@0Km+pq77<-#d(PpwxF3 z`=GKGLuBQ)JK1lZ3B6~yT$rACi5AS|i!enK7$t*=#u(INH|PrUK4DP&4@6+zTaVBy zq|9}B*+;zBgDLQtIqXowv~Hf?#=*=KXfZwv(~RN?Tty#-d4@Lu-0urjuW9O5#=6i| zNbD4{q2CQV-qYJK)%SM7kWu)o|IH!0vXCt$zf*D-B0ny4rrX6 z%3yMFqssd*ot=p9xPOZ}F^AWq=5&~L2_`YfRU=IGh)O)u{0h?)Vl16y_y+=dz|1$9 z5ts~VdVd$Dl7=;@XEftTzLVH!StwfZb8@i0X@uG3J@rK}o?Z`jlUN#ZF5^Yg$DUYs zlV>&Xdy$*sbHagaG4Iauc~VACHjB{ju(qCN8edEPeE~7n9M-!LcBvkV1KUaQ5%xpf zsy8wQI6lWwBqk#0)1_}=8mQSS&pp-eeKx`l#3#8|pX!$W#T4C+)a+u~i8jOZPK!(J zU&Fzq(~L1Hmvi81Bo{>!XQqT6B4v8gll=jhyvf|dH*0LX$=u^#4%2Go;3~g`sh+v7 z_!_1Mt$4TM0`8GdZQ^$>jt-ul5-K2NROd*S_zXYZhC!6zlHca{&wj3tS@FG5(`W@C6c6^$8oay&^;SgCK4$OdY zJI|B&YEm*IUdw^+kS%3S;O)+e<>@Fg4%W^q$@NWeA#9X-s658_&NkZ$pMS66i2$Za z_8z~2k63oR^ruMVY35?8M)O$MkxTT2nLwdunHyjV6xb2=6ilNwPay|k8nxplJ;`cm zQFUFF!0d|0cCXqz@4_wQw2aNQj;lRjm6wQauRD2(fJAopO8Z}K=_Z`)?-4kR)cfSX z-})T46iKM~98;6|!TFznY0O5qFJaP@4ZSuo{mfP-(+fyvMx28Rs&L=r$a5Bq`PLPWOTPVPSXh$9z~ZueGuKN#4=!O_+&1(y3M(V+Frk zHja*9($MF<u2Fxi7+7+1Z2T6Ww+yS6hPf$!1MIGBAvA%1RwT}55)A?~9k z{#gla4{X<$8zyft@%l~jJgY~`j`5|T-}{Ru?|pfoKkO2Bo1c3cQf9I6cRV86{JoVE zYSA$k;pOwwVe&nmWPeBwT4DnAUYI!;%Vp2$MiO)X}qFsb9czzYrNVunh9=hS~|7q_$l@Ax(# zRsG}b|7j(>)%=S#!gew}XDNVPOKJ1O_zp~;xSK^XAldkv8Sh;%Y3Z@x7MQnWwEXA4 z5sFt??}@tS`9>>Fh-`z?VG2Yn2~I2PVdg}ltA}b`joWf~`Xbra)lE2!6?Hp8vuaY? zqO4^cNBGDlA;m4HjQ`pcH=!|QA4oA}&Gr5sSSNSeC>BIgH{-tM;p1AE+?Pel)AT(s zEp3+Nd&K|0puFEq<&(MYrZu(+l$!~Yi?CdolnR)Ji~kK}1@wp+MltikN+yrF6((=w zEfp(ZElkVG`_v_P2qqJn$HNkiOu?S9ZA%|P4TGr{))K67FB{F=idh^=Vg0p#2R4x6 zqyM=nA%AaEo3*V&WG|@V1GZ)hD1o(BXO({r_9T*YBrFtEYud-SJ!^yIc0KHJ^1SEw z(AzM19l@DXsL?8U2#$eMXCsFdUU}j-S^HngpIC~_Idq3Ke<^it7C8kZhijretvLM!og#9Zo zaT8jzl3HBq_b!#p^v{E-HFIFv0+YqeZC>@ujDLGG5bOz)7Ix%k^8uBW;AHF$n_#9T zu{i$y6Ws#vA!0k0-epie7T^{Bd{P~w^WI1aZ6u}W#U`*d9Qq5UuDu8snm8n;x)xeF z%!YlM_FrySymwg`>PwBcl#0M?E-FU4Fb;aSUtVE&Kd5O`w4?fhr0tifgcZdONHl-aLd6^!ZoHY4yHc^ zfSI+-6-uB8*3C`q#Wlh+BzYUdCpF*OB4#vgt~GNO@22uak^k0f-O?_!x&g5{l*#(P z!|X1FaXO7Ok(^tqyTge~N0~gI!@sQ)J30qGLOR4vtnEul9G~X*ZkWjD&LOq4ef97x zVmXuJR(yzi{0!}(znV?#m~NU^`H)xMUH3MN46%-oW;a{}Q^4j4fSC0)%xg=3Xd7xf z+PH&xmvaxyl+>%E12FAL^xBGe)i%R8nN?yM^eQ*8hd(9s1IZCy2dtyOfK1A{^SWcm zyGRc6$^@#7;YrdvP+dhz#{<(&Xem@n8NbGQ)yLXSyq8y(!(>Zlp8aVa%xJDfUjb9_ zqM332u)p>={%nlN7&gxDT??937KO>%aVw4tU&6crMU%>iX<6o+P6MwI6=8NbXN->x zNA{Wq^P2EJg9v>IwI*V#=sY22qSShrXccsn*PQ}N{cLk!Vq_)Zq#T&`5lvMb|KBj` zo8CeTFu02xHFKlw8%v6B!1*hKCrI^* zl?Z(U)1-Q*Jb%Xmx4bXwZd!qx&=1Wk3d{&;jbp+2g=WUhlklxDg$OUt|9+vH(4U&E zi`;==;O-)7>KWI+ugEQzq*XCJ>F)_cw~*3xtci%*V8&Ophqs$#Vhw-2#8JNtc08VZ z0@Ka07g zVhS@DE|yN4%B0A+!4ag|sabO+RM#K!O?3wj;86N9IsbeZ*@wiO?{#a@b{cz|cXO6b zijP??=ic<`X>RF2?7HxJ(=6eM_j3>v_LEqJ&JDPbJNOo+j8yOFy!k2qn{RN-2ci6n zNP2mn)c!(Bh9SP=Qk|y9wAVF4HcUF>5DUY>#W0mTerVc<#0*^hHJ_oFsc9KO%G68Z zIRm0<-s}e6gqbhXortkIjk8j^!1Vs4nz`f~4ebjhVEx6br^=#o#XYcr(QQ9;3zo#X zR|{idI#!rKeedx+UhD0KnFyn=E6$l|PGOYX&%+eV7>!eS;6WIJ;6`OTDdUwgMV(nz zTl4wdP^cCgPj88ABe0<`A`TB5U(9k#hhXD6H)^5i;dB@&+Xdm|c9=e!!D-pdzJuwM z1uG4ooP3j6bVLWot#y~LwYNXdKx*o9Pa1l$lBIGe{0`>%m0p>;CExi%K0efR@%i%Aiy+5Zla8WAfI8Z(Ex zF2fdt{Tt@E<--{1Uq}nxZNvO2fr3&lcinA6Nq$2z)sqHy&9iGNcHRzlyxm5;O35N5 znj^bF8uNY#N#9CIuT|Wl-r@INHXV1t)kw59Ifxz#hw9yF+VBP!bS_`zEgl+l)w~mWmDe}{G1zXtv6ZP@@^Gj+0!7H>lnyO>!B@YfaL>$ge-TRe^~luQ16sNnYnAgJ<7s?dM&SmFx&rN1#^_~+o8p7)coa(-GS-kG`r8tk*T9b5L^~(#O-yZFBFf2k8tFZweROD!YFb* z$21IM1Iyg8tAhH zn5L8`X-*!wkC~xSpB?&snDRXT4}A!$jNgG8j}vdBiNAD@$}b{c=f=slTooj+{7Z%&Fs4vYIMw1bTT!S6ZvfR`#O9aSe4)=xywP9ZJ?%z+ z(ECqB1#hwi{tl~?Ki4*N8>sSk*z!VkSZ3u5Kq+>Y%@-=)wOpwDgx9* za@8!ais~?kT=h=|Rpb=@qw;ku)&*tIMwXuns$S#jxQ2d>5vcDoZNZjc0=xsLhB|`k zAZ&TE#q%w8wfQ|jwbK{WuPRD3i2rEhmw-~>vIq%P7-j_{z*P9-pgLX-s^h0XReToI zuPUmcmB`i3OEzDq@~?ubzs~a4E#G8$q}&SL2Gzj3pngI%ywmckD8=5l@~SBL2UaeW z0=q4K4640PEq-P&;(TER`#@DVVEH!|zqRs1pgQ=$;$cufp&I@P)Exh2`5&O#J7&2< zIF}{jLCLFo$owae(8z1qj8iPu1J!T?%TKk~1XM?7THYK~xt5lnYk3>X+kxu1la+U| z^7F;ze<@bb1Jnq6THZ$m;C(IjxAFm&53>9cP|i96R7cm?{E;?4&GOL}GeMQh0wYS~ zkdR68L5-{!RL7I8e46DqSeyY$(FmyeH(I>a=Fb836RN%2L6yG)R6p}Aj|T15K*B4q z08FRAFQ61SV&%Vq`c*|W_&f4?V6Bi@_w_;jgzBgfsB))TJk90{HRWf7?D{_gfjT_P z7O0AnH%G1p&$0PcQ5I-pklh5IU}t&9aOucLH+(4RR5W3794Ba z8E4z6iqdxia*ew%WL<-Vr|4u`af+=dltNQ2PP2GDsE($C`Uy4AnV=e;WAo>Ns(%|O zA1$+dzU8i5Lq2k!&A18oP{i>qs`G^T>I385TL5n9VR`9EeDpwQvNnj(J zA5lUboN5JCQI=_D<$s5&cLwINeRc>1i`A zu)Lqe3qdt_F{lOygZfoPTg^A!jSI8C6jYEkG`GZN5;7-fOu~ z4KKFx2Q6P>^M%S^3aXuDmOlbUl<_DD{i>q;?HOC}S(`7^9IgVTz$;cRR6DO)e9ht- zP~|p&`Uz#JH!KHDXqG??Y_u8w4pr_=TdpcfzR9+;8PrI(+Hyio%||wW52%5Bo?zGi z0R+4eW0w0^Lu#NpsOO)0pcJSNs-06UHU-t*8KBCywESF9mS__p zp3#!N&0Y zmLIVAwZ(5N9*o$;w-&#%_`StL7JsmK*y4{Cf3oJE(FCK>dVTR0}QtJCs6;Y`#$K-Umwl zK%!l24_LtxP+{{iP(Pt6JYn-!fQr*ETKP+$6nM?%uLbq{JCtSD*?gh+`UnY`=uJ=> zZMIl$@hwmt`~&3woIU(UrrrwasW^@pLP125JhE}<5gwHNJXH9C&0b~kB~bmnYWW&a{k(4Z zM$5}BzGLMT7I#>D4^%rJSpK2Kk7{Uo_>u4w*aJ$>y|%#Tpr-n3P`|1ug}<@ozX#R9 zVOvh9c76e6=p&#MKWfp>2}knyn)I(kH3X`V0IFb3TOi5eDWE#61FEC?78`-8*926( zGeNa?w&krXo(HO42g}12yG2N-;qIW~PJd7VKMmARs0K${%(QZ$>W#5nC_dKWIEz`J z6wCqDP9CUV3?s3`-=P}Jw-x>l)nEbnDpv?L%Z19n6;y|_tz0NR$8w<*nFp%;9blY}3G+#)U=-9(Slyksn8l$f zU1qZ%0afoYTTG~Gk6ZZ@pt4@(Khp0t5sP|4*krj-?Q8+1&o;~70ab6i#rJAr9PNd> z5lE3wK~?wy)bBq*b+nK2QuHfOC+_b-b#&Oa^LME7KWcH*CK2F4M7~)AR7Oobm{^oz zb!>iPP#re4w%Eny3ndR*E>zg) z0cxbZZGIn+m#~i7mEt#n3gCBuDmNe0PpJMP3$5TkK`C&LEngMY@M0^kiW=$tRxT8O z&~hQ|b#azh!M{U|;7L=#S)uaoiY53i3Fj$Wy(+4oXRKT(L%d*lRn&N1v~r>9tp?@G z8?5}_U>}P8eL*$!1`WtCn?QB6*)}K?-vS2QoTdJz?hQ+Mae5p7@wTde*a8(6w}Wcv zJy1WP7RfHltD+kI5V>$SD4+hqmaB^L`Cn|gUo9S~r4Ly6k?<<|c)C}|@p{U)sD=Yp z9t1Vg1e^bNsQQU2@9ues$6~o$1E|(z3yHy2wz^RIb_CT;CySkJzEItTEw73ypKSBH z+I*qPcLUW=PyJ7|s$ef$Kq%hZ@_&aa*TutHJ zsE%&1a-qtpec>!n`8V497)F#(+?#6)+-3{>9jbwOHeV=(%Rr6D1!dBEY<^W#y+u|o zRJp|lBhLLKRNw(ypeib!K4L38X7hzA|2QZGR#>@E<)63tFIf4%N9JDzRPj|?L8uO1 zvs|cE@TQe-vbfpi3pJv0%d4W~Z`u5}ZT>%@{O_LxmP>(ms380Y*cYrrjF2LY6)P+% zzlr7l4N9@ospqZ#=C*;Vs5xzoTm{>La-#N@cLZhnu;u52Qlu-WpHPZk0IFVpn}4Cr z7pnfC+N^(dFxX}YH5Efa$%lbzcsQsESA%MBq{TE)ijD=frDTIDp989X9;jbcRQ&>* zUsT(!{~}wkDypGk0&<7wtN``m2b@@@>mJ_Oj z29{Sv`9xzYKaO_&9~V&SUka+hCbr_=p)7Z{&9928*BrTgqXQ^~yV!D-7(pP@Cfkgv zD0x@pYAD6#3nlMvxlnOoKB#h0n}3(h7i#2-KppWO2UTu4sCFVx+5*pla+c?9#*3gd ze%bO@Ev~Wh4WLH81w0cxX!F0bcnDNSKUn@FsGm?y`x}U25$6~Q75vMh{)chYaXhG> zQ27Ci)j(+;1Xb>2P)=CK=GO%^;zpnb)Y!_KfU0-8#WTQw{I7*A(9&kKve+6_!<|4i zcs{5GyV?96pcLq1^Dne~kj)=#fgX*XaD3hOOF0=&( zg8B(1zZldAhgrE$id|*7Q01<%{NJJ48B?zv|Me1P#AB%_g~r(igyLD2XVqKvd#?YC z6JHFQ2|n?~u)Z9Y$Nk-x!iYV&JoLmD!x&12IPt~si7$pvd@+3Di{TSr4C_l_{e;>= zPJA(J4WciLWsnnJ44?R7_{0~(C%zay@x}0oFNRNiG0ZihE_+UVF?`~S;eYwG_-{Yp z#Z~^7^0EJ211G*1KJmry|NWQ4C%zay@x}0oFNRNiG0ZzkJ^KIahruVl7(VgE@ZWqn ztXFd72AkV#W zJ%Zo{1g}Xj(G6`tuv&tg4G0R|mn0bXI)cWpBPe#WUPsX24FuaHnCv!u1HonqroVw; zs=GykDH{>A*@)nJcj`t2E#E}2M}q0@Id3BPK!SO1B8a%VB$&MkLHA7vX1a4WAxPeg z;9Ci9bkE<6V7~_+}j^?JquhW3{Z%)QiXWENwMDFEj4c%y#o`_-sH{v+W0; z?0w+!1&fC7T(WFg{}K1T{#8oJ52s!=bLoTusXIeoKRj*Y_C~i}8*1y$+Y;Bn{h4-s zx4ONz(9uQZbhK;>f;sLF5*(4>igE;V-6iD+9@~l_uob~PH+3t55pN-QL4rG6-&=9R zeRsN73d-DP1@qm|HX!Pz2^P373GQ-}-UjY=vjncYUa-(@_zrN7J5jL6-6FWxZT1gf zu{%|8pIafg-#w=Sc)*CxXCE1S{Osod`y}kKhFf zo_2ljBM5$gAoG0$&$`b_uv&t;A0SxirhR~5+%5zgC3wM2+J&IOhX{&yAz0n|C94&8?8&0|`2RgkY^Z^CJYa_aOLEg7t3u zJqVINMsU|21h2b$CD<=PzmE}Ybjv=OiA+#e)3BEc1( zBG~FK`4qupdl3ZoBG~4p?nN--GXyV4@Q&;I3_9sBoW^V6_BwKS!{`P5T_d zxGxZFl;Ax#=?er6zC=*`1%mh8^%88B;Os9E>~bf5iD1e;1n)_(+ikWFLCdcY+`JFL z9=Ae*4>CWI)2kRo3p3L!)xgeW8- z3bD`2J?`ge@BJ6N$2*VXTw}~%W6e3{_tctNfTVYT28Op}{SILJ9+379P($?$jSSB3 z0q-gGJs|x9K=J`lOO77^F13JchB}h21t@$3c+~>xDT^VOLE|If3weA5_|yRk7#c{e z4xsr75L^fNPWcRl40@jcO%(765K<2)W%x+>(XDDRQlLMGjfE*x19#G0)LAvq)eFZ?2JiwAl7|Iw-6ad31 zLIDt?2&iJPCL=|FnGzsT5ip7>8LAmriEfIYrS2H>Is$Yz*G(kcLjwg4{`fForwz%!zI0m~?#p^!nZ3m}vNx&T770i_HpNLL%6-xUz04G5zWhB5||u7Gfg=n9C@0aP(W zkdY3+tQ#Ov2M|e>4Al%a-2hRP&<&8J3us`7CTm@QZFfMLE+Cfb85$X!y944VwL2ia z2SCyT5KoRh04_ZN*$kUVx+g$E58%}kkU&`sxeOY5fUV@A2k_|yC}2n=wO#~7;upy1_NSD096e6WMl#`8v;l) z0bHRuHtr;NA6i`I<42=xVW`LWNY6eI*2T05T#pGxX za2X27X1GJrLjejF0I#8d63Sx8Wzety+$RqUfX^^M0YfRN4FhOe0)mGD9#K9+A%mVJ zpqv6M0U=g^Qidm_YX#6B4v4Y>R8R>+8H34iz;lWi4u}~6sA8xjqY(fzYe3=%z$>a` zsAjOS22@c3Urdrl0vZ_JlJ!V{?I=LnNI(tMGc+}>)KP%+(E!P4KrK0r2DsP& zvKi_~+6JI72H<4_sHZH3Tn3FXfG^}R2H-OmP{7bYYGVPKwt(QVfbW#gPzacCzk0C3 zqQ3JRp9YEN)?B>G3#O+`>$NSdK@NRunrPO{y7c86;#r0gz-5NSOeTry2%Z z2Y|gjK#`K|0gVjJ46Vt|0gyfskm&$WrX~iLNdWhWfVPw|5uo4*P@V)(BiBiQT!!-u z?MTrP;4>NE?+DPKGYpze0PV?uj^sNTP{>fspha3vfRHJGFegA~Dq_%g1{h8OXjAAE zKp8^?gAN%u17fBE;++AyRL)>F4PZGH(1T*90;&NMZeGv6f3K{QlB&x0y{f9;m7{L> zXL`E+wr+K;{e#I(4o#;drlZ6AhqxR+zUxhgx#eGOe`i*Naox(|SL=*$`7vdsKSCB}t*c5*UYJd{#@^@}`p5LL`qoVi9=@|=Lt4zZFaK{y zF~|lU`<&?IXQ7a_qt&#LW?H^&OnR99{1H?if9vCpvu-j$hL;*m#?MdCl1jAFyVzG% zqr;A4i}noovRHp!NYmWM9fzK!6gOE-N^?Pf4XK{{>oOe+;Oq(*K&h?(g&6>e8^DMh z-2k}^*$l=cJssfV4)B@|Frh34&6xm=830rAm;oqcC}1!rHFrSBEI_b3z=HA_^k)O~ zW&$iJU?!l9p_E}b>COVgcmSei0j#Nn!E6q|WHw+FMa%|NGgL9ykdX%<$rF(10T@e_ z47PItHgf=WlrRU-$k4zro~%6q>0W>|Pk=quGq}tHIL`%4q|~_p1#j$0qgPF@J=nNs z#oWb9^7b#>vgWtn*2FBo?85qmv(IVU|It6%W?sOS_`qFX_D)rs@In7bSzF_)v!+j| z((qUPV)<_7du+h}P6LkQ=!MDVVzQL&h50y<^gMu%55Q|4z?rfbG<^XY-hgT3;SDHc zC}40UH6K98d_b@dU^?Y9==-6s*FUT^JaQuR%S?mU^_7h`-VG1yaC_&=y$31|n11sA zkS}pEJu>0IjVJ4+PUWr`GT_gP&qw==J-ace&9GNtJ$m_^p5LOc?$pGqpbV2GJzvac z76teMVio{O89YdLKETW$5H%m*NhJ)`fC-bd5>@OHs^hMlaFd_%Jm=`skU{;OI{ZrW zSnhT9{nzkS71>9=>pY)+@QTmfEE=P)alrk7w3XgBs~x(99>EMZddtcT~;}b}1-advjXwz^UoB>CXPA-i^QT z;@sfcy6k7pJv)r^QB&R&{7OM;zI*zJzkf*ezq$BOInTwHj26gF3!nf0noFkHjvZ4k z^-+J2cIv*}WUFI@G zmO9m<43(uoE|<&F4K7#6QumLzD(Nrfz2GCRQ(>}nkEM*IITZUvIMsykp0f;KQimoH zvb3g-FJ&PRz4d4kNdfD5*I_6H$VB04$4!z#A(o#Y(XzDu6U25oq?RRCmWI|t8d*~6 zA#t+wjwO8s#QrlRUY7p(3~^ZrX=d3ZOXI#k6v7~xUmyvx^s)+)%VP5evQ?J0yn*YcCR!VHS`Rn#?TleVQ*f~9RfAC7YY(Cs=(EQNrgBJ(3 zE$;B}sM$w}=|8*2eEpiCrB!+$epK{mnp1>~EtSx$eV@ z(wb97zWcY#todl{CdN@ogS^4UmnUea@d+@);+Ilr*Y#?Wbbj3 zF&gpZVw7~pUs{V6TI8$x*}hgw8L?x-)!Cyytx%nsyE?mU9i8XyHTMeLWoI54c`LPi z?f?}Ng{>}w7QdK&!8q^o8w(djn~tqFZNISf=DZ~p+rlo@o$B}?$tX?V*1G1`1cw=K zRYv=rXwkjomffq-FwAd$-Yjja9TEMgeMj5FCF=W^M0N}NIwpGekXM&3kH4AGr{{&s zT7UFg`|6*ZX4PSLm1pPY=FV1MOTw0YK5p(y{;Scw&)*NcUp{!7--?r7oth+Ttxxp{ z7@T@>mPX<{o59P@WLqo@?PKT>G^txnZxb`Gb&ppLfA>b~VfN?vp-K-sr{3w^zeV?U zwCvu}LDB18En26eHRs62w|dX}ukuJg^vGmzulXjG6MA^O*`ivfBvo_di`M)q#m`;k zi(cgPS6 z8s&E|OV{Vt2>U21=I-@cpt16m)t;askpra$b_v^PxNGpc#SQgV^ECbJzCB+PRM72p z&!!>8haWvV?$q|z-SD`bnWK_U^z*-b^jgx4@)x!(y0^P!_bxa34=rmN;_+bf3Fmvg zr)&&R8*f3{0`MKW-><^S-oJoVvST>k9oPMcw`^PpEtETBF?N=+qCB zXWLTP8g%c{QJ%H_x2bCTclcVbnMyN*hj+F{-=jN24)p3jKto@#=+K;~dsdoq0u9kZu)Eq*88~J{_ zxi)(G%Pzg7>PBYmucc`%y0@=o_Z-H3lgv`NaOy#)&F9XIK4WH2ODp#uJwEfr^!rH` zZg(599yFe~RG+Lhs_n!zRaQFppPB9p{Qkn)vD2lXG1AHF*XeZG^<7T(pq+J!IKY0HXCM++^k%E`j>J#?XHiNE$kPU`6g%RzD?`3Gy6ULRr+AV zL#@u+WOp8Gx8m8`v!jkg7`iD2^sA}8($Q@F4~k!l?j^pQDfRHm{p}k(LJ!TEyZCh9 zbAP;dx~(|%=3#rSwRzXu`;R#MQ*~L6W5fI{*EbGcsd2c%{pIb?U*0^a-*7eS#LZDH zx_7W;_a<$Ny5DJ$N7Apifj{rwf34r+oa5m)pG}R&#$3B@^yEut9nXw+Pm(mXj%z%4 zana?%>zzjOPX8<%VWy)?IfGO#M^@uI6VW|uw?}7u7XKXdBxmQ|_ir5sy{?q=kbo=Dv2j2KK-3{jdEA`*CJ)>p! z_Qz?O(}9MoKdi&M&663YpHB`tvp%$6fAvqlZb3c2<~a26@T;74UTdc2g7lE{J7&yi z7+z}S@wM{ye!Hfuh@X9jP%U>adaT@4GFh-^S5;Bd?wUPevqwxD_##BI@YsC$jk=cJ zJ=6VWZ2sy^FomNef`;5P5ULsuI+jGVwB?a$X!~m^RuL{)}$#FX{HXA-&Xg*dsg%s z#qoU}Sy9S5bg#xYBH48PksUuL zr}w_?aop^a*66FJopxE6oI7>l=@qR%gU0+eH@MoYU-evSbnv0fk3N&keCw*7j3fJK zbWiu#4E4bBC3jX-nYpjt>G^zEa(Z@})AswX4Awr}_xRS+A-^k<&DM`K{B_jF_@Sfy zdHv>Di7y>gbJ{G8aM`wZ(8U(rJJzy$Z}#rlVdoTeE2DJj&`Wa{KU}(blx^2YyKbv$ z^L~szzWzpmjJ;9!Jz83;mwc=Yn744gk5x?Xoy||9nA20P znLEt*v2((nmN%?fExXrxjY{>I4_;GW?fdaz(bGTXyIc}BmXu#u6kqpY+S~0WmpTvI zG5+w|URpDX-)wuWGH>3I+@t;M6gGVfdmP?QChnGD9c9MIYEH28THA5b%T}$|jj&o| zG*C%W(Y$)m(3$7oOth+9k`=BOs;XXd?EJ$Em8G*ywx2Crcdg6*z=6BfC+a2MU!HiX z{}jy@Ywsk*;&z>UVsYnIy8t(m*<|hy&|D8l@dxBk4L~}VtQVp5agj2(xJ1$cDDugbi_4V7#T8NvL~)foxG11ATwEiyAQachmy1Hm z=c0(TmY}#n0bJaqA}(%`ZZL{s3gzN9m2h!~43?s}OA%a@P&pU($Y>dg`xMK?1FGbr zl+1BEE&Y%ZxOha?p(x5InTv9=TaLvK+0OU2%dz-RsEI+J0PZUQ6_l|8P{yFV67ZZ{ zR{~;^0OuJhNihsymJIL@1H7U$4Al(Us{mExy9$u>51^RgEop@VY{!T~i@#L&oK zxEk=DLRSOQcLFLHYRMo1;F1D}j{wwBIfKG3faMxMJ;km8f2Cu$1-!-LqeCi>?xs6i753X6v$;S3EkkbH`c^< zEP-tnmLO_7mcRgOf~AqggdlyfCJ2�#e0dh&7P}aXAUWr;y`i24GFFD4c@WBtwj_ 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 m2s?O8j?v!9&N delta 127405 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 diff --git a/client/index.html b/client/index.html index 3654c8766ba..bad6b4194c8 100644 --- a/client/index.html +++ b/client/index.html @@ -2,7 +2,7 @@ - + LibreChat diff --git a/client/nginx.conf b/client/nginx.conf index 29d01073e2e..49a2dd16fbe 100644 --- a/client/nginx.conf +++ b/client/nginx.conf @@ -14,12 +14,12 @@ server { # The default limits for image uploads as of 11/22/23 is 20MB/file, and 25MB/request client_max_body_size 25M; - location /api { - proxy_pass http://api:3080/api; + location /api/ { + proxy_pass http://api:3080$request_uri; } location / { - proxy_pass http://api:3080; + proxy_pass http://api:3080/; } ######################################## SSL ######################################## diff --git a/client/package.json b/client/package.json index 19c8c01caf6..ae42996cd91 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "@librechat/frontend", - "version": "0.6.6", + "version": "0.7.0", "description": "", "type": "module", "scripts": { @@ -25,17 +25,24 @@ "bugs": { "url": "https://github.com/danny-avila/LibreChat/issues" }, - "homepage": "https://github.com/danny-avila/LibreChat#readme", + "homepage": "https://librechat.ai", "dependencies": { + "@ariakit/react": "^0.4.5", + "@dicebear/collection": "^7.0.4", + "@dicebear/core": "^7.0.4", "@headlessui/react": "^1.7.13", + "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-alert-dialog": "^1.0.2", "@radix-ui/react-checkbox": "^1.0.3", + "@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-dialog": "^1.0.2", "@radix-ui/react-dropdown-menu": "^2.0.2", "@radix-ui/react-hover-card": "^1.0.5", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.0", "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-radio-group": "^1.1.3", + "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slider": "^1.1.1", "@radix-ui/react-switch": "^1.0.3", @@ -43,12 +50,14 @@ "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.6", "@tanstack/react-query": "^4.28.0", + "@tanstack/react-table": "^8.11.7", "@zattoo/use-double-click": "1.2.0", "axios": "^1.3.4", "class-variance-authority": "^0.6.0", "clsx": "^1.2.1", "copy-to-clipboard": "^3.3.3", "cross-env": "^7.0.3", + "date-fns": "^3.3.1", "downloadjs": "^1.4.7", "export-from-json": "^1.7.2", "filenamify": "^6.0.0", @@ -57,6 +66,7 @@ "librechat-data-provider": "*", "lodash": "^4.17.21", "lucide-react": "^0.220.0", + "match-sorter": "^6.3.4", "rc-input-number": "^7.4.2", "react": "^18.2.0", "react-dnd": "^16.0.1", @@ -66,6 +76,7 @@ "react-hook-form": "^7.43.9", "react-lazy-load-image-component": "^1.6.0", "react-markdown": "^8.0.6", + "react-resizable-panels": "^1.0.9", "react-router-dom": "^6.11.2", "react-textarea-autosize": "^8.4.0", "react-transition-group": "^4.4.5", @@ -115,7 +126,7 @@ "tailwindcss": "^3.4.1", "ts-jest": "^29.1.0", "typescript": "^5.0.4", - "vite": "^5.0.7", + "vite": "^5.1.1", "vite-plugin-html": "^3.2.0", "vite-plugin-node-polyfills": "^0.17.0" } diff --git a/client/public/assets/ShuttleAI_Fibonacci.png b/client/public/assets/ShuttleAI_Fibonacci.png new file mode 100644 index 0000000000000000000000000000000000000000..eddeb4e362d186055efa7a0ffc232667b4410602 GIT binary patch literal 30879 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 R$+OYj)zrIHqHZ1b-vA-j-`xNJ literal 0 HcmV?d00001 diff --git a/client/public/assets/anyscale.png b/client/public/assets/anyscale.png new file mode 100644 index 0000000000000000000000000000000000000000..d86830c76dd30de7339ee10fa827ec1c94a359f8 GIT binary patch literal 70768 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 literal 0 HcmV?d00001 diff --git a/client/public/assets/cohere.png b/client/public/assets/cohere.png new file mode 100644 index 0000000000000000000000000000000000000000..3da0b8373718dae770a167a7bf8bdfaeff6d6074 GIT binary patch literal 26469 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�{8_7UI5^g2Ap2?nfRRIj+Y^K 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∓a5!7H0tKFqsR1Q) zQQM9RhsC&0MQCN`4A zJtoD4ArEY97orIC*c|RdVzNPbNigaXT&j2wiH9x|Kv^*HVRnRvJoV8yIcD;=cHqNvn|%j%mCKeFLlT!f^929(GzH4wF1FDY_iy?hsC5b`xHsuIamK(h@t z-x;mASPh$Sa!=s1vyL`A2|vQgp(>Ty1r__k#eH;{f0JK}%mdU+%FK;gw^oki4$*9y=HL90>qNgV+s>qO6E<}Q} zyq?#_iQH%`$+%CoLPpDET9c}cX540mpJgB9CogG;h-e7%wv>G z^Qst|d?$EB`Y-FAFq1_R*z*ihZ)ypg@gNKaY{O9LnWl; zS{1-K=1ww8t_WY1)7TlI7^s?XEdR1?$2pn>L?V`lx3Vx|4bg{GOW2jUPjAfjPx>Fe z0=L%jC4c{`r#V2IaMeMD8QX?JNn%oTk%2>cSAi7gNMYsQNXl&Y3~G)n_|vvI3NdJP zp5@G9*U?sFXncpntOF|`$0hROvyEPK8|Sy%U0;k-=imH2K4&_f`6K`Rc*!0CFPF`# zsMW}0NHwP3Ty8Z=d}zK#T3_BesXS0T#kSczLzr-nvGPndDvXS4F+NXtco~K;l>SWm zipkG`nXsapd^d9z^KI-QYZbj6gUq-3RDPtG?UYwMVw?328gw#-4O;4RDuA4$2~a93 z^dWruBjEnS2UNWFPLcokIM04hom5Md10>E5KDfA~iU5z$IP3tz>=$1u5C2=Ar1zSuM%U`RIVTbN^ zFVz*2WgiCVip@?Islowq%S#g7faFVybEuS3-5dhZmr{j%P+(o?|J8eiNKK8)+Y2tc5O;adJycgAqod+e^YeV7h7%?Ea*7!;lYId4 z6A6;#mw8CB=}IFDQlMUdNH#Pe-?%-=QE?*|w5(`_U5x0)zj2$NCp3Zi)T0$Ia!Zf! zSBgLt*&HHTF_gR-$46Rq2-)+uusn5~#ZxO1Ga3%MIrgCI9pjWhLe7+l3a477N*DhY zz@I6`C!_~hqJ)>9Xyy^dEGP2>kvN@){6nYCcYteYoo$)Lf>)ooSk#fUc&43WcaV;T zCf6A3Ru*e0s%6`N3n#_8wNzLoXG{ElKKtGuz{(aZp@0au~X%GQOeI~6N9j4x+dw=6~D zs{^66?HWiNjrIV_*go~(ttNA+)cqAQ znOB)+OnIB|01nvvEZLC;jOrj&JR3lqj#ce+{Q&-rm+-~Ta{M)BK?e4R7dPVQl zX@cYUr|aEAS=674n0aDRx@E3rnN>$okgtx80h#19eK5_5XO*h8rE>{~!I>}G$&AEd zC(iO`3qFnGg3B))k4CG-Cx7+&yi%$y`o%X{HE-PuKdKE!)hHdCeVlwU5R5gFh3L3D za6rW^l1<|UOJ9U|v4?u3TpF*4g6p{x=bps<9`}%`^(}ea;j)WxbmFKiyU?c|-RceZ z<9!mopi}Xz=?gX0bJ3W3j;th$eyee`V;=W>JZUB?oCYhFu^iFILLev~JpMdnLw<`R z@^@POP=dXm#t4;-KPPX^FtReszOWo;=&H%jw}(X1qIZ9X|0vIGx{t&W`mI7E+H2uj zXCdd5?~YSKmFTq7?KFMHwIlB?#rdOmp)mYUjmqo|Ai;<|}2oylP=tSRC zVl*;VMibdt6*1ALpyv3S2K-GCgLm*pUwR@y9dJ97dkJVZpUxO7^I$%Ue_2AcqM1DN zxHRkr(g0}n$=hN@fFFdD{-UU+)(mD2*-Y4-L5hOzkx0>t-bQ~t&7)%<{ME1D;~8eu5tY<)vMPR35F59O>8IAW>(hU-3w+u}I) z{BuPy6h7uc#i5(W0oDjL_WV@mT$=`t5%Vn)4trRys z0A721MA9k<(=WpZoq7|N-GR&Rc?E8Z zF=;Wb=|Vh{%K~<>I9j-HqNCPJFK?BH58_(vc$2Xj2M?S;X0x+ z_{OYY%juez9ITt}dD$lA*v3xFcDdSWn*-a^V6tjb)GhK+^ZijAJqz%s8^wou?xhM< zi3g=7(Xz=or-_g*vJ`&A(?vy!OC%p%witvTe)RZ0Y;kl5LLBWAbX-Ub_IUSigosVc z+5eE|D+}dw|6a@;r1U4cqkTzR%gwx`xWrk$gi)xjgX zNGJEqVs$h$OLRGW+`cGX<^Z{a(z4)HmtTlBR}SX1h*8DR5B& zHt+|#b^B;2C4${Z#vt};vY19b1;_K;>;lrT#9VgJoadRPay`bPnPr)&LJdU4o-1EI zrj}IRP%t1nmAy7!a*Ai-NTpwtoZy!&CO4jN1l!kO>C1#C1xS0EAXd|2tjetvM0hpL zJAEr%vhs~^!AXueUlbJXwcjD^RCq%suJj#B_*`T;kTV~GXAEEM2p{gHKdG77g)@*w zaNn+e_my7;drS^o=(n3zeae+}JObS?Hi}jcgYBwEWIX<+%qloxrjU7gwJC z>_l5JpEgV%CyWTr$v&aiD0~xN(Z`j3&>IcYJBS}2n5+jcP(?Sk22~JMKrsg{ywfE& z$3&mf;RnY}pS&?A9J$If6yh8_GTDvUeJE(KU8~Kdn_Sh5^J!zN1do9QW8Ib=7)1Pz z8UkZY%wmj;9ppRC^qhF{#BxoJH7@68kD($y)|^Ww;-Q<|D9`v)JO|U;{|XnG47_@% z@izN(Q{={Ll)SuB=FBhA$wb0>N&V7 zp(aH}*McY6D_VZcu9Tly??IEUg$^?=_=sNx;^bp%V>C&kI5c9`5u>K!o0IZ2$t911 z32t8oP9}TO4}PgwGg%o5JQ9qUW{ej^1x$cDp5ul`q?6Iuo33h`oF@@b@+ICVkVp{k zfz`@+Q*YVcrI?F093OJHEHsH82&Cd<<8jFW%%IIdI}=}wO`lWR;Ke;{w|aauK1q>a zs32VNm0YyWg#6;dqko=o0KV8-o@0`-#*5z~*(WC0PR`4&gAc+Z7fJb)f@chvWB~D6 z3Atzr+6G;7;Pj2B@q54aJGeEE!|4M)`SI%!y57bgx*Rsj+mIAcDxnO10h-m7EK@NW z>aauFKA++UeNdr9-ZlCcq4=JU!H!1ylD;ZbWm3p1l|Ux^nqVsOH~%FY5j~!S6lAn$ zuHt$-clySg_Dph%9e@6oKZYNAVjVUb!d0yED*QvH{CS*Ks6?E~0vRc!BZ|Qxd+M3E zpcu|8Bf(yJJr%l6ikfrvKL)#1%u><)CDt2y60Hxi3DO&hmoK9iJ~+WkxuX^H~jy~*GUj6%925f z5j7YKuZMU1^g^2BL$m?Knehaqfp~K+k}6M@fdR(>M=~=ufwdZ?G(=aLR1z^z?b(8< znQ$l!rPJy~GAJ2H85@@lK|e%v{{jd8elKLIklQ+^(P*Zg#06NE3AYSDAfcio17ZVV z{?CbV=&-z`o%iii9Ta-S!ENXO$!md;w1mR}|r z*UG2U4&9&Qb}5Jt1R9(Q-VxG*F5e;{dmIAK>?eUQPV(7z#``{kq+y@}C%QN!o|u!pRqy=D3ShiM^#7&q zy#sB#s&esf>~rqDX(WO4goIE6fzSfdqzfor-wTKa1eBr_ks=5pSSd<*O8G81ZjbU^j_~h=j`$OW6d$fH^!Xn+?(Xyyu6j%v-e(W&QZTHW?gILkw-)e zFV|U|_;Q7*L%GEMX?#W;0{qw$=i^u+Y*ESxMiQ7T9egcu4?jox+ChykrLbwKg>daW z?JM~umd8kwP}uDiD!e6Hp?c=i*_=&oGLFpS0vQhdGE_UOs z1rz4$$>!E=fzz5!G)!50N+yiU87q@L4TRMuz(Qen+MAx-vn2qv27Mx&_t^8a=VS;2 zhB|Y;4N=`14fKtd_txBjlXTWglAhix+JfEa_gQiZy@w8W|>EN)E&@sBr zq`OW!3hm=cK<_#=qF>DF3 zfj>9k6w|_9VA~R1k@g_b?kQ++{Ma?MY+7vuYE!t0m1v4+YDw&$#&5H&*-OlLCcTnA z8oaVX9z3C|EmbzmieG6OOZ;-Zm3}!+WAN*_Z_q)LW;1&)-_(aTpSCzQ-WG(SZ&Ag8 zjy=E!_?`<8c{c9grf6v~F76CX^0A&KV;<+WzKYqu*fl+Gt?A=!CC?5wSr^ga$v#TA zx^p)XCIrFM9o_1t(+t!gQyVjj4gam0B;bOX9!a8jH5A7%O*gPokOv``h4rsZz5(6u zCi1%KU$ZSjx};yHdGO8m*I6)xzEz&YMVUr$iDo3YnVnezEjmPU%Q98Ip?la({Cn)5 z01)fJq;t`@`;=6={?(#K_N#p__wiAzWo>Hnr+zM>Fnv#Vs1)}Ho-ObJU0>oK{_wA` zCyw>)Yxw5Bel4BT@}I;7$Jf-i(bNDM?jk^{C9GbMlY-zhLqT+t9AJBqm$W}0#H$x( zqE>6kvA+pTR4S51j_r!r>E8uEIu~o(*RZFK)4z2pE`m7m!QX@MmW1TCGx46zRT5^VCUQJ=LT3>E- z&FrM4x7)>~L-+Op_EB9hN%WB~4sDhE&s1`*?R4>pqd1xA6N(f^3-Ic&aGI(}d^_I* z{eUO=sZpdr@9a@xk*5lH0)=gs_|{R#td6-UGKOWQH2v*$jbI;fsvPF*kud6b37;jK4Zy)z z+R!CF|K3lveL1`L_}dr06>Hmf5I2^|Vx%IQ?T7MRse0anHKJnZ>#eGpfqm7?ecWhO zn~$?fAdk-vk}}cb_j+~uv^2FON$ks#ep`-QZY=SsKmSMUspFqs{Wn<1BBZ1ie4H%? zM@}H5f8@cA61y&^mH}bPKZ6XD`xiA&jl`@GJ(6!edOP3kLWI{+%XFS7Wf!22pq|TS zsgE(0DD+=y3hL`s8~0S{RQ8i%z*O-*!s`cT0d*v4SjhV0}{<0WfnI~NK4^&yNNDx*mDNx)5`M#Ejm zoo6oSeimA~a9UxAZW`S&pdnYA$8Y+_)IZOpjG9^iZT3qXKieY`WUp)ykFAI|m$l5!vJMljCHaLwgK3&xo$3@bv`?r_+t<4YIez@EvV>GY z+j(E|js-Z)Mk&9~p0MwFS$vnrUy3Kni#%>0z6f>#jg^RH2g*SnZ%r;Z%~+E3+|=kyCX}9j zDd(Y^s3?7-`r$ygh0j2zfnxrTH;rhjA9%KNtZ%ykj_86p5`E75NVGYG$hpZ^K|RgA zk?y3Is{0pBH*N##fIF;0%gPeDlx2#%tN`>43LL@uWWU%_TlOsPCyq$Yvqxd~xI;BR zswN}URtEB2k8x{#vKQ%Uj$FCRfw#$Xsd+9t4h0~R@4&M1_D{`Nyt;b)gW z^Xzn}x)qyEYy>+lzXD4rj=S?Muse@8J?>>V`+KLioE4^+pfw6=q;jl`nBU9>N-p4d z#u)ajyPxNOp2wPh8GF2`*y<_~t2uUt?1U-wplTLwSrm3-}t%v(|@j|KKFGjby%?ff)4G$T+#bNQ!H ztT=CfcEjTUJhN(;Hb{|iNkYS&(ADGWJIk%5`=GQA zY>S%1=!iU#l4rh7^x`hRh*^h_RjRBA8(Cg7|HUB4pTA`TNUE~SQ@-ss z$ToYpSqy8#N`uksN7~t7$(KQ49CVx-NR%^vwH)F zuueSfYG!WJq1h4f&j-@B%*Hw*@Dn-$B2%jHDQ5qpiAVT>d}TabE~Vg9FBgp!*-j^Y zC*I;a`yuVlJf+*}T~?YV_nn4HiO-;DNLJ^Uru#_;zGKBFT18V^5-^^wZ|D*qef|6K z`bWG7+b_8sSN8bw-~Ah2e9vd#;&U#@zwW z4f`7BxUSy`O1%?L#eRpErt}=kMZqbxjl_a`W*n!&8}A*w;l|iVPRYqWsqt4KSrTKD zE-<4_C#NB-fwxnyQ0P(lY4R4|nkNu2wGphL$wUoKh~D%L-%H@IDIW0|w>(M07}0a+ z2Tg@y<<1A*suiKG6v%Lf@6^T3Kcxn()`H+-)9bgd#FhH4~R2?;;h#ZI|i z*`;f2kXo7bV7`Qw2t?O~{X4~x!hVY6w-!e!20-V!L>n{boKl!gjuFilyErTHEBS{HY&J=KTyLD3 zBIjiv$ryKuzlE*v>C97lsOBl&f)%&7_i_NyN+7;^!^HWKuA8L1Z6g^he~(-A%^s!A z=<-DH@;p8yFMC1cIH>-`Fu#qQW40nWN|tep`N~M*U7blw$M44>rd zB^h*l;(H$|GkHq$bu|GCFP=8_GR!Co_$U>;UDEZj3`|Q4W@
*;*!hL!zWW@4p_0AqwkyHH8uM!7Y*?{IyQ@ynSry=Oa6e^61cBbKkMaxe+~=xo@|+T%iN`O1>HC+4CkQY}}F1b51EVi#pTq zQNAC_Gw_Y;lNm<2`SW?6FmC9W%O9lZF93K4hQ}n3VvxrZi7dk?&gT3x%wN>7RryUn zKp{^*_TcA;nA%@OsX>46Qf}yJyKHEfmUj&!IF>MZprXP9qy7IYcr}Q(jc$E-Xm< z`F5ak>~ihkv)Uok@Ac<6jlW%Ydq9h9Oy&C+HY$1lK{Ton!!V z63L(godf@&L7MrpPugcU(oPDcic7})hALLKEO6Z2Zi#z5=KeVTZnwf>btS2H#U+>H z%OCn2KJ~VL#E<^#2hgQrA&abwQ2sD^1c3H2u^E=QL(f)lp9{)zR-c37H_0QkkvzpN zAwq;`5B$wL(f#*kTGbc}U2W#J#-BBmzV~mK1MHxEU1XMFqt|}=u_t%Rh4GY(N$wUho&srU$n()0JW$TpGDzj@jt&RZ)V+N#fRj>ruigi) zJKN)_35nd;*{nmRIq5!4JI?{5>NM9p(7CoGr-ORZ*4?w$TEZ(fi@*6=A3&Mb(05&V z$#!s6v|PhZjzMGM^>n_B|1?_-c={a{dGr#}S0A+RX*$>T8O1G@v+{e}6Z=7i)0pD5!rDDhB+p%`V4nTp0FUt)0`>EP^ zwZ^YbAh=IN6j5|3alQfWA%L8ut-Nm_OB?z)8AgzK>1I47o@l&Wjz-fq?D-@3 zm8H}2wFj|plvPBaCi}z&G{+9T0>0|eUY<~*O) zNN@-obh7Xu0tjrmY$F?R%pv>C_2{*aXMeb`hz_LbA?;miR97@8X`G9#g_I}!A6?`6 zodu@y{E)rye;r_0{3&8DN6=8WNx@baD4h-c;bjz4(v0j7F;&s$am2PNpKMQ-M?`=n zuzvXtTz2loxcvM}uztlF7LcjqQ!E;i*SMwYj#+VCOg5gCiJMXE1{J0<9r3Wa;HN-( zaH09ad{-i&v$uZ_@CQee*YaD+S45-Dc*UepiBBQCrC10|x+J2W$JOm*MI>b4PL>tu zHauBe1cxA_!Jd$1#8b3Ve1`ulCq#X2k2O_f|Ff~lGm2MQrvn@X!eJC?y}jdW!l|t*TdG)xzXqVwSU(4NVa7oGcMZiMJ;OO;_jAk zZEB?3hAS^$49@H8sj-6LC_s^nUgY((APN=T4~o}}(t~M$$Qe6}S4ao$BO@%V@d?p!8PrNj|ehd1|SZ;Xu={7h8}A zW4>uv$?q&XEJj*GD;E6lat5Is_r>YA8O8zXU?WPJon*t2W+A)PT!S^94t{|v& z-Jw~V*=UQV?oYl;iU3*s=DyCM<@WQKEQa*hRV&lZ`_h*A$?nc-c5V5v#+i_;)~5Jg zLb4$=%;xf%50z$l$Y($;$%Z8&FE{`OI#K;gC!j&Kau~U-1wwDXo2_;(>8^tS4zC{;BH~%#4OMdAa_|oe#Jb zO9A&5w-QRC3YGOI03)CI;c6$@+V~x+;QU%}X zVKf;DtSigwJMtMdM5o$9;X#;s6QJ|mB6>k2*JYY~+ITu|iR(ONUVY*=W1Apsky`V@ z%x%neMes3Q628c`9B|6=S|%CT#d#aXfZkseNmkZ-!9+9B1Mwl9NBCx2Cp!*oUn>rK zNmMr3Qjn+cO>ed*GHn#Pc1_7X7SllZsrt`-L>TqDHTa1Sh_>T^?P$Il;Sff6X;apKw+n0vmeJ&_ zIiT36(qoy~Ufgzc*fbG~tTiVL!?(@7;1=U~b`4{Td@!E1<>)>N6LqXQv^&J%hkUMCue`ri7haN2%mcy3*&6)ZsX>}l2jMh^j>eo`o`JtNly%4cUBDi;#=NbNgvaraW44n-UaaxsGXu4-%$0K{PD5cU|Q}>`#m_GnylO?k+M8<9Jwmw zH=QDm$tSJ8@eTNDjs=UAGCdx-r}-oq%6x0|)oFVUv(334-x3%$`}#B`jWbQ|>I3$D z^QRxF0U$tf!Y+Pxyig39O>2%0$B^qS&oCdFnGPD97eapUUo*Mk$l8(2I=)EJ-}TL% zg_sSPu1}^89NK&dQcRM)9ZJ0qye+fbPxaLscW#VhJ|Q|v2<%&&TA&LYlhJ-+TCz4u z;W&_FZh(jjPz4-V!g*!!h^C5Y)?QP_eMjK7?zV&@id5@m|Wh3i)T*} z?$k8o-kXsRzqzoMXW8b-Dn?%@Cy=5_xln%b_-F6t+VSGM#NaK-{f)-(h z`(mr@(pT|wW@jFpd)yD?62$dXu3pfw2&rr}+(_hFmRU*Ulqw+Gy|PNQk>&LIj7`mS zs*v4;lgT!+g>R@Qzj^&Euum?GfY+QRl`nlxx{4?CPV_V)mvSx3u84S=^B3*)j0r0t zTX1hwPg1J-)ls&FhNH=3WO0jtM5c96glLXprz11M1=mFfi#bvJJ7aYQswJgl+&9mr zvGPzpR1EWl8iVCKu4m*6-^bs?PkX=ev2v#aPZ*HaT|8$$XRZw)G1oO19bW$_03KhO zv|ZpsWp~DE_WG#Hvoji-m7UXJL~BNuIU2h_cIQ0j4(m~4oXKjrdVObs>RG<<8q%%4 zt#%sOXBX|>@!r*XyFk;w@3b4e6B;9$qp~|G!afvnzfZo!iyxbZ#!! z4&!!b$!C*1JLIHlY8$X{>fMDjyc8>N6J; zyOP7=`odB%ZxWh{Njn?UU+{BQM&Z+~ekM;vWxDn&3pnYUOyXc98U|q9w;m`&4BAuvT?Rut-oX z5r3Q9TD9-xPj(pUB}ww>8|M)La|wSB>@atp<9n zCuDdPUE9PGh3sL&yrf)F;-~W$(sw@A#`&Q%|){hA?cO*<~Ha-x<`k=`swZu>kEg0)> z+zuJp4y@y-T>k{48UCFfS};FR4Scp@s1J;*owMnpVJY~SUy6jnAMtmD_dbRhKNW-d z0gPRJKPlq*j-`(c^S3 zyUhC|)6F#t8pap_%7jAClOHTOw;y#JU$%WAB$s5vUgpq;WYwDAbDU)K^)xH?hkOSb zjB*m^3y#SK;aM&f-B-3!2V1^9sXrBb}~5{-Kc zoQvsthcPADIZnjouSiw!vKQrIuiTiXPKPykqwK?8sfMR)>tBh-AdUdw#{j&}&yI1P zWl1uS;5(~Z!zY`X{WuJd{u_gIX*wK)g1p${#_7yGym~v2iddTnCkowujAh3bbO_|cS0`TCVrC}i;~=|&7ASK_U@vXrA`FSCKV1N`n5v`H!2 z$*&UUQ{dQ+_n?M&wgf+203Ik4jj~{%5LJD(LS07x;{vxDCQG|Zf!`$0ySrW9CX?&h zX!^vPhF)TP#FZ|~F^wnrC~qpXvXaFP@pFByDhRpANz?B#)u+kgq%)g~PLRj_&WFaQ zdlrb74Y1LTZVo7Iw(vVX7zgd#wD~_!HGNKz8qZeAT*Edrk!g0e-?aPR@32UB{6!hF zy+5zYF=SZGOO`@1h0=76{lokvZ0^&#+#fKl${l`&XO!|h-Ou*(axQ~p22qM@uvBDQ z!if7T3~qPy1mI#u)@`bj5>D9?y4``nHermpy-ZJa8M$%Dwl+IQtcQ3+fiUZFY_{;< z{bGjAI46rs$d|S`SsA+1&}5__bcdz~h8E1TG#;*ecToz-7IW3h60xC4j<`#R-Q7I| zQAu0^BFAO=r`diMd)y?jmT5`J@aFb3{o|TH2gc=6j~&)8WGSvGhvy>h_!!-!TVOEm z9t_`cX`9V)d5jmeQE^s6Z)lQ}R}(ot++u_`_MrLOygB_286xKe9kO&bP_s*VYkkx# zSjYmaVgbmj(WVlUZmu6MgOMt&f+NY>r!Y*^;kHhSBsrekuZ`BqoesPuqH%8+6UoNq z=ZbW0aX-kzLCXphImYqM?ZU{G;(jF{i5 z{YdnD`?Fz#{2~({##AWFjQJHCGyyBbxIXKFP1ytzo`y6!M!zJQs?Wqi;x|o`@^WGN z5FrzbLp>QyVkZX@88>3sLGp65yV0iW&5n#y)odn^3)*$RQ;^dR-$CT|C7hF6!w{O} zvKWmxE-_qV)%g&A_gz&Yh?smPf-kN~(JS5d()`yNNzwVY%30W!2#4R1#&9H`8sx>6 zhbZa#;zN}QipvxNOiQbFgj2gxD<+n))i*pnE*3F39I+k&ZhrwFa(#t<50L-#_P`Zt6gYGx ze8I6|@=IiaCYRYL6YJuk3;(J7${i0l0VNvax`gleJnLb`b{%R^fc&1OrRgH#Ym4*! zRq%dM?3V%y>_ekf1ZSi5{e}ekBzL>mZ4I(|Bl{3NtILdCOtwR{C97e!)GR|+kNB4D zMzAOzs2*~6nG$_~mU2p$!=Ib*pn6>lCMEi#(^u*IuJE0^&gD`w7K}Jb|PDI zp6%pha#DVmavi@JdQPKatKyzz| z69n7mc+`GL4CF>a&nRQGN^Iu5O*{lxoqjBR8p>x2bV>&TAis^5H|NE;svmuLZ@`7I zw4Eo8rqP_^c)Io*qBuNJ)2S?M^Dr+xwcq}tN6;o?J5M&^DMddgQI9i0+$6ygmt?M* z8 zG9Xok#ZgEfIGR*Yk4k$donRT(QpD`5kgSGnk43?jy|&_3_qjdp`AZMLv9~)8vdEd? ziiEn}8y|T1l7vLQaGy%v*1~y!my#$}qoZpxvSxV`Pl-h2N%obKZ;hSTa{!YZ?q_Ns zHR3QV61l{EK$y?yq+BQ=r^lVuNbAUbpmHuV`>NZNu^jwuW;f~WbT!dWhZqkw4rLS0 zV}w=9ooekD`BkIDA}v2q ztW8BFka%K*Z-s1^5l)ba;)F?atDd*N%r?8Q?35P56Hw5y0D``29^Gjfz<%=A` zNU`Na@2$AKEn!A`#Pm5tL>2OsV;)X~*gVx#`CML7DNKN5PB*Vq$5giffE**hH&w6~ zJ0}>Fq~{GmG;kgwo(yWogJjM)ie%Y>Am7IlnOhXty4V7UU}bfBMcVq>It0M>h@1m}_0q z$Qw4Ka;d#5dT{5X$EXZ+87Jc8e@kxGaMYorlTo*E#;;+3{m;H1r7Qxc`+0%I$^v)& z`TO9c-+e4rR#!T?N5|>kIu&nv!pm^>_s_^lc@W2Q*Q%uXjuFbju75)gL!n&ny{-h& zz_Kr6Drc)+qKI91V^-3B(S#Z~Z*=pLv0{lW+qU4S6K;s(?sRh;b&F$h(9wtCvI{Q3 zY2WxhzWar5;=5n`CN4YwQqOe}LVcbaOR@=Wd2~{7D`?A1Gx6hoDtRWkR);X~JU(1Y zC?2SdSJ5!l@#R@Kw)?Ea1Dsup&tCr4L2D#ZhbJ8~@jy6COMmX)qIAvioxq%zYYb)I z=2RW>#30eM3Dh`Of$u*`F!D0QGp#ovW48+(p*lq`0I5eE^{x=X%~bUVy+Apy_j0lE za+IXe@({k&{yFb@=OSM_O(;+rT2XrU;6vc;=*$-z>ekG zz$<;2S3UFU=H~MCdW@U*>f4boYCn4}RqUz^BRrLq)s-0GV(hbdU+$`$%wyMe&GxHw zd-|j1AZT!@IT?LNi3s*R;5vBr2Va7Njy`0Uq^-wa|ISyX$L2b0 zs!QAKOHJ`kq~4WWFz3S_@Acc(Te`X4dNQqi_BIZ+q73@Pn^@ z2Ma7Vm6`L=*xymA??}|L+I^q58S|XamB1X1H}68s<^0WL%KGj+miv}w^Z2RqM`yws z{1rCe79Gq z*kv=hn`yx=pUO;xwHBt|oy?6+lF{U=F;nF0WzvS%;sslxO{q|0(`YlwLKfKn;OpWA zpZGu6Yrnk*R@n99)9?By-u=8c()-*)pCoh9jqRl_dpcR{9;wIcq-L)0$fTSvFU`)% zhT_gXMdkP_4icKeH@n~Uk@v;V|G^WGUP`$O$JajoCH(1=UXC4??MQX24f&{@k72A! zuHlyD<(2`>_@rh-Ex$*3E`#EW-v3<3d=~|J|7Uz#Z9k)wr&E3=JqPyj-x{+#Bi&PB z#7U)~9=TcRuYi}M2l<3d5c$I>3^o-Hat|lhS^0CjIm}!3Ly{~5zcEWxjIpV><={Ca zj3={=r+G(kCjmasdWA{kINfNR1tsKmQAmA(x?5CE6Q)Fb_v_Xeh0z`?@la@X;jy!2IIj;lif1$sQ1bv zevv%$uL4;WJn7G#i~BtO!B@KD0|1BK@Ce-Pxa^7$kvF(;>;YK@SiX{M z`>LX=blE%3`~=Y?O~TChdE=_>Q7Z}2IyNRbCvkyJV|~u>UQhLtq^j>#34lk;kbwN^P>=X#pO^MoF#D~1%5`M&vE%FFL+=z#cj_^ z0=!)lO5*+*2FpFo*het=L5S`o@7`PX!Y{q{>A2G)?~SW^-0%)J!##fK{y6vBXW;Db zoq-iBu%Qad{w|d7iJ}5%ozwcjh$@v$e zF0(fTIf+It&U++$X0qMYtZbvp zCY?8CZY?Y>EMBA(HO#Y!CL6OMe$f_Wn!Fj9$A3vDk6SW^{buZl2Xt(rPH_y!W!RAX zL75LQ*VL+SA0? z^`s64^WxlB_Ba88g($wPz^xK4G|8G3p@3jTldu@_>cCSmZ1V24x)qQ7qbK3^54+pI zKv(TJ|I~Bvr;mF%PW#pmu(q-0x^|u1DrYT&?9>EAj*ntTF3fuv{kjy|#ZEk+N_ORg zXyil^vW<>We0TOKJ_E^8mqKUuNOqmdk`t;bL0^JqS|+8+$?k;)1~PH~DbGG+EFN{! zWAOZce#Jn-t9P9F?bGmk_jyLz|HHU(Sy(6b0kWS{TY&i8(cw5ol*PaX2{SX!s{Ffn z(cZ@6z0ivLJn9-!UOZMB9U1$b%73h0$t6Hm zo$=-#P`~{o=Q9{wZez z%OzG#U-GythO={b!&Ll4Y ztai%{?5x_-iMo>0({ot>?RS?8pj60aHS#-<0H{7(MQ#O6{Yht=M)YLuv^?g8vpyYg z*{iKw1fTjSaob`GZhhZ7?ADGC09^O_2jkfveks2EfzRQ+FZ?rHa{eXQv0OvkTFLv3 zvfO<8rGtvrlc9)+gxPz#I;q8FI1*zI0JBWLtk*AbYb9Uf491D6qw86NQ0~D#RZ6#; zHaRmc3Wg||c?nI$Q>0sbhpeOFEMRJ}alOq!-IRg&xIDh9ze=njfu=iA4N~04Kfh z(byBmVK+GnM;v#3{OEsv=;t&AO|^f~lg@f+X|+{w%SwArP6=Mv|AMC`O{u~}V_dkDxmsJ5~!qNibMBf4B}Wteu^9wz8hf zLFF4RD3@?fh078$JB=c=*W>ssx37<#qGjfzqb&7+vGko*7ymMD ze&<_Zv*U_OFUMcL_$~O%UwjnHwKZ(PR+p0jVeN+JW`rx%t;X0SyI7k~dgruDm}q7a z;8qHKI3Rx+xX{LrWkYi@ej-s;9DJWxuQ0RZhxa}*rx7(@<6w161m2gLzHQD z+xzId@zR)5uW~egzWhRZM}+0uU7fNh_S$zJyz;-^*3;Zg$7kRB3B2u@uXPzcnh9F@ zrrNAm_=Fk(`$j`cZ5XspWZs&}-?BwqB5s61dj>{%!#xq_nJRgX68931fBmy?`v?8_ zF57NbkL{OTfoGiXXkfWaeYB8_y^n$qjzz1%diQr<<*W8%l*`Lqp91oa0DwS$zm=gn zG@a7h(Ta^)kii`~JoRi`%r0#?K1lbn+wJ$f8WGkZByo;O!UjgI!|(F7#+aWWC22a` zaz*6Ceml467y<~%!bYoi*|K$a=o7N5o94xUM*?zu(2kN*ZYx|>8)+qq zxn5kE0$EduDB0C*j@!D}f;;}q-S=q62LKi;3q16NkHYW$`|EN1U2cgjD_c?`g0PFN z;{$|;;6dxZi!GoEe;}kz<&!ni*LF>rj&^^87S+@YVgc`Wp+w{%)UNPa_yoAAjONDC z@aDgzdX;(DDfQa%*^sQXBTPd-QArKHZx(FCjcbw2XNU%9Z+cQCkrV=q@In<(;Fw$9 z2z&ClA`S0)-tLz>(rDC1j4Vx26&6Zc5Z;TQMzSdI#*>YMcteW0FV}f zjER)L3f}kLf8RaQ@d1Es`|O1q-{EH7Nb~C-3{jkit)m>8QpZ|Y3(L+Rjg2nhR9W}p zL;h6S`{94tX=X3>l*wEhM3ypBw3(R^o+dUqV>4D9T|}0;7j6%U%1+-y&}5@d77yK~ zwyo7@-z)ZPMkeP*_Q8}-#Jwl3bJiZ@bbR9{|{EpS|#c z_q`1FdE!H`eYqC7R}qtYZlCJ$oa
&0gg$Qs_qg1b0xY%4lD|$8NEeqI9Hs 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%0Df%JO@bMsi;||ionw6%wHb8KD7b;?k=G*0 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 literal 0 HcmV?d00001 diff --git a/client/public/assets/groq.png b/client/public/assets/groq.png new file mode 100644 index 0000000000000000000000000000000000000000..83ea028f95a004a9367a8a20f94c516be97ebf74 GIT binary patch literal 23360 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 literal 0 HcmV?d00001 diff --git a/client/public/assets/mistral.png b/client/public/assets/mistral.png index ff2f3e8b63bd8f193f84c4d070152beed8ee7e80..beaffab92cccb427c718ca7aba76e79ff5ea38e5 100644 GIT binary patch literal 4799 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 literal 548 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 GJO2Qg5r0kq literal 0 HcmV?d00001 diff --git a/client/public/assets/perplexity.png b/client/public/assets/perplexity.png new file mode 100644 index 0000000000000000000000000000000000000000..e3edc716d2a2154726ecf86c214c813b3e108632 GIT binary patch literal 14309 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 OLQYCqvRd3Y`2PUwcD~dA literal 0 HcmV?d00001 diff --git a/client/public/assets/shuttleai.png b/client/public/assets/shuttleai.png new file mode 100644 index 0000000000000000000000000000000000000000..411b5ad34001669baa6d807afae98f7b765b34d3 GIT binary patch literal 261079 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%0D#xaAgD(g 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�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 ^WegQ&nAHA0bo+8IaNLchJ~opktK_88BH^ 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 U007cclK=n!07*qoM6N<$f)&O=`Tzg` literal 0 HcmV?d00001 diff --git a/client/public/assets/together.png b/client/public/assets/together.png new file mode 100644 index 0000000000000000000000000000000000000000..0401507937e5ad1c72e218ec03b2cd523e65e5c4 GIT binary patch literal 20985 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 }ID2 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 z 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 literal 0 HcmV?d00001 diff --git a/client/public/fonts/Inter-BoldItalic.woff2 b/client/public/fonts/Inter-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bc50f24c8731ec8cbf75effb9cdc2b6129b65dfb GIT binary patch literal 118392 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

PpnM7rmcaRdv`(TIH`Wo&Af(jeZ4x_MBq+ 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 Go#c)i* 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 literal 0 HcmV?d00001 diff --git a/client/public/fonts/roboto-mono-latin-400-italic.woff2 b/client/public/fonts/roboto-mono-latin-400-italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75d29cff8e3751199dc3adff94f9048040a1d714 GIT binary patch literal 14052 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 WB*@S0000&$vnUS literal 0 HcmV?d00001 diff --git a/client/public/fonts/roboto-mono-latin-400-normal.woff2 b/client/public/fonts/roboto-mono-latin-400-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..53d081f3a538a63578c15a5cc11219b32e6d5795 GIT binary patch literal 12764 zcmV<2F(b}*Pew8T0RR9105RME4gdfE09y0_05O380RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/client/public/fonts/roboto-mono-latin-700-normal.woff2 b/client/public/fonts/roboto-mono-latin-700-normal.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..92fe38dd414bb9ad9092af52f25b9c5e1da86d71 GIT binary patch literal 12740 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 K_kQC>0000$be6yX literal 0 HcmV?d00001 diff --git a/client/public/fonts/signifier-bold-italic.woff2 b/client/public/fonts/signifier-bold-italic.woff2 deleted file mode 100644 index cebb25db24a207e16157034fd16793a00fc03f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56682 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 z 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 b1r|#GQSBRGbazEJ`>bJL{O9?KleN?Wmp*)F diff --git a/client/public/fonts/signifier-bold.woff2 b/client/public/fonts/signifier-bold.woff2 deleted file mode 100644 index b76fecbacb3e685e418bbfe0700d5a5b882091af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56021 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 diff --git a/client/public/fonts/soehne-buch-kursiv.woff2 b/client/public/fonts/soehne-buch-kursiv.woff2 deleted file mode 100644 index 8d4b03588c268146b40b32d78e40de377b06dffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34084 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 diff --git a/client/public/fonts/soehne-halbfett-kursiv.woff2 b/client/public/fonts/soehne-halbfett-kursiv.woff2 deleted file mode 100644 index f7fd3c64b0052881d7b239e61d34eb03c4fd629d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40456 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 Ua7D*K(_gkbug8@HEvi6v0d5#{X#fBK diff --git a/client/public/fonts/soehne-halbfett.woff2 b/client/public/fonts/soehne-halbfett.woff2 deleted file mode 100644 index 19ed66001eab7a6dcb6ba9e2ca00719bbc767768..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37996 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 diff --git a/client/public/fonts/soehne-kraftig-kursiv.woff2 b/client/public/fonts/soehne-kraftig-kursiv.woff2 deleted file mode 100644 index 669ab6920f28d038caab58732047ccc37db9ec62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38746 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 diff --git a/client/public/fonts/soehne-kraftig.woff2 b/client/public/fonts/soehne-kraftig.woff2 deleted file mode 100644 index 59c98a170f684a5030798030869d1e8c566de735..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35690 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 { - - - - - - - - + + + + + + diff --git a/client/src/Providers/AssistantsContext.tsx b/client/src/Providers/AssistantsContext.tsx index 51561887996..10079083a2f 100644 --- a/client/src/Providers/AssistantsContext.tsx +++ b/client/src/Providers/AssistantsContext.tsx @@ -1,14 +1,10 @@ +import { useForm, FormProvider } from 'react-hook-form'; import { createContext, useContext } from 'react'; +import { defaultAssistantFormValues } from 'librechat-data-provider'; import type { UseFormReturn } from 'react-hook-form'; -import type { CreationForm } from '~/common'; -import useCreationForm from './useCreationForm'; +import type { AssistantForm } from '~/common'; -// type AssistantsContextType = { -// // open: boolean; -// // setOpen: Dispatch>; -// form: UseFormReturn; -// }; -type AssistantsContextType = UseFormReturn; +type AssistantsContextType = UseFormReturn; export const AssistantsContext = createContext({} as AssistantsContextType); @@ -23,7 +19,9 @@ export function useAssistantsContext() { } export default function AssistantsProvider({ children }) { - const hookValues = useCreationForm(); + const methods = useForm({ + defaultValues: defaultAssistantFormValues, + }); - return {children}; + return {children}; } diff --git a/client/src/Providers/AssistantsMapContext.tsx b/client/src/Providers/AssistantsMapContext.tsx new file mode 100644 index 00000000000..850e7d31290 --- /dev/null +++ b/client/src/Providers/AssistantsMapContext.tsx @@ -0,0 +1,8 @@ +import { createContext, useContext } from 'react'; +import { useAssistantsMap } from '~/hooks/Assistants'; +type AssistantsMapContextType = ReturnType; + +export const AssistantsMapContext = createContext( + {} as AssistantsMapContextType, +); +export const useAssistantsMapContext = () => useContext(AssistantsMapContext); diff --git a/client/src/Providers/FileMapContext.tsx b/client/src/Providers/FileMapContext.tsx new file mode 100644 index 00000000000..2e189cacb7d --- /dev/null +++ b/client/src/Providers/FileMapContext.tsx @@ -0,0 +1,6 @@ +import { createContext, useContext } from 'react'; +import { useFileMap } from '~/hooks/Files'; +type FileMapContextType = ReturnType; + +export const FileMapContext = createContext({} as FileMapContextType); +export const useFileMapContext = () => useContext(FileMapContext); diff --git a/client/src/Providers/index.ts b/client/src/Providers/index.ts index ab8b65d785d..32e5c25dc49 100644 --- a/client/src/Providers/index.ts +++ b/client/src/Providers/index.ts @@ -2,4 +2,6 @@ export { default as ToastProvider } from './ToastContext'; export { default as AssistantsProvider } from './AssistantsContext'; export * from './ChatContext'; export * from './ToastContext'; +export * from './FileMapContext'; export * from './AssistantsContext'; +export * from './AssistantsMapContext'; diff --git a/client/src/Providers/useCreationForm.ts b/client/src/Providers/useCreationForm.ts deleted file mode 100644 index 6fadf4c947a..00000000000 --- a/client/src/Providers/useCreationForm.ts +++ /dev/null @@ -1,19 +0,0 @@ -// import { useState } from 'react'; -import { useForm } from 'react-hook-form'; -import type { CreationForm } from '~/common'; - -export default function useViewPromptForm() { - return useForm({ - defaultValues: { - assistant: '', - id: '', - name: '', - description: '', - instructions: '', - model: 'gpt-3.5-turbo-1106', - function: false, - code_interpreter: false, - retrieval: false, - }, - }); -} diff --git a/client/src/common/assistants-types.ts b/client/src/common/assistants-types.ts index 7dc6906e7a8..3b9ad27da36 100644 --- a/client/src/common/assistants-types.ts +++ b/client/src/common/assistants-types.ts @@ -1,19 +1,23 @@ -import type { Option } from './types'; +import { Capabilities } from 'librechat-data-provider'; import type { Assistant } from 'librechat-data-provider'; +import type { Option, ExtendedFile } from './types'; -export type TAssistantOption = string | (Option & Assistant); +export type TAssistantOption = + | string + | (Option & Assistant & { files?: Array<[string, ExtendedFile]> }); export type Actions = { - function: boolean; - code_interpreter: boolean; - retrieval: boolean; + [Capabilities.code_interpreter]: boolean; + [Capabilities.image_vision]: boolean; + [Capabilities.retrieval]: boolean; }; -export type CreationForm = { +export type AssistantForm = { assistant: TAssistantOption; id: string; name: string | null; description: string | null; instructions: string | null; model: string; + functions: string[]; } & Actions; diff --git a/client/src/common/types.ts b/client/src/common/types.ts index 1ca169a0c1c..a5a8a01c11b 100644 --- a/client/src/common/types.ts +++ b/client/src/common/types.ts @@ -1,21 +1,107 @@ import { FileSources } from 'librechat-data-provider'; +import type { ColumnDef } from '@tanstack/react-table'; +import type { SetterOrUpdater } from 'recoil'; import type { + TSetOption as SetOption, TConversation, TMessage, TPreset, TLoginUser, TUser, EModelEndpoint, + Action, + AuthTypeEnum, + AuthorizationTypeEnum, + TokenExchangeMethodEnum, } from 'librechat-data-provider'; import type { UseMutationResult } from '@tanstack/react-query'; +import type { LucideIcon } from 'lucide-react'; + +export type GenericSetter = (value: T | ((currentValue: T) => T)) => void; + +export type LastSelectedModels = Record; + +export const mainTextareaId = 'prompt-textarea'; + +export enum IconContext { + landing = 'landing', + menuItem = 'menu-item', + nav = 'nav', + message = 'message', +} + +export type NavLink = { + title: string; + label?: string; + icon: LucideIcon; + Component?: React.ComponentType; + onClick?: () => void; + variant?: 'default' | 'ghost'; + id: string; +}; + +export interface NavProps { + isCollapsed: boolean; + links: NavLink[]; + resize?: (size: number) => void; + defaultActive?: string; +} + +interface ColumnMeta { + meta: { + size: number | string; + }; +} + +export enum Panel { + builder = 'builder', + actions = 'actions', +} + +export type FileSetter = + | SetterOrUpdater> + | React.Dispatch>>; + +export type ActionAuthForm = { + /* General */ + type: AuthTypeEnum; + saved_auth_fields: boolean; + /* API key */ + api_key: string; // not nested + authorization_type: AuthorizationTypeEnum; + custom_auth_header: string; + /* OAuth */ + oauth_client_id: string; // not nested + oauth_client_secret: string; // not nested + authorization_url: string; + client_url: string; + scope: string; + token_exchange_method: TokenExchangeMethodEnum; +}; + +export type AssistantPanelProps = { + index?: number; + action?: Action; + actions?: Action[]; + assistant_id?: string; + activePanel?: string; + setAction: React.Dispatch>; + setCurrentAssistantId: React.Dispatch>; + setActivePanel: React.Dispatch>; +}; + +export type AugmentedColumnDef = ColumnDef & ColumnMeta; + +export type TSetOption = SetOption; -export type TSetOption = (param: number | string) => (newValue: number | string | boolean) => void; export type TSetExample = ( i: number, type: string, newValue: number | string | boolean | null, ) => void; +export const defaultDebouncedDelay = 450; + export enum ESide { Top = 'top', Right = 'right', @@ -72,7 +158,7 @@ export type TSetOptionsPayload = { setAgentOption: TSetOption; // getConversation: () => TConversation | TPreset | null; checkPluginSelection: (value: string) => boolean; - setTools: (newValue: string) => void; + setTools: (newValue: string, remove?: boolean) => void; }; export type TPresetItemProps = { @@ -99,6 +185,7 @@ export type TAskProps = { export type TOptions = { editedMessageId?: string | null; editedText?: string | null; + resubmitFiles?: boolean; isRegenerate?: boolean; isContinued?: boolean; isEdited?: boolean; @@ -136,9 +223,9 @@ export type TAdditionalProps = { setSiblingIdx: (value: number) => void; }; -export type TMessageContent = TInitialProps & TAdditionalProps; +export type TMessageContentProps = TInitialProps & TAdditionalProps; -export type TText = Pick; +export type TText = Pick & { className?: string }; export type TEditProps = Pick & Omit; export type TDisplayProps = TText & @@ -172,6 +259,11 @@ export type TDialogProps = { onOpenChange: (open: boolean) => void; }; +export type TPluginStoreDialogProps = { + isOpen: boolean; + setIsOpen: (open: boolean) => void; +}; + export type TResError = { response: { data: { message: string } }; message: string; @@ -198,7 +290,7 @@ export type TAuthConfig = { test?: boolean; }; -export type IconProps = Pick & +export type IconProps = Pick & Pick & { size?: number; button?: boolean; @@ -207,6 +299,8 @@ export type IconProps = Pick & className?: string; endpoint?: EModelEndpoint | string | null; endpointType?: EModelEndpoint | null; + assistantName?: string; + error?: boolean; }; export type Option = Record & { @@ -214,13 +308,15 @@ export type Option = Record & { value: string | number | null; }; +export type OptionWithIcon = Option & { icon?: React.ReactNode }; + export type TOptionSettings = { showExamples?: boolean; isCodeChat?: boolean; }; export interface ExtendedFile { - file: File; + file?: File; file_id: string; temp_file_id?: string; type?: string; @@ -229,9 +325,17 @@ export interface ExtendedFile { width?: number; height?: number; size: number; - preview: string; + preview?: string; progress: number; source?: FileSources; + attached?: boolean; + embedded?: boolean; } export type ContextType = { navVisible: boolean; setNavVisible: (visible: boolean) => void }; + +export interface SwitcherProps { + endpoint?: EModelEndpoint | null; + endpointKeyProvided: boolean; + isCollapsed: boolean; +} diff --git a/client/src/components/Auth/Login.tsx b/client/src/components/Auth/Login.tsx index b7eeb59a5e8..c811ac0a146 100644 --- a/client/src/components/Auth/Login.tsx +++ b/client/src/components/Auth/Login.tsx @@ -3,6 +3,8 @@ import { useNavigate } from 'react-router-dom'; import { useGetStartupConfig } from 'librechat-data-provider/react-query'; import { GoogleIcon, FacebookIcon, OpenIDIcon, GithubIcon, DiscordIcon } from '~/components'; import { useAuthContext } from '~/hooks/AuthContext'; +import { ThemeSelector } from '~/components/ui'; +import SocialButton from './SocialButton'; import { getLoginError } from '~/utils'; import { useLocalize } from '~/hooks'; import LoginForm from './LoginForm'; @@ -11,7 +13,6 @@ function Login() { const { login, error, isAuthenticated } = useAuthContext(); const { data: startupConfig } = useGetStartupConfig(); const localize = useLocalize(); - const navigate = useNavigate(); useEffect(() => { @@ -20,112 +21,155 @@ function Login() { } }, [isAuthenticated, navigate]); + if (!startupConfig) { + return null; + } + + const socialLogins = startupConfig.socialLogins ?? []; + + const providerComponents = { + discord: ( + + ), + facebook: ( + + ), + github: ( + + ), + google: ( + + ), + openid: ( + + startupConfig.openidImageUrl ? ( + OpenID Logo + ) : ( + + ) + } + label={startupConfig.openidLabel} + id="openid" + /> + ), + }; + + const privacyPolicy = startupConfig.interface?.privacyPolicy; + const termsOfService = startupConfig.interface?.termsOfService; + + const privacyPolicyRender = privacyPolicy?.externalUrl && ( + + {localize('com_ui_privacy_policy')} + + ); + + const termsOfServiceRender = termsOfService?.externalUrl && ( + + {localize('com_ui_terms_of_service')} + + ); + return ( -

-
-

+
+
+ +
+
+

{localize('com_auth_welcome_back')}

{error && (
{localize(getLoginError(error))}
)} - {startupConfig?.emailLoginEnabled && } - {startupConfig?.registrationEnabled && ( -

+ {startupConfig.emailLoginEnabled && } + {startupConfig.registrationEnabled && ( +

{' '} {localize('com_auth_no_account')}{' '} - + {localize('com_auth_sign_up')}

)} - {startupConfig?.socialLoginEnabled && startupConfig?.emailLoginEnabled && ( - <> -
-
Or
-
-
- - )} - {startupConfig?.googleLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> - - - )} - {startupConfig?.facebookLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> - - - )} - {startupConfig?.openidLoginEnabled && startupConfig?.socialLoginEnabled && ( + {startupConfig.socialLoginEnabled && ( <> -
- - {startupConfig.openidImageUrl ? ( - OpenID Logo - ) : ( - - )} -

{startupConfig.openidLabel}

-
+ {startupConfig.emailLoginEnabled && ( + <> +
+
+ Or +
+
+
+ + )} +
+ {socialLogins.map((provider) => providerComponents[provider] || null)}
)} - {startupConfig?.githubLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> - - - )} - {startupConfig?.discordLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> - - +
+
+ {privacyPolicyRender} + {privacyPolicyRender && termsOfServiceRender && ( +
)} + {termsOfServiceRender}
); diff --git a/client/src/components/Auth/LoginForm.tsx b/client/src/components/Auth/LoginForm.tsx index eddb824f764..102c4826576 100644 --- a/client/src/components/Auth/LoginForm.tsx +++ b/client/src/components/Auth/LoginForm.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import { useForm } from 'react-hook-form'; import { useLocalize } from '~/hooks'; import { TLoginUser } from 'librechat-data-provider'; @@ -6,15 +7,23 @@ type TLoginFormProps = { onSubmit: (data: TLoginUser) => void; }; -function LoginForm({ onSubmit }: TLoginFormProps) { +const LoginForm: React.FC = ({ onSubmit }) => { const localize = useLocalize(); - const { register, handleSubmit, formState: { errors }, } = useForm(); + const renderError = (fieldName: string) => { + const errorMessage = errors[fieldName]?.message; + return errorMessage ? ( + + {String(errorMessage)} + + ) : null; + }; + return (
+ />
- {errors.email && ( - - {/* @ts-ignore not sure why*/} - {errors.email.message} - - )} + {renderError('email')}
@@ -71,35 +65,23 @@ function LoginForm({ onSubmit }: TLoginFormProps) { aria-label={localize('com_auth_password')} {...register('password', { required: localize('com_auth_password_required'), - minLength: { - value: 8, - message: localize('com_auth_password_min_length'), - }, - maxLength: { - value: 128, - message: localize('com_auth_password_max_length'), - }, + minLength: { value: 8, message: localize('com_auth_password_min_length') }, + maxLength: { value: 128, message: localize('com_auth_password_max_length') }, })} aria-invalid={!!errors.password} - className="peer block w-full appearance-none rounded-md border border-gray-300 bg-gray-50 px-2.5 pb-2.5 pt-5 text-sm text-gray-900 focus:border-green-500 focus:outline-none focus:ring-0" + className="webkit-dark-styles peer block w-full appearance-none rounded-md border border-black/10 bg-white px-2.5 pb-2.5 pt-5 text-sm text-gray-800 focus:border-green-500 focus:outline-none dark:border-white/20 dark:bg-gray-900 dark:text-white dark:focus:border-green-500" placeholder=" " - > + />
- - {errors.password && ( - - {/* @ts-ignore not sure why*/} - {errors.password.message} - - )} + {renderError('password')}
- + {localize('com_auth_password_forgot')}
@@ -107,12 +89,13 @@ function LoginForm({ onSubmit }: TLoginFormProps) { aria-label="Sign in" data-testid="login-button" type="submit" - className="w-full transform rounded-md bg-green-500 px-4 py-3 tracking-wide text-white transition-colors duration-200 hover:bg-green-600 focus:bg-green-600 focus:outline-none"> + className="w-full transform rounded-md bg-green-500 px-4 py-3 tracking-wide text-white transition-colors duration-200 hover:bg-green-550 focus:bg-green-550 focus:outline-none disabled:cursor-not-allowed disabled:hover:bg-green-500" + > {localize('com_auth_continue')}
); -} +}; export default LoginForm; diff --git a/client/src/components/Auth/Registration.tsx b/client/src/components/Auth/Registration.tsx index 9ef96048874..02e462a0f24 100644 --- a/client/src/components/Auth/Registration.tsx +++ b/client/src/components/Auth/Registration.tsx @@ -1,15 +1,16 @@ import { useForm } from 'react-hook-form'; -import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; +import React, { useState, useEffect } from 'react'; import { useRegisterUserMutation, useGetStartupConfig } from 'librechat-data-provider/react-query'; import type { TRegisterUser } from 'librechat-data-provider'; import { GoogleIcon, FacebookIcon, OpenIDIcon, GithubIcon, DiscordIcon } from '~/components'; +import { ThemeSelector } from '~/components/ui'; +import SocialButton from './SocialButton'; import { useLocalize } from '~/hooks'; -function Registration() { +const Registration: React.FC = () => { const navigate = useNavigate(); const { data: startupConfig } = useGetStartupConfig(); - const localize = useLocalize(); const { @@ -22,23 +23,20 @@ function Registration() { const [error, setError] = useState(false); const [errorMessage, setErrorMessage] = useState(''); const registerUser = useRegisterUserMutation(); - const password = watch('password'); - const onRegisterUserFormSubmit = (data: TRegisterUser) => { - registerUser.mutate(data, { - onSuccess: () => { - navigate('/c/new'); - }, - onError: (error) => { - setError(true); + const onRegisterUserFormSubmit = async (data: TRegisterUser) => { + try { + await registerUser.mutateAsync(data); + navigate('/c/new'); + } catch (error) { + setError(true); + //@ts-ignore - error is of type unknown + if (error.response?.data?.message) { //@ts-ignore - error is of type unknown - if (error.response?.data?.message) { - //@ts-ignore - error is of type unknown - setErrorMessage(error.response?.data?.message); - } - }, - }); + setErrorMessage(error.response?.data?.message); + } + } }; useEffect(() => { @@ -47,15 +45,123 @@ function Registration() { } }, [startupConfig, navigate]); + if (!startupConfig) { + return null; + } + + const socialLogins = startupConfig.socialLogins ?? []; + + const renderInput = (id: string, label: string, type: string, validation: object) => ( +
+
+ + +
+ {errors[id] && ( + + {String(errors[id]?.message) ?? ''} + + )} +
+ ); + + const providerComponents = { + discord: ( + + ), + facebook: ( + + ), + github: ( + + ), + google: ( + + ), + openid: ( + + startupConfig.openidImageUrl ? ( + OpenID Logo + ) : ( + + ) + } + label={startupConfig.openidLabel} + id="openid" + /> + ), + }; + return ( -
-
-

+
+
+ +
+
+

{localize('com_auth_create_account')}

{error && (
@@ -66,308 +172,95 @@ function Registration() { className="mt-6" aria-label="Registration form" method="POST" - onSubmit={handleSubmit((data) => onRegisterUserFormSubmit(data))} + onSubmit={handleSubmit(onRegisterUserFormSubmit)} > -
-
- - -
- - {errors.name && ( - - {/* @ts-ignore not sure why*/} - {errors.name.message} - - )} -
-
-
- - -
- - {errors.username && ( - - {/* @ts-ignore not sure why */} - {errors.username.message} - - )} -
-
-
- - -
- {errors.email && ( - - {/* @ts-ignore - Type 'string | FieldError | Merge> | undefined' is not assignable to type 'ReactNode' */} - {errors.email.message} - - )} -
-
-
- - -
- - {errors.password && ( - - {/* @ts-ignore not sure why */} - {errors.password.message} - - )} -
-
-
- { - // e.preventDefault(); - // return false; - // }} - {...register('confirm_password', { - validate: (value) => - value === password || localize('com_auth_password_not_match'), - })} - aria-invalid={!!errors.confirm_password} - className="peer block w-full appearance-none rounded-md border border-gray-300 bg-gray-50 px-2.5 pb-2.5 pt-5 text-sm text-gray-900 focus:border-green-500 focus:outline-none focus:ring-0" - placeholder=" " - > - -
- - {errors.confirm_password && ( - - {/* @ts-ignore not sure why */} - {errors.confirm_password.message} - - )} -
+ {renderInput('name', 'com_auth_full_name', 'text', { + required: localize('com_auth_name_required'), + minLength: { + value: 3, + message: localize('com_auth_name_min_length'), + }, + maxLength: { + value: 80, + message: localize('com_auth_name_max_length'), + }, + })} + {renderInput('username', 'com_auth_username', 'text', { + minLength: { + value: 2, + message: localize('com_auth_username_min_length'), + }, + maxLength: { + value: 80, + message: localize('com_auth_username_max_length'), + }, + })} + {renderInput('email', 'com_auth_email', 'email', { + required: localize('com_auth_email_required'), + minLength: { + value: 1, + message: localize('com_auth_email_min_length'), + }, + maxLength: { + value: 120, + message: localize('com_auth_email_max_length'), + }, + pattern: { + value: /\S+@\S+\.\S+/, + message: localize('com_auth_email_pattern'), + }, + })} + {renderInput('password', 'com_auth_password', 'password', { + required: localize('com_auth_password_required'), + minLength: { + value: 8, + message: localize('com_auth_password_min_length'), + }, + maxLength: { + value: 128, + message: localize('com_auth_password_max_length'), + }, + })} + {renderInput('confirm_password', 'com_auth_password_confirm', 'password', { + validate: (value) => value === password || localize('com_auth_password_not_match'), + })}
-

- {' '} +

{localize('com_auth_already_have_account')}{' '} - + {localize('com_auth_login')}

- {startupConfig?.socialLoginEnabled && ( - <> -
-
Or
-
-
- - )} - {startupConfig?.googleLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> - - - )} - {startupConfig?.facebookLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> - - - )} - {startupConfig?.openidLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> - - - )} - {startupConfig?.githubLoginEnabled && startupConfig?.socialLoginEnabled && ( + {startupConfig.socialLoginEnabled && ( <> - - - )} - {startupConfig?.discordLoginEnabled && startupConfig?.socialLoginEnabled && ( - <> -
- - -

{localize('com_auth_discord_login')}

-
+ {startupConfig.emailLoginEnabled && ( + <> +
+
+ Or +
+
+
+ + )} +
+ {socialLogins.map((provider) => providerComponents[provider] || null)}
)}
); -} +}; export default Registration; diff --git a/client/src/components/Auth/RequestPasswordReset.tsx b/client/src/components/Auth/RequestPasswordReset.tsx index 4980b4f27f6..ded90c7db65 100644 --- a/client/src/components/Auth/RequestPasswordReset.tsx +++ b/client/src/components/Auth/RequestPasswordReset.tsx @@ -5,6 +5,7 @@ import { useRequestPasswordResetMutation, } from 'librechat-data-provider/react-query'; import type { TRequestPasswordReset, TRequestPasswordResetResponse } from 'librechat-data-provider'; +import { ThemeSelector } from '~/components/ui'; import { useLocalize } from '~/hooks'; function RequestPasswordReset() { @@ -48,7 +49,7 @@ function RequestPasswordReset() { setBodyText( {localize('com_auth_click')}{' '} - + {localize('com_auth_here')} {' '} {localize('com_auth_to_reset_your_password')} @@ -61,83 +62,101 @@ function RequestPasswordReset() { } }, [requestPasswordReset.isSuccess, config.data?.emailEnabled, resetLink, localize]); + const renderFormContent = () => { + if (bodyText) { + return ( +
+ {bodyText} +
+ ); + } else { + return ( +
+
+
+ + +
+ {errors.email && ( + + {/* @ts-ignore not sure why */} + {errors.email.message} + + )} +
+
+ + +
+
+ ); + } + }; + return ( -
-
-

{headerText}

+
+
+ +
+
+

+ {headerText} +

{requestError && (
{localize('com_auth_error_reset_password')}
)} - {bodyText ? ( -
- {bodyText} -
- ) : ( -
-
-
- - -
- {errors.email && ( - - {/* @ts-ignore not sure why */} - {errors.email.message} - - )} -
-
- -
-
- )} + {renderFormContent()}
); diff --git a/client/src/components/Auth/ResetPassword.tsx b/client/src/components/Auth/ResetPassword.tsx index 664c95377ce..bf6aa7944a3 100644 --- a/client/src/components/Auth/ResetPassword.tsx +++ b/client/src/components/Auth/ResetPassword.tsx @@ -3,6 +3,7 @@ import { useForm } from 'react-hook-form'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { useResetPasswordMutation } from 'librechat-data-provider/react-query'; import type { TResetPassword } from 'librechat-data-provider'; +import { ThemeSelector } from '~/components/ui'; import { useLocalize } from '~/hooks'; function ResetPassword() { @@ -29,13 +30,16 @@ function ResetPassword() { if (resetPassword.isSuccess) { return ( -
-
-

+
+
+ +
+
+

{localize('com_auth_reset_password_success')}

{localize('com_auth_login_with_new_password')} @@ -52,14 +56,17 @@ function ResetPassword() { ); } else { return ( -
-
-

+
+
+ +
+
+

{localize('com_auth_reset_password')}

{resetError && (
{localize('com_auth_error_invalid_reset_token')}{' '} @@ -108,19 +115,19 @@ function ResetPassword() { }, })} aria-invalid={!!errors.password} - className="peer block w-full appearance-none rounded-md border border-gray-300 bg-gray-50 px-2.5 pb-2.5 pt-5 text-sm text-gray-900 focus:border-green-500 focus:outline-none focus:ring-0" + className="webkit-dark-styles peer block w-full appearance-none rounded-md border border-black/10 bg-white px-2.5 pb-2.5 pt-5 text-sm text-gray-800 focus:border-green-500 focus:outline-none dark:border-white/20 dark:bg-gray-900 dark:text-white dark:focus:border-green-500" placeholder=" " >
{errors.password && ( - + {/* @ts-ignore not sure why */} {errors.password.message} @@ -142,30 +149,30 @@ function ResetPassword() { value === password || localize('com_auth_password_not_match'), })} aria-invalid={!!errors.confirm_password} - className="peer block w-full appearance-none rounded-md border border-gray-300 bg-gray-50 px-2.5 pb-2.5 pt-5 text-sm text-gray-900 focus:border-green-500 focus:outline-none focus:ring-0" + className="webkit-dark-styles peer block w-full appearance-none rounded-md border border-black/10 bg-white px-2.5 pb-2.5 pt-5 text-sm text-gray-800 focus:border-green-500 focus:outline-none dark:border-white/20 dark:bg-gray-900 dark:text-white dark:focus:border-green-500" placeholder=" " >
{errors.confirm_password && ( - + {/* @ts-ignore not sure why */} {errors.confirm_password.message} )} {errors.token && ( - + {/* @ts-ignore not sure why */} {errors.token.message} )} {errors.userId && ( - + {/* @ts-ignore not sure why */} {errors.userId.message} @@ -176,7 +183,7 @@ function ResetPassword() { disabled={!!errors.password || !!errors.confirm_password} type="submit" aria-label={localize('com_auth_submit_registration')} - className="w-full transform rounded-md bg-green-500 px-4 py-3 tracking-wide text-white transition-colors duration-200 hover:bg-green-600 focus:bg-green-600 focus:outline-none" + className="w-full transform rounded-md bg-green-500 px-4 py-3 tracking-wide text-white transition-all duration-300 hover:bg-green-550 focus:bg-green-550 focus:outline-none" > {localize('com_auth_continue')} diff --git a/client/src/components/Auth/SocialButton.tsx b/client/src/components/Auth/SocialButton.tsx new file mode 100644 index 00000000000..7e76c6f7638 --- /dev/null +++ b/client/src/components/Auth/SocialButton.tsx @@ -0,0 +1,60 @@ +import React, { useState } from 'react'; + +const SocialButton = ({ id, enabled, serverDomain, oauthPath, Icon, label }) => { + const [isHovered, setIsHovered] = useState(false); + const [isPressed, setIsPressed] = useState(false); + const [activeButton, setActiveButton] = useState(null); + + if (!enabled) { + return null; + } + + const handleMouseEnter = () => { + setIsHovered(true); + }; + + const handleMouseLeave = () => { + setIsHovered(false); + }; + + const handleMouseDown = () => { + setIsPressed(true); + setActiveButton(id); + }; + + const handleMouseUp = () => { + setIsPressed(false); + }; + + const getButtonStyles = () => { + // Define Tailwind CSS classes based on state + const baseStyles = 'border border-solid border-gray-300 dark:border-gray-800 transition-colors'; + + const pressedStyles = 'bg-blue-200 border-blue-200 dark:bg-blue-900 dark:border-blue-600'; + const hoverStyles = 'bg-gray-100 dark:bg-gray-700'; + + return `${baseStyles} ${ + isPressed && activeButton === id ? pressedStyles : isHovered ? hoverStyles : '' + }`; + }; + + return ( + + ); +}; + +export default SocialButton; diff --git a/client/src/components/Auth/__tests__/Login.spec.tsx b/client/src/components/Auth/__tests__/Login.spec.tsx index 5a70a5fec54..a076ba5c9b6 100644 --- a/client/src/components/Auth/__tests__/Login.spec.tsx +++ b/client/src/components/Auth/__tests__/Login.spec.tsx @@ -31,13 +31,14 @@ const setup = ({ isLoading: false, isError: false, data: { - googleLoginEnabled: true, + socialLogins: ['google', 'facebook', 'openid', 'github', 'discord'], + discordLoginEnabled: true, facebookLoginEnabled: true, + githubLoginEnabled: true, + googleLoginEnabled: true, openidLoginEnabled: true, openidLabel: 'Test OpenID', openidImageUrl: 'http://test-server.com', - githubLoginEnabled: true, - discordLoginEnabled: true, registrationEnabled: true, emailLoginEnabled: true, socialLoginEnabled: true, @@ -78,23 +79,23 @@ test('renders login form', () => { expect(getByRole('button', { name: /Sign in/i })).toBeInTheDocument(); expect(getByRole('link', { name: /Sign up/i })).toBeInTheDocument(); expect(getByRole('link', { name: /Sign up/i })).toHaveAttribute('href', '/register'); - expect(getByRole('link', { name: /Login with Google/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Google/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Google/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Google/i })).toHaveAttribute( 'href', 'mock-server/oauth/google', ); - expect(getByRole('link', { name: /Login with Facebook/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Facebook/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Facebook/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Facebook/i })).toHaveAttribute( 'href', 'mock-server/oauth/facebook', ); - expect(getByRole('link', { name: /Login with Github/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Github/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Github/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Github/i })).toHaveAttribute( 'href', 'mock-server/oauth/github', ); - expect(getByRole('link', { name: /Login with Discord/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Discord/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Discord/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Discord/i })).toHaveAttribute( 'href', 'mock-server/oauth/discord', ); diff --git a/client/src/components/Auth/__tests__/Registration.spec.tsx b/client/src/components/Auth/__tests__/Registration.spec.tsx index 324d593a1a6..d4a98900709 100644 --- a/client/src/components/Auth/__tests__/Registration.spec.tsx +++ b/client/src/components/Auth/__tests__/Registration.spec.tsx @@ -32,14 +32,14 @@ const setup = ({ isLoading: false, isError: false, data: { - googleLoginEnabled: true, + socialLogins: ['google', 'facebook', 'openid', 'github', 'discord'], + discordLoginEnabled: true, facebookLoginEnabled: true, + githubLoginEnabled: true, + googleLoginEnabled: true, openidLoginEnabled: true, openidLabel: 'Test OpenID', openidImageUrl: 'http://test-server.com', - githubLoginEnabled: true, - discordLoginEnabled: true, - emailLoginEnabled: true, registrationEnabled: true, socialLoginEnabled: true, serverDomain: 'mock-server', @@ -85,23 +85,23 @@ test('renders registration form', () => { expect(getByRole('button', { name: /Submit registration/i })).toBeInTheDocument(); expect(getByRole('link', { name: 'Login' })).toBeInTheDocument(); expect(getByRole('link', { name: 'Login' })).toHaveAttribute('href', '/login'); - expect(getByRole('link', { name: /Login with Google/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Google/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Google/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Google/i })).toHaveAttribute( 'href', 'mock-server/oauth/google', ); - expect(getByRole('link', { name: /Login with Facebook/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Facebook/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Facebook/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Facebook/i })).toHaveAttribute( 'href', 'mock-server/oauth/facebook', ); - expect(getByRole('link', { name: /Login with Github/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Github/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Github/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Github/i })).toHaveAttribute( 'href', 'mock-server/oauth/github', ); - expect(getByRole('link', { name: /Login with Discord/i })).toBeInTheDocument(); - expect(getByRole('link', { name: /Login with Discord/i })).toHaveAttribute( + expect(getByRole('link', { name: /Continue with Discord/i })).toBeInTheDocument(); + expect(getByRole('link', { name: /Continue with Discord/i })).toHaveAttribute( 'href', 'mock-server/oauth/discord', ); diff --git a/client/src/components/Chat/ChatView.tsx b/client/src/components/Chat/ChatView.tsx index 30a7edc187e..604c8f1e78a 100644 --- a/client/src/components/Chat/ChatView.tsx +++ b/client/src/components/Chat/ChatView.tsx @@ -2,16 +2,13 @@ import { memo } from 'react'; import { useRecoilValue } from 'recoil'; import { useParams } from 'react-router-dom'; import { useGetMessagesByConvoId } from 'librechat-data-provider/react-query'; -import { useChatHelpers, useSSE } from '~/hooks'; -// import GenerationButtons from './Input/GenerationButtons'; +import { ChatContext, useFileMapContext } from '~/Providers'; import MessagesView from './Messages/MessagesView'; -// import OptionsBar from './Input/OptionsBar'; -import { useGetFiles } from '~/data-provider'; -import { buildTree, mapFiles } from '~/utils'; +import { useChatHelpers, useSSE } from '~/hooks'; import { Spinner } from '~/components/svg'; -import { ChatContext } from '~/Providers'; import Presentation from './Presentation'; import ChatForm from './Input/ChatForm'; +import { buildTree } from '~/utils'; import Landing from './Landing'; import Header from './Header'; import Footer from './Footer'; @@ -22,9 +19,7 @@ function ChatView({ index = 0 }: { index?: number }) { const submissionAtIndex = useRecoilValue(store.submissionByIndex(0)); useSSE(submissionAtIndex); - const { data: fileMap } = useGetFiles({ - select: mapFiles, - }); + const fileMap = useFileMapContext(); const { data: messagesTree = null, isLoading } = useGetMessagesByConvoId(conversationId ?? '', { select: (data) => { @@ -38,7 +33,7 @@ function ChatView({ index = 0 }: { index?: number }) { return ( - + {isLoading && conversationId !== 'new' ? (
@@ -48,8 +43,6 @@ function ChatView({ index = 0 }: { index?: number }) { ) : ( } /> )} - {/* */} - {/* */}
diff --git a/client/src/components/Chat/CreationHeader.tsx b/client/src/components/Chat/CreationHeader.tsx deleted file mode 100644 index ad22e1aa81f..00000000000 --- a/client/src/components/Chat/CreationHeader.tsx +++ /dev/null @@ -1,113 +0,0 @@ -// import { useState } from 'react'; -import { Plus } from 'lucide-react'; -import { useListAssistantsQuery } from 'librechat-data-provider/react-query'; -import type { Assistant } from 'librechat-data-provider'; -import type { UseFormReset, UseFormSetValue } from 'react-hook-form'; -import type { CreationForm, Actions, Option } from '~/common'; -import SelectDropDown from '~/components/ui/SelectDropDown'; -import { cn } from '~/utils/'; - -const keys = new Set(['name', 'id', 'description', 'instructions', 'model']); - -type TAssistantOption = string | (Option & Assistant); - -export default function CreationHeader({ - reset, - value, - onChange, - setValue, -}: { - reset: UseFormReset; - value: TAssistantOption; - onChange: (value: TAssistantOption) => void; - setValue: UseFormSetValue; -}) { - const assistants = useListAssistantsQuery( - { - order: 'asc', - }, - { - select: (res) => - res.data.map((assistant) => ({ - ...assistant, - label: assistant?.name ?? '', - value: assistant.id, - })), - }, - ); - - const onSelect = (value: string) => { - const assistant = assistants.data?.find((assistant) => assistant.id === value); - if (!assistant) { - reset(); - return; - } - onChange({ - ...assistant, - label: assistant?.name ?? '', - value: assistant?.id ?? '', - }); - const actions: Actions = { - function: false, - code_interpreter: false, - retrieval: false, - }; - assistant?.tools - ?.map((tool) => tool.type) - .forEach((tool) => { - actions[tool] = true; - }); - - Object.entries(assistant).forEach(([name, value]) => { - if (typeof value === 'number') { - return; - } else if (typeof value === 'object') { - return; - } - if (keys.has(name)) { - setValue(name as keyof CreationForm, value); - } - }); - - Object.entries(actions).forEach(([name, value]) => setValue(name as keyof Actions, value)); - }; - - return ( - ( - - - - - - {'Create Assistant'} - - - )} - /> - ); -} diff --git a/client/src/components/Chat/CreationPanel.tsx b/client/src/components/Chat/CreationPanel.tsx deleted file mode 100644 index 448487976ac..00000000000 --- a/client/src/components/Chat/CreationPanel.tsx +++ /dev/null @@ -1,229 +0,0 @@ -import { Controller, useWatch } from 'react-hook-form'; -import { Tools, EModelEndpoint } from 'librechat-data-provider'; -import { useCreateAssistantMutation } from 'librechat-data-provider/react-query'; -import type { CreationForm, Actions } from '~/common'; -import type { Tool } from 'librechat-data-provider'; -import { Separator } from '~/components/ui/Separator'; -import { useAssistantsContext } from '~/Providers'; -import { Switch } from '~/components/ui/Switch'; -import CreationHeader from './CreationHeader'; -import { useNewConvo } from '~/hooks'; - -export default function CreationPanel({ index = 0 }) { - const { switchToConversation } = useNewConvo(index); - const create = useCreateAssistantMutation(); - const { control, handleSubmit, reset, setValue } = useAssistantsContext(); - - const onSubmit = (data: CreationForm) => { - const tools: Tool[] = []; - console.log(data); - if (data.function) { - tools.push({ type: Tools.function }); - } - if (data.code_interpreter) { - tools.push({ type: Tools.code_interpreter }); - } - if (data.retrieval) { - tools.push({ type: Tools.retrieval }); - } - - const { - name, - description, - instructions, - model, - // file_ids, - } = data; - - create.mutate({ - name, - description, - instructions, - model, - tools, - }); - }; - - const assistant_id = useWatch({ control, name: 'id' }); - - // Render function for the Switch component - const renderSwitch = (name: keyof Actions) => ( - ( - - )} - /> - ); - - return ( -
- ( - - )} - /> -
- {/* Name */} -
- - ( - - )} - /> - ( -

{field.value ?? ''}

- )} - /> -
- {/* Description */} -
- - ( - - )} - /> -
- - {/* Instructions */} -
- - ( -

sqxAlJ^kPGvE1MD)WT;?Oaov0cnC9*+B>9Q01UW2O=KA2jejGv(Q2Xdw=JHFxMhZahkOlCAFO}$g13NVt{yMPXa#mj@v^^R(=pckNb=@8G)A;t0|z+0 z`;Cov=EI>Zt~pxqG3e2-a8ppZjXoh|y zhUsssR{mrqt@CJ$A+Ynu485$RvNpDx0?Ff5qS@>CR?cF7K_Uv}2v7TJb`WHkOKsa< zL)IA&407)0j?%w5xRkXOQ>HB4okidDEOShN{no&by}uNczy>WsL-YoVm_mG6vpfp0 zSs_LskM8+BKIMDhmGPlaB;zBCP>vf8^RPuG!uHfYi-=wGf_gxMa(bDcb53_=OY6X? zf#)}S)T9T`_}=>tfQ1NIi%1(cJVGR| zVQy*NQJN#PcRBKDdwY8|djQ>}I{$PEz_B9~hV<635tV~BZfqez>W8t%wf3qTgj&LJ zL6pe(u`XU@Vz$Ug9w?TCZ8ui97cK;53*V^3AwjOLY8ywJdM`=BMaEH z4@ggZT4XtlnAEwQBcs-^7Ns!1h*)H!ogj3AH53>FxnWKw@;2QPn1lbY`{s{l|B*6Y zyrVs)?5cWIIymyXJgecav)TA$xE?Cf2FCJbifS1vA5pBvjqJe{?iRGV#_;Xw%}w18 z^U~o7L6SjHnaXrXoO1@|MW9R@+-a7u<17*A>Ac~Rc}1lSMswi0X!ViZwvpa3?YR{( zq>`Q_D9Iv5;lv8dOwDj?L}G~~AzBaQc+!HaR@&)taoO`u9-XKbDXo>~Q^t-4EDU^@ z*gAZS=8GVWFkXJO2JkNKecDgYlyAB_UC*tz^t>OmGRtdVu>w14_q!!qMTeK}mG`e< zTru4f(#gmlBNV;+m%;5f$<^`Iwlub1kA4CcmuV&9OhaFc*@z*^C1dfC1{vB2k+n4l zGjpn1Vrp_bec=jbYM6fA!;ep?(rVtAf~JI$O93Q2J84c=b`(?0{-fP@%md0W$dAU_ z#M#Qp&X%7f2T0t*j;Q_`WQFI85Gxfe^%xX~xN5r&L@PSCm^c1o)N`PJCcd&dDR=#wfNr3Y@6ix;M$rIVzgmIj1; zmbioQ7SQxjvlXu2xssBspr|0vftmgT1QbE9?q>gdHDb* zSR79tr855$T>7>0Y2}A1kWp<8%Fk z1h=X8QYr(l^UJ8YlRIsIX&0Y+mbF-P$Z=B7Rm~qEzQVoyT+3=UA>}Qa>nbYW9eIf2 z6jpkjo2y&a_b^vG{?M|ut>b;p#5`XDeoez%SE_N}k;KarMvx>ZGmaORnW;dR;)n>b zPbx?fM)L7N?nw{LU3?cZ>O#UWEMb6QcsqJQN(}Z_7I#529AwMQBQ^0G*n=R3jObVY zB9~1*<6Ja4g<%!LO}YH$DshO`-06z|5D*OhS<4S`n3nkq!7E7L4PX%}n-3+5qs|W{ zAh*gRVpyJ6HB^39v{52-_+prKS6*$DZ*Nrkz_A~O8_BXCMLW^99Y$K&wjIU#!wW(Z zAtpeQK`BJULM-1T_|F|}2FC$Okx0!PVy>flGKoWopK}Zxw`?qzt zC6~v?=p}7g@rxhFj6_e<(YV5P&v?ul1JMs(yyKllh=L2K@En1QF_{oWDA$AfFKRy@ zOsKDXCrYR{TXaBT^H4hBoy9OApyEn_c1$&z877d33hl@10Z?uDnjA++83K`*&!+F< zs=bw8p}9zTnglbEG8t?*YEW3uZ%Dxi`*w(z?fuqUWn^q@aB?(2P+)L?l%P;qU}`Mi z+n+zLB&Oj1iRo}FP7ak)p&S(nD73ye?(D~^M-4u6{pW8|8#p|+pdfy52!1$3-XKVe zwlhQ{L;^mPGnfJa=8%8-9E&q>{n40GEq{Vx@q|i+Dwm1jQk6;;oQ~&iHoT5S&fmiU z3)`^}EMavSeSo?kHmm-}Kj3=9AE!*M5VhpJ?8@W+MR&U0vbm}_Z?Qd_v@%^@E_+-e ziClfB3Wp;S$^OFv8ILLELB<9DM6?f#42TGg4S|LHF%3oq{Wnee53?#FQ<#`~?eBV7 zai{KjseSgO%BtRC1~`lAxxj|W^^MlSHx=2Rz1jx}Gf;4lRSQO}E2k)S=mnWW< zy60q$CHD%$wXQU$gTg%^6x9-!(f3RUFM>Z`%Q{)YPhPyLIehd;NO4?*_+!+-p$#u^ zbcFEO?7W{NB2}qn3j{A(l9e+14<&Dz`kDf^5jDo+$lT%Lu7LhW#`Ti7zDQ@gqfqqw zxnG{=T!Blw^{}z(1Hb-JVZuP*JK})uG^^#GHf>q~fyp z<{Osxr5Z_%V#_1hm-!wy@Z;IQOc*c8 z+|Gwoa6t->9RG!#x)CBYWSMi?Vu;&WgHu{DU@r|f4xjv3Io6CjjtApBd6W5s?5S}6 zAS71bP2~4Gtmp?*$!LqlltpaIv#sP6ujZJD{iEAeqJSYwq_!8-v4*aj$5bB)I_tnF zKx1A~p#DmFh=%@%pwk!?^HJbMat}5i;S|RQ^nuE~>!D<{zjpJ{%2Qo@XSn+-3sMk> zh#3oT*@4tBShIcWVn$rs^PpoFzGOpzWru-g%Ymmayr@H>sfU89%c852&1+ZH zipzyfOXt^~Gw-8oS0O$~@3DTH?O$Ustd`>UZOCS_{KyK#>jw2IFAxv(UqGpwAX7Sa(c&i~M>79kpMLP0>Qb*cU(vGr z`SzXj>6LxwM-JWU>eeU^%}QS&afPBZ$y3upPN)Ue zTKuOShUr4h)MnZVoJrERNxRHFYanvQ85m?6J|w(xkYha96)qmnlVtSUpUaU zo8t-%7qzI?9GOY$s-=3Mk%s7HhFdYL!~3V*=LHaSc6W7QVa76ZT0=}~YqD@2)euSsmh%y2DX6BixgXtL zgPr!J>`V#~9Z?NNRhh3t=!88&COhDeNW==k9XK0Il&@bvWTfvw3k1G;GK2JEK=dGp zOkP7v@KUHCDkLo}D#$BVz?k-TFR1+@ zyUFupDklb|g0As_tIBpevs#F-Cy5ik_ynP7#dpuOjnK$j2T8)I%U_!3=SMXQ8uUjK zcGJRsHNxT@s}_PJIbF3qRBAb5Pr+V#4h@&FvL(Vv+iux{tDVvxWq2M5a7b`N7w$ARO3J{-xrWf&k_@Ya=!z<1n zbPRuNBR|xcNMv#Vku_&pH(tJVcD2Ntf`Q($c%!QX`_AYLc#3}X?5oAHu zbR~7i>lq+EkB>#! zWTmG1GE32|PcX4do2>^Pi~JM9@kDz0iboa7d`c{a&0VRZ>@C?R$(A;)ddnB`f+HKT_4|OlDTA+XxttWQ&16lVv7Agg;pyBL@G`Wk^z)kZX~}5mvB~ zCFi?IXg@do3Ng*0NOw7Vx$I*pMV7vCzuGVr!8T6y=`x86Hhp4)qGG3hio}#j0EX6{ z;pKsiz_^57w?8D74x%Bs#C0i@v#LR}W}Y>z@~27haa$7F?9v6kV0w z6NP0Or(% zZ{ZAy}O1tvS{r&{Td-l>g7eHwKG1#>e}u0!u8>*s^#a_LeTQD zF@4)}v%b-irss6Pb6t?44+12_K!Hf9MD-Mw_Ayo%F|X8toW|VoJ6!FNzCC#n0*S-c zan4n3*#5)Hu%pmrVSUEmdWIM@EPQ%xxyBaRmF3FaKrKrIywh@$)m0@~x~@`65a1bQ z^%hQ^?<}7n35!w*n^FmbQVB1$Khz}M0K->Z6eqP_YzZ;3b)TfK*?p3``&0)Qq0T;U zQ5S8mzU3y>c`_`U?N{jrY6?x*T%w7ECie0+_>7KbZUTgctK|Y*c^z5l3*SxoYPQU$ zydMYEC%jx`{Rsls^_o-XZ%ZM7x2Vqp6X9FY1?djxnle2XC8~YRzwF!s`KHm118_zP zRk(>aH2gq8@P`&+3;+$}L`Tu0A~@BjBY9i%&#JNBB9h5*EruqP%Vn#~8|TcH^Ce2N z_7`*2vv~*yLXeixzb2mOl}u@(BNmUTHS1|fok(oO+mw`7S$Yy&H=Abs$RBu!VIZn!HgZ`mX$=A#grP**^$-U7WQJq92Zl`R< zWd6t#YUK?QjYf;oc7Rg>R7?}1>C-#I&ICx9hN~`;clLZaH7=Rbth1KUt^D)Hi-wRc zu$xy@^CWOeAF_S{AJIEdYMqa+kP%FLa>HcSdXg>qX=^7tmQLegu1I=GPee^Sh_k68 z_S{j{!m6?oZ9NttZ_*#B9+Pa@VntM^lf#|=f~^YWoUuQ2Ii{+?QbSnv%79GD+&fND zN1^?ad|GgLp^&_IRNgYKuql`Sj3>hON%?G(heojG4pn?sixBG%)cXC(SZr%TMS*VF z*1AM|e&^vSZiw^mhTE-~aiyzlvPXZ(d-l}&0)dGsPv#zzLmdq~D-3eSC}$EB08Eh*zY zDdRIL<0C8ME3EO6xDcPiGfzyv^H z!ye*+a~vKY8?#>z-vhm`bU7%U`8)9nNE|mI!n!J(bKZ_03nj_o95=*M}?# z8ssmYvK=f2QFC~D@3cW47jCQ)v$g0Dvo*D)*#i6`mDlIQREjR_A5OM~;X@Tpx-fTS zD9$1bW^q7Hwhg6c9a1_q_nht9cWi4!7{ukg89stI!H)%oSr|I<^A3lZ70*}J{yR&T zFpxnkIdnwcD~O4fr~wWRNJBuCPY*aV>~yBht2VRjKx1-^&CI$nA7$VHC8f#MWVy<6 z9p~4JN=ENB8UG%A3*Iy2l5$|9}8$n;ODT)L8ag z1OkCrC>pRS?p^X!0!V+%y2Y+wEpPO9!eZ^%W`ZOqO;Zcm>1Ie;iZL3N=X9)|hK=|V za8<7c%CfTt-Q)#v*5L(=Aa96W!et~2LYwiqbAmRwWH6?QKwy-em6u1`Ob1I-7e2aAI#ISL%UHV{n%n$)(WR!UY zm>~fN_+P_9hRNs|1;mLwck11C7PAg%TTjMvcDE;r;`v$L)1GLCdXv<-xF0q7lGo0) z!`F0dISxJ%sei6kBfu~y4OJf}(&!vWJ%3=xpcAKARAe$Hz9kuD){|X@J1w+A!ocI)fP2M_-d*v@bfJ?R^%2M`Pa5iEXD( zjQ5_6!~8pwvaq+Z_LB)sO+`l@M1&+qFNV9+A=JY|2;2?Q@D;kP#^L$ivXIxBa7+!hq(1f1kuTbBw z7UUiE^ng(uz%eU&I$O(RdCg+zOCiNtU>3*);}w`-OiA^C0gbDZAhm}f6RJi$q3*3Z z`A=(d1QE87L{_nw=d05wDl0G-*$Rxc#%{qgBr-F_Iqyv)44GkPyVKE)fYvP~(o9+s zCNTq-^(=7q-bBjnOc_wgE=oHbGP#fT2B>2*%WO;+9q;%BY9a^wPi_&?fxVRTC8+&) z^W9`gsv>(fcXHyqwso~`tIRgWoN})UW_!ZZ@Fg0S&{88rB+~m?MJALhR;#A*X*hn4 zeq)`3S^bSq)fDMhEmCvFhFL|B#Nx7O5h`b&sFeF-^XHodrE@)_(tgqmlkL6T&21LZ z8XG{hX}oGaKv7Y3fo)#V&>NIt-c-COrd+Yza7rtW-V4T2YtI4SBTD6SYqOrT!t`=h z)he>*hZ9hqSfKp6Z4-+HBl^{Li$ow1%Lv;6lYT!Hdp$NxX`y>H3w8<{Vy^1(Vj{<*J@@dRm7W6`f8j?@uz{$WosY zGp}nj_xUu>H#LvxRGt)8VMe4?BhE?tdnz}i{D4GP5a+B0=ig4YO0_Aa;l#!nR z5Ghy65(SZ?S*!VVtJ#N)cHCEvO*ZK*y1yUWK5-%)Bju_KI9_7Z++@2skDB3*67{8Hh7v&6 zLi~#24>8dnV5r+ep4m%OHVdB!p2rn?Z#pbu2?Zmq3s6e!;)N&TB3D3cR=|6F#k!hD z*k(WPv-om@(|J;>u33_-wQ2T}%z9k>>BR@OxKOL$O$D2e%2+?4Rb830~<$CY&?|TdI^zC(EeKfFft@p9CuH0H6G=t1M2M4sMIw% zL=mIO+9OMkN7F?p91Bb0eT1a9VO!8is7k=bKa zj^wGy6A9NE*KU+q4)1NCj9Vz*YZ4#VqQ>9-+P}v)+w@O#tsB+0_O~@%S||LSv*#7d za}cb3jTY{n@~&$paXvqXu*4Ji;zFP&Nh=f^SxZY$7*_u+$X-z+oRmOJM?j!q!0}Pf z@$Xs`@Ca4n)=FoTQ&QVyO848rz+%qFK`D6dHQz%5JX=_W^<>gp0KWnZ>q1KWON|d` zOz2G<8qc&sz_(U$@0t%I8s3XWR|R#x0=0KjH9Cmxfr~9==`|?@$oct@U~Fr0{VpiZ z0ej7c>=xKbqW72bo69)i#^dw>6gtdXu2kRzdQ!jHaV`10A2_S$z zj*~6k(Wi#O^77yjeFqT22Am|`pnP%ago#5a^Z&RCq2k!j5rpA5{Ew^9 zjE9+y>o6#qj^lDOF%38xNV_0(5OV*CkwMb_x!dj6_ZwmV@u1R<%WhL zB5nZJg1r~6YfZO|<)ng&RkL~4%2^tAEHtL4t#s?AQ`%b^HIL!UX~RaRyhP)knUqMI zX_}6bUg;8fwPa^x!wNP@bEV}?N1o6H5iFpa5o;`WicABb-MS&T0iZ186s@;5UWUfi zFxYAvt}cASu^E<-XBJv&R~g_+PydNTi0y9)*c%Ec< zgRn+LA0a*fsPxFIE~knMY80oLtLmzCwe7lO$zN?B^H)0;Vt~Ik*d0*cI0#=O7ij)p z7hj^Cja`*%AIYY(ZERCEwRLod0&m};VN(`sz^k|mvt$~)P}!bEzfctew?*V@;86(! z^~Ru45GbR90t!sAO{>u*`o&fN4I9;KK&{gsFKsJdN7OIaVclbqZcQ{abYwuR>t%#@ zO;A*TWHt7x;u$*|8=Xe!utx5uUr8a!=_sMU`@+C_mlbgI5Cc+}uSBZC5g-X^!|l?Y zGoha}Eux#?{k9>*EG=E(rZYdAbvU92>_~Eb6~0g0^Mw{z#D=`AnLIgZh&U^jy3hC z?B{M4!Pd;;4;ba~Lq)>Xe6KHTYY3afm=v{#<+v{BbXn6fHLYE*OL%tHZ3@2+WfDznpEHcvpY18Q zPxu#9z5Nm~RwkJn3COtriJO6@N7;^(?f>MEhn_0UD}bs;1p#*^wXj-bO`+65W)i|{ zL~I=0uA*n0*h9oq_TJGp=hJf!>h)Lex6EbgBJCzl)94I@^b=SdGZ&b9bhC#$2^eGW z-J=mu5c-60oC|Q`r#f`@D;LLXVa$!DAJ&CoAns2%=yk)^Dz-dRmX?Mp99Mo=?3XAE z8rNpmvEJ3+)=O|7bO;S&}nYCBHcnH;>8u8LL@on zmb>NlzbtLMA ztO{39ktXjplJ6032ekMGH`!k<>8;0Hq8i$b8s zSJZ+L5C;H4ar~eyefxZU*Mf5+5P0TNr!%Cfp!7FW2wh~b({qThc8`8a{Qz)eZ~S1G zeL*@AKxD8G1%nNUGxnNzsz&57QPVhEMIkQbf;7aoev2O03PI3mFeHjRCy-A*GC7{> zmzKqvkq5)D%&+%HTe`HnBr0X-7%kDt3h`hA^a<)#{D(klC_>~SH}TM#@mJghq*VwR zy^%ZdM&wkQB zk^klLH~%N2ZV89Gz+YxLUcrILU&H5fRvG7rc@)Ikdk4y&&j^65$XoYx^WFk@O9}A! znK}Tp168N#bX5XOzG{ia-vSIkVfqVDpIih05df^ujXmdqEgo>MCokg8uDW4n7C_t= zP(EG{;8=Nlu0rPnb7K*+{6Z3nX=m5bUvd&j_U&i--(mY=-&^}zSDMZ ziG(sBFmUfHe!n;dU+VTxeD`V}F`lG)TlU#xrFmw=hu*@0PrRqzlnE8aB_%2nCDW#E zL3{g$Z(flwdiJgU4iNd|zH)u<{^pJw+~2p|iXydaE~@6Nu`|rj80P{{@W;omfaj!3 zN}Jr=70L_vg#8OHP?)DgPmGQ<1%V3U24WQm+n=x-1uwoAh}G{COl;5%5e+Za79L(e zJ&!iO(*>;zquj3CU$Iaj-z@A9x#0t)nZ(;F%0xd_;o7>Uc(HxyUW#QIh_&?-X#=Lh z00bGCeawEZFc8r6l|W=zrCG6hW$0NZMx5wkDbMuV9~L}T<#!AXF3A4{T|lD0u)(`O zfy|6$M|uf=yWYqe>TGR2ZSB{l71YdPOX7FuLSbS9*059@T-ujar67=Tx^TUaVFQSR zG}zGMT;=L~bAP+^^85BxU^r%QUJY!Qp})Y6n>;02$XJ}6>U+*{a_L z5X&J7#ZE027mfqRo0E3wMVt;!KWB(DN%U8Cf#=E!7ZbTODDDax zia+rmWn<9uXUT2*_md>S|IKUc0{r;v;D7k9^v~7n!k_o5-ym&Ph%K7nWDYf}Se$*jb zBnb%%C9K3o5_FJfiOf%#&sv>Us!bcv#Ewa%BPNG$c2EA~O3o&CPsib^Ka~8Ijdh*i zUy|VYm8w}qS3R${^;5UXCZ%5Ol;3OlshzZ8TXl23XZf%9P2sI~?yQQuT&o~g0WF8D z&AS- zNm%c{Hu+r~K=-KqC+7%j4Ej6*=sBd)GrUBP>&+I`V65xYX&6oF`iQv}S~+6@>FQL6 z;aHA85I#^sJo!O{%-Y17?bTdvl2!NJPJgfW{%QJt`C|#6kkT&yUt6vQbw;oJ`@E*9 zEou!^k^q$|N4F4B=}AcnHG&MKd?C~ZK`7fUcf}mYICZA%m^+{xfV4DmUY&7bAn}@3{lxj-7mjfoT;tq!jAcHRPu*Vxj9fy?uW>Ouz46Rk0K2J6W7g}Ya{gb*m?U1-vLs$MYu~i%cY#H7q^>1s3yGCly=SN)0Tei z*s47PIxr=XX-V&Y+H%lX4w=GX=?uzX$W(?+A+_lx8c28 zc6#d6hD7PTe?HmKVAuZbJoVRkol!FwlgYT5Oqg{6u_J7bR?((a99dm-;!7atny_;@=eeT%9rM+^$B7D+ z4J9V&;^6Q*%tY8Jt>eVOm^eg%HqmEztc-}Atg@3G2?tklf!^G!Ih`UoV>VOfz!JlZ z{_medXLoty)WnhG2+m#3f~c`I4op{Zkq|D{hf9R=o!o0XtCw%@bSIu#Osxk+zBhb1 zzZ@Oo+}d>PjEJu;Lsy?Tudrh0g^VJbY2f%y`ea5shB4Np!ip=peMei&1@-3UX#b^O z#??0YZXD~F+jPsPJI&e7ye-2iGk#^2SI+wj9M|ZyQEJ2BLwL#=pDbw5!G{{>sOygl z>yx4G*e&?u5aT$t!!Bn6TAzJUlbZC{F6y!$;b}g>4{Tb)4)g9iCE?bQYSd7L>NUII zw8kE+hUG4+jGg85IS|s%pNf z{&pX?*)$u%ik&i_1$M7YtF8` zcFdD8IMU#Fi8x+s&#QTxw;x|3nI&m4Sd{z;M}H>JUnt;>gG@N&Nq#bY{kg`iY;$XR zrTS%;Q*PDOw6UJewrCA&Y_YOUE~^!-Y*nkneAZq`F_q}ul*uxc{rI##!bki_ANj+6ILbS; zXZ;y}GfUf^{k8gL_Ph)o*!6WH-q8kkjG&GuZ#_%FdfuJAs7SA7zpnXj;{vv6f!oYp z4PDvma&)t6y4AIpT%F#`dEE=1VLg@T$fEl!ly#W=^D%@U#)h~8q z52$Wlx2W4aOb^S${=gsAhy2hU`aUo_snVna`35Wl1Qbjtgn)#SDGM3~)(M?LMT)23 zCq`{wS_jfQWNqi(ve}YjOfIu&TP|#Sp%3eka>exFqm`ZGGiXI z<}+sj^QN+D4Qtl2ZX+Ag=(3(o>Ga5eXA68=QQF0@cwBBW;?|`b;#IpZ=-gM#ry0g6 z8gz&*E`iV~GIWj{T>_(Pr06zxxjO>%h!8y^LazX9OOy$TGcidfCC%hynUXwHQ)F7o z?-jJY9L7>cD~SQ(DB5!kpITO+YE3VWkzF^$`%vnYrq!7Q7>iV*Gy z<dH-z&W|Hm8*Oes#v8WisbveF$@yyxD!q~<+L--I=51r*7RnS z+014&TZ8o@#aLR>!47q}BOUEn$NlYvmtJ}8jkn$vwFC9r!A9&*b2cD+Rc+mHCpMb; z8fd7I#+qoV*>bD3w%Y5cvo)>FC6`@s)irbsO{=z3o$gF$JJlF$|L=|;3qQrtS z6CzYiwKad}?&Rn2Nk38RT3=Ti>dr!ooOeO;rg|dU(*=raO5jk)v8ysy49~C^*YvB-=5FYSDDhLNwqA|YulH-ntSzg0x-j7 z&X^_Zt?oni9M-{dKpG4gF{Xhmox~t%sG?^eksMqJ3yzqfA!#O9efOZCUi@$)j4`Cj zhZ$7WhET=Nek)a=(vb#Jm7!EL{2A)Wn8e@o7$bR(52C*!|!i=VCvFq#iYnH)a3NDIiXD z`K#vy&IwA7dvf9=?1UqH2CB&McjKtsbprAmpkv~uX^RH#y=o1Wet1_tYl zj7~5ydBV)>wQAM=9c5#YUg{fI8(lUw2JGydI5>oGa?1PCtg2P(pgMI#7}Putkp5WDQc?6%uFd+b5&wO9P?Q#b*zzwomF z9Jum`IOw1al9+fiF5KTa85-W{3HOUVKV?YgKP!h zEOHtE=ioO0I1l#+Z~?g-02h((0dT4L)`iRJtJvs@E4KAjQ=a|7H8;p{lN8BVSg4Vr zWu)pX&29bMx%ZBHpVaXnsb2tic*r<BC&q}$WPP(KtUoE0C+j6yzr`U_u6ZEZ@l5+t+x!`d8fAbKIp7Sk&Zt4Y@08> zNa(MU)C9n{L&wYa{WB{4@=KZDe*eKAf8=&?4;=+1ud)xD)#cz}Qvs-e-36c$8Unxy zy9FQs8bAoNDnRIf9w4kLBQ1;s4r)cZ3S7>2AmHl+3Cbo!$TtWRmKqT?7l;y7aX(;UP)5A`oCJ_amd01g$E|JBz>dttJph0# zw#c=5Cl7lRO5dyKYpzhDqU^k*Z?Tvk)$uQu3!o-}#cDycC%CvSgpPz3w}sJ} z@Z!D*x)NDD7R7L)OUyqbCzjXmlDMz;|HO+Iy#$t$SPGWJa*|8=QrMl;Qn57lB)wEF zgT2WtRm);uvP<=HxRl&-WO+PDe!08?)G)I@z7CJy<+T9xca(s#zCex>R5oV835H$< z3_)B0-+-yWP|8jKzHM_4A5cTUkElHW zKXqajKkpUcJ5xy}>rcO`F6DXuS{nI=ZUVo*N<7&{@&?SQfaGGKfO#Vc0Or@n6yPTT z3n@o|MI?Q|;$icEC6#k4{au&fyG-TX%d03A*f(G$0S5SEBml6grcyoJ6M#SKA~kp^ z0DpBkS*#sE*O|JgU&%5JUWKAjBg{0(6x#gVApP-&ie`V^)2fyBw37hV0y~g;z<;A$ z26h%YU8pW#_bAtaJ*AvpbQajxXtCJ8uiK2+fB{bo8kDpDJUl}mr*4>^8EJ)Wl$wl{ z@Qw2;6D4Ak)MlzgZkoExl&E*sA2|k``=X@=nKzHhf(5NCT10EflF61WZyI$M`X0B(Dnow}?*y(^W|z`c~r0r!(?0v?=_)`t?-0FS0r z7musXI&mVvsZ&?`%p-{ao)Z}tN49-wA{Vc!psrn;;>HcmdyB)kOJ)xQ2)fW3M1UfM zrOk+-4{_N%67&NqTSkgO$jZ}^lN)e(HVX145lW~Nh^kGx1P8e_J5MMmiqOz%VPIIp z!m5LVBY}svj)0&M5z#>;Bu&W3x=~PgqM{l_LlejKp(A)7i-W5(`9`iWcw=PGn-&{G z*Q9yTBHry4Lv9~wsvp_+$h!T^c(v?btbGHpeFy&Y6?B8>J%W>Z28YbhEr(Y1Qd3Q$ zYnh5%u3Z;R9d-0pS6zDb)bm_@_1(V>NRNg-jz*8@7u?uEOU`yL_U#Qp?#5C6J3Ja5U+#VGI7A|m>NZH561>~Kxx57CIxWV;KAVVo75>0&+fU7 z98RaY4%EEvY(}HyF2!az?mVO}(jIwa#bb~4ULDxzzVseR0Z1R_ZSaMU5o6Mxc!HM6 zemV?HUuGv>w>jp_Sg>GvEk|)!@fy~TWDjH`XxPs9w`5muRM(zJ4jhGrlh4EXgvEVE zN4V;Y=l+csGkHFG$<1=OTM7?5@yh1#I?g*jRAKwIl(;~?(=tnbb>ZjFpKJ%2mR|}k zIgD;O4pedvR-3`@4-(@xSY1$1gR+%*^xb zq{i#+qC@N!_TKxgdiL3;R`2&n{Q(b{_&)f>-64lHIY+4RkaUmUdmqbDuN-$=c%P6| z1@PpN-M^=NiE!F!VSUD&jEiRr!#PKdxAU(HpM0e+O7msFODQJ-UOw~dxk6R4tFF4~ zn(MB(@k;(or7SE;Iz`fXz|^ChPIKm-NZ+^TlsoRQxa+PP?z!ih`|dmMfd?*n=%EW9 zd4$Q3fy$K0N!HGyLiWzSK#m+%xjUCj^7iAp;)y42dg`eQo_Xd}Kc6{!EWRk*J71c9 z0t=>`7GD+~UU|iCF#W#hsx88E~&O6n-_nwkB^he+K;O4hRrvN4N>!tPvs7g&46;ARx9#Hz`)gkg-ILoINlwJCrEd zG)-syZ<)Tr0V76^2S$}sqs+RDcQ3(R^uTPMH)ptw;~7a(T&Ym?hz1)k*m{YR=gaFu ziSo3)o2VGr@0Yds3zXeKQq>*6!G~=XCQOZR;aWOELLYGCspu#Pd%*7!u7jf!UIQFE z>9ibQvvw0W8;L1`11J5^n`FtROWCRHOg`_yZg3jB3{D@o2F|Fxd;qTi{s>tDe*zQ1 zpPSg_%j0+-EUa!SFQ>*8tv=Q&FLvxi=X{3k`>KF%mgcmr^8 z;(7p=%#c|wtua=njDvFJLR6^mNu^5Ce)vgWjbH54suS4tQhp8GaH3D$_y(V>xqtUW z&+Z@Kns>`3+27qh={j^Mx&IQKyDQ30H&t)+=<)gXf*5@%G6VOgs0ci8GS%Sz9|eZ? z2oy$*Dm7+Ik#Xbl&FmRInKdiVz5~U5I7#AxkCJ``KAv=2KB*`@r&OKyg@i@m%S67w z*E7;SzIomKB{PEnUIY*9gCHdNCi<>DzQhO*k{>?+dXawc6WJ!a&>-L7zy<~MpiHS3 z1l5l+P@`siX@Cvd2ZlmG&5RQ9T{JX9YZ3lM5n z-s*op)Bi(*_0WW;MccM}?%Rt8c0Kgi37wa2l3fsbNpFMDf22FHr^pQ&T;a3&pE5hMS`crL#>DOdnN zp+U*{lsL;hBvqSGDF35h{O4OoAX?Ls2P>)U&QQ*LT$SHLJM@rFx9}QF3DecL^~J|# z1Fu8MD>NWR18QNwaNqDR*C8N$ZKQ_@4vNB$Ou>;wFt8636ck4|@DKS4N}w3ThkOUk zrVNsuK{ggSc15mdGf@cd}?kgP#{5}LbnttlBig*+e(y3I;B(zZW)Fsw=ybB zMy1tJ#T?bvL=8*ST082F?dz>)cQlw9)amXlZLCQ~Lw6Sg!?)YS;%LTuw|v*4Z!6-# zJkrw3LN(fsaNAK&DIK``K|68ZgR+O&9F$YCaIwmOb|H%Zv>Ur3Xb-XkKzp$(gYu9A zP(F5TPyzB5RH%kydwxay?=Ak4LPFvJDXCO4GBHO^O&SG-hm@4kuZkZ-%{?^9><_A) z4zyHPmjm?lzzhtYbf1}QS!yhvw#jrEOU=bI78a0WrREVE8)(~|q_*RrO2o-Yu3tZ~ z0Rt2U4U+Vb=^if~E?`_-{xo953!_FoF=h<>jx#SNbi!ovV}xUVDSh0y*q|O9B2&i|92h(T1PTf?8X7!0IwB?}GA=F(9zF&U5f&vS2^AF=Y8vh) zO@f;>3k71GI&0IYt_IpPtxwgg**7iPfVFEEszVRBUVU~lGQu)3Il*ig&LqziApd`g zT3{Cki4ky+greZ03B$m{CLAYxc#r{4`0+t5e9^2D{1xlFFOG=?KYj%K`Lh%tfKZ@7 zR)Pc(2^P#+h!94hLiq_3#w1)ge-R>>t+rZ#NRg^Vi4rJUG>aH9g2al|El!*)@#2kG zV~tV?5)|g^K|sWTf_eiOn0Rn-Z-ju5K#7vqP^Rn+6)N6Dm8wK))O>+DbsuTa@L8HP zrANyF{nNa3LFI@XIq+a$j>?sbAWxnR`SLLpC~#S!LM%m!Tv4nTTZs}^l`6$irpz_v z$_Z7d@B$p12m-=ONJvUhP+mbp(}98U4HlLz9Gvg)@bnN6{Dp`}9|_41WMqD!s22h% zDt|OINOW`o7#L8Pm~ya~fPg82f!^UUPVPnRn-PHHDPsiJ2W&@G&Swi(o)sdwo6Ax zO;^`$Jw0`Oea8$8$cBcF8yQiIjh!$tp#lI-0)aFT$SE+G4uQA=g*ps_xeA9nf6coMk`5 z7AqKsgT>>85D0KYqEHeEo=g@-p&(GH!f7-_I$Z>Vfy88rWU-LhY*8Ez3YROI$3x}w z#RvpwLZMiZ2wg08Od`=Cl{zky>6FWzP$+aMl}@Tuy47l@G#WixtX*PRevAAxvdTO(|VYhqcaJZSu{om24PmSlD7A_Z^+pVQ#5w`tfq1B#+UTV(C zE5XNCc`GT}cljvH_ESDf8tUhK8IJoEUndoRp&DQk{YX<#38ZLjgR>5}CbPya#@)jP zI5>D-ylf&M*y0@lOI8Yuh$YU4tVmS=T9kClb}O$ zG-1k=8Ple1%uKGAI|R29{2gm=AM7y8GLTH%BDS#kW$DM~Z6FWL1(Q zr-nQQTNEk!1Og&!piOsmTUbXcIJmzM5LQOh)BR|jOH)Go=>GMK-nmS}7|e4QxpJ;v zdKfaa&WI5o*UmM9#<=OOZEMotnKHG^jF~0o%q z&6+P8HoWG#rvYvp+sl`+OS+re+IMVlfUz}>p2q?9IA39y z#T1n&p^b$_kHec%>8fp8)}^BSRE4@~)$XZL>*3U=ct`-)hNtLh)QC}&ChVFuqt>DY zRI64HZQ6jfYX{Sz1C>slSf)#1O#p0nD$;Fx8cMzTFc~m_!k|HPh76-IVg!S6I?`GXQ9d7j* zv|X|rLq(kd(6&uow%ZO}IWQa*!gBJFGY?sC@Ny9lr1OrH<A9I#8y}xpGx@bm(-UKL(bgV8{@8!-gptF+$FyDdP75U2C>% z*|KwX;>fe}996Hqq3o@a?;y3pnjAd-sYiX|5G#3pm{*%04|b z)WHFtN9mM(dTJhf@gmcQPY)gAv@+A#*&G*_nEiczPE$)Mb(qygCeUDH_XwDVia2r9T)03YBEq1{ zVn1ILcOC#EKb~IUr=ReC`Q^}WzpeY@kL~$e(Z>Lcfr~x^VB8>`;61_BV2J=@Crz5> zK#9gt7YGpg3%mm$^mj-ZK+TOv0n~aIc`jh@pNOu2eH&d@z=1E&JqP4hyK@z9Fpou| z7YNDc54o@Wi3c9|?xBYYJ@QDY#~!Pq!^}|3RY+mMf&v#Vo_aPRt8m_k^iGr{-z7`d zF2#E)(xlOlF58S8Irikrb0dEWR!b;UOiqbXO3IYEuUt7@6)Nfbp^Bqw)t>w5rpMkja zAP3fq5{-Tk^oB5l8pVOrI5f0LSXfi|Msl4Oq(}=PL*82ojC^P8sYa$Ov<&CiDw-7l zKWlxegrS&U`pQBqE^j)P^5>q__r+hI8mBh$?`mnYd_DVC8vOAS}+68tPEe_ zSt@h`&+|1lmvep&_w%RJwHjjLgf$e0F zDl?w1#b;jhmVU}V1&vxi-%Tk>2Ak)X=^5nP?*EX#e`gQ>_q(7hb@q2ooHh3*`mN;N zOgD=E7N6lC^oGsgfB%2q3;;CM4!Irj)AMI&<@!H)2q54zjlRMMX` zpo|l_B@*ue;N!7k=q{+TfZ9Bqbk#YKT8evZO_^T}&&#~<<{szQ9yy1KT*Q}#pyCHW z`izmkI?gSzP;__B~})Rjgq*zFz3oqh(0 zQL{kR_FG52DPXlK7Ara|snQ4}I`a^Fv%}ay&bAg{QtaxBTNU7pc}2ZVr+}66!HHv> zsgv@?^`&fsTub~#%t-eq(2Xo@wA+M`qxJ`?Y#)B2OeO8+xQWhf11j6kXkbpc+<;Q< zTt$k(AP4dgEA(gIZH;1j@le_&T&95rkio1Jx}^xTL(}%CFvj}b1-MJYgj3r1eTsQq z1@{Zk1V|vcx)DGffXN6O(ZK8PxZAFV+%5Mk>BICTxl`Ef zW8H#$hVe*t=wU|YPMO~p54D+%qOKYqw%sP}%}gFVB?FG?DVkf^JN8FU?Xmu2OIgI5 z^F1t^*m9`8MJf}W5yb&ALr#sJBj+qBbcA#u5X1Y_)=7*MZo0PcQv7-Ty$av8V1!9XhpR1Y`dL+*di)#B>K55%m zn-(arEyW(UEjpgrDOIAzLPxC1O`9x`Njv=waf@YznMp*Gy01EjQOJ z>t(!cLyc!I;mv0!K8l@WHELUvrCVcr;sCl(&`GQU&b_N$^fzvQIqW7`DNWF zBPXKCYAI=CPoO)N1LQgXdhALIAfN%@EEg|RM`f-i(zC`m#{DWMp^ z6P)FVAf-lt3DP;w2E7}+8$IW!r9McCQhjNqv}fuS8=%VC|IyXC!D!iFhbW+;pgV7p znkVgnG-+78F+qFd-l@`KYKbIenWXj{@(a%$d6EOs5DaT2r#Z8;bDy9DJ?}YTHDl`> z7~^hfNPV{f^C=gva!|xY16CEl z-#f1WX2p=fe{uta;ND75rG^jLJYOyZ;Q;gnIdU}@GRK%wFyt7>dT@@M&w-$h9`$}9 zKqV3fofL9AYtZ7m&gNz7D}#NBdqMtghHNe=(o@Z2nPf{n-SR_Ew^PbtfArm`w>fbY z=Ss@rh11fQrFfXl+RfN#wDx}XH2*m9EPp|s>nKsKT_37{IGGC-B1L?8sf+!$&^XY>h_R#}qD z*eJQ3NYv$324qap733D{k!-q?oDB`??)9L1J!ufSPy@!@s>b-r__>$lG6|73YmEg1 z*G8~G8bm?Siu5Bg`_bn)`Vv5jsUb?8L1T#6CL&ovQzD3AUiF($qfv?(OW7P-L6r<| zX9}7s(-Y+~tY9%dMMNhg_)T6nTO*jhB-rdoq%a|Y6aZZ^dm&F!vc36JDEqbyt!)RE zhH_%Ii&iT^#H*EpCV(C(8;^p_i2bo5c?tLu1%v?z1AKp4x4C!R&8(=RGXmfl1W>p| zodFU$iO!FjzgvZ8q>d`L`!3!h%&S%IJe|$1dP)v=RYuUOf7W4gohuJ(43$LKQxT_4dxI0BiBy0*W^c|6gnlhe+ga|_&+}|`s1-k7x z!$jQD17?0DwyMdM$>%Zcn*q?6NDNXYAoKdwOh)0-FSY({ekAXgu2=psZ+9kXKoAqO zd2+bMT9Cvt2ll8!jM_IV31j7&ZiOw1pxm`2q7D>8@eapT+YcMHhxPcIv}3+pm{Lj= zsK}Vv;)S}pnJ3^bArQa{M5)1=P^p@Hy$$o?igPW*KZ9zyDD?A&!JtdE9|@*oHHc@}txw=f4uWn0TYted+BThW*9eLiZHx~4Ljqn6=b zk{!;9V%ObObKu@6Co37wMX{vjg*wHQchie0q&Vc<=|GT&QXY3nu=<~m%OCGdP>Ve8>X`)6fyoT5BX(C+d+Z~t05%I(1(5J zEU^9HvT9v!yKdHIMay<`n?i1icQe%2igH9#Yy&LxP5bWit#gGo#hoXF(vB`rE?T%B z*?tly0UZ$_yeA^Wfm;j8GI;DKXlT8_=4N!#??*z$rSno-v8O>_4|o)k92VL0WUsex z@*0n_;re#T35khIj$jr+PJN|1>=IJgpUl8g=@|HO+@Oo*r~ zUrN28`z~nB0raWWpvp;wWzTt6<=FDuoWCCGbQ8J(xZPBhhGI2rg?o#ts2M}|rSxSx zVaD*Cze-D4q~b@|{0U2URIXYz!X{ISaXPTJN@khr=Te0TQpXxq~fEUZqK%JZu7xE8rJQ z!9lSb_=PxN1EW+jf3VTYu7r3=0z`0}L#m9_-!~+yaw44vGLuMCw%l~z@*Q-lY!U+V z-VYsIK)~)twru~$JvowJYNCGHWX^Cf0MSm4i~_pr@`=igiR22g_Fy$Bv{X-`74yk2 zwXYlGN&0mE)*~tBk@$uVx(ZvAVo@oGw$<%z1e(1QT%o8C#1Ltg(%R+H>PrJ#PsB-N zuF~%*cCVpNk|>Q0deq_d5r+!*Cgp7+`%S6Ic<$hq$3XXeRhsZ=6cK6iqlhfVt%uvpO|)LUjNhg}uYopl zo2;#@KxWH>0ybac>*3^z+BezM1kCKmTs86eQohmO6=k0`jmuh;_7(f1J;s;#SP(J6 ze3@JVD3U#Lx&M}3;=&blo+HOO{y*x%>Ap+3BW{e%(-huIzD-wuTDa(5GDpg7peM&# zYS!$XZvoIL6e0l!-kgzXz+sE!ye@Wn-6lkJYf|IRhPN_yo_-MD0WVh41#ri@0p@bN zm&Y4|dx!!=hS#Y!?>$yfzg#X+oa1++&So9mggFV0O`bcV@T*!%_Ir|FS^X2~hF}p0 z>6Mbwq|Xm`@&07OIy*dRcJ0_nfr1t_8{(j~n-qCmcMpt3U< z@|m&u=&(`sHcG5%Q`RQ~a%g)=P0gZ;Vg?Q{oR#fPGNeoISt|g*WG71`eevT)DQ-V8 z9#ogKgU7wR%~y8ioR4I)d;=5_JE)9$)Vj9FI}f*txs~>D=!`JnEYfC5WT@9^`XD#~ zt+dfA;3~FC46*oih2Af*>Xj8)Ck~1FLg7crF%<9RUF0YF#0Q-sELySm- z{b!0j8C==^!&MaAQtRS#64X&vapgdZA?{Jdab;HkwGVd$sxS_y)`fU(0g(36ZpBFy zZbNW1!+J?0V6U_OR7x%U<&tkxeS>7uPH1!6#por1Q#A_p={Bh+_E-u1K+;a)qz(1@ zNWl4>a;j^#7v*&0gjpNo_wHVODR?Z#eS`tFqAXTACeEB{&h;mCsn|!*=2{Z0Vatzm zZJ81nc3d1;zMW`ZpW9H636I*ElZvOUp<(J!)n-SQ*UoJ_%z@6l-^-N`5_k2b!7(Oy zZsfq)1L$qvpgW()RWsfTiLrbmVP*Q`DwQy&a08Z?fS7>q6xYBQ!wR&niguS*vamv+ zyRKIme+xq@5D}Km0nXigV|jN^%aP@4@M_KcH46E7Q&t|39_wg7-r+qEr;fcQl5XHI zX_jSe1X+;3nK}n$#Ho4{iF!-xk7H|gv20`#?r1q>4C*A;d4KouE6Sn7o$M0HyQna` zDyocvGE!0x5ckl{!H9cSCYhRI#<=3URCvWQJ{M{AAE!Chi*xVSfr(C0DO1sX(Q5G6 zh!*#^t=;`T7Vsz`dK{akzEN<%@cf`{5mjR5y0W~G)k?W~@px^}I`qgu>$7wnPfgl~ zA;J}Pu=O^mMFy>Jd-pl4lA{apL`@>_Q+Yq@T}UgnX+oUJkec{vp_^C5N7#H{rA4*d zD11yUcjV&OT;=25ADc4L{mLDc%cpz3mj2g)m6n#DOcei7vyc#;m^f;Tx6Nz4e~0J# zw&Om|GPFMi=fT8w3j|ZV#ZOZS-|sFKY;t>%WPjA`NE>xqqt)V)eIj>Hsj_nbq9?;? zFrRUb$1~oO0gTf>i4xB`*}Hh;X~mv{i9pz)S4DxBQM#}D4UF6YJZhIdV~3E69Jy8~ z1)lAY+blP9ZnJZ@sDHs{@~4={H*v}1+Gp}~MqMmP>M-l%qA*#ncw1M1D>m^CsIVS& zq4-Q)li)cfTMhzd)qzxCIy#ejUNPr6utmWU#}JmVmgyjS&ZoI~fdillrgfrmL3<}T z&;!$|YGxkJuJ`5G$~WR;V*&f1*~Ujlp_%F2s<}~i0UalUJav7$oGN-kX!y&_O}&Sj zy8PSDoZCwT@awj8fWNyhN%5viGNrq&6DMU+#m-$*sQ|f-K})`f z1IUq3{H`WM3yFBoB!xB5*VHV8D#Y2 z!sV`kk(~_uX4Ew|M+P2?iMBj&0e}l<7H|OoJed#-N1q`WpcKf1IbhVvHB90ST+K8d zS;9v?dXGApyz6Y>KH#Z>E51wQ9xl^7f)qLy-g4L-#K{*yhKV*9(x7^D9y3J{Y7#!* z5-viliKHkK)(lD4<(?5O>|{pi93{JVGPk&hgR`h@R@VlE$MqFpwfoJkl6Sd=rv`ed z331HRXQ}buCj5SI)Z#vsgsV&y@Te+kFnlLRUfL*k@?AK%m;}V6MlN$0JN*1CKZRK$E6`x(NabLCGRKA_M2`^v;8A z8daD|Ez$&xi^8ZKy5WPNury`zF~7s4?FOVh4NncMZ0ffvxH zxlvoysaWY`+l+5JcZ#?_F;;RspR;e_t!fSL+HF=R9QXo`0t@ooy-`c$m?3NGlA6NC zfXfA6-Yl!4`g6#^-vto2l{S%r8@5*`dM$fL`VGe(@*xTDMI%QgAO=fhM2sc*f6o-_ zJ(y<`Wu_ysL3}lWTw)|t;gpmGk?_Xl&p}hLoqb&y<(lg*st7fm=I2IW#mtdF-I)RP zhC#({&?MMDwCSupWN;hQ(cl&@M%Y1!>H6g6r|N{jp>rVBu4OB3^`7&6705A{`90`; zRiOixK!Wo`myb+AQYkEjE)wbO?i$>Q*wD7B4a|qvgBTpdZY+B$KP%%yLcc}byoyG( zWz;q=M5*35CYtz9Q0#&wFfNp;8InrX0nbJRRZ78 zU2|R4qIYLClMpF#0ak+EGVzMdR1p=1`s+>PaW&ogEp>7u<#Ko0m}}96*0ifbyERqLi;{bXQQ{sN&a^W>z zU`kXB295Kj`U*ol_wf;!=}Wk@X5s9Kf!7&o8RXa54PR{@f0lG>oAD-?nl8$&v4xC^ zFf1gG2|9fx%yuA@P2vo*i5wacMDEX|6~1Klm6tW8d@|-GB!0{ZJ{n_MR;Tq0(Vn|y zeZ&Gk8>3oddy-^CTc*THFQ&7fSz)+XW(VLv1VhHnbmVm#HP`;KF7(`)kv6|vjc)3x zmR@_-weYw)!Xs@K93m@kySfXR#fZ0FFf3np)xSAu@M%}JkAH8+r^LFJ$#Z|COxsMc za*4DgvBWq0DmCyFlf6rVr?4RFe7sGAd|A(2ObH$^Fo1}yH-!FnTFMG1>bO`Ja`icJ z>liXOiltx;omU}T_*}&7i`Wv>>?5FZtC_nBxhjXonP0<*5VyL)P|JHbZ<kak$lbg_w9L*C)vKbcxXiGUohG4c~O(SJ3^t8)P@H5MlAH9t+WFlci z@U5jisp%URN=qgXQaw@A6w@P{|LC$Ty~&_3#;yQ&LsjeMDk^SMh`SEM&(VHC;d#w| zCJDB;%5+p6zs+E4LO59xQ5N;^4x_kKtGoBCuP53Px2V(Sv3W_YSx!t_gqjPl9ULnM zIYw3T|6n^eLDb+w7;9^o=d5f9?}}UKzSUdN9yW7)AS=Zzw?%RCO6CC0XrnWZ`ORPj z@OhXe8)0SqkIAeSZY#%Alcdt>idirsg$6^u;YUe`nlfxPF5fRDhD0RY8WL5$y*d3x zJ~ho+19WYyfo)inwGe@P&PqPf`qyUJqI=v63lQp_$R(fgnPe0aX9xHj%$jsXaNpN! zvjO7R%DDtz`k6)ARW@*V**Dhg`nFqH+u3~f{5g~5S-YmfXi>HES3oFdRAONAGgx6$n?Z(S?)H#4J7vJ< zU|%yzrKv8qdW5}YhnPO~_((c2ll7I!#I%EaD<){~jDhrhRQ3bVon*5uMK`Nxrmc>5 zaXH>;of&=^R4Q8^1OI5ng^sG*(pgZeEhAR%D(%)bG<&D_m|h^3x0jY!=cQ0~$j<2< z(sRQ);%Ed)stjEaL8z}T>7#*Q{OwIG=fy6x{LX^3J6@}u^miskDpY&T2)wijPJUEj zF{YAR%eSZ+-b@BR38~?&ln=y;Q%RgV1gU3mNw&RZlN&&xRta%r zo%!q7E|!p>?wXq4^u;sCO|Ry$uXnDV(P-DXq4%A4K~y=RyK$D59L5G)#mVy)(% zc;${sYk0Ec=W4HLFpPPJf@nwLR%U?h(H{$vuEoUhjdC&FaH`Y%OB!0WS_%MOcdkbh z2M5>xnLsQ8rGLV{SOjrx&R`I(ClxFNxeS3xS0=>AHZfGLRQ=FfLGY~@GB(I6So$4v zoGrpwOd%OLRgp;EY1sJqc;{yx?Iy(yEpQyqWJr7{eVraaBfN?&sU%FOo{$Z{E+SjQ z!y{tqd5au>*cjeOAAr!{2>c;L=Yqgl++jierT3*OF9(ppU4N+KdGDQ&wW<1ADFZ1Y=A4?l>m_DpRT|bpRb&a0%gLRAwm5N zmFzaT2&Ybuc;5m}O3YZePTQw>R<@X-0`debrg;~HYthGvs}0ziU?+u?#lM#PGLH6< zbSfY85>RFlm%RAm{;W7ag!`Ju611gJr5FkMb(6MP|kw;N9a4SZ5JSFiau zwjuabF(ycqMtzR{QrU}bHKdCanoD%INJuZYm3em0eIdLS0t)XMbgK#bu5iT+Sy`cO^Kr$1<+?w~(`rcTnFRd7zQ-(qCfa zK`>pJvBElA^BB+Gu51q!PP^MsoJPphh`eg-kJmytNlov_Dl{Hj{Uz;ScVIH&<#20#HCv^B0Xq6P;V1Ru`Sl{G$-EiwIx%2kfKUN3^ z5V64>Nd%@WjoIFo>>I-kj~Mb{0En<)5c%{4UJQU<-5eHd6Hyk{j|nf8)G(}NDJ|(L z6}k+YHBguG7~7Jkb=mMl;W`9@ZD%NydOe1sL0f@@g@Iu%h^&%WJdWn>@}&;eM#r!; z+pW`kw_5!?9M72D5>z5`Ob^icD7Nqfhi~nC@*I`2RcPV6a=rzPaWkV5({XJ@s2H8{ z&jkz?`K)uD$L~@Iz%PJ}fkWP^6~+mLuy0me>~U{}9CN*|-{O}feztKul{IgRTEhCp z=@$J~|4+nGpw69*4Xu8nCnq%E$wJG2l%$sEeQiQ;0#4>9F8Qf{Et|qkJznLWEmLT2 zl5pMQjiOKotDF0I$p%Nn8XD$fsuxz6z4awN4l#8DqU}l#zHX^6rDX^A7p>q=3U}y?GJyj_B;P0|GSW~DlbL(hbgkEtQo-s_Qk*ih^Bce!mHS~pBLY!{x~QJ0gBBx zV0NFse4CwGByJaNI3-?k`&zqsK(@U{g}JJ%C2sQO!m_uI%i}=S$5d@yZdtilKRa~R zsyx+Ef$==79=#%>PxPg5PZmMD=v&c4MNk?c47sizyD*Tp z^}?o^{DizX!`M5m}kC&v>f_xR5z6yfSGqn_C1iVqnb7vS?+gj-CH(HPF zj<4%2hWk5WZVMBVx+Xq{rme6qZ8%1zSm7glvLNk<5sfZX_d8w)$_!9A=TT@i-}1P) zLhpc}xG!MdlQO|1{;Xa8RE6`Ygj(eb2`^+Yhp`2AS9ihf=G^OZZ>wJPDndz9p#$3^ z%?A$&1XY<@+iNI)!W^1{j+EfqF3gJP0?WjY!hV8T!*??hU=r|d{a2xcl@fNLPk`^b zxMRGs3xRK(@X(cUV_$zd7<<4P2M9#UOFJ{y`DW~U#>rH+p@RAs=A)Iy@E6B zbm4euVHsU2g=ou+h=~I~xf3-YWsB ziZ!-^id5Un#nEC2o_F$3y9l-3g391#6gvk%wHX72XPc67S$?11+a~9R3w}jP6wehg)&_~svgVzwZ?0d7!f9p9_9tHj zqVUPM)}G>{cvX13jMp>oTdy2PZFE-sOpUzBOIr@(vThFmz11Y%lLRa>;Yp#F@!l~w zCI#Dv*9cqi-kn7i#?~R_Qy)8)7&5(S7x-mFYL%NMR zA|R+BOc8!em6~2Ubn&ut+$s}*2(5^V_lKQ9Ci$gi57MHRj^KxNCdYi7Ps1KZ-{exK zNzb%YS6VWMl&IW`?ksT(iC4g-h#jPP3;|!9)NxUSx$9cO#!(kfL@r zC2J7Kz^0Ku#{P5$>Bko`;IYr>n7s*JMA$BjkW&@0hEQYg)_Qh5;< z4%;*7;l@9vI1RobHb2)d-*`(>tF3DC-XH7yTOD(FzK6R5{9U9@GF@2{Mu<{`i&$%( zITq#7Wy5bVYp{uSuj#4D*h(+~(`8x5>=&Zd@9UQZNl~xzZzVm9mBFkxDdsTiLt%V; zu{U!dliDUzJYU!+{4eE8b4&boE=%_vSw5)~Vt#DpzAw3ne!S!IxGo&NH&8i73Gxq{ zGjviZ<=Ock)5WyPXNv-w&6C!Sc)t#@ticKAqzLZ_Pv$H^XdCuN;wRFUwmATAC`p8c( z9n1rp2vC!JOe7i3W}$@6Fw!Apu$!^K<5duftoP0S(!U@?^v-7sW*P89TMV;mX77-u zpH)xsZ#k`0P9}IXb#>jGMu-neBTE;t{duikho`D-UAsNUtO za`jxby{Q@Y9~z*0yG3V|s4F3Yk|P-*2kmZ%gGxuaS<;#*F`YbZhXQ^g2TMeU_BoeI7?s&YYKgx#C zpV`5B+I&1~j|agrFi?_p+D#%7;nCpIBd${3ehxBDB$EVvs$9-fmntsuK3g_u-%|@o zL)9BmiuB4;lB`2|;E{rqzoQ*Foc3<^WnDYIqkP)$YnO+%&*vU(uNb=b5O>op=g9cK zDx(ju@$8{KV!xxun)AaPk<fm-&fpg&}K+ZBtK1TXh#un+K5wV zL*7WaXN}B8b)s^erjPIh7Y{;tA1}z!UjwNFyCZAUL1KWJGYT}i-ADI!;(Wy=zcG0q zu|Q1z2&P#K6I~lSQ|4%85#RL+l?wrrfyRR-=p}bk5SdlmDp_f zm11ieGEvYK^_Q2qYiNfG&ehg;Rqp&~H5Tl_@N+lO>qx(Qs3|+8Xh$hH2x2nH{!rFb zQ1N^oH9M;$$(Fe2I`&!OI9*dM-)O7cCR$8BRuf z4WdPL1wLA(x_xZr8}_5-i8a_v5eFxaVwLnKoM9-gSnrZw8zKb*TFfsasy)4k&qLVy zz8>_kHdUS3W47s8gaV>@^5scSD{~V`im>3!Jq7AUSn_7%ceUcYUc;c`gw0dmThe%h z->l2cQur4f^^XRT0!)%xiv|BRACf%j1QHbxqVewc;!9%NR^`2(x$CZlXOy~OFW7$l zv4Rz`zLdk(UMSdSAohh4Ev4hL<@3?t6~E^v{c%<`G`I@sHQOq4Mf=vKii(c}eip~{ zkjYf1UNf)2u4jF3qD#aupHwixu7ye^2}I|ERSRXZKFpx)W&NVd3q-aaFy3$^yl%@T zAw2CDbor7wkGXTm46~I(0%VfYbGAJ%w%){a1pQ+T$h?Z4ez!Y5Uc>uUc&helQI6Ws zG^BoBHJG1O*VKr@&HL}^a#GEOo=)oKF@EDm2JFA_9udp6fBNUTg`=S~|MjO0*}Yu( z=Jz#pSQ=3pyvkgq*ZA7&XVu1q(;4*;pqJ{kHOL>Fo$BAE+QA6v>znnq9g;h;lWRZz zNqsjQ+%C5p^wWm#N zHIG$T!;b7`2V31^DqyW6JPC5Gi@-|gkaEuqlqgZB)->zOgLs73`Sa2|_?PqNJeMg? z*>Mdy!$7hn+r?{qHu?CDzGC8}1|fXRiwE+(=&+r3K>^yWY^s}Ra*?Fy7(i^B2|E!5 znk{*e|EBo$0ES00NKIeg)NF=l3c67{c-%>s(+$z~@Ow$9l)uhX?*?S?K!z7IzX~S9 zJneh4L1z4dFWS(wTT+sn+0pRm18L3&enN;3b|U1}i|&vucpVy#0Dws5l}eGH`pe6N zm&)lIqBTj&$NL7clr;P?#)CiPoCc3>pX$2}ivaNz9$)nkwj}-%1T8av8IU;~vB9-mDej=HT<_P)nycUN~yc+N4cYk&;WZ!{&`P7desFpX!o8are6+{`rzcF~EBR!AFkR$9L zW-cz8NN=Zng#J?zAV*RA@A@>*Hy>PfxH{OxYr6cJ_CdQy!Kdi+}lLr z*(y&F2W=m>h(40jB8}(1dmZs{=d3tF3_?%@E}5+n;-gJWJ7S{FZkJmH{ASrcK~5%) ztmN~<5X%^`>5Io!?mrn>Yvn8SyE(4b<*Uj=lEvl>ocR_m`7mTY@qkG%`VedF?idA2 z^#1kz*>3tWpVen73$2xi^u8R0?s?lK|BKI(2w;dEN%7(};z{ zUp*;9w<@_gq~$J$uCVb@&hj#VL`#T_%tY=eeXf+b&5>~#h_I^#?u_D5!M+HwqLbcm zWVv{JId62}8NVGDfleFjzgSpvS7jwpKj$qokfwJRn+wM!*;aciH>v%X+PTU?l;CWI=heL&R;s;ex|m*A?u_gS)Q) zNy6elM@@OF9u3uf1W-^wY-mk5(RQ73NTP{1g_(`&br+mP)ZDv&aksRu3F#)l90K`Xm0jDrhe9YlX&Fwmw~xW%PD?e z9{$V+=Es-#qpqz}jg6zpdB2B(z2zkidk4WZS@4atnKPZoDsfBX4Ir$n;A35QZS#bm zBrzX%$Nq3}xt#Z$zFXusx}5a77_okW4P1D}IPxbm$V%`xYouy294#l0WZftFhR@C`X~RTkk5bj46N zWal~&7^mA(qi!hL=7 zWGCn9M`zTbD&rU2m*9w8#pBWY#i>E$P1Uml%{ZOpRnI0UblG^&K?Ny-V6abXBdy7@ zBAmd>74!g*5Trb$uEyt`DAVSk=aSkYZYqWWkR47Ell-7> zSB%vizrMSLaS6^);}8JyU9oR5-+JqU_qGX8we6JOmOojVQCuEyM1D);u|mt`)f5%G ze=67t=OklpZaUo(w8=tkw^Y44;dI~45wqjIi^!8R6FWj>44#D+i z{&UN|3YJ^*!L_0e8bZfX^9+>ivPItp>n&KYf`-sjZg7vH)=|#U4Th8rY1WpdfXosQ zYoazgg!Q)U4cxJ9fpm1PSOzML4&v`OEzf}FQh@i5w&r&NyTmQC$$9Z;`Ec)x8YHUVT1M%gSO`Uq6d{!kFTJGgw zld%0Cj@u}7KXWz^izfPc1_COAv`zaTcV5uCafxdK-V{DZna)t_R%|4-lYQ`$Hx4xP zdLe`eURp3&Lh-@t$hs`F4~!7x9{Rsd(N38c%@}-9@+e69*|Z$x+*CeOOvJ}Wh(k0q zy;D9;KL{=8p}t*1aoUkySGHb4oY3};WVc>idxL+`WMcKm{sLmqF7jC0`!69sV3*cUoro<^T8dKjTHX%`2cD|wwcS9V~>@A=T!Y*BC;M5QLy|=EpT7iB(j${ z`&qUuSNa_yAH84c3>DmX!Dp+DMJoNW4l@LP_zHXXL+R99x!^TGayfciF_@-n6dVM& z#BM3P6TeG8i7f70;>| ziQsLD+#>t-C7gDN+)HZwr)V&6=w0E{tGxZFA%c}eCE3_ldWoLwZpTfd#`AsQA4Mm7 zT-VW41%J<8Kb->SWrxbD-& zmim>4BJ-bK;24 zyx-|BWwRoc^V+KCvsG{Vuv=(kZE6J0e}z|mi2quO^-Ppv4=)Igu4xHLZM6LY5Wm%B02geF zPc@sB&q$y;59OYfa*sz3@Qi-_{gFZFc@$El&5w=dr};V9y2gcyghF33Y4GkqV27M< z1wJ7Rk$rk<`pCj`SGS>^5$Rztu&u9o@y7-GeozJ9ndnmf)2i}pf_i3U-zYij@1HQ7 zP+U=mFSs6uMzmz1l@q;~cOKzonkL+t5NLRy&F%>+CVMZwozbeUnofCFI${*sBjdny zkn~zqgoStAf^pHI9_dH+30KfK6{7!Lw~lU?BT~#G9)w2X5=4a%Q5Q%ZbqiI_z{~BF zdBS>_5eGF>4&kKSRl}4Q!Yf@2Gp!^o7RwviOL+-JW^_Bk0ixnma1#D$RFqG>9cZFZ zVCjZNG!lS0%BB7AGWGTV3@N)HrdltVS!Q05MS&$cX7n!KTFyrFc^FCkF(uSGDxuH7 z%KOv@oT49q7xd9CtVTNRO06$FSdj@dw^MT71>({L>VyMXB{Sx4vRlWBV*?T_z3W+R z~gj_;mO)i2wI}r{q3lAQ&)+Eq{VItCUTBiYZz?euSgp8Jv=caBq zn+;-yLdZb~+Dk^$RkLP$D`CM$-!h~3`$4*;Px;`y4L%yZU!d!}g{qE)p#9F<*55=nJZ(=j0Ocv-YIYzOS0#wcza# zXZ0MN|G$}%9+N9}PDJS+*f=iYPKqL@n!!MXfiL8QQiwA?O{Ms};)(DhHpAuPMlm5z^cZfgrIhV}4-e zlGjUSjdyq$nB|o17-KfP8_g%%)n78piL7{Gi&NH?N)xev1KeFCFCc{hW9M6uv? zC+(zh*JKIzH_(}d^T@_nhaf(SUVPv0s={aLwu41Fv)s2iWeS+)KOOvHo*zH!=ciCw#d#wenjNIZ2%Cy`}(V%Lp&mykhi{_n;mafebeqtpvVMsN!J;}RD# zB+1I^pTd6v6<*{`YSZ-gZTZ-wd`V7nPD4HO*jrdPF>AK#?t=mE8P?yvFZP7duF`ta zPzpFfPuiHYl>u>Ws5aluD1eRdf~>HU z2Su&yb{>E)N}EwG%_kHDC^AIZ$Qb^inJ}&I+)K=bp#fTX7B3vE9M)edeEMOg3O;z) z?BG9aeDALpD}G^e(d#f6!q3R&Xa7URL%tmr=Gm?lORdcew;uIO$U(S5j!p^lf;aU& zbZCz=Rmj;eX6zd!Nh3P&c;kd*_7OAbLGPJjt&f}bH4*3M{F9SQ(WJQh=Kz*rHoB8t3UD{Qb$1;)6;m6i$HNAQPoqBzkz$;@v3-?+ea@;9QW0Ry<5z|Y>rifC@fT>$)Jsv)sG;j(x|MB4Y< zf2LPCrdP66SrcX&fG^4BBk>Hh=UI=SiO7S}SWdtz$pv4bf#pR@Z!;|)DXf~C|4^{#EB{eIEAIJg+Bz$3FhpM+gDAAc&f=Y&x_F5DOFHum`HjM zdEeY4(^UDyb6^cxPOc2wmz`g^&Rjw+2{{DxbSaWo`D##6DvA7EYcqO!qe`NJnESM0 zgAh|CZHEn`)vW4f+h~Bn%2k~4^SeGdZdOZ<@%+qGiWLg0xLBUW0GeFNAJ}+i`F1eu4S#y8k_u&-T3wUG1|4wKg%X(Vh;m7)+W{ zolCq&bofXX1$||B`TF6o+pwP5*GxR_Bclg+JZbF!XB~#oF$@p>Q2Sk!h_X>4!!Yb6 zxxK-`ndaUl6J?(NFl(7(FgKii6h+a%)zg<>c~+RnUpWWf>WJe1Ir@ z)WCOg)I2qKr-MVXEC|Kp<(~hssEo-;;Ca~4{^b6HP!_2qXgx2xW*@YYTo!f!@Wh_~ z1UKJczK{Oh%Bneka&GB9x+bTKtFMc5g0p?L@Rnn&O9H{YFp2GfEHLV$-vzeg&sviW zqHc6ZJf9tYufJ-z{0XNPI4KoI*W|GOt$*(cW@|p{@ZY8JooZy(22$gak}`cslNGE0 z4jYZ_<+OM!J(mpQ4C?)nb1tlWOw3uj&fBZEE3N)(>gg&>jV?f%`rLy_4Alf_nRv88; z!s6@h&4cMcYLDXp$bG_4x`tuR+QGimc9|aG1y1^~S5b%0-Zoz*!n1T(=(8QW$6@`CTH-a>vU@|389t*a2NQ~t6fk<-`3H@uETa&x|Iw={xx`0L zPSL86BPBMYXcB>Wpo1xNvSZ39_NG+m74hBNQ$bnzu!#?Nbhn>R?Xc{-al2|wPYEVUeu;78r~<28;ELPdad z&gjQdKi%&2`aN${zJb;6{1AHK^a#l1V%k8AWf`~uFJL_hnu{t}xd`L;I2R0)Tm>gC za@M}xxu)p|+3WoDj18S!0x#V_uDrPl^f~eT!>^FNbD8Ju)q?})^Y%lw>mJly*LX_# zSG6#SRxK(?CAEM?bC`fWZE}ud<&6+wqFH8=AGOG~K?~1F800RtC)mAEsvz4nbzHB8 zbVMRGAc`MRYxo1kTnP|)ns(^B9iZ$)6c4-#Cg?}u-K%@FH6<7=2b&Ic2#mdzjSJ%} zj;mPord7_)4qh)u|7z;&%4b9uS(y2(U1Q%?0yT$GDyIKlg-Lom3vBI@;T2A??o^yz ztUZRIROKA)5$4@`r`&DFh6I5Q?I8XeU!K5|yS`zM$KNxJ>(BB_E(Jz+%EfB%$JQpb zmD(@F+*=Q*48)+$@*cjSb&$(O2DjlaF~&XZM4d|l{ehq@-hNgi0cn7dHN;7Bss|3# zxzr7duQx((d(+T?oTA?KdBjrgidt9~IxrxLfG;QnX?sGC@%H6Y(f7(kXtXL!#8eM_ zrAOYe4>i&dgqE>ix53udK}dq5=@|h&*=-yfa*^Yz!h_y8Fel7?7GkqTR`AHB>}j=# zA#`9susf-!1`?K-q{c&S${#_u~<5X zSf*6s;&C)@xBhZ)(c3hgkfaJu@@2PwR^lD|z~N2$?){!!k9q5>>Ai3xOt_me4= zBSQT-#Sppf#Gzf7z`!UxA-@plurO zRX@FLK$U8{9;E50vA!SA#L?jz+yReAIX6|gkzC>7g{PmNQ&RSb^)VzhoMwnGS>yW; z3C)uM>pjbvSuAx}n$(fq{skyd^>!!`2Fe{(9^n$DaJy7Jl*yyr84L+*u%<}u|Q(RP*=I9i1via3-tSJcN2H+h}K?aYp5@>1(I zEvUsMAj;1Jg2JY5f8cy7t2^u}kZO~mp1kCHLXL6w<J3}& z(uoxN0g+NL1pG`M^CkRb)-%R;pH~)lgMPq8oSw0$moc9%v)8_h2G*Ybao|)x7QVHS zehgR7*%(kz4mfkDH(+GVS;+YyNxMDwWYrW=i$KUeMk+&5O_rU;$O+=b#o!#_u@Rd0 zdFl->bP=bJhmccZ1mSfEgzO$t6&fAv3~blO>Ynu|!9ss{32KC}cSAO+(%YAHR=QCS zr**#9H3yd(c23Q=PKZ?=e(MPR`B3`FC(4aRD(^$r+!SRTtF+*UMh!nem$3(M=IrLA zn;Kk!83#OmbcB9-c!&qDCeAL?MG5fAeQ>istY+)-(pg1_*4Z*Px=5sZp%Ny3X z4fdp6k!zU~7!!Rj`oY5@cxJ-oBqPZO3&r>n^xzHQ-lragLFlrG=#>;dl!)13ElyTi z`<)hTWp)oL+U4!7qffm$Pu;3RG%5Q)BI}&WX^w4HlDsuo)MZgxS>OwWn*Q0Z0svb} z%q_vK$Sqk?%KL(Q8e-GJ`r572$m$sG2a*8rhL9h&hONbZ&nngF5G^MYr+h@fKbuT$ zjKNl#g0nK{hHs}7uk$vHzz$!#`Er6fi+AlGo#WgP4KsY%RUrr#s}389;Ra+*b5GoF zzZ|UEjxmW|Il&)@Xegqgt176R;BBOEfQpaWF{Ej5?VD=6{c(`>2%!yYZ=Xtt&g_G1 zx=fuQwDhgKi0CO{T1;Gq9Ddn3|{lu_kv4HiG=Cdp+ zX}|e>&i`gJ?L>fNH?AJRw6276#sYHT-UvJ^)rsJcMx^h3z)r9P>0h7&?gd5Do%QA3 z2q@f^_N6ltktl*98#Sl~aCKZ26z4}Gkt||BNY;rVzj4so*r2DlWzWr2@C|!&NgQB&msP))ptQA31onOx>4brsJ0#UErG zKSHF!&R3(ig8|K@F!-w*kY6`^kmdmV^*GN9M;GCS8BqTyTLaYZ?ZD>Vu2$+;Q(AQ1 z_d{O|sPd?)^6YWFy6O1|JZ8uk(PdkmX(umea4V~cr7HX80QA1XO7-sfe5G4*v+3z0 zXJ(vm&lh}sL1H2<1n)3vc2Vs&^54;u%i0iTo^`{AUCn-qGxgU+q)?maor^?#owE~b zFL84Wj9-v@c+)a#eU|un!(VB6G4xcFvSWJH?hSV_0Zq_O9`H8FF$7Mwx!v^YHgI~B zIdhfc!6ifZVX%6eL#&OIQ}*2lYNcWP!)qaW1LJ{Nm=Ih5nDiIYMC_K$McU4Eet=G> zo-e=iWs?a+@4`I7c1ey7@S}O-3kopgB&M2Bc(^IPmC)wPu^0c)Pji^^_TKRik)kBO z8=zHt=fEkj8&F4pYFH08Dvpfv%*?_@rfjHkW4ZhezH0CfWrz4)eXmwKlPhFnDccZT zfVX*AJa5KSV-#BVM_(wLM=Vh)mzeVw)yBjYOairWk+e+G643$vGy=Y$080i8p^tCA z@Pz5j;?Pb^cnHPECp9xDoQaD)xO;|Q5xukY(J^fYHV+%Us85@?y|H!61g)Ri&4&&5 zD$f)$BAIB*%lJf&G!Tx=#cSgvAR>H3){bFoUe3EtMmoTVVSxVYFo7ic#md+*ZOzL0 zSwWEF@g`EW01YhDfgA(zs`0+N0>bHu4it(D_ zwdERndAwH)-8X$9A>U+dl4*6DK+ZTKs$Zo_W12IQcf#FDfPYDlRv0vJnX=7f*v*IBo zD$P%|n0K=}q)BL?j1#Zypyd;t*{+eT?Eqa#-1I6&*-o`QmJwKv18oU_)8-EfqC0V3 zo4QlGjHu)~h6|3gO6hLm7#((G)h*1VvvMrn+cm{)>Dy9LN%t%KmvmoO14RR&5RzU=D3f!Rx z41?j-oLqfyu-zgKa+`5Xc6PJ%;~C;{w283FE=y8oaKi2Ft|{IiQmr2RfpqhhiA2d3 zCNka>Fv0BI{o&-c<7kEZq0_$hk3Aa%2;AM&Q5QJ?d!KmWS8*wL##ldj?cOIMI@-Cc z!v>(O1j$42%9S(tI!hwz%=>m$=UJiwl zxt;eW@n=Z%#QCo$&4L7}Fzh=BTLkdRXIX~a@tc~3!(iG^Bb0var2hgUPHmzzn^TSz zjhXgGg}t7oyvlNQ$?*04f&Vqb)D%x=;z;f|dN-dtN8e-pTNP$|pq;o?7JH(BZ4SiD zljK1Ig{ra(?D+>`+udi$Lo@jY@*Hd7p|R%-c@h2eE%z(49{Br3I5*Fn8CvApcIW;z zWC?z>#GGMG4=w`{FE-UsGlJJwRP-v2k(R~rjpGg}aQ3FEz>e(N)KC-DdggSsK`Dp# zv!_t*Z$V`oGd>~H)OsL~`T8cKLnxCbH_N{JMAvEYa=);*UQGTjYxWgvN3*gD^Htj- zy%9Nf8`jERoqY2%?p%E4F-9h>HRE=fyh%F9o@Y*M(DZqmTvR^0uY1jjUE1Jy5FL)E zTVEKaWl@*%m>208wAP$|(>3+4Su35f%%pk-3dv2At2%+Z4Z{8dm*7KXrob0E?+%X8 zS=b5=T1tP1G<$QUf&`krP^kRv|sL03a|MFL}*JM)GWjWX`n9Al}B)Cvj$5zS?-wLq9v0HeLG^yj;* zzxm6&ob6GYl56RPv@bV#iJlR8a+SG(yL)3n(bsGK&p2zD*#V_&Yk?O%g6Fgu&tJ^*AtKLD+C z#`88v9KwVGf0 z8>iGwH-Gi!-9|0fQ(6IUf4MpOh4W5gQQ5J>464m1XkuqItF*5oD7CEfxPV#!%rZ)TCWji z{pS)$&IW^wBK)@|9B`0&pY5Esc{hQXQr}_JBl_1i4fjS;{?_d%S{ zH?{QgSWRj~cZgc5-leu%Tf)S-Q>;TJeuz^{{}#t(7zkinv4IaYhi)Sb+s{;vi{AB0 zsxdQ+%=Oqg;S!r~_I-SyMB~M=julVoiCuBW*^qbCqZu)md zL}!S4nl2*e+`cLV#AJwh?p4O{-n#t!R5n~=C_LdA*yFkmoyH0D{;m``gdYyFeKv9g zkrJ(VBg$x1=>r!yOOq_6jPeMMY>g8={w6)PjOBRZB{2^lpIw`l z);`UcflqKc1ZG;I!-&dO4&M7jXS&PSr=X_tRwx2))ze!dii5sDWC^^+kRP`J3B)q*kk|&LN}r{a;XmyZ!%e2il;FiT~KjuGaLV)gsLx zeYN7vFlJA}M#}vVr`(n|z8>S$?0Ym)AoILwE3nf|_1}NJq)tbbAELeXp7-6d9{pz1 z1GFp$1=M^KhkWX4-uVbW(MOjkxI3r6j755Url3iz{_Ukk`l%MggKDo(|8REVoFkSp zA-(x=0=HBlE}7fV9?OX7;B@HMjxLgV5M0LAa4yHQZ7;Elurcfe_@6XD+d-_`o*Le6nJ1FCX*3Q%SB3ko0BSR&T3}#<)f0n-r zt%|g(%xi8-#BQ}856KBqi{(vKe*7qwzcktf)aQ)V$d`i_A_?SUD5U=T5h4X;l8WAL ztOZcg+{0qox6~cN*ScRkhJVYK$>j1BD19w~u{b&u6+t5Uw%cFBpjlHvk^xUfj@&{O?pEN384K25U&q%o z%GV2w*x^trh?N6h!hLYDRbdXjVF|^Pq_3_cjt_^^b(82SDJXR?#0qb(4JJx>M$BgE z?82>5V`p0~J8ApSl?YaOTR}`MOWcg)V>Ck@pGg3U3-~~7L)1FI@)X~$3r>~&Xf5l^ z3!_?=uo=NcYX&+#xNHo8QiCN{gu~7vNje63yYK_n!W{S7)A+0yT@5phw)e*g1p(hk zR#|Mdbm`driveQVS71jjPiZaR+JNeRMuI)uesgfPoMWSdOyg5w!-;AjT|J>d*C;PSbs=Djx8EsoFo!(C(s=u8#v;A* zMU$oW=Fo>Y8vn_`Yr#6{DPpq42+3^OO%#JzfPjy{1;@5$)Z4CWOnj_Wuj@C&igN3vVUrihd`Ns2oY zpbeVO%)voOdZKswZ$A^Fd(jXZjK(EV(`8Ja<`Qyo;E{rY%0o~Vi50vbq@#9i`wp#&ux;aT`61x63J$+1 zHLp>;%fS7n;)$7+Tdgy(9K$#MQb~*W6mn_WYAeK9F}ml$+@)=6vDn`L8WWszBd$NsE~S&oh5XaQg}ShW&=b8MIL(t&&G$P8!pwgGVBMv*hx zzQ50vk|EF?Q1y$hJaGWg3U;9qR&qVw(Ar74+27l07KD>ZZgb>rlk#o4{Kix`l)ln! z`pWQ5H_dxRLtbtn65>>>#fDksd}B(YwGXY%<|Y-F4asNdGWUK0{;kU|iek);FiiTi z!Y0y$*PZ+|?3d13u)NC$nl;RmDwcCI(&539rbiqfZfgu=700Il&bhx$n*0->^{{ZM ztAzLJ^w!|Wn7`7qZj9p*KiMb?m%4_To6qn|ngTdQ7}!rCLR}13s|fu;nmRZGWf2Oa zN77TPhnQL9;+Pr02bG51ySzCfUWjzxR!}Tj49y*agpmq9@OhjtkH&KEA{#R1lk`ZnipLkt?8iG#L%BMc`e`xMFko0WK|QrDqc2z z&9GIljLcs*_qv7j6-K$5BGEop%n>~a#!Y%4z>$c|%P~h7vAcXu1%|~HnP<}fne(=6K>2t9POmUjJ+IG%QGVjg5E;3zug>)Toz)zNd}rK?~= zVQM@OG81WUqVeUQ-2l5Z%wcqrt7@q_dNqoxV#mpYcic9gZrc^3C6vH1{^iUnZ)9-gSsbvUrZ*gNavp{%taeb!tM= zotGsc(7!U~eCvY!Dp6i2DX%6W`0E@8wNf<-zex$I;(~y`s~%bL=Y1l?Qm#4L@M03g z?Kw7K>oOdpMzyCJ1{tCMhw9g8l!dAWpoRxnZ@w-D{H%XJeZYNS7B4oAM=AX6!yH^i z+$be(Vc@jQ4+5x04262-tb1y3W?@1AsDC4PF?;hmy&Fqu*|lWFLYHb4K2Dm@H(nuj zw_r$5jAP~N2A*B$#&w$1x@(bR&ia=`3Vbd0L7&eUKu)xYF?o-V2cgOn!<@{dHoTa- zfg0jzn%qbbGr_=7LNzfBd8){EoY+?l=(F2d3S#r_yJI(wNVd{i@H00_h^MwM8~p8u zd($EmLc+{F;6CHQ);s(R9T0^3VF;{RuDB?f;Yg61knH7}7$E6Lmr5Bvyy;XtJCo!l z8`VMUSRmr-(mgB@dhGx=eX?&qfAHzW|2Mjve@rybHXhus>le@m-j906x!X=%DyhcJ zmP7(8bmN3o-ULgcGse)Dv~KMEhcY%H&L?MzBNki&;=&+@#tDPn%mt#;{;A6~N`E&% z=08QYE7mMsbemT|U~8`DCNYOxwuC2Y+h${Li0DcGoxeur@6(zP_Q@m1zZBryj;Cql zlwp1F$z!E;z~5oi2E%b;T@R97rPVg8bCC$tH8-*Tk}yXHSV8_SUaT?!EmCGUQo24q zBit*6DD6gjwn(2UC}=cRkrh{OtKxjq(j9)*@tZw=J_C-%}ps^RoCYQmki$X8q`mS=#M%|BE)=H!rq$h%I>SJl@N#f@r z*qU@;#EBPvzL>=5BnOk#KpXjz%Uu|Ihy{SI19=_ZOR2%^vvQ3O5Yu-dA!ac_=Tfs5 zrcTSZt$jOYo!~DmOt_jvd>mS#-~VjM`jD&J7eRy^h*D~x~SMJq&sL96^qEw5C&PG#ygFIq^K?wGH?X%xUhZMIu_SQ_5h z+@kj@3x_L7c|%)W)B25N`px&i{Abv|GT#N#JpU57C)n`NX`hGX7P>_m&^HH{4+^@= zPeg_f6|q#=W_C^>j*0yZh=nSNc_=L$|L1uDa~pGoo~{`%6uqjrcMpOpmz{gnz6>{) zt!Hfha@JUVD3Mqz4wQXbG5xE+h2oHCA5_W z0!Q4#@X7nxmFzX6adX;!9j(PyDcElNgX2#^X4zd80@`I$=0eGFwZmiYJU8X< zGzs$}>zjz|fG%gm7K|c-V=A9hdt{t#9}dod;Pm>(pAXB@@Vs;)d2WGh&|?f&3zS-$Wf)&U|;OsRmKJrk({ z;Ot(SP3T0*sW->&lJ|&n8%1v98nf>sl zZt6@z`T{j|A@KMlC1WAr$RzdHWcUoc>6l)V&83PBgC@D)!lp96Cgr%GV=&6T07JkL zgbhbSh0~-h!|47#eyDAVIP~nm(@!y5%dbaTj}%*SG?Y6^+A@Ic?}eMz5!#uzCEi2C zeg*Did&z=gSpO~NjzQAa1cVw_tcLB6ksgmRgl`@8-tl|KPU;Sew0@Y3_#w1jvo`2M z6$S8m^10il7)pY`!_Xp8115-Vxc(9ClJuLc!?azAYw1txm^T~l>l~nM(n~*uyz}<; z!8mm)a4lt{mvg_KbN|r4Yc2hUT*^Sy^*zL`_EEd+palI(uTNiK{D!m_g?oQ-ifGbMMwL#eZhL5kbdGBSsN9TT_dUGArch#f*a{;ku znJ51ap_O|dO+()Y?6KYQ1JoJsbSv`X%EHGooAiC8DNZRAf51BKD)aOac+BWdNbGU( zbtvpfy#H*W>8Rn8l!?}bzgM>64o;BkDZn?bC-M(7-1WKagdQ(7^lG9ZaAy@y`&Z|~ z2=PWtN1zwoAs8C_Mx>WUs>ZQH{^W0*H>muIin$ms)GoJGXbR)1`!Q16?wh_|;cfeF za8#+GgR#oc(NgUZorej1AoMKrNOE{en-3y zB=Jdd;Et@nBPF-3zD8}EgT$Uty$(%$93MDUVmPMvIBBAJ7I=SSc6^*RPtepiBKd?a zkMP#)Q~@s;K5+MzhQBPYFa2mIPV|4w+Ij~zu9EEQ8m=gw|M8>pzpM?f z7h!AVZYv|kp~%*DV(_kK zMa!?FembVQ5^P<Aw|CM?(<0;6N1jfZp@4?IQ4A1_G&0TARy5e+^|TmjJpbAlmA+oUs=&)DeNy#m(U22mlWz3SX+z<<%t)Kj-KQWjx4$btq|x4 zY(V4jjsb#fF*vh+(m-0U*Z6Ocudac+7LU7|-8RoHQq>8!>aD z!Cd9i? z3PnZTOsQ)>SuA-*>L!oOyq0Mn{6cKA71#NYaMfw!8RT{cQJoI~ZAza2E;^2jl-tUG zqm}<(AZ`LD+^&C&4Hs~ANO9Wac)Zxp+e&uq$JJx)L;JpJhkLi;t;eu7yle0N{0MIj zvMHf-5+%Xa%^!jpd!J-&FYs5O6!{*rX?IDW5+%=ay%>xb$nxbQ1+hlCyg%7rh!n(H zfobUA<80S;IhWcpdbF57coy(KfubTmNUQHSRKk8n>?RM+zE$Yj0W!dOm;O2Z@HKao z-X4yRzUc8AzQtZp>qCI!)$0=QBz&_izut$0G3Sn1+fc0I6gRs~UXXX4ZI|Wx+g(P? z!@v#J9yqdMAQSz9aNlUu(aX%>ZWu@0{1>C^8oEt)1-C?@HO*%R8c@>s?)HQ1yY;TC z^(ucq7ku)V)dG%X@GjwMiJNv_gjl-@P&=jQtYe*_4cp9LiBvmZaoF0(7I%7odQ zM||{`xII;PK<_T`vR%N%!1iR}qW&H76^B6JtMsN3n)sj(J~G)sU*6YCeWPhh(sSYm z6<<=mxb_@_=t|lUHWYdP8r50NMexS!jk>3F=*#;Ssc*n&192Eg0T8QXl(GI*^aIp` zZ3}k{yE!k4m6`xO_gP*}WfD^sp3EgNyn`z1xKGgriKZd(^MvhmlXv#2OYZ?|}FuT!ew6b_E z7G90Jf!}4^2E+Y|7*2ofKtK3B-!?*2{>Wh7=o167S1vh1xRMym7k8v=VP@%i{PcOqMF>KOVi^d(7-Na^J8Wa)FK@~p-y5*0@ z4U$Sej!XG!Ag`d5GhYfSq1DEBdSN{XRIP#$3A*!9sMfyL=vg10A5Y`Y7nTmW0y zyyL$*gB&h7BX|Xl{_7(@8)^4;zD`xPJpld%7*pB!8-(nVQ?}d(PutIY{lz2~$PROa zj4oCvh|x>$>n~lGV)0*A1;h#m^B&de1!Q7K68fGbSFdF>yoZ<&dlEzNBCVfJ^H!@T zq|nl=MzasP%5-8@U%6# zZtGZU;Z~pgi>B(>MRTO#VsCEma<7O)KZ(+!mEMOj=WW z2NXSqjr{Y^Vg^e~KN0=7LwJDI(-#CLk8X6z4r+&KA4?i{*;`ZDkk2K)vsd*@(f7%V_^$Hf{h9!Y+XFC?#vEs41rhcm2c1A5YQbj~)&RJ+RUN4G8ZZ=37``GgbI z{KaI0ZMS%Ts%fpL$-kybF)13d0IBn~8fHmD_9aC+ouV#p$hHEUjaB}oQb~q?*xLwB zoD{s*HToOlyaX=R`AEMc==+ss@}vpD2h&Y5I{LReknbE*^3qXF*yQ8DVRbNLyPMzqQ-)u4LPs07p*+I(GfoU}ATQyT|( zZ3HD43zyA-2oU9!=u#d%Gl@mj4FMXI z@ksHBL|cF-8?*w9asd&bK3>yN-_}Ifs8i&T6|}BuC8ksbh!F-~Zaz>F@&5v)DZCFE zt<9WW3^wieV3Ffxj3T`%Mt>Ok5nMOefK ziir_RQ7KtPn9@c%DtkjQBE6c90+ihIE>G@qqsaI1t&j~KXSUrwL}>S2{(;+b7($<5 zS|V@-KM*0`?9aUDxBXHf{RyFy*s<;Uci)9y{+dl7PIVsLk68B2HyY>W@0^Q8w8w;Y zLKkoI1hzJcRpZtaN|{7YHSI}mm1!Mv%&wqPtys!$3R{@7I=d=4at3Q{8oTV{>NpU| zI)bZ%`QZFXT(9QD?9N6{3>#Ejbjqoq((E`YQP2?mQ09ra6~RPTR*#if2paqdeB2G&#^w1by* zwRjDC=r$pkNU0L#&6G`ENA=qYNv;U^f^8n!O)wTp3=&@vzWviQ5x$l>q!M$k=^*7S zpbqAf>yU-LSS!9ErMJxp6D*~+$OkvPNpOFSHY$9YgN$9YVp1V!7}kJljbc)LFfgTt*(i5U_nB`u90$;No7>?6p<>d z8L*FLPVC)Y8^qhamb|rRqIik!wz#la7wv&bP^c7HbYL7^!Z~q@VRspzvGO$|`8^?o zBi-56N(I*h$u0jzal!OUyb=C5xy)zLlxm(V7Q;MRWmL-)v1-m1z+On}JJnnrReA7e zdPmW|1fdo}dM&qNxwb(}r#w3^8q3~D`K&b&WXLsRq9?S935K9LJL2ko{awdvVKSt^ z?UP38d<)01Tv^QyFT##}ZKct-qi1RJqxMIMeJjJ@ZguOPh~?xHc)V3$@d8#((1D%N zxfE;1T3n(;N;uk^Yf-5l1NpPSW34_k*dNb0Db!#6XR>e z1=G(A`8-svP+ZehhgMmSyf)D$cbXP4bO1EFMCbk{(G51Vdi)Kvq7B(og)V9VK>z;l zMsgpL7bzO$NN7>Ja7EYouWo6({i~=Ynd?tF38-ZN8eP&9Xe!C%`8FoJw(*3-a zegJT4))WU#zqt|i_DS!4AlIZq$Sr|86G?#r9Yvc2Z+15LOYL^Owsh&fP|71}YfX%g zE$ZQvkV3q!#>5EdLr;v=uan%5(L)?WAy4dTYeOro`d*t=m;RG$&M*P&!K~SZo~lU6 z-nE3yBa6M2(b7F@@vSpf6iPy+5Z0)LbR{LIgn7-NybI!0`I6*T+>*r8j#{ zPJ8K9ELIR6zzW6doz_&l$xANXatqLH?S5^d)k}ZiEf2l?ympbncXu-9)O&w^J_2_G3ZOO1n5kp&VVtke0euA5lNko@R z0O@GS&XVt~l4lhZBusbo2J{gR-jA{c3pTGTZ12g) zPVEdtiP8pgcE(Mkb6CI{$-wO|{RN&pEhUxp0!LM(3%i8B&+ioDr}MU|kWj#@E(vzF zcr8QI4}^ua$D_PZ^n-vGY&*H{A?FtR_WyGy7l$9mXX{(PXD1I$3BMJ-nw}E95`4=~ zh!iPCX^yo9JfJbMrr2isT|yn?`_eVno+bbi%pC@At`OwMoKfTs2N|x~ z?6>{ylF04tf3CTpO;qVvSVn@4B zq9ucbK$TURslBOXfZdiUoi*Z?_^V)8_m)4K)_mxM^k)!~TY9SSE~F&4bGIFF(OM3- zSc!0Cg~GBWg9Hcg6D4n&mOo+~KfyfxPYd7%+cI~X^O7KN7_Kdo>*I}qF%lr~rF8Xv zV@>Rs2`%OT6p^FF`*>4erVJlE6kepiV9p)3mK0PaP;%i`l3ZOPsh~cjkfY7=L1h&c zur$>YWDZ~trd9Sk66?HhZ#5Cr^@3zifKqY&tOL*8T9^rMezvgNX_Ing_}V#KEup>k z#JQl1OBR(DXb)0F1u_a@v6A6H>8lg?Sz~TVfC^f;0XMGxP*Uzk#wE7)RO4JI@lwj3 zc)(g#VXZiQ!sYPhOi~3vP2EEZ+-{_vG)G+t>nMl`cEM1xn|OP8wkwSvLEKhAcj^m# zBe91WlV*LWmV8*|4oXSv%6Ti&fj#e`*PuMgLW%uyapVH1dry5zApmj=3hMT&+=riJ zPJdo=*M4R6^XTF2*VF!QJ`p71uK`^Iqt_%f8FL zb?;eg1oxjkIJfQ|5srsUwgZHT1=U#b7j6mu6F67r6sPXbTqXP+TwrP-3r-A5yP?6lk?(W@EG)j$*C5 zYUM**Pb%OG)szgN5Y7BJ-D0$Obbf_^9{1qXbo0*Bx?kTG<;O9gyV2`1JygfZfqPmBQ@#bPH%?3X%)ce8KaKmAbE*C(gFAQ!&|7uJodRfvXH zyAkEKeyow$c4V}sSC8+ssZWP&SipC#(&i8W5kjgq#1;7~ph%m>JowKID?r<*UzOW} zcOiudE!*r0NA(zvoqc)~gFL45#(G0MfbZWf-$>9oFVK>uU-~`UOnat~w(!psMW2twxvvKN$pN+mu@x_~#N0nXT9wq$r_nZHh+p zn2uvjMp)e}j_vroF#(W{2F2faBDv#a%)OFP7LqV%ZSfSqDII&``t_sQI-%w#ZiKtv>JyIda|K-rqjZk8Ra|cUT_^ zwnF|icku1r8N;q9Blt`V#&Z73aS+($lw4zBIUy;~`f}4L-|wLQ-8qa$M7~feSRVI6IS%j zD*I`l@9)@)mA(up62UZ;I^cyeC3I0|&Hg+Whew6(TdZf?%7Dz!?t3ZdwDtxOP82R#m z-q;iB!9(!jK8ssmS0Hq|EW7ZtlieK75$f@_UI4MD=Kgm$ZiFvo6f0h9zIh>FwSq{->NBdb6$;)~(=QJ>c z>=FfDAK}wwuO5ciyZRn`#?v7UgbvBNO~QXHLE$Q zr9alKstN2ZI6Grh`sy39M{n==4G`Ixj?>4R!oF6z3_9dKfE?~?TtDwq=%Fm)Rc1 zy@uSc?Xxbst%jRnXlh?Ou}b|7kg(?fWtWhhqlF@r;?m1aHR*sEQ668cQXYeJ0~1vL zh>FqPYG$^u`Ls^+k?f3LqxOwTR*GJgszWZKW1j~=cnl88rwi>4swJX_VmNM+pasWQ zM_04X7DxAoU#3wmXl@~*D;cBuM^&-g)1zL_-Z`CJbX06)5i2_kejHY|8A^CcDkK%n zFWy$ATJ^I9yf+-PCaLY6*9@_qKHd9?QZ{4f(hb9deTGvzyXhja)WVXSh*opB%BFV8 ze}6yN!hrqT{xP+*UBD^xkz3W#x)HZmbi(%K?!Q?Rqes5IUnd-(mpAk4fs36M5PCyj zL)Bj$(17(2Tw}U-GYB|?gzj7APuWAA$V2|sCgM)#d}rv zt9b%?^f>~Wh$9_^bbKly28cp+Y?{jhe$l52dv#R@dDXsY6EKf_{bRv?;oAWP@1oChL34i}0cZU8 zX;;9^Uq=)G*XISxg^z{8YYEpG{qs!AcTyo3e3ibn@YeyyxmMq}j_*gT7F1B*XUM~L ztj#yF=To82+}S@*|J-bvZMynkV*fONLN8QGG6EdKjJLPO<7*lmA$;E zQ;MUOo2XD1xa;;)9-3`O!R=?<(o+f*dU&dDx_oLi^N*?XZJPERic+J75|r_N5(VTnwQnCwn^&dik`kCh-foNntsoeDC+qmX7WYUBV9Bg99q*TtM}`n0 z@wct<&w zbwgWq`e|U(?Zl?|s#A|XO=|vPXqFp)2i$>$=LsXq*dxhl^?ZHKPMW~3_r{|9>*Ra0 zSKq+LAiq<3e}K=hrH#ReF{BtN$r+ywk@j=0c7=eZV8l35f|BHJn+=jkGXc3RNa{OD z?E5Uv*)|s}WpFwdF)(ftgAUf!cBX}Rb>f_{S*DH{Q%<4>#@>JBSWYa*Q!nP`3r(g; zeLKxr%3q{xBlb1xGtG*tT_Es2a{+U+iPjAQuQT8omsNXp8(#hWHG#E{+*fU8_L#0W z=e>BoBzN@$(0jRW;zsH!>)w&lTOc4P7F4?^dVSNb8ayQVn${-DZxL>_P5@2Y;cwLY z#5JV$wi;oBCDg5Qo98RWsQ4fk*>}V9c8Tt_=jBkfqi^lob;y#SXv4Lom#{legeT6_ z^k>te;{-|K6X%mPu9G?-OnCfIm-CftN<5PbebJ+Iyaqo8Ha@frK3+_mzo@~#x{6di zN_E`Bp$;Z;F1#oIi76-Q`Q`c?AOW0sSl{Hjf(|6+MLxe&e|5k%L|5NVNr{2vF=CEf>3jBZG*K=l5Z2FYIe?S;Yvq>~3zR_oYr%u;V4*$>Gu{A7acR@jP zFlQzzZHoWDssGsx(D%@ulz9LNg8ScGK)e53(8@3dYumLJ%n-sdo%}yG`AXsyNdH5) zV4W*o5rEDWpnjra4$U-j+U;>0{7W&f}}6^%7=q2dM;1OQ92;6nm&4O>@bQP zdkq{^Yj~~l&Vl3W{5vBWUmy1ZNW^CVllZ{a_+< z;wkF!Q)2E@uE&ox?y!wg$$oC?yj|E zOk@JrsDiig1ri*0twtu&zuI%AEDrk&tv;H_ zT2cD-d>72TW#u@{6K}GjIg-R)5&e9z6K2-54=4(a5254YiGTGe|9t@(D}bWJ6mZ-= zO{KrjL4(KTW>dg27FQY$Nv@3o*8)&bR$Kz;iUu;Pg~+Gge^lc{qW0 z9M3Dm#?3FrHZ%kf%PX+HzD&HUbrxu1x{Zu?$rG5WGBcCLmiZ9j#1tVWqXyWz7?f#C zU<*zRl@AVv%T^EwEQJpNhRs$2k@FMTo|0-!3@5x2V_n2Pco;EDMrR6*fqKg1zPkYP zI5fhMdN_DO7~!QV&PC)yfDy7~bcSft)5N}efNc*QG&0>yNP9j)Y zs~HUVKqnP%$?8iOa(Sb-bamgv;a4GT9T&o-QBze?fWe^loNQErX>vk#P97>HDB7tX zzO^)cRa;Mr!UIauUt)NW)f~5p{GR&c`yJ8;D(HVRZxA0&#?h#A)FIyw%yGTo%=MqJ z;+t!xNtXITF@nxbM}3+L!Oc%FQJRa6`@-KUa&R0dlmvRZf4FCJYm20N0IkKpsxHftyKl8&mG4#CF9iFzSH5*v5Ad z!G$28QQUmS;BRLX+zo%q$(WZ*vtLmL{1~ni>QtV#DMFVs2$we}`Lj0N2Y_F`>-y`LS=nu;AIt z4!+M=wou+v-Fs>^ueUxfPg7Odjw$6G{Aa@jX|I!j9w#X3T*vbm4-d z?;r)#1;Yq>;P@TuL;<5aHmrh{C@jH~BMmy5mWzZq{v&Op*QYgnlSIR;UNF`Rv z|AYd*&yqtF)_~)xpfB{9ak{Zgj2;?I1YF3o>n7;w>sg#4nv{OrUOzzNs-$t&!L)&bRduFs2nEEeRI6AStT3-C0q3td#c zX*%#EkM91DSc=9;wy&=-M+4;QbA?p{A=1AxU>UtjYgucF(!H>FNqhs})V*r1V<13F z-M9Kx0NV195|lEUmiP;3(??XiCc_Fww|DYGDhY?# z5RFEKH~EVa0}m~ zRAHm?27-*N)l4eTA*^ZCN(T@gOZc&Nya;qqi4o~1@!3c*E(%M|i;2DvHJpcy#zf}C z0%xuheMxru=?Di(?Gh;4Da->10_jNtG|`3h;f{@ztoe~-%)b-_rIt1EjBQw3L;SMS zFYw0+XE%ojXujFB7DjD?3rAC9Hp(SE%BOKrl=6v*i|nDP$s`ZCsGbF`Pk$v8K6^*! z{?-BgRNrvs*@y`y<^&HWL}q591M$>=GN8P?d3X1Cd5D3I1)ip*(+Eh?*PR?ar zOF%}t2OS6=_juBr1#o0h>cH*=d-~4aM618a2=|ASs=@QJ&Z7Rw7tAFxkF9gK2QGl1 zTL`oCcnZVH^g4zEhCT%_=iPAIxkU{$C%1 zA#3t6z!UpBX`Gz5A6ExH?X<`gt>Jm$qe;Dj55%vScp5|(Y`d@ zfOipEp6{4be+qp<@Z1vX&JHPmp^cSIkpD$L__a$%yB&*Jm~_;$R`1H!%Ik3kBLJCG z9%yb^y_9CR?M|bg#FzlwW`Me*g>bBz|DA{;mv&^wWzG#nSja&W%WMkc!r6xm zBRLXhtw5x+4-r9eCW7~*nsryh);RaB?cSoLYrOcO4m-Ei?g2a@e}I1Y!9y1h-_yyOk?zDRdw}QulmR)s=`)R z!_FhRY_bgIQ~h|2Gp|x6Zf#AHM~I!z#vdvhaaMx~lzQ+ZebMl{lYrH3b*q0t9o0zQ z<-uz5m!bq!{Wn9q@7`R#FsjsOL+27@Nb9cn925SW;CMf=A1!a~ed{}3^jhpR@@1;} zYc|z&{^w9zl4$e5fTM2W~Cf>loru>>~{vja=t7 z(%6dAC>*VF@Vun6xNqtyYvn16yD@A;1#nB02#%EMFvGiW9|+Y24vwOBkrdhExI}X4 z;QbIZ51b3PYUD1+<$HU(!}MLW{lkrIz6rNI9_lHh#YA7zV{!E=2@t2*$p}#s#2$9MON#A+5a2v{OVdl`Qt^<<9cAj1& zVqLvz^2`?c2pjX6q87TQI!_SH)B-N<5YWr)t=tC>+f=`x9{CovgWSL87RE7Mcfq9$ z_0Jh&S}jNeLse)Cx;o!gbC~yjYvkGp?>3_-5H2f4y$@8O?8S_X=tZewy}jV$isiYp z9rkY`223J%4a)q}vyeXPnYPZYd9~WNSEqEz+J6g$9G$Re3@K6dDInvxnT#nKx(cDR*+LZ6n=lX z^L&^6f01KWtEYzl`#Wi_=18pY2-wCdNc)S2c#mCb5tUfZvu-2O-x?^r5L|E44{mA2FkcY&*j7VBT2%s8 zfGV^_7u)E@j0gqfQ-4C;DmdsH zrRU^4dK4aluKU$XB2<*}qvtS2f4_PD`{T3)du??zAGr!~+$vp)03Szf@83ZlilUG6 zpASGe4Jh~$*UrRY*N|^hw>(mUY^g!VWgyR^qkz;U2-KXtNBG?d*msIWC#@S|FkoHk z$YJUtbw>8lFaLM#Z9}*kB`7wyfE`jv@j*l3UKAdR69cGkz=G*7<{y6IL7yu3sS2%Ivk=)qx?6N|2Y-nH}Ul?Z>?Ek+9<>z#rrVVn&c6lo-D)K)`PtKLD;T z4USPJLQBEtVBPlBb_O%k2SrlHX;1K}qUsths0SwbxeMLeW?L z!4RwlN|MPJ%?x zFD`%BS{JbCY;^lrje38!%amU`-D>im{RLilzr~3>R8<+zZa;-(g=OnGB?C6`W*$@k z9dP2XF;(S!yS-GFCA!vq9Q2I(EIrj}#;=*Rs_Vpt6aEj=#WCp zUJ=_2?W5x^n+xdM&Avx^b!qePxxyXt@cvVSlsuvu{bi=os1K|}3XQ6~nG&795(Gv3 zDEwiBezb9I77}by^Y7Rcm)UvIhZ_$8hGq|Z!-)E%?plk=Lm9%XIex)mmxSQ;ILUwQ zpvt6vhFP^%gqtKD{8ujZnc;p}-0sCxby(Y%Q*=<-fpt)}jo6k*?EtHVd7ciBi?92<)Y;! z#a((##R5#gl zwB&s0xOe`lW0fPiqXlDknX_wb-9eM2%h`apSH1St4GWkD>;t=PY`qHnc7o&YxxE^;F9k0$^N{ceEvwcie z?e72(Hu{_{fqjjYvk91k*s8FQn({M86PI4VA{IMiFrP}~SBS=XNdmJwn#GUV#;BpOdm223sJprm$wzbmI@Eq2&AP9%1T07!bKAK z*IZ0P*VEV3M;@KS^v{NCjIu@?M2Skh;gjQi}T(Iz^?cg%D+b`B&o z;ocP&tZ9*L)_oYvrVnW~#hVkKU&4HMi9e}YlzR7|wLy&!G)@nb26(v${-;!k@3O>M z@8>{v4B>SRlJr~`p;5rX)kJwLIyoUs?x?o(mIc=sumoRddFLH^2AUyAnXorhq7(qV zhj~n#v}wzIQum8cACrdkvcFOr-B^9W>Mf1N%!d+m&jU z32lUy(IfwAC(Vn0DH?Oe>#T=6SffYCBc#y>-Sd{l!9;%*N>dru1$y8#K;1o*@6r1* zxsTBM-U7&|k%+kJxKmvmc?=|oBxgsO+2X??cfw!DI-ms6Y-?#9ISSK7WbK1qv|plXN!Q$Vc0w<2uh z14nRkYisc7yi2OI69}Fpz`@=>fS;Gj1^EJddlFMU96dg%`cSu1O4gV+HP|fpR36}x zmB*T}0r^R3;hyQybaz17sr3l{8SBj++~;2Ajccl)(lAxqYop4Ai{t0{{kPX&;^!Cu zGc>@}tGrZ51B9!t1#VTmCkLTVnhXMW1}MRn!gK_7EbMt+&CmEBp+mM6+YOk&!viqs zg4xQd4M@Xm)GK3O+d;gAhMvj5l-DxpC>=UZZTcAi$v(>6{C4)D(9{2l>wg}nZ$Ha% zpE1gi9mP@tasFZ^>2zzNd6zhe#`0l2bH1l_2|yCF5snUthEBjD-EKeFA5~MQMGe1B z&~=>QST~Hx!*G!S9sw7oFa!zZSdqBfCkfA;*0i;NiiXv$V(|hbp)CKz!x*zlOei{J zo1ADuDjUS|eVcGNCa67E_%V0!PQOGY+OL@EAw^&jYtTfLqP}B7C)bb+qampI8nBOW z?WxR;`9cydPtnmw5f@i@#&Vv#slW5;(NeEBXnaE0Q+&=<{nvqqNtP zb{(MhlO%6)Vop=l&n=EUYyu$<_g8Lca!NxnCrwYWe0>E<-_64nr;WnKavohY*6%$2 z^Idq*YfuWcOWG`TVIPbt`(I#^Oz==5d{ow!VQW^wx1k`7VNPMMS+A!&vBUqs%{LC; zNB?eT)toyy=e3Wa$>HMW>+GE1?2s+Eo4Y+<;-vpRY|1ME+qL0QpCRgFU&-hp1@SfQu zn8xoyuTMOGYD{c>B)Dic^MAFUGyxcL@EUOXlG9Dh9-cfe8&h~_V&FEU%(m^Ov9xdC zOBP)WoRFM$P_G(nC4#Xu4Kg8pBHaFSWOp)_f+YtrGP0P}^knW6193JYR@KNsV4saK zGmkU@XwM8~|7c_1BiN*p9b;#?9lgDN9{Z#`;TJ063pyw)nc%@F#DpUlrws-h`D%6Fj%iJ;6j2jta+aW|S2+v($K^7684MdfKs zq9t)Et@!?7#Y@t%W5IJRsEy_gQG#hN!iijCI_TvTQ9wxN?wdgN2^m(c4&E_?lv)H< zdJ*RhrqlBSi{aPZ^o>Q*q!o8h2Xm(+7ZarGQQms!#M+NvyX~SuL}xuDsznE~dnWXJ zVp?IGL?hBoUHq~?Fdletu+3OKg#1!_vE3-uh@D-Y!zSN5P5NI~Ug2P*{TE`EE54{} zWuv;H#fvVNU76%d+EA((QjSdoD#mDnU3qC}rni?Hy`mVBs05{Cwv0Blbbdcf9kaQo%{J z?(*Q=H>oAjZ-let@Gia?HQ|*a2CZiJbiOeKofut6>;Ubo6 zo)I1%oDS+=2#E4>mye}~tdj}|bne5<)BQjb=x^mn6~l{{*J(OeTCeA9jpX-nDeQ-5 zjPyEAReX38`V9Dd1rVYHRkOysu~H5v{@H11q_Bre;q0C_*6%v`<0vfX6=YC_CpDwB z8CV6Y-+ToG204$gUP?*xXx3V0O#=!wpL`cOB&WhV3>8{md?D1>%c))toX4;JACkAS zHjh%pS8l)OBn;`!N7HO-EGyXAI=UG%IBGeq7HmiULU}!Q>@4W= z%X$h97|bhl{~1;8Mz)flk)(}}zdZl$PPts+!cZcEOrp{!niH60GKF3`Yc>(bppa;^iB=Sn zObau^@eHyyGbaZUXk-!uAwys&P8z@o=;Tv_i8KOm0nQ#^rV(;bkNxPxQ2ufmo~0xb zmI=&e9h|4e?k)=R!a77Ri>;Xv6bx3(M zX|G(x?Y#3b-fmZ|wcy8^-QY^1&0l1giDc#ANqKuQpaX0)ult$DoWN>-II#EmADAjy zZ{a{_e3H&40kZvgP?@Kz53opUB1qI(z(aPn`jr2ae&XDIj0eWd-PW;+N9zwi{gXcV z56W5?L+{{2J(#a;XVeF&rra0k+VQ@MA83;O!ksZSVZ=X?{yWwNqu=W$M_Flwm zGie5DX{9You{TYw(q|NZXXdN<5_4pSOaU*T5gS%fPfJ(|h-a8v>72U$ z66t1_;x%qqB$gy;YTYn1la>OwHOy1+I(Wp;ERp86N+@N0NN@6j0-wESd=wg~Vn#i@ zd`b-_IQ;2ZQ4z#Pu>1HYyZ&a1Woxn3pKG4$aZ<{*>U24Ay{6-rIc9W{m3 z0QuG9=5hDU;=nG3WN*Jx_i^-Vpbwpu^_!ZQ0?&V%fP#zIo!?t>4fl8uNfTZ zlJ=m)2E}~M$KZ$)K-Zc09filtRXagHSlFN{FZdn1lB zEc`Qz7zGfZDe=jJeL?-5!Ic9)(w$3&w+Hw41eaF>zL@;ZygNo-0PrToyGZ>2omO@h zQ^f^bS71OeKpmRpXM!|AhXnBRU{oz%#{e~shjc;7lEee}6k6Ylrkfvg3mG#(?7!z9 z@gBLjotMG(CWi^&mU&N~ZY>WK%^+7fcL~bJPQoE5jfr`D4C3?5$#4hSDmDs+)lfD- zdI$)Cyn)-{7nMoarn7yQE#Tkr2J_wr)!5VTgWDzM(z{8y6T>HYJ@=;1WA6(9p`#1V zpI!?IVDzE_e6pjZD$>09?=>XK?sC1q#~cT>zkV?D)dp<0kFv&>^_bg~$M!>wdAUcS z2|!gg1*lXuZ}S2)^_v48sRc}5fe#7B>Si|&qvD+|=tB1f7VYdyrgXTP5jm0+ayEK1E z6xccd2s`furq0-uAl=>*qI9>lQrcWG0ys(Y6**HA3|vx}C=>9GO(z2PVZ}PgD$n-*B-VBH=y}D& z(9N_ZRH09^CCKF5XQK6S0n1U4WpFwdFi)P*T#J&3xI9}(vv$!u#7x}MM2O3pMtK&1 z+DN|?ho4(WQT1CT)huHN=!5I@2xIyLw9+e;@^7$kr?4FWl+qIiE2|p~Ozi^5zPr@P zp4&LAQ?X$@Fm)5O6z&=Y_$kk^&d79d)G+Q#T#akd9_CpUF9z1>71}XQ=m3J>_C#mw zVN+ox{cd|G8G!ZGBcqAziN#Ckdg`Lxj=~*_o78GF;CRTB&6*fsnEGnWc1I)Rp{uV2 z2=WYl7Hi>d0OB-(RP;txWnrk?V~JH}2ZTE6_BWjhK*+TT9}8mSKs&W#8#qx-STammXdEE8q3}4^9)ole?V&kO)@6>8#cE#+C-^?EuuK2Q z{CMUKRecuNY68Ue36Cmx*MWEfrDMVF0y{UK66?bN=G2$Oj3ei2szJ=jQ~dHxAtpl1rNUC+(0LP-ELz@tV^SRRdz2_|jBR@%-9 z2&WY40q3SYrlyZQ^NzYZ%1;vA+wQ?^?CQj5v6ktU0wUXwm8`7Ge7LHPa3M@(!La6~ zoJ3!yLXW}_q(QCmz38lG!l|(~54X1FV}Do4+o;Tt0R#E%IKS7ZAj$^iH zV=dZ%Ys45`E)@mcx8kdDM&m#N_A!h~}(5XNDA7ca;ycDfv$9dlAySjXe~$uxiLQE5&H7=Yd$u_gu$Uoyu=lP zhZB3ljP<5kALO<`YdRg!Lyn9^$^E1?vC^nO=z7H(e&VT$ zsq8n##JzlKgmAy@t)eV}@xyTx#5QF|I8g9qX9qW~3V+o0H>?2NUyc@Jf$VZGRZ_wSqd}r!jU=Rp~?J%<7M z_D71}6X=TTjY(J4xRm6}+9UQbr})lWm%S18FCZ4I>g`c6GJPrHW{;ai&K>kO!YV0S zELm9(+3{_4)8v}^axt8q`H-6+-8D(7ZK{}BLO^wPM119QOBoH3?CZ+_Dqn66I_CQ? zq8^E3Ac|&{!+lG-KJEkBCy<2_JFY*64B&m<<0gpKCrH+&BAMMKk#nf@Tl>ppagp(Q zAQ*bT2cgJf-aYSp|3mtKqyEQ@aY>EmZ>WHB?Xx;vFteB@M5CB|2z)eM0BBFX6R%*1 zzWjt(vBEM3SSu1`ZR?=Z{yM7H3)zF@E-iU8@dOj|;4+e%*)#727{ATCSTT7HC>Dkd zb#&Q~$rg0J1D1i1cV}#KH)+#tt+ry6Ru0|9+H8ac%=Y)Yqq<&@X35*e(s_g+6CUU- z++p8fu8*%F*Lb-gocRLjC5IRXop2%^=0EL=k zhCAGM7!JDwxm#$;59$`T6;xn&ZMUTVo^}5*!E^uQ=ivK4=*O?656@d}1(c-M%nwDl zOmitV?G8Jswe)}@6zAb`5>acB)aOxa@EQ8De6Cbq@Lm`M=TYy(19Zy6olpqDqpk*z zMo`vbRSFWCQx~C7tcS}%M5QCBKYn@$&ze2h(I3kslWFvc<|I0aM4=f+4<=BF6f%8J zYa*3Qq|gBJ^vN#89#^%a6lG0K#PaeJM*S8Q_PT0pTe=cG;V-Tcu%va|hFS>N#L<^P687CYa7 zFT#3N=a*sm18$ad1MzVovM0_ zZ+kF1H90kFx?wV&P9oB1`v>B8KV@LdM6eQvOO4GXdSmOha*l4K%+y+bHK1rOsJ#F7MQR3qN#I4ZG&Q)Rq)A#^m98b{S=F8?AG97On=TG zaI9qcv9}i}^B96YcUf|tGNlg6f;0N^l|Yxto3W7b@{}Mg?^91*94s4eW(bMRhT$!x z8Fi@K9E^n^_%odxoCV-v%f?Ye)w(p~-YP&}PTr7$N35@|#ViJsLzJRDCW zQOL}Rx%fQNkLI$wzs2mla&JjCCossUhqZaW320&O3^vEnsWRx^mq;bCZ95$pTgv{d ziOj~>m6)9Wo0(TwQG=c{athae%5a(B?F}BL*z!K zaDG;!qDUm*3bN?Yg(hu43Hi|g3ODcF#5>d&s_QsyNKU4XM#0inGIbx|BaJFH*SJu( z2T$Y6g|iA}1OkS>lIV90aDMNSnAaCoB3N)zgl&rjqjh)(Z46r-JKh*IYJx^5*V%<^ zvvD+IOlYm6u)ItvIRM9fhndgIOU4{RfYz}+iou~X>haIK^^`GL4|FNj!BdMTfDj2^g3X(R?wli zFQ4j?iM@`v%oQur{u|TGSh6JO3qBbywa4dpTVQxJ&?AxD4uqVQa-}z88fyYS0|qbE z=g#Ypa1K~d{f^Pfs_Z#jEi9ydX1GG7XzIlO(&h*eD0q-B*tjZCAIxV@ppyT&;Cgl5 zp8jjzP5W6|4rgo-I(mBHgWbbzp5cLUC#$!AnKZFQufvq8(7xpD{Qc{~_tqMmIy0!V{Za-aHwc+WB&CWMgXjK5wLF zHex>|Nii(SFnh2lvl&x>eD210y5O$$0+X}^NmtRICxtU~N9s^%e}v$Q<*hk^pCIA1Ms zJ_R6rjAhqg;eh=vJlp|?Y`^*eh46T*mpO?$Cnu4i|MX^{I$(dx;S_wAgW%aa`KvIj z^I%eQYlHj$*os!OuK`@gx3HQE+q!mlU8NtRpCtA69V&=Vdiuh|?JD3JeVMFNNExNh z6IcRM_zW=De0$I2+?Y3z6#7b;rw~kiV*s(j{ha?aHJ)>b)XO-DF~=TUjBD;3+zuFA z75u)#_QwFJ-H!W z2bkcZ5xA()HFss))iKspnGL5Fiy%VO+}sM?9Gx_!7t{g%Ka&e*Uk~(Fi9U9R3s5+# z_Z01#5kpJE4MuCDj(qV7%EB2R1g1|O4S@kUQ+#p2IWLDM` z+@|yfPy1y1tKR6J?UX4jqColi0>Q4OBfnKXn~y!#-9tiETa~f>8J}ukcl9nWZ66zU+;8*{W*h^?{i6q1Q zWJiI)(BnZ)YS`u9x$g^Q<-)$^-`bi+3jS^Y$A>t;i|^~krVQ=5IrM!(J&dOgFvq^1 zdjT-|p~alu%m57(5mJj;2lM9%q+V@sf@65EV#-8KSq!l4w;yAHl?Zy4b${rM$Qz}* zm(u@Ub;uiXEi|g<=vx-8;?sk|rPOFNHUfQ_`B6%V|yvP{FX_c5Ft3KZB$8aJHnd9ty0f>t4)l z5*$`9s1Akdl}TVlHOZ@xs?>l{ez?(Sa}$xhnAcPtph8d+45L1~{U>v5d+?2&#Gbf| z)uo$#TyO^33OK5Jlvnrs8kmcfQ^M+@2I)y}&fvlxVu=Zf9#(a+87nu!u@>mN=CUIk{Z7wXw_DW#f!~cJkev zrmA%3rP`Yu-!IthIzBj)2s3^R7@EvXu3_uO@p=h-4nf9dI5WxSri_#YV%~Pcs-UWl ziV!zEP3{lY?_sV&L;#Kyh*!=*E6o^eiHbSq3NVmR*OE{X0$>yCv6R`mSD+A>TKibX z0a>7=4nwIQ`ce@LunAH?CsKNHC;Oxs1r;+f51#;{sP_SMWYuUzYD<~kDWUHm!?tpB zOR3)63ZQsryl3tLb3BrYMq?=xgW+Th3Quy&8|{KkIl*PPHileYMs)7%izNZ-Z%)k( zT^JooFj?&QolGrCG*#pRdoTaoxja~5j zVyaNm>C&y}W0(KiyR$t z3zKeWuDClGmCxp(xH0QFD*15tQf5?l5V?TPgY#n3M7lukn~%Kl{~hR4dd*wQn%0la z_YqAp2qIj!8Q7S&#xObGRmK9-eYpCoxO&jH4QsiAv4Hr>ya%g!4}fyTHVdZc^&aSY z04j1TxWd=L#k89O_7M^~#3izoBf(dA; zKm;ONog^@fc2e^10~_?F;f5rV2!_^9NjrS`FwHaG2++8wCLX#RZjLUqanSIJ3e2PP zGk@m3-_^Wc%jTIDS83+3Aqp*zcmi|IQc824#oa57(4RmDy&2i-iR?yj7sYfe0^Y=$ zPM*;{>$$njf~9t!9p7TFsx~N;#C7+@`N<@OfHrhjE{rbvO43tjojZA>dvDE0qCaW6 zoNmv&zUDAtZjq)ntbl{gh;Lj-?K3nZV9K2SKgLo3!K zcBOT_zxyF(#fZxCrbMaDq=yAA(pI_5Lv8ljmRJqdbhQmF%pg|3T=WCZFNC*Pi-vb= z{Y4a`=26Q@t95IZ+NQNW>LPtb9u`k@zhAVDVgy_Zd|Wsgdr%PaV+niAZDEV&97{O@ zF3Dp4-FN;K5BFVv!==ux^Ta zBNu$4>H*t#?!>%SeUT&TyUokc1~gBiGR2gLvkk@KXpA#}hwXTZpncR=eB`b7g>u>v zN`kjgaP`6Ff;%`(S>dG(R=K;N`M#mes>~0eoO!p_pEqLEJZd>{Xp3%s~KJ0VOIQLc{dX!eOC%IETm1R%0d{Mtg~+0xB_x4^W9%qY|x(ZU_!a zz+k*e#5$FT31I%Q#OU|f%wOOqqJwkRz#MRKA-oN^q~AdZS#WSn>sC@h#-M9a0j|g6 z^O;A@qvnp8X)UNcgU8QRyN+)HDr#YYQL7$&X z>-0xc|A5o(HFi=w5_98;9SWrAIpufhV|-C0a!wuylDmH(G3M(&(*n|D9h(uUmp>#l z7iq!L>=JhQRH_YE$IevQU`bne=b_CI(n1R@w9rC}u<*0Fss+*>E^Pe<6yCVZGx)9O zsx1)OLv$kzP{7aM|E=$*Dxq_&Sgx8k$jkWJPUKw@#9?2uieE{{<8+ z>7Q#bhO5M%wCby;aY%wxQCS`*$jM+2BJj0=KW(`949K9}?D_xKlsd0bkWVv6IA zE!^bDB|yt?pbgMJ+7t{qk=eW&%hkcQ?wcv_pt>{RSEMzc^0S^_-yZx5n0(h#`D*<{ zp#f{_DGm!~dji3RhzrG_(dSBUSgUC~vYm5%3kA(04h8?vwZbvOE%mATU9n5l#Q`eR z+<|$9%hckEW87VU0hn^&QydZtoyu|>0!~^d>B_qCIY6(+HW!VwEOPDFC2{3;kp_@$ zM2b`C9@9Fq9k441Dj1#OW4)M{~KB7Hg?Gt;DF&4I)PTQ9cJ9Hk2y zDalCpgr+;|UW$?BQpVbr>cxtsphaa$#tW{8sg}`HZD`yQ%v9iW30}CQ7<*VYirEa4 z@(1`ghSaU_e@|SJhjsRf(T+wORTTQ0@CRCNc>r-$z>lQJk_%iKCltnO zNd_~QE2+O8mn zbM#Ti^Oe**5z^Req$G}l*ttm^CDkNev@;%S=ffh+MaL5%deZ{v=nRZ&wcgmFd>5Km z*ae&b%!MO}5q5jTVvjt--KrOoIq<+BR^5WbMG}?eM4&kixF`c1A&KFpA(y%Zn39XT z&TWlPu4YNz@poorax2`|T_W;qx&Ery*R8QHbYJlJfu0d*0kuf6 zz#Wt~0ERGpknL@_3rQn4@l*7-K}rxZ4zxaGTI*~Mt&9D3UmoSsCuDZ|vEyw{h!J$4 z_2+bHeMOOpd0*nF<)rlo;?mDIBET$GS2NA5eF-ayyj!#>qB&ILWSbQ!tZ90h%cQnH z8_)Wb7Sn*hN5$g$AP4@u=r<*kSbf1Ir?>;YvTsuJ%oYQjcYQ@>y5_*b`*jL znmZ7P?HcbCX+gL~q3r1wpR2F|54rc1ze+1BT@l(5PDgK{;1&d(8gsgVP$OMg;cZHz zeRCLmM>jFO+Z<@vS%^{dsO6;9x=B(3xRy0{W!uG{Y8XGWLd2AYzX@H^QSaKF)NO}a z(;-0huEfB$J};K4sxLh(-IBNU%fzGz(@)q@Knd3gltW4zsNfd_&M_n6&j%-W#%}mv zTfTKO2NdqF7T**o>r5EMXCZ;Z77I>o(7W}Iklf#CeQ?U@*5lN2o0om~4}fsnIL+~N z+f018IHvSWKte$p=^pab{kD!(q<23 z_`^Wo+g`CW`JA!)cc{;Hbw_AvjR?SvxHNk@jJ?{5Qtrx3MGd@C;*WYp9B_e)dhDP& z!~H0mvBO94;xBBb>MLa~@s3{U12`_9)2ekW)_MLRzqkxwK4U>X!)*tihT~4>xq(b( z*7xi)bzgfn)NDIv7waxtc>QygFEkeLJnIQm{!eZGDTbFK1_$H_5$k0D3v>g;@Udc( z%kN}8!-d$7u7sctx;sD@YLPPS%lRBUJm($Qzv$&utI_ll?V^|4?A58regfrcriw-; zhj0vKPiN?le`+H9F!irVUj1(ya(ZW?^~99+{ugrD==@sHsmuvVxYFU|A|i44)gRDJ zqx{SbzpQ@wulE0_y70JGcCTE0M6}!Fo_^}uy{AeZrV&nh3*k0H{eqG`XAEhrKRZUv zqn4A_(yeRQdjHzXQCiPPNul9qQadJ@=X{os7GbFoySmfDp<3ePR$90?Lft%Wd)P0w z8AfVbYbh>6=J?yELqbvENk&WCEZnZi79~vopzNHZU(KcT+j&kVm`Xud!-u`fEfM%% z=DWvMJoQoSKL-M`OV2A1vS2_M@N(QWf8}0WLSf7f6TUCdHBi%HG#MSNkGVx-ssk|* zTltT1O3T-(4`>BvS*J)QaE&dxy3DT!HlBF%MIux#8nYrQdViWaQ&$C-A9CGDt*jWxVffTgD{gk z7%B3Jxc2z^)q1WVVdzOw;zG5uDI%m{Oe0AeyS~!Q?F3ehNDD$5#q8~%+&lDYxPJIf zz7YX3R>Cv_bcG7ni*T~NqiUC`rJR{U!pglmQh^A`89nm(kMJ2T)|BI-rxoH6^DpV^ zR|Wm<8^eIO#X9eA`PgR002TIP0$ig5`$qq=I}QNv3qgG(cB@pokT;_l_^et!y_?2{4WWz9aA$*UO6}Kd~ zVZt}rdtJima;sfhu5vgf4Es;Rq0>mhT_c@oDaruJ~}>>Te*As`%zM+#a5GGOyiz~bk{rFUtOA$nk=e~s6uBK%` zq+#h$yT+(PZPZB?b#acmc|$#%qF%{RpUn0ceizhQ|7bZt!3p3f0B3;10GtAjg~<6O z!mT_r9=;NT>V^{R9}jQ8&89~^y36Y>r&|fS=7NB(Z5JKt5ScpppSqa8=O&4dhxdr; zm`YrAIp0uFyJo0EJ=DpQb(aBkQ$#&npk6_!PgX;Q^7q#1;#_%@yy61zqTmSdrQi^KeK1t)-`0GvT_7=Tm2 zaRAQ2tzbwHlG}@JF@Kf5Mt@%v*Zo;|HzFr5wWe2`#AQG8#x~mx|L48uwK1R?FWm6C zj(m1PkJp--0O0`_&&!)0**2~uH49I&K}>aO_+mD1ixW0>mj6Jl5c4Jna~p*R9K#ok zf${(MXghMa`&}AeS`OjT@q7f=HTLhHGyv;01n|L+R?PeHdS_#cP7sMb%a{h8`qU+dmb^lj4rw`Xm*aQ(THn{0S~ z$QP2CtqH?AIZ=-Ff9JphyPvktsoUJPa74?uZt5Q$K)cnRNt6UaoUUx^OI`mlN~31W9H-JQpA;rMP@?^*A9HY`i1xG0W{ zUk1;(Nw{@;`x`&v=kn_V;>Y}LLcYM0{H7sV1ZF(wqh{xx9B@lRGuum<4>#RKh^L_k$YI%-6!1HiKr{l$|phJanP;M?4 z6*PyqelNR&JCTjus#~2X`xu;-N4pr1#p>l?S~BR8cL% zcH~D?l)Oq1CACJY(;JK?v&Cw&J6zq|Jv_af-o8D4 zH2@JNlU(QZADBlo%;V+@r6$k&m>eHM5nJ_T)eJ#A*@Zf=GcP4 z>dG@!VXxn?c0RRsyd8VIzLz)ltzb$&i>4P7uFtbpejQ&+!>i{H;J<=w)aa3_N9H>f z2vhThc<_hj`+wLjU>euW9KAumK;tn$Kf^!^L8M*4cYFQxmfFK$^!6l0kOT1PMlwq| z@|ALif}+`>TvSkQ_9zdhlsEDe%gH)l62&n}`IANk*rI}zQ=zb~3q!q2g!;vRCSvp` zjjej@(EtNV7#)P+PU7h3=opN5Ho=7O`*Y%bL4>EGx6gocv}}{^5bNOAs`@k~(U7R? zk|Y_j9F7n!QNULU7_5M|6i`$FLlyit&_q9=W`7%6Bqx2KXpaRl4vBy~fNX)H1*_id1XC%&2GVn^q0uN+bCn#A0wp4Ko(m#&x4LN*#w?)jUUah2zc&aLq) z8&QOPHOPJuR3(q_o+mlBE%FPLT*q#%W5mraG6`cVzD!KK;yNDa#vNT}>j1bC#$E2N zY8}=}tVyGBlTj<3N4h#lE(BHiMR;$Q94{83xUmTb#YYz;m_&7o*NA@`1QJsj94vF9x_ikjdjL`w7K86In$ zyUpcRQLdb(`PVMz#4n@<7l5s=?!*almuE43W*c4ZvM@MOxeR^-5ij>h#Gr8_!6>Re zdx78UO{;Qeqmkn3^}$w&(Gs&V={8INpcUdQPhiz#dHk-p_`A(yY{d&h+N&ouh35tE znoI2_8zkPAte(rByHYl&R;*GVQ#WbEzp|~@1&apm(O|URfl%v8vU>@M1g1h+K{bl1 z%}s{ink`n>lkSO-^y~g*^NQ^(+%m$9o#5AYii_S06IoU+!-R)aaSgJsO2!fvO02Wk z1QVFWeOJ`OE6o9iGd!JU*>`o0tB1dvEv8$TY~Pk}N?8L!MNleR#X!5ClMI*7c*hw|~v6}20*OX7Qi&1H<1Y!mqpzbHHbt)4 zHS?#gZ4Z2OR^~D<-a^1apvefR5(3@U3&-0xIHx!A3@ zZYHko*45z`N!aCjsEGE_{4f2hxfk)qvF66}V>huR*5Pj@2D9kL(f!?h1kS&&^wdqf zv-cl`VBv)C;7c~oZ4Wwp^3kH_n=?DYk4uVa@jt7t}WmaMYy>mEv!=KY&nzao6&YkYe@TMB$9 zaQPD@JJ8-}Vg7FOUe*$jZ$m5KcZp(K#o6~o5Pr&?+)fNA%@)v39oA^;aIlJkw8Why z(FOna=V;t*MB{GW=kM(G<6DtLKQc3Hs{6>mFz17G=$CsJ^Mt~ImK{0C=HL_5k{?vX zH-^FiHRDrpC)Vm^UF!Y$T48R==yC5)GeZZ${o~pahu7rd&gevCx%R2Fb9=*Dn&fMb zUZIZOEfEb<60tTl%)SkiX#qNJbZc?-c4T0wuvyD+c`cgZjQ<>DKRt=xNsvs!Rk=|z zeE6b`zL!holE32=?Ti~YN4Z=cJg~*JbL;hRa70fxSls2Bv*0-(7MFMw z%kI$(8>rt4h+2|+x2jLSiDvLt3oYz*7d?DBUoNP?JT1~QC^~AtnzWm-;f?nC``Z7{ zx(beO@m%|E(f7w+A^JKS6MerHt5@QbV<$x@Pn>wTLQNcYo-vb zGYomHueH`|knT%Lz-E;0vGC~`MGdOkYlbw4@SXpx01BUwl2eOTdZZ7Nt8s% zy0gRC^QVM8e>`Xcg~SY^>FmoeNiU49Q@#*d0J8U#QnUcv89aRq^$aaTAJ#VXVSPhk zk}}nfeSpXp*YBn+c|&;L|8L#iAvIms0#Jryl6JDu8dKO=n>Xj4&2-cR9STMVJS zG{9|?-nkL@vYm|tEdWFKgezn3CyYMyAfk zjq~*oqd_Q^KY(Pi9sfD+u48cfUjVmqyhw&q)Z;4FW}lp}9>J9l)>w|XKbn4uc4aq6 z+*~K-hH&4TCUxB9J2UJLApv32PnE#;=UDn%zxyW}vSx$$^)IlHeQdzJ@}Kr+YxXAZ zKa0Yg4sQ9E|LrLn|L@XyjjrsUmjlEYE9KY5SS`Q24KZ2SJzB zo3Z47HFjJdnga?uC=Zq>MvwL0(-f3&9fM$Df_yGg;q-4y6mWFr;`b6|B1U)N)oEBn z;O*6Ypk}(k91enppK)Fzi^+A>n7Y142eE_Y5qSUvFpKA>Vf&YCw{v3 zXX7f>n`3yQ&L`ThYe(y6q`v>n6OAPb=)6-2_quC|>!$#ueeNe!y~E)7@Kok992#A; zeNP4D0c_UPV>qEG89kBqA8;(5LQ91P0Rsp^ul0B0f4nlT-wFRDoM*3XXA~|2A3!r? z?VBEt%ZFR%APd#{x0ql9gfB=t7q3IdVPsPwzqu);AAw&0aS+RrODorfeqf128^4cJk;s0NK zKqBWh0(!#RjJ_pa+8w!~7HW!4ujzI)7W-)-)N?Gs2eLo9&r|BpQ$i}j)Cdm+v^uF< zLyuT#keQ*;*m80YX1OR2GAEbll>_bO-moMKVq#%p!SH|(#l*tI!lYO;=)VPQsKO*K zY^_l;FhJfzxtt%CfUpO$5Ovb%7` zqO+h-7c`Jut?7Sbr87U>_-Gt>gdB#Y7OxF83wM(lF|lAE41|H0STGnB1yfvWSnIfL z4^N>ttRE&h88_&LimF4>y7(34WvEGDo~NjhxzMYJFboZ;&F&S!X2_ZL zDLtr>$Oek_rH}`tYKFDB2N}f3EB*`{HA_M@E!a#bb@ZRsgV#TLOMFjchcElfeRD;Q zdpa`JV0df({KeXgUd-aJP~0aGb6(`(-tt@uPHI)9iBwunA~VaRkuakqN1rRS{iNb5 zF7}$(SUhtKVvR{Z7s+rncUbdH=D-}^^^4JN(vr)s|Uv=tA-_m}m{7=={LAj(CtDs#`+NW6Ej{u(>~ko&`54 z6)10ZmDvZV-wyPLkCn(Lq~=F9V7}1sn#f+&Njg90daa z9(L20M{Wj@L#o*MfqO^MYZ-P(26W>Wkpxdx!c&_EeJ>GD+!&l&B55}&wNFCl@#f2K z*TKtp$(adigtbq4NAluCG{h^44Nbl*<;Q~5_IVl>UGkRAo)AGC_`xu=ajRs>3bmqB zj z1x0S9#B2Ir(Yj+Sj!$s}_Kn3=(W>W?9FRGwYnVMD0pOS;7b@a2L39BJP4Back3G;#^Ez(n8#*R{p2Xhxl zku%-FYip1GC{HEGT^3Q`M!=uQk-~`)hpZ9My~tmH1z5JFB#XLN=i5 zusq?62I^51r9CgQV_W}5mNxl2_>D>Hyez2>hpGh-G3Me7u&GIFTeKo4S4H3`aFTFh zw%@Hq%w=v%o6!gbz*~}AinhwkGxTA%d0IU=ip-#j3;`5?wpv5h<-~_63?;I#8^)zY zAL?{G23N<{IO2j9h_DNpv(|_~dYOjgV49s?I}@Q{krsF|*>FNCSO|&1Im)kyVe_4i zB^qfnq~XLX)ggTAcUbO#TPwpo0S=u+6e1#ZuhE-Je~aKD9HoYx3uHGK(Sb>qeWhp~ z(X(kTnBEBd@j*`4L~u8zdNsmsz~?coBnGmCO3!jca`N(*d)3m1n&poOC=kkpS2pJ6 zBvRwtDgg6MYzzlF_1KKS`9hlzplssBF+?(XroC(#Dza)sg4lUp#gO2N{YaV-5yRn+ z3GVNnAUYZ7V=4lpL?lz`pB0y+oTz_%#}ZCQfmKAKa1e=zu9K-D>(tE*sg}X6g+tKq z$2A6^)(#)p_VD#CwyTZMKN{PrQ=S+yfpAsOh)zxcr*+f~iRO5;B|)u%%)Ohla`+w z;tMUKk6pk^-OoI)8Ayx-zxfh@I?U>M%g4l@V8qv(;|3J+=&ogbZm=e5!Bhuqd zFy>{r>-;CAGcoz2V~){6^falm@&d|22=Q%~+%TmG_LNHcMh48K2MmLsUo+w(A0#9d zN0)_~C4aKFJ1*kaX@*DPP7fhw{>7|=EEp@2O+WzEcSg`VeW@cXFW0{NQhR7AbrrhB z;#*(EEQq+BiNP48_suXu2l_#%azD)BN1XA3V=0H>kEM}WYtRP}EKkv;o<%-ohKxs~ z#7h&kFV9j1TM(C??xpI&!l823bdy&mBCaf(PC>c!H*lrZ4IMeptbuuL9nj z1@!J2u7ZZ9Ve#>5?O$w?jjo}=yj5Y>to0_Ooo6npj1;2hg`yIdjmGm!ZhIm%Da+YF zU5Vbpsky$<0qqRjq&!Cw6;`%WL+C+~WEq|kRc3)2%8|B{f(nCHqN&c~E?3@bLXA~( z&Dj5R%43zlRB9?r;QK|Q@OAir%xt2oEdAEmSX$9_x0^`e|19=ocdSOwOc1=QRIf}^ z7ynpTC>c!bZA&W+;TtcMEniyIR9=2=rrTz@X}p$4{{G|(t0j$V7tBQhgag~Dr7V1i29 zxfA@I-3=a1)LuCeeL=zyz!kFSk!kb~f449xGQxx*y;q0(joWfeBR5(y(%P z>~R=ckk5wjxdvAv3tY|3TQ(}8+AtDr6B$!mJ!kxq+pqJCagFkF1T0)?9%GvFB~%8l zYV_P|9*Q*1%o zu!i9CbOo_hJg=+V&_isbtwq<}Y&yo*Hnri9s^Mswfy_~e~p?N99g+wrdi zEN;T(%GLQC_w-CL@rALqvCG+2Yg9kVUvQ^qrq?^K9rt*-4YsHX^@&HQbknbk1WWZD zZZIe3c%_Tyd2WP3`Rd%RIRBhZ;@yO&$yQ(7dEy(Ag;5T1ZfWgb1XI**GXA2LrMmd0 zbcm^25uD0OWlBXJP9>r|PFq|9eOtDKwKP?JTKs(prpNj({A)%rV+ukDn=DTmvwT7c zRi?k|22Rxn=yys~OvjqE>=pBi=7@&89rGWL+MY5E+?O@5@rWN6losyy*GfHDuB&^^ z>nfE05q_{L0C_9?HtSr<`M!%|e7rmLN+=lpVv2Y;8{ z3vYQglw}QrT3q|0Telc>gssm&GaWZ!?|auS5o_ah*Bf(JMD{6goa#&O-iK)OMA3pB zZYyp)@@{3C%|6ihvlXol+Um86Wr~jC_?T6dBI|H#bxY%NRP*E!QtEKaYotc*4zBn% zE7F~;Bedz1CMF?Hi3H6bCmZcqEsh0X?JoDbR$559;OohjOOq;HmxzX zZrYR?y#mqL;VGx3IqesB76T22{$f#y7$8dpyx1v{_Sx-?qx|a=Eb&#GtU}OZY?t?* z&xzkA>M`cF_c?yMEhPgQ|7iimfwVq7CExQ&zqiHqGQt=1YV=SRR^K*lzhb!$<_{WmdM{I|lE zr~Ont(o6WvZ1R}`er*H&gpp<7hR!QZY?t!^$x;P0wsKrHhQl&3K8D@jRmLLha_^%7 z)ue5Hf+SX4EI>ZJB9s|BWk53dLYb;WB}`A@{xJ^*a+P-rR@zu1ir(m{9M|lovwQIS z!yT7w%z$R!BE1n!o6mw+wl-3~KSb9yOb0o3KpvN9$(botZLrhjTYp^%=&&+Vs63jy zX6$9!4L7P-bgQUerE$j|tG{SIE$%sIz3z)r>s?kJ20a_F6P%^J5;vOBDL`DbEsuU= zlX!uZ)C+l74+{YK2$dA!yp(&mb7ctRCIS^bVqe13!M_zAEpf)2-VxHCg_1=EcgBFD zg1yLO$CUsPB5S}%;A_Rkr~yCaN3iV)W&y5}|4CKhaSzj8Mu&sSNLZ@gUKCtvKcvqS z>|oOc!AJ;_crFA_UWI<$i(BJ4$?3d2PwC%67t)5K@noLk3tb+2!`EC8?^G=aOxVV? zUCD%_>|zbXU8`A(Ux0~Rdl&teL)Q{}3s?A{a$fPx8u#99-}bLp(CJp-$$E&)EyWAed*sPeI4ZJ5VATT&@za z&#O90UsbF*LteK*O-!CxEerYRUp5O32WAsjZI5sql#aQ^*KaSHHM^n@FKv~sSL7`8 zzAHDK1?YS?U@Nv_Luj0oFE~vSAr~ORHsZYx1TmW7JkvXt$0il9xCKN@N;`v&PJj{* z{-x@KRfVFkf65U$Pk{p_sz&b9S{pX4U&=O(*!a&UX5FbsW#9vQnD3_Wvt42QLi3HXvnC01*Um5VQmql+Fz`}O6l)XR%QR8C zkG{}BF-S6DF`vtdqEChI2@h3bVHWgeD)IJ*2HmUSfW48<>2TD8u_GPmnwRcA>|n_D7V74X4K)R3A{XE zF!e);fg9HH()g5eKN9k<;p_oo&6^M@T(eML_PQ2FC=Jz;3|-g8&WcDEo#w?dv!uH* z^gibsZHXCZTvxEqw6Ry}=DT+`D~k>#4K|{?A`~w>i#^LRlyU2L zRY6q49DnlQFK`!vS5^Zc3Y?Op;HeG%goa0TwIvPPr*_FPePnnWtybZB&bp${25sBB zm_v$tJiW9M*v-%clZ6`>ot5{>$1F=-B_$3vh8!? zFl|9q9ZGa4rg)u-JnBR<8eOz|Iu5KJQ!uXS7u)sluIW=HaKQ21DE(>Lu32iDpu%sf z!2NN9WDP$5)MYnzi>WBTD|2qPSy8tR(2fw~)>1y5&*J*krpE9kX z`p{@|TK!(uhQ>pbBl$z;zLi1NQF2G8otNe@951*&t>}f5%7)6ROL=V7#0>Oz^!;y1 zjy?Wu?sjM24z}Y-MsM@SKTY+FE`1(9qudv%9=_fAHhA~9|K8a+bQ(yCx&`&1h7xgA;v zSQ;uDDCNAOu@qN`=A(f(10Ds90`t~ya0UzSWvc_H!*;D{hc}Do1 zgwQDn5xqyS{8##Cj^gnthXIi;`jp=eHi408#0Qd9Jg$@h9e<|1(7+{evOC9YQx8>+ zbt!`Cg!dcV=nT`OJvX%KzOacy`2I-$#`S?fC!kOWG$UQC)n3l@*(?&~q((aX3y;=& ze5OGIRc^;H+=zH}W>42)32+9&LMDHA@E zIlP$w^;(%Uo(j>48k*|K6%oz+*k-bk=9#|1IDE#j$Gedx?&ia-?g}}E#-l?jsptc> z66^0bvzVOy7uw1x!@Uy_V3O3C2j%JDsXK9?cQCikdG-=AY)~UlMH}O3YpuMCT3F;E zUKG=?#*CpC3ek6{7JSp!t##;la`~%}4``f~6*ITm%ASxwggxzAr96vG`3Q9Jx3&^N z_V=H7@0-PUYI$*AThGl>c3v@*a~$-Ehk=#iNIIzLI^nb{$P!aoqkUarr&JSz#4oL_SEpJn? zVILatR-#fA#*wt^KO@3655*!-)UQsdB?0Pzryy-f49Sic9&@RJOfnNWuy+|pMny3w z&fNyGM5AV}fI&eOZ`835aX<#ulY{$}_F82d**wOryNq*A|3I3zu!&>V43LGmn?E}T3g(IRsEmJ{&k0uY|-=HU8` z6K;z~3q$i+0+jEK{V5HTk2Ap3sN#36$FF1pMT%>dRN)hBr19%Qb_W&SAdmo%be zzGto$j1bGtV4s*HM{3Ooo#L)+~?XWI$DrH z?8yVHF6NhNPXV2-!*3b%gqbe|G-Jv>F|#v3hzm#qpzF&u|A20}=P#;2lEzI%IHTF# zV?nvq_6dfeYZT)-;$=7wsd2HaMuGl8*QXy6ub87(Xemg;8-j)pZ5!<73||sCsaHx0j}DX*la)RazA{{KJd|wgJZ5gtAN5TM z^{fGEZa_^{up7%jArQZ-#4Bv#;` zTD)`h80MawH01L^jH;@}5^_h5Q1Q$c5gt577N9>~;ZkMI(XiNUD*=v$s zKe4lPZ3OhXSv$!yPfql9vV^^YRC5SV16l&bv}qxv5H(V@Kp6QT2f{d6n20GSI4}lP z*mMKCxs?4^#81i{3skS6fLxJ-sIY~{$i)8KJ=BPVLVn~owd!<0CGszzZ~)qG@dXNr zAlai-oFjpqvOaB-oc8e_y~);Pa~(ZRv0-@Lb8nUbp2fZ^Qo7=opQqWd3WkOGDn8N<09%arg-cok9l3d+47tP z{syT*T+sqS*SGN z@AQoFVj5v`Q>3lpDCmO|B!5sds9DGC+JfJb zzECTQ48KUDVTW5VG6l4R2mRzeP>_|QvP>pei0VQ8)@W>N2|ACuGDXcq_q7(6B9u?d zVAGx>*?Y%(_**3W;%b)(EfByNweiftltpEgBr#7Hx2Z?q6h93Hm~h zvboAPRfx3ss?~5$A8%EMk>|lONonJNW~{&(F`#3L$&6axLSB(VQ}Rzv%rN5%kAAPJ z=FWoVQ^|@`Gtz2D7a+tzDC!|c7bI@ApKkuCpHlTWyVdNSQ+)agW z_Y#sfFK$_8-FGV!yoV5=aMbmSY81H$a>^U-m;{kJo%B=}MXLIDTr%4-LCK*g*Mo%= z%jVJFB7yA^VJJ$NXed#wF3Cw&PP~6F^L`4;hNskP#QUr!tALt_Hm_?Rl0V|AyBtT! z-?80-8W8Fiqw=B3Ar zMi|vl>U%^XE6RXnKKV8bw5~P%z!a+(?C8463Lsvd_opHJe1njQ_ZP)c!nJ~@umvsNIzn}skBLbK z1nc4UfP%AWuag9V@gpe=2WQ=VHUR|3O=(8bx}E)yke^l7nKY<^9he2*aRtOBq(m(IOWi+D}ZEdvCD#b_Cjka zDS#a0$DdJu)_GF8z(Y`*9It`nV~!-1zP{@dCddl#&%dI>)%d%ROa2;a=O$COfq?W4 zyB$C)4_i8wJ{jJCAvz65$*=GEQ~yFybLfR{A}Q9#>f+Y3rJ0HXqC|MZHASCe7KR>( zrdy0zpd2j@K`Gm;rVo*|Pt$E@$e8KZ#C#Y2h(kH5LHqeV2640Mc!-Uom2k&ZUd?elYE9&P$wnR!_ zivC@P(#7ZO2IcgaF{KY66j-FQCP+1oZ#s*3J=HnuUZBLiQIHSxa=uomx%%~QCB%9M zP@qG!BEOd;J(2k_p75tOMxfg13azPQR*GdVUa*j6&WAbY$pS2lQkv<4M6~+Dtupcg z>#-u^L>tEtwEdybKw2GWbZD%N0zs5RA^Q&F<5_M9CDkJg1**3YXFx+0yetmOWSXD_ zkfNtnuPtOvD3?F9ogbF|$!odXx>EI|%T-J09(J3pxDaN=Wue1f=P=8{kd`LGpBWz) zALXwAm_p`=?38#)oP8OdwMJOG&~rn7SivF_a_4<&E`&j;dni@D%xSdE9wQDLk8s2& zWMRY=I|GO*kP93di1Iq+mGIg9fG@Qy4vG^uf6nsbNh!`?ACcOMQC3*lXg8U{{$w9| z&sW>QkIi6imTSOjqeO;78mkGIGVmUWk@PL0APcbFq91u?kzn#!y zLy~o=lgJx*2@l)2V?;_Lx+$v(=zleej4j>~2DKhK@k=RH=eR`gsI+4&>AhSiA?>L| zsmE#|UXUpDNROG}CDx%3LR5a2WuI7@0C$8a_Ou?%6&)G=g9<0MC>KD>)1=;Y5$`sO zrX@=Ov@*`vD4aZoO@v*8Jvqd+8tmPSFv^lMN}wH3)t`oa z8-z|QuH36bCEW1JXJ?f4(i)foGrmXdlESOyH|S0FVMjPJa(wg@aJ^X@;qQgo(^ zX1=`#T5d_e}80rXzljouW5KX?R^1y`945xnq|1QPb;HBhlSnGX6W=Za3{G z?SF7{Kd5KNE|+&dGh>l!7ra!Th-G*<_P?llM@AQ-*0|S;T0|oHc?eX7<;GsnS%!qu%X}iv!CR^CjgqD7$ zdt;-QP~=~td$@2_FkpK<@+&TsC91fyy9ffsu$)VZXYod%G7Urs5f64KvstQWh&ezi zVPz}?o~`0C4m|`tzlY$xaM1hOfT$N=Ao~ihG()exgP&A+uC4=FyyTrH@|*A!uj z^!1&~_7%!gT>(pOY5O#5>Q@!#W}|3YhYyq<9H+?4W%8p%~#psIPe=7)0p*<^Zp!6@F5BKqSe zr;w&2Z+x7Fe$CV{Ho*#}@bPKb;kL2f_NiQ_Lj$iT9Tm+kgPDlrmhMH#Sdw?x%v>T) zebzKASCb{=eE~(01+Mb`7YhWtp*?B?jwo~f3Rk4e;y1`GKL-;}R5CB(mV1ezx?$xRS`6?{>wCTwxjl#53Q%mH>ulG6v+9Q&zOdGj@<(oiZGUQMugM$0;ldEfz&E53t}NwbOg- z8AgaHJH+bpI+N@R{eek{hx+Ac2Xwl+%Ww299SZ7~S_?zuEpnl;u@TEKI3+OU=osZF zc`2EBtFy_utY1~K22yftLz3s&oxw6*4fu4W*PA6Ltn7NgecRYEnm(3`qZ1c8cumQI zPg`&(<+z@rOwXvTUK6zvuZ&cWX|AYlIWf93TDoD-Hsw4+MJ2|mKEGD5ECy2Y%#*^_KDhvqWAClIe-8eYiObx{fJa~3Q5)Rxt8E) z-j$*%2sA9`soN$wJxuGAe@nI=8)}09Q+KhLW!>E(bT2GIW*iwVeuzTW%Q|oQ-;elq zm{pfFlvs2~%JFn-i_Wk{id<;5yChf_r35@oAHkBQP3--2KQYac+jdLo?E!cWE6Iv88P!$b0*u8OLQ$Uua ztgp*oSfY8m$C_phh7=FQ;?Pz&f6xiiAgm@&=yjWA3^>+Jed*B+S8^r zoIi1N2$4fb6)-XNuZksL{1BzY+~4%s1eBTc<}RK=4McpVQuI~RH};)d{XDRW`?%>U zKtlPTZ+1C85-36B8CylWNH*DmNBYjY#1`8 zQUbgyte~F_O?7K&MT@z7Ydr=KC}3@r+Q^+Xz76c$0pdhaIF_DXZU4DZAJr94svGPhw6|_ zWfj~&uq=qA;S+lg?*Ms{|D2-;N_$+}U>3R)|6<0dRn7W$FysFA3SWr|zL}=8!=M(pOUG*sj?`clb8b_Pk8%U6d zdT_o{p0rdn2TVq@`FyTKEDumf^zIx;X~Jx63ke7bN|R3~*h+$5_(B~TL-!WG!u$+_ zWlu$DXN|qx{S72oc!;E!1xZ#{qfV!wxUf_~LaMBCBwnG5b9$n5ZJ}QS*~27?3XWB} zhVxk)tDWT_zjf{^D2}(nwn8tgyx%sNWSuQ;(5JMe6uI2RLc#gWQ9Z29;4(d|Q&%-h z^aEHLU%fDtLy|u^=Am$Xt5XDagHty6rB0S;G@1!CAv04f<>wd7AhKj1syGrRF-B2lb`~98Ki}B-XVY_0@uAUj$$y0hYQRFcI3(|DxO_%DLmVdRCL^@$H|bevtr0UU40aHbWND2#(TGnn z!pVfFgOyB;0-|BbWGbav!4j(F&Gq;t%dtKztRNRix`rMJr$6tcqDPHc>cAWN_+PGu zhkF+bHDYvlynuuXweF&VlBvH(YDXx^%1g}6&K`}Pq1w+Z#K=t0)Yx3$Wx!#vI9v{r zQn6zOED>JJeF4w<0g`cN3PkEo;}QMlI#kcfLPXL$aCrSyI>IlC^UR&}Gnr{Yf2*g7 zh;)=|qB5NmXhZ84Hk{8EihAXQM58mDw`r_Y**vQS1P1$Dk>T(F8??HA(T{%Ku&J;( z!N?NOIkbSG@gsNACB?@(Wn={;L}V82Y!?=u%ebCkqNS%QLmJWMM~M=3;Y-M-dF9Pi zq!`DDAjOkrE<~;ysPY?ih0PsWjQ<@z&`(S-Axbn(gr{Mgi7k1pq6<^7T(bLGTGc;Y zX=c7aldKX{ae{g=7m+hjQ(ngL-!3&Tz_zx>~dBbZ=F-u4L>j5-Zo_(l>}pn(tu^k zT6b%22ukHp(4h*QYP4Y+k#%gWkMig6?SW!6#WKk(!aYnWWqC*GXveJ=oPLk8UiBzkjOWCG+K{MF#SEVR`~i|8 zvlgCDvl$mimg5j9jpGzbts@q?wji1imowR%8MRGBi47jMZ534w*FL_i3&jpNXr+Ew z?~03jhW8uOpJ~qa8s!4aMByGw(|{EG&U$!dvLxi9$+-%<-dc{fA=h6OvE%ga;;SFd zRmh}0JFo@;6{z*y9v9=OZ;N!g1}E)ArOb^wyam{CISfhk?Mg_Mf`n*(M!kxbW!`*E zCUU8sExB!QTfT`F4>hV*GR<*BMFt4NHDQ8Yx|~*ow>%GNc0?sXsdB6Y4cQeoigBVM z{~vWoVOq}e3HjeoTTr=;gQZ1&0-0K4>2&j5+KQHHyGz1;CMs{BblpK${>Ce+pD(Fv z1QNM~Wgd-(C4~qTPA)%50_Bo73}?`|p;J3I?{krk(xdOqXaocoGQ!FYMAZZopp|W4 z#`Ibv?&@O@ePj~zWK?4%pm4hUNQm+Vv&|~}A@iooeT{V7V<$d9us+BzOc$@*xZ`0F zt{%7Y&1ns_t#@;;yUbQBKPufZrzyGy3;1HL`ohC0?E@{mUwB51mwj;y^}@_Xfwe@X zYby`+Pr0(m-wCR=@QgYD;3`B#0blo=jJiNN*-bni%`#ialp0g*5Bk{jP)`!3V{?uU zA}Xv-M>F07Q7OMkvck6P2obMm(bCV|nSKec%kQfw{%)0l{6wEeok(Sig#eU`8Ui48 zO!hF4Lkue0bsQv6#AZ^wXO#!vLZFaH6lw*}4gcI4JN{*M^`#smbHm(Yo4EK{$JP;T zoz7{7u7nt40z^2Y3jq7`o;v(vKA-SJlKCUYu8S{|-Xb#V zl+GtuSy_gSo_5oLXZQawA>Cyw{;3Ne07O4T`S+r$P3~uw%=PwcF?5y>pK?AVMG_${=K7A!h0!s6ryD z$|CII|GMe?s5TFl#t<{znx)rG*!Bj~?~gkbGChqdX%kvrToQK=KLwIhF=K~dg(5Hk z2r)${GKmNiR*kG3edZL}|DYK>fd2r8MhmM6eFt}-1mRM73uo!cPgAG%w3E5`iKEdI zdW96tqUCc~(WG@l6B{Edv)jG1Vo|D~J{S2lRL-R&ie_BOl(uZhq!V#1j_L$;qLgt| z$$wi=C9Mn@wd|V|-G%c$vy9P>xG~FtB1z{cUU9_5`s?m&w1? z&29|x)U=1l@7wiHE24@fJ*~ps<+0e9e2|60Ht*_%LugkvT}XvOJvDq@SlviN1||jD zKRlm`an2Jb#zzhHplLu~HGyN)A+IrPFR?;N_J#)*J$-d$(W;DzUm_>fF)(^rl1LdU zRQr8CuwHO$BRj(rG%TDMj=~8w^74Kwu%*h5&@SO7K>h{C5a55^!5iiIE2PX2##Vq@ zrGNSfdBRp+L`F@zs~ehi`tnz^J$K$McK%~D{Nuu=j=r+1h4;40?cJV2;UmH4)I}zR>3dqE(}>0t z^{yV6E`y!a)k@rXsVG*eu7>#zwKWAYLtv9a8OKX>0G}@&E?R#`p=()+9~1EaOjaWh?&hImc_GuY^SLh~9}wq6Hb*P@*^ zqe}yRI4t?;m%?0*Kg9-`8Z6W;U^;7pJ(%qJ@*UmPiZ|&=DnFKvOz|`Qg7!=D1@8+tC=6?2Y^b7exEnDg1?vgN=4brL}hWga-ve1P|dsVzKMSpXx zY}0(6ZZw?5U{?IJuJyDa>|$B9m50KWOatXY2WiD|bJy7QFdfE~DOeD8s4Vv@Jmc3d zknh%WyM@Xv^8m5b!<`YT8e%kjFfF?CS0|&T7ex`8!HlC&#rz4?z9&A@6bX$p>%p(Y zk+A`Nvqp|$7{ORQm{OH?^~kG_y(qAJ+Pqj}*a$ALe2-qKLHKfBA!^1}Gt2vta2e5K znN2zID*W__n5#E*ZwaDTUB!jS-^r${9bTi$IZ4y2wV2Oh4NiYSt%rKnVcPW;abSO; zF4?C!1XVVGfzDzv2kw)-4`gYp4VhCZ$6j4Tl|3Bkb$WE=alqd8?Q??z)(vZ$_!_vz zS|lSh@J`MnuvfXD0xIQ^-lu87=`mJ$s%g8 zISkM`K=U$qT>(Hz`E(BPPZpaqCpogBy$?VwzyXVSEuSmyI8$M8CD{K&Uj`uduk2XC zjgypI7a1qFD5+tJVCe3-FRIUzhCo;!E^6KOh<&olYD7rC8q}Oi{iH)WGwRs_6AD_i zUqC@t_Rz~x$?4{$MJq8Y6maZx>%U<~NF$Jk3(8i{q7llvlTPSg@xlxC5Soju+=IMt z1cS0|rSUHh=dO@O^4lpRC zSM(=|Y>$~=lLZ?kSc&4~fBzA)vW#sxAp8r98Z(?yGEP1AnuNq5J4_6S2*%wuXTBmta0@aJhBvF7 z=vFehN~zoe$pk}|tM4VBFWw=^61PHFY{Y=zXToZyt`0+Xx%AeA;&==0a%o2zyd4V z&NJP~OiWn(1D)+#gvjD8Hr;n+y~G*B(dIlmt!jCM1zBme&XI8`%fdV}n4^@zJ^L74 z@dsuA!9aT=#j<86{CDe!65W0xNzZWx3Bw~bO5JvF$SD^yi3z$?--^*=`q4I><*-WX z#I|cTRzAQZ95ak-M4kG&;cS|)Vs}-g(YK|^$A+et2R&4^STilVpe~oY!Ys}ViDI9U zpUV1C7rE_O$Ctq5;GPp+BpypBik=q+_tV!916FCbB`sOEt1VaE4BA;acgVlNvFdTu zB?m0FTvhqfI}a@0(WGV&4%Sv2gm+Mg9U-{+E6ynV5VxuKUo0jT*maU_JMXCMNS}=lv;80Yn zrdR+XX>)Z`nt)=)Vc_Ee(GXabe^Nd}GvZD5D`r+S2xSlA#T!FCM;|Yzd_BHmc}jG> zu+l!{2hNIf2>ii9H%#19<@G13SEr6R|D9uvU{11~W;pDC3zSRQm2E2$IP#NvYejvu zcqPVt!_Yci`LX;Vkg-xr4JAa%*|l$6C4MhVNNA^2S7EGpQ*pquaoUGV9~1)@CrGt# z-@IFO(bSdsd9?!nC0Pheso-T*p!kE%hl<4|SLAtN$DkDv%Qv)dH8rnPOi9X;95dfq=6(ZHeuuQCW;bw;fLlAYG_DoX!!ALeHGcFRKPZw z91}|C<^6^pH+O`P7C-_c-TNTYbA;q^mGRX(4P(?7!Q$ekii08|%}C*994{XiA7r{p z1zJL6pt~??wJdvWyv?4RxPMA#6`9`blXXbU(>X*wJFocem+K2SLbB`@vii9 z$t6HwPp(Fb02GH(d$6FckmVQ|ke3=jdMwxt=!CgTCBRU7yghgdNm?M83TQ>jxM*C4 zEg%O2*&*yt*k7AxVdbhsH%pvgK!2e~j3M6ya>Sv$^3je+yGC(^wr6`IK4=4STWnE? z$XB~XEu*(7tPlHz?f7jIJTteZdtL&I%2t`ehW*GV$1+#1KpaZiAd8`*DVSyaZ5oXj z87tuL-P>T&Ol4k85e&d7CXC1ePc?*?W}^d>YM?$8N`LS~)@91shM4EG|; z4Ky*O0Wn!+Hh3&CC*tGdZG8+Yqxq(BfXxC0zMAc?$hbrGFJD*@w6K9Sq#{%v8N_xu~E&xu>0 z4v)*Y{SjQILNLaBSB7=nH{=KvKmZ+zGjL{`KLx=8NOzBn- zwkR6hqJa4-x(r8(49T$}XnMd`Ze;>`rm732Myr5|1*!!lQ27@t&+GHV7MSdPXCQDD z^6FiB+9mlb?ouwqF`ZHvl{;e@PpC}FqrD_U>XbtzRq~Sykk*MXK`XJhH4w3X2B9~V z1YbCk%jPA{@56H<_3-{OZ|Z3jaLP5}9rJ`U7Q8*)b53bufk66DU|C?KEb}4ExPBM1-E;I|YF+wxsI4;V z$~vi@v)J))OqlXgkPjEh#-Yd&apwd4tpCIAaXq)dxFTHjAN;E!!n>n_{q}Slaz8y* zJstW!&rxg7B15{QNuuz7KrImQtJ&H!2Kjrux9Ah1^|xIPO50C%dgjm(y;7vHc-m2l zMZD{G_Dtb`-yhKbJ%9)wB$>3m4k~VNo-3FxU+U!0kmDnTq30%*moNWhc6-Mtt1mz$ zQBnt??_Z0UaUZOzL|VHY@&pBWjcPSz=KPIKk$$x-FP+FJnwHh~BMm#?FF&hvK1*kq zm&4)fz4}s%TI${78F<~7syhyc20beDMi_PK8zt%y8X~D#Ln)uWAfwq(Y<$}pNr#{* zPR9>GIq`_@fhM$^QU&1%$-g`9iq_7eUtw(;0W9>S0;ubaRN1#*Z8xx!jDNzAm(YM? zFz*-uED*W79V9~Cami2eAsk~9X&bwEIi2E+qy!(D`1F(fyGno@zs zCFEsRkgHQvV9tQA`s>XBcdb(9xE?Um+E}_7a@c>TG?}B4V-Osv)#=hUGue5{b7mw! zc(y0>0^!K^sgPRRaZnZD_Wk7bf;uuYmlQ0EUJefZ0R;a9qt?2~EwO|K?VC`(&t1u@ z3f|jWgR}j9klUUhQ=u&jGY;$Dm&&rCvg27GZc`wKQcK%FET{9J;XOhPgt6BNBE}~0 z5ZEu(bF=r>R~h zCd$ta`KKE-`HFQyj-aSC56@gZwzJ+FuyGEYs6wYRKSdt6{}46NDaJBkj3c*7)M))A zc>W_;DPtytS(=(k3>d*c@PF2o)#5h)G7|;y9?y3WX8&9NI{2!+X*}#w1U)!*z-eYM zQ>f^1h7fQAUyFfv)0w9Ne8)srnvgTo1te`z8^BpgSycMcBmdWb1^WpE_8PkgeGol5 zcCMK9yETtl(P}xUzio33^`=!eiBaopTuobS=r1;>Y%H`)EK=$I2E{FN7XJsZ?Vce^ zD{IVGmWMY`W&^jivv=^Va&&TbadmU|@bt>}C+iI!lL>wwZuSExK5%&+K2OMofAl`O zC+1T=$9BrnV_2T{v!dIhwVFp;HIGT7o6&aAsxewCbG7)z@XOm*|mPVr}z)1GKc-^$068L{oyDl z#mYT@HugQ!%WcDb(KU7&-S2%dyixn%Cj$2NYs4=sW5^oTym-4N-8i_|$?-i38hSQF z5M^mr->`f|%N6P#_{>RxtNj#Sl&7OQomFS_n+$?A#$n_2%_~Z^U9=LN{VSVNE?HMhjFDm6a$U<8_BE%ntDvK<}L52I- z+EL$n&j|lb*Cw+7uahTnG z`o6Ya`hKX*v2V_=UVh$H+?$n(50^L4?5&nW_aU2Pb%=c1Lg!4oHA9MpeCwxQeUCE^ z3mudryz>(bTBk!KfN|ExLK%E8DR(?$>&UCP)`|Udw&lMiT#h}w$fR#uefd1CkZYeN=}&0ftkx7H!(XCaI?eEV|l zu)|&ob^MIDR9wIQC4*n%(_NhMpl@<{ooy!()r3<*M~4kVY%%cGB-Ka<`Cx(YTvHxI z7dg^h2k)u=0b4{RiCUh{mI!bd(;tp%cKU^`7mQCP#Ou|GV;Igc<5FZuE**ndCo`Y6 z$|!mMfB3GfPztj{iPwx}r2jO^-!Je;R}p+iWYSUovIz6qtjs{JIwpaU{5mApPP4_? z4A80d4Eq-ts9aOJ-Yu`UcTgrL_#`eioucbiyLkI^9%G#OR!lRjulIDL>(j2S{aR^=F(Y%1hU4cuzyk`Et$x3fmpr4P?n>+btU3;|3Rf zUGF6aQO|S0`hr>`E)wtNOK1!doPmQJD~x17qZL zX-4HD!ez`X;Za*Ud`xqcQCZVEREGJ{v?*~Z$ED3mvqU52c2l-3B>p$Z7yYm{6v3 zAq~@t%1&gYAGS6ZO^tqwtwm#mLOmIVwgF&gSM~+aZSK6rO3GTKiq)hcKzN_rC7I8y zGnVVj>;xCn1l2VzWS!58Q0llHUW9CZC)e+18t>EG@g@R;CXe^L5a^c2Iak>3I@E?B zM8RcBS(Vd5OZA)-m}|t$Y5*ckDC0sJrq#2$g)f(vyuAK$+RC@mt@=B*^KfKrv$Sqm z;8mA<=MDqi?#-G!0zVg@Ly1;pWAchl5fjREE~H^vtMzp1SzsBh2H9#5t%AAr0gRz5LeeV{DrMgbQl3GUw z4Z1g;dsgf4EFLs$Ku97JO^=ae(UX`aE>cMp0GtCg!h&PTIGzr(wB@n@#cDb+r8 z4!XUl8DL-s?ip!KUh$YVUuGLvTl6%j52g1D%jN1;qR-_D!5Gio(vVYT>`h7Yk$oo z0i(0%r3}Pt!8&fzKbj>?Cw_N{z^2wdEHv?e(W^=J3x|cn!qEq{tn;V#NM1Y*MUL5) zNvIQ9m}Mr!UJgv+t?^~!?~Q*ozHa>5`u}C=@dCHm&pT#jeI4=wXaN9zL;HSMo>Qj? z_z?Or%HO=mI^TgH4rS|HQH`O2`8W~62lF&MQ@)aAHWeZAFknFt1mQ3@=-T?U`(L7 z_kX!~G6slG(B-C!r)8^hWQHnE-tDgxrT)J(BYg7l`b#C~71Z&eK^1^_M&JJMxltPd Dr))=M literal 0 HcmV?d00001 diff --git a/client/public/fonts/Inter-Italic.woff2 b/client/public/fonts/Inter-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4c24ce2815261b7ccd4c58f402ae5c9de860dddc GIT binary patch literal 114576 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 literal 0 HcmV?d00001 diff --git a/client/public/fonts/Inter-Regular.woff2 b/client/public/fonts/Inter-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b8699af29b021cbbbdf82e18f5c4a2271d19b616 GIT binary patch literal 108488 zcmV)0K+eB+Pew8T0RR910jJ0S4FCWD1ni&y0jFsI1ONa400000000000000000000 z0000Qhyojg^DrENxh(#|NsC0|NsC0|Ns9RS{9+sX7{Ab-kmI4mSkJFbPSk4 zcL=-cjV{y(Y6MlP>ssS}hCDaS!zQT%Gl!09YG_dQ3|&LJ zC=7=It#}kY)@W~WeDL--%VY?32=WA{zSAvxBCFquGttqOIJc$^3ZKR!oJi`81CN-J zJ@gb3t-Ll|oTF{;9$Ey|E@|`c> zi#U4u)0s@Ja9N(|xm(ZSPGyqbp`)4lo$2v9(bcH_V0yexM2+fCrpN2VNTd3lDLO{3 z-zv{Zy(aQ_qfA;$@mV~G6T#!Yxo^}jFMah_0xkU)b}~!hk@~oKhtrF*E`FycS9>Fz z(Zp`GTif9n`K>ye=IS|BQZ1RlO62%#_vK9~23}{QQvaP`d%p@9YCPMgscf(vnK;C~ z%B@Q3J=ZxbJGUjc`xenzBU-pMW$#g)P+e2?blt2_i5z}`5|lOm8nSr_SlwmW?l==! z9?i;7h^}vTvCdedt`|`RWom|nnETbLl|5bP13KR`vA>5|2h|SYUwT(1|4+$`fE44_eF*?fM2Yk=M3!k4o86&1U2e}9HRr49Q-1j;x~JZA ztNYDNEqHn=DJTfuz}(phSdCXnzyYFIZ&T&?aCMHdg$w zA^~`+wa99i~O_aDqhIJ}i00Er<5Wsv0*5*l-2(3t!Wc~A%d^CI{ z@zetkPvui7*#ZV(6b9CuI>p(W(F-?M<%VEx9T`fLQAnAn7;m70kyH+pkPyktc@h4Py#7gDCERCe%HU)Q!y%P;OZTY0C56Mc`PQz z0#aj;FXb!yp8$Z0$60=L&q(%@k3-}D^Iiy$KH&x|zuN2Gze{O8ajgnNsS3_A-)7F~ zR0XpRW@$|rY~J8dcw}3LAJ)_#Nu#ITQJi9^U7vVVm2`Z^ zm9Nur&#<}1Fm_^_Z8kfwQU9{%=eawtG$4#?KC+=r5Z)34t7cWePFJ;^K4+3(Av#eE zNr?nLy69uqcYDsv&YN+%Y68>1bgq;8^hWDnM9+qfkfo*5 zt?v%?zu6SQD4qZA-T6*_B1>lwuvrF_4EzHOHFqhh6jdfgnKCm7(`WiLeNdg~KLY5s zz1lZ(QLqF8%M^oKN!i_3+uzyq;~f3Icx!bjOC=Ka$Y%WjNq{_{Ep<6jweK#yT_|nO zuR(r-yPe(>K$sTmFhYaHrjM9gmQvI)HUClP0D)2{i?s>u^a#=*oWRQ$@-brf(M_y4 za0vjT!Yy3EbAytuDe8v$rOf}b)iBx0H=m2y2puHr2pz;5iyHAxuR211bkVC~&_?`U zNbSdU4moiFW(LpI_fF2aNlr3veK}{}TFGgWCP{A6WUX<=T5GNKC8xQ`Ns}Z^bDE?{ z(j@s#lH?>wlAI<^&i zFPuX;j3WWTtH1VZqWLcp@k%mDCp*KodnfQ_9<+am>XO7Z;n_kF)nv)6U%lL>Q&6{) zeUYC@A}tVzC@7)8q9`8z|NfufTzjw25qy|H!y92EgM_26<^et}fiR%Y_uggIa4HbC zySu&quTcsO4kN0uC{QqTo2bNpT1)@p-E5F2$cH?#umujPQz1|#^wCVJAj_(XK*pGT zN4ZtiAtW{)EK2r5;*vN+H zg~Y)R!Q=D*dZ)A0TBP!>WXXS&1cA(iB?N}hGFZq8%ib_$h?G24KluNCKYlkPhV<>7 zbN62Fn|MS+p%bE(M0AOSs8J&Ws%)Udo1qFfNCEiBxBl05+|Iz?Q@j+h*Ii?vbV3uW zO*}#U%SpD${Fg$(N_bB9^Lqa#t&@+b<|J)&P;sI%j9t5ZP|Y*XJtwH12Tql&f&-q= z$aCLoE4owwP?>)32BlLYB~i-K(zyQDdV5y2YBLlFX2%@dJkY-!xjnR_41uYG{zO<9_fV!|bKtP68XzEI zo1p%mRd6A#)|C_%2T=f-Za1OyghV(&NQ$6c$wT1pxo@)xu}M*^WNer}@9qWhihaYj z%|-PYtLy-dPhEXg3YJ}^C)w~fB={?y3jBx@ybfiI2ZNS5xk;`0EzxQZChczcld?7d= zJYQ?2onP;8)c)X)Bv4eoD^_*S2D-P8J20EDJD|A$36qM7M57`UDM0CBRE%*ER)pvO zf9YrRZbv;k1Lk5D6kxVzD5z5Tx9a@rAWckY#9GV9tV2qK3}7h%Oa>a_2^8O-2>jL( z3I+(n2NX=P`T?j@z+$gg^{o{~V;SpRW7-UwW zsE`~($;Smi5TNuaK+@&VR5w@DRmk0yS9IlFT_4Z)-7{@0eAi}9Mk(%3Hozt8?#!)ti8eGR2xj!3qyqPwLQ1AY#*FaSPB!J(vJzUYPF%I=H z+Vek}=Lqa|kf*GT6gv~@)N>PrK9768xqNq~nT)K48l`cy2 z{PMJC+lU7sY4;@_;ty5xG6)WX0iDQWUbg55jIPmwRZLnc)(ZdszptDP{m-sU_rk0Q z!eG=SR8S}x>eqV=_3v+1s&2;rm@3UMO)A|g9o3Br5)?K%M7Bc;780I!9j^zn8W;}0 z;pFOux2g5*JnMWJc}Y(0HgjwrD#!j*$Dc4CxdQASNS=8!l05<^BPk%u3$na0lCyiV zykLsglr<-Oh~6A83Y@I$kgO2dj&lo0-aSI7Qf^oN@|Q>c0Myo3l)wGmF9E3N|KF=> zwSc)nz7#^yh1}h2byW$xhtCK6k3a&TNCBiNgNmdaDJNQ|MWDQ(B=3+LwVB!|@5NBb zvM$LNQ*~9fp}OwsJNUxsC)Mg*+N9Z68ejo{U8x%MwLxC?jT4+u;I_&$FHj>R6k~R? znYujxI{!aumaZ-NT1BiofS1DOH$!5bfXuHgWEC$e4)-^PQ6d<(G|zT=j}XO=Yj2Gz#r`4$Okb*pOalQ5O6vRWZ}N*DT#16yZ6+v zq7Y?^Ce-JWN0MOB3MEO+^d|g17=qKY!U4~}(^u}9q;oOyu3m@48dyXN#Zc6}YF`ik=g)dh z@=BY}EfRbkSVuXRYnTtUV=?gNFpL4QWR1&g%lzpg-9Wi zh%1sv5QrpFNK+I=QLkpewC!&b3h@%B2pZKi1fv&-|26p6H|IcH)Do6(2}@Y9lrJkH zWJQIntiOF}Q*P(fDq`BMJU$|Wm{RR^FPgKZ0+R87!3XX($Y^(lL56`lwpATCMF+mg zSn4H+voD%5z*H$x%bvqFs}q5W2M-b{1gWiveb4pr7K1*UAG!4!kdq7=w4wp6Xh4Gj z0|pq}$H2f~ffX%q@<$=;U^s^xXj$nGhiWXw@vvJoXOpeUFdP@;pZa??=Puxb#utJ= z9)w{Sd}w%f{=d3_7EUgPuf7*hU#Y$ zGh1scYmC_1O~-C;J_h}1?}&LcJ7P8QMr>1$M(kokBldrU5xWt6#9kzu;_&Vx?kRc1 zqoj`bWSS9AP(I>IRE_vjv=Luzb;MtgO%WX22MB@^Pz!26BWM6azM->#&_hV*Eiw!g zABIW_zNo<;JA}#$a}98`}KuOXyK)$@D@Adr`#_iNV(q@ z1R{!R5M5ChM1QR!hHD!!S%-+lx<)#!U!?m6MS5;{q~AtH25($s$R2E=5HTOO}H4K>-#eC=?2C z25f@~`(Vx~wBr`6d4z5PLr zgpf@(2*t?|gpygD4K7t zPVNf~a}?+aEu8gdpqTUZjaBL#zf+pBCcz{F0tlPI0K$0$fUpA!bYZMPFcQWf>;V7) zKnQ@407EdAz@3&|uRr8ttkxfL8>{z+Aex1UF)R@bzI-PbY&{3zu}%`H@sU9b2@s5c zupgZfe&7sY0|Y<^lXhPs>FM{GA*ClTCTwe-SgxVSeEwZENUkO6g)b>C)EByo`wLHc zNY@u8`@6MVkQ)yPFjSfy^2}AR-P^PM-oNCkOqtul0*hS{ztdH*9+VypSz)F4r{squ z^{n`|XawU&g(7X}zx8_?Z(SRlTI+4psR_a4`erhR`K(|Ot5~XA0fsUEuL_`t3&?S` zlM0=7#(w9#a$s7N?#`aZEkN^q?7n`|ntq?3v7z3pCIsuo6Ix;H@R1h4W~;p}W45tn zWKQqj?U-v=!q7G3x*p`Z1i3B;xeh_DYk;AfFmwlo?jzUB$n^pYy}(=_VXjY&*7K(} zL0j43$GgGL%Yy4`7<$J(IcV^aQ*s2(nvY}u6~p-$HUn(QHW9UFvpTL1WnEg>GMZ0t zy`tgKPv6?sEYG+@y!jI43U5JD`Ii6l7yl4Xu}Sz@p&wslA_p&S~2?X}zqBL*a|cs&Xpz~w12 z*sjDbb$ZxWBV0H#R!@8DZDNCyoZ>X+IL`$xbB)iq&gb0Bt>)v4d{=w?z#pxw7`Gi} zSg>nYKgZdP|7+|K2OKfP2;*2FzT%4?C@^5z!xi9MOLWztVT(RpCmXI#)!WjK4cjQK zCYtDC6|d4Nxyi(rK%x>imL!r&b~Rp&_2;rRYcEHq;R=kJs>+gsH8^6k<{A@C43(;U zs`%Hd_+DC0;GNf1`_9K|{Y+53KS*lw4_W_LnmX%ulj+>u`5jhmwU;i{<;K#r4_$A# z`hsX&;{yP06Zbj|N+>Lm87sbZ$iNBx4pF;lJgskNPGekePC5CaiVuS!s}pa#D-Q0C zMmt~4U>tZaM|6;*rA|7npQKJ5*YR%=ev*8WKMzsM_dM~zSXl7iP+@{}ViV?-A}UX< z@9=hRpCD&+aDG8&{$w*UVCHj~jdafGYX`}wXfFnaj%;?dGX}^VbnZCN`s7vP0T#B+ z^#TZDm&^BUsBn!X&k|l8;=)FBG0VA(c}WKi2rey`5t2W}qR7H@m7j2R*A&@Hg(8}F zSA6Qb4(>j3GdICq-`vivfrpt^i0}Y#ca+C_EbdP7bWg$EnV#p_aGeXQvbb$iV;{(oX%yR;;o}TTLtxhT%}N;U7@%c z?_&}G;Y?k`u;qObffB@@W$~cQhR+@QDiJh+goR66dC+?sqF|ICm5;&Aw)uGxzDivk zl+QPxt)B{apB=$vQjftOLaAs-gmfwwo{&)IYYfCzo7DY9HwVpzX^1Q zPJ2H<3Wjq~C&nUktg_&$Cb)Dr8j^1Lswd~EVzNQ-oy z4|M(d30Jxa7WEyRbAHGA4&o?I_};Vl7T$837b&h?JL4cX3jKwp1o+|c!{b7P9pouI z&gSwEln>TeFVJslnYSjTY?KE+o+Xof6T?y*JUS;WMsd;UyOI*~s<2nU=bo5{lH%R_ zsgz3R7a~)TzNIk=x(^1mnj%l?{^B8dQoadGM{xbZv)s3?>57i z`{8Z?BrYkBtO`kcXSoc+k%5ei16tLEfT%*!?}{^|mX(Xi1Wl-J9FU6&8g|q?V==+` zf_Y?qUYxG~L1*7zMgZrKuD_eq%Ec_g@jS~oG`U)ZBo+*aeK_pe*QE5Bt14Yi5DiIt z%fgVx=MJg#DY=##_1vyv&a7T+c=twZ72nCbj_k^h-0IJv96ft9J&kn6Y%V{!%LP!{ zrU$xb)K1Dn(pzxIq7E{XqU;0}7Kw!Am5*dC=8s7}O-sHg*e@GMuL9LKyv^WI|B$;M zJQTIP9PKHX0`^gebL>Gmr3s%V(~)aiYNIn&kYn#KHpP0v_H+ z4ry4G!K1zw&T{^heFa2}ZK~4OH7bYf+9v0m#T?$XzI6thCJhrpYr$tRO|>|6F~c7N z=R+mD*uY^^g58$Gi%hRHmyJkEu_QHsB@e=ilT&b~jTCR#Q3HZYs|19EPdAoJ2A)Zg z)%x@1^XgDnsh9sqDzqt?`v7)SDnC*3rRae2?7-5%2f2~{FDyDiNTvD7x}YQ&W<;W| z_=;szHR4;#MXd>|;;5F%sshR^98zyZEN>haF6(;b$5wjzCrSMA3d)Z87NJNLh$8qj z#5sS(8c!58Mj9q|7#d%nMX99E-(zW55S;zWtn62S@{AH*<=MK(c~#w9UuMtU;^TKh z>Mcmd&#WSeG>ujD+pv1OCJm>dF{!i_617R{B-b62;BnqTOOy$$K&V)SHNkzn`JNM- znU~gk$%8Jf>cP_&PFO+!RqXTce&uvk~9lb0^=DVK&zYpmTQ zezI`fQ6LQ!H0)^fnOr)YFTmU3+sU5snn4c$Qw;$&=DKrmfec<;RG-rZa-9_1N!MJa zBRVe%#&#MYvrMUEYio?#(?VUuOTX^Z*wQNvO1ummwP;H)d>Zdu8gQdFv@NwK&$4fm z@016Zb7}H&2o7)j+Cq9m*P?jtkPV;!Z>O|zn^xK)3M-g?Ypa59f5C>I*K7e!mFV!m zb}#^Vg`Ww?{V?GApWV$rvmbSgy8dT&NSB;6lBb=UQ}Hz$pt=V(~5t6M$rXPHQSa#d#dg#m*jO@DiC4bGl% z{$j#w20s5tUmJgvNc7z$48VKgfdJBLoxHc`|2>G4j|mN$U5NhzBCi=xMw)@Ds33}= zLn9ix7RvI&Dg*!J2P6#&Ug>B5JXXt5ocYi1oAk`k2DR*<@9EQEe)+Jb)-PBHIgVi+XMgIq5h&6s26pW2Cm1p-zn9>fm#!kp>IKhc}x6&w_omA zXZl1CJ`W^JBJL}}7E=w=qx^g}Blu+|GJE$K@sS$Y-5nW)fvQ~^RrlKSXzBCaF&Ho7 z)!3YmrQVs0u~DAj>zXfnx!;6MLCg#nwRdy#hN-p>PrhkTJw4In~baL~lezB%D8?)U3M*W6_jLFnke3@Ns%6r>+ zSa4%^Vb;+=tqm@snuZqb{wM2naTmWW{3^ke{i}Rp881x7_9XPyxfZC#&1OUx#ZWI~a{8Q@bE!Rg0FU zv8(y#_+72tg}4Y&imvF#tX%NifDnvm$;-k};)dp1y6fn_8HB|< zUGvVK+p17;{e3KDnn~S}0G|fbZ%p@*mjVEnGV+S7Q>dV60-U!6<`WpXUQ*nU#ZeI4 zW8(9-@E((&yR;BPTkaj<#?QH(2k)!RJ4*D#6%#I%!=*ri`H4VUL{;;y18b5mHX+^} z5T5%Fa{OYWzHj z(>YH#PxMDZc%jZu2N31Xez$-LaFcWk;Ki}Qd(n%Z4L|dNk0|h?2Fi0$NPMZ;?^C4` zV-tT|Ht}ppCcI$b_d=rc&W85v!Z?|(RfgSM(7iYSk$I8 zz*B3BdqQbQV4FOa=`Q*0$cCw%@N_{qVyIMnm@fI)SL+X&=85*^NvwIQ>?7o^s;4`X zA3Y|_sATa;sIJKMJoEVzp9-Z(HsAh5S5(WoIM%;=BdBMWUj+ z&U~Z$Fd5@kVs*EQ2Fa!1pAWJUi8nrTLFV3dk$KTMsH z1kE(NsAV8(_#OAAj;o5#hT6nWnO^7$TQb-p;{2JdV_U8s;1p6`{kOj36~?8S;!G3zad&)*pvjVwBMza2K#VD3&a0f8VQsO~{( zmh#h0CT4}2W2Px$CM#e_-C4!2>W}K;&amJQ1k8VaGmVWa^s)#qCW;@!0Cxc=s_iRT zOL}EdgDNik$IMpAtF``9vK5xqL-=+i!RMSSxonK)l6M zum{{q(w;t?80n=XHTFJ)t4$kE#?4FYK4EBqW9s08#Gex< z>=Wec)mR9LoEtyI0a3s4o5Nqgy;2@l#YnfTVp}I*KTG>fsTFiU2fRinbmHf1^trEs z&4N;v$}s_23xW%l;IJSnsF)uLDi-Arz2BPhH4?g`xNv*e3V#s_`@GF z5sq+OU}Ev)J4NcM+?V)yt~OYWy{JHi9$AI2E`jO~*2diA-B${80`9X8gSje*U-GYP zIz*foq|cKW>6MLd$4P<;y?7SSqAKphoe1DTJcxwO*_5Y=8mU={ru28`6W|Gb!nDbQ zy=Z>aW=FQXdE?u4K1#xe$M6`c;U?UKAnw9lNCLO5P{k_FiWbb0CG5)L!F|T>Z`_t> z)HA2zSoS58Wt_o|S|)HKgTZP^G*QYd9nzrK<8zWq?E@sZm zOw+0ug02}X!>x&YiRU^b*O7P@TPWsg-{bdBaf2}ABTKGo)8HRR6(BsLHxfMd4lcM_ zr>C$Ah>rX*bAKy7N|GlY;vq($uk`giX2}wEE2)@=6zLSh$>4fLO#zY*lIyz-k*ch|OjFt2r}es!B%q z7%?RgK2ly}BSIs-sI;{*y8??XI+Got=Z@Z{v6V8JYu`2o<0pu_7I@OLjKm9G`0MvP zl#mcGu{};C#v+IXe5J7v8T}^i79RKRPONth0vg{)7Fh_^S;i#d?tk(G7^3Ns)G!us zVo~QbhNmmML?f2?a2?w;c9KR;!N6G2 z45V$vsr?chcP)n!utz#?hJeBpx&67;$+%EPIY1lx3*G5^VelCZk1 zmc*8Dmjx9IVM!!ke^v41fQz_v%Kzq#9b4&=uh(eJ=oH~<{YnWgVX@A)H28+C#j1*p zz5V}5QJR;c2hZV2*R&BCKl|z-Vuv>OljA;M9t-wkpg5pxKPT4na-^A7*+~;hE zNnGmN1|J#opDZXzR#&-|*b?l5>eoVitJWz?7T_W-<f%|^6vpf`0HEa8{LpK=#n!h_Qs$A%LraU3lFVf-rU&iFLOU#{X;g#9$pv zaGPWR`fl>;3=+s~PylFEJH)DpPIgYf<-Il;kGawbh(YT@jD-$942^y!77YjZ;VtW> zI8>k+#(NZ+J17#}WN(w~+^JX5xZ=r<0&z%O$kl)h6VlBd*oQlYAsRcXEt=|xHJ+e94R%ibY%B6dIo zYvjK%8{)(S>x~;iOt!l)+2aNH-&E`iA`R`sEdCHF3_pmCKT806ueSXf#1qHEpBj2L zfRpaQ3cS#l?S8NXqWebXup5F(A@NH4=XYQ$ROw^{& z=|r!IwBnH>vU4p?uEAQGG+?^4F|S$ApgL7g`W~MJmb9A_BC%Drq3*lw0YeMsj_ZrVTfjFxO1J$mRiuECvnN6@EOkrJ?M*d80MRa8`;JG4m%oXWH3iSE6(- zA_sdcA+*y!4rhT>NHHqTkt&Ef0!lqV7%k8~U)nB-BKEuYEw8Kr;m9(`8o4h}%k@Tf`6FXpLf%~YNO5V{^e-f&ziSzG2htrPZyZ+yTZ{EXa37!UFK|+ zV6(+U=bftTV&x`=2ei#dY3i+#(sFESe2zkjh~enL7rw64n zi_i-aQjET`aUGTuT7Qqq>3&nYH&k<4n=BEHw)g5 zIFSWv#o;?RHvI#{AW({5#s~p(dkb)O13>r_WOMjfdiH-=xo}e*5$bKoN799ykm`1( zXS1Q`XjC+};mU`T_BX<`X}>)z;Z=Y)5g@;St|}rK)wUw+L{wsm;3mb07|cnqbrmMD zz=73YS$Z7qg6+`7>N0alm8BTu!MjHCxLi=2Z_Z#KQ+EsY%#>2!CA==n`{lRx_Irgl zOj9}@$^oJ;zvQXr2qegn`}HWg|oM(A8RpvuyQ&`eM%`Cq-16RbK9JJ18A*F8~;v zq$q`(`hrrB;i#q8572N13Q;ltMtDF^+{`MJ_DT{n`B`n5_|O|GTT+rWtmzH-my;c3 z!gT1kyo7Aix&xRg#6W!_A!~Uy+y9Dp$( zv|UqAYoP`JBPGh{Wt`kI?uOScC(w=c&+PQ5Yer#hMB8vWLVYYZ)WNy}4o)Oz@>a%y zJEuPn38=_=38k3-RJ3CZ1d{h2C=OZ6G4$U!F+}E|F`y4K*J9?h^dT#FX!ScrsY7R- z95axFVo~H|)MT&o?g6Bhmn#NiRTtolkc0gT&_^(4Gy#Szb5$e(y9BcnyLsaM5+lfD z>POtqN8y$(J6G2xIH6+^tc*P{gd>WG1itZc2GD;RICA!J0W0BFD>QdaOay+2jdL7u z28d?VdGGiXv8gcL1F?nW3TdI7hcJGfhl3f3lDvnt1Kw2P;6j=EnR3jukiX$t=S<<` z-oa=ssxDafJT9x)EYleNDkz9{1Z#bVksTL64Hte_GS`rXe3m0t*B$qLO)1Y()}2fy zN4+q6_Z$x}68=`YytZsE3pgRQj|yd{?izgMYb7aI{&-HqrE@C8MsmMnFQW4p?A-`! zQ`{JXPKASPhPGr_USXI&lCOzi1*%_f*`FD$AK>APA-I#>z=`@$#>YH)@$VJwLK)mt z5%-!To-8V7xK&{DA|kl|C(U{5;6Wij@a6BMt(onpUBo&-9b<#P_mF@hF>pI0@ohAx!rVvI*M6qE%P9;ik&hc-%Axgc2GYdexi?UdI-b zc7*&?a#lRPnyUoE=8DAEi?0qasu~H?JP}5lnIm2G%@9={wyCB*Ypn!!CaK7J0<}2n z2Xw>ki!#1+5PJOik^g+Ou*|=3p}sh72ZE)q_pjbr#XIk{ zBd0}I_n`4k-f})w_jTsq4F+^Bd4XL^n?sl|dDT{NzI9brKodPFraKXP-)zFl`zKky z0k2@EsBty>mnJt3PtU%dI3Se;pR9x*qzZ8!I_8uyQ{sG03h5I=sq$6S1?}c(v)VEz zVO!w|vNgdHcg9YnoplIx*Bn>4>*8tly&^?pD^W6za+O>5MdO6Nqf-!GSmNdbiS7Qe zW~WW<|58FbLuQe3Xg7XNIT7WYD{+4Lkri4vd2z)_3ldy<$WXGwMU`7tS&GXkM@gzw zN-L;9S@o63YA8BXWwD^+#8FaJ0=PtpkP;_GuAxShBuUX~s|%x^T9wpam(oTeC~v9> zUwhS@Z!JYp-D*rVy@{>9Pf2|*6#NY$G*OkbbCWjf`I0`Dxo?}G`I?)EdC6PMyyYiu z-V1=3Z|sJhkM<$XFTzpgH%Bq%4=1qZFA*B%2aKY%(FM2r^&;&7188e+Sm_=%gS!q6 zsoi6zBa_5IxBHwIdchaG$P2&lMP1ZE7Jam%FZsB~UCO;a>K?wg$KNCO>q$5A{-eL0 zp90R%SFKd#_uFUUs|c-9cU7T{q*ooW$i-n|2EoAzDqVVs3X}y?p*Fk*4N){| zjH+3CG@ZI)>(v+6kfD-|m@37L*`$^%CAZ>83Trk}I_^~2&bUy#s~(o>hLO@d^QLq^ z_z?We@9BR&=Ud~#7hdyX7gx&?2B~f0NwUT|FluEigNS8ug)p7~1gytG2#2x=!g10N zPLa-3h75$$l@M^XQwT3Q%gA{b5#I10BmcXC@V;w|Tz3oMGj|wy>KP+1y+ruMD@I;> zjYvhhm}OdRL1Y|^hD`E8G$3!L^Jxb}j?y4dyec6|R5gK?R)i=!2L0t%ifCj#C_4nc>v}Z55gVi5mF}cNU7s|GR@RHUdf0rQZb1qYMI0{kVd?SbaK8& z^Ekg|Y$|@;_(XmKaVmbx)Y_XizxF8TYl}fL&wr85@)q*oh`>FpFcs8*j-UfiBWU1g zSq6PpIfiU{Cs1GuL4rdspi4axZohZg#-yXLqWnY&`ORF z!3na`DCpn}Q^^G`xWRXYfDk+ob3BoPH%jnD%?ZM4fsI`$L|$UH{L~x;y{D$`L7~EO z^A)v9LsKqZZL8`$?u~l+sr8B)O)6yudxq_-HSE10j0mkGegc`5GqGfY}q+L#jPE6C5m=;(%hhB`wASz&-5Hm@W zFikRJ7L~J)Sn{aiz%Sw~DB>!(sSvPk;NX1#3E9d&Q0;`lHnj(?C*a|G8WFLn14!MF zky{Cu)XpK4-bO|3>Xz(!?#Qj@UwQS!D#(V?SRF=lwk$0T3(TAz*CkAld=rh0<|fszYZmh)Qyn4UZe);N2$L7)W#S@E5Zsc|FfsJZA{h!(e4 z+tSz(XUl2aam(Y4SBO7;B$%M>gj;Pr(L`M&p16}FlXQ`E(oWi#to`H|@RXp+03c8Z z;6S0805(B40ge{!phLI87RJGZRgN{gV9&9Z6X!}Uyi54-X~CC&n*s#Z3ldUg2SiJI zkTc;Z;V^b00;glAa1*Dcgmd`S&J(uf0&%sAB+XqSEx0T-T%%0gke9fpFojTB4ymFb zg|=7*WEl)h8?qI)=Bbi0&*59~5;gG_t=c=4;WJ_QLe$`^>YQ)H^{Ui{YIQk{q={xN zssFVme(Fg5CTsLZcdAueqjv47PMxVPU0v$d)3#oHt?Sp{wgCg(!NJuSG}yXf!>yyE z2PtXJI{92o2o&Lu9SRO2C`53QLV}u1A%jG&kb@`{D%deosNu|9p#v8d3Jsj?ROrHm zrCq&X!=|@9cvR{ys<~Kk2?q%U9*8MVq@IwGLm*~B2u?wq^wb>cus}&jP@1zyS*5>K z)T>k(lH`S@^7EE~h85r;1+s-EsGM||oDA4XnTo39C<(c6^?DI=3X$p!q1PK#o?5S> zU;|dF5+_xKo41*$%vR#WHZ=ux>dNdSN$k~<+OI8fNN4IWS!>SeN*r|!rvYWoLsOSA ziTmvEnBT%XL3kmq_k%nXOWM*#EN!J79P%I!RH+&Hf>U$y1EH1_070!N5QN5t7)Ikl zf(WW+Kyd=c88>9OhbxA76hF-I9R3J+o&e180+9%KlQEd!Z5ATK7o^hhr5zerMOliq zQ=){iEw++yyKOYMLmiG6on_&Y|5&){8Vh&aVd1G~EWGlH#nea_g|z82ok5n`&nhcQ z8YwtRaugbYoQ1((SQR1A0%?#@yehHZLscPAQh98aRuSXnL}#@3F&HktQbsG_K!kBK z9RXVI!SL|$y7gEO4Rn%@-BE2f-bAhthYh z1Azn#c0s-t;)UGS_ysJ$A_@LP#+$XwObX0|EzQj=x{cc;<`8*yaaVcKZ*hqsTpEjV zIIb{5hngYB)q$ag8)Y=sch_)Jh7)hYXxrF3U3N5S)()b_0Bn|y+pL{<&upB;or;HD zHpautY#f21LMw(+9{<6#(1Op>=Q(vUV6p^o!XI`cK85#6b2c7qjHjT&2Q#jeYk z4W@-%d}WmJsetFe`smwtS^FV1-jO5px(HKR`W^p8v z#pzyfnK$!BqhGG!$IUwzB#d>ch64)?_PnmF><(Ng-XqfrJ!O$j)0`jFvTiUWl8~%r zC6gv3NRS}Wa&}97k;R}SMK8BNltB0ZyVcn@Rh=`}%5Oa6#0bdy`8u?zBMbGTi#Ar{xkC9BI zCr(TqjH8S-y=rMOjUKnPXByVS?nqLp;nw?!!njSGp2O zHZHg8kjyxdxli#FGfsKd?;nV5!U2VF6pq+>fa1~D6e`^Dh{CJkO+_qVi(_jP6Zp_$ z_(+g~&sgDEK4)I*Cj^BBVF0u9Xj7QpP8MCpcrgrju?p_NL&KE3RW6pR6dyATx=Izz z#Dbh@OvS)p#GpL}u9;WpXbRKYDH^UudyOnG1_{@6n`G#R8KkbH3)FQ3-Dr4AW8DOo zh7cEItVp~_$JH724vD^Cw4~Wv!t)qZ|GA*~B9<3|DHHaT>?z$94e^u7W@*?^495!A z#N@czz}TuDT;rBLl6u-21H;C!Lrakep>Et*wyklKBz?wwn?tc+LM;>Z z6-3lkuuvdB#apUT!>lW)=%ApgVm^RMsZu<~+H5Vj?x=3Q@M+JS-znrKV`mas!-T9( z5@njADQe0@>3=!W@FP?JyR(?bvQb=30q<$Y;P=G8mn7ZTzCNl^8;UW)?B3^23*#7! zHk(UN`_LmhaHCTZDQW8V_RM-x%Kk%EI|3g&MP0vM_<{34`BxCYe8xuw_xa#@NX=aj z(S~+vr&=shR_&5C1bmC(?0VV{4XuO|xqbc9>`!qB(yBPmVx0=TI}byK9<;1bZwH>a zl{tpBdG%0^Y`tTUXfd-WI(ux}du)4Vk8RtwZQHhO+qP}n_PqH{o%8N_uWoAn=p<`p zRl1UNrztlcWzQGc6tSe(qdVU`nnl5bU|!PI+*l4DwcnL)RqJ&vw3^71=JaEp3tGpn z0F%2Y0^6!=HL*KO(wOnQ7>KE-AQ|@WgiQG|4?;x!ABKIgz?ey*+q2-5+JoJ=@td>$ zL=ecdN=uNkBJ+=_-Yl#kZITUgz;1)-2v+ixUpU-RxywI0?B=VR^1@Q81ec~cceU4I zD*ZmdriXH2xcj6RBfd@DV%{S}`YVgVf!@1Jt=?ZjkF&&%-#_b`nS>k5hm@v^?t`Ldty2no)MFXqar!pjM~ z$Wg;!uEaZcZMzeQ4SMEuqSB6VdRc=DRNkWl4u34%Z--vO3x%;Ie(@Svxz;^3^(wa9 zdvVQDzUrpdK1+qu@t{N`3LTGvLkvS#Ai%&xtObg;SQI}lSA@HvoF6|9-Bd@Y z0+NKishBAix7>+Yia}Lahq!!}ecqJgSWDHQM*E@!a@lYcgCM26o%N}RPa%UsTEmIHhSRS>AE9;mz?g+9>tpiJ zOv16+$6DG5cB0z;Mb4OM+Dw{Gm)dQ0W!PbfcI|kPf8~1twgHi&HWoh108<#>h<78(&#~DpA8{um3#$WToJ=p+(nomZU@iTt!(sDqY zcup%EI#ZF?-G&RriVIxA3?+|YEXhiFh?Xe_2L*xX>gkP*Q**oKxB0s#c#5thdwBMO zdG5jmkMQ{ko3>;vaU>BT{V2S7M-sZohWDt0W9G2P?1G94<1 z#)-G5V65S36@a{76omA_Eylt9^M+kSM~J9pAFAIvu!-h`r6D*8Am{)wK|PsSTq}m# z99~P^qTdWb!K|-l8%B+)BW{Nrj-&hD!wno9-bUA-=*Li!_n;cJt$5IEw!fJK>a*mH zt`-QRz9rh?|D9;4+f~cFZHeeL9RxtX zQ8+~6PY2#ys6(L6b+*s0PC8sAw1Q-U5mlV;K32Gg3YtT+gZS9uO)xyA*TQ);9j^yG zW7Q)%xJGYpQZpRxyk;jk0L@@t9@I&nS|JadGC(Ugo97^W;DrRNshQA+jHJHjP@6#f zthi9^2r@a}vkG3b0@*lyV(}#M7rr1Fr8RWJlv$3pU$2)Edusy-wKW6U?Xmxg4?_k< zv~CBWi%cjQeq`*U%$+Sdh8)c<8vtcx&VJ%w>dr~?zrx7m+UD{qn#Yq9Ef`M{WH83~ zhX+Ud1!-+2H#S6& z=7l;a#&%F&O0nYVUNK9g==CO2x{a!$P%KmplQ$aolHF5KVgX$vZj`Q$vb-SN8X`a1 z97e3K&vDIffoIzzQVASf#qy0B2Fn4lbwOo%KSL=W=}}x)9*Gmy^a9nEv57AFnBL5K zzw+k~Y9nMrE+8oXR`g3}M!e|e=lNE-Z2K*AHr6!OHQ-jk4>pj_7aO^%wA(?9>YtvjA3 zZ!5_joXXfjA+x{#qfcEfhPG3D2Xx!uk59>sf7N;^JeOd{f$Iq_y;zh+q((;xH$ z>Qe0T2mra_Z;VhRgaMognP8@k1BkZ%x@+I@di<_U&_kA$Gx_7~oitP3Me}sVsSn5b zlKk5<$|n#b=Ph_E#q?Vohw@GRmpe|a zFk$r50#(nlt9*wCK+d)Q2*At}fU+r_U5U+BP78I+J)!ys3kPr){#k|PVv&U0>Eo5*{I$y{cOiPgbo5o^*x|ZpNtjOdDO?8P#dF{_p;5PI9JXP;yufIH2 zh50PKx;X3Nc?fDgN;D>)*=QF%15e}%IX8@GpOYuaB6F`u#;9m2)B|Vo)bQ9TzryBQp-4SS-RYd!w6jb>4tIOn zg_8WOR=&vXkUr7zw9MxU5008mgU$(s?Emb!gz?j)3K<{xM`r!SR68UIeSDZSeg>;y zs(SVZvQpDibk$X^rd9*}@A3pm7cb-NFB?45b{pwQjyEmlP5xQO93?#VKkvZKd<1>` z$2MCaTN43xnRW{Ft2_t~jc(pVDK2@M{6WFEBv4JSgLd>;*orlFPet!3*Qu>Yq3Efo zROSi+T`a zPx3wu8R~7}m+g0+;TM1I6)2nMx<;FQBLX9F=(+x^c2BNuYs_AXSUe$vDOR4lcO$&LFLQIPjRyJZaK+xU@Ip z6Mxo4A%zp9IiT&eLkK_bd9J7K;6g(hCV{48L_)QZ>XGOpe>IJ?gb2o2F?5LA*%|NkMswQm7s2l7vz5`jMA{C;KAo!xVVG-f+Ftzkn9rKW)+cjTp% z^krt|lPhV5(ah#886g)eb5Db*Oni352VTbO{zwm0EaECi86s8TM&88q*@m0-pIla$ zAmku;ee__yQh4Dx@Xt{RKguHiP-D7@vanz@K`}~7j;=ma28~JZEo*Be1G*2NuI{QLWYFOrUUM&&lybgdDOUi9*aCu~2WZ0}+((h) z%@~d2rqV?Cgak%<`>Sm;u2bzv;ic05dsY7577fOm+IOvw>1km>&jT)~y*@`<2_?hW zqOO=~k}W7BQ@Gn~xxIChW5%Ia6%G!4Z!E$=+qvGkWxc3T7%d(qXa#rs>-gQl4v5(= zmL_EVTo6E#X_!@K=K>NDqVX#=1%$x#HE0@S3X zm^$&r)z#+CV1yIa^qbc1(&^yGTVur+*acf~yRb7gH@P}JKLP#u`w8+D6)*G2pUtt+ zd}HLeJSl+#mBR>NA28Ey>b)2s&B*f*(zAXtorBk}y;32e^DYvi zU}B5ej5BoMB68*sCYf`I7go%h_a6@Hqk4_@D~S27DkXUHU-Q#XJr`B{o*J|SzyU@; z05IY$p%jVFcoyO$I~w(|j|y?ybu-GfJHeC#?UCD6Q@`1~X}GhT&}R#a3%^fr?-GStdTt|3ou%|?K0!U%&!j_oFmtOy-xC}-6leSydD~3yO-< z&BtZ}5)(H4Kykhi3ZXU49nx_InVKKK%&Muo=Co#-J@bQpUliw{pI*sj6D>EQJ2e;G z#c_}doKM-4gu-T{^CUw~G*v@pb!9{L z^<_g&Hnv0N_U1!sw?9-G))nl(7Dy;ookrUI%`@4=HVsRV2cuGP<4zR>lRQ>AlRE!# z|!rl)H4Ae zXRi;Z-C2&ZFB!1NC=F$NO2|5MLFN?Q#WEkAdV}wsEi2CtOLCku!4hmIoePjNR-)7= zT_vX{E!9b%6_N|s(wW)pI$BuOcZC?54^76dJk^8;A6{K&S|?8?_N`cx@1`OX&&x8& zI3UCh_~xp`hx=P|@lBdL0p1U}=87EEqCwoa0NO zwiJT%f~Fe;H;|+of_9*)9fY*7tQ~^&Xx{TBlx92dr?hT8@FU&0>j%^Mye0MJ^#>;j z#370mMHG#9) zZTyK3PbqKaJ-_C?_(!qGe5q6!Cmmi+fxt|iF?}iXSO|f+AdIFMwXu}AZV**uVn4h@ zDU2vtP`=7c3oD)-o>Kq~awu_D9P7$)Rt#RATSi3SiO=BB3?4ypR#}oz7CBC zA`!n#K|yN(jpq{rKUQH@uh-CzShaTV!5SehwtzPbl9|JFHa~=07~R01+&I;M4{KdN z0_WLr5DTv#oYX%|k{}&D`4=M+YQy%*weg0^b?MBNMmQI1y(H(Z!+7atc}heiG;PpE zM6^?Ln$)tLsODkujgpj&^6VVt2JJOq?xiB`)h^2;pc}G1FgZV^>oG{YW@RE<)!!+? z0;RRV=KtX_Nu+++P)T zk!l1gpQt80Ciz>3W}=OUW=DzVTLH-KnGp!#&cy-aL@XPlbXU9#KR<0ZGG4IMdl0(m%Jp|#Bd1>73ipS@?s2Ydh|j$kN%l?Yo?M0=7-vad z)8e`P2Id^*BWc120#Mht^9}Vz3ED}nOOdQiiX{KuB7?VJjF`TFpkJhfalU1{mK;U+ z7-Mk+h65^j}2EKME_(<7AJS`Ixuu&FJO zf^pB{CMV{%Oo`oedQJ1OAxxk}W!kBodeS4YM4DM@FosFI6w1{^MJ|7o3!yW=MNo>u z+=CJMbVxOuILcjl6}uV`g~z5U`GdL+Y&tpSN8+XEtzA|gwkB73;vJcY2@2~R5e z>8*LEE5P%9^nrJ2_s|!HubZ1?f9ED1wj!IVr&|Jgezo+NXpMrkH zCyJ8tAGhlgX@b-DF*cBaA1L1v-BF!u1UiUGp7wjCQb3CzeK&BgpAo3tL0aBd4c!Ng zT6oQO>wkZ$eMT^$p7V1;?4V6{SP_5 z10OEU387S8N+jXKceN!o1D4c2}~L;CMfS`Gmy5xG%v{c++03j zjFec0KSYYDC+yWY`HrVRF+xL~kNO;UO2;U(g?8^Rxc?m*l#IM=c)n}Jj|fxE#gVFO zH}Idr+um$a3rnMhtWOJC5A4I(f=t_ZLz6MbI87CDXQ*9m^fp?mEjVX2fv7QARwhC@ zu2bV<`6YgS>Z1B2#l~d(AmGH}Nzh&S9bOvXNTR7)W(omXugEi7^I1VCSYBwnKl()Q z060bp5?qT}kq2fs*sT}`SCtN(@?but#`0=w5Cz?I0m&{CTQsAQkPQ{Vt?eT_Zbi)_ zqmmr(&wm}fxOoG=uu(sXG+9q8)N<6bb3#f;c*ZZgn&tdKi`$iPj}vizG}_ly z=9Oap;DZH20wZto1;Ji2F@^<;W=beYH`Nn>N-pa51qpXNs3 zzN71ga^0b=>_yd#*?3YPL|h}si3+H;X>Y(XH{I!oRJ5!|Uj_$Fs^)FUf;bs1CeNw~ zih#6fn^M{IPH$5;H1MRh57e^oplEIt&n1=IjloCPBmM=E*>m3ek;M5EKDY^2jrW1( z;>FfnPWo7w4Kyoi0!}~z?J{3#aCe#(75yB%p~2L%Jz$@M^v`>_F4cOa@wsa{NVE{yBhV*$i@9UN(=BFE*QhXs8pJ+Kav- zpp)jfHQ!h1R|rN$23N0^>F))i$r;KCB56S@g_l7lm0>e~LYbe}47Z>lrOql#8R{pb zE-qVcIkq=mx<0L5>rTPKb=C?D;B?efz%%XlqYC%8+9D9eDN32k9=K(9ni>T!gND~j zakyjc;{xO*E4yPDIp;-aQB+)($mSh18MYz9X~+#FITcuFu^KuC{dg#uJZ4}P1t4*U z9N%Wu{FHsYC^2cXPGHt6NbCT%9XR{ zQwX#V5ON)SNue{b=5M)>y?^oba&rxCR)X++K7hfIiBv;n_4eFD4WeKnys;#%`}>=IGy!FoDD~sEj*fS zz~Z`|i%PT2Uw@Jj1qc!kK!znUM&cIa!&3iEWgE>jpsh_@Dm`;}By>$}M{ViMHZr0f z07xVs%8Sw;DJsYiRyod3;1@(bq^qH-8E08N10XSq%IflBhk}LSV-)%_#r|RFQ-}q+ z=j8?z6phW}4FUz@sHW5Hk4)0IT!1P7+vM6OW1zig#yfH9;K`;{C6FXL;HR+ibxH~YXES`jYx;oV1z5a>Tl<7s+`}8Oi-n2= zj|$c~1POD{UvVP`W($MW^eMo-)@ju(H)y;$uiJVpDPnx2fx_mFN%^t*JJ4$9dbZ?= zIPOTW`B}w$m%_3@!)+Tb^(OS5RlMnh3ilfEo%h8)hojsw@f@Z@7(z*W!dy3^hehEW z++|lrH&Jx+d_J$IF{{Bq1SL~|KWvIrmkG#IsRs(+-$hpE%(ceTNi`OG$EH?|3AW@2 z-HaQka7GUaM7Ebq`(h}rMg!8~K@L;e4}o@4JUq0CIX#&X*Vwo$_a?|KEWNm2JC-}F z+N8C!PNM6mo{ggcLWIx4FKZYStWf+4B`Z%?evb3_$CoL4<1dvvZ9D($)c3YJzVsz_ zui%#9ZP&HE-e99HNx<|y{9OMU;Aep+-df&liXC$2I|DJePX28 zX0*sj=cqEAX2T}3omB|_Rx1~PnO>QZU}D35CoRgTKbQGFm>1RG|%|?Fx-06EANnQ9zg;1&FNrzSdZe~Pb`2@+qxr`otye^BoJ3ggQn02#q+u;#XZnwwtvN^P`#Ui2Cx3=8F)!^c1I!n1}W)ycskA zemZ}BHa>Z#f#~V)_{!3!@dd|$Mr@TxqmZ~0u>L_d^4yM2eCXtVO*tFrfam&I|8gq} zTViDXU%}84rv?oQymvVE@V$ldCgI;pym3eU|XAA zLqbLaHfC2v@JmWVEtGhY@?01nC?9?TF|+EQ7u)Y0a$Y`JAu`<`Vx2>^JXw@dOhugX zxdakNBt`QSAIoB?3AQ+^KMz4jOwg4uJ(f*;G2B4GhLPxuMnnD(63d5(&6l|FIVD#}x+AFfK?ex%aj{SM+Omb+I)HBaOpcONme2yqLc8MK zYFyCj`-Vi@Tp*`L_a#7G6ic@X6tL|r-tP+m!?NS?q$(sypCxcnMar+xxe(&Wb7Wq@ zvxX?+*>ci3IpasA2^FA)2g`BjC&lY09S&YnjcTnUFG`!Qz=Gy3B9D5hD{WW^5)pmfVDs#fe){t)=$OQv=&6Ig7Jj-Bl^CvvQD;UQ*){E7 z)-|&|61)IHi5b~S&ifGEqGyBWK%T>i14FNYMLX62FG)Y*uCPgu^h@}PYCldey{|e1 zQ`9WZYdC{eW<5~454AqJlOi}d&-V~1vQ1u)Xt{TMm{8rSjwXm>M1k>loV<@rGKL3L z<7LG_3%5%9ydJ-ZK{xiyFmP(5-ZKtZh{~a0OFZg5}ycAsb+i8uCTMfPzA6 zfytX^7Ml%A&%>1XS}p>5t1;cDK?7EU;;?DoV(X#3xbd6ewJfn|k766Kg4>hPmRk+q zeWxK^0*z5pWXwq)xauMG@yWYRtr$0Nux)p<4DTeNZ?$vZ7WPba-S|GE)98Ay8!0A_618~`8S8_bau=YLbC`M zLE@8uRs>^EwMK|qGo8&QVj?dy0pnNqH81&%N5*;LV=mOg+bGy~Wxc zAn!UdL8hvCZQETg)oJM;xWVQDw~Xr;XDfz)uec*3`fFG$kw_Sa6{w_YEyAdx?W)9! zD~J%W5j!p+0WDLk1cA_Lu_kbGt8-^m>Gndlj9xTE zG*|I;AbY!4Bm|8rLYynhGl@5g-ym^o?*SPe5$m=CXBdQ-PnSybjl-+zJod?U-g}_N zc!+VR?g62VrV4&2nnam92#6kp3TgTV4r;m&tp1`3+@SJ~k_(C~dFWb!LV`ns#6(4f zMuta+C|u+e;IKx$;!(u%+Aks*iZG29tNicB~4Xv zI=^6N;-20IkCpd^jZGlR9K5;{FbBhAf|#CfxqWFrJt~)xhbRkCbB-edPax z_apxHhD>^QgF)k2Cy{g0pVCU@7i%#3G7w431I|MexjRmyW%hjy-S^$;QCNnRdK%W9 z8d|g(mSKmH0Kk+qHy0m@;6orrk|KY;YX1)iJI&CKGy{l$*-p)Y%*1}m>cKoGmo?`F zL;1nz13rUPU^P)?GmGv`n1*C#JT{`y4cor1S>P{PhzFPb9bG>kO|u-tVTg7EC`LyI z78n@7p1fQjV>!5qWnN|n6S zzq=A1QVqq#L2tnN5^{r8p^vOm@Jsr99BxPWBLn7;u;!8AKhYlW})sX=$K-d>z-{%)_Q@&Ea> zC1j|Mp)r6yl2!CKu(c%b7ZjBh$jw5w?mWOGh|htSLo6KA@*}TDCX0#=6-7B`I-50d zd~=7!h$&}L9#C)Z?bC#MtvkZ^)NIM(CE@ieicn947J)PNr8ib>C&-~2fz*I(N2wVl z`1k&ZB`eqAzFdK+n3A^095}mix9C>_=XQU92!lnh7lrEuDsnAMr@xt~1_d9gJ61l^ ze950H0oMI`zIlXv0C+t7)tW^Ymp}9e1YA!4FPES{89a_Yzh$m3Xclh?JlZ~`V!oyl zM0O>aaxJkq`lqW1csfA#94d_l zy^U;v5oxVf3UWgfWyJf0`&WuCl7TB7FA7sh74SM3l5#{!$koOMaq_x&XM40Cy%Ze!n0tmYRZZQAhRz~ zT6{{Z&Te-2bMZN67_Sw2XCMb7RORd;sK|SkY5QGlk!c5lct*7Sz9c^?Es#p6{_b7d z>V2{gcn8lmZnbXlyOU$yR+YC~n!sCH$3&nu>QGMqHp)PshJ;nQbS=R9eK}`fr;%9~ z#Yayh#-BFUDjKU6O3usg%CHQl&^34-hA@EmKOVmM$cbEnY80`BdF-)C755fSUE>fpFmIjju?gQXJpRw zK{gE1QbO9h#>m`-fXXD6&E-;C zbOs`PZT7+uR{PZP2BqO6*7>&j;l`ZHS1w8K&S^z=MKMl!vpMc>CUu~?v8B=-L^XX1 z<;EZstLk3e-D(yF0- zh6~-AqsK9$iv@iNb`l61!U)Ml6_Z$?mt#6Mb@Fqgk%p}aU7st(6NPO7aWUz}lZ5U3 zl%b-e#}lpo4KkH4{yRp%Azx~Igeedz^s)Tn`2+X!D)aM6`=vh90qA;*K*ZnKg9EGX zh#_ffJKFQs;qyvLG!|R33PhRQ{u{P7^u`-!|FqmDb}fOrt}naD9ml|}#e@A$uIFz7 ziDbsZSUodV^Hmu%G7B}njbMD@(F(k6VF(vjm)h&L9#KCY&3?6V|Ih(0A8{78T{M2^ zKSWq(@an-lvZ4qivUMM>Cw)Ew2n+PK;Y`!Sm70DU_m%^tg$pUh!rHXkyflS1s&X@B zW+o9Yn`sN1;3y`-;dFYWslc{i>pZp1%k|h>G~lUo)P~T?xEQc9zp{$51;vd^Fy=5G=P6?(B2PPrE5MLegi+P`(f&UPi^z?!zKsumwN#=wUJ-sIRS^V{ zYhD&frrF1MnpC0TCvqA|;JDUAnotZ?bJ68ES+Mk~6D54aEd1xzGkWdwT%#ySlNT>OZ+UIu7Cq znFnc6BE~aJ&yaQn-m*_;*6weGJj-HOx&WTHJ21nyWU>v#fSt z37`9#-Ml`UH?TMx2e#L8I*dQpRv?`2>`n(;KQpg&C;z3)z{rg}y{dcqaP^{fM-i_c z(B37j-?i(6Fb%#llFwoE85f5O$d+b*N)@bH%BF=;!phNOjpaJ&2e@k#y;EJS`9_$0 zV%Vv*?AG}*MW*qrfxeK0ljB(oENY}MR*7ebzG838Iat;uacx{3YudNrp?!>cR}+OR zRrg7^erFIm1Vq@c9pM>a^YBVeI^@Jm;ddH;D*_H*cB?}EZ6IcdXHm}Cl*}ktX18mo zbok@*6}H?KA0`U+4YWpP_|w@T_O&I?p5em_X7i1#n43H5l3R%NJ+7USRPz&OIWnoJ z$GPagY@O95cV*VY+OEli@YMz{>v>cL77`dwywUJ+oa*xIR{KrGUdWeWP1`}ud?diz z3@P~r`(C=(kJ?Pp^c@*WseLtjFw^ps<)P!TKGtK|^CXfqdG&`G4GDneIECe|9_oRI(X#Q?V6Juy%T%Ct9qao=a zKItMn>7+erW{DzJA4R+++)#bUz7kQkLb0w1a$7yhw2H58Szq^s#q_(a0SqrpG*}N(ijl<3{M_H30;}ni@g3c!@iTHKJN65K@#MKi|XR{}R zNoYPIp`)YZrH5lGyj8M5z(kSPMnhs`|B=UrEtV4!FBEB9+^5f03)K7-R2V&$oug76 zzESD%H~2ob^4RFW!{rp6VVt>xG3a%iv@0Q&u-p5ID=s7|t1mDA;eC3lD(@anPmf-7 zWQ@zO;1+LG{_uD%t#~5Dh=D!brzByd5pPvcgL$^e1)s7WvtaUTLMTd?w-DYfX{nSF zvZN{d>>c{Mryxf5XCN{wLA?d1Fm45lzyoOx>uZKpPE<9toaAI{^|MA8UF60|=8=Tr zt}}{GPgAsL%Bh!FT|~vI%|9ouIJ61B;06Zgb-ELTF@m~okzt~$cAlc5s&1KsrgAI2 zMLbPSNw>aLTKHW5Yl?d4#G=?MApgqyE6`yfA(mJ`UcfYP-zACn{Xb6QWGkO1*0k=Sqgx3siB0K1tE);EXpP}U4d&NT~Ik^eWX zJY_Z2ud-dZ;UHonHTu`~QW^UZ_dim6V)-=9KfdDN z!m`k$qQ8C8Ma!m6?g4X#&8wHnEhBr5ZeDGkr&=`cXuR_Vnnk@miRjH4qmU9}yF@PE zlrDksnTGLk7VVR$jq)+M>O5pFB^~(Q+uFkZ>=j?xYDKkUwmW`$me9oMWrd|uRyjMm zd|s3a1tw%(W-sY_+{~9010|=q(`<;DcVq(edAa1;lrK|`*bpOO3WtmZ&NaEZ3xFHf zoH)i_%+{AMB&8WIEXgL^Z5}AK`v1hY@QV`A)-8gaQH0v7TN3T&R77r4RL$Bo)#7I^ zo$xnX;z~0loVfxu7noKZ9a!QS1a6&GX_o&Od^0GhgXi3z@-c_z${hKD1H; zyb$WDc5UJUcW0%ZYk_QKs1;D`jN&a;q@8NSU}!i%J?E{?rd6!4SbN_3{*ESiOMC(L zXfz_>sY8i~$h!a(Gen6^nm~x$x%~>hkdy9-3Yqemz{L&9Alb0)S5@@LG7~h>ECW2z z@EC#zI#n6Q^^I+DjU_=MqRZ^U>c;0L6=}cA5sQDL^1U5MLAkMQ$zXB3XW$CrW>vEo zf#0jRiE$IvjDjsN*Xb=UVB9BEzOvu;Gs=a%jVoU1`)#lC^Oa9ud9?oqnA>2A8_HKZ zjp5V{1L1x=0+y2&KtmsO923kZ5~Ue8fRTsWjsCWir0Ft_$Akh4nrN z2Mf8v<*~_ec-hP~qZYtAs~cMFUwEyd2K24N;0vo16#rypE7Mk+#c2!_+U1plRa`0laU3%5P zVB}sxcKP`0$#Xcd>sL7n76&t*bgaRCNBM1CX3X^UvDkPrD$n-5JHfPcU?zEZD!c4x z)_%-XF(&jTQ$2>#Mx?TECckIjL$4K^ba8+4*t7H)W6${$Bkq@CYotH51EG$OXrbiU zTl=JQnx6;!4Xz7a=AcZjQ%l5u2;#h!&{eTMB^9GS-BkX?wW*YhdORC-SLVriPs zT$c_#m z)m=n+-jbry5nQdclB$x>9=mj6!Tv|isd?Xh+ed!q#sbi+AUk+26;n&ABjnleii|l? zA3?k=F+!E1Bu4H%KOfgUYk7C31k=Q$a6QaZ>}{+lI9$1@qB2Pc{dhopgV9EFY-OjB zmHZ)nrv-1+qKlQauin|mCobD3xBB90h`mHJj?8g0c~chgcn#I@V;^`x23{Jf-}E@n zvsC>{ayJ>6B2A3bcJJ3D4Tiy0!3Ai3QXU_JiX2{)p*<{;|Howhy9dXz9_8ETdB^FQ z=yI*xQ4BYQn3#sVH-JdmKoT^h$^=KY2kL2xWZqT8v0ph_jk-ZflvZtQvQE$BppRbA zZLy-3q(+kHKdBPcPlT8WN*20wOBs+p{Rpp5uhC*LM9Hh|$wiSkF7p z!dL&#u}F;%enV;adE%YZcr_An&&-Ee^~TJW_t|pI7I*ep#1Hp`$@{dA)LEm=;rxuv zlbLSAO9jyo?|za6Eea4KLp4QG0rEY6NU=h^V0>X(8U_HsH2X>WbMX)JIVK;IqQ7E1 zQ9RMqTg2L|MQ6cACO3Fe$ujLl};>PG(OOYk&zJq;P>SH9r1sa zOA8Xrbg}>auX}EyLy33Y(0`=<iqTuD@@#K$$qmNZkaR{LX#Iio!<36d&AlTd?HNu)HKCa9B2HTMRrq&vc7 z?Bx@(fBgrAqH!PAWwQB%*OnwIN(vWqS(<3;+4jkW0F_GXoRS)4B9T$dnQdp_bQnem zPTB$(&SU3=(P(kn1vO>i{iM}F(T)5ul-WfDQPk(=QPy%7opbmH^mh^H=1=+sUrFoW z{}Ax`1g*x3X8kn6sELa!ijtp+VkAlhSdL+J_eGEmpe-J7dgq~RosQt2s-p4+-^(mB zh}oAH5NefI2Gdk5lB2Ru#y%XbD?3p>di<*~Sh=YKNJRpd-6a$hV-~%Y-JKl+x9PTA zPE}t!%k9X1$D$T&<~Ootcg#Lpa|gKm5rSkb=yuk=&|2z0Y(k zhN`kFvH+uR{VTaf7eb0%t^#98;IRQAAY7&R)zqkuO=~N*iCQC(#0Y>Y3&5$=ey;Vx zH4y1gm7=1fRUh0)oLM@&FH}xb{$zFS>uOehqt!8(P|KFIbnPz&MD0jt0l>8K2zwqH zCrP1y&P^(v_r$Um%-R9!%C0`Ce8K;t#^!8ca7lm|im8Ug!=k@EvUq;T`S zfyNbn80!FuK;d7(nzrcc4}d}wz@_@8mGh6jWlp=LW6LB`mVI2QyKMv@aN77pM98~rjPiE&x?YsOVO8-pP514C-&T7gD0_> zWoLL_E2{8rOxi2qoGzD}fONxtoeV!F;edOA_DOZ&kaVDQxQFBu5z*fp+fujK(-dP7 zc`0;nfCbC0lvKBvj?Oq_G;mq4}dQIj-1lDf*I(I zXp3yjHKiLE?!y)u!%>vw^gqBMOn-mAN1rgEtT;12^Gg!ev;SsB7}VMxgI|zaHo!ZV zIlK!rZ+6d8;nMCTZ@Y04aZoNGm^nm& z+g0Pi{_ECg-zSuk={+~qM)zwbBR+cWaBiwmK&t5#Td&-kf$MsfnnTR*;#`>|3MPV!|MSV&~m|eVUM6q4GXTZ^S zjJ6S`8{ZJ-3`;*vyiBp5DPoQ6CU+#F0Iy|4kb(GKV*K+w;`8<7V@0FVqhUk?3w)qyDld~!idOZICw{GI!_&gq`?Zfyje2+vtkt!9;rP-% zsM+GNLijw~Tg~71Astf<`*g0P88B`!*hx~Epu1CgMyR**c!x*){zz&h!>RbhIK^OwoAc4uT?{3q*q&yC5Xl4`3S0i)t3 z8}4!=V{WIKlTf+#H0zl!(7|G{b*Ls84+;6eyq*i=?W~;IPjMQrY#&j6n1ns7s;ya{ z9>#1VvN}ii=VocU@3!>L)|`9uI_LiZOhB{0s#*@O*25nJU8aLEX&IKe?8pjZv~fs< zhi8YvYYjJGMps9ar4&`F?!`LyvzdaK8lFY)NT8P*#-(Gj^O@oTuGZmNogEJEj)YI? z=a#hRwoV;E?ME2##A)Kdck}M0s_M0wv&DZ;>CXgVf;6$K)uM-Q$HK4U;opha*UaGz z^QiGef3~MfGTr%^B#%Cw=+sqo*|Ut+wRN=688T<*OFf=yKR$YWmd2<{&6V2=MSa}I z6Ump~CTz);ZRxxIa-Dl)yUP7lJkI03_AP%akMZaZj*f^##1qvy+VIdPdH9nuN>TQS zp0vrHVPR6|!H`DEU!YxZu)_ZVk*ksZ?mqGyhk|*sr@+CO>PO&6KnVU8p5X6*n}1<{ zes0Oc{7Msr^EETG=jQAdvf%k|UoN@kma`9?ozrY*H~WPyXaVz@&%E=^r?}kn%F`!K zJL9}W3GE1$qY=gn3sHQK5`&g7hdJh#KXyjP zmk}m-1z|$_rkqN$$W|E@ywlsWz1#OJq$yo}ky$-5EvCWk(J$;4>A*G31RWfzzo|dE z_+G7zD_+?!e;iw(D>mFLnnPyMMQThjw_5`+j%J_K&du?YoWp zVB5DtvXtXh)JfHlmtJj?;Fg3$7LDRIIpg#^&Rj}ChFW>-uV=pb-|g2YM+cTric3i; zEwCyRFX1XcBtk*Mz``LSA^&^5!?b|)Kf<<*d&T%fq`Dcb&z^S3>ao(1e_*+$OhcC* z1BUdOZcDKD_!T_1vdjkYZa&-_PdlAgiiJ6U2hp`@x$TmQBOe!36&RiZd~gB?!aY8r z%gR{>5!75Wtm|j~yYkD0;{Pe%bN!s9DgfPB0vR{wo$W;9`S;2a( z@C)13&q2RGC;iz&IqZ>k%OZwVqfo6Pb>E4UP|I*bGDb5KwBG8v-Uww} zT&2>6<#<7K`||CFVU04(fTOWE8OJE&@il`G3kbE4FpCJcm1(sT)QvE%OSofWQr6Bky0Y-=u5yT`3MM{$~*2KuSb_W1LFmhPf zIJm0t@Co{*Gngzkhr1<1hT##67&T_xRt_BPwuh6woJsGlM>i(t#(lnt?Y@UPk7(ki z`lwLa*xK1UoK84+1Vkiclmto9jH{dbA(}LWWZH~bWM3GdU~Z8C0fkuD~s||Xu5fShLRUtkpIk)Wp-%7h#-MLq6xu|I0A^d zQ}JdWkwoE7C_w}hjxRoV5{nn{KwGQ+yYr>{g*exAueJ-Tp|)DPWskl7Z=0RU?6TWd z+w8E@F1u~||0f4T4>!Z5cvzhKEnR;+RzEJIZ~lKM9Qle~;;;l7oyqXi+ETf@+nJSx zV%08g{bYyP4#A76L3B>bvr7BLKM~LQq23E~T}AV$qKPLs`OFQmT-Uk#jLlrpWc<{z z>Q{{dNuSBr`!jX##`gL=W^T0bgWcq3-9~GJh89DCd-NaKll@_IGVgrsbX6y*bf_QZ zyQeE%ecP*s#mXCg9fJ6DD=J%H4W|6 zq~>LC;IwE}JZCgm5f;W5 z5wR>P>YbRFPZN6Mk|m1EtDJH(sz9R~%egczWpS;XTPH8~Z{J0x8yC+M zZ-IRHK=9?Om>)k?{Q0X9AV7yefkp)hazLSy-{6#;R53)~u`XYZ?Va~eUlCx(62*}Cg$imK84juvGNj6!1uw9fFD9E0Y3)+ z0)7hd2K*di5BMd-4EQzpAMjg^GpMt@fe$YKtw}wYyy% z1*-t+3=9$=vVvW4KVg&_nYN#;1-2rXHOAvw{5QPmv z?8FEluB8dVNFXt61d;};P07|dI#FdG2E&<5roJTUEQIu9v7F6j>(Al1h=<3>cztmY zP`*zO0m@yv0YAT40s@{Ig5#zHfs&*dMPW2;&M-L3T5z0go_7-jJEG_=Np@w~13)Vy zBIJZI4uA(Cgp|57<_YJ1gz!{Ke@c0#Y5sMcdMs5(9gnH2u4U?}=l0*zeD$?B1*isp zdP*8%Rihbiq%po~GQ9tqI^rHcH4|UW5B(ibEhMVt@O@g5tk%O1uZ6k{NS zNo}zPVc66aXAp%;eeniylIg6JAuD{kN-$(cNOy^boQUbEqyU2plo*a8`C4kYjOJUJ;VPEz<%a8cepDE468TwaxJ{;T7Sw}7dmf^#9v)WZ z5!!!`TE8AU*aA?G+fYvo$dhcWrv~?)*6iuyY*143D4?Z{m4KGDq7PcWJ^Is%i_Kf9 zm0+Oc#yUVLja7hBo4tV28k+&7H`WKrXvG+mxgGu~>(cjS+Z^&K=VJD9wPFIwYn%eg zZDz3VfuFWq7H2C}wQUGY z9W}ptn^!}NQqcC6oj^N|Vhh^o*4lN%E6{E~YtLLj_S(z*Zy$GPW4}hj-T|$01UlF% zXP`s71bsSu8SRK8Vjb0FrsIyA@lI-N0d%T)642?Rv(&u9 zpxgGZJ1uHKcbk(z_co(H-M=Rt4?Hl&Ll0>^^2kyid#r;eo;br(PZfFQne#mN-0HkQ zzg`Y^@(S?wq89Ts)iA_wIDqzOUEauE@V8O!5>sO=N7^Q7@6gS{@C$0mxx8-H|vFdbpAmU~9 zF*=vED51bMp&!7ukqp>wv-q}0^XmBZU+C_{+}1hd58P!(r@9IS0C(Hbt?ojBz&&=9 zc2CwRNH4u~(OYl#^wGz=yDu+Z{XS4tf2T+U9^kBj$Dk--z=MOizz!$Y1|GumHT3K4 zQ^SO6!NVh_0*{E~z$2q{0Xs&C0Coyi1RfPS10EfvE707U+y0y zm4}ERV9!t%*lWjE&YQO<<>M5u!M@t?JN!?jCpds}3*03aEaV@dM(Ou<*cCnu5^+Sn zGhUP^i;OWw!abIAeVoEJ{!|=+Cs@}eMm_^iI+fnwXf@Tw@0z^fw{0IxljIN)_I_w^pMvWP(7@=-=j zS1g?GN+$Ly(XD2bkm=e*Ky7r2B=9ErugxE;5w=`gBg!`0j8u2mU#*6Tx+i#hlxe^_ zqV5ge8TDZBu2H5>?_M$09(zowy+%EJdf#HC{YT@wx?2Z~UZ?4U>vYi}hjiSBS=G}K zNAz&iF`YFXC*DnaC!N%;PKo*k_;i#S=mdK9Prv6ke9emz^Ub%f1s2%LLJRF-kwt1P zwpg&l5=kvBWEY^9ZAo_>s}57IUbO}dYBg#!p_)8srCE!1ty=YH)23OwcFU^6kYlIr zTpXiImx}5(aKO|(i^KKmbxdW290zo6OS=15b)-d(jK*8l_MapYtUXA=~d zXeJkP&0|sXg@%tvc*?&Mw&Et zNtf=^%Je9XY}uYwjwg-Dm1}+Fd6<@b`Gyo6h3`~Xk>JoFibKCfQ4-uaL}{c3h*iNS z5UWFGBh~~FkhWIE7hyFL4yX3w%ab$4!g~^$6m|rv)|fk6y+qu zft>@_L7xwXEC?_V}c{PP7leKDC=0bTVN7DP90Lpk51}=tba= z`aP^+i-c+haP*{F036e($2DzYIA z?dAOWtEd1`)M*~DNQhJ8bRElsF`7O-Q&1fg783+<|xV|O`B&JPb_PJ<2>`c zMM3bw3hziqOQ-4{HQ87zfi|mlkn^9C!U79y7B60EEfnDiGHI06GnX!o)H1s{SSI!yq$!Y?)EkKxRdyh0G2u0-19PZ;-iq^gORx{wVWj7A)4^g?P83Q)L2K ztWPiTu9c3GHgnZtORct5xYzKduhqY=^R<I^>p7w)TvY0l7_?S+|Bv_3G7W&>+ip+tt?&p=*#kPn8IAmtk%9 zsj`6FV?^6~suUpi8QJ!qDkaE9j_ttqjQb$|?NC&0APL@EiyTOpO>3GisEjF=L(>H!l62;8-ILRzKCrHM}xqN&^y-T+^mCnlU5KtXWMr znd5CPG~dA*kd(k+Z>B0-{IqIS91)R1Vq$MeNc_5`xb`(mZ9Sq? zT?cLsD*)UQ@haffh!2D95&RR1hld>s<9~b53B@WA2GasZXv1Lma5z19ygnk)0F`Qx zMmNf085au0L?TCG3F>YuP{2Wn63%}3VQ2nWHpAa)zea-&9cp#z)vQmS!G`W zv=MX;NSmPtfV2#{7^ErmD3G=WT{6@5IyohyIUJYr@EF6(>oPt*W4Txv z5J>5(lwnQttLt)_GlB&>mJo-mU%SxeYhl9J2p8_D2oY>Wiu6pBD9)lq`yfUP7qMdf zAWj@t@#6g`K>{}r5FbH7c_-0wJz!vbz`^N5K=6fxWB>&v92%Mx42%d^Sk`cGBH`iL zARvfBL}ZJEgpG_WK$0XJ6cmA|sJLiog3!_NFfasTVk*JHLdC{bii3lOi>nb2k4&;; zO;V(gIV!tI4uvAKv$slq$ zNuhuP038GoN+kn=kT6U^5EP0sF$|64EP}w2B$uLaG|gie2FofqPM6AhORd&xG~Q{o z2A$4(oYjjtsay{Lrw#=(Ic*J#=;%Hb!y_A0suZru1q%XzS8OS(O2L8w;LM;R05~gT zJpj($RK~%vvA716OkTB4)XxA=NhYpiEb;=?mGo?$H zY~8v|>(L{}0}ssT)hkz@KC}Au%QIlWoQEFDH)zmTk32HqniK|m2Lf?5s82~=3R^7% z94-Zc5Q;?Nqfo-oXaWpII2KEY!->G-i3kLdL?SVXB#KNXp-@CqsiZWT7&@Jd!4S)2 zlCxOi*lY?8M?9D70*~h~pYNhT;D}IYOC+)?7P};oSd&U!mdUKk<*q0cHk3+NRVqi- zYR@$qKWVjI=yZP8>%BA>{9-hEWit6SvttIn)Y5~*Y87O&k=pHo9gY$x*{*bv0Tg7% zmjSI!jcRDsmc~!eE8|8_GArB0FR?3^M*ngx@5bNqso+NKLTYz2N83{eo4VEEM7+LV zoT)k8QUg14c4E+Z=Ph@^1uI0=wdTd5-BISQyROT>R=jLy?oB;+W0_N(`|f*7oH+Fm z5PlUeUPBT*b0UcnH6_X886Y7wOO~w30}r%HmEn4rde*eR=iYeRTg9d*@kz7FQ$19w z(cpGXzPm?rwKVPShadL#(@%%zS08x@WPY!>ZD;;WJb3>y^}JTCp3znv%^&O1?K3^q zd#R`I^fM6_*7OX_l1Fw1H#}z0peGC!zWKKhytt9E+0B3c?zW~L-h(O3l~hsDXG%&wRYetM>Uj8(x~Jaoy!xl%%Uc?q zCcKxX=ZT=%X@2@n3oTe$YUyxV^|7ZwW$PuhE89#s+G@+tPCL5x+T-cqV;=yO9T)N@ zt=kekHGMHm&BDSNhKDzZfS@l#OLA#T(jnJok}T!UZAqCjM@3_ajt+x?#VQ;h@eu%) zq9^@;iV9MmJfYOo2nrP;(I`PtsvJj!N(@!1M5$IytwxO^wdxeBSFcP1tqP5rRcq0v zNxKg9x^zj_t(#Df9_f1Z%1fW6$k>+q=Ood8hC*)GunZ$cWo5FD5)FXm)DpwC<@69? z#*75BW(ArvC)&JuAr>s~vuIJA0}cqVWJyexeOM|0mMcs2-j)Z4eGWM+(yCSd)~pG& zZbOixjtY0e3BFD`$;TZSZAH(Wz(j3=bQu06IVIoe#O)gU)R%?r3KdCxH2!l zSn^g^p_GSLN~0;`xR(jSOH8J#@%u;zP!(GEe^-SEHz`l;BrR=+Ol2DZIXV86Ty9lY zLq%%)I0dMxf2o`nE@s?$?RBO`xp2|T^|%d#+<9o_$xkPL5PgCKX%<|$&0c|l`Cowo zq2PsR16;HwT7t7|in|s+Wr%=44H1zM5)yr6WF{!+vi>K6~Wf5fv)@IsPBa90jkvpIXJFL3Bfi{?HMS{YTqJXuCRZC z>exVOR;LzOHPle7#)kcJR%ayKB7(n&iTy%O;iLW4-?Cu?28fW}K$8^YI0kBHYS>=v$eL`SU(G4K=^YwZHB)VhQIyI=O6zN{`D{NpZ^a3 zy{m8`V7I2jou0dkMK>=g-n8vOJVG9UbW zk9a=#^)*BTy6AE3XcD@7)5nVJZiPMSwAKYs6A_(4LUI8a*)>U$+(1FGjf(H52t3X~ zNJv0QsYGT~w@6f@(V`~ZF6hzYwO;#4^y{ZEV8-M48Lp@6QiW#|J^@cc)%=Oo2vVz7 zlsa|d)N7ESQ4<6Si9%9R#hTrR)1n1Yt2SiqI?)UoQD)Mt1~0t8GG`9QORrR!H&0-} zB9SF4YOGrI!q@t~G7kU$uj(1oXwWc2^JrcjrA^oD)zh4g*}%X{CdV`uY(G0#vdbhWtmq`*(O9V((R!PaM%rVPQBE6ev^$h2ako;XUQwpZr^=P9OoeN*n-}k9if9if zY4-Bc#v9r(7#RNt>xpu3@}wr;M|uFjyMia1LQUFjT z2X*RvP_N$48mh5X@tRKO=~rEbKr`G^zGuV;+#O|Jelcbq-hyr4xa+QPU!JD}BhPxW ze|e7Q^8gRwk8fLr6|Nt{;QqUYK_BP-8?|1{b1d}k)L7Vfb$b`qmFeD<)x+fbkG1@b zj=(zB`Cp#`KyL;FCjN`s7woVyxbzRU`Y*7=8-NDjR{!zi--?O<6wLoA{x7=!zQheXCnzyRx7r&o@wE?_Kb0ks#t2d^a=98P7*~{Z zia}#j7W6PDHgCb74#Y%cOqtsyk6E$t!>NP-9G-JTx=0Z!5m<$yDzu0ZornLKkm~{T z23xRh(R+w-BTXV2`(|TzDFE{vJu>4^s5~zi4BgvomP&{Be1+goR<5x_kZs7g;@Zfm zviTlLFf6T)Ddkwueeq)Akih>zz?ZgmX*h%j1<>>YMj-6EF)vCl_gKk@l~aW)D+ih& zHlSQ0Z4Yvc#tf`881B}Gp*35IP_cr0sn9_YK3!sUGP^_@J)*KC^`C)pwz52M+Fmfz za&EK9J6$v=@x;`#i5d|t0-O|%poYKoQ57%SkVyxnYUa)Ka}&Xlp?!rE(2daO$8Lvs zLB`r20EFzv8G5Avs1tD~3Eh#)AdNM?(R)9!v&+x0@_gtN38o0x4*`Q;WFY50?FGdL z7K!{Vj7ze{c3z@F$fpQa%9t`oZK{tmA5S|*&mywDU|>S{;>s9tRFS}+iJ(j4ye_)z z{4FOn@uB1@Tq59(7Mf>ao~W3(x*y{Mv{JXQ^6f+-@>G_j18BsU_{I}dC>R8$Pr5Ru zwES?%jByRT>&pl})10pI^~oXfExX zjh*{iJhjJgZ%oE_i`h9kw|Q>f^m}?T?clbD`!#xT#Vgp;;xu;dU41uzR0Fx_~~v{d>IoD&@%B z*`Kzoaf#!UNm5m;U6!(z=Rk!xu3b$EKm-5)mzJp9pL1YKTB_Ej>~mXH5@TUYhB^v# z%hJ&86Cc!*oYMNz)+4`5xi9#4i~duz{X>av_Yy{3IrM$xjfF_rkv_2PQ|;LeSP>>u z#N;SWTPe_%MQ9qg_be;cFN72IugB8S`x#-Xl!_~m#KIUwfoswGDD^pm2XV!aMSEjZ$oir!uYD4pwR6C!uK&v2$JJZx zXf#H_Y$NyRzOC}c5!kSWBQi%Ez@H`BrIcNWhh}&;nX4>42gZ3r#~?eGOT3Xp$uO9? zW8#MC>B3m$cGmkFwC|BEi^^G;h2Er9{EdM(n=do$66^Sa5$l6km`II5JRV z#cDm&12922lnSUNXiBMW0r1a+fKs4lWe>3bTJ8Jw%2&ufzJMXDUqJ;q7uksj%p5pj z4!mcwO-_JyVAzv#8<9td*Wm5P|Cf#=KlXSWuWfDh+R%%)>4RIU<2pMbKAC+98Am(v z3q9QS`W|t)Kjvkz&%Lcnw?{<(r2U-S?mxIyWQJ|4wHLtYi}!y=W4Wtp8W#^y?Qcwx zM%dspt^4t;ba#gu|L05Gf?`v2ybVU-N zQA}z@A@mfc^h97YbYXO3^e}*f^@1P;clTZp#oPd8!#IRAxItYk4#d`{CnS7@3Zf$X zzKKOeBysL2cO=OWFftJ4ppYzvz-7pW#uYiXJ8S?WQ70|njkJ{Buy8@0DDA4w66GAY zY-n}3L0w9zQkZ0UH$5>Orv_80E|asYL*&G)+ol_(6BQ6kJYz{n%?^t|OuD0HM5dUc zAyR|~A$VFnr3Rbv{Ow(j(?ZaQzvm~))%|NMwP_7?o$wFr{BS(rR#%|Oi z<7zL(`#RVxOJXN#CqS!$oPWE;l*zd?BnUAUEIzHNR?BAUlQ$xPM;%wJ^)5+zAQSdl zJ{ROSJprnJTu2QTdQuBDSlrFjC30vahT9?ot!{*=uW{;-H%=``~E0Vv) zW-5cruhLZr&k7Y1m#*`8xZWRQu5nDbZF{tTuhhe$(Wg>wgglyc-f6pIbM8KG-M!U$ zPO7(?<+M#kQ)WVvx(EUT)O5-YsZ^Qyawo4_+{QYoD1h z=brE$PZs>YFuCiIFAxqq@<$%42CyA@J^_Hu_peC1lN89ZymX?8e7K+BQAKiP8UIuZLP^XzmK>M3 zgX>c&8)o3(XUY`rdDmLxp?>KeRD>;gzPi-L;*}bLU`#tjIrZ%7`S$cb54k89)riYa z;Itrz7|KblMSMb}Zyxq;BZ;lrhC51TgtoX1WAyMR;Z7h-KSEw8na=Avy;?fbywrS& zEwd0?%fu@g|0ar4K5L}ypk80)@SH#kgf$8X88Hf^Q4PTq;X!@>xvXSP8{p?xaPuK+ z6{iSiH!Vp0BpV3duYocdGO0Ysq{*Db8aq=R6J~X71^JjD?pQ}9j^-wwx4`6&ciKgD z2(NSqDT1FSRE93H)~3VY)(MAX3Rn|dHdVxM0!f)AToYmiB0gxLUi{cVhU*O%>s2%w zwwC~~oS)of(`nDc2c{tK)F38a9QRL1`Ex;Ra9!s2T>vHI8OK0a5d+m2hI1zwjHek0 zsy%Lq-c3Q$yvi)e)|dx-&1phe$AkZw6co^a#{0ZyU2d?0zk!W;q^#&+P6U^zk^$zcw*u-RG zV_Sezo5@X5=5#v&W2`HJY4B~<;JroHfGU{#YYEGzWRJ3rFVBBq(nM+lj4fO$}gD8eG0giy2x~(k?<=v!3e{fRd6WFx& z&`5?QL6q9Ii>56}V{KzRfJ1(9x-W8`k20~7NmoF+w(KuqALlLBV2EQKe?D9dLD|y z=zaK*I+YMQKC8hgF)2HBG2_0ZLH8XTevq?REf6T?TVKEyO@0~>UnGSe)V*w%L`fw@ z)28;SI+GcH=7z1wqbcC~-MPB_d-?J8+-&Ty{72e%s%nx?Czb8QcxO_k8w*6K5GskE z7|kNI)TzS|&8_ea*yo0OG#ttL|2#mh%TNh6rq%5Nj-Gs5YhG3H_o3#K&P8U1(=Cjl0-GmcuU^wcb9iLmx8wX*{KZ@ z$qnsX_NkK7q3+>S*j?--Clrg5eNNtbmaG`bUU!eo+t~3aOzO6Dp7#6{u_`XLCzYuE zl>VdsP;cv<^xN2l9%LFU&p|N*3kVg4T;S`TY4f{)Q%A$L$fWLsa4XYfKDbFo)GG z1$(()S7%s^vBW{@s|-}J8>_|Dk)8j1>5%*X3te{jNCaF1UdgC%xmDH%1(7S`A(Y*k zaJn^D;SMQdOM6dh$`9c{5cbW&On<+UeYtrh7>LcTE8O$i&8wwdPq+}yV;7`PS0#LP z-56e?ZDH5cECb44Y$X#=?RwGL12JXeaV7J(feA*@1=RNj0 z$9uGj;sBKQ8bH|T7jLh!D8Uq|S&;0tLXUA5tR}6Z>_++g=|t~ zl1=Z*k%39}&PX$2Vk+8#%eLC-R_zkNIry&zR$dlfvK>Trs^*DRC{ajoxg)z?;qPCW zOMX~w-=)c#vaB|E%#xY^;6yHuq0);#U=?1Z;lO@zO5T}zAyYP0U_RHu2OmO03_w)E z9ogJ(=cmdeEx*nQ?XflqBC%a-e)8bq`d8GKRID5|mvPw+4@TI$Jx1MI8EoIPA@7>r9D{gCTTWW>ap6swUxnU=|nBoYfD)Eb-;g$vj~l$fq`!+^HstD^X;>p@{_UVk^0#@F2)gk zvVo^|{DB{ALH7KhzJ#^gRGjiyre0s8h6w&5wfP$@lN;CamDGHB9E8w7iD4_s$JgZ% zi9#CmQtXCz1+PS@{XtJI1(Z{R|93dd4UX)yIS>{D9|M5lG?0M?i{Q8;sH71=kpR)% zI!O%W0jf;nQwW?s zZB0#g21KgXn0MQ4X26#4{)QGcnpmE3VGg`c2B>B*uORV4p zc{Go;j6Es2%^<|0WoiSLPd1%CW$4_yR$AS)Q!)Mlc41xke_aLSrL=0#N$1br8_zzt z=!_)elFi7hKq*xsYqQ3LPyk~hFW=+)S`6WLl zi`xrWjAu@QYPYrk)lQTgZ)mVr7*n~E8vb++fj(^egvU{9CLpKu`x-5xhASZv>=0`E zhU#4G$ao^Uy}mBiL*(rw4Cw+%map;C4PNPgE5vFVanUqGPo_PfBcqNy73tUhywJ9^ zS;zumof;tutRed)Pq^w@f`RVfvX+7NDHq9i`RV!yoSgVYqzwYmC1tNqz7e&XkNHr5 zbhI9Id`)Dt_X4n6nkz#+wqY~rC(e^m`lYdHBB>9VKFE!}B*}ZbsJgtVfC%PoJEJmX z4VK#^HevsJ*UP!@Nc8Fo5c2&08ved2;rdYp7EHd2AriwH#&2-oKMn{O$e~eR9LRgh zXD?SKJYWoW-qw0X)dfAJ3MHXFF)F!d-U4GxZbUF<)Z)dJG~Uj;aXg=y1Wg~(WZzb` zwj7GKS*y7}U*={)dLC~=N;B)(kr&1?(i%h{l_$*-khF}q=HmEP+|vsS2pX)szenyi z_EEUHckakt3U6vu+zIBuaUyAaJT$do1yhDq6sYQ(r)Lo$#+rX(0maUB9b@w99zllaDY2c00S(ePMm?Y~}?kXc&NBY$oHq(H__ z`>7A%Cii)vI^dAYqwtvS#rJhR;6^Wqvx8}_Wx|@GJit&?4rz8|#|Q$4pBD%05;9*o z$KD+G-Y$bDB|Ya`=$$|ZdUn!5RW?p5wzuTDz9?t5ampDgikmz6*UTM(uEMv;BQzB9t7@*}cKw1PAZ4-=BE zthbm-gmwi5Oc2g8$HmbBbMHa5+hQBEhnf(Jr+Wxf3|E@yZSPWuET25DagC{xFRB}_ z0>zbXpy*gS83sN-x9ZA94oXYuliLn}cbU6%oVrJ{uwi2Zn!HFXz86?ulmM_Y1V#b< zHe*D@Cs%*>#9#>^Y5@MI)W)Gs+-c9lT+;C@0WA8c_ekv3R6?dc?(ms4 zD}c$w=+y{~{+1IM`)(h}w)>}95@DQYCFd#ofNXd`{t(BCy>hbQMAD}tKmp=z+_PdC z>tvnJS54J3kbJ0XZ;R7Mb`+j59hCDISLt_dQug3hKvU6?S__VvQ~R-y8w~Wc04=S+ z|H>&kk0dWl1=#s*Q9uR5v6nm^24Cp4k%dqdK5mkLxvd9jALoX$acaNz&T>0)tozm) zdQyv^5*xM2VyYN0|0_Kd++SnzqV7FPW@h0E>RI-^oKy8m)}-&pet00G*GQxUrVCY& z(;Zfpc&kB*%+*0Sj=!b#MSq z6I+>=oy9YtSv4{ym+#xRgenUe3{6*<(q~;>+Y=n@2sBYf12Z1k;W!x#LB3yy{C$jL zraqJ0U2K8ne)wnlqn6|apyG30XtN!hPs(m4hZ0;YZf@nYpo!xS*0v6*3Z^hE{C`;{ zyhj~MC)u{?@7P|4(|)qu(>v|6Ks{}UB8q6nc(A1<;>m*v83Ol!C*>EQ*w!Qt@M;Gg z@M1QIYUpV45SmDHmXJ$Q7{A-VGuAX(CN4pnwEh#cJ(5@QoGu-Qd~Q?w&vVnrB~(C; zgte*TY*z;z9zU>lJLdmnJVhD5#qoKbA(29QVL=waHZ80)G<@1;_RrZ#OI;Lc|Y)fm~BDiqoE z&Qm}F@u@BKUOEddV3Fq3W|lX#yz_DNta~WEfUmcV+mZUiT&|io;14Nbdzg60-TcJO zZ{m>_@SLwtJm_lraw#?a`>U=;vaPq`xW%gP+`|Ped)1ZqP`a7d)$wd?DSU^_Co(?F z4p)4F5g-pN-MY5}Yj}Kw>(IOehm6vQSlF&E>=->>$Q<6z0jLnEm++_Kmj}a zL?Zw;b?dcIGYk@~@D-+1T0MGKL&CE8qI!Od{P|=zou6ai!)aR0=#bYpy zdc{oRO?6-I+^C%wHJKXV9$)uI;6Aq>W7YSNFXLU=;^Yq31Iv1(+PyZ&T*Hdnp-c-) zTK15;{RwJamag-#r{wnGHr=(~v!Kc!%khSC?a0={@hRZr8i0b1N{{YR2CpgOm%sg& zwHo=P(Te{lP@GW@*96DX5$Oav8WhO;r@O;j_%dV>(S{gtw!ZW2l_kauCzfSH$liBp z0NCj+><#nKl5D=Ix@NK%LOs~1fCop?smC+zZ&%+%=qGnF9()q7q8DH7{di)?;l1u@6o`Oqe=Sm>~*OQsZV?fr{7#LmGlO<(k(J0?;()R?vGYR z(L@tkS74d~_TC0CxI*v4Tkjn&7#m96L`A`yqy8F7AO=O%ouv2+l;!l5P6})+Bt0PF zeL~P6@!sou-ydzfnWO%>2SU%)-b0|pwR|ytSUR-gOd-?pARq5~xISZZXO@oGOA`9p66NH7Gvj~9{}@G5vCzbIYYxp;uqs!eIx763HfTXu zp?ryrUD8LdW5Zp2F0!A+-rDbp+S{#tQI$}9wwm>)zOkF4T9skn=Cs;< zZr2Va$m$Lmmo}?zsFNO1&0q7jO4~whvaRrqKHmi|!!_u^yc8LX z#>^^w$Sf2`hnFsz^3bxK@Ht?8VLUK$04CGw*LfqYq&uxZ&{ZX&e4?Aht zOS@8pUej-1#V9ZK)zL*a)YHzH*j0;%DtB9E4x@wRB_z4=z3@!_Y|5 z%EA!QYD7*k*W@$?_mjM^V*9P!P$J$Njo;cAa2;fc-1Xsc$E1H&+ zMCI8SB1R=Kgt>~D4hEv2!711W$uA?@kM%5=8jYQ7pCpsA71>>Bdl)M(KB*Zc&&u(di9D{|6gckdmg@gc~J2(WwRVE zaqDIDwmu@$UYMEp=t)nmuIanGyX+mKU(y1eK-fq^R31xNLyBj5XC&D)D^d>%>;90n z#3=dB-3unlcpMGe)*}EP*2kPaHD-i;>K<@}ej9h@0v*Ls<*z2!q}m5uZ%7BwDIl=% zEE@7Q9`fO;Ce(=~nmC|r{>3^su;s*07{o>y4?3QeiDgKsgEsVVIvC&>)@BHBOcZMz zB1|zi09Qb$znbhC-FWG2_J|C=fP)6djW_k)N2)txHS|!0v3s7z}o`(-06X3vg zN|>m}kjn|+1(enixIUm5#A-fNdo7SFaaWjxO@vQ$*%v%`!5xxfHD==Z%w$0_o_W18 z_T9R>@jen4&96`zG7a$+^qMUI)==yfkg9wZu!B9_A$PsZ$qAmS+!n=)MS@smny3=#hid$EYy{VY>WM_JS zJvWpOygP|o*HzLRq6Q*g=tsWEY4etF(mn%}OtJD?G^-ksF1}n@HD#BCSroc4G z)`Ww(CBlf@kd?0LM2{ZE-e=D&lFch#V)74ztA+^bJQ(dM?B=R0Z9Ttmmcw^0?=^Ul zd0my9SL#eB$A00NBz{CJfl9UGu)6xgugk*p&V_-SkM!m=r)c^bScjcZ7Nb=PV~aQv zt;A9!A^xR?SHoIa;?qTW3FP95m9IjN+|VK4zxfFbcKHGXbkOe?-v@CKif!S{jfhn7 ztPTdrAi9Xkk_z{{Zb7NkBcr50hCPe_S0GdQ9+#{_-3T(5t;$?8K|H%5Xy3+JE7=FM zpkJ1e{GhP&xd`ri!)xU9y-W&fXpiV3OqXxLuIsJ-!-#fE4=LVriZnd*TCmA6f}AY0 zW~lwyy^0kcPMKVF8Zsl*T5^}xT@B^CL#zjNPav#L^e`~_&7}ac!!yFu_dCDwrh`zi z&k+*4oD~&YH)9dCu#gb*Jisb8a3jp}^YGt*NnZH;u)v!%!QY?@ancGJ#$SU3N%s+lE8Sy;a7? zRo|FSUyV9``d3;`EXe=vcx54$Nwdh%iF5*t!Mu65&IQgo|n^)5ZJzY?kz0pj$S>W;@_n7dX}3K8f&-!RC!^9tEP$u%hL0hypTC zCIwCgR$X|RrtkYs`8b58xE6_wyMW4*0dZGv2c1v|idT_z4M5T+&v*G9X}DvWO}on6 zlQvvakpX3)s8WoD=X=L^e|@)Qc##PWMAJNu;+3a{#cr|{o9+^#X@^5vsn-`YQcqIc zuq#A=Cj%N`7u8p9<`sl{FAbWUH9gGM;nzIMhD}A!!#iG24xs%pKEU$N*}5!gryRCA zbBn(K=hM;U9z93gxdX;%>AV{Ud+~|}d#W23mcu}e)>mW17nJO{@Gnj{3uElhY@4hr z<(qa>(Yr9Ly3Ix>07Qs~w@YbcEJHPNj65+=5Ds5DG(PLlx|wk!2JR?u2bs8DY-(UK zTbu5NO@xIoi9i$dm&%#twS*e4D%zKQ*2o~%aD7caC|xG)=u)lQlPR3Q7v{qAX1umD z*91qDJQd3*-UiwboQ^7n4kXs9M)IMwNXAY%EfhO&DvUi4jJWFeNg(GBDD$k~QYGw_ zL0PE~NVYqXN_7C~(uB2lA}|)9L)_hhAnj?KFH`^=4v0&GhZeBViSuU)!p#RT7FgVe zNvpDR21a)Om&cEe9Z)+D46zbaOg{UOh9AHZ*2w)74xBze8TzYcP=*bzPm)7A5_&wA z-9{6?P*^c`SPX;`ZGiA0S&5}Yf(N5{Kl(G-ogSt%#(~uNRoNZtPHIHHt*ZWueJ4#6s>BG3d?pT*?b{yY35YpjSEimhxIvJWSlo zu_MA&^Ti{0?#P+pYi*QmA-uuzf(HQKe3$b?vg%dsK5za=`s8pQXLNCOWIBpzPw%9Z z?bx1&G7owathyY6Tz*sqhLe46C)P;6VHfZsZ0n@g#lAH=cpi>BMyE94y$ls!FYk34 z>`(lZm>MRhOn?Rb+}=Wt6&>^}dxg50ahp0n`Qz!O9qhyQZ~snj6Z^mSyF1u}Jw>$b zB%yQbU%%;NH5Yc&x1w7QtUKhC({_p6$Pd}+fpW7%ZUK?Y&eREw#;h%$L)@0-5Qz&> ziG>0ixWEMg@ZG)`J245PwUKVKW%>*D@2-u1h-~eayA>n}eYtsx0X;ZV-P7tD=Q%24 zY-b-vV7=~xY#zJu7eIz0clxDGm~Fy&Nn>%$sD999N{SVh5(~w2wNdtk7%$C=q1sl* zlUGG}K_=|v?;iPP>V&Sp`|@A3a^Ue?Qm2U4BgnQC!}miviUvxozkh26A4-}p1<82X(cvWMJc;HTeGf;&Xk%EFSb^ z|8EU~V=m&cxCb!f>y#h$Kz zF4~H34|A@n;>5K?7;|CQ>P8DEZ7)0s+W8a9dXRntP*8G>N(g;+N|Q$Hd!h=W1wN!c zV+5U&fPCKPb<#@=+AaA&S1a~rr3d_2(!TKUD?-4-a+P2Y!@ z6-75TA{rlB5hQuWU7DuBUt-g85)h~G-D2iLQ#0ft&nGVByBOe_<^EfX9sIstp7Hmj z<@aWs79Gp&(qKQyO+Wcg*|BY1MnD)Nmn%LN;zJM@?vnUIWSx}SSR=Gy6+*)YA>)o2qi<-8j` zcwT8cQj!&4ewUBSUvKxmVCPv#PJW)CZdkvBI$tt?+!NV|j+JpJezHHvM=-sbHK$}r zI6g_F(5#S1O?mTmL7*~9VruUV*%HNYPnZIF*2~NANRw{M z*)&T=r8YdUP35N;DJ`eWW8|v8e)(J`e*8wJe;@&y(^Pc9+|OTaI{DMLApfp*|ERh$ z+1{~9+2KS%iK&umR|@|s$C8!F?J(?ZSTyDAUZx7J8W+fGgOl=zUJp!tzUwJnPX<5` zDotJ`(510eN+>R(eZZ~FMf{n{lOP##@1jhCioj;-@W~k8W*d7j|{Hr^FRszh# z*%0|N3?x3S5~_Z9Jb5B|Zg{%v;16rdX{ovQb4+L4Rxt*@VQC!v#7eHCDJC4y^$31} z69+fQDiKc=>Nq>Fjo0W}J~A;oaObTWQko5g@0^r&5(I9`TN`A}ZFJ z_$;F!Le}ob^HpWh?*^L(XK{?yin+upg;Qgl9Q2vJ`zb2}@f+tWgumnFETssrDNRf(eD{O*t$H8m)$RyYyi#B9=9uC?-;_%0Wc)i zh&5y9r>)vXP?sKci`3x_L*-6GUnr?!Qbrr2Hz(@Ytyb($OK5!O(*4Y{f=k_&ZeXKh_4 z>Z#z$n0igtzFd_tMAWM=z?)7dKeLMk{45blTT<{JgjK0PI0cI#pAIO;Tw#RN&n_oB zubS2K^m3v}T#XAutqW`NGK^ur7UZsSM!lM=krG=!Dv3S9vIEnZ`A@21Btl+2F~X>I$!nqZe^ta_k)R?vyy0w9_qlm z=aY`fu3U@j5_iE$s>Hd8u=7kRi?}KaUkc1)ILhiuQGW)*K*aWY@)tXtw+Bg;;hhtY zoIgkJ-AzC~+|SxK>-@yT31GDyeb#2L!*uRb_XBye04s|_j9ni@CLkT;xD$ph3hxH8 z&e8+hjHI?#dCz9hn*{p-Uh8l*h}d&kep_(kU4@|H!=#{yX?CGf3-X0oAlLxN+#EKT8IDHaVJlC2i(Kg_30Np;n zD?t%iJg!b|K;JHyUEXKGQ{ zuONWDD%iw#B5#$x4dG*R+P!t<=uaRJx0ZD+HVSS)F!OuU8lC}t`SQ%+2JW?Yud8lA z*1z-BEKMSIn(K$?I-0vSjHubtGwYTkAvS&6Q7Cx4S}rL6HYot`vr%XJfxbNH$Z778 z(@BeS*cGsNp!4gGMcb&e>Jd7vEAUl^Qry?UZvcLDn+N8&YH-2BKQIBT064HJ6<=t% zKR*l%l7C-;{pG!NB~Adw+9r9M8R}wl)vlHA_1$~Em(R(r3Q&6Bu{o}9Z?T+T0UJkT z8+6NZ^rw;Ntg~rZ=XTUWc_(LD%k`}KAPxie%FB(+wCnWt!#$=Ujy7j^iLnx$i_04Q z1-w%q$mVbxe#Y>LKn^u_S2Z_cKA)^Ww_f%Ug{M0Y1gOEmIB->328suZ<2FxNumhi^ z>aOVmhlA7BrI%Ga3%fzKg-aFd%bDkZzWs>Div?0Y8h*Xu$1i7e`v;OI>GpO1%d2FR zlu#Kws0_-@crp_M>@Byi5nC(3Uo@`OSbQQ-uT@_Jt_GL?S(|W?QJY$e6Z5;NQP!K* z_y1lKe{laO?t)M&dy)7v&;Ro+@LIqA;@9xR;%i_6MEgZ%c=MeV)T-^XbN|zR=S*{H zH)d|*g&MBp;l@B1zSTu$#hX5Fr4;)1|M8)xvzWU9ecQE=I!Sbme_3&cTrl@@%r)t{$K}H$k6-b%X|Y*ToQ#OY4qJ)h|}R@8A}t(@bjLQEllwh$C9%><2b{PKb$argj|SutLB& zwM=3diKFTp7{VQ+Zlbrxa3Ojb_=|;m1t{I?I%B`$6Ma?3S`BwDp z((tQ1tCk}%o8D_{=5x@+;iSy+8%fYtn|jY?ejZdWbhwQ=vj%R0fqmcJHqniz3$kb6 z$-dAy5%xHBv33eKU6iiVPz%>|G0tHxg+I0PId|{D;ddXr%B_X(xp=IBTn{fG*ETs2 z#Yv=YxjPEG8$8p-xqEW<%R1G`qGpOc@{m{i$%uiN%7$WJJ;~7K&Aa9!10z(e=JWV- z%$Z`zxlaRm;`E3cD+8q??w6!L^DT7lLb&1_0DEp57-UD_LKx=HK2wgNJ9=SR{bn(x z?~&9ti_6S_S96tKd$!u?>je%4W-FUiqNe)G{LFZqVAK8zI_eSip0T(&-uO|8uCFyI zcfWv>5VM5`$nvj_oC8*85#JrFr%+*VN@b%1fUJ@n-(n6mydnal>RJ{|=h<6&v~--? zWcNY5b2P8|zXU#+X3Kluv5q(FkCH+MHEKzj97v6`2QYQs{1EBuRW=HOV-!PM5q z*3owtK3<%JN?;QC`}58JxHxW}eP@;1g@aVlFrf`d@0vJpCc_ydtYUgMdh$LI>aVif-5ojji3hqFJG|Rw!OS^6JYp^k=_(pY^ z^%EK?Bp!LJ^JSsCD6e-hjEHHs$Lx-uW!-bev<(sSLX&cGLQ+l4x+^W)=Cl7w$t{rw zPX>Gq3@rT@!x!%YecMgu1bWKRX5lTwfZeg#U4@}90VlZK!tV}f{!RDCJI(e7K}Jr4zwM8xHkW*) zPs#?PA@hfWN=pxk1oN5KWRvugkIHC}xn-u?wXxt5BBZ!@4pBY>}r>}HmBgS(|Ut*c;Hf}`S`L!Oz8vXt2{TCB| zbsgsg(Pw)1)8lyO9{)A@?a6inohQoa(KMve6X$_JXT{JA(g9cMj#PcMdp__~&R+Ch zEF?G1>-lWzElCP=;qs}{CVjXQuH@eNdtsr2UING5R&B_p46r;W)7*AnzAcmPzI-(8 zgY4i}?FS#W9eg4?=%T^caa;>fi?Eq_wc(0_hSwo05KINyO*Xn;IN!*s*9_tQECe7V z$xp`(29tYg|H~nG%|<{!r@01~U+tZf+YtKe-0nr~Mtk|8Y@7Mux6V0*q731^!9J-0$JGX^us=tu|xm2atCc z917;#yAOk=jfRegwCqxbzW1|6v0g}GBB!SCfmzf+WT>pFR>FcS{nyBdf_!yxle8yZ ztk%3V$tNkEeN0l$TaIgmy4@?i>Su7Mt&JGk!FFLD3h=J{zOt4umFOTDsgkV3{$l#` zO@uFmLCOgU=uw^-21lA?m!d6XWIXwouPl&0I*kghX<#on#LAXE14TyKJ` z9n^Qm2x_pT$wAiZ_STA}(x~<<%&Edc>}Go$m^D$>;L!Xan}fALUoNq-2t+1VVYA!5 z#HQ&qG^Xl~74evnZ7R%Wp&EUvEk-#!vDDhmdd>V$ai(_{UyK|v$y}j8n-%Ut7QMFE zDQ5q|f;KxWQZE2X*M6^XOX?d^^~Q@>^ytof+=bK>?Aeak?6K*!4jK2o1W!U1lnr2* zBzZWw{ory*uCBN)S1$}Qjs1ciL&rrE**<=Fm1 zS5=2u3yUaQPREOYt6GtVtOHMXzIcWw)l8?hraBY4I%A98u02*&>8i`bIH1d?yVHuM zy1&^X$rE2}y+k8Kh5vZa_S4(uYmVS1)N1B{+5Z(;syW0}n)C#-yUyCId{S_vS=JXG z=xVVO`#^GD>lrM@mDsZ2*;3R~_N}(*x!ae^M5BUIZL6urv4(4=DQNt26ewzdet|Eu;h?iI5Q6huXGuhiZd&wHDZEW zc$99?!0LJxd8y!UF8y=zGGbSMYRduPt@xVvJy!=%p1mjzvBjZGr$ydIy@2un*>U?z1!)!zLzl zXl!`5JCRBI9QcO{hjlJV`d%+B9 zAKtj4c3J*pLMI1VD-PV3JUAJU8QOoJ641Q<>XRpyT3v))nxCQG|;mtiER7gH2$i{~O$#!ca zMPfTAs>^3H$lh4Ly(WVQd**$QW@Zkf2}ae>^TtQ8r(HG29#3F{gJUp|KnOh09|4I_ zf=8?b?g08)#*7M$5!eMa3I&LLbmeW9!o14Gt1EPQqI(57T)`MF}xm zTdEmem(LTjP4LHJ^3*h2i?L7wF=NlS!v{GCZXHQEq{v%hHr#5Yj$hvKr`{5VW(w7A zy&872Div!qnYR!7-5FZ<76e*JZrt{9=5sr`Btq9e<;a2%%tyk$Ld_rCHU6VS_*xoBye@&T-_nknDN~O=rcLF=*{k= zycVk*Et{kJ8F&f+5+J}7Su^HrclY~(0fxwyMHGEUVfPAq=i$MFDSkxX-MecxRqFUA z6;dM@epr9EAY*EoP9Qx`%lEm%ngygWV^OoQh&a|1_|-?aCZ9ai=qHnElSzYsvHvSl z+FvyN!PLKINTe6cOVK}#eZF#O@~_G*?*kB-*wqZn4E(A#S_sBizyQ=W8Mf59g;jT3 z(f-wS)y&I)JKZ~VRasP!omVM|D&eCzdH80tV^xQai)qd+X$5d~U@O=Rjk1vE352Sd zmfW2 z^3*nUm%R2lkt}hG_j3E`0IPR@;32eXz6*@M!^O=XcIF4)#S1@g_llFc#U*onpi05} z!(r*gL9zkNaXf?32o02Ha8NA{R+O5|#r=UV%Ba!i6gz?N@82QyFM-${S zR7p_{?e)b67s3lZ#yQ4|>Pr%{&tJ>RO5R~LF7H2*Hsl0)6`dOpr=6l__K3f=yKr*f z?Ct_gt4w`&PrcaEsePVa4;%2lHzdjH7+~yLw368I2vAIYiaaw@oCP-AD{?k21?N>> z2}oQnF0VYK^t9;GS?yz_WS+bfSun@1N@{72&Kv56<%|4r>9`m*BCW9_Mb%RuMFn9uSEpr{WYGbV>5S19rph`QUR-Bi0!q+;k0t7>8!1 z5!31D>?G(uLc2dHQCTJDD{~ux1w3K{Lrg$ncVQWx1FaW~cXqRAXy6qp9Dd72N2wPu z1ezO~;3c~pEHt0Zwochat28bo=iSwLOWhkIsY^SvyTu87Xg~`qp&kpvd}YuNj1T*` z#0^M$u>RJICZMs%0e$}t;CJhCmFIoa*v0&`TolYfG8KFGU6Dgl)xlvVmHa&?#U}|7 z?8Ejt=hA+mI$LjvNK4z~lunpu9>b(l!j``YE2b!20%7CmAaN|9>QrJHjHpTF9VWY@rK3yIWqeNRC!>vX#!3M2 zt?#cd$vY%X7N(|q)}w9vv_Jmf0l#GkpudKUB82A}*G#;kADS1KS4BK93ut)P4O=tujks@?XHgY(-_)=1 zU6(xGde?szqOi}+q8yYFH_ZcC1{6M|*ql+|O^`g7ZOoMaN##ZMQDtWP!^g=sjfd`V zeq1`9x;cI%l{@!0z)d->tNph!?WkoRFu#YTbfxh2F|Q*}kk6O>`u$6FfHGvTLCoyE z6uK|hIv&$#lM^{z&QDB2@{i=VWU_(B@#ElQ5*w zf&|S~Ch+kOaL=A;d#<~MH);W=XM*n$1&DBGEz;oC8PYhP%JGPxlEljiXJ!%;FGY{= z0e+rvn@<5qJo1ZaK4`YZg5R=%n^p8$`;1igX!^+B@W4kc<0w$6^$GVj6)j*py{-3} z7A}CO?zewkj7sN-F&0SKIVR2vquM56X-)fbvk|gzB9#2deCzeD(=}efTuNJJiZ+~# z$8+q609{+xb9%g5^g=vnCUAN8L31!Uo0M=NB{l!zY$9_H`h3?L3pxvxSvJ*4w*biB z9`v z-pG%JsRbjY9)DUQuT4>!oG+1ZJnHeps|##e-Hy7Za6TLfAt0et9I0Gw?5K-Z5Q-N- z81ro9XDUYy*B!Xr4;Y|oHRpIpSfGE=RH0?Em!H{P+(lf@M-T?27yd@u>WY*Nu zlw^j_Z%H}9dD$Du)U7&EHKlto()(o#s9eY-tc9I+xH~F57O>jeXV)M)c5|%b$f`Xd zbHO2C*6z6a=bYsC<5?wL1gTFrL(S@Qdjdeo*)RDA+WpNO7EJCztj4Q?-k|B}e@@`B z*l~QPqN5>i%B%AD_e}T>X6?QUVPB33o&AsZbQ7eH>VOJ~TH1nyn~x>!oYP;iB;?XU z@}4OzD%uFe3L)x|rO@M&uA?(DX6Y2z;k^CS-2JsVarx=?q#HL|5OX!b z{%Xo{bj|G-*8YLnUhY3y?f&TIy)O%F0DXA||ICorvgT6Xkj94<&nkNVR0%wDs)6D* z4tg`SPrMIE65nNLxlTZ=E$`bW&Ph&|`L+9w0@(Q54F$)&Zftz(kpz&6ZAx?Y{L6_Zo&82^bWRE!QIDF)}cvfUK zr~6^#xz0c9+kn3PS+_W8_hKa~cd-W#?00HojVqUZy#b_?zF1~-(4bb2iteq{+=ghY z7ancCbn!X;UK8%+tK>w1b^mU=>6@7zVcvZH6g2jMKQo~JP7ypdqu4@iytLwGO8z@7 z;oXG{%W>$;U~IZ{8B^S9quAU%B%J=8L}fMLt$5O!|d;9@-Y7oh8BVeled?`>Au)(P52J35QXr^)_g$ zAT7BT3w^9#5xJ0MD$HLSP01!Y$Bb-c6d#RboBkvpx$j-;@TV8rRz1ICn4fa$5tE1< zgKmS(F`%T-O_SLcbeNa@+Y2NPKL^kLzI1Hh6fGRjHarxjvOzdS4@Gu)ZEhX(yl5z3 z@j6f#cE6B>Gz1Aa!*z?>F`A3Oq z6Wjc~9ew5{!WmHJV@+w=(G&E#9g5Apl>~hOUKn)ir((|D1v)>Nm>zBxl#ZXXI?4C? z@Kzpf-$~OYbQTOODLC_FXnW?kCgP9@B#`Wg-Qzhuv{L-j2@9vMH-d!Z#?NkH+FPKX zBpLsc8cCEnblOj46{#PGkXg*~SQfL?(uGrcJ>r&rPEhvk&^jrk3|EeHZSsLd{-H6n z%}#HXVCPbWu%j($s*DyT>TsGgaTyZ@==NQ6#4J5wb&l==fsikVkWAV$u#}~NeGB`R z+}XQXsf)|8e_c@Q+lO|ktML@|t-N~BC73S`tmAOBVeL{d#sc~uGUAS3yHilp7kclA zy0WQ1*{x;AS_2oBbbTZqp`79Pq$N2=wy>zsydp|Q`;2QzTTQI8wNz8uS(S4lx3>?x zW>L(4RSIT*JrzywA~4LBnQMdK z|0kKK6o<`vwQU3chZyC_?zEP z4%Hj}`-0Bif*4_qmDLtRzjgx*Ju>){8ARN2x!_;|&wj5VZ^=sE&F0}U$JTmkf&N=GKZ%Z+FDuf zKxD(#slSpCDB0j^SneOk+fmj#BUJLv!xSh-o47VBxEvj^IQPG0EG=%RIe*{&nVQPn zKUa!0ddJ^#+34fBdz|e|P$?_}j(5j^V>&y{_o;+&Q$4JEBg6z0#tO^u7=VEWRv}O8 zXCmwe59;zgqdLYpXz2Eyyf0XUNS7Wqy`ea-8+-S!DqW9=|Li*s95XmJ^|&Vear{|$ z5>B=mbZ0ef=rt}!cf`unP&%eT%QhRK>LTQTD$Lo=Br9tKqFJPxy#p5v)SO~GZ8wZw zc1}0WN@g2n(~IF>1bRBf7fB~WtpV{9G#`e`T4D)}X@I^%>YGka;~TirKK z$Wpet?8Gw3ThSH|4>(#_1`Nrb;;;Vl)CW$$3+GoPwruZ3KJt1vv2W5Ym=~_N)Y!qwN%f6 zamZ)Q6Kv$|!aSKZ%qRszD(2K~32Q=U6l@6%!_Q(~bYKFmWWy#CRc$P+0)-~7&fwJqg8`vw|ZSLmby$sp#Gj~J! zErD^!#_PDESIeE7wj7ruo|le=Z9L}H8skg;h6|~8PZp}A$5+yGtiyU@ox13ES;;k1 zS2AAUzbr%!RSxYw@k)MYQ#NdS%kxVkl_Qa3V8{6zgm<}bQ^^Rh;aS6pSg$SBR)e2@ z7D`VL^qbXAIR06bSq^M>3BNX;lR}O@F`kt`KJLCm*mvWp_CLl6+pfrIdu92pyqvVg~lBTGK^?&?tc#=qsKizx$ZGE}q z*{Tvr4* z_|&Xx*(tZ{L3Jg9J6h-QosH-~Rwz2at+PyO(?~755Kc_HW-HU*fE=4ww0GreRhe0< z1sR_~aVgKA<|1fe)9;Tkz{h;_J<>71Hvi_{I~i8tBZwXKmC;gZ+w3*zjdfayF1H_B zCS~aItF!f&397@JlrVJzP_tZb(7()H*-$QOg@?7J*(M(~R}@U12>{1Uc1H$V9?qq% zvmh(3ON}|Jx+I@{bQI~1QQXeYN@vQ=-JaUqvCE+uQP@pdUYrJ2MD9L(z*zDati9pMNld2S9CK@nMnEzR3`t`!C7Iv&{Ox5X~q|0 z^33N8qitf>W{2kCM4}!#KLAThE{p;$q5}O(R^a8YB^p5EWXRn_9~y-lE=UPgF5Tg zKi5K-7iMdikIFEnF+)eR?7N{%+AIt zr4oZTOO%)D);d(8BsnyQ9SA+Jzagt$3;dPihDKLKyvEY4@@qP*@6Jlv@gy<(t&}c} zSzBwv+R814Y?(`N^CKNGz$JP6$Nt9qGgHnqCweFsYy>DDb#$+i>`c3w_GakqteXhB z-!bJ(bN4PF!k$NI#x3CdHf_G;zd_3j11-Vsg&=$8zX(C>6+g0(whMB zs`oq&ZSC!4WrFBgwb__%$K4voZ(S)PVn4qW_u}-n(EoppAV4>Id0QVp+(kMFpxa-p zb7+^w5%CjO#a)j&Y>xu?m+|&1G+kNF#I3*z{kNXlZ}pK%6-N0?h@Frcx?<+Y8W7dm zhb`6HudFMaAX%jYQvEuAOuJM29{+;GWg&b4JendBh>Y&^e)8<-dz#HOmr!Kr>ub|a z;MmN(r;UPKjz|=pEr-GuHXH0?piCLy<{YoEV1%ZJafUT%7rw_L9nOTiL%W{9tg#Ikg|B{jW zb2swKUvOSf*oi?w%i#VNYkJTq_&=ZIuuJ;KRhNB`?x9Qke-Ex{Q_gvCwbIR*Xed=) zpcD|4$}R-2Zr*yqa`lnFg3l_YUJkEC?5}Z~z7BaYA7a!s@7y^|2<>hkEGkNDZXd!G z-RqfgI$L(u40%@T+G+a@vg6ej5Uflt{;^7qWYmhvi~7WwpM!JY_}KGrO~QK^`oPQ~ zn{E$jKrqVU;_jP3!CSr*!MQnKC%P4tG+v26(`p{Z3Z`i!Ks2*PAPdM6adq+V%A?h; zRT_aN=>F1Z+jHNo3)?ogL3hMuDHnDi7M=;Ngm#}`^d)5K1{qXZgwbvkbYF#glMOEE z6@V+#L-iYsE)Xt$^@@DOsJlk*v$Vky&2MrT+os4q8)!2drGtr`X~e7lAKIXPH8ry{ ze`j+^zv{J;p6=m`!7(Rp zSfM-#AA^+qe9J}MsE4l?3`a)P(CJ&c4r@0ooZZl`Y{zdK{AyOGcn6)K*Fn7gY>UAu zBTo!GFv-f6Nk@2t%hN;E`bOs|m%g5(TsG>d*1w+i5Uc(^z4WdrPPVCSxE!k057W9{ zv8h#N+R1pno?d8tH8rEFVAoMx#Gf@a5r0Ta0JS$XVQ%1+rC)^@*|P(GDNC=bY*S;W z;+{d#^v?v!rp=2PZoiW%~ z5}lxjnNIFm*;9PwHL|Bx-va->1aj7hB z=2l2<{F$tLnXF6|v*60;4sQJG4q=~XP;yX0RS>}K2jq(${*K|oL3YYo%T)7Auk#YA zU$CmQLw)x6t#eNsj9(RN3DRjaSRMvjn>@M!**K-WlaZo{#}YM(y^)4MDm3(`wz3NpEePU zzwdfSF?!aN?spYHHjXlgui4kvxpu~;y1m4t*J6yE|XQIcJeR`W! zv(w8Pd2sSM&+)>EwN9%4=Qoc6+R0NDKwn74#@&tkeD5s#x)EW-kP1>DATnIf9pG$ z|AJG4!CzLLca=81|NLv+8%?{fRw$kNh>uX*lV$XY~Z|9hU=rc{|YGVUlJt za{dDtMt?AM<7GESm!bw~=XxstkROk!?lLk6inimA}KbX-?mw>lL9YaNV@KB}y& zKOFC7)?qx>U6fIGZsi`(1dUiz;&XuIc5SFp^DI z$0fHhD7`{4W1!1Rh;HAv+F-JwR^0mzVJZSCaSYRUYUr@u-n;$N97N zKjCOF5S&B~PWbP-g|=Mzo!uXjy}C<%%0b*(leBWtTE{G&znQMCzMGx%6o<`xxqzVZ z{5pAzenASguiZO2xjTi`&*9SgI|INqn=lu%fBC%)HY_(#Y(20Vm3KN_NSv&Trdz0I z?WsChlwY`ZGaOzw8lJM2UsQcEa*q+!0v1i46qeMUUX3Epl4^=m7>vqp9KZcoMOM*D z2St`L)Do}S-;hz>*ASOC&;pXJt1gFRukR{4V<&B`OIf;Pt!EaWd^WSN`d&`X(-Lg< z>qP`jF$ElV8W{86`53!%<(-ZeY z`4=~~{G-`#Ba)F}{_uXue!#G9 z8P86Cii=A5KDD0uakMrmhU*m8G#D3q1B=OcFqVm$&f_$q3OTiT`P>>bmeT~hj=VLd zH9i^xn{j_U6S-3Z8igbp!GOWvJ3H?xt$P3YcUNyz*3LUbukN^$^WhU+)t_*7I&vJm zV3t5{js<=V^zA8=nBP~p@BE7qP|E%{5~1I;g4#Ve9_`ta;IQ%in%2?fd#-7z`rD7~ zQ0TiVa^8;Cv`$cSfKXlK%uTASaImRxOseKMRS65LK(5{XyuctkaaKyXqs_clNflh@ zN`bn1U_#tFx|$p)F9e2?3?Nbzy&lB{7$B{C$L}VbC=d}_>Qk6dvOqYO+IOXc7dOS` zbn()1M%l1T3bgj&R>ZY~qt`C-p8T8+&&1=lFVtI#=Dbpn1T{Kms4;8K%tKdCrYZVlXQWXh{&kiA^>w6y4FI68t7f@JpCNgbZRaY|@ zbSfndPE+cHzz+4xv&kU$biI)YQ&$jyH5rl(~7Z3=g zhe@LjX%-Bm}FxbX4qMicPhyoNQH-}53w)ZMlWjkp>;XTlusJ&EAK zaxgEyWx2iQxBj0sedFA+;`>WHyeo-1xL4!(nJre1vz#>@yVPBAXsrnWg}D_lA#EP~ z(5YA{xO$$UMhp*}8-8j^e)(6-6I1GJ6h5aQM}1{X1!U#$0rlc^r3NnyqRwDQiB&a) zWwj0V#F&$JvLNSbcf7l_I<@41Azb2yKbjA4ypX_o1@bZ=cnL5d zLyc8N2enB#*%V33NfIb(fI-BUIiAHl5SSL4p@CrG{`a|&;qNad9=NqmY~0uggbQ14 zy%XPF43B)9n`=n8cfpb{E)(KcPkbB;2M(%L#_#y5 z@1d*qT=W3ox7Ab41KO9k!A(&v$0Z+Yd7_DVCbc*ss0Y}W)jdZ%+Vafuq`Bgb*Lfqz zOM@5YJQVL(O{0$sN&G_B&T2fpEc_39VzjM7xZdk=XBsItC}%3`9Bh{z;> zT^kb%#Q-*`l3Z*B1&~=NkxHZp=w+g#BB4mm%C8C>C6i*J$mHl~5;-b{M2h&6ZiCFFq&a94x-rs;G z<4d44^d6X(Pdt&bLojo^q1#`N)GvWk5X5&@I^GVpP)u>OC=yN+PenuEKE81z_=&;7 zu^nZ3KO+c)5(pJT{>=u8;c;enlrr`=APA%~7zrVKy*rLb140nJ8ozT*CF&5EcM-v6 zgX{c*Jp%#JYti2Oz;zy+vvgoVLog|7Ehh3a4Fc~#fLIpue7@$9?R6%c&o7jg~Ym~jJ;qVv@d-1G#p*dh7D1YEE zH%+sZcr?w2lPUYU3$LX!(Zj%>SJLHFMs_N>_<%u{+iPF%2d+6FGW^tddWOhBJ*}P5 z7CK1MN7H&Qu|4LP)0cp!Zlh`8ly+KM1zT-v^?`IIHbXlFSGc zN8=DdW{Q+XagVH;hi`X4GGR_4JuWGar_<(NEon4pw_U0YNjT z9Ii+k%7GZ907+e$gt-U7rx=PjA`!}mJ|20T0@!YC=kWm7)ig9}E&qrpk{BmT?9%i4 zPn;P|+bt29F*BuLFA^dc*%i9Iq{9m;$pG<6d(io0ULVEi6`lKUm_8C z+p`%HTR?vsM+us+>i3oP@}@&{CRygff}lssA)4 zAIs;rPt!6MuRK*|*g&X!;qJ-vH=Prx`*d8`$wJe?&n!0t1GxOEoeK^n!y(sS9ed39 zAh}(lI+~ezRF#)`{AiY{Xk7$@T88R$~tx;Q_};)TCD_K2o3#U zO4>dIcm1juhLdRPna_hPAZcj{i6jmD`;;F$ZU-z(@8!Il984Ir?&W zWHL$Xgs`)mInd@^aOU^VOLKqsJEit{yi6Z{h)MjBYTTav^|RaqbJ7Z4d@t8d8aG=m zlSoU|aaYT6qF8|%3rLpf^SS-m_hTM1cFp@hkHkU_0O}h#Fj$lU1MmtwLAqYCI#jx3*<@xhs5?T4)iy3V6pK%X`>vkV;X?mG0f`LC6?cg$@wzbG&A zz;Y;=GCdtnK%Gq2aBr1Y-1aF>J&D36%*;@TvvUwU=5)G-ce|qemTytUX*2~h-f3WH0IUl% zY0b$g;vr_SQL=&9%EizQ?VDKah8T8q!OrqjNi9Jf9&B-nZ+I>t%1uR(p`u|tsksNq z5aI9Yh4TTf;ibZKe7wnw0|Cpih8C$bIkg@^ZOs{58egwtaZ_n@u7X8RmNDtc3b3a@ zGjr~6N5{FtGu3msR_qb?GfDAqmPpQFi&9xADs*(%&5AQ!0PNRG%a_K-a;U8h2#PF~ zw#RVLO2B~}Q*t`ivyQ=2(3w0LgT+au(YUE#&t1*pc_FED^U#E72$S5Jy3dFa(<$r( zikErG_C2T(E~HeF#lw-vLOd{G)P8{HG`OZWWC#QC7Lh(>TiW?@qz=2k_$Qe3mH5}A zjVAualA4K^hduzbke@cS!<=9c`=Uj6?1Jg_pT%cOvsgF9wa<%Cs3kyt)z zH_e$^hbE`h=7?uj%ENI{u@GWxSm}Ia2s%10ff5&9ymf~!b5f_x99Bq6v4i%=G&7q= z+S|oGGwr_wr>fa0N(Lh(oz3Q_GwA$GpdOj6=k1kpZc}D!SghZ!>{!0=)k_;Oo1`b=Asu{i=bJW$1 zR|g}wI|XG}RoE)6WE^D5th}+ThrS!%@9c)ki6Xh~wfl))XM4k~RgXO`aa#k`Yb=%Al8Va!Kt+iGj zYeoj_<{de*J9$qNazp=hJYczA`!H&q_7~eJ*A!(2ch0rs{Z-8QYr`ei3~2(}ll$?= zUrmprj--A1>mWI^;vhMH=M$jGYTurE6mWu`-jN7)c*4ur=^Ib?y^lYZT2&G7|4-Bv zS_LGB!%JvrJD&SsooB%?Eq6f; zzi=o3E>VX94h|VTuBP3}1l9$$so!RJ#kG=}liGR%fT66mjA4e2!H@!@1W+`V3yqr3 zKi1SWuu-2L;FX-M%BBqF7#_s}rI$2|4|9IB?o3?*A-DFJl##7K*1z5~IVj@N#zE zw+$+X3u{X49=0ePM5dBNIWzIVfN7*Hb$Pf~)2z`hX!V)`jO`dk$xn1KE^~4lBfIZM z-(@zJX{WWosjj&Dloq5exd>vA)U+fRA}fi?YZ&v2m<(x~b$M)1eJ2oJz1*cP+bRcp zJ&IG7@!1ClEG)YfR1Ps4%?N;>4_&>&huVUr}C{ltza@(r6TFI*UM% z(7~Q?P09#FSi*xxYLY%VEgMBiAT{&#g-mY6AX-#UmQf%O8HG%e2Pl0FjAgZxBl>Sz zOWUW%fz#dMjQIpnDhyYc$1yX+nTr(&C|legBNXnB;Yc6|4YLFd>1L(51eiE=E+M^y zmX3;uP$DT5g5g4yhN5Ml1c|}Hd7TG?1nq}}yo^@F?%M1NKITq1GA5Sz;&;vmX2tqC()5jwREAlh7N0r;Yz5MR%Cq5uGMt-By(Bf zE%Ce_OHCy~(veAs_>3eXECZ2*gr-N&@H5q4vT=oynUXuRp8DOanJ9m?dDD((=IE=n zS3l8KkH@Yg=F9w;yWsVir&q7q>l$!4Y8#41hYEvAL3IROzz-F8U%s>5>w>~dd?Eyi z41xOGAwiJ+y-U%F$|7J=|EbmMvkR8MR{imB#I$nu5g%W?pj@!rIN)_n?FEA0+%2~4 z0KN@wp?p8Wm%o>^qx(9Yc#4pyCMQQ|u=KA2l(6Z`wa7gYio;B`Ol7{DVzr+cmVjY@ z#-5x$ab`p^dh*nGHh+`o z?sW?N6i3?p99!_qXvhv%accsFe>!GYT{a%HBlbJExJI`79{des&gqxQ7ti zl5ZKOQ==G{Z`neKJ=_C_Z$DEOqOJ9$@P9J## z$;o{F{`ns_Inh8>HJC5`2x$CEZ-aT23e*};S|6KO@Zf_Y7_j*n56sE|81&@C0`>=} zYJ-BjJrMR=cvS}GeeT`fM05b1UG zdG!=*Ri1xk#&^!so`ZQ1DK%_5&p^MlOx4ON4|UKpUMGXm$>T}*P9~2uPilFZ2Yrk} zb}+QWJUhU15?F#7#IOSrg)oWN$*eem!2|y4PxkB4Bu#l?sLZOkDCUCh?{<%hj6_Fi|^OLx9>r|Mw1WTe|zTk{Ewif z02vkZ_nvA9l@aZT-FruGg7#)kW$nG4+)3IYg;Osuu~7Gg_DN|_Eq#A->-MR-IcOUs z=)5>sbJ*w~fPm740|)gF?r!*dVd0>1FyZ`)9_;HL$W`t0*nYA0mOU$ASF9PwYi?)?=AH`}>h2^9YON6Z4E3fQlz{{&9`>ufMWrpgQ?@7S0^7EcjmA+8l?I?i0}IIbWC zn@8K8>No{iC-;_)4ODljneflO${#ueuXgzEJ6~Sh_wnCy*eS{19D5(nW6MMm5s&ls zV4;>gIEo=fR~! zHR`=|d8uc$3ls&eoy``l9cyse;6Ak8rKjlQZBjRnXFk>;Rp<3r{vqmfLj_ROF4ySL{B?+i-soNM8=fK$Ae z%5i4?1%w_Qj|U)@0rREW1vf?#bV?Z_j|?*miRl#F98T0>@KSkqDk|i@X~lPZ%f|pg zx%!pgGd~A6p`P;9hbwFG@$XhZ;@8uXCW*wo$LPNd*=JEIXvZ3GU1Y^d=H9}KtpXpDPMZf52pHs@^+rED(^u3+Nn*)9<1A3O$mR@_!-?MsC zKaWHp&mdEFoXb@qktk%23gMuK2_&>~Ai$|IYN+14URk@w?AbH$;zoypKVtNn>>MLB zuuSsR9}dJtMV!2bT9eB%U_{Rd7JGBU>f@lPRZ{($VSAJgTfAv(l!)94|< zgQz#%d_)4`T*Di6bNk$E*PB}rv*`fa9WIZB+nE*L$SbB?-vv4>+V$t)zcn%`nv)rN z)Ehuf;D#VU8Q|#@uX73m0l3vRy}n+^0RjQgkW}o#008=cGA|qO`2aOl5PnTG9Ge;T zeBM4Y_wx~fLAHOv@QO0+iv{+^F!O?W-aUv7{QDO$qWt*LoCiv)s!CP2nN`)LEgx$N zgMq`GDKHxJ2s=2wztO$lm@*~%n3O>Za~f@TbE(hf)MdwBx_+wRy`J@4!{6(y;U?q1 zoRs<+ybZmTzng~ez_AS7h^|2}cw`g?5tT^bQEN*lKz@i|UsFBamoCFV$b^JAEI!<$ z$}oT~!h0Jdf3lnKIwb#Rmr{VG=aykWl}9)h7oR{TKrnPUx4WqUm_NUd?1+y$@?^a3 z#(Ln8c)ZB!gLZ2DGsjz7f3pr&^(9V0!AWsGrRo0F;bBTKB+XG-&FbiAAAM`I024idHcJs##S30}EhY};X8 zH6OlkRY^XVlp?u_Fs`G&KRVJQ=g#x@;kOGoz}|U#fW8zteopr1ACZ@^-A{v9{%C*P z7o~T-eM*0S$>pjPtrT1}Ryj35ivz=Ze$xBB?}76B&tA0E2BeO{P@g?iPmaRImRAr{ zL7{ce%01Y*jP~*FB4e{WxB9vqW#-XqvDmt)5ZJ1c`nV2`si==4m2@@47RK9=y*y9;@ypSHCZ4-=C+pC!GeCm4s2Y+xaKt0MVxvgY+|WYS1bWqHPVpGTvpDVTGO5+n{L#V=>A*5QME8}Zna&u zH2e0S()i9N30Zeaa;2Y3Q_7S_m^lLmGVs);?6uQhqnu$(0jU^+V&{cF1Z8y_>mlUs zh1>a?=sT3-I0_?@f3~}!@YkP1zUmv+;+4J5Z7Z)^Al@}AX+BsjkfXPOVbX12z%D*) zfKXWG&tEbTl8!$pn57?co_~}+e&I^Ic@8@4V9sB1qv!sVh}&`&{Rrpogq8xZHb_147w z>p7o#&Ukxs%l&F0mpJ=124K6>Tnld7Mm`1x#~z1o{M+dHcp-ThVehW{gXY=#GOK!txsSfqDG!80gC%pFHb6yGPja@h<5h2l$+C z@JZS4%o9sRd_{`wY@D9NGh?o@GJ7n=pC6TZv|_k>=)cf%htdB+37^q(GLQ13ll`*C zD=U?A8=g6O+(0{Csz917?swL#ISjR63HX)*y6I4B0TI`V1npA+CFPvliiR%CQ11SYC*{(=;xV!v-5(DDjib#`(+%nS?PPh+_9{7WC)y+| zq&c4?MLZ~&c=Kl|twB;a6MHTE_|$QS)`jnkj_oeXpAOtV0cvxIE5%%7S;Kx*EOD?n z88{|yn-UG})(wByJ@$KtVzoA2JetBE6^r;Iqk-a3jy>Ax?(Ge~1wgsfBpR0rg>$L2 zBrX-qnPk>r(Sjh$gN=~&b-h4DN);xn?H)E=r=c-TcdUrdjBHn7Hwz0fr`qmje%0{j zvpbcT6;*p${kb_~(>EKbjg#zHZgX-%Rn_{^wtdJjRvo$o8~vpdI<)(2T4#A(RZn>u zJhbaV%YBEV*M1)0VscPnA?_oS(;s%+_HcY?8GPOJ1VCDgTk`bXE-3~T&u)b!&)+9S z{6=^~i2Qw$%!T$u#H{J4E~x}oHf7}$tAbYizxCU@l9mf%@M$+#t@TcDD&B;J8rmo{ zoKN_7s+i80DN6jO%CJ;*G`r7SN<`hwW4&)y*WyzAyuZ1&>D`2`ZRn4O z9B2d_Fx+)Em_It|FBXla2u8&~A522g;4Xf%-YCOOUAQK3@7YZ_@u+}5#)Ck)NwlPa zBLlcc5+K++K|W=@FxL{BZV3Zk!cqCh`|%_6^wg{7h*K4<3&ZZ_~T|3 z3q>tGFSPU2&&Nk^s7hctrE*zusT>2navk%h#U$HDL1M)P1rrmCUD3?)Kv3Q|uoefq zoSUh+^du!;->hpEo3&747I%CwT|4JSXrwltM5FQ>QcPkls%5qwc?AK+yM!6l^`5P^ z)6|%@yVw>hiA`#>7t9@#mn4Cx+=(pR%QyYPXRbyNF03};^9L(NY;zpNa8!&iF>}2( z2_FZb8{Du8V&mRZ*0&1bUh?kaKIQeN{bj?#I{=oOE6)}RV-mArrH)suAJGc%>(ZW- zjd7I}%`u=aZ-#|ZuDJ4?A~SR8AYlgvGj{FUVEKixR}tsNE`94OKLZfrwk-)6eiT_*wSsx0Ec- zRBRA>&@CR1&xB-=@ul*vbM!8iZIym{KlUn~l^LH2$7dvqmA#v8RlV2lgwLjYp?I0V z%JGO!&!q!5gJ(fs>&COgTL#;H5b=RVJ9V=b@gg#+hN-+{7o0We)F-2>Z^~O(j=cTd4BCTeEseLK7VRC zjZ%32;`xNyy!PBMO6w635m(PDETP36Hw##o0y0ww48WzoQ=MuPa7Q_sv3um`-*MKH zkvpbnRlyUGf#EybWHg5)hVkEVk3j3QOYvR{-md@U_6qp+ykP_?C;r95{&8a_Qqjry17&=vFh zIJq?EQdr^w7})CYH$r zoedqv_W6`kNTu|vdceCPMWj&{rU-Kia_GW1uu~QE+}FFq5{lqfATu_j0nr;P#6(u2 z(8-B*i?yaZX9m1aZK)??PPO0792r|~X{&rgk6Nul!H*bWC6vRbUyu0@#-HZSi!P8X zOJ;ny>GE7zLkb4Q$BS$iEc>?i6{ZY4s~t9O>eowVVFcs{8E_6JhKy!eow6R?(NUVf z0e+lJ-hdxJTahU&NO2#I)or|$u~CzsFfRxcMXHWgGw{RzhLkys{1<}1PS1}$CW;gU z=FQhYBR4jJvvnDM?xKQBc}n(xKhI^(bhxbqk8i^W@b7t}}5&f8DM!4MzN#r-F@&yAqX}KMxfNeR? z3)}C#wbS^7k#Mb&b`)pdYt)*;n%ea0r0Q|eqFF_C=(W(!Fy;aLjXiq}C&hK*nsE==51Gx( zPNtLz++iG5O8vR&>Yd|Im-qJ6iv!!y|DX;cDv1Y+xyaInJ`A@)0-U*!*KmV_J3VI4E-EakIkIHV{@?HRJ9rDi<=)kPgrJ_J;v1JL#zrnBl?3-(PWGujB=-?S z1^@G}!(4iEB#g3)vM0tnJv`G}jrO;fA$S$BAb@&C92`|qP=-1c;KYk|82^*LDPGD= zacI9*F`Ic^7Fbz!R*-p}TlKgqF{VNs3>=icxkp9HTFzjC|EfB0wMGHC`0VVTr$GOY zOu>`C-}hYsY=nFuE$(1Ox|Eei3IMjdgf};gN+28GZFnnzfOE)%LsHp_%C#=$_+oHM z(RdnVEl;}JjHMFMF&wyEVP^VB3j7^J;~GuM9Rb&{cU(_vO@LXgdmZ+0cXSCBgD-By zTcm$oe0oVIWbPfU$Ln z7j3$jzcQMVEm^{pwAv`n=tJ?&hF!#xWtbQGPwMUVOf`~!Bve1N zpu2BB1wzKPIOr2S=6`m*9-_Ifmu)Y5s^;c$2feMZGM`ZNHQL+2K8yqR?L*;B5Wzdk;RpSvg$E>ZxEIdh_|si!=E{FYOjl)a6qvCJ+yvUHbsz^4(NUxtEwzs8g-w=0?s%v>(i)E-F) zthH`yL?bgdAB7c$6JXHLh-eHU@QhmnVo!N;QZ1+UMDCb>Z80vRb{fej;g^&nG2vMa zmF@d}$JZ>^R+IA2?PeC18K#zIICx5%cM10cWD9-`7p4_IYkN9_JzQ@CH=9@%bDW5K z_c@20=8tv#lreqHw0+a5;ZY&F^0O568y>&#^`qp9=115~b(`2tJz=8g>tyh!b?T^) zvzYU5!$0Co6V=_44-n zQ$YR(RQ5c|t$v}?JN8ln*?2mk*8}@%GP6~4j#GU1$_YcL)#TT%tXd6%!S3p`o#nrM z{Vg#R)8AEd-a;-szNcO|YI^`1QzS=4w~GI>sr0P`j3XeYC>Ra>O-!}ufpApV-uh$0 zV~NSnPk#h`yAETc&v@lNJFI=A^! z0#A&9LgffS(4-OPgaT|qfa*7NF!sgO!-wtkVzbsg<+qoo+ilKoz)MY^)|ri#7l$K$ zeg9RP1N5vv?~tv&CH*&BH~%WQDvc@lvD2v{R{JvEU;N3_a{}$&lRzN^w8|R@27>6DvQ{#Tk}s#4w}}sz1#|bp)IoVAG09G5$BBNBxlyqzZ`MC zUDkI7I)9+_-Qry1t40m~JXojmTMi^rl&{iTjgF-Kt8Zl;>(7Z-8r5H(6}ej5>o--n zTqx13!T73_tIwVO`Z`VjTFvuN?X%ezNACN8eRa##S0nRokSPVvXEKL=_)j6mf0L;A z=20X1Osf`#sOY7Y!Ut^xUQX3>5W;aTZXREWAlHcd%1?CnG@R(`tlM97>8g|3&YzA( zx%)$LG>-^Q|7B5fjWPsV^dHG_#~-qL)#S~LkVXExQ$z;cf-yV&zATW&_8@R{K(KyPycb! z#o$?=neaT<)A9@HUq%U33zMdIOefWDgW6_+*N+_hb>uWOvW% zu?61uf=RTDBNvh=7GbX@BhiMtdygESOW3Xl2>4?GAl1eyZF~2Abs`=2`-O%4|A-xo z;YUSD|5VtvDxW>fFU~#8OT<{KrJY?Awl#KV{r2?41obdeT9zE!$FWt#u9l@qrDbVx zt14SgTwhr-@R<#p51W60i~Q}a&tS&S6YW*}2_jQ7qucdaO|wk~jHos>6Tm-Iw{1?J zA%{7Hr~M`bFO{S&D5a11hy}@)ys-3)IfeMk_Rq=0kEn*Rwd*z1WKXrcf}%d|R8Z9qT-7-Mg*Zk@wYN_ViiP#lp~=i;oKr z8r62pzk=pG0W`PEfp?DloC%g5Gg!ce-dY+hIbgD>dHz*a)mJ*5qek5wtK-^3HH>#O zQ5)`?Dr{@vbn<03*oBO}{%_G2nfDdiiP^J9^Ogbf#pl_7MZC5+X=ZBzi+7!G!`VOh z1*E3#cHsU&fc<&u3DB>eordM_+64^kcI^Z+RJBrEib3WV&PiwT3lJzx$wBc#o*IG7 zFPM|g=c_Tu0`&sSR6GtES-`Al@|6YYfvtoF9s9gG$J5C?*fct5wjOYy)9%7rz2j~W zA>Bc+)m@*8`a1Y=a3S8O?k_Ofb28#$`WdL8Lz+XTuz$>T#SBjSqQA{^W&_&SFgOZ7 zadnL-0$1CJ#M9b@I;1ref{2R~B{cZisCpI!f7p6v-~Tx9EuDXF8-N?kz^o*lmyZ(sLkG2 zIy~=uYIgkVW#B`(0X<0;kW=9Z*+*`ONRG}X6B$?Y%?NrAb-pH0c6^u@PR8sm|4 zRaiQq;eEM#I;}UpnWBwHV+tcc1XX?6Ch1oGDYB4~4nr$`_;6T|ipe1pXxH*K5dmcN z-v6LUk$QOTw_fn`p(6=QyV=q8^U$h7ad;K{+x6dJfQa%JXufO52F^rW=)V^=u$M7D zXMSUsOb0c$7Zc9T5(ZS`|Tl^wG!W|b8S zt4xqtD=h=vAeJ<7aMjz1mPDMPi)$sSg&u1FIZx%ww8d1 zzIs{YY=ySGywa2hwS!j7%GL(#q2JP0gZ0Bs+HX_sofDn4uS%By)b;kmtYXhQcal8I zZ%l#E#Vfc0uo+Na+f~~z(%`ORJ%HBq&h*S2G10fF05&EFopWj(Y#n%urZt1?Dst$J z5vUVN^8_llPhI>^zw_hs|CYvQgFLqcWXt*aSvWp$+c`Qf0g;*r6&QlhXjK9-6`BYL zH7YL*1rH7a4TBRpC>RX~hi9~=Ah$xx4@d4swfOl71Do{oDqDpylz^nb2){9)cd4ST ztMjj4LBOWsS7B#Y9Uy*%p#Je!XX}(M`Toa<7FbH(roAlQ? zK7Lp`5Ev4;_QN|cwbWVrS?MEa3GjNe2K3jS0(~=s`9Q}6Pu0$eBY!qP?w$u=anqjw zyw{DuLa#AQ(bL<}BTMV<>+F)rx_Y{L<=pTJ483(%$D+(=wmJ4OCT88PV_ZC*iww`+ z3w-3=*_mo6P#K@mx(db$Q_L1uwwTK7=R0^E0Jhs;Q zny%Q=?CqK1?40iHRSZ0ArVG1=D$T0T`h}W~kxH}jdn?LDLHJ}dii|>%LNOyFS>WXP z3xVnr%aLc5kfYJ)QmdW!MM0qwlnoXlP7D@` zs`ZEsD&X~cI=pP6*sP*tG+n}S*4nA7qhQ2rmM7)v4k9N$QA9Q)L;1k(-L)M&J}))5 z0cY)4|iuZq8upN@VFW@P5B0_O| zi)!HKl~ZnV)-JfhqzTB%B~rzJeY&DVnNn>+-sj;79Brm)YQ&#WG8E?1?(C7WK^0aq7goXx2p^jN&)LA$tE67s_tNStRJBV$4UEejkG@&&AbqLs z1-DzoY{(ne;80FHTOW(r;cr9saLKTej7llt zOAwembkR_U5>n;DtI0f(@bfu`Xas}{Pe4$R3Aki-m|5nlF4>-pD8q1a6Dv{k;#{t( zOLvR&U`4W+=U30>^;e&suO9wY8B~+Va-h5UwigChiIACiXeGt0ym?HX8jZ^;-oqd& zN&;i!gC_QVpUgzUMP#!ihyZx17d0b|%F4{)dbOrhX+S9(WjZq?T`MrI2X^;dbGn(@x4`oZ z)JA*IsA*0GW)c0kq$0AZsuXHGlDk=cQ?Ud8@`4vKA)JVD znFTIhxV;SYPMl>akwPeA3uFzcxC**wI3vzE1(NERizCsS7{Y>THL~22;p!871i0z# zC=g54GWssPD!nwXJud#i!0xwgIVYu-oSiub#3nr88?mUY-d|``m%Wf3N${&PgqLxy6FD!PmT!3aXxJ0cd23ZmNf*l~l$P)JI4a`o_bUiUhtxm0 zzE2{eZvtH2JgG#QjBFEjnI)s!zPVZgd&P4WHJvS?>0|WVe|jKBi`;(mxNIkqSoNXJ zZGuEH3)B!C%~8L+0Qde(EHgLW;&x*b;g@Y>B4Dm?b+0_~(Ie|Hh((Y4)2ckO0y8|~ zbF0#`y_+o~j|9cl#x2Da1^|}^+qr95=XBan<^wy$)2cyNWPHAEdpEFd7@yQ04o~tR z2TD9}LF}Mt%O-DWUqLNj6Y_A!0T7h>cqYt3(NdBgmFA0}Cl<%9`^6_9%1%m83ZTgN zsGn_%0knYD8mzD_>WBE$Eyv8_ zsM|cvm^);4oE4HA=w!C+KD!QqP-sMx$B zxgv5biip7BA~C|Rm+-(w{t<&|it=wQYAr{XMliuXk2fcSg^xXn1*9N+@BsUC*cn;> zUOljr1#}@=uO^X#@j+86Fg%q}6usi*wH!^~`$nXd=q8hB+#Fglz^zM~WkM{sjuy4L z6CS7#CsG(rxBcU)Z~M3cGt^1H{jdhV1{lz>vxHtrDn=I*5T|#cMqD$bTdWI={`&ck zuC7|JclH;T?|kFZB#;=nxuBu%HIhys9SPsLg0H zSJgBN!r*(*t-ij8gX@h|RqZJ;)IdsLgkKJ8IxqowU<-O07yI<)o&?n03=K{g*lHV^ zOc*t(0tDF&=^Ev8*0WxpS(Wu0nc_Z$iS)}|Ycgclrt(V>-I4B5zK1>P4QW-Gtv+<6 zxJCL_fDWIEJ1?KjWKSP>z!6s5oq7H;dv^H|aP&%ZJu_GSap=dVSz(~TZgnyXlxA`` zr3Gx^k%=I`@c^)^uzfZj!6cC2thm|YxuLd>>7hlPUzPPy!=;_Vn^mFaXp+7#rFAvkZM*|(%qwxm2{R~bpVjS5Mfr@ra zxM+V$CrEJH32sdZKb+%x_pXm`gs7^Vt<@Sq1jpy)MTr+7tkP^^2poSnHZ%;54hZhp zu+U+U8RQSeMutIAfk9AASVSTQ_%`QM#BWT7*_K1rCILuIu9$MJVhR|YIwY4o zKE`oj&W01OVNEyy6v^o#_Hf4G)(aW0B`+Azv!5%r!IE zyVrj2@74lbMl1*j9h>!-qCGmERrdHe%au7BMfn_K%vwBP!n%$DzIGcQ8(dXDKof%> zY9%&LZSHKNR5QLl1U?SnqIIK&Z}&g;iLki1SVTzB*<*445%FP9kDZK%2M0YnaqJlg z+x4J)Z~t2RE*%I-L@*G`K1d!swBb9XeEF$;9rZsk!@wVHzTugu$Clfs;+Bn#zv*~w zy6Ky?bqzI)DOZmyG{7DR+VkMiq^A0#kqKjy50Z}>#-5%?yIa75XF;lMUQi}puidx< z0tzOlt(VT?Tc{uc9@YPCm-QhS0Yq~rA6UPkWY+b7V5bM8*7LrV@`*iN*0VVW8)`tb z(}N;wXYqt^;@PP6b4(4su~r=fI&OYPu) zF^Oz4DI?Dp7Zsp;l%6xyA057eE`3q`Wajkl2-Oe3+xEG%X|9eAQivGepF^Ybf~O3r z_5;B)`ZQZG3U8DCm5H@;^nP}3hfCD5${pe*ASNb8^Su~e{y|ADekuEa)5ce)kS@_L zxkyl$!a}mdObi+4#JKd;DIvkT=dLdfCwB@@c@ zD442M0FC35&8YEw2-A!B*={oMvY9R^94`n?)q$f(FhM8`fm}?3Gpkz$)HY4M`;ESP zr4|v6h*yB!_n*heE}(mEWlO@OMKY%4>pso2LOVB;9${dw_uc%R5M-b(Bk1VZys)b< zkH-Y-GX45Py4?1z&1g_OK17e>g15SD-xc8azu;2P#d8qzI;i|JM`Dpw=ItD+HmiJG z8Jfu3nsbjgp&-eWo!R_*7(Cfo-ADf$g+OUxb(3-bXJ5O#P|C21^e~ELB6RZuDwFpxxncF-q16={pIMk$aP z>LIPC3Y_<^ci61&)UDM;OggWgC*JFRh()^+Z?6((EIH|yQ0D{g-aFH;&~u~mUPv@2 z$$7}jW60UH-@~i_qlLygd4U z9c-SLcZM^TOauq|XW6sVM-G~zhYqupf!QeP4U7qMe$I|@6Ai*co$K`(m0A3S{d4=Y zdo&rd>QYkan&hUgtvmEV>5|Jb?v{(`{c z*|~a;dH?&sSN&G)x4TvJ*2gK26X_jy@>Twr)&Jv8ty|~A#D@uf&pWyLzgZV|#EvB# zpf0v0Zq4o=5y5C<+!4$_h4ALd(`8knk#%+iqs5;#^JSYmu7#Dtr8|_BQH0alPJi=a z^Uz*Z5dx1F80;9d@Ir)^Tr4QY0Ta)UTw`TU+VLQh`I2Z1G8_p(MoaY}qa22f&drka zQmq)m^IM0I3x(xcup1N1ZK6;bS@nc8J{q0IC)Bejjm;DgUvoG7Q0mD0wD-Vs_Chgh zsAx78$|95D%(&U&*@3nn9FqcKVDXXh3GkqhLtvlB6Y=O4fw+*t5SuqTO{a@6`?#tz z7_K~;4%){*|K~u*YNrF*K+FF1wz-}T4#r9WwriaoYm0we|AP%p#_Q-=+)HF{mwJvQhLBx>)!~5A2V-vA=blgP1M|FC6bvz0J%>c^shD>#0($p(;W<`Bg z1{4WNs0QWC>6z)c&>avT_}V;?%R9O{I#W~IyE?lhowl=mLRUBR{f1omWUq5zwy>D%Hb7`lI%4X_#G@bS_@`pUzYOsH99?^Dd z6_hy5$7pUBK8*zy_mkQT9^O(-4i5SvIzA2_5EKWCj|~qRI53}y+xF4i5ii?s)Z{wi zsv=NV*Aet{doT2nfrH*dYBhmanN*GDScu8hNhw^lKfX!IxPP!q{dN~%)1EB0vT*D1 zlasts(9-xMHC7g{1J(B`UuiS>c>zC^`!N-aP3(;Sfb>o&@7R#q%-aE*8V>v>Pz7J$M3G$2Mh8m)hzZ zjZV&*gk_OH757Ny$gxBH1IO2gM~|MJ<>@~#zd!so5Am8p*1mY3Jp#NPHiXa3JcV1K zuB&3#o};ArCI3>`&!(F2bz3;N0PcQT2V0*E)L-9|d=iZdEk0%Vh=PW!@Rpe15pVH7 zF;>E(IFZg-Al)sGT@K3mC2ah6Y(PfroTG3DTj#7F4%DCh8Lj=C1+)+#`aw zsjZmh(u2$CejM{`?e|kV-uehw3}k!E{q z51ZCR$&5(x&&7m|8HSQx$?FhTR!~;ua(7}c#n)DI^UzpAWc13&YS|npkW>g?k2>@Q zRi-%u$GEE7E;-LNJVjKA@4!`xDDBFMGVElYyc(VtiG}~^Uw#Nu{F|~=Jp4B(WKBO~ zgVvcAZ3}3fZp&x`q44(-L@KNWuP5YfPJX6 zQg@`?o?s8054wOLDRsoy?{bkn|#y8A`B7E=Dh{&M~=FXK3FC7(24&KfLe z46Nb7-i+n@0-rgpRts7?>b3QtYEC4V(#3^5SQO89eY|<;-lRiTrkc5NGh_U36wZCcON5kQT56 zM<6FCqNUc~5=;(_OOw?&RP}#LL2J*Q8F~S}wBIa+03Pf1$9_I_Tn0BsV+5%z(o!-C zXC*O3&pIVs({brc7?&-Ry6JN~yt7I{VDzow&{?x|ywj{Eve4O0vzv`=ZVFqfwBlQO zL+z|D)K&jHVVsr^RHBSgN%G$m z*`akdd7G!-;K4Tg-7VkiXCP@`gFeU1Q9qk6N#Lt!Vt+?aAsGtH#7;aLzBx65X9TMw zW|hfMb`ZNTvzb`Ee|DK@x-M$d8g{%23br(a;zus1Z7*+GaMAO((CDg{TV)_agHz;0-5e)a3W0y9&1Y4VVzgOu1(sbhuT4!|HI3!x`71s$IH1jq5K>DPqxxRDt?2p+rVV5>B&|~; zcNj9GF11Zzn5HmHQy8XSgnk^7)7xR04?(lKnUPc9K~GPz(k6;EfuDd;@i5+H{#s4| z%{DyuNF0WYkECDwwO{+SUz-X!(tnQ*1BkK%>QinSl27}}>m4y(b+0QpHLE&%9cgIDvgC0{u)VDh_Dt>h6(Xbp|#$b80;^znK<~-g9#Biza8TPHaTAlfBCNt zQ`2C!I{*H%9;dZ&@YBjl&;JbTbnPfza8$j}G%2Zi0< z>183Ov{C!JX$In5LCJkASrG!!G4`{cO@f#vLCiibTL-U-BGI9i^%n+9_Ulbw-KJe6 zwl}fY#>UEIM`|7Hl!c3cHf?#@{}Cf$3b4*_-u6r?P*2b9&&bf*D+h&*Wj2fbZ=cS; zKSS9cQQ3t-s$b|CqZ3l566K;wl6-}n>;^E)mIQLDY0@TZbWvE@jtZ&Wy~%@s9_aII z&D;i=d`3Wk)WMT2+HDFAVBLxM9y*sFDhV zCMOMit1(7xvYeym(VQ2OB|Z*+VZO2W31<=?f_f8O^Tuoh!TRwMWuy@(V`pwyz~j=c zL_{>`Q*e6eh*oQQRBO=Ef&s8yAu#NLCb%Y_W;wK!We*G)(Qcibx^EiT6O5{8x@s8c zp{VsCLUVR9RQgg8)nR+x8q%qa!p=0Y)93?WO6@X#i6#II#XZY;s`c4q(aOj$WUH05 zGChJ4XqDBB+TH=HT+rpI2SBIcps;l_OJd)quCxO6^xm6OHlj8gdD?61%pUo6rIxex zzmv&iS^uCn(cQYK={IYdlVGKb74^`y*F!I)9$H@yy~x#}O?}uar+S02R^{~TYQT|< zfF4^y%uT`|%@B0?r}%?52hg9fNupBv ziT&i}bbd5p4d7`-EP@>|qu++-uBPbCS$><%8R@W@Zo|kdNzZ*O>~ZH*#rsRvJAA3 zo%0-&Jhfi&=73<>wC4?Z^&x;F5o?1@BcdLpo5p$jY6^YmJ#WIwg}{=+tSPIynd~?J z2ta@1uNgtT-6eg13SK@gG(Qcf`mHKUBe$0&4|-s#>Gf-j6`O5_+bg{JK_fboN%PfS z%Z0#_oK0t`*R`0l3M}0pFJ9Q}+^)5tx2gUnKu&5k*Ii7ae}uUT{u_gOB=T*rX#`@^ zG|s6WrHRg|z84}81H(ZO>!vyI9Sc+%x}?#7myZjL_*e}7EC$cVP(5DXWgL;?+dYQr zm%5j!C=HYEyt+HN&D=)r`uK^q62W4cZyul#H?ahG9t^gG{jUR&0++Xi}Q4wH%4 zpW#Cq=LlfHhdI_v^_5{r?O=TZX55qP6vqbS{{UHYh>KR#A(SOUb z+1twz<0J5U_O;ql%gx+@H9_xzNrVeYOFR0spgGzqwN;n7LH@-PZ&vr4_M7cDcVSap z*Un)1hI##Q*EI7}_-GA%->53oPF>I$4~#Obmwe>XVDi96Vu2x(lq=rBsDc1cPLX~*G>56--pUC1|kN0$W zWUmfuP#$M1ftX)X6^Qq0u+w~i90*htQPS)S)|vXbuVHeO9$JPR~Q{KA&{09++G0`0Fw~*p%y4&-shxO)^{++yPcKfQfb#Bk$ zZK>tVUfwXKm!)KSaI4h)ru}A3^PKwOii**OVR-w1>zSzAD7iFF8De2MC`_eqA~dG6 z@oLW|@HCsq$$C`J;%K*23NBgMwyRHb+jijKD!q zr0&zxSSpc4yIw=#3DeUA<~~F?M}Y9i7A>j+>C3%^OgQ!-sB9Mg)9JKVP!+ebLqIMp zUf4hn-9DnPLU(97WS7bml`VlZyRnqY7PO#UEGk>Zs%&{$Wy=*l@1Ul@;?qj-sbuY_ z5d381c$cvsKOfm_W-1^nOWKCyQy@8m3Hri~mC=x%2AX>7&Y0^CpYo6}!zG63Tr`mKRfcFXb&_dHCv477WwH+TF z>8OG)IW%1d8Rf_PVllGNUlQGH~tpZWjbz+ix!UBPyIFz*{bJv~@SFKzJHnF6r3}RtR(yxez)m zm`My##C`^CCLjZ@`OZVOgrw+5%iOnU}%2<8{6gc?Vlv`shO z>%G2c1pdR=sl-lUlHY2`!^dnmnJBvd07TRSFVaxj^%Kx+FYu;5+QtA#4_r%izhW?9 z-=qt!>Zdj@`X|}2BbhyUqOeFm>H%Kz;S=y$dX`BYMhBg)Lcz?Z3c{(^o=0ngAIDJb zAe+FmY$B)XNr8T3Hd%=51EDUaX$Ti^x^A`MF}Gs4T@1He!pTV!?-t4JnPqca#PASj zWA))v@siRl3F0C+?Uk5YvlHTC;>ZY^WfP$cvhm_&6WE?jB(I(nXd?3&q&%R?{S#wq z<*Y)l;d88ZP$0k~BG3#t%%dIB`nn>J_ zmG`Wx9(=HtHhZ*(X$$Z_p2gJ7lmRx7We!$$QrnnNceUgdRp*ak{uB4NbH0KMz)jDe z??t}tNr?4UALttwq5a0I!36G_$f24P$VihF>jTCArm5?>`~JfFNV)A5H#c*#?!c`~ zpVlIrXS^jQ=%k4ns!4&2G}*R3u>F~c?0qF4z+<$ZIQ{?wXQX~pkk8BYH zRj3`6OzrK>bbB3@vM(2?sW8CwgDGJW{c0Z2lyoCn)q#E`D5NEVt2l!zJ!+!j5M?xW z>H7G!EhZYW8X)%VoYFxsME$l_he1|Oz^t@^nA~gv(1)h3EO0zL1jX z$y3v=&_B}d$rLt~_N=G9Q+wY?2T{0mXa%0fhv{^7pvCTFCdhv`3FH>F+-pz&Z*|9P z(Dj5OL4KOe+2R@V(vmSlwse_h`G4SAiKNj$F*<1FabuZng+LQLAnI<7wQZ&4Zx_pk09~NrHt#Z!L4BGJYiEpR5Rg#NFtBj&2#83?l2B05&@nKvuyJtl#_IaxY_0WN+bF=%(YDyU zb{#r(>DHrHpZ)p`7&K&fj(ospbbzPzYI!A_@)_h#m(ujoY-I^E>f6V^S|hT|1)&o96FRf_|WIc z&tqr6b8g3e|CbIQyvq~+Bc#K}B(tL`2>?9|iediAH?-PcD#^@T-GgsT+S`T%0LmQ9U!jjVEgPaS@0A%FE- z48F&_$qe%y*+}EOg3--IDWl5hT6t`!02^wTIvEV?Pw*3HiLVh3{e2Fl!kHJ2k#GWq z$L;tQYyZ^|D8%MpCL)DXCmd(tEC}b3@K}S8;D2-CQiL@Bk;8Ao`AIl!!f6*yo^bkw zGbkL8Z~)=Wzb+8()?t_b&f%VL^o3(89E@(xOrWj_Cx; zG@hE{+iN79F;O~+`2?dc|C;i|G(|w{jonwp$s%Gba&wAoZ0)l#T0Zop(pL7LUVn>U z#o7?bB_~n+z(9pmi=auf1#>{@l0Li9wECiDgE-GP5Rr)9iv(1{!&oQ|hjf$;!@Y8( zq2sM8t;fP8d!jW%Xxz-8ZqiCbI3j91VG8#U>9XU^LCg6y$~aa4fR?P0)JA1GrALu(>d~xXr=>js2jM9Jr%p@D?TDr2 z6EvqGbK3vP{ig{TqIhH@=W)d16X31C#o>Dl(y-`M1uKdG9X_`$)?3x%P)UKvQ|F@2 zM@0YxBEgj}lvNNV_G-OnK}Xm?3M<8)VhII2!P6lsC3Mslhz=R9h%5eRj%yL4Cx$UX z^E5L1Q;XJpI2Un%Q@B7e6-T;E4Y56nUzO%J5Rp<;-AG{U6EARK;axOaNu$emsQufw zfI7JuP9r$sfIp>niOU2a2FSqD2C>^?=o=~1T6i^)S7mX9#Mc7>+JMFIA;f%lJ0dZ9 zoI&X@Iio@cVqu+2iC#SjBDS0jI~$UNR+PRh>Xy6Xh_zM@(h=qXIB5fsHoPx)B2sWL zZ))=D7CJ7vCesy+H1;-#3r{jC)fR6b4o+lAda__A{ll0=hK0#` z_g(_}157&{9zjVke}^)tbi*5=sT+}urMZWa8c{_86XCHyhfc&1K;*^kIIb51bwy(` zUBT$wzHA;Kj4EFYN&BZ8aQy|hU{7Vl@(B++aF z7^(?~Ppo=3oiyqA-lz1j1mu^;^ntv@eXpcrwQEn?lYFW5?rP^L_cL98>G8&f&uD}Gm`HiURA~LUZZKE%&6gvL*&`|}-m$_jZ zb^eWy3-{^w4*Tui#68%bAr20rn^UdNL=d@1M?7ldZOaseLWsW66Oxi zA7w#_o<0Mdq%Kh3Tw#}olNgkq`w1bcVs_{kFb%rTlzr1t)dAGm?>cQ-6wn63HYK7Tgd9Y)RJ1}6{=9YHR1|}yFebLky6rfnMr#A@Dx&S$5XXP?AVB4}Dm7(DR4}rix&-}V zW5D4x0J0jg%GPT@Xd$4+XG^uH^1m&7mDyYN>^s5qKi>6ywe@sc@bVFgOqam-zo;tZ zg_OPX(&Qa(sOY=Lqk8DZ?8v)bVx`%g=~C;H`DOJ-55j)HG1kde@GGCV-GZ zL5bhZVQA6oQm8x8tQA7geh02|qvOt;$b-&b5zkSJ46`-?_p%@3KntDX^;9{~JJ-yv z-5}C{kZ-F1!=|0E!>KA;tkdwS5(Z;bGg1TLRGJqUK?uVSNf|vDy zwxG(w7$_{nXhe&_L4S>%kYmsbSb{Q|CHW%xyJvela04NF6V6|}InU)^Lt1HUeclVG zJ=0KyMyyUWu*cVAI>K64YRb&=nN3Tt?}A9AS!k9snT2 z&@4e$Pz7P!b8FUjdUZ1T_`{!FmHps11iypdjm6Md*j&O5vP>99y_Pa`EZM~}+A&l} zv$Sk!$>ax772r^C)RGiEA zRLm~`Gx&1eHkzCKo?zvlG2Lc;!e8!?0onN_7rfG)SJOequLWr80MwunO%!2L&X!s} zEZ>)DeSPP#^}lv2=xpt|;6MCx@ekRLt;Z3iDk9+!)t%SMj^l zN`eWLziE(@6c7h@Ad(J{UxUu05eIrg{r~^Vs@uFH96yL4?*3+D^6nQhOTRj>@Z>0~ zdNi_71%>8Sr4jggosaO-Jyu_S!t0s;4&4Ij@wWJWR(cR=ewp|n)K`?jbHbMz_J8=# z343xXZyg>)Z`rFSM#xNA4!XguSzZltwaQHhhGm;ID%6$N+r*a|BCiA6)`jb9cTWDIi5?ae0@e_-5abLrOz2LN+g##>;|q*_7?E%B_!0S?U_`ucTR@cxHcKz1uX9 z@3$U(NGl&l?~7OAnU~*i{6IgBZ)0fg)|cN;H@8VyBmbeX`DM1P>rvHmDd=c9VWoaR zt}AW+@*QqM`wxp^qUB!QvHfqUYdZ)SS{LS*=}*I ze6f|8pz(!ziYcL#GRmpQHRg2g<^FHne@!RL@>{@6k)_)Akvsnl47{l%{z>$Ux9I(+ zi!QEZ#bp+9_=VqVR`h9$)hXY@zi!|Cy__|bd;hy~kU#rjMYC%8!m}Hj7JsqddJg07 z-=}{N<ECTQfK^TT1Yo;f8~F_u0ABMUYUI4>Dxb{m!ta7 zwC&7b(-r)$tWN9NbUoiS_$ksg0T^1$e!;dYAeIYihy@({eiZ(E8cVf&(wNA4mXpbm zr;j)7{;PcV2Xa!gWqS!S07#Of9mm@rmJ6G*PdpNrO&I)Nx#(f*lh57`AN{!Z?Wt$* zKbYj=ziZ!Lj%uO$0P%H;n(~*|qOT{QK0otQZUtI?G8M`@ zRU4oK3f6BB?vGP3?@3lFZ9UVEBb*m+OjwTgl*0GVJTavssyvBry{|+oSYCOOad-8- zUuE7`MExk2Vf(kO-h~sztSF z01VjrH8(v*X_l6lALcU?uNB-Xyp%hna3%BYSuBn&dh4=YX|hzj%gVXcub0e%^@Qc4 zT^}$gCOBqvZR}CJlXkyBypDcS-U``l?HTu0IOYW%PyJS~yeeaA z6Dl#T-neIuD@^cEd1Pvfdahd4>*RB5QIEN~VHK_}+Y84q=xYjXU!zEfowyd}^<}@d zVU)C>Kyba}Vpi7bIAP1f{qC(s5#9JkW-4#u4SShje(9(wrxnzG?y_L# zw)hpp5KIoh&)(;n&X|knFYLFguN16x)lnIyZKh@>V5~EfXA9J^UBkwBoJW)LBh$sZ z&v>iw?dT?Zk}OorI1K&n3EqA#{^cvJmiHWv(JFs&eV4Bm&~w#E8KrHfb{1fT&ODtY zplj~q8lh!-dj$Ei^anm{jdqsP=1MkfuN9n~EM18MO1?Jlhk4G7Z8&6X+-kiBURxP` z6Jb&gNd8j)0*@2K55Io9UT^UI0+Oo`&UPRl@9sZ{%k+W`m>8F}N*rUwLVW-P$&>P4 z2*V++M1Zwy`HI#)z%?3vxaTfn5`57>e3C4lFf40DOpDI4JS{)viQ%+~Z^JmMc;EOm zIKp+d<>u;poWDN#7`D2siKnrI7IQ;8-)h}A#QAb54wN7uS)Z;&iWI|(BNj|1c2$n!K@OSY7R)>PrH`?$hg9itKNIo$(X%vvN?Kh&dzgjp zBS-J4Vb8INnO{On{%&?R|E ze^Q)Bl_y&@7t?!fwaY#a(f!_bb<0g5M)3^j*Klx#LuPIX;vF*YjKaSLexK#_wjCTx zAyn7^TPs-JPh-q6PA&`YVsP(W5zX>+((mW?j!tbm?ETRDw_)`85q=44aki0)-;dxDAiBgyA zMR@gW%3e`GYo4sVuhpbP1DA5&>9qRSG#E80KdFY~+#7hMhK<2SIk%?Aet}f@M@F^Y zEdOgAMuIfOB-f4(0WhwqJyK|c^d7)YD?*!qTM?MGwC`M2aJDv=eHw0>(jB4y#FFY- z3ANl^Fx-nOW$XSsUeGJ15s%fl){A+Uj0?{S(BAK7C#xgs;*W+TtA~i$FzBYTQ%GX>)q)12f(?vgMs7_(J2t4b(NdSW zy!{0RjD4;)CETf`!Mwr97n*oT=6MC>zb9F072E9S!JxVt@$!zdMOwm;I`6IJDd+40 z&(YKB+%CjP8`{Kzos<;SE<4^3dX==j!LhWaw8G0!i12{EdmE7x5a92xoxTmDocW~S zeT_bTyejvh3dUHBe){Jz2Rgr!VFYTH~|vFEgi%`vEd)iuyY<^Qp0=%?hmx` z9zKDGLUeTVycxF|cE}PDg9>FjN-BO#<9e0uUTF~jLJ5^!g5oo~eF7NYR}nH?4{-%5 z&y~w6AuGVKn9Hnk0Ph4w;ySd{aYZ;k@sV1=d7WHuR6g=UY%_~$4DWlk`Fpx+JM6FH zno<}~!GjZLeDiAFMm7i?E25|zzDbyChs^PvcF9NJBL?tk5rlYOyG*_hY^~6G-qe03 z!27Tmcf4cUZZNX{h=fp7(a7cFZAbMYL)>=UXr%Zc63^^BN9$|{G*VxE9jS(VZYOor zHbaDnZbyuU#E+Fk;@|yZyKt1xwpt_g{zDlzNZk_t91Vl6M34my+Yc#1Q5k8fr_W{8 z7vuIcU*fNf1U_ zu@w#C3b1Yw&NO&ML8epEdlF&0k}yV}mKI+&t`L)~%BK?r^OiFWQ{a8DX)xEM{N-r@ ze-}L*e%AU^v51(Ixsrs2q{fT!$*VT(r_pMVMi4+5DCJa>Fr3%H3Rlnaar_h9JP0J9 zGoQ=t`R)Bv@yk;D^8!ycp+hDr1aBnjglEq%g=s`Syq`3v;>1;l$qwl(=GZ-btRNZd zeQ0@37RI%9wC@^#iDnhzWu?YlVH#)hE7|4RWs%;nZr=RGY%>qLBbfK0*;R9zYf}4e z0V0@A-sG9`rX@t#Ew=lLVLwqMb+>Z0g&hq-GESNa(Z4HWNhz4OP!efNRfT_^m17k*E+%&o++bv?Alt^mM?ky)^cWko+8fr@4kjp zCrI=gJUf9GY=(S=#=)_sKj&J()Kp!m@!5e5xix2s%sM0B>~<@l*^Q?{$yb|~zb~G2 zd|I$e1rBs9cYTZQ7-qZ4%Tf|g5AV4}2d)!m%kRSbPb|dJx4bF(=)x5%_i;S@*F{14 za$1J_rJFVXu5?i-Aaa{iy9^`arn$6`f1#$GghJ+P!UEBs~)6s;BPcCC5Lw?ZNwF@f6-^!#sCmMfFzu`w}H9F}FF>yu5h|B^A1} ziNH1M8P@;iE?QdK^ybdX_Vavw)k$KRe>IUex-nBqIKFY)o47RwrtnVx&T|QqzMgZX z0J9;&!W?i0xq0)3C}^F$ldW-mV?-`GQBQt&v88<|-( z%Zg6SZjXeHrH^hHvO8Mu2}GhI9((P7hG@kNL>GCf5%*2`mnv zHnBGXJa-DfvgxL#J>R(Jd3_JvfQXFpn~*LRc1W7#ODjLL?HHjKT{kk-k!Sv4&i7pS zdX0=^n3}lRsk+Fm^4>wO_InDyUmL_^hV_^BmbuKmdq0`Xa96mwpWWFP3KF?4cU5kS z)wM(^vR(^$~9l7GlVzTz3q;=p~zCgcPKpV^}3~$0vCSVzw>&+ zq+itaQoxxi=uCFXBR7#ZM80)0C0pg|8zFPi^?EXY5n>zrP*!BR4RFklw~~-Gw8kz~ z+2pp6@qNIDuSdn9a$(yXLie}~z4uh3Drs{I?FemuJXZ4l(A%m31XUF?wkR|HQ8it~ z)}ZQ@a$A(UqGIbnFG7h~1FoHIv)b6`SGY}O8mc&LJ5uWn@TU?S9^-*mJ^;YXDB8)U!zc-m@;8`#-VsE8}cAHYYdNY3*@j{d+sXu{glhpQw1d{b5YRxqL{i5|Ar zcP@ZgRE#7URj@I#fM@oK_S76N>Ez9j6A>zdA}(4!qA z(Q)A^WOjY241Qd~?82<}X_Ry7-L{uAe>;6wx-V;G=Y$)3QsFW-rk1dK+fCxeM#E&V zgf*0&ayOw{TW&>zpcuqnB(aZee(g%=j&~nf5madHdi^u2BW(^9-l6trxl@= z=vz`m%e*no(3aKexZPW+%Q~w?mnyh>HKXV`u8m&-Bo|+iu!6qj?h{kFOz7nx6aX(0aN}vQV_DzrF{%c(zQom4tr?YmQE?W zuV4ZC09)fgtKb+Xp@D4L#2{qTQW+M=NziO(HOhyk-DlkH>uO$--2?gQ z=C+0LP?8C^l(#MVC6vfRwii6js!-qKLTi)|MVFb7_y0Xj{9MvEs3s-U?k-foM$sjUH}r7z;Qqwr`# zWr9v4j6aqwsEAwAd8E6g56@*;*g_>W(!kLf)oX_|0Xf8_;gXj)eMs4)ce$eF^+lkh z(c;Z6sFuP{gc&tcCnW;rvz33$>C>wiKcXmtmIMo=TlGEBFb_IZPIq2G9ybX|gOg^% zXobY*JT76mMjW-Uh5*xJyS>KFjJ{U*Jjm9BCQdpXCvbEOwB$)UOiZvdZi7z4)E==X zb{FO{iaqGF$Vi2ED8}=+K8%VsnA7c0okvZQ397k>%c59K*6Y)Z<&Z2hcXqyrY36<~ zzL87dXdN?4JUheC7Lj0kO>prH481r)aj%vyUpp_WgTWsp-4(u7{qpU_@{UZl6@swN zK9i3O-Ht1UWA}%jY0)CeNk#8Yw=u;sklObU5d|5^Dae`T1qyi#^rgUo?Dfo=SE3%~ zQ;a(*mHA60ow8|Kgi{X#aYff3vG8GEnnJf0$x!3m&mQYN=mwB&9}!2oA@!K&rG%pT z%lNm2cZxu5_1^S$U$%SOtHT!?%M*3zPj*=Kqx<9;4-+WSWf|XDj6+j+&7V7NS(y)- zt=Ox+@BeI-N~Kb%Q0*LZM?r&y%jC^l@dLIt+W$qR#BCFpP$= zGZc-3x$=l$f}7#?ZrMK9-nZi+HR64lL&~e5TjR!G2%^9o|{0P-s15)Rv<8XeMZR*u784@U(w1rOzojGAMJczU-3E0fHYoRm%b-JWrn5RFy-A~3 z<*H)x`vJ8&T@w`FgA~ zmUv%k(a$HLw^LIajM&`7=B^Fd!l0!4B_5iQ*R9V?>~r@FMSQJ3L^_J;ak|RsB%1L( z?EFNz2+$`b=20-}|5_+O9J?!SobXNM^V8)~v=kRUlv_SvaO!l0{b~A%pNKR6g1J#Y zQu$YY8&yT)QAC&&odb6wEa83!euwQpM)Km`tcIoU`2T5}zrXc`x-ui&QWmMCa?d1>psvXZ+<%1^PU-*{!dFFf~uvGVu$BHfw7BYVbQr8#Y_ z+qZ7T^fem8yDeFgqbhy9gO9DuJI>{&*KhshCi^<}+gwxQhtb{n?T#V)_rkX=;n#gL zzeVBs{Quk=MDja!^!DQQCU0cL?s=Mh$yY>r(tMlW5j}h-jQ&f8=DaBq5Z~I0wEi4d z|G)cjT=d{y>IBActIF{%ci8^;PQ7Q@xVUdicfN1qT}1Tw`oBc3)$i?h@6IKTTA6!~ z!xPRuD(>0LzZd&?T_(Mr;02JA|l&P58EI!u>3=?8;7jtF|^Od!44*9rI{QGF| zh4e_%OmytY&DmQ>$G?;~>&J`AmM?_=tF{dPBuiS1aXF0Ukoiorft8pWFO-T_jCUT6 z4lOm%J+SDwbDpCTxm3`%%d=Cls9g6}(a~uPo08;Cwr}y^a4l?y#(|K~P$$4M7i7e9 zG>S4U_R_pVn_mV`ygS5Tw7rk1C^2!=0TOyJ)MKftx;{C%C@W5S1DK(FJ7lG5vps4z z&fG#e{-wk|V@vr*l>Y`KGd5q4g>gT;qNA8}OcUw~m0R%PTBIx1#ZldBBc@1qc03IW z+o!lIudrFQ!2}r}xXzl|g3hU5c=p>+KDrBsZKKCn@Mcc_kp-`FRDvaAgG{c2@>clcv2lRV1C>0ypk7P0YGBT^7OH%Zm z3|-ASL|5>-Ow4NOPlEsrA(1vlXi3-Cc963yPENxF7PB=sN3N1cPs)wJD3zXG7?b*e%^%SX8ecSt}8x4VtiR}aPyxfrB2!`3DQl?|+`_TcmRo!pwu@Rwi)`vozlZ;%X5~gpbUelEBt5jEqO)+0crmeWJ7>3w^IjKWG zk;%!vDuZ`y&50-e5#bYn2-d47bN6r|uuTbdth2{ZzsKEN>%Di7PO_i3e1tPaeLBg# z;4sk#P#^v3F}aC1kFa;`Og{+3&i@}^z9SY%YE|52Z1V%vXQ~fxb#)vbe;dsMGyz=% z%J^iz+~s6NrgW%B{0GSnG4>`!-JqJ1LP%`Sg|`wTG}fogSqjc#bfUo){a6y{8rSU_ z4=qJGka_)wAPZu55Jtx1JH*`m1KniYUV?tL(s4duD*Q-RQ9|cIa!$Fu6p&`}NvJ~# zRiE67AbO9Q^J9p_7yu_ha5PCUfdltpt$nOlgW)5qJ+dYuYg)1ma>k$ zs@pooMU&_E@Ev`0qPkH{Qysq>cwBN*)TzwsH~Ys>-^@$lT8kn`lg+KUMFF=@uxW)u zIOeu6eT3jDwk^}Mqd#Szc@u(Tr?m6(amv|YGjw5d!)V} zcL-?C@=afmjU7ZZjcWtdDyEE$6*+Wo+*N{~H$Guo-md04Ug8*%n2rO;Vt-|+%0e8| z!{hRwMfaSKtI0Yv9yVadwDwfy zpg1U}_i~=hl`(QF@i-G9ZdRlz<0@G42m$-!Of=6J^F1%OEm+!}d{f@6y|E&g*BhTh znRRkf$7GfH0zkH>zyUzpTRAD<=|<*H3wfn`>Gf9CnL98!bK&xA8AQtsM~XB@UIOp* zQqVmVW(gk7c-fsuKv#;A9YMzE{=1D=_E0PA>S}RO7R_o?@j4E zK1h${KBkljdh6baTu(nTLo?>krYj&7lA3NxQlOl=wt`nwPor!I#N~V z(fajD==kyo$s8ihjb5&bDZF=I--Ot!+9u!Z8O8dhKew|pQZWtG+w?dn$_kvzL`&9* zX0xJOZ0!FG9umE6gGJFUDx|GM{xKXs&e%sm;Ei=lCq)iv53ywAUw-kDA7JQj$dY$B z@bn%YHoYG?v5yP;u>Z?3D z^StX~d1GXo3N`gJ=#vC}v@@NC~^6J}oP8GTisnBo+RG4y$%B#9pdwBw(Ds+aib z@j9!e?Sa6z-JjtW!sZcLn<%zr|MD`hw?-|Y+vh{~hEt@9kBN7Os;D4<>w6i)CEaa9 zUkcr0Z3S#e1-dKv#r_C&VNY*QA;0>`Le$h;7d*y^8UcdPTcN8e@S;sZdv}eb`2^!>K}AG+pUrFz$mYwJ%Qf$$=LAZxK6&#_T>AXXms$2J#TZC9X#jo znS)OY!k>r`mnR}AkMJ<>*fL+{pB6jhdCLRLVM;GOzDBQlJpb8pOdRgh^wu9Hnm$Dx z4*r}%um7`)lD?v+B{{1NL}1i!W}gcur@@ojW(meL?$J!MZ7N=%PY_-_JfTKg<&3ox zSExj2X*}0&SFc4GcHS`4+E-w+vxi&lF8mQ_U$EfG8di)hHqxg+O@a=Yhz=o1y3{~k zpeS_t0|iw}Gq?;SptHTh;|pRg>n+=%GER>(*|l{$-C|zI%udfP`OYp$G=*bj>U6`W z)8gEcLy-kvL($H&o(ZdgvP7n0v;-#7krlG)gDN>#ODl>VPu-3sWLC>?_)!_W#T2vD zwu*X6x03c34G3(MBUVdycik8AAXl=!d}^Hv6|3c{D5(n1ZZcdBMy#+G<;~NE+mn)6 zRN1y_N~o)#_Ov$mp~4=Y412WQR0|6GuHW;c|D{+hrwDF5k=3HmK;dPnN!9i{+Ilm9 zd{~tmR1;R?CfQtSfpYN?!3&Mv(TKRcJ@un%w!)>d0diV2h#5&jRaDuzb2E&BC36bR!b;`J{Wi;Q; zbNu@OIeJ&hy~2thU44R1^DhaDOfEF)w0&VT@p>nRE;;bc!jE=>WCJc8w|K0$#n>c9 zfzH)^<>hapVg|M?ni=q1mwU&cY6Xg_D?JOi1B#hsL6O zwyos1o|$g|%oCT{1erq1Iv#sJ(s(PTvh+jd5b($T3z=snR#hnD`4nQK^E|hh=_K|f zpF*P~Y9&sMMv8HoVbWj5q%|K!2t_Rk#hkLM)ja^{o5^>o2NpsSDSK$Kb4O1{b$6HExxoH8WSj5}E#8Xr1jXLm?=6qjQU3k%G_ww$ z2ke;_5(Od-)f_fl?q%=;iABauCO1b!)ls5NsJJe-%_0!OlWIiqBjcnu^r{~ILf~j9 zvwOO3AuL`Q3ynMM5LkEtTale1K8XbahC@`)tN~dNcKW~Ys9#6(^pS_7!osJN%3O28 zoAl3!?|1k)d42*GQeef6xFUQrD!G_5lVSc;3?VDH`xNFNkHRiJW{np_3i+Pcg0nxu z$v5zVR#Xklz0i4`c4_I*SKzP7qfINyf&!9mqfoFg40L#gJ1R6>0uu)CQ%Y=q=WJ(? z3VBh`JB2v2AQ0vz?ddw+%|Ri4fq~_LP*9&w#jS3tSbOODaUBNGQ;@-9(M`hj*o|)J zQ)%H)hR-Wkr6NzN@A&r`GA9LG32^eKAVUX;Y9Y03s9Fpc6AF~-sNY&~O!U}#{@ZD= zyVhHFhfW3(oRc)6Z=lZl#w)|FJiSE7uaUJ2MYwQAkIoKLC>)hAw|np-h5}XV1;iRy z@W1FKfP-F?{W`$~4I;XAcF-gByvaJ%JOgHXdCAWK9UFM-_AZB3sa2_#{z_8X?d$QM z3(=NlyuQf=HM8Y#|ie z12)d@h7=~*O6#*4u$JIkIxc&DcY``TN5D+r5|0h51-2fji}&{(O-Gw5e-7={nWRnj z+JQyzNG{OzI_mjQ@HlXf9^}a#qJ~QJTrNF0*v5j;1cvQ-fZz!1Ej+^M%EBVE_0DXt z03$FlzoljUBz&Pilo1L167qkk~aH6}lN)QfHJel-_F`deX&wrGuVP1O;F%K(0gx4b~!zQP_kCtVSG>nA|Q!7aSY>OCjJZ ziUuU^hOYJn zyyJ+@4;?;(fze&Vgk<{&35%WMqP5=)3lo+?*l^hwK0~?NAUv2c0pUf+Ef7BRc@Vh$ zO86mpDt$5z*bn}a*H$J@cvBLQn1M9Z)O8@&2|;UxF&!)MF(?2x$+TUvr29|EL* zFf{qrGn$`{@i)^EM3JM@hx}k} zJA2m+7(W*#5t*s`1&nfsp>^l4&*zM6GFWzo-=R4p_C`Y!u?o2fB2_^>RahNOur2QH65QQ`1b26b-~^Z8vT=6_?(P~qI0R>-!5xBZ++m}a{O6pv z+uuCQOV`ZTUDK;pRj+9;gptAD&)*a+pg8d9Y}=pYY^0eBy}s7{qU&5*;}EAt&Hh2> z*K4&+5iy_2T-xS8jgMUR&HEWc2;DgXeq?`hO;eJV129HQlRRYlXk)aJrPok!EHc3+ zRad$Z`K#tl4@)T6HuRu#7S?QX>`#XpadH@4w(8{gw@5Ijy!4|ft3viD?D+8S=`IaN zTD2hhv}3<;Xu12Q+1#D0S5*IrTfl5KB*r)PAc3_U_toDlDNe2#XUQec!;meJ6~U1oM4CC9`169Xq%NpmzEw8Rtirx|Hfy^Jdk0l&_tjhZkR2 z2xPORRo{KBM>feYT_O-vW+P_JDe25NWCpWVU#XX^XYpjqbO>$DCMQav7Sddkz| z^c}I~{wKNZhhZXKAp@mFho+4jx^^;%>ty~@v!N_h1CLXF=aNHn{z}&iqKLhfVzaREZVwIPszVyO*JqGcmu(H7d9TLdMKo+odqCo(}=o(Z8`O z73=8rX^%^6ngzQ1tvL;%)&9KtKLO9adGdXAJSWXFf*`+FKSaQRJEShMXYJ8_6=sN^ zbE(B)j5F$@pp5}C^m}cAjfQ$eWlx(gB^iG(r7%)<&nP>w!%;Lf-=)c`tV_b^(Y@)S zoT@#hp_M$PO?#qaJVW%oM5d*6WnQi#ZC=0Kr?PAZ2nOj6ie!qH&Jrr(We@IO!HOs8 zQl^gK$`7dc`e1?8X~qn=jD*Jsf;vPmDbw3gWZFU|I)a%xqN_X5mYl!Vwdk3#i7w$a z`0<#pIb8r(?a^)t=?RDuOT*c?4w!X+ngPREzTCHd-yV(P!mnFzcj|J^YrWY8MzD#z zLA4@9lJ^tiL7_n+!lH7a>+*TQNK#wK(N|a>5oG8t^R?fs-?{oAQ!Dh-kyEdB0XG0< zSnAtC3|h1FK5(UqdO!C^Q_r&5>j##~>~N+HqSP(NwJJ1AeT01hbE5q?CJ#c^INS-# z6{G)IoYP1Hw{{_=eptRS=pw}L(S;JHT=;G4{AlF4V3+ZZcX5$wXE=c8nB`3tv=Ld1!ZVDh_yV{gQJ8;9KC%McgxrDF0lZ^BPe#hyS| z@0iAX_-nr{8fN=X6YXA)+6V}>SZ9<0$%*;~{vAz@A+dmY%wW{UJWgv8=-(y<&f5ba z2@n*!9*zGER9|UjnT~n&xO%y-wjR&q9JR5(hpO3j7?VCl5Bm-!N^eV1ZsV?MK_ZU4 z6}vNnECGEm{5~b6135Z9h}(@0`$Q4_uaV%`-YiF)u?u`$N^Fi9gL_~KjK0hTL6Lyl7E-I? zH;&a$Y<2b>uRoPbag;EM-s;;GsSfjX5_FlY8~QCaONAQYh)wJ}mco%;vD`qR@yo~NRCf;JV_4^b#mNY|xdUgzeD zqA1e%cI6AB&9NSQwFgQSof-S6iD!ofgOk3^&JsoH^RI zpu`K&B4mIq1!q~e{0!W^H5mw2%8bl}*vI~vIo9}>)dHxmHrv~ZxbTNq8lCFMTygK` zH}Wy+j*`TbWO;Ro)xuliwV3d72Y8axk{BGHjK8 zwS{wKk6=RHb3w1`|M@~d%JnR#woIZXX9821-W`0WkxHNK>O;h(nD=M4orIUmMQg8M zn&m2XM>&OdjSwn(7f+y1?8`lL+c%MzwJ?Zp%o^4KBs*=V_?>l1y5pFG%ZCSrY z;8}g!Zk(SRpjNW6QTGOF0mBxK9{&z9YPz8+5PgcrTT!HO#Zn+~a$w|k%4I&K5kbhs z-ls!oa$|35Hxrt32&BbQCzh(kYh=N_%X3*%V9)<8ELTx$0WnoTF?fj}9eY2N@g3Xm zj7{=KS)x~cS)SBqt2fTqXN4Y(a?nVVruKvDwcpC-!`0Lc(9xZ^{L98!;r{s@1U~xK ze_ql|I@3F5-?(}je;h0gIU)mc_QojTM<|g-R{tKm>xIY7)z;AbQ=8tw{_K?GQ*O>z z!wm>g3<9XIeoR>$qL85-L`kenahlK~>3qbN*llc6}3sH ziIhiegENU&ti@Rjd2jB1NC?)uvsPrAVO*f#XntLXS%@x(Z<{Npl)!e(%Jt4F#Lbvm zSvzgd%f6Xh_T^saBc!@hr9%8OG{QyNP%dC}Lm1u8!Vf}jd@CQEG@9(mnOHCnzg4*+ zO(O;8qd68-lfq{s2EVvP#?dWG0+SMi&yGgO4cw7bLf!H_c!Z2zc?|b>a{rbr0Uipc z=Ii3Rl>y!eXvrS*9c)n3YPWH+q>3-ov+q?}`l? z_=jm%$_!h{!PuL}QORAmi;l0Kl|5W!9dN_ci+c`jszQOD76pY7pL2)qT1-Gbx3GiF zu@NHk(+vOL#rkI3<_p^<;PHBoO|*c#U%Zckys*I3WM>-_BPo%lu%M{W+{DauZ+llR zEm%cVR#H)1URs$#E6a^Ah0}5@jq0kU0s#9533t}Zacmq_wNn00netNx6bphcm1p>QFRr!A7)CL~CSx+E*)M;Qr&$Hs+O z!`{zhw*yWL_Z?g#c9!&o0*0j(BGUdyHS=L5@+|H!i`7^?3)cg+{{(|9y3L_sapr{o z>r|8<;9)XbM#))pmC^w6q^!12JL?2$U0X@R!8B|MgMin5K8X0gH_W>m`;{-W1i$eHKsm zK*&9?+$UxGq^P4qk)|s#YaSycNQtFA>%QC^eGvY!HDvJLQ+BC=tGSN#A_NEj7k#;_ zIktAbLLMAz^zHjViy}y?qR`1kf76Y}mz2}iRN_^f@GzW4AD~yBV`dw#a$Kz=8@4f8 zjO%TRMUUy*myB3ozwoW)YsgBm*jg-V0lB~nvoHcbe`BF6pURVA$Ctu3@D^C>UJfm9 z$nRfSour`tH^aw*ln7&tYl8bjbADda^p$vV+71}u*ot_S*YxxeRe^GK=f_cnv-YSJ z>E;lFh_o@9uk2a#OkJiWcisJa;;p*g1|uxQSc13fd1gM$!H~v%gIK7jLN!aNYc-YU zawm@GRodZb&_8HdP|J^eiaGDl0mgP!sQ`wY4EczA@AXC81-{G&B$X3zj}Xhsj(~Rv z(+$^XUOFAPrza-LP7WI$UWN{?4)ozW6*q)pvbI3d72Zs37M2wjL;9%8n<;pRkH(KI zxnda7XMmk!)Ey)?R`>TlqZl1cO3FPa#EoV3-m5XvQ)KrIkV~scC=z#8iP1o8ht4NL z3P7Gt$cE2}_HZ%ZgKYbA^@#u!L;;1u*#J4WH{32vC~agS5}X(WGjDt~sKG#&7wx8L z-VfWU6p$RX%BciPju8BD@iSFP^cdFJ!UM`)sT*_7k@Z;vX z3bQ;jJLL^yC)FjaREuwaXlWYHHXQIHKe@T9+E)xd#H$xu`3-f4s=EFhbyWRM@z3!1 zhmKFHa?zf|c$SW4TOV`VUTUwo#d!wmZPFLRq^orbk$nXIQKxN8Vm=y6?Bfj zhS0AJniEsvN)1a+%>^bRC3C}!wAgVidaVi@C7w|NMr~pA210ZJ+S;tCg)gGru!z5X zlZk@*U+t{<9NwJzhVP+n6jkb7XK4y_-vGk0$G`i`{VT2GG*mLzEAFrC>>kn-O!wOc z*0+?rGA+R|3`$g)QB&>NP8Zsh7u~lSzXk(aEKTz0r*>L8=C`^I&0g5!OSSa%_nlA2 zsb1#lT#9`Bkbh;RVqqwAs1>@omHqszejPejis<+G7$Aj##fij7S)ERDR3@G%XtklByE7I+eqD$i=-zx_Xt7jxcjiL7mJCg!|`_`0f+F zt-qAwsx>h(7<|7fg91S)9aiGfVp7GdOtv{$!Z)Hu)4*nd+{1(g&`ZM>|FjRwha30s zOiO-x%*=XD-LDb}D>zv|igo64>Fx2PP)#|8{wqkDo~j}!P5)|XWDtefukMYPqFLKo zcXGThL$f~ls{2&V1EqlN{|S7lrsl`=C2~5kvPHs^p_ALkh5b8-(LGvTB`PiFr(2=@ zOsOW-ar%*>s!Wb`5tZ)EYA{wh6v-vBy+_dDo&%A6!_SK~FQqtum<%2H1LS$XFp~=T zHVme#+*gZ~tjeEN@=4f=yRwWj?5=+anUU1FHR7A8=}Px(x`|Cg%Ig~n#4Vvra#VNL z5>=CHX5FyplsGkpLUU{gJPuhtk@1o`S340;x9DU@t;`l?eUyt-Ey$z`8!@p2O3Y{l z`09KjTn+IHn<6SM(I=g2=z4H?w0pmy_ZwZ9A>zT}*bzjdydq@yRnzfwqw!2s8uJS6 zrU-0L-6J9hBVyu6sK%P8sn5@aM9ERL0p#SVAcLM2ct4S9+@4h0m0i4X6u*pr{EVp8 zf8Ac8t-$eu_Y`5Pfj@12cj&#R&-xAswIHsQVI>n0(Y5~W>;$i&c9yBF9p2VZU$j9F zR_7zQx^|wQN5&?pk))8_l{)=;JkoE`MB|>f6=k$%h%2;C3!g3G<-4Y5lqwrq5Z&Vb zf{$qmly0!xA@2RCJ_Z=(R!rkiEXAccy^nMm7bVbFM7VP=0l1-RUh#l`?o^e(vACrD zU71qUapcqT>2rXRi@YgvmcVjXx4f==3gGwhNqlGb<1&1Ok<= z&M}7ktu%SZ?0I`frfq^kclX{X%LEz>g>|mTaqDU1cdm*p&3N)O_{qqPXDnAFrc7+B zS_9H*yew?>^0)*Rl2uZb-jn9?@ksV^ECoxX`Yd4*{f?2>nK8%!P9(_5qB%?8onfw) zb>`H)U=T3ABOqC~S+}A&JoD}N#zXA@@!We_m$zMxo-zfo(y(&z`2CRqnQuRpv7-xs zW4d%j`wk6AIP7BXEz}1_<@f_9&fHYh_-uE79w>hKZXw+T<79arf7WNZr|!{u*-?}2 zFt;RPjXTAIl*mhU*o^6+Cn9pt(k0>!vzV8`oMd*=rdWa&V^n>kO4jsoy1HgWt>>wX z1aHdgclxo(@PtSn(r!i-pI#C{xL1#_<$k<4spk}H<*&R9-YHImk&1IayG)847~RQY zN|d~EjxVbtsQ+A49gQhcGW72!RHPC8IYSmu5!7?4rqrje(!Ozsd1VMF8Sd*X7g_MY3Vie zXpLS6bhWt%#D?Kiu-v9-7Q|3}EZq#@z@Oimr zY9?0dn*n0IvxdQUA~D~AR6bM)3W7ofr8Pc;|89gR*+VlzPYu9@;t~mE)yxU^W0Wj{ z+`g1q3CQJIn5{2RJ@SsPC!J^4Hkj{E>@}?P9?oJ^5TPbxyg2AwM8DF_@7Wm1V8k$B z`U#^s{^7`=3l=3UMQ5^;&F>C3@*an;$IYAg$3+tOVJZ^bA00zk-OnVq$t68_wl-8K zg;(R6(IZ}yR7;-6P0hHz$NV^WM$~5F^;`#~Tdp&qpq9LOyHfr`Y))+c%qU2TXUVre zdX5TCgRD~b z%RQVVd;Wu}z!FW2PskU$#`;@{K2xsjuIp&rIN^{sQwZOk8kXD$dFD-DM*G0Cc4WO^??`gi#ws`6-P#}wnb_DA7 z?$a#RC{^lvPeB}Z7NPEKfBv?o_qK|#`{T>62h@uV4^hk2DXtAXp)d_~ika4NeD!TE zG7db`Tc!B90%=RZ=}!sY!3M(df2L>9<6-yKPJFWt(QCsWaUpx326PO2&Tp_I>e~Su zht;ILl-oLaU@Z#c2XMk#*5Otie$aJwiWtasIS&hILGt@*mHk5>34rcu?ZhDeMFM14 z&BqTD-}^O#Kgi2FH(dkPWd#_<*i0m+*zFW8lhN z8GNR2JaNT~+IV7@x{D{hgfDVMIGQ%hnjGE0_L=4%1O0B)d}x;PVrw2-F!Hm>NEPpffCV$_!E<?HGWl5 z*zwD*mP9`mZhIuncL?{4xIcDAmy1dEo;v4hhMgnVUagHJhGn=Z#w71O)o!^&#|8(J+#YsiB!38q? z@@`JR^{qFfawaC1A{@^cYLFU(!ND!lEq8)CeRHYn@=6e#RarkuBnX?tq6#cz`H%gN#qGRfzdW)!6_BS?jH z*a@P?<4$!{e~X^3<0ssL;J1W~V0f7q|bO`AZ`5Xayk@0&z3>PYKA zuQV*A%QZxUdg!CKN|nf0sawZy| zBfZa_c*^E(iQMU>sXQQ#=>4x4PEyf{|CjTSTBhPYWmtPW4*X>$my09gr4X{}e=!-e zpKwd&fT(9vtlgZX!>)q-IUc=)3U3#kk~tI>6EDq)A}Fi@T6bn#`b7+$_-bjzdKbrR zAi^_X)|4b|cng8kS-`76Z{{?x0U8q>hHl_kr_}Se$S(!5%L<;wHWK&IOFcml8%3))x4s(+X~zx|9Jj0F@LxGBqo%uZ;9asId5ucgSQ>$7(GYMM z@uoPzM|UXDw0`TNsFdoD!}OQSwsG(rn)St~qJoQ9J5{7Qjh5`!CrDm$-FtW3vZ7cP zvmCBWr4@3&sa!XczI_xQ8ECUUs~C-hQkO471j7IXD$BGehArh>15UR1o0p5u*ug%- z^+cak?+W2Ue?tytk>j3=?e8~qFZ_RcFDoJS;JWqM` ziCEu7(cNLRe|%AuNl^m9Ayrv!fX)gC+G_e1^rm|)Gm{yz^{-dzFops&OJs}HZ6Ki$ z%-jU6l12=q3M2pfJ@>Lr{iaes+Mg1(<2I!qL}Jy|Uj$F;k4waH@c)opi)k8%2<^ zK@|fAPjZ<=Kj$6E6=nE>{h;tnXN4c!y7#UXBWp=YEoOK~nz>#-)&FwWDT%Ng#s|}h zU|eW-&9-Fa7CcQGaqT3TTqQCM{XWSc<5-nS zWzF$MKWciH(2L!|_iNhjsL)T7=XvF6Wh3LUH*z&mzMEnXcWyD|I}Lp7lPkXN_xvtx zz%>g}QPGyAc-!CUc3N-OFUdM{1+>d%sUpuqZ6b5F1x&aa{PSBtr((w%j2+=uZRtaV z?DuN|hs$#6*Dh*mKav0~7=oxrOOCqRXp5kS({!fpRfS?c(@BoJXMy)aMQYZ#Vxt>` zYQ*!yhex2WMr3~!Zr(Izxi=8)2`x;#P?a9%SeqUP$({bzz^B3^p*}&!k}uqjUV@Cn z_50VRAQ9%}C4DAaN`ssdu6|03vx7D@ysXUnjmJ*|fZ{yk9=^LveWsf;Hh@mm;Ldnx z@uS;ZwbA3S$5QUb8;xgJjW#%K`9<8Sg7rhp8@Q-c1 zq6hH8!rGQ@W!DPZ8@qy?W7yLLd9s=V31T>{l78qVO}}2N>LATgfS)d%Cfm?Lw~W+r zn@i%J+q7-vz#-2IVpS%zQZg5kYzdrwhJ2+P?mC<;zhbX$-pF9SP zhMGf^CX{80qpNdqa;BGNl0XET!6@t_wQ%bBK%|XBYYMB)r(-gw(tXg8eVUBp+rS7L zrR@EdQ6~4UEvq&Jf02W!!^1z9TrJ;Dx*S<;g2<`@79Id1eGw*Fe{|8zApH@N;+cpv zCe@jWsq8@}O+{_*)@HOcdV#)qydvXae<`?J?l{d((YwBB|g%Ew| zrfdm2~Uy!v4PeKXNPcZA4AaPESe}x}z4emXCOX96y^7*-ld} z9)GCP#aTtI=tMq15bj@+xkJn9GAp${BlM#t8k`)R6`uB?B!LOX_>q{LBqP_t0Rh*K z;HO}aO1P&Yt@TX&Aqd13KMEvba!L{k<(oP% zcvs976*ktOKfY2X2potEs4QPs0`*%I>b(sb_yHIzQJx*K5=6Mg*WQt~pRZ9^_`&Eb zV^N-A6Jr7NqB-@uqK!FH%p-cFKG$}*S@n&l)_^*J5#y@+Ov5UR!Qd}n+<$*T>WjDt z$WJP(Mje0+Qe{Zgp*&{YUPm2N(1wHHyK!LUWk-YF6AtvBmTv9?WSUs)On^Ocf^>#jzV61AhXAak-OykfPDI-DQbxh|0;dXoB6hW+HDQhqc}EPp^3y!6wAkKB>KHPk%$KLXgipK0yJS#>(8E?YI|SXJex4 zn~QyM!fmc7%)N2NU`B@ykyW0$*_>f8>S*IEJ(hmf3*rZ-A-+U%qNFWp#4~y zo+gNAL7bV}b2GV1BRqK_o4ZTF;MDT(w0=^5?x*(JkXb0X{SP_@AaIFQ!9S4juOq37 z#Tf%2ic)FDia6IDUJj7#P^c|i42ShM33cBdl~R#kY)KV%njrD#%0?ZmnA4gW6V|i% zdU9%xL(snBTTf-Oy>}EI7Wd)HYKUs1i6OK&?TqP!Z+j}lt$rN4Ak?=JeSmUm`1(l) za9)VZmLTD>-94@9q=1&ETDUTQ4;mXfWvCqsW_xRwIkHpf@3&v$*=sN#5r%gt16scB z_v`NtTuqf{5&#-hUK2<$#!s_XwyfT>{CJ-?-UC*;dcxMg3!G#kB$@?VfIohG=r=fY zlmc8maP8%;>^t6DE>o<<57;PM76}b0{ei=TewLd=Z?gh)P+AA4H5>`uMc#Iq$sVZo z^jDp5+FimugF-5t^t8t)Nzg@|rjC3gW(*_~%obdPM;7k7V7%^mq9EiQ}8 z-j}3{kdWTo0qw9)+T~Dn>Zl%#T{FRSGCbR{8uu}{>!=VUEl~mh|&gd)b;*Bumd+mJHLYlZb3`UmK*k4Z@#p!LTjDIkE`;M~R zw`$Do1HaAEdI7D$p?XBE+L*ee`c6H@;KXI(wBM=jR`M zTFpdQpb~31v>WB4lR;2Wxxhrs#ii;mKvEJ{)N-@kbcB`GlWD45o2g{P8};X)?y)Sx zu~`ZqFy^f-?9a$8c6&eXO!9`ZLw{R2`{O zqaT>!v#e4Ow-o*M4%Qt-2HeZ#ex_P5i-Ke*5{-_zlmsl@j>Z?Z= zawy+ND=g}}IGR_j`B|(Y?1<9T3@)mR_gYO)6T13>Go||1A(dL)y;DuSiKUrMo z9n*Hq7d*t}pT1)Kl26i*@;pNme4xJ(-dBN(Ze69LURVD0D9+A6t=Lt1>WunVl`#gH zQW)}x`<5K16Vr$*OODftMx*-5Hl3X$zcDHGVbK`wcJdbbo=3aZq%EUs1@FKFZ{(UXYlB()ry6LfKM zST%A_++T?f{#2Q(q~4D)i`&KbppWoF2Dk)1h@A^DnPqi5y-D?gkCdBTXdoO#p~FKunUY(U(Kog}xho9O?Q zC+L+Foy0XC=s()gw&Cw^>rgP|bYlNsKc`;VBH9##!bGnyZf7WP96rbvmhK+kWnWVE zByrD(XYyM|&;(;UPtNoJP7t|;R*-m&8T=9m6YZPb4c@Gu8|uM z`;qp*w5#@}(Hpqc;vfX~-hEj^lQIQt&ts1rgvh^_T) zcnTOUhQ&n}<;Ww9BlQz|p9Q%_T2N%f>$CC#GbM*v)Gf4Lm4KFNSJwr4;_CZGjwfiT z-=dp-8OwCF(dImkbfKqt{CDcoeLBxuqY|z7|JJGh2wGwJxC(D_qzQhyQm5ZEM<&kc zP9z$U-*i9wtM#$_8a}uBx^k6 znoI%;Dfr^!>iakmdAll~(Cr#QJ>&<7mAI1l18=wY@Bh2)ka=b$N?E(8l+jekPGy9a z%GhPCJL9ag##t*w%4k|8gtqL`RGPwnUXS|o-c^!?kXhF3^vRB@7NXm&hQS==wEwEQ zB|}xWWyhcC_ILRRc%@diY$b8Plz4zGsTY#WqCM{hJhK^o1Z-G>A(&f7jH(ei7Ho{M zv0`JzSQTu89@zqdq#~(=Ad%`zwEi22g;7|AD2nmg|Hha0`|t3uHvbWd0y;rt_DsM) zi9GTuf=e!vE256*BU%ydSuvcM=)~{bT*hDZ06(|>ZLCSf%xjEBY>dA6CwkT3dG!$s z?+z3tMwBpclq2dG)f+h$)JAO7qJr(c06=vS`aT-a@qBccZ+8A(B@cMF(kY=}H#mlL z!-N66=IG6^*AdC-ohSb(E?NNL^8fg^x4+H>4x2}is5LMrI?&)z7?KkjK~7HS%>`Rd zQVIbN<^7HLr{>U0g^wx;NnNTu{DaQbVphTVLv1KbDg+C=;rm1X*qTK0(3~l+N z_4$FJ=o40e>LP=>iFk^oRK$qX^n_j8{SQ$msw?Js=mUTP;}qJU?SHP#)HpOsNDN0f z=V4*;w&bKO1j&ULjUNs=Tk|arzBuSnxU-IQik|fF3lC&gAOOn=Fw>65^wm&Dl zm~7Gwu^3Vm)r0;Ek-KeB*B1qlKs zFE5nL58^>IhzId}tI)-y64iw%I-h@}AWV%Y+xvwGkA3d{-DZC$_jOu_u?Un!8kECp zgk+{K0ejg~+xxd|m_F;U3QY*PAdv{AD1d+=m|F*I)abzoizx98Ld8N*qD4|_R1Bng zV^J`wM~oqnVL*?TR=~)|DyknoQ{LVbRrMuRFaa%|Kdb8MhmRx^c$9$_aP|ay<=OjR zoms$T%UE;~1B%Z_PPj?&Tl$vd$d*oE>e|<7>RkA*#`I;g`FBAOrqU5gK$-A1sw8B` zSLhnezU80dVt?OVO^Xx|2Np$9L{Svjk3IXrV(5aU8*1OMzGM7@ZS0Q?IC3LILTea` zrD=$68oY-QJMpJrCqWd)>Ax3(*CTo!$jQks{JuBIcwmE|546G)sL$6{`GKNns=G&= zu^O1|m4r1Pv3hTaSHzi^`f2S%OjfQj*ISN!?SK8d%-m!?Z>_1TF)cVSic^WiB2n_^ ze8J&1?f(zZAF(yd4|>Wq%D7oI-LbI-BN?1zVr;G7(u-2SD@}Z#rC3gr-nAR~bYKXM zP`b7O{rB&~CeAS7siqqT*8iFNA`+us_{+=vq|uWX+o2w}rS;+J1vpd;^xqaE9qR7; z$T)~0I;Wu-nrFUh4_M@*BvQ0}AvJ}u6H+;|y94~DN*9B^f7h~4DlXgXmvh6z1v!G~ z^`HKELanuA6dJ@?4mYdov?Rc?--WNjb)nAFl7oR1HW|vbqQ1-T&b-n;w9dGY+W7@e z28qTfli59Xk0=2xf&x}R3bClkwyLjMU6w%hNf!vVuoDYZ>6PRSFFx`0MiBuqHgiTE zsNBIsouh7Ek}5Ni&~_`#*A`1lV4RF;ogl#6N-Ap?-+`Os(K&RDN;{>kn26W~K9VPW zmktczdSbIvN`KPi3s<^SvVzjP3L*)DP&uh%RaGXH8H0Mpz1@dKWc{R0^D|6ITid<8 z^COgSWSUHhi?XDoJpRPDKM!lCpNhW7P3|LGdT>e*UKE>qIIs%VvK9xDP4;a2?$R2M zAs&fAXpeP3-|vdB+20gIoYOu((lgO?zSpPNvQy_d)H2o)i>8076qb=~WP`x-|7NP~ zyM)&IAA&5x5mdx?={rve@?7W>_a%MqD2uc7HFeEMSfDQx{7mKKn zV(VNJbc8c4$5_8^0m6z)qCd>y{}HvKSwhrth8k!#9JI%NWQ_%Yh5 zpqGlV@I3z~1Af;w8cqjd;|DZcm~}n?b+WLsge-)9UR87DKavNTfyGng!sA_MdRbMk zh_bG>Va`V46MCjV3Rb0?&+?L)SV*+z&;k#BNI`j%nZ zGHn_5Jv@AWZ|eJVH&Ds?RU=~5n8SRcbB|oD7yiGN{p{X4{}V=S6Q4y= zs8qfStGZ{*>uquqdLgSH;wX|Z6bf8)B5D5KRI9X`6h{EpksK{-3>H;10)E5BnVIv35r7!q;w)EgGPfh4N$WSQZsv$v_@L1nYGe6M}izj zt=3RuHRr8~jE^SV%d!hEH#SW!NiWDQz3ft3`9&AxM;JT(vp(VgB%cia|9@{Pwe`=Q zad|hj01|?v7!WHc2+H&3J-Pfl%JR&0k>;n#rFCQpSw>QjO~VY0y$sC)QG8MTwx?dB z^=;9!DGv1Urtwa;Oi4ofW!hkks1ZHf#0C$`!LRa6W2s6A1x?#gcK#xPd2+E>dmzko zkz8~j8;I?$WE;=hj<*N23kEhvE-E~H$Px)578tzVCsKYzY}nIS0>qgCQYNt<*r6Xfnbl9#l!b9LoaPDOXV z$|;qFOZ)#+En9qi{0AM#jkL|nw45)*q7t0qYzMd3RK$D?zevn1&r5I<_jWIYSXo0f z1F5034exU4=gMw6*XH@xNpCbqV@r-z1aCMWw@YHZfK>gEFV8zC=|_4nrgZ9kYDd4g ztD4$(M$)C$I$GJei|*JtQjX|N@B)0_=hZ72b|u4Dpao{gk>ij3}^pNbcFZ1ug!IlYhbo_VCC*{4JA@ zd3M;6+mf&xL>Xzo(#>A?E8#OC4a857;4p${fJi-E;giY8Zs27tTcNUn^G!$-ED|Gd z8l~rUPPDB8oZh!6B+xhYqg=09DH+3vrV&P%K?q@lF%#cEJT8cqi}pY9`~N>{E%v}3 zI!08*7?E3}qAIGYqAH>)qN=K@YK)qD-xvO!;`^K{$gl>@LTSPnVIEFtzqY9r=-r3! z>p2IqN*53DQH(I+b1}l)q%X5sRQ9F*7rybIGedI!FZWXst5!u+MOCa=Q56vtF{)yW zyci?K7%@gfbU&i+{UNg}?E<~x3rvQnIrwjyy#LOfqA@H+#bSg}p<*z?Orc_mEw*q9 zvi-yU9E&m}E0@{L2tWb(qrd_I0fz++`&mF>!2kg}3v_*TU5x`)7uqiwxI#G=Mkws6 zdR@pz$CK!ypLqADfGOsWwLN8v{fJLTDkVTk3Idd)|JlgUneM zD8&vtmsMs05`t7&E>M}GxY4`&HHLo9`on-GTUxf8rp72@!xF{Tu_PcC=rTwfEGbt$ z@80wONoW4KVu~zTuu2|9Gyw(-gK0K`F1jdv7>oc8=W{wq@4Rc^#tbzG(1m@2jSdf|! zEK*JgmZv@hYtj;ewd)VT9+QS(@2NwuPfR)N2TKn7$)Q|;z~gCv;KlO-VgtJ%$RUVu z4&vZJo=;HX7gSJ#CR)(L3cCb_z2G4Z!G}147~(i;2n&o5_V^)A5{5WO7veH=h$4E3 zDqcvkLr3xxg=8{pNGHY$$!@ZcTxJi+f1Z${w+tz9`;d}%45?^pNM*A^YFisp=lYQD zYzpcAsPyU^mtI5D(raRNdd;khs)-u_d_)r>)W-{pNU@JJc$E7Q29SYC2&1GRvDccJ zxh;rP(%|fRn8XdQ2#Z;=utXjH9)?u_WHK3oKnD=%1Y+GmDgtDpKrsPSl0hpSbTeUR z4jANuVHg-kfoTjJjDy1oV3`5#HQ?0=0ex_N0Aeaob%eV~c$k5{JUpquXdm9bLW)Zp zw_Q9YlUJR5#^9$kk|iua%1r?)KLf0mD6d*8!0N09ue%nk-bSznns_x8Mw$+X!bt&v zfI#q9Rs6Ej$||p7FKi+fiyLvIkw+PINvl}hTDFp$Lv6bi+T**m5*$A%Ek^L|MQYK3*^ADg0~>z>0m8PffN*IT2)ny2KwtG>O6CK4Tr{G$pL#T&2Wy9C~%XFgg@>Ogin9qStmg1efEL|1XAKq z_vrcE`7YbsHL#U`zLehL|Gzb}_*=Xsn=&I$B_O(ctQL~QSo4*~@~?zf;wzh#UOBDe zN^QU2>aL8a4jts+%1DPMh4UIy9}Yk>Uo=TQ|;!wkL$o%nwip#!UNdwoi*0` zm$?Y=8Rz!nlYFpJdz7YEAAr{5YdqwSh#co+AuT7B{c z{YC2t>wm=bwTS7dj_KJErt1-=mx1*stiNFWjhMb1F}((?e{iNB!4B)506^C>2@>3nq`H=?Z-S4*ufrBcxRe?ceOjMJx(4DN{Ul=z0-$1j*u`!j)o)FcNCn8e}J#sK?H^js>nn5KR_2K|F!V z`{4*yG2*ex9|=#xs#YSbo;|U5b+Yd#!5oK~=Ljb_$tkXLi`(4cF8Axf#^Ygqz3%vq z-}+m)<+zIQK>)%5es+QIa4F&l2}oiiHeqwwfsjKQPD2;^Fu-N}h@bIG314w=f>%#$ zwt8}{4X86E%|Z1xqn4qJs4=Uo>NXhT7|+Bi*;JHLM)~e%Z!B*cSaT`fucJc48i^sM z12ssjxk0Jxiv;HLH49?lxA<1{Y!WMbF{L%VncljNX0fSnbK2Ukfp)Ai_SD`D#uJAp z?~v-5t;L0Uc2n`z9q-6oy?u7~%>hvV(6CMkb&Bb*sRGh9rD-Y&1JMpf64}KH0HoLY z-#6&0A~9a~`VFV$o;-MzJeDW&oDAoZcX^XRF7Gbo8P%os(vUG-TBRf7mOdHGL}Xm1 zwCrKLir8q^E%g5anb*k9*^;{00BjyNm+%4rOIBK4% z;~1|Ew?Y*7y>ZMOn{q;Vl%KHPgaTnzNJUiwcc#*7ut7Y_IHWE{s`Xj`@L2a;)mM+V z`k>ERHuc0N!qsuI+(=Dek^?4H+0={2n*udDq~1WUT~6aIQA*SGeuq91kOi+^$y%@7@2+DwlVxY{PIWWhW6LZexWO&>gE|R(9%DJjq?Uj~IyWP)>!|A>PP}Pm3 zclvDa*&&y$5e1TATYkl)a0oNe8NSK-EL=g_luhkXrfE9n!81cMHnWQs=GnNu85U)+ z7MCGflHJMBEW;jVnD*4NYq`XP3swvdY)tym=6LF!sWhyOpQD?7fVNvW_yY`Wow$Nd z%yY9q7B9ZFhgY!m2bvb=em>X5Z0JVUXQL`R_TN#`CLC!jJh(izym;WHu-%ha%O!ca zbG%mf8)=bu1|H=EFxstI2A>uV$dHK-Q!{k8?~XDo>btYd#aCP=>M(Shesw`)PQemb z_5)4{Yf!j*yrt`1x|b|*I~usU-e5<+QxBb-$<9j#j1=$)Ti}%Fn2Qyq=8`U>ef#Gq z##lI%%hMT~vlIZ~s>4EK;6qyxTNeyz%A zuMO9xTI}`lIBZr_`VF4*q%TW_KFfSyA=A_OrYo-Kr`OCsWNEI~@ZaqC z@3ec&37Q4$Zr#Hv9_V9w%xrSmFVf!PU8@MFt54&3c{z^L)+m6ya7w3oyt|<+8y6U8 zQgQ&DX#PnZ-#cws18~)Y0jm3OiU&HA-lyUY#MtTiz7S0T7HJZ=p~Y~sI`S;?)2|fQ_PnZO5l$mKDd}uE zcji(KFJuP?-&70CMW)uBaS70Rc-vK(j%YJ@Sa>i9>4=ZO6ZXqiZLGGB%XjkskLkchv1Xn;KaIRs0ITOp1%n z_^O`Q^}KfDc=0=|suBgbi3a#Xwk#n*+~yOUCNQ@$fLX&R*?3KqeII?*rU1^(GSlU# zd_bkE}v3I@Lkl>k!Yyj+gP-E_5k7P za2(`xeEkS<8t26oU9#^=rU6gI*9b04m>|en@YgL)=+b|`Zv^)G(z>2%KLEK9sV zgQtL_p6vl|&=L>X5~AOz->!HESX_lw{vIT!yIhcyoaX}bo%P_!q>{7)H@KTR!1*lx zAx-kFu8y2u&&yTZ$f+EHfxPl175h#d&}%-k0qICh=ao*Wl$}V007FkaJwK2OTR0K~ z3ueM3zausK>d+@&7q}E1;Pt;AW~OWk_`Ebuv-w4O?vB&^pD@qDua}s?jyTss3V1sy z@66FMBh5eHLmH-rB9s^X)Rou{ZUrEs^HD#-$$O$>ax^Y3TcB85z1KzI&1;GAnTnRL zA)Lu-d`KsdAy*?>xbbWb?$5H~t8MRjotIPCvFv%k&I_2n`t_i|9MUNcu%9DsIZWp0 zk|fe}0c;X3m(vip6}Yh3Fu|<`M0i=w;c$XZ&2|YCSDh8GQF(i@Rt8 zgl;u(n^|(dyBg7`RGC$?z&Aq`J@po7X0dLwb@fY7%G-Q5RVD8tq z;6b4PUDh=1G8MY<1#plnb@TyAQQEp!1~6B!jLzvh#S^^#qUU7=1W@A@Q768t|wl9 z{*7aJ-)>Nae7lRQyjFeFB7-u0vm$U*cl9N?V2$MPrm)J^0@CGLyExy5Iv79T;X4l6 zS>N}I`ds;+YS^}6Hn>KN)TFjU(;A~4Hl{gkY^aPk+_>>ox(Rnc{Kr~T#D6Jr>KomW z*9^+moIrS*zlG37TjF@zn}e#@DsiieR_hw|?i{Xlkby z%eSE;tPsnY3oro@2^l2~I~Tos7VqZMbrM6=JBsH5e=x8!*2D4S_DnCae9rM|7kZ=E zj`!*H0W6DE6BJc__`)BfK0S4G-dB|3f!A?Y7(o-1c=4_87?`oXFtkF$=03sz2LES-YLr60@OlL7ptvezy_qPn+2#&Z6+z0?E3IP*dy_iBTrS=XR)wx6_ER-A}n^8E>Q6cyQ{bx+e5!#HO>foaIT-3!2A4^Bqbfprr%8mWeH6@hrVD?|Rxrn2{Nk^#UlwG;m{xlE=PS({RYiKh>ZPBdz!o-?F zVG2}RBok3qNkcQFJY{6$jqbTfX(H^Q2~CKtbh;fR7g*#fvk+J*x4y}uWS&?CS;jhN zKJd6m@J8FS{U(0bMuaqR<&g%`yzfyLI2}gDn#wYnUiw_e)(VN@3fV1E>tvl5ED4Eq zk!$@?o)UW8=>MHd9=KbmDn7gJ@LHU+adMYysf_g3z@?=UG=9sn)4RM(sbyUbRbOIm zT5~c5t^OH|bjkjVXqqq@2dd+v6N$cQ0tl<#dJUu|DA$!ghrq@KB{!;2Ag%+PS9GbM zI2J5u7`%v9wLVGJWa-i%Zz5X1!Vn3B#=|HBSVJMk3Anq`L{(R)YUzjWQ$&W9_VgAj zujg$kq5vws^M?X4Ch6vo*|xfG)7C!v3_{-qWiR=CvO-PF)rM5`3E1A zGf^b) z1FUxzaQ>?@&hx<%LDF40rzo9!yUD|4U9|hgbYX^nW3M5b=eJ^YFYdg`QGQuFa06bUE8kVY|wid9`l=S^OaY z5M>{{sT7cW@@D)Yp?Fnrz=1i!5C%PDBGZrE^Z_IkcOByx_oP>=?XAGsDNiPJRck=6 zps8Q;w8XFcb24MsIiOy;I(3QGb`F`yjobF8Yg0z25W@C$98S;r4M@H`?Km2)iGmj3 z%_%zNr>EZ!?)u5PF%5SdcITU>0zrP{VCNf0p95m57y#8y+ zkdnjgs+kutM;?X`z!VBqVGCOX%9A5mp=pGA(Zjw5lvH#LYra;DH0Ce|0#>mKN!#9F z861)xcl)5qsx)8Z;{VG)mGpjR3D3+S)+C_h!YTx)09AyL(|_0+R0K*AC5ul(CIApl?a4kVMlyT;wO zV5|Kp55p58R>Y-S;jVQ;!V^`xCocE0gX`Wi*;yA8++rLte1KDq4J3AF8Xi*NXDM$}N2)YK53@(nN+JmQ5 z+g)FU(`9ga-70cY$SDs_axO0?Z8*8pMJmI$%Nd+f!DY^>4HyN&K9@5Szw=UD+>=%M z;ZAmaiQk1xWP_Q56Mw7D|5tbpo747JeEi|@D}x#UJYdnV4>6EaYGhp|Z!bKsZImM& zFyGg_fvQS>;<=xUz2N=^evl?*~ zUb1SV+wrOP0h5hQu!sE*V`fk}(D`Hx%u^0D9MT`aMK?K^GNyfR94lrq(kJQTaTg%x z%Ao)NId-}JwAp};S`6OYWTq`NNciQyLM1{aCi`%B01c>Jz$UdZHG*H6B1&!_`XMwh zI2KI!p!^Li=_kqC1$d9Gd+|;XKnk7}yxMTjl#4pc1n{>W1w9TzU5ZNMwC6mGCxC>- zMN8g{(wp5KKk)qGZUg`FNu_zXx=_f04=irr8cLCYC}eu%MT&hb_%7t-g>ug9S?;%$ zvUeBpQ9D(DFbYr;SNedtNHf~0te}}=8Rn)d8 z4RZ8)??shO+Xdh2%}x+@-iDB&iSIMrYDx*92<3enE%+zTvCp4Pd8#c%z+K%1Ihuhp zn!Ks7Qo|fN8(Gy#{gP&lFuXdwNtfeurO{|KLJFcTP`2&{LG4`aY3pnj>laOppl1Ak z5p^MiNLui%t`B1*>)&B8WrZc}NrN1{r{1(U;N$-)q~2&mU0|kJHApD3@f%*;OyN7L$Nss z@s#O11#lEfh#xUX1Dfs@Q9q*Hw-kjQyE{4*8-Z9wlj0Zx5MkbV zo=_Gb+#?dg7ELAyBbjgC07N-4guwg!Z-#@JNy%3_(saVrl$f zGqX}QsSKW$cX$BXxE~c{*OoiFM*!5*lv-1ummDvZ543w%8s6j;W8SeZo>2OOeLVC5 z;)XMN?y5!}nfS5SNk+KJkYt{6(lDn+76x5k%!zWqobnL$axUIGndr{kBk&_1*WM%A zjPD#My!zxBPv(hs?5Upr=%Ul~q%Pbw-5Q+MFAM--96r%@+oz&Gu*zWrh|S8_JdEXl z?(nQxfC^26>E~V#Px~-}jO|1#MgyQ(NP~mm*bL)>B!s@i!fXmMr;^qFdsji&ZP%zw zj-eXS2SWp&Tv?ToDN~n&RS%FZ`OYb6ST(J?9)Qk+XoBZW_JH!W6$fwb zaJ<#UC$hRHQSWWD$qOp2^$}X+c6da7 zZLi3xyjqnBgHfkJD0_w6GZ!0ELULC4>7diXv*2z_Hf_*BBf<}_H=IFb1b#ZK-c)Js z9XA>?YL79)AA9z=4v_NDgb%Zy@Ac{1e6)Wf%3Is+aucx)LFzmkbTW#D(-%~LOCVT5#_}yS@XK2S zymD#5_098GP6lU*f&fjyqdt+EaV;kZb%I}q8N5vcEIA|~TkQHOAnd-ocL=(PjxnBZ zK<^}I{i+?%(J?&`P-v}l#DN3i1uxtH;@JSg+OY?E&h|TSc~Z*q;CW6Il64KsRU_X` z;ab&Wh1<${^>~xx-{KyU<~`hdazpx);+T&~ z!)1{u6@X(eTbkmR>(@7T&wK9Lg_F*@+-hhraUqQ~oAl_2wLNNheALmZ-4TTneUVBv zqxR5^e6y0c@7fY@U#>%-d-n$X$@6yZ6)b+&wa%U%mg@FFvsLR>9Tno{`)0Wl*2W8v z?9vrRS%CWx_DwEMcANQpGQRV##!aI*?i2hsq)~;k#LbrS8p-xQ*V6i@RdRk&v{B%@ zTW#aCOXPbypaFg>l4mRyvn1QUWz40PR|hI0E(mh#Qtm5)Q(i)=R=3w z0Db`{L^(|K7@QhwK-7d?0=VZy!pQB8o*8z%%Qw&ViuRw0XE@#y=h1)2MY&(C12yQH zBGv}T8si_#$QfSz_Xk!BI0V1p8B4<&biersaGtKo4r*`FEQQN0knY(azRhYPzEs2P zyTL=BK9AP^!&3G3v9|j09k;}c{4Cgvx-=UU_vci(w3@`XLWuEum}m0?Hzk<1g6A!K zEzA7#yP#H?DlKUP&ct=c45lf!g)_++D{&}JYf1at_@pW;OUw3grk%JMxiknM>f2jl z>s&+3HK7+=!Q~j7iGg87G<7=}%TL~;V3UdoZMy{EyBb zzW!M&@jBwneCzagmF{Cs{PblSHW(+|U^<0*1$kx9C*r9wzGS);&>jW1^M^iTKh;yd z^y4v{a}fpuSAL;R_D}=?I^&aID#Hhvu#S7TL8Dc|37-Y(If}%c9-#}KlQE^7m6K+Mq{#MGkUqhGhF{z z2L$w(Cz==<8CtId-fU8m1x1@M1U&Q1f#Yy@e1}lzKFv#I{eg|`5rLOVw7^GR5JXy4 zFA`_|NHI28oX>=wV71Kb|H5gBA}d_`$3Bw^x5!qNaE7#C(-4%P z(Zix2P4>!*$w=-+I_W1=i7O?g-A7i4n4@*_i|39}0EggP^7d{8z<>wal z701K$^n#4WiWL5td-Zg5rA^Z%;rvTvIsDVHIXI_4lBRpwwN-|h{tdIe zEPXI;*lxyqYVv!|hXVeai!`q&x+PI|7#t2=pV8hFz*u|-@FL7|?lg7Qw+^%94Z^Ln zpPj_#-E7XGk&@&-Yllx^l+G#fN=UlFhUFAfD!sGZ2Yes>5)}WZDTE94e zxyFneCe`lzM!&_5mU}ITv==<##STyt0(+O^!9A#tTw|`^)-Dq!VW_W2h zc+vB(sjrL%TB>Vcd~H)RYZwQ;SEg;&y|&$PRyf_6Zt#+uOw!h^rfTm_>6c$V?wk>R zEYEy5w3_5MgYGqH2O;Ag%p0ZQhUbS0e~Vi;#rN*6PqoFU$K2bps`&=l`kkKs?reTh zdvC5q?_W5SgNE^K(gt?hNfBi~(-62>y9MniLxjyRL)k5#vhR+Eocl(h{C!faaG#M> z?2BqGThV473|pkO-#bo+{mZB4{L|EgtaHSS`Kc`Dx;U%3FVR}?B@H8PQ)Qwq4TQhP zEmH~pG~f_3z@W@TPd^tUA$&cn*ODs|HK)S$d2ASziR64KI?sa(2h)yr0^cCR#O zT#jZfBj`j~zCL{`He`4uSU4l$;;sgtaJ9t5Ba>0Ao{Dx&3|wpDoc@SL^ov6Uysx@a z=zGcadcN=Yp2YV<_v`m%~ku&=ek=g zLd!8L(DsOp+?ol~N28FTT)`$oL|iZ`>O#;3PE9LxQKCgJ#&g9UdueZ9_`tPrH2KH5 zF~Jy|7C8!*NUBt`G*X@V<#SWZZg5BY3b?Oxg*+fL* z+g)v1mdNv$GuXa~qKnJSzeuru{sN=O8-kExh>a9kM?&fI5Ha(Wl z+L_Ady`Rps@#B0^=~D`8=Tkqb-S5h=?0MHO(7xyTmNBJo0Cyh1*)!~2$APPhP1M@;o)a*>t|E;pCG zqH@+g*0T2XpYd&Kak$?;5lJ{6N|IbeTigm~A9x5OxDballrPq*6smQ3;%!PvhLtB7 zQJxgXQnK*nD`1p|%dAv6yJD4+@-)eF=}^YHRJnAkV?Ekj`g9fRH0Cm74jDnDF^+72 z>!^^2*fgHt3pGWIGek;bmK-uiNn?Rls3mrx*0_0iDbB-`q$qo;JS?c=EZU7(rhVq8 ziJ2RPLJ$awLs6Kb7)phpG?WI5vqXhMQPHU~dSs-6nvERjvC#@@F-AsDj8jni@tZ>( zrYfk%oNYq==MFSzzUI*D3q?Q^mKK7huO$-Ny4Fy1d^1teiOq&bC&!D5zSw-ydpJ?j zdp22;do^bj(7$sf=-MERK~Z3ZIYt989*hSDM#tz-7$2JuYy-P6OptwM(h*|tLkz)G zkyAxMNsvGP)X)TkU^*D7Vq%72dRQUYPV5*sIANH+z!1y;H#%kr7T7-UwqW}q12cwd z3uXcn*a6s%qJRtR5PXFlMhNUEa$v_$D(nPiOCqt_f>|?X>?%vayjZ)Ajja={VQ&-W z%h9Sb&NgBGYLZYdq9f|$gkt&f6E>_cVPh&1wnJUQcB^l+R;}qcs4X0J z)6EE2yZ%sY04p3eWHdVuNaMlg$)aKlhPr4*SX)VL#bY z>=$QkeB+t8$M&BgtTlYW^A04hGBA=Mkr|*qorwrk%mcT znxM ziOQ8nC@`>iZ}3b{H=uKdgA30WAuoRX3g3yC7ZOrRXsA07=oKLG;r!obK6 z6EiO?to*RCi!H_}trRy^nV>Sum8XG%Mu0<bo4V?-HUojP8sX~yFk&zQoP)ik# z5rTykf{hcBiyNKKU98S{D^ks0tgZx-1_8xaLo?F{o6Pjtwun~y0<^;ubUCK%agL=A zS%7|2i38~31~F-m2n+oy39}SyXfzgRFhhF-O+>`vAZl?0y*P>yf(2$D)7ElFbdV@2 zGHp=l+To2c=*)$IA%>B$0~1qg7M5%u+0uPx5Bb7T;wxv!H?9)@0rUOfdBK3dlL+7t zNkm{I5*-{~5-%`5{;dfJj1wfPH7UAwWL0TRo;fI9wQiKv?@UL7Bn>sr)I`%>nrTtn zUa)35AXau1IUK`Etg*WpfRotb2M2;Wh7z?koTQGCq)m(>D|4m_ZnTB-%*j>uf-g@E zL40M`G*l5Irn*@1t*w{X(nd+uB}-{;o6ICjRvmj4gi4j6N>xMWRhQJLY2cE&P_MqE zMN4wi%|g5Oq*G_%jysJ!)?M`IZ{BkQ#eGA?1H&EZwUPFgjL}RgW_wFF+VL`swOyw1 zX0lB-VVnL?CyG3Lk_^_Bv zhj*`$dEvv7wmv1b_h)027Oiv>%q+4qM|LP)IGo@?a3WY{$gHzv?lpo}8~AlYV2>nd zm6nh`1J(Ty8i25%LU;%wqY!gxs_9A+esUp{lE{rcY`IvbvGF<~eCw3+-ES`ykvoS~_te-7$EWQ8!Q&MjPbq3}#lQ zUaetqXW)<1vK};xTOhSyp|$1ZFm=~L)>8*oUjtPAjbMe6aN(o|+*N?v1xeqTiM{K) zT)A@DCs!4VtCxLx^K$Z*3%+^CM9`Co;u18ZWJt-)6joD1P+Ln^SBHAYts2u-O@mbn z!76FBO4Y5l!IVdMA;dS#M0l+=U7eb}p(2Knm~oV^p*t|YPR74qZ1DgVI@A_RGYQ+2 zL&(0_1nr+g$N>|UYgeULF>}Jfz3uJ0X-JZMz(?5mG!NF?*ehz#lTycl1ZrTBwzAPQ zaIOfYGF2?7(QtR4A`rR5xg2*;99xbQ21)~RnvRla&MXGWYD}?0Q%cI{sWM2mQDa)} z*6GS^>jIUUm)Q&@SLNmvG&l+ueRKh!~)#aKoRMMuiJ1 z;*O9C=j~)?Q8fQ%4;_uhbYj6FRJCmqP|0S{sZ;}}w9J~03WW>nzlc;+#UU!864CQwoiy0gDpqmKIZoWHbOPnA<7hUR}%jwibD`)>;AJL&pcB&!6u+$rcl6lXd)8H{m zbDDh(DQcXThu||gqrPWK$Zzs$s!XC;!*A3=*=QSW_Bm5q zE^Z!m-y-2^4Ch6Cx1(O_)rOE~d$y`+TdI&k6HPSH)U9bKUvi`>MfB}WVowluC({#V z(HiOLUX3MDw+#MGMw(?4neVw<|43U4ztX<@JDsE=cZy7Aq**gnvu+3r24|556owcH z-IgdVq}j>J%Rs?XoknhZJa{^cb%sb%1iES1Hz5;fMKyMZ0kL9s=&8_tMk0s>%6sfO{ZF}zV%Clb8@9CgcB z3w5xc8sY~j!~i)Akw}(6AU)QJ$1#jho=~CgI6TV6Bk3?byg!OC10S6aADv6(2>*$1 z39qFpi6C*W-yw4xrAGs}NlvIGI?8Ya=2sy=+K6)Zrsv>AGUQi$BHMg~uU2LxkgQ8P zlJ}Jg!YC#f(t1X{1Up6BRspsM!}5}#G<6GWk#@bo*oZR zob|7_KS0qNMPvLJ3(N0_We6BHi4Ts-sDfn3I=>ljzJNXsxuwi;W+swZTf&F{-+WRK zZHuKiUpjufUe?nl`pd6KeDlpK~G zZ2~>o2)d;&q8AYFB}YgIe6%}MwZMiHZ8tW;F3EFBv1 zRU5j5%<6wIC??V*fKWIi;jA$nhn0n%_H}A@*@e?@*l4|%uzWaSSzVLGs#F3?)K{T{ z#Q)1r^|IYH{$FTti{5C?*ZPg8p~+>AbNon--x&Q=rocb^Aul#0McBL(WAM6}DxmKY z6i3IAn9@!EFRqW!AMF+Uw|_6Xy7WrcW-rdpW;4np>t1m6n0$8!4P&0qXV>iZ8q@N| zK7LZ~WpP6qS~u<YmTWo|$? zbQv2$8v5urzcVrkIa$)II)Rs|d0ZKnhyK`WpF+haB^6GHd*#H%^JOyxA~8Dw@Q*WZ9TfsTpAy_GM{m>BJ(!7g`Q4S_CP4w3_Jg>!?7bj?V2);v=yuK~A+PR=RNc__ z?ixRQ9P98F6|A&DCv$YRB4U3iD$#!G-S$J;L1VD|);%ARt}UjO_vZP7&vI2G7|R6 z>?zPakt)grp9nYimv{UpE_U=Yy;Ilx-!fV)bJOAJD;^u!_ku_tul`Zj8A9zHSqcbC z6eR?um`wP6`Sl#QclgxxxKOie73Z!)9F5&5^Q;61u4g*6keHKmeN|WsrW(+)50 zUJj6-ET?uNYSa|HIo#RY-*i7{&1KyDM*#_tG7MUB4l&UyBo$~S?I@bWK&Z@RCXQJL z*~PrUxD5$r8?X{}lm+=QkX*g?(US&Mot-!WUHtw0`u-JXII;u^F~|w%gn;>aofjib zMFAxw(G4z;Jckt!wrIs7!xgl-!8V5bVV~WMLD6by2Bp~C8dt93^Fd#B-oJx6^Mlow z4(J83U~QBpP{4>8tRWR^6mJy*35$|QvAPWn;&)ZR;FVs=Y?Plc-#Qe1naV*glvw0D zGn`MEE-2TpB(a?i|g z916sMqtLutZmQQp&5kuYgkQbB&N?LG&cLdjYUNK=?eoZtBc-@WWxx?b`wavrJ$50P zi*>4qe3!MJe7Hxql(s&h{Gh>grh@rj$mjOZbGMascwz{h2jQ+zOl|D2KZZ(S-u+HQ zi<8k7!h?G3H45Vsg3dr&Uw|nylDR$&h2t7Fw6r*hdC0hj;!S#%hhi6c0oZefAby0L z`tY67@v@yU34>i7h+~vd*iHl@VaN|NEo{&NLf$;-znoaBG%2lNc2=_yEc7UYdY#_Q zi%5`kVr&+3T6d2+qJ70C^q5jAeM?U?_R1d4hk{Y{SzS_vafj^1or*P0*QAZ4n1P8h z`(!btEcS9U;Z%~L9q6LNuJR@sOkP!06AC|-BF9TizR*};hct;1ORD5Y_5J=XlV%^@ zY1*aUL!4Suy|8WA(gJ~4kL)3xAaJ8|IxvKZ5rJn{!JeI$Erzf86%`K|xf3)k{279i z9~xeAqxe6jWgFa=m2ak4``Tu-GG29aHo7)}k45u@9-MW(_j7J{llU7wJ*T=TXWH86 zyQt&M*Llr3cLUqnSuigR!h}hQttIAS=;VXb%6iU};-Tgz;2*$VfY5_NZOmGh?>?MX zJDFDN-%0XqB^eBzx(Z1i`mf5Zp>KT9;K1l-LFeidV(nT!~JLeHgx8!@2Rk+GKAO0?1P#H)Xe6aZ6% zncO;J=Zogld6940ZR(uo*7K3NAfWbiw~4edxEJe?uCw({BdD(9NBOdxNprW4HKa_6e*_93Jxmb}VQLS=yp(IJ%0` zaNW*p+76=$YXa6aJx-HijuJwfF<)g<#K7*TejO%_8 zmh>U2G>G`gC(-?&tRpKMmh8i3ioo&nS+g7eMNk~waS`5>iWA!g{MK*?R5+UA2oqT^ z@JQ9kiUipywNMw8LHR&CYU!u-orxY9T}eNmSapr>wZdZ=u3)uVDpuwo=<|57M|_@2 zO)y(L5wU>tGdghN=i6wTNO~^ef90J9352GZ%e6#F=*-1hZ!U4*MrRLlo^KoE*=LF* zHV_+bA&j9xK%6|OD*Kq_yDTlx9V;xfru=jQe-+WrN#8WnncwL|e6R9Rh&TgsGBUD4 z{4!C$zHZrlS_N`49OlHoI&)AihubP1cj}e_iW4wbF@|8MMg`=<{#0Z}f+k1JcbA_~ ze#HeqsNU!pRf9tpg)v4tDJ=7%sU&y_Cbky$b%Y{XYBm0zGz0EQH?jM&M zY7;`^#ns4b6=vlB*mm|y!UCWS?^hQF)(Pz?Os;1&U9Q2i>Eb!WVMWNiRILk;z4Heb z^VQ_4Fn=F5BG>W=#K;(Ng2B#o`M~q8KHyr5vI1n}&5@~7jnwSL#l(h$(cwm6D&?!V zO2gT1E^9`nE5SkL5kV4+AS{A)QQ^utrjYWvDP%m7D0qX%l0t)yO z(|+R%G(@wahkT2}6sDu?3Ku53&=oJbL@6`D>4v$VrN0X)7BFI%sVZ{z;w~i0@WOsx zfDGptzY^3HeeUo}JL8-pTE9T_zC?cM{)CU}ZHy|kig(B!%R7{|lx2zBmni{Yz41-% zCD21jrpjv?W2Z6VIHBYZKrA?{EM0Wo5iOD$rJ+Gz#9Um2jB<_?;V2k>bb6S!yt5f! zM_e76eBwI<1g3LaG|6x*NkZqiEr~gbo+xWq6C)66GhlU%J*BYULEAa%@cgtm%i7l? z73it=eGaJuLm53>@f1z5DXJ!K9gFfP%mucZv)dEe<9FcT$zGHoB*PxDW&H5-)-`hO z-HFug5st0qqhthq;8^$aprD188(qy(r6&NMIR=gVM|Q--3anVOX*3Fs)NH zYpVRh1Uq(lmEn6~&oVrq}Y=_UUf6rLuhv9HP~LNVKD!9qyzot1LgiZqZm1jk8patn)gSpVy!)Q z2}f^HiW?``4(4bh!QWZwO~D(O1W))Qw*9U{WUTrGiN^IyE`p&3f-%_aahdFC+U!Z| z>{;CG2_2VKPUKsPuW>Y6nJ5liJnKRorr6}RVASB81Dv>&BfImAaSAST_}a904x+Zu zTh2{`kCfWAVooHNa@!uB2KAZl=Cu-scd? zZnB84OSwiqMo17G88B}fZXjenuWNaGu20BQHUAZeWDXy`N?%#5d}*f^RuH}n{VfOz zw_$Ut0BETb(6oe+YG-$*E#pwU8a2eK0S<#swR#wzqGVE|yxI*5VfuI?+Z!H>@t_Pu zl*|N8mCXfDSJi|C;bBr3tq=)C%vr^;CA7q5R-R!(yh=#(DaWL2l1e&T(5ISbUs1955g! z-0Gth8i5I0^{k+ARa#J@gR~A2$ej(FyD7r4;2@D#q^JN;KDsV%ZOX`%Mzc&5h%*tr z>3*n#shU-Sl$38H4IhLaZCCCjFfDI0VH8t%lTe@U4mBOJ?o;dFcCs{#XQb;4>ds;p z3O=?4jzm08yE+?s(HaJe+tSF;lBYC~hIk}iu2a$T1VGdW$J&{=qR`R;#1(A*7Tf4r zb2VF0yIFH@g7<84$Pe>TOpoe=iK@e{aaijtmlL5Q({r=H@N$2e1^V|Z+24E)j)7I1-+ zrL)1)<@14(q_V)$fA{9Cy;|}fChn%$)R|dmMj|% z-0cv?;7fYP1tEoivKuYnq>QIKqf<3_dLK2io-%4Thbjq6i_443N-B!sha*~s6EfxU z-hVsAw^1dkDXXe1%`Yynv#_x?)i*Y{I)PQdC9};#LWzXWvyLw7DQGj9ZWgv@ur+wa zveu$gMu{GfFgikh&d2Ij0M4P-$Emoe-E}?rTXGz!hfGzZPFQ&c+~UyDve8aCEQ7tc zU@3s&a23T9PWHu_V?!gBxeRtu&2RI3Bw}i}6=(@j)nHle34?0X$c4vhGwmg>U#YM?$~fSaGc-Ot zJvccUCrmgPDVKVk;m#@hvuMx5M0pa0am8zkN5fUO!A%rYk5sW=ONL~yaaZo0M5^#q zbxOHw<)XjHN|_WKM2*J_(5?&qbf2v-i+H475Xx)jtlY5MLM3O?B}jl(5}^UMs4eLO z8UOIcL>E!vq>pOR!v8+adtUD?Md-RsTb7fNLC?a%63kj?6_g7D3K@=`psva>RLNtA zLJ12aj3WXIEc6yhHj`L!i|78th7En`<6-W`U=}H)@S0F9mQ7+3D`nU)oJfo&QR-d8 z_-hYs~_BHMz zv{nY^@TYQnFRRRh675%CWINbl`3Br@l>i(%ZHQvqK~zi{)oKWtEDyo-flH9w15w!A zaq$0MDOr?-Hs%<7VR0&_ZqBX|M+T#2*3QB4@59T}KL-~lu~ncXgQ09p(vAOn^S8q( z$Y99pWANA=1}QvF^3&PuM;RPWZdomNgC*o%AVS55DT>XGIhqkxV21wtcxDGC!qiiL zW$RqDBl!1Fe$0~q-ZOZ4c&UzR;8mmPd&qiH@K)~xmiPxwiZ{rj=sS1mA4P!VL+B_- z?sP$Hwjf5|0o0kZ!-7nng@BrZ2XJcU6qUD>4Ldu?>zSrYap1K{$r%z8GA5=hK0*No zKnbTSrIS(DPiS@pJ3!P)ErT9k08c_Kn8zbk*3GA7%?>IC7UF7-+y>Lg7=aAJ$R=RS zz!y@`SC;yAKN9Pz$zx>=o!ml-CTf$VOkm|otP_ot)9H4#5FK2p)CU?8j!=XvGDcFCUuUK}l~2~rONnK*wL`xe9usJ39d;>pRwc89H{|2C zICu155N22zt$3VlYfLmnLA8rop>W2%n?bE+^!r2|%RY&4$ObOF2By7_;0jT*n{>Wu zOK8pQbGd_(nu5|dcSbIVc(yxMP zxY55cV@b)3V2u(`Jmm;Ik9c^BwI)wu#tLB?5r#rBu9 zV_>zl?|jm9UmA5^5T+f8<+X2G_PX>q{`-y9XWh|v)qEVAi!nT&O-1P7$H4+NVUQ7{ ze$(Tzc;V}tXU>ggh3u6&yy@80&)`tOe~)2jIQCJ}DWeRY!8e}(LiVI$^A%(l*_N=tX!Or@N(ia4a3 zEf3Z)S4<3l9v>tsuWnRow+!5Nvo80*xDD(&v{VdZ*YsR##_UU9vm99$VAYQKy!X5R z-H_VKH9zNPtQeD1uS;_}2dQoPD+1kjn&+&0hF9%wlT?3l8X&77 zw@CPGsnyS}!~X<(zPc?y|21#{X_-|dL(sG+9|pr>|=kL&ZEmh zpV)MDUOb!trl{9$n?*!SVA9DJh|AEKPpVcaXGpeOy4kFhu9dTfSTN$c7n-e>F_)1J zb<{h#933LD1_<*UzrfzI9Gzhd#r<5GwfqOL1$7Dj!c0JGDS%Kd!J*8tX{q2UamYx~ zxlA#DJf4NC+;6V4b!Sx4)RrhQ9nlo!)6z6A(M!SP-l=M}xz~Tx3e4T(Ap`BIA8A!L z+?dqk^>2IARO+i~d0YzIvdco)x%XuqdRqJhCcbZRnIC>O7)0)UU3sBs(~(8Sm=`6T zYZLwWyg?y-^Gq)6yuq`t*@Y}!zbTzt-^;ctcou`3H7X{69J=YwMD>vQi0G^^AKqU0 zarozoKqh`Wr^e7^)&Y0)3_Ql|=>^{HW1U}+0nOWJR2$*$e7b&jd|$*8**DIW!s+k8 z0TL&Mh-n;b-J+NrVLJ#h^)D%yYjLBNbCKJNT4f1HzIcZKVw!Zf#H|#IgRC z9gY1ZfX(fdvcijJx5ppPQbSRnDo`??E>t29SB_jaM}|UQPE4hD2R^jX_?4VkqvvipHH^pe+GVTHQQrv z_KKCw8gzPG?UGkpdWoB<*PW;DHuxXDjZ#0z$;&FrT<4|cCT67Mu(Nn7=lV_6)GyMl zbWukt)hFV&Co0%k!0UBH+Hb?1pQ;aXMg~1B+%Dkcxm|1@h3cVbG`)NQPh$`XI#E{U*rPPwnsy0=F!yjM9H{4dCB6+rJ zqhI`)8>n$!cV(V$mQD)HA77>XJ=fc{7jqW(dh3U~j@HD_)>D6Bq{nH>t-R)M5841I z#$@8G5vbH6Kn7ktd)H)KJ&)hKt_PRZwzcq>RQjRPDuvEwQ;GCSy*^wYJ>ji z?w=ALj%~r-gJ5G_S}IcX%Hz^1MhY5M&cad~Z~(6=(8HO>q z_Du*z;hi3C)lp_OZ+aQ|IHpKD!}SVH8FreXcQ9n z!88+5l@~;gAEqa(g&J8NgnaH7t3_@1ZbU+T1dfq}9+N55#NsmajNAxL5#qq|;BXm& z?}szNmpKyTMSl2qQ0^9uLN+*!L86l5g3W9ac%4Gf0dsfkTceU>!N})!xmY8`3|IN% z0}26;Eyei*@bBY}WWA*i4_{A~G8C^eEc-ya31QEp`kI>ICg z0%cHTbok2uYB75w8Bo#PpkaT=Q#xwPYa_(0CN1+hO%?J}kQwo7*-@H_$ zey&z(OiPT3LrQjB*rc@>EIo0(RB0?Y=K%L`l&l^cro1!{hxr7B{1k1uMX1itbv0ih z*GAOy_R#0JY69_cMG$^38}f*55xrvJ$z$LE5^4l7;uQS94h3GQUg12LC<*W8^PK~Q zAWn%CP57B_k594Jx#5pHH%W2fr!@BI!<9tYaC;)hYL;>1DE!Y)eU~pkdINmFxMf}f zxeBK8CFuw!m;?Vk<_$1YFpx2k>ZpdDkeC1q+H){%=uaUc`*xhWCH$ zL?rURUYM@E&hx*SB1STE&70%!1=WW||3R>nqKJ%yf|#7tT>t+`?q>&JLov&tF%k z7P1tCy^g-{GKMeUy((^{$^QSP-Lq35C!ugO6_usg|EJ(Q)p#$6>#tza9*va}foKE^ zI*3K?h5rCxbTsM%>N8uav$nx@q3-L`Zp!$KkUU8C2A9MwIWRH@yo=#|Wb_Z{)*jv_ z5FPFo%pgYwf-?a$nwn$Z=dgb$GyFuPSsl|`r6YOj1`?O}Pw$Z4LKFjCH`2@bipGkc zI6YK{BqY`v0V*GJ8WNH_Ab$!ajZBP>_L(3PT8bW{5W@!o@}O>?e2Kf{l?xEb!xaNPzFca~nif<>A*Vp7ni*?|u4>Gy8bqw3T{raQn|BrXehW2Uxa;k`?yqOanY-Ip@H-HE zG}WyRDyphqG{`ld&!w+vi@R=XNyZ&joViZ;;sD1n=wd%-nZH23Q}9IVsIbY@X=wPQ zpAYRaWFxZ4bf$6tIFof}uOM1{n*Wj3sVRT{Cb)x!$hi{)TV}UM{!YGG%ZXSpB#t0} zlCIjM%ry;M#>B;HJQgB_T-cJ|l;L7G`e2VE&(wLx=(|v z-@~0&CIKcguD{cNUI=Sjk2Lt(_b(o~NL#GWp91Ag+5^(hF`*VeHp zJeTC}&MMMdvtSJ7XOd%-X!RR)jqfaFV+R}c{bQx!Q%e6DPJU+GU8w8wXAqOy&O)oI zO4pJ?G8Gh@D>j-iHxRo5Yvc5Xf5LQd-T~i?ix^UebV7^=^I|dt8Q=kXsr%UU7IU1t zcpxa#o8{t&qmtaQ(VemJL>VZESvU%r7z!B#jG1WuoSbj=n^@_+oUEp{rc~lT@W?PH z#w8pPBCFp<2j?S9w8hy3$Z$}NB_(-^$XNLF*`Xr-oJaOr^kXf!uA)Df>8=K2VF58WkRAJTu!Ots0^(+BF^Nu4qwY1H)!!xoo)6++8z=iE zFjy(tNqv)!oL~&>tVZp4mQHQT3i%h0_v>VNIcMVdX10>av z%4v4q_OFCh+svI@2kr5@iub?zPi^9A=2iUY_wWL-PdnJ2IN@YP{_6JStlgK*ODeKk zpX-*>MMsaLXH8CL z8men%H%`&Eb>GpK|Mk#IEc~_Rbkp=)cc2zGZX>8VSLQzl=Fz#Nj{y2_M`J=?Ex~}$;m~ekX0KkBZ7Ll;66`ifm@zovK>*B zt|sFCZ91%^Ns!g+VpFlPy@mSglM#l&k`!7&ITBdC&gNdETiJnEb@3=CQdq*-RCzrzv%@Q#d}c(xfyPHO`y4OPHzzHUS`8;FTMfMVlZu--#(Dqarv&HY~WPTNwre zEljjPCEy%!yZs*I2o?zxb_6>W`Fr35&hE@t1M7I{XHRO%)Z!?gG2*9RP#;EGyF?@< z8r`zhyh#|6AR=VYe4s|v90L#Id9e#!d2y7DO?gS2&!ug7B2}h!Z3%BtL><2emgo8>tRmaA<)4c9aD85DdLd>BWc6Ikj;~=;1dk$3jDZW z0PUOw28EJTi~Q>=H{jPQ|3|@|j-lHmQe-^TAUZ?U1ZjMS=mBgG^f8cG^F}`C%|uP* z`pt9e_ttFnpIf@l)9w|jzTE7_L3fU;&c@ExP!9xt1Hk_QeO;XI%MVYEuu&iYq{{G9 zjweaOZF%F=k${U5N`ig29!6yed@O!-6eEmSROnr#zVvITD{s*dQf@pkU2?!(5BXN7 zb%7|$YVWoEwvf_1Dm4G$lVOkG`U0~-+4h#y;Y5~g-q(5dT{)nCIn^(*?#$u$?^-TO zueBwnZsUH@rC>E7nY7N-)mJE}v)=0r->#z-i}%Ot8O>M0_K;yJg;Uhu!Y5Z){;CG& zvdI~<0cdF*uAq5I9|trE^-=MbYP_UqIIk7rs2~|pz=64=9#$Iv{7Y}Xr(YU~BI9n$ zS5-kgYJX6jF@dEFKQ}5E3#&a+@3cD#|3OqOGpHeI+A=qN(r7zZi$L`H3t0TI>o|YQ$W6tCsGH=?F&B^<-5KQ6659e#gFTjx(YY*-uiTY_ZzP7N z%n~9?Hi_RsLiW`rHXpT0ENzEy<`F|zOAs0k8m?z$UfC*Zb1oF=3X%@myej@%M+#?_ zMJYmGSA3B$E4@ee;}2&Bg{c05fWIn2!ru28NxKPXYa4KK+lU!I7^__@B#@QDMO(Wf zYom&c6QoK6d+mA1HmZQ=a3}5LtskH)-#`tVfV}6_1VoVIk=ra1iaB5!c;Et^IXCTe z2O}G$_+wfU&yQan9>?&M8+{yjBJKV z>{Z=dYiIZDWv*xS$qe~9zrU&J;4FVU`lHl)RllJq3VW@BLUlre`>$WpOF-n;8be-t z3ug6H!}e5LFn!}8z4_E+?I2yewhg#p=4hB;j<0+JwHLJvWZMjYYodlx+Abb z_&Wk_z1W|XLa2^r$RZFLaxe;V^A*uS z4=^ve()Lqc0KX|Va`v43SCwgYEgmml5Ns0ZMxqKOWJ#COc4;7eN`Y9F=#!H7j6{-v)kQ|exq9Qa01zAheTMqg z)z#@vAAvSqX@!yIB)(W+ZMm~nw_SOGOd{nu5bm2IOKn&PAPn5;dR2_4_gq4)FQ)yo`gq16 z*0#!8|BfjoWP1#}Id^!!eSs2OZ32=`-+uj{qXFeLM3rXQeY}cs1tN=~48r2kq)gT{ zIPjGE?Eb7(sAnSRLXoVQ-B#y{ud0vBfakKl4}8}`Tcknj@hBXxupJa}3{!iFqw8`) zx8G;6|LU|UN7D3((aAgnG<`QuEKkl}qgDKnfQsW4OJU(ke7pYSU93H|DTV3~P>z4w zbRS+$RJnTCvz9v2z((qO=iD!ioptk&+C#OkZGMTdZB! ztaIA9?;&dd*U;8^nYQg>3NbC-r<%)BeF(Q-Pc~pN+1DJp2b*>&&M)}RvmQ{H(uA#3 z0)w%9mi)+S*&0vU{>NEPvmUUm;veBP{Fj0*vmTha>b4Bc7gpRC-46vU!{@D2ljJ)* z(^sRI55j)mY|l4pb0PNzQRccs9LU4eI(G;iZU^z*fVFS%ot&@&s#*|MNCT>y+VY#Dpo=r=@nQ4f_-&3H%?Cm5N!Hl>q?3)C|toy*@_!zEXgZF{U+<(L+ zalU+1kvsoIXpSFtY{hM~BjMhk@ad^a?BpTllPXI-e%U`Z?9A5oTQYK(riao9j23d56S70cgQcJgN1-j}8}7MDZ3(ImlSjarUQSTL{bFh4TLrCFC75CO z88(kcAfO>^70#i79?4-|9_BMRBArYnw~Kd&!JyeGx-u**V*q^u3TKfv4m8ytLqhI{ z7752=>UBIhPV|o2VU9hk8Mlr5Nr?9>uSTXE!7!Pq;E!rTDU-z*sNfBc$*k6(>!PS5 zCMDFK4XR(I*JpfG+G1r7v*Kn6+Ox@+zQ5T4z>`kTK@wR+=n2eW*s>Bt9#g|?>oMgM$>!b*a!eohOhilfEX;P-*~l;4XctEVRBWn>>?ld zkPN?bUfk+b?0PpL+4rcf#NB6(`mSuJ_a7ijw1fFTTn=84gRZ zIL8z$uzCf5Mzbp^I_p4p z`Q7|8hd(D)dYUUOg4uV+;~izXjlt7@iAY!rqp#s%Fg*P`vcLd7YTTEm5bmbhp zIsa5z-g|dV^AINe zk8;>A3PfOReR#1Rl#AfOjav4Z1kW~Pvp8pG4$*M{D`i8s2-y(f^ZR#V8p_<`vvtsg z+>Et~0FAnAg{cjT=}76EBPoftcIiZM%V$9rY3bGm-g9ajiBz>m%?a;6Ilib6JpqEl-BM7X7DOD=zELg8=X z6{vCWIH1k}!068Zv9aM(I!f%G+DG~^riaa#>9}?){v_{-I%GIl(XpL@*m#tYfw@7t z$D^$;?muYM;GyY2N*$>_%m8L@{H>CCi1K&M&kyyt-J4D?vZtJLM(tnN`8X8D*$sUZ zdXYvBT%lA4-BkV8s-ksug}7~j*!t`?;R6%ODZ7!##S=Og$w8MBo7)ONaLxP_{Xw~+ zufOgYhe$C&hO&%zI@<7=+^$kkPrJc3QzCe^Q6s!lM5Jl<0aUATqi?^$Zzp5|uWj|s zlR>En99p>L6c2Nnh5R!j_$RQGIK=?_{(0lJ$r*TwU#RR{*O&pUb&bam?x%x|Gmc-#CS+1}$_PUY`MWUCB8-`VI z=v-y0*JM=%^6Lk-ahj#+B3$`)77r!*AcHo};ni;U;uO!@8zd6B~2aiw9mX0`sTN;-JlW0c8ug(Q8-; z$t$RIC1fcTR1Ln$`X&`mMnb9*j}b!z7j{}5Ye%_F>rvqQp2;wDW4?`@(%ZV7$y zuV#ctRCBZ$mg(niQ=aqT!)KxhfW=_Lqh1axuX=Xa(NQQ zRHAB5<>d)*xCH<32=QzQu_n(^8_jL#PL9a0||7RLb za@mgiMsBAn;uQU@<6LS?l7L_14Tfev2p5~_o&3doot8VS~RNq<@Aidc1`wNhVxbDTiTW8 z4Bz|jS^QWLpIwo6c;k?}fgQO4>0ewJPzlzxh)CuTOwG=mTOn6u$}gy3j@T=HGB-)^B8J^(#rq6^M+&k*PgVbvkfnXEYn{jRd) z!dMP~T;$9=J_D5YQaX?6Vd^-6ym9;0{_pjjGE?MEO@YK(Lf#S(pP#N+ne7b0{SqkE zYa9VG5F*hO>($t1-Aj zrp=^0d%H7il1l03d}@Z)At&P?(0*uu3=?5e&G1jmAq#!+S)ed0g-9;K0en9^|clJYh>y?g5B z&+QStjmuh*Ep&&psqmZGOH# z^S5pqko<&Oz!ps#FZJdB*%~kKg)24-;HB+67T!G09I{T+iz`<9!;i?6LlX+b=}+SAUBH z9mR?h^EW}>C72@0;lxNj`*9LMcJg;S4ku5C&qH|KP_jk~RsICq!pHYC6i%{c)e0rN z6y#D`{^uB#*MHN81}qL+V0mPl0y1raatmjF*Q3lQcyh<}0l@QWZ3p1gDmBg;JEG6z z&k&z`5VGpDJkQ-ikmx}~)Or)y>d=;nxaeihqOA#R{T>xC|Bb7kEhgEP9WNciDqfpS z_*ED0ib&~4R7PMwHc$m08TpHvsxK4q8y~0~1^@>}U!#}n&zxi(PmjcDLZy9iN|Ol0 z2>2cw4^w!5U~0m3b!CFno@TqY`bro0rO)b*@Z1V7U5VRHzQ}4mAm4rgr6jQRo#;Ei z6o=ue6bZB&9iXR}mBlGFZu_BI0nCgnu3}7aNVhI_x76i3Z{D;>Bn?A5e<|3C!`_aM{cw>0w}y z6Ps6YcM5&Mq|&=+ilS+sywKzsE-+LT=#ga2t)QUfuNFaxE@L6z-_M!Ii3ipoQiqrh)uJci`*3mD{2<3td=#0H1SaYl7TJ4F> z)wW_&#G=SjL3iS1g8N0$Mh)u;(oGX7-`MkV+8jY?t@!z!qle|RU8wmrlEEIyz#&|k z=z&reb*`ZqqvDO2*3bqQTt`Us8jHrq-6gNL&?_Z_iqU6e#%4LM2={4J5bai$3dAsuG%_aqI zu*FMO&u3T=0J25wI-(8By^4zjyF7St&{AW!hpoJh1|3e|IO?KgcvM6y9x%`xKS`2X zz4P6d!z|v&YIYZ_vmZ{7$fwRg7qx#;P8g-^=1Eg&r88>k@%sjTW3o+CuX%}XP)Q@0 zQ5fI!)cw0?015BPV^TBC)&{A9BL-MB&8JV_k5%wqK+Y_hPu_7t`*j9uS9L?2w?mCN|gET5jJ^Oa8hgc`BgSsHp`m zSOd|QKdqzpI9hAVzc{wmBk5ZeduPnTfjNkwW~pbYckNH|OGe!6UNV~d^{1n_co2$) z^`9TxHcH_3$A(>=qKChpFW|~mZU4)_3%Ax2pwwGwg_9LmE22Zh;<@Wpj)|Z~ix4M^ zl%`URP$!EW7b`~hj`YjjbNmYy+5=_s#XjR&;F4({!<~}0Mr{)%7YjwOx$Nd+5LqyNCfTNR-yl?NPxn}*4fxr8W zq=zrG-!5#+l(Qi>)6lNTN?IcIWKw1t)Am0}C9f1gmg|(tN8xn3d!(T4Cy=X>h;uxe zg|O;JSxpURxkp(P5fB5vuHO`>v|%urVwD)Oq@fSohW@Hw>`r}}7I7z$Jmx?OnElHu zokeaLRfWtcT#RfLunDbq6L1;e_ssHssmr=LeY;A!QfWL;%fPK;SxJs#g)krmkYZ+f z`uiZuEU%~hapO_7o??YrrFxZ0)qi+6v6&pU3zZ68{~y%E{$Vzo>2}y8LsGtw39xkn zrl0*u(qUu`@`m8WdO2Oxw3)2y^#mN5(^zA>?Oea6j^IPd8pP?6=#%MMB&(M2W2l-& zY?}D_c)Qv=ecNAOe0;p$U(4)~@uxubdHBMYQ~|!sSiQ4UKYfxQW(UH){>4dxs^vC@ z;^cws{T1)_49)8_OvN?kJ1%Wk=kW-6?=?iB41YW$} zGU&AW?bOyz`T&>Eo2>k+t!l98YJrvhJ?!6BWEF1z&Xjv^_0CQAdoQ;w+T|YDQDEG2 z2pgDMl6Ronq>+ zVG(ODscpA+KJy?{y?g-#NlR1EIeUtQ=-$A;%N@~(Ew64+SG8^$gZ8qnH`A52Rd zpk5KUhnWxdw3emrylwjzB^|JY$4b;0pY=mAe(dPr98w4F>{7{4H;^Jr5K1+tq2I20 zOD{^nd5eSkiVM%z5?)rF>Car~1+xSaddqS$nMQQm`i5Dc{>*+SVz#Ds2E8zTt z1T2|c-u{U*FsG+0L0DufZ0XH`=qvXU&IiNurJBikAWc%WLMsREhe=punv_7fHA41S+fF6|eIN z8V<0rkj5|xseQ))qYV>0(>!}d-s@J2BVy?c>qc-##T5MMvJT8OIJ}99ihJqWS``Rm zqwX^a;Cm z3C^IP{i>-$H(iK~#wdIDNx1Es0o}ycw0Zes4eiy0u+J=9B#k3z7%)zcHcG>y5Fp5~ zjkKR(QA(#5OLyR2X&`UanqC=%4EY9<7Z{l^LYPi`9yp z3R!A#~s_IL1R$pcHbylac`lMC2+-DQqsyi+$oV~hD zH(zmOkz0Q@o_~b6Jq;6!6~j|dO_rGC;wv=gsfmaP5fPCw#ux(t0N^-|O?fe9d)53i6lugGcy1HoO90QO)g84BuSDaNs=TtoGLjV@W7xP07v*1fA5K#blz^25me`)dp0L=h^FMr35O916O`A7t??)VJ2 z0svsgH3Fb1765<&Kmce700yZ2WfUOK%~3%4-|ErA?*MSq0bnoAd+ zoVoTw{ndXf_IHmpm4QFbfKWnepb*3(12Um%s1|CBx*`{ZK_n8%qnZX<=wbrppgd$l z3^~vn-m|o-RCPX_kLFE$J-!3)%6swoL8h+Os5NPqBtH0z>$JM@x;fn&{V}U;vdtd* z^sn`)`b@oD|G@wTZg(?`GFW0ns{5Gr}LJk@QC?OdsmTF8(y_hM${Wk*KKWSP|_yW@ZF|7+Im z;+9Cj01_s!M~oEb>|%pD%$T<>Fm!L)I_;ubI9p}5I*at53Y98HGVjQtRXT%F^v1ZY z7RVLhFP}~o^)%6mGhiyna>Z&}J^7q?ZPd$Sog;Le@{wC=wAD_j`WN~XXZt>KV%xVX zufCiosX)x6GocXS_R{D`HAx_uB$t$u5n?3*`LbQMEUiHOXb45G)rx)g zBWv)j(ebu-=qw7SFgl;e&6Af>H~h>3-03Zx8DweE_6u6(|TGKZ>XuUaSzubFy!G z=Rf*b=^JN)1y6aW!W$S0n&26&p5x$GVK4P^Z+6yY_=;kWg0~f|QbaEC5yaVo-_ZRQ zd+s13pFS}w&M9eISik}{*$r6ExKar>wyYIy@d9u*c4J}!r(m~;cDAEI+n_^~&tn|p z$bJw{IR&q^BO6KmnF&s)g(%18L)F7|+!JUb}M|I|aV zQUD=b(>eNvSIj}?l$Xe2)^0yeexwC{B5CdhbH4Gh{a!a^u$Nu^Ga%pIm(UJVJ`@%; zHNW{O_kdO^`Kg9nq(QO=8TKjd9Rqabtr(O)YR>h1d3^c*%c9xOJWujUp%+}mJG<<% zANoH);2&cXC=aFBW$Xk_Dg=fO_kKO?mrZOOdx!`C}_siP}}F*%R#>M%h!;jp*N~raS5D z`1q@=@cp~SD!*ov->}(lZ<~K-ho7-GRvZ~?j*1P8m~m0oq0D+z*+5xv)P$rq7wU4Q zqX0S!q^tXM7sP0IN+O(G>S!vD=1OR(l-9~pbg;J+FV(c}2-x?^FU}$^AiPbt5|jZ^)g( zmZExjGqRScvu2vw^55x3vyuvD!Fsvfo7+J{Fi_2GWUJfMm2GaLL=^o7UcP(V;U`&5 zxYAb*a3dSpACt~1=;{I8Rnk+Hr19c5Ya47d288aEvowW>_yISw33WENTXTH-0+o}g zPtodD8A@yw;ubXyBpE4IE6lY6P@TdeEvw!!xN$>#loYf{r7<@ea_4;2^i@Mv!Hh?| z6D`-2x;yRI-rCXpUU2P%mF~s{Eop>h3*p&HM7HrLor=8kDBr%%nx`FP5!lF7sEX=C zI#$TJbsy*w6)f@>iOGhx?(s=#H#MormNdm2b33=0&8qTpS5wLB+p*j~g7$DDqmO~| z!w)sB;B{cO@>{{Z+sl$!V|$x26_4@2!``253mv{)>)Z8kkLNYS&62lH!kd0`R=&Fe z+4rjCKI2fYKnEKZRyKCEBIU}v`^fj;XzHhLuO_Y9+|+Jha-+r+yEOwxJ-NOcy)p0c zg?Ht~k9E{z-o#CQpMKBYpEvv8oW>5{LJw)dCecN??rp$VOOO;6sx z-oc=L6)>%UrzULF&4|ycPh8fuU-ore&UHTPu?9{btZLx!2dP*yD~P zo;W-A`Y)nKFaHMKg?hv6hv=7_Qyx@ByacJzWXLhl6m=Rk^?uFkSm(OdvhMY)cYW)h z^=3A>p$*qpe*+CR)ZNX-X{u>lfC<7?Q_zCL2mvb!y4Zx`5Q$4H9*Ov*(zDCJAtR?u zT&m<&i;QKUuT1^88dk1x#mZKpX#+a;NGotZWR)MW+P|{J@7U@;*ycak?!R~|h8z$G z2gZnFVuydA&|(ig4n$@5Jd+7vCuAxK(@Ei{$66TvUReH7 zIKR83o@MYFcbp5u=c;9});#Rg4I?eWL`yK$GR(9BW39e^SVB)T=xYxcXios$hesAw zvhvEtCp*6!0&)t@U-c#oZxW5qlR<1UiAxso$tEE=Bqo=n}Eum2~lRmnf+NV=#p>8rQFU-#lt5cBqAmu{XWt^jknjR zNwXVTv}$uRMT(UuRfelvMX$Z_)|7Xq&6q8<36t13rc9eLYb|FkT)A=Q0Vd_1cy?n_ z@0qF_--UZ_=yR&>85A1WGPayrAe1jr`zu6(yd3YyWyELZ^5D^d;;4b zAfb3c!|+zf+#xBXm~uP+rT6k5^{@Sh%9Mp8TTT%owd-(i^XTvSdmT`%<|h27t~v7- zEN&kEtNuPW(2U%iCO7n9Jk8TS-P6B+<|)p<+AQh&0-J+J969-2ug`SD! zJmZ1W9qOD%VOku@`=74&yZCsKB7|X4TA8w#VHPfP%(D;*sY0C(GKb>9aDF%p4vj-1 zyG^E?3JNJApKMQYoS_Ngd~pHUCRt+8>=l~%*^?2r9J${3D)OO$3p2;-yj5k2Q@j!uK(C&peBDr+h9wmA z*`t87zR@LlmZxND=j}*5F7+trTEw#Kx`|`Zs?q|Qg6G;HT z`aAr$;LhRdI|NnxGu%G_ZNpwR(Y~HHHy`NG;Q^gGwN{sKZv%7>d&xx4;(fjP+^`3* z-jW6yXpun%`N3d=J+_Ci>PJHj^^jr4xD-LCXoTpPq*z#rX*~ z4C3LLdidyf0e%;fcaiWeme?hlyHs138R>Fon_}phPoP{%l?@dYSHXgzg$O~QrY4}F zQBF&1y-=ZQg$dIxT)1r_M3@mN(nV3CToEnWEiq!;qoecp22QL68QCDNnG-MG*d$m+ z78@isrjjICnq)=qI{=Wf^o1LwHd;_hlO|HSbeS?_7-T6LjV!HJDF9k^ItzNeb&~Wf z%Gm{XOMkc+hJ?Yu%*KWl%d+J-eh`W?8s(TwR?KEkEf&umJNEKgr%uFP4hjGa8d5ef zc+q5tA-IMb>TfL<`Vqj2A(;~^7aOgz%4Vyr)?ke_Hd$+}=2~ay#)AB8+Gd*7T`LXQOaF_;1HQ%FDH=S}TjSk>rPze@PcZ%TgmyP7}zVSRu4+ur{1k3Icsj%Up^ z*JCwLm@NS2zZ$T>BFz?CtZIoRDzy~*3(K}9TYj&MYpk-$<@)vew^kQi8{q%YzknbR z10umZAiN*}h+5rDAPI;K765Sr>rV0O+CU(%o=|8*k;wXDv5h1oY#=FVV<{<{YtUfZ zN{g@nNG7-iknD?H(OFK;e)95mGtT9}!77d%WpLu8fHP;AT(~IY%2gIOZi={b*TI8_ zJ}@wyJbCH|2iFAwVE__RHx!gXUc8J!L)!rZV}>_xGqA9(^WozV9Gn|``8oj)?tRsb7vcV<_7^NJ{ zqC!!@13V!pOFbZ>K~>rTnNZ3qY)~Yex{4SQ5=nhU4T*`Sp<;%l=-6DbLtf(OsQ4j2 z33OKCuqsJ(Rq{}f6n?7Ip+0GBuk@keX84<;$dsurS?sRtp+7n7soY_E^4MGX!%$W+ zTLr^#3fWgh!$?*$SH;60>m~S5g@MV<^kfH zt__gTT38_QvE2*vpmA9qJ@h5%z_`g;iwLANJvAV;4H*IUr_oK*N>L!axokj2)3*XL zH+>->i|FDszZj6+JUbxg>BBF%XSOB}?UlcUN1}lDuaNO7YLO5q{`Y1|lsKAFf~#!a z%y4nZrJU@lm_L+&LKO(#1`;UY_o{>(afi>6QT= zG`k4!aBFFSN48YoJWT4>Z&L=?y9Qf?1%{fofOy=DNjz!#YQXU4tUTq&8rdQvFsfyZ zZ7CV>OzRroQaWHl+nU@`HsHCN>%|uCfS20WtCsQsubZO>ym_?srJ!x+s)!&oC`v;j zX+|bP6pBq4W+ywl9UL6?#fg8p1|e_I`0KBKHthuDUmMhaL)V?7g^hsBZQ&$9<~{uE zmHCI+@R@ zMoV@_9}uwAMXwJmt@^X^`yl^p!v3@QTiZ)Uw2gqb1iuBAjlxNmyJ#oDThTw;zTEAR z$GdG0%mut-$K497vY<$jJS9pjDO0wc3Kb`)QniB`HE*a>_xaIa@uT^Ly0uty{n4h6 z&Y>G^D`36Q;RNrz=*ob1Io$LE8NmiY`M|p)=LNhc3YENf^p0u6g?;T4Ixpb;!J~nV zq7?)iU-XcGO?Z4v|9d~50}Ol)ehIBZA}0iVIA9KZWaoi))KRl#=8~m>kCAZvFu$~l zU<=00a<|8d_5W;));w){+l?;!!{ID{C!G|;k)y!p6#f0Qw07pwh5~ky*PNr~2X?u% znqXI4XSpfq?rt@YU6JQJbNzyae$jlpwEKMJ`DVYt*;i~0;;O4?ym%q=;lrf-j5eG0 zUmULhBev6l>oON4h~2)%DhJnHXD?j1a}{B<)^z0JplH#wE5=CJbnGHToH*IykA$;b zE78crG;{F^3(Mb17KKSp9ldj!z0j8?%|7YUnaYsCM5avYl_e%1nG@|G;OrN31JpYDZ@o}>3< ztNM&PJ)iz{%@{C1c@MJcf+0iB8#Y44=rMkF%7h6g>!H^*9(iP^9{aho_xGL(G1I20 znla;?S+o8#XO4n-^OP)DpjfOT<=3;gbM_Let}3j2`FI5i=vi6ms?f`oP^6fsL7`jIeVT}`W7tMZP6kF@4dIn zhhyoiAnN1&Ddg*OL!M6mWnD79-oIkU{;d^q{#ZZM{}BkC0|*&9I|;Wc8Va=tgIPd8 z5Q}&dCkhEkBr>vi6cll2Xkv=Dq4SdjRwNK2B(cOr!~{rY==(`>t3KFzZwnTMTY+TS zbfhq}j~8Q3*qnJX;mwD5`A)dq00q9`Yl4J$RM&*O2k3e@Isiq!`iv-1rYc&XIRM3k zECLk!VlZ*yY!@%yqe}ETcUV~FE6K~kBukcGDPA-qRjT)~kF=9%l`b&IHwz>q_$x?e z=v_gwqUcgMp>GGt4j4jmLZ=dv8*CSn7wi#8eiW~ifx;u zU~UlZTN@}>Zc>Fx0#zmS-5}M$!XP!HY-eiM_^MMUO1*jo8Z_w8sF95(Ev{?ztNE-uI`~0}l*553}IW-4{cPgSrJq&wl$jCkRu)UrYH8{xl?omzH-FoGfZm+#I;Hz(jYgyP*Am78| zgZv0C3uGmFWDqmw&p0H5{S$ho{Ttp9?CMJk|Bv<2-WPBn7rg;ERv+~H;Qe46Yxvh3 z2nX@hAL%AtyvR2t4s@!0jTZGw@VwT8jxPA&^_${z(HX!`sci^75(1ZcB?PH9p^IJs zVQO83MiUL|1~4w(86ZZpi_>WmVTAz6q2EMmah3G3`K&*gdkZ^1vR^_TIrRHhyKSRj zKSjz8HI<){JdFCiplkTpG%ph#pyd;7I=(dBe=RugAC~)0zxpnJyS~+C5Nn#)9YH|s zi8W8`jX9ApjNm}*``MMb_g^R@M&=naM%X4=Lt^Rxs)G)pJM1tXN0^Oc-1asz! z%R)3az%s%JIPtT-S6|kT+COZ1XCiEGySEKxUrbSe!|v{+lM2gG?9afd5#nSJb6thz z#!dNlXBB39uu7OGPl>#EVe;k;yM0(y!Iv)_KYkwY=MN7BrBZ+Z1c3rox$i!rAVI1H z3q}$mM9mY*l@@l{)yFOq-cB^1h*W^@+Zg=#sp8LHYz2rtoCqDwo`fyBD%^XB5h2D! zvErPsco!Q4B>2`6qd5W02wwmz9F$19?9oIr<(}e0OC9x{uowAH8b@3DB_aVC)O)7S zEo(Gx!dX;Tw(a4Q!;hXztLIs1g%=A46#3bTw}MXz|6A!rUqG3)&SlohFA)u>aJ*GU z!~&|K@d4GNH6PX_s8y?0ojQr?)vME>0aK$!_0=Ri9?*OV9>fg>t>qH&fL422+a+WW zH|=fhmry`-Fl@K>%s-u&x7!hkfIFkCN!O|d-FhVH)vNKji*~=~`{(}mA?10%@Ah!( ztj{CXTi+JdF9H$+(bRy!Xj8z@#qt4<{cBHR)&j#rm&wz0Nf|NXYSbucW5(P)^Nfsf z<31)#h&$rZ4=Rv ztU5_bs-28XWXZkW6%-VrN@;{0Q>YdXsHt^s4Qp~}X?2y(@Rq00FYF8q+>DGIOiVn? z%$#L0!rUpWi*7bHQS9srI5-eEIrTg)_Vs1zmZ_`ZCIJ2)f&uVagdBj^BfJBMa_}FZ z^6n6Qpi%c%6U_&0Z8kW&10DbnAqW+Q(NI(XNn%hm4#(lDsuWF=t9uCVcSJ<*D^_fe zE?v%rqTv$M8Ccb9(4YoG=-M$be2R&!2Z!7(3JOD%lLZMBZk%Tymtx=SOrmd@~X^BKS>gw7W z8aAw0k!orhqbIXxFOLHUYdCV0&xw;#&YZ2{!bKTZt_rwuQ_h{cLLNL+fPrb{$x|md zxIPF7+aMuLKtcJL7cZ00(0+k|F~ys=U9hl5`S39e2WOfuU%TPqT}D7~m>)kE5D^^+ z$^!u00G`%VDQAm^amCeI5xIFad0363iKB)E=+>d zzz`lDZ+v_Z0s>gcZ!$45n^7$mc2+BYn+?=%M{_vXJDun*7YDanBmlsJpeP7JfML-H z!Vg8oU>G8fs~`v(l2l1iv@~ra!$@UWO&lkU=QRt0bWzkINit+vkD@42RlS;KwXW;) zcnlfB06-oH3Wp&1Ff0N=l%XgRhGF1v$auVR0s)0c#3YeW$z=T$idrhw0F9=OPB+M4 zsAn<_u~-_|Y{MLmMlRPRk7td~Hzg2Q7YfaaM7G6Za}tRisnonoWDax`^iK0?jQL7O(8mnoQbvm83^lF5`U}iMJnN0RDo1qqqJ*`$?v$>DmF3{m{ zU#C-$%jJGBP zqKEMcq99*;+=uuGJvPaqgY zBx;~ksnKj~8X|}>D5?>OWGtDiF@@qOhPlkn?imM%E1aC3b8)%qjWWo2SxBVuP~=HMXaCnQC23}^Yn-jV{KwRF+rR->*B>*lOVx{L}VT)k(O8~U7j@gNTI0Ka|5%~g5j;`?4ZgQ-{=N_jk!U-pYIvJ;v zGo5u#w)1h}!gujp;(*I8J3UusMgF_V)h5t2*95yBHJdmNK-VCk)uYQcsc49KS1g{98V^cWgk%ErEjExxw^X z&<&w0^oJ8xX~IRw6?vi~ON{R!-ak6)i z4tXx49RIgFXeWS`VXS9n1oN=2*Vx!BaB%bqJc0Z)+*xMk8y?hH;o&jC$7f7H05U=a zaufhuRE$~yz{LwPy5W*$oRrKKa&iL{6naK!8F?mLb%L+s6JnWJZ@9Y4l7^OzP@yEk zM6jDE1#%AnJnV~egb4vAO(K~x#mBU1EHh@{?XUx5b}ITA0Kk7<5X^@E z(n#{P%WgD#?S(UI7TG>?{Oq?M)ggyq9d?+vdGov+brjPv$Dkc|9NP&eaOpkwU92^(PfPq%e5XB3iZNx=zCc19^PNmK0nqk4hn7hYv9 zQ=^uIW-XkxY2&0_I~N@~IO^5M+PryCEG)d1ED^D7hr4|TT)psu@wG_37J&(Xg#DGW zKtU-Lrx5%ANCbzJpNa57u0(|Y1wbM-q~c6YE@Yf>hC*F3{DYYoE`D(3>Jv|1KFT?A z&!AAAJjL?mAN0S&94yR0K->WZWln+wQwkK^rAUdLGtRJ;D3Jv+GE2#lS(!D#J5IcHB@^y)S)xkRU~3DX8zz1@;k?+kOD zt+8ewp-gnsjiI0XWWV41#>jHZ53Rp(4HgROs6)}WzO~!0er0U9@gnP;h%kV-a2Pt{ zq6JB@V*E;!AShLes!Z7-@U#&o47BYuEPuAs#R1jTuuDS?ovoI_T!8k2L!E*4!@~Uo zI+RBRHK1eNkbGe6--xaP>u!Wsfek++LIIxRwY~88IDs0Qm<*pY{_@`#uPe`liC(5m zjWA>8F>~go-Ejwt1tzlwLt45JwM5avpvgB}+E0>o%Outg0 zQh*049ap8AjT&_v)ob9QQ6qm%ngnasB2=q3B<5A7(hZeLn_6v{bMJ&OdHfqm z*XyqoT_%n>&c_J~XcXz`q)*?!G4Om(42AHXP(`i+_&4kY48nzL5Fx^jNRjqMiE}7k zyaNf)-oU_l4-fAh0)ivNAZPU&%1OIEOIJW^3VZ4$MT!_+I{o%Zu}Vg&u)MNpk-DX` zJyx^R3x2cv^TZ3}=l`*aeD13b{_oococMOcKj!%3$T&VHTqn3t-MuUQAbRgcH$?t^ zU*R82Fs^cyALoDi$da`2k|IF!f0#29xcwb3dcbY2K&QSTX#+@J&xxZ}#mn;o&YBUw z44?%9n5T6tZ%QDK*9T_sVoD;+sv1^BLfPx4R8#y^a2KuF6bjN7nL-!BATbzM$8@N) zNJSBB1Ee(u58af1OgKrFH}4#+^^C%4!|{DaNsspe98m72vhsK&1+Zkv`O#lv@@XHe z0NOW=^ssnsa`*tiX_F>BA znx#VK9P-sXXQq=`-2PG6EbCEBDXpn@Jd-f^@GoTIb}c(F6e0#>a?gSi*d#h?#Al>d z{VSEX_)T&YMK&xCeo^o6O4$ZF=mAP-7{TUVj|3aCsuUDkg5RQm2{f^9kt-85$sa~_)8cMFgunLaO2!-M z4^0H)1zVRGKEH4j`sC(7cgVNwjs1c3yFSzVJ)<&l{;Bz^8$hfN~(v9EK}^vSdPnsTLDo&KoB9^ zGBZdRS$uepFgh@%Z6wT7;S+iz!?_ZIEDN<{3 zp=uxV$Xmx~mH-)sjyf)4s1R|X4$9yue4~0Fq3VuihSAE7M|dB>-)l&sGb403EyRZ_ zNj8|*oB#;4SSSk~u}2)w8;&IpoC3nb%k{Cp+~F?j7RXuS*-@{1ZD}FPxkrVSN*Joy zXlxj((c$xX6Gl|k_t4i!Q#RINTDn!Q`d#vxYHDaP#$mymumW28PPEZ)l=;j7n7e9X z4#DpGqWSLk;j;Vb0z|GGSLP{*%p1qK1Ag^Be}>^$A_XR;g*qb3S*Nk-|_LWB`@`0K}9yZ}-dONujhn zsaU(1io$wdlR0TSzjD-wy9Mx9ckhnw$;;CdB*-a(X>_ zWYX~TB2`CIk!}R{=>wIh(91F0Xq}ELvS@jP=AN9~6At1MW1Iu6-90i$I~w|c5R&&qNxh*C zV??V~2+y8Qnn_Zg4o=6x=sVQ`6eJiXOH%4O02H4-he0;DAbAUaIKba!6JQM3$drH) zAD-u;piDu5zC(%htK`6;uCuL)2oHfK3W0Nko}>WgDqcM(LKFd&px0mI(BP}#+jfdZ z<6PlUQF!Q)Po8Re$aQpC^wiTyoYZ`M3Naqnahla-O(r!<5W?MY**djU54{_6&1J1r z=)dsL^7C8~WudW|ECjY)2m|)8z#GSTxmcNH3-k9Uj*WCvSOywNnxUkljOo~_Mmxl1 z=eEfCBT!iC0Me;!a@q|9$cU^!AkCl}u#_0H1q(1eCz8vp6uZg|G73$*>Jy)KZqWhB z!EX+KM8P7|VN|3D<$BIV2~h|Air1OC+WA9zd|6 zCQ3=8)L+H=!n?+w-bR zm2`AS?4v1*LV$$%=t>)X0EGmA$z-0%uO|Ie;qSD7)`C$5Y=wh zj-gH}?3@kO*SUdIOS(_YK9bpUjc=L%=1aZN)XdxqRn*VE;iKE!bmSw)hJg|dD)G;1 ze5%A+O2X%LjAZSWVh#xsd|L7XtMwoFOm>dYFL{VSFe!zRBV~{p78q~E!#^a;mZ&|; zuk~S-!q*g{gDBLw3TuG}syt3tRYI0pM6`RO22t)I8;vwL^e_&!Q*0Q^Cmw_JQ=_!U zgcBR+V9%voc}87T*Z@`0aCBlbXkc$O>dKxeM2loedZ5oFH|-jcjRGEhN@oQHHrhO% zPg3RsSn9H*m#Rb%=R^0gs9NTt(05^IpW=Fk*WNUw-A6Ena{(@=zb=Ls$VU3D@dh^v zA@k;s5*+x<>uykEje-jn0U+NKk77f^;l$D&$R&-Q=@_WdW?^ieQ1!gjBsmFF7Pna* z3{REpI*R}D8ts_IC=R((()E{-WMSFtjuq8S38La`N`z+-@(eA{`&4YKAnxNMJ&4RZ zVP`w=)f|cR)GJwY3$mr`>@~+ra#k6g*A1WV<%FMrxA`uu+4P)u)Bd=S=;(=5?lDV@s0s z$(OAw1LIxY>Pv5qOZ6~UZ5e2J>~klH!b0~RXU$Ji>p*9L*E>8|I?60S4g(c>P~AX< zeTCfCEuHFQgT9I`V)Sp)XzblIHX(ZrhL$7>oXo>H>q5B5e4pUZ3SSejc@BNKsuHe3 zcoG}J6w*U>At9VY{N)-5XddK`5@V6@ zM&JrGtEyeypVBQslYbpVuXCWxQpfu&WwJ)=Z=dN;`PpkJCw&s>J->R5I#X`flTPQl zk(jc$eKW_(%`>7Y@m;H0tPrTTJ=8fd_g4;Z>T{$8SycC`3l!#;L2*xlxBPKy*y#KN zK0!3rp$qKY>O=@I=f-I~e9KpumOI{Af@7?e2zxrwfHM%mk>wUITu`nfD%Jij%oid> z9!9@M?r1glQnO+R#{iW)oz7d;#HZI+ku68_FNPO-ieNi&hHYw+v`gBp>5hw7VDshX zdfdma-2;_WnULMQRw}_8V5l5J&JGQ#WYi7#$tAb-;qahHu{O#gSN52HH3+j%cBchx zN-yMCcdu6>S49q`tExSd+ezqcf~H?^Za zk0V>TD}~7)0o=(R7!ux>8DE8cJu%iScR3&-khw{LZeD~ab#hggBH(Hng;C;~Jf*yd z++*n$)KS<;I?yX*GqiR#T1t5lKPkCn$ZlOBF*58> z-QTOIH{j#b3O{38z66*>tH*IwxUD=X$Qi<2G!4+R*rJbzx^kQskzqc{9E00O{+PWB z0w8Y}(+N4!Ysj}cy^ZmX2NJR3hrA1w*dsX{?Yf7&&Pc&{o#sABlpTW%w0^unSNyTax z4ky>=j0L7^>)U>#m0mK2aGz#d(;V+&9d@#shCnee!o1J@IkeSUi{Pla9ta zywox$#!o>I-#p50%0lK6a}3N$*bWs-@oDRNoEDg|saxQkxz#l0@AsT4xtR?2%Wh}1 z%s$KRZb)MwsF_SrETKNsye8Iqj#%T`Hdf6wldlj~rsa`I!!w_7uhO0&80LF{!MzP) z4;CvE)0Ejzkc9kqhLXjfs@w?ZY>6oqEkBti)B@ z&yr;LcZB?8i~0+rT^+x!GM0=wJ={_D4aIZDkZJk$6aH@}D2dvw(Ja?`*!ZUDAo%L- z<}~i7bJC6~?2vwPOW|xVTW2`5ZUz2H9%vZVxK1jp70bw{F+W>?G)+aiX=2f?-Wlnk zU?JZ`ah~V?=;Q`479X+j2pjW<6bH?Iqnzx#zaY>oB7*Vl)FPhF)IOm`0o?$*dK zKO2|0Z#;D`BcLFs)i?yJy?Y?X&*D@-Xl^_c~)vs1x9=EOkS$fKYY0 zNj*LCxHYy?n8t`2Hj+|(8)j=PBUj z=%M3)V;lSPkzJgsLN!#QHE6VHO@~sf@G{6}WCXG*+8J$wHm{{&ZW(_>rM$Yf;cwetJ5zCRfa38|9dVX?4SgD>1|3BAC-XMt{Amgq z*Kzc>UW?(eMJb@N@dO18jq?8QXQmwCbXt2>#64xs)48h&C`nr|!$x~ZCMQe#@2xdD zgTo76@O(4Eze-F=i{!b#9{`h zRGYJ^;s8;_0I+To0sK-8RLh5rbSWw1d(*u9iM_$)^gN5{pZmxMYD*5!c@y&68Y!_B z#!t3!vW#yLs7ZxD^}nToDp8rR2^5sl?Jp}UbAwi(R9pu^Jg-=iiMk@l zTy@~SXw+tY;-&7JybItTn0XQE&j(&H@~N_%YE6sf+sWcPJdjBdu(la7P;5$LiFTrU zNd3dN8zxJa(nGZdNaV7$(n+@hsFJFB$%22avla5Pq0>f*1Clk-(V;Rk5Pi};mLP^a zEFz&Kb(?fN)Q6Mw*hRDy=6UL3C8)XvEoQFfq+OU@eA6;DEj)t^L`HidJ5hLys$iAb zeKKuSTuvqbQswXksVhouBY|%)0#yo7Aj1J&8ya_j;Xr>2b%#ly4e&+UmO^ZAIq7tA z-Cc|I#ENJWHQLp!R1aGyKNq;QMNjI?R+M~74(pOGGY#rWF%smj;<>5=c?}z+g*TLY zp+IZTL=6gJOs-j&Bs85Luc{-a{%Ys>pjN2oe~G9Xj`C!~(oxE9%tI2#K?d*+N+)VC zn)^gqUD~3TL;s=5psEolF)?isb*lya+pd>tm%En=lPZ+apvvj+jDd1*Y$8l%jj^L> zIfbkJdfn2s8yPWd`P!NWFeoa@2GVTDhbpoRt= zGDrHNbx@jO$U|%9o^lS6HN6x-_cQ8VF4k$&6M?}PM?=!_Ma4GUp##&3`DC!N-q6fU z`pOQdT`MvLot~Us!`QjPUJflQ^ss^)s-j?$od9$f7c1|mJe2r*cwMbPkO2DX;R)XI zvo?3GGV#z7KS7`IKqeblRqKkNwLl(fVZ!#|Hs_kUAIcE|nm-$plMwvSdpTAkjBN}<1B6GV*gmlPA z-mKx0Z0m-)e8w5prJErz;J^e*(jHos_ZImCS6+h+@4~HcCgbCh(XbR)_c(Aj%jcU? z33lw@$XfCF60Wi$UFI?U>lqEhl3)AyfppnZ*}VI5g$NV#Vin2^w+G39Fd@It0b80% z(eJGJCa5K;TvCH!X&poXxF|b=xth5G#i~&Gk)o^2NM09ht03u3z^62Be4RIeZk%{S z@@>el_{~$Wt5WzC;Eo{!A5D`T42TbBI=|UQ&rpXTNvz-Ri z5`ME7&jbqQXuc1-4^bFb8IMyL>~@5J5z)*^q7E($bAcvM$JPp{^Oi5!-hiv0(Q8;& zZ&pjI*uh1rW^>h3Im7eP8eapB6{~*Up2nb>4c%qujbxxD>jt|>${neJ9s&p+Rko-( zCv?^5DJtR57 z`F6h1MfaF(N&cvY6MkJGW3D7kxS$}k{OKa3QzOj>d>hx<+_56-E15m}HFCEu#kRW~ zu=g8pBfQE{$G=vzsQZ_lSIM;g26>L~rWsxXn-dprY#Q4-o^BxWW@3%) z-d3xp5JL>H(IcS3aA@A#6_X{9YFuCQu7O&6Q17+UQr@IR3^Bx3qkC?43v}7&1lpxD zmG!QceE2mns!=V673JNlp)Re=`Kf$E3K#pfppaYios&sTx@Po~@F4|ii;aoq!VOt2 z`M2Ybg;R35*Y!#>ncMH|L*;O zt*44@%9=@4lo2wIdRW1Ij{c9(x4J@M#<9#|M}yT_bi$5-qubb~Vbg#aW;?Hn_bqNe4z8&@(8%;j!BfFAGmURgG*v3q zJ7t&BuQlIj#f4s4Xqb(=gXS)*;P@Oip}qrW97$M>A}v+0ix(wO!gFwwJ=kw~&S;%5 z=C&0$ty*Do8yRir&eZ{(uJmTaJ3~s-cH)Okg)z!`DXWD97^!T<#o{CI)Oy^j%3}qa z2Z8Lls4zwkf{`>AzkrZ~^+|cOb#Y*h?)}G(Z%HLlr1~!FxZ5N9r{GIeeyS~KWhAA% zQT)lvMKTj)sUG^uIl5b5U0i19OwPM_o=7Wy1d7ItQvB7O{JzfS1I|IADR%&M0 zJn$xCjK>Yew(QyaQ~7^puoO#w(B4qi1hFU81rP^hX$G{*t%q6h6>3a*=+`+uY`)#< z%9h8a(q^k<@5X|AA2UJAn!XVALsX)W3_2e^1ROM_RxWuQ$U=nUJHup8@W%0doAPMig;tJ_ z=E4kYETeNc(gABF;eezB+B6SAp~IVyTGq6PsZ}~sghl=EZZW}Cbq5}CbA`mrT1}#u>SwY#ll+fU6Wt3410xt&} z>?T^g;rc`S9%4Gs5*u<~i_A`rD0 zxiAvxACWxEKD>ArZ6Ye(G3XB(gSVrKD?ysyBE0 z^BTX#6YW1t3#5OQ=~XGo9^oD;Hk4M;j8i!z>3F_s!iiyvq-^Nr?DOyu?!R3I$EoivZ&ypr74>m~?Bh=tw14WZl94c1x`k^BPPbK}^22J&5x#B6^~0k|87F}rdD)CBQ))_>NVdj%T=p>cVV`=lR&zB6|G zD)nx`x_qgQAa{;lz=3n_?8~fvfs8zhJ&=#m;5a_>5_IvYZ9~0wgwZ86kuw#XYtaE7 zco)@z9jx@s8@t(`@~qm-1RIKtzQ~Wy8vBKT`O^eM<$Wrh!IJT3&bjz=rY<8JacK{V zmh{s3kb~dRICjiI4|)96A7bX2&34Rb)L;s$%=}Cq+}ukd#$?m{q}Sf>xZXI(~Bdy^c2m)>&dFwA(i<8IgwM!nVhGlceQALIUznj|7l+|t1EiK z$9-uz=kiRfjp+~@?GN(Vq#v|55R)9N1itdj!UV2Zg|~%#g4=-=D50$IzS|$1%em|! zVkkd%=Im(^>p3Q8vfH}htjXlla_*^!wQZ(f_FXTtgLn*=_$WTKAEJMYN*JhJA zke>tPARSflx7(Vth&(ZVm0}AEl*Wpu`4L3>@xBrMMCVl0S&L4r{W|x#xb0LsQE}4o zxeDsx=`xmsDCGWWsoJbK7D+eUOkD$h=eFQ4g z+%bxy&)_4{&#q@VCydOfe>(dEF~{r11})z}%U)N)*EpxiB%d3P-$iF~V^kVq@6Vp` zPaL0H$)^|r`B+>n@(rll(HWo3q!-8g1JMW-Mx~YCI;&;8Tq$$VkiD_DrCFhJeM`MW z)n=2tuZuc1D%!`N0QIcQr6EJ`*6-0lPXXJtjm%I_YZha@NOdruD{~;*#F5xdZ^H!%D1>)i_qPy8ML_E7RgDq0OC2W)Vd=p<=!UgS-AaSyy%>ZgzZ*R zQv&+51BYfD$9!W4<$WX6DbNF2FqtVj#ibM1^F?diSKYG`zX`>puxAEbB}^$h4hK2# zAWXshwYz~)-YDyWSvQDDmCIOSe>K*c?lU$92fU;*)d&dEwo$md8sJtt1~P{tV9gxf z&B`8I-^JgG%H(7{vJ>zj2q$K*;KQRnUpjB4*!)ngyo(F36rjDcW*s&k(UCE1|53l0 z&_)q8Fi25!+j{M`w1NewSSZ;nG6f%QcXQcv-mq=@6XIFbqg??!%w?uI_O;#oFzvew zR8_+wvR@jjdX~)t>eOsR-nPtXIj!$lAp`}po2MHQKV!KU+pJts(ywn=Fq0GAI_d{- z;m3BXIyWb;ioYz{U*Hlkp{}(A^{51=+xYp0^?;!tUV>wQk6{AI+&1KzeDQA5Ph zOqi<7Eijn}?rmKZ{-_;|vhC20&;xk^Rhh^J?~8>GT8r)@fhN0zsdzbr4Rdi5F%4=) z$&MgNE$xpLCyI>H?Bc*7*I)~QXb%^zl1aZT%3*(}R6V*!+)$}w@TqE(JL#-QUp=4k}$?&?m8 zss+h*PD?GuxG|gUgNyogki^*Vpixpg6kdzXO|8m~6OU*wukgNL+!tazO@W2*0I(0o z^U%AMQx7{7>{FuqjcV|KTy9`f8lR__7fCPsR63`kF95+u1^ncGy@Oi_s7e-d4Dfx4 z`zZUe_y`(X!rL&u8QjmI#=6O$Vu1GNvi z4$+yA)G&7BcutJg-njjcT$`!8vMlOKbW;PvtuHS_O_P(Ze?W<{&>D^Q**9tPm{(z6 zl^N`oShBMPO&%)qV|>0!X(8{yvvx3f4!5$Sb$HXX^2oY?%Ay=hMEuP|g-IQM&Aluyz^^``u3T8$+g zo>HmeIl{MZlI4EG;$1)FTWa2EgDIfUhLh#A7I}`QN;=F&Jj+W#^wD}XMF=)+qGB$z z@K;wJiN!~CP`_klmj<N+&SlR7GQFaHCKb zEiL%JEvO>q^(O5U&1fw`>d^+?$56DLl=}LI1X&l+-p4amgW~~7$TM;^`W!FUbE$f| zHq}<@P3CgTLkSh7@$K+N zANN!G%d9;w-IVQhsNt*y;`94I&;kM4sdW_(6(nQ!0X>+)w$sdwL@40E$l-hEocnz> zH4mx>78>E^EbkOFkihjO!*2cA5UTVr0ybhZMvY&r1Pe?Ja}v9t%#3HXjn;E;e$dFj z*S!WX#eNNHMS-B^%$|;JPL5@n1Dwj(Cy*DAC*6o*N+kk%-tIoo{`&PH2V^&ulzh(# zcL6NjCbgdI{xmMz0=$-w|axy_wE#)hK)b`qs`fAj-QBi>0-+Y0TSb~5nY@AJe$XpXiJQDTp5&N%=?u;XN}rO}Dh{@!==*<ki0)^;pMbw$pCL@2?Jsiw0UhcnL|x7 z9H3(A57;<6AMn(+LKdo_t|nDkS^Z6t%0gb3Z0M~kq*yYecHM5z)h_kX>qmc?BkmG} z3!5cKmo{eJ=BXw@K0!PIyV3~{CmY_AEE<&aP?y{67DD|uDBu7Vz3Soyz@9UmnBNUH zn46F#X&FXeCHHn@)7@%IQ5161Q)r5OIOR(G5CnJ|HERM2-$?=8SbppOx%o9at-$gG zwv;nwCOTH+W|ANAV|;7r0w9M~X>Y7h$TP@_KXR90KT_QqS_-?wm%@(}whs!?Qgqcn z$`|QNKb_6GD-NQgAs2A{7yIE7*WEt$mwW|W6^$qJZM;~g*M`;NnRiZmBi&{oxuwVO zeTM2W*!TD|(Ob<9n5xc*_m_%VkJ=5UBWr}U)vD7d_oBvlDg5b~wsjGNgqp^yZxy9RUHAl|BM@q5ZaJxr|@oQrrg}V^naLw!hu2!-6G;3`iANqi$gnY zMSOLdoB9xT9@*#7^`?P*YT1e&$S)iJ>RO6NDyBqLQb@p^BL@y!SCB4SE*;mQMGPVj zc4^tNA2GPKmwX#8xsmm4;U?s5$F0#8etk1b`Kw9sHMT#_etkR6EZJWv#%F7pq6UPK z<$|X)t0iRsG86Gg+m;}kxG>h?aA>0W!e}BPEgNB%@fn+E*znXBC7Ig zfJ#>t<0d);2iya)e(6NVPkbQBeKs)GUUK(XuQNj)jxshd{Aw@u*pt%ObrdYszdShx zvz)xBNoaeFf!CZIKL;iwe?CJ-f>6PUm3BrknXNF^U0;kwwi-ks>7In zLsasA8Z1jJXEpT51sQrP7i1k9Z8NfBlesL+IXMsbRwjIVxVu;PA^>E&X`;I!X=eND{#{)3W#GZn4+fX*9znYZ^=JmXUgyddzr%8Gbn%f&@o#~KQZT4W2S zKVHDHxki-AMvmGCvg1f@+rUkdwc*qEf>7|OvMJ7Uon(<9Tk8PohlIxspRr_v*A zs1&)sS1{}r&C6JMvzN9X?!e{dv2*b+`|d6WfZI7VyqKtS92Veyn%9*0CYUly8kkF; z`UAHZ$7NWwxR&DjAKFI+9`)Ho-4(OVtE~?5^*AtEcZ*>B@Q7Dh@z$8nQd8tPy(%fh$#V;A4l50^^WG$lG}N|tXI;QqpFg}be1(d(`54M9x& z%f;A_hW*=30o=vD^$qRf5wEZ>GyiL$FY4zvuEnk-NTnEV6K%-(*D_EEv2D+lrGGtG z|8(U0oX0%M#=?=azR;9|+cLv9J??YsSAX4cw{XTz;lqmOTE4Y3oCr1CiGXW)&6Bvg zd^G4;jfq+wH82bkFUOTyvz0XZ(_`3?G(e8z4r56pEgXWpiL6?yzoO@u1G< z86XldOuvTZBeTTVTu z3By*me|^rPE1v7{P}QrQ9!Sq+x{Jnm_Jh0W*XqT9nYP-xPgw_JP(oQQhQZ%2cg5A2 z1?H6_-b!looWc9iD8h9pS(MVFm=Qws)dBLidxF8e!x(8vmk?7(BvX-8buub99? z2njAdeNgIIRAHx{>=Hy9PElx(-oq-B@{a)LN{1^OM0^F5QGq$qSEGT>-_hk4sT4|n z#p`E3RUQ~uXU>Lc;4r{BX*GUn+fBp&5kH|L69J8B-PF)411fg;GQ*^8&)mIpP>?=1 zv-H*D3WM{3)KRDdBWTuuOlr{w#uG>6LdYVMfkfidF_R0R@^3&P#r`3l28kX9hAKd# znlr;bt`J!={E5NJDeL2+fD7KPn1&p*QbN7jlI)DOPFj=e?(L`}o@tZ~h&y%F>5gWI z*iN&Eqc34l?QjE_JZ_NQ000jJtp_}CGI38{2wv*O44$%c&#v*+@bg8D-BW(gMAvl{ z>XdYrPp*`h%6KOy;4w)cR2KB%XUf4Q8I+%lN#$Vrwnvd}WLe3G7ZuQj=@o^S42rb} zq`f77$Zt_9y8T-!1xOE5v-^$_q}lu<=g3z*D8@HoR&}QTA^btYnL0cb>8bdQ;2tyj zYW|a}J&;6tlu$RPu|LqWG2jFTPM>8h?Dgd&Z6_6v?2SadW<-A5)$_&@^Z_VKkFn(G zeWxj$XseG?pE%xS;G7d9bc_42h*hcQ8FYh;C{U_J1*Wt?#ow08Gwf0W) zmzWzn_7SE0e0uvUHrf|oJAO&6d4sb}QqXbOXF-Gh(Nm=B>a$)41ihEz>K)BCAHOx& zYV04aa9KiJTpT~1PV9aaQc+u@9xjRJhf92SJ@q?4ShyvF)*90nuWHS29iKbgU4;M> zFM{XS<0qbf_nB!WhZFN#_tD-!CUu)yHnIo!1D6J#0|+biVqe9@zRbPFunhRNRn$1g z-o8u6xZ5SeI`uOp63WIi%7CuIA{GtZp^m+#p@8iGYrtkKZ_VRAB6g=AN6yT z*{~ejhRPAgd({r`@4sY9HboeQ=}Fm6F2z3szv0JJI=pL3LW7l~eOwG%mJ_UJqaHLd zW2D0gH~UL(1L&gyHN3?a_Sk(d0 zM;CGwjH@yYI>zy;c9cU9Jt}ipn}%P%LcAa=kP)2p7u@74t0Sf%n~z$e`CqUoNpZ2Y zNvWvut9A2&EmZVG<#eDTzjH>oB^DBK!iVp=w92v?0jubnbhjCuQrw3X4g5p zS9YRW>gwV?L+geC(`ya#9>GOtiY7OQz}v3{n-u}weJCxLTWWs-7b$&Im7P*5z^CrB z>QCuPCGTRIlN7pqlOj`D=ca$x<8qk-#?)w`rwX^Ry^*6Sl?fTy$P83_>ZUNBEeoJ5 zia|%e0_%Z$5{UuFR7-_L{(O%3aO%R=OMS;&^sKN>98>or!DyAFskHU+2QCB|qlgRp z1q6HNOL_iTpspL=q3UWxrS2H)$6}+R?a&1OmScsCErZ}P`jwYl5Ea#uQ}6?}Oe2-*UaAnhSsvP=E`oKy-n(MS zYog<=$x6Dd@6GDS|0(saZ)ECVv1(2*q0PM7_PUqu277cF_hZ$Ak{<8?PfKD|pFs@4 zMOr%I`_v#Dh1&F8K#bljFmh0PZ7jckEYO;omSb@_=sqQndJtAM=O{7BbP}7IJqV!` zY>+PcTWpK&e@kv6S-mUDw|&=4CdIYjT;G;_pA`3e^lUJ$p<(T?%%a~bkq9V+jZ}dYUV<1qJpV_ zMF%SE?HQ6_uUheJG3y*~>adpo6NV8GjSt)lL`+0uD7vmP(v{tFFM93tncnmBBPE2C z@h^e7rSAjDBka*A4>H3q#@}(@rc4!L+j%@mF3|OYCwe~)Pki|6K6D{k4O9e=^T3A@ zjK$fo^C?mmktS&OyVn*TB+4EaGx9#Ll>X%+bDU5zKhk@?`b;#e`<|U-I+B2H3FVF; za&KyU0DWsec>>>+T~5aM;`<(ozIf3_BR+cNpKo4%T;El7<5}==?z)z^09si}Vs@G> zx~)aR)_|aGqpP5AZ?#?n5RLzzlJO!UC(G|FLTUqcj^dc$|5If0{5k(UB!<~ zAV7GJr80oT45HNmBvS1+WBG~4f#CYQ=qHZ}e>XC)dz551zp!_{C^!)Yop^RaY(P>3 z{4I7skdl5>Fav8#?CdBkBsr}MHdBy$ga%7&y;HIZXJ;{W-Z7Ym>!J<4rri~xC$uVi zwYSsT6JQC&9j|lc6mt2-S0*a+mxeKWMHRxFE#ADK9<20t=D~i>LVH zBpuVdAB)_FuEIT*@U&nuj#*?eBvNq?;emGf*oO!Y3%DfQg|?{1pQQ~CM(h@Jp*utXF2VT)Z#KN)s3IQ?J3}Qro z$~Z23Ne8AQaOrZ!PLGD>E)8m}#-)QAF&&3#hV~9nUa16cP_szyHegRjjF#V-Rx5gx zD4B-q#_TzW$@@L0vv#>38QI+H82{ymp7?xh}TqRr4 z?-py;tMsr^oY3t1tuhWePvB#&bWq{-r9@+??}yH=Ou`T4ec{{n=C1;G@J;sP*v z^*lZn%y)yIOI={gIMQq}oiIhflE;}$>SN3x+fLcIvxY^u+ZcH0C40W#%xuc3vU0wX zv(w&pC@zK_HqlTK~7=jf>@d!~T zN1$7UetQ!eN=>8Nsg(7Jd9AFwo$}9v%+6DQza8;O$#Z8OWK^8c**)j;gKb{LqwL?% z4~+Ao$#_xpCgv3bkVS;yLMIpY3I%w>JSmE;yCVkNz+*kpFsvZY{44|@S?h_7fs*ep zUmn5*Q^pes#3_0)DWh_s`HnKvMA%Xi?K29Wp!U>Qp?55>JcMa*+_Y;B4^c}VilGME zJn-%(?%J~#`4HhzEW=JoKAw)J|9vsZY5f`JWS_gGuM`t=JXzH}jR}${s>l&>$@qE| z1;fu=@Qtav$wQ0##tln&MuxB7eP(%1F1wYDx^;CS6AE__bQpMg#^NK@16kE!;|>pC ztC8n7$S}fS<`!QzWhT)7LLf2y;m^Q)>Yi0PT_nIv%*4T1hL|~G;@FyM5+QF>%P21+ zQ@-D`YqEXTrUsOpeT< z=^0dzu$L~Q$H~mV2Hu|&pYY?GTY&gDb2?8z>CU+RHbID$eS%lj--Ew1K@uk8hO^ni zEW$~^{xkSz4?y)ye#$z1|Gs%?q@%~(6&(EpaakTwRghdWA07KcYgg>w2)?C;f#L=E zRz2(A?IMr7L1yP+s2ydc3G(P89j8V%a#7sc9L#vq9+f@?FEi#*;_TqRU|cm8O9RE{rtW1YXTiFuA0r#2HU) z8f1c5nc@R7RVGy~Y2?47Oj4g^ScXVndetyL?D$8J)*4PL0Jel}Kx2_~djG}V>(Fpt zg|>0oV(SfWP2Eb-Wg-A`cyWD7#D$ijPQ%uhM;4KwBuxGVpke3wgCM%_4A&Xup`P#6 z2SqV*%MP+bJ(-$xavQ(t+!^OuXP&7Ma@w6!djk9 z#a@Ye_?4Z#YApj15B3YswPx3xVJtxHtJAawQARW z=+lXf8)`qOalIUDVQTT6%*M%HP(BCXSfH8DPo;nbn)*vvY*IS z(OGU= zV_P8;nJP%R#=jJx-z67=9?$~@1_!_{3&dIci5hopt=kDDS45Z|qP<6Ll?~#Mv>0PO3O&bE+Kr&#M4%kG)O1v`z2CF zFdBP3BigNXC_GOvsJR0lNYcBzAXe0a&KcPp{zQuRKwb$1*>)eM=1|+$_b`mOcshsPjAR<*b zhj1DR34hHmI+-yf$u|7}y>2p6ZsMf7A;?|yOAO*6Lsx^C3`G4Nn^mRktXbsYG?28D zc30|EqcT3~38QqaO-#$%N#JSWJ?AQiB;?!e!>P)kpk1ibW=+y>DH~LyrAQQ=NYXN$ zPp7Z#N8H9+$|>F^Wo3z=%EPJcBT?~E)Y&Exvp*8=03^hzpB2aRjud^zhFpUQg^7LA zgUVNgAKkC?Pg;=%H;ZMkFV0>`)$(X2Od(mujj%hWq$zmgA2YG$0H&MnD(}+#4TKc3 zxAGQbkxIvCARr-_0d$>Q*md$^1m&(pY9-#x!quO56E&+gEBLW(|9~{h}*8rkp43!dx9JeoHq0kBHO2x7r!nibM2-e|Udxne2d)jh&23X0DRad2;#! zkYkz{-MQ|bp0w*oY{o=7_IaPOPNz2X7oo$?%y}gBY!>>(TZOXb=qUFyD+g_W$#b|g z>VQMC6S!EzU_W5e*Mo_uM^-U=Vs+Q+d_@QWp1>8yAq32_@~Hl;fwg-~`Fg|2zaCq{ zBQ!`vAwO6Q6JyI&LzlE{nS8r*t~kCAWw?_s?yA81H{P%jn&ybZ4{w^fplr{RkJyg11g zr>9&l>@P!a9_?o65WfDj;$12OM!?B;#}yraf$w%r)91`qt|0;9Jf zyr430oA`ADjoT^|dP_oPh@sx;No!!jf4~fvgdZT}FNE*>POxg9jLh=lnxlh=6w|MO z`TQy7RTxf)^^gbSu!S6#&-JS*-*nqOU$5-mW~jy9a8o6m0m9Yx(dv{m_*cEt(pzb* zb&$G#%A?8sz9yuGTLVSHFW9xu8X(2~5niJSL#|Os!!r-@vHHl0&r8k7=B<5Qecp;* zfLhFFR3gW~5Hg&Xf*^%2yGY0}y&@*IN_4M;(IppASFZ%%*N&93pJ}gPVK6pvfb3N( zM3;~v`TIp3DR;!tPE}Mmk%gzecZir%?In@mxR!JW;XI{^K1Xul9wP4e9u;*iocLp6 z<_!U1UG6y&UarJ)JH-1QUML}fv7WG^W89Yly0b0@I;}Y-;f7uv;NHB$dBnd9r|xe= zeG6y|DY(&x?l!(jg=@F2xvtw7myjMcdRfYXr)*tEN1y)cn?3ltty>?f+a58hC20$) zQ?F0HuoGXyfF@e&i>0L`Uv?3fp*jQ&H^?y^5(bMdaG2qHHDX6r{$(d?aI_sM9q$>V zsKMwPS@#Et@}{01sCZ*Us}vgBfK&B~Mer+oP=g)y@Hunve~9nHyGTIX=J>zzV~ zc3B{d_!cDFw7!0j9YTh-a&Kp`=53TgE?+s$&B@6rRl6SpDl4^@dG@Z~Z&!H46TA-S zZhFq9kXWsxaXsHEt{W+fhUWNe=mUR~#_RXh_`EvgYrZ=5V!1a zn@J;1a?_hgt77tHgn#q@;OBP{vA56|x`*vuc>R%{C7-|%i-Pe~HW5>gK&&^r+jc|+ zkSw4`zhD_k-)7xx-pv*DIL&7o+t%!Jedqf?>~7?)e*4js+pdmf<$F)IK%|W`)!6cX z5&K!mBTN$2%l@4u51S#R$Gy;9gn2ug4(`i&TT~p}#ZqD}ArOa-EJ5sL9s|-xNz@~* z11_2-lx z_`{Qz=Ob#v{Zpk@QVMr0Z!gx95>a+@0WT;^Q5>prLaF=^J#mire7_m{A5Y28?@Y#= zK^H|`GpQm;%P73^u}B3R9*e}H@(pQ;f)BZ_Uk{bnQGy0jyj~F+M9X%PIU;smB|v`wbBO)uUTBJ16IFd^n{%C zb%#}tf_Q@-yWTJGs23QxYv@{Cfh#bPYIfGBqTU@Ttr0czZ*PqXR^zM`p5xk$IN`@N z&pn+N0wjz4#Kpg7<0C`ILv{Wrd~=*v1^gw1p#KM!NFZm5y$)^c8KNH#0%5z#hGFP! z`}rSWR!7Is(Z)1(rB!6r`)4OA8}PjGNk8Q*UvIA_@1fpEHvJ@#=b5GbMW?Npsv^BK zbOl$RRt@ItMuuUl$}`3K`ZC2tM~C^S6lxD&;0>_!5m+CYw9^AsS()-oVuz4>8h~hg zeSqGqM9_|??i_BhzdWr^V6(&24g4iXEwxx&K6d+m%8_P%^#34{4$^;EeUG|X5!&((kD#Up1Cn|!5!^rY2Qo_2 zpD#zvr)3jXzJyn(e>LCo%ex^bIX0{hO8`>vz0;^Kmm^)D!zus#r%VE=_UW?82$jT13&mozNbt)Ejs|YW?qBNg+VEkL>OMXZQw6;+M0Nzx+fyp7f zkiG(StvY!TNlKZHdZT=CX%{w zo8cPolsZv<8K zZQ8G|-9EM;Epnw@Npbt&$g$?a%TsOQ;+J;U$|!AAxky{b&iWnRzh%yNiRndHTx15v z?%iDnPvE1H&H2#?F$pb0XEUDCG4-w%+mB22wwDgEvXikf`}TgJ!E4XCSXEw~q4)mO zB@*9}=MugKv+e~;Q9{%&1lR|d)_Zy6vH15L7|vI$GWrWL=KuWsuy<1wd{DMa^b%A= zU8AG`7vp&wH*+joy+haSe&GYrK0?USYT5pEE=JqIeaU*d&&H2h;q$7wCA3V%R zZ=(_Z9nGN!FwZ(+UN3%irUE_f}Kd$&RV*-s{zs_~h z(A!}Y3++0k##1S^E30u}g%NqoFiCLwUg>7v6b(|vx4n+VzpQu-(T(%wN%y+>SIecV zl9%f0@M`MRwXz{u562n2&r0qC{L9y|^p$8@HoZ8dCMv3}rkI|R4Rqjbn`W3!Ps@sq zMCl06qy`HgR~O5K5~siE%>`k8CSD{r(@L1RQe|&rHY$pPfL2i~Mj0g`^vxNW!QCow z4c@$AhR$NF&aQbA0vA+~?--jZMQ(lh`KzrI@~Q}E`@ zUM-now0bB|goC5&Ys~SQJ|Gna7KJK=YJ39!%>{k0s*Q^#(Oo_k(z@_d>)|<@EjeV ziK*u1tmIr<4~?pa(Bo{`{FD`x#K`r|TZpP975c7`1R$w;?zxGPQs4hIKj3nElF;ZH z*2wsN-abknUrxFyzogY1=v$ z;&jSp9$Zk4J$F$9Pf}k|sU!*G{WUa}v)IkkRTx7~orK?(DoKBN!XY z4;g1li*Q#diAkds<w-*SqM&oE(rAmF}PRkJ7}4N}Y*la=&(aBa6q!?D%Z;QoA} zF;k}kLv!k;^73%+KPL04ms1E&3cat6MY;0$@Y)-Be@wRKv}%Hf`g@7M{mVKc&=$9!!MCwdG`;h=r}~&j7TZf(|^uos%v8 zjSP;#X;#XYaC93t6u0{CEh5(vpV|g|?wZVPOfpt1K_a&xQUTBAPkXMB_Cv`s_HMMP z2foaI(EF%ACbSe6^>uZ9;;)a?^3T#i)HIV@1DUwi-cmZPEx3v~C-UhZ0{T93WtRd$ zg7-L5@()SK#cuAU>mDu1V;Bn#NK+Nab;o~--|Bg-y54Ro(8<%P`WsN_+WE)N@Xp*E zhYT9rJacyEQKYTTJ#$^7T_+7-%#XiobH5KD*~GlXc&dz6D#{^?=u=h}N&>7TJQ$6V zBUXL}iGe+XmeKALmLBc)?g5V|o)gDMNbzwo_dc-#anLb}p!XRPGD=zMIRGt4$bzHo zBh3^RlW_< z4ifvw@h9WZukofJwxR%|`kB6!!NvjM!{7OD|eNBBLp{+VvHtHr{&| z_>rE>URRsU@gs%l4fQVlk&?{OP@T;FBbf=j0R*w-3~Jo9_jq`fPbYe~zuZEi<>k{} z9_4#5?qF-1(H8%V>??6X{y8}{QPulyJ47smAR#*3L9e4l6~ravwKPKaE&6aB@HhGF z=gfRKB>cQtpvz6N_$6bA#5~@6@BvJPBZOi@`9(Vwg0#;7;EoSJm*37+Gv6*P|3zYY z`~I{#$3o+^TvjJFbw8TT<4B0G_Apd%*{7kg;gHuu`J>i%gkV)$IPz9+_#bccAkn(I zyCBue1Fw1*3_1c%eVrekA6q`^z>zzSfP&aG=M#03JK_&tOofuIZ_N`XrZ%RCB+}CS zT`h*icm9wb1)rGrpfEpVVj*=E7>*BYkc9m6;OU8F#GiZ2k4ZQPOF$n_!=^aLv9+~_ zFZ!I$ni2S$1JTP4^I~f2?RRXCdS^YQgK44XqC;y?4brv$5Ubgh-9ZKOdPii%negC; z~##V(NVshNHR$ z%ke&yNm+1@KfxXIm;T{ZgQTK0O(c=lm?A`^mJD9 zK*vK*E2BK>_!1o4_A0=TC8Hzwc&!m$4SQm{#1ax=Bjm^T+vtA&DQd+1h8${O38^zZ zFZl!Ca*Y$wKFkoGxLz|+mqlu9?1hyODr~^NKb^ZAPs};?aFpB1PbrCG7z%wjtoCq! z_`=^&;LnGFTgkWICY^Vr zW-CvSVd57L^1HYu1plLk*s|YO%~$J#oA#1SU!agk6+mqkVgILvipH$GVyY!jcBUF8 z8aiV-2`^K>tzUrDJ+}V{wG<9|Q#MyOA=`IzD<-r1@5u4C&$2d2`C5U;+`nu!O2whrVy&6@~_<5x$Q%0XA}P_3M{p(g(VX5r(rB2>E?MjPC_r-o|JI$21{ zT!FVsn}!m}GJqtq7TCTRWcwnL&9R^DbMb9#BX554OY$#E4)xN#1yY-DPPJ(f+O%~L z+7|%*7R9?j@>2f=ul(iaMi5>x$5rd!$HhGXb%2~O_da}nLplWza46r}REiQ1sbAL1 z{}*WVvO8`>cT((aPmgo!GW_g1W_J6IZt&-Z68`_)(4^x;j2$9ag4z ztX#=5a`T?ZRLljp$9*(T6d}^4dmoBpr!@Hg`;&&0t(}juK`7k(PwYr&S7R%dGJYM_ z7}*3ALu*%1d-~s>E8{8a-!_&Be^kB=9!}FTX?Qvgx;)?cU9H?f&!h^-%2`oUi%+-y z;qJ|coB%F9_ki-50qh8DSq&OfY_y1lw6?RFw?gm*q)fc>|70oDDO32S`)d`kzW zEDrSz9y)D!h9@2&nYl{qOzbzY4%q%Pmik$iBb=!+EY!TGZncsf5 zdDX@hGKHN4a)2w&fAG=D=p3v46455a4KgvpQ+++nvgwJNWRJ)Mh!}F>yA`gWQ ziJ8Re-J6T_*$B@FxV7|+B9^NlXNSi=4vEXToxCzmUyp~k&M2i^@<;G+kU+lMQ@ZjP zEeCQ3R%ZJ9`6Y+wCOZe^X2*`U^Y!}=WbwTV%U>2F3!lvD!UqbxFlg(@;NvJNhxPk4 zz>7tnz?2IUu=V2Yg4J#8nL9!7*F-Bp_q{cs2wk_7hX%(j$XP_J^m zy#J1%-X`fQ7Ym30-Y0;C@Ida0qZFM|Pc`d!>roFW@numF;gdWPg{OG=5Sip zt+v+~@vX{h1|n_JdggOHwFjYwZ!e87%vgH&(ksi_zM($wjoQ^BZ_e_~rT+gvBqzC$ zb$%m0M&=)2(S}TGed3kSINQ7IWa9|q-d-HK zQk>prY5({X9??8v&cPcm&-g(Er5DglkUXRqN!zTQ&g4FUvMvO(5n{Oor1t#dr#Q`s zwOO!vI&(;5r^R#xf`kE>y!L=63RaO?ta}Aa_Z^4Fdk34*9O$Dk9BnrRQu2{w%>z?C zB=r-hq`r4x97F{JfbF0U|2j~m7J|KWy5VhK6KEJg%RlbSI{wYjo_2h%GhX2&;9Aa9 zc0QMpKGRtlsgo(&M_GOhnblZbSZ%-R5Fz@7y}xw1{d#w09_y6M)4a-_Hm&7b@Bgi3 z-8yO@rl)rtKv?&BqkBJo-mE-qcKdWw54fGv*PQI~mC ztpRN9>E#4S7NOIxx1u+CXc#fPkdu!mb8~lFu-kv!5h3|U)@WmJA$$kQKfPN}fQUcJ zsR`_)(k0nB=;E1~#mCv%cP@ZmX6ZKHn@A{M{8_vB9&8wfxG!8XkGlA^#`ss(6T<%W zH4D!}vvT%=082o$zY?w_Se6czPNXNZbHS)@K?}V2=v=}OM?4SIF$Wdm8jSN$jU}cM zW(naLQSM^Dr9wS`Vn-ruaq$B${nK+cf}+odpnGbfr7VhsD*I>&DP!M)AV>7JQr1h; zz2VJaG2j5%XymIeX;JhNq4phN2_XCN89I+V0F(uU7Ih0Hn=cap3?H4_w5q{=>4ML(R#nfusS!Xo9HqI*oLsivJz;u!DJ`ThIxu~rw(a_)r|tS++rnbnyMiT6ZRj))t5N5ewt*k#3un-|7+>8eH7aI=it-I((9=G| z7s?(%rkLV4Mk!jB!PiB>9Oc3>p}fe17$I zU?RO70Ty9z!f5?!n}N$8`3jC_;^tPoO+tfI~4{>`8#(d#TXYAu##gJZt;31C7G%^ z+~m~4oazhBWYu-fe*fL%1vreLjcI!yVh#sbs#MX(j@&X0@4D!(lzTUfY11a-K%~Fr z2OUIO9FeokA=)7>czrtK&rn;P7o;OD#LqT1#q#}-i6t2wqwQnaG{)brj1}HHv{7yE z!{wtPP6`_^_~;AqUY1Kt@A^?~AP^nc2#h!%?tp4a2&EPBH0-_JzLMQdE|Io`$QnAsl}$)4}F9LwQ{uiDg$YNj~{Jul1t7*1h0_Zeh7a9FI+~9Pqq0 zXQI0yDP-xIWdo;|l7NjSfqS zYc_TmDktyPFkhWrHp3nsMxWairEuq7RgP;&$r?nce2800zXuuK)QfTZAS*3kb2uI? zZPsgsx!x(!P!ss4$*wK+WGkrbc;*t>jP&q&4en+1U+a4^9 z!G(5$9<4;3E1Jw=QRWFt{pwAb$@vf4t^30^OL}rq?dqb;lZBg!wZ^xySbXpuo_$Q$ zw74FJBa=v~CiFQkzoMfTO*d!Y$Qc>Nng?!pW}LZc!tBZ>l5=t{ny}}6J@fWmFltRA zk_kjJtrL2F$D@X$L+>P@i3~^WWmlp?@1PUlXB7W}@dthx&M>1dv$PO^ZJY(uuH^~A z)xxFbCHjF6^-J}j_p6MOGJAI-e*$>=7X-5gpNU>(3N=kiC}^62ZA=G~*~Q^9J1yaI zh_E^}VRf;10p?&U#L{wP?0%$FisIADkSN)1B?aWC$0pR5ft&dzh8U=(?tPwq_~7%q z!8!9s6MSqQ zyhC(LEjx9@E*=;g6lhSsRjL7(_d|1mS>J&9m_L*oR~iGvHmUD?mzF$Hu#Dzq2Pii` zSQ(#k1kB-sa@Ke@85p|Iqu>2eh?gp|9|o{cSJ zeJRy%-|C{>?1Jmbe3(z8(Sr+WL2QOOG|D~JDW6B9hGS|Ou^wc=0s=vAt@6)Y$ecq@ zqNgfOZntLadDFeQaEGnZ}318h?`PW1SJry5@;;QFPAhR&z~rEol)*O0qA}6q8*{8oVWMPp-*63M7YI3|?{M@LVJ&mzQPIO!z_ z9_|jC08?!Ip({yIQR`Kk4mpo%vTMrV*evpHD@A=>a#V4AoSvUq%-`l=p0uneDr{SH z>DCCZ8DQdN9}Kpgcvw{0`6&0u(D?@?Wp^Gl&L4^4*tl#a2oY%BRb_+i1`)58pK~^% zuEz7YzP|qxD!})zKw#T*_Vs#W3Dq!`~ z#^|fFuL4KE1jr(kKIZ)UJ|Ea~HpED0A*41kPoC4Md@Q28M&oWu}CGn%s8v z7*(N3Uu{G%D2WP#RN0nf44Vyu=Z;zemqqz+I=`XjayXIYAd6`Yc!{{1ueW}_Xn_gN z6G7OKc4(p@g1b(wPz)WnwYg8q6o(ogD++=yLV00D*kiQ%O@)rt>&O-LR6s6H} zn;Qmq1e&)4#IpD9lXfMw*`Vkps?=b8%NRgh4j;J>Z+;VQir7y*m;AW+=CSO24-V@u>iVH|wNkIXxkHZZM z^5DrA9z3=RoM?Ug*pibK-_PZQ`C1VCD*S#b>wU(;yUVuEZqJWRj{&r}MAO6-Df+pN z7y*;duEL!*e@uO5?d6;EoaIX$`2y25=6cE&}i$@QgCG$JEQ6Zg>`W2L0$aexdf z=cy5dIQ>H264S`iX`-~%8V-+}5|}s~frUX67z8YV1>D1mk6dX=N$zc~ zi>vWXOgp~CCA$Dkqtoa#7TT7acPtf}G3^FU#pUE$IJwp2q_x%Q%M&Z8{}8V%(QoFN z6aC-|$4v+l{KOmBGv_7sOQGr~5V)N_kqhr>G{2l}(7V18rt4U1*6y<3_ajxcsoN*r-1 z%;?~{0!@R(MQ^J!kSFMf>r5&Zv}+$UWG0&ss5m^HjlmE(I6RR8?9<*Dmh!G@TzExH zzP+o?rT6JMvXsFM3T6OfRCU=?XZG9apRnGa33y(BHN{0nwMX@qGO1D++Ft^0DWW&VFE@F&EhAt?g!SFRGJL7MBX7EY#W< zq;3Neuc|1)piMv6e@kmvSV`q@_%)G7OBq|n&S%o{b_?OE!l9EWO zt?ssf>$EDz6wfCS@f-|}z#$R|0#MW^dR%3;*zK+~w40a2t3Z(EGt+|;d^#vy{bMJL z$S62_0ykem1sRxCEhrv@&eENe+yl2+k|3oV0()~v#L-&p0L_U4F3(D;_F*=NI#Jn~ zC>BfV;_RJdQ)hn%wK@5ay2IH4DXAypq|3PX1@ST!C3#2w0i%PzmtZSEAilnpzZreaeX0%9GG?$;4Q0cxLTOCVqbvH(l~X z3wA2zJVj+b0s%(hU`rRn!liVpqvl>XVMx{Nlbl)oyZ@LK7t~gWxG>^8M-~e&U?vLCX$n~7ku37Ahy#bkuNX%L=PPS>C;J5N76GigL~;si zJ3jhwaWc(WwG z6U{5~!^bhj5`H0`pyNoAibCmFAFV%!qxJXk)&v0eu_E~Zif@lWuJjz-K#7m9*To!6 zF=2T}J3Rf@57r_wFdJe%G5BzDsi9@R6j?ykiQwI$)8oXz9djaK3X)kRIgPzq{fq1+ z6UID$@%p;yhycEzI~d8(VhDoA%;3mi@_f=3cP8XOw&*yf0k@)DylN9~UtYoS!=FL^ zHot(ke^sm4gJEhf$PJ@pNMw6~A`(b2%^*1cyRi$9Ln zj;k=90XbcLsJ;eF8$@=N9dxYNQFZ`y@aE0lrFVtUYcg3oF)ys)6|#lS$#L}6|$ zAuiSk-c&;X{U#HQ&-?ltUltZMzUq6_@S=zlPnMm#Tt`3z->z9!6^WYb?16_tK)~@q z@;O$0X$bfs3o0_HTg;HLoTKB~AijRJi;%4JC5fm6;)vh=qN$qTrtuh;&G3lSfKra5 z#6k-}s|hVRGb%n3I+81MC-@7gID(KZh-_tL@tFkgL_A)Jw%M-_vr;tWYwLRx9S~GL zEH>7Gm+MBVIN1R0CcaKhjApD#mW=b4_ynN2At9uiU8NL$QF-9=R|oX$+6W_zz|r;; z0!?urJpHXt$`+aJq;1~dk+?H^<37JX|BrC#qon!O9~B?YW~*#(+CZnNzq0!D*`<7} zPk>AeVXKtI_Qz$rc2L@W&#`)a!T8<@AOE73J|EBFap*V6ErF$nmycJc*k2w#E%NSa zqss?Y$Rg3SfHn5)6&O<8+~wszxF;!9R}}(b$U_S0N)-Z$XM+M$BDo~2LIBO!$cWgp z=;Y|02RjNjdR@W2nL%B-JaHkLC(5PqMTIQB1guf@#@1yW93u~aR+IMDNN0@50*#Ml zny5+=CjEYT9V9rllq*j+#J+S|je#*V-No_EMM5^2BID8nWPwz&kj+l_`$8bxA(0Od z2p7OQGjDl2T{W;=8HJ_=Z3}OEiQt-0kC*?z-UQV(ZrNe*iTYH#t3#*x(?#;oY@{-> zn5k4l7}5~nc!uw|5tg|zU!mVpW;=&UsMH-CGQOXpF2DP z=Z1G5RQ0D-`zKXD<*Nd}vrp@H?grSi7VKD(l;{Clav0Dzd)07CB8g%ml3^U16KVCW z0Y3&bmv#YG(xl2K7l+V6AAl^*Y&G>6)ZB2_WS!t<7F=R?4VmAu74z;4aBf>G zT0TjL`JPL%mSNj>suN}kY|rE?z-Gaz{V$vzGixU@r3aWU?E~)D)*8#w0JNIw4?knX6T8TOrMzXdHO= zE{)yU3B{z#SgYbuW1f1)PVKw}wyy!Lr>CcDgVPyuBBzF5%euON-;p~P2#i0eAQQ#2 zZOntszS9N8>!gbae8J8Gk`$)|C3(QaSasYH?d#Kbuf`3+E+yTdLe zMwvZuAc)G$ijRzo7BN_ly^C6U)hx2PHOnMka*-8#SINEeE6@vVwrwrUfsUV$h4#`-AA5T8yb2J$kD%mHlq2GpbBe(w9(8KeBvF%eHzd zPquMyv^ml!qX+;$1suIJlS<+(QTrTA+jgDjk~Z$?>=7pbvb3&lPE19>y`Z9~mdh58 z!7`wy7|&o{*EtC|y~$Kh&bVRmH zC8=+Y>X5Htt7^{h{`y(7Q?GjhY%6{_}BEyay!nue7wu$<0-h>1I7~1t5b5dqh7?Lo-J%KSb(ovBJYXc%ixS!^*p&N z`GJ%GY?}41yg($LulWQ3Uf|>=mHm;{>DbrPMCeZ}t)`Hs4}~x_t*ZHbY!m;Dtrs{6 zAd4sAz|{TXH2Z5*A@>H;zb(S+m+-r!fLE^!NVm>!vOy5G#d<9PWJVyw3lTsMO2l7+ z)~`}=Z)j+{K;$q$ebrzu<1c%In$wHB&fL(izbY1ilk(f)+WNw@QXf=K?XNYh6>I!f zK2|P$9-De4(M}*U-38$A)xl;&<7!E{)T?$J?CLlIBQM@S(|2F&lpu%jcL21x9-`P>`iG(bt_S;KbF z1%C4*eEblm?AK9|eC`*8zq4Z^p&_0<@1WpRC+r~Ww`i__3)biiLR7D@WhX9y%)8$ZTv~p)2L$Ew&f_! z^(`CzdY^srU%w#ZU1MCm{{AIC8B7o9rA|V^CZ81+6u!yj$G;RAO#aC$LbY}0I5%DL za0%M=2T*>~_8Z<5ycsS)Ww}pFWa8U@Uno9Kzb$_OL)O-eLzvSCzMuYqr*H88l=&PZ zA3rQTZg?UeAbdd%a=&~48)6jhSGGRurj@ZtT`q&){*QbNB zahY>z>)JBB?jLI|tM9UKCsSa~^L$Sq&j|&y*OZk-mN`;1&^ENmX4MJnp`%Nd%dUO| zfKN`(9=T=a=KjI`mIkGF#Jb4PO&z+r01g#2;FSnl4fkSPQpQ}&(Q%1n`~yoj54rv; z!JCz>j|{WyAf<#B0M8Mzi@iS5p2V)BpNv2|H+R_T0*v`pyU7hJ9a=Y|4^1@(hK>LV zoVqT|?&?T%~;FA@rN{f>AD_&i&=KHzbq4+;c5q0YMrg@Ew}Ci8?;uEoCS9H@bv zz@gosaUR~k=uF5DBaimzE(9MNr?;ulyC1k@dvxD8)r)27+kf?7-e0*fO0iB676a2; z?=KP;Fci|FAWbCAZ`%Wo@tShluW(!xS`tRUK_M8d@-2g=WJjei)x5iVf1CjRpA4Mc zg9N~}_rs37_>|a;g{1r~ya*-|C17KTiVEdm+aOp{t9*0gQu(NW4QC-DIT#XZce{31 zHRUW3j%#ZtVohn8EXh$N0cIH2wl5{ABb{<_YO|g`o?tJb9?fDX1#1SHYs93Mjj7kc zsda?<#a&PMoo8JD3;jQ=99o?d@PUGrv&fnasqrd4o&z3&03{o}+sD%fcsG8>^(s;M za&yJ8;zw?vd|WJS*$*Fa((g+@PP-Rij5OC`eWiGq#|^syeYK~XTO5TK`68J{;kl7o zUuRzMgC7=pnSZc@fRCn?-WB5tnAUCieW|lhdomb!T|cLScOgCK{6YT=_IDudTqgGe z$x3k1%HHIw<>Vh+Kx~KzF8-v0K4ngdmd6h}pVlxQQ7}UKL>O8ja3g1Uu*yb8oX-{gKC-Ek?IiB1kKGI|{I}zSPxzy_nDBuge^$M&oc!b#fB5rfBF&(-;gqbpGag!@ z!=F5vS3@>U-^vlPD3|Jv> z&T`IRGla%2o@eLW7(UF?4^_}kTWi#BopyD0-n!LH`)}^{^p6Vq5c!AP4fuWSxl)ef zhbs9tj(&yEJ%V{7C0}?qR<#L_Z<9Ja6NCMbyPdpvd9l~(1+bWJe#G(x2Q$=f)p*fP z4|(VWVS=D3nhRd(UHjppQv0Sl|6kTiLn_9ys;0AF&*qMQKGSe1d7`+?Ix~51@ZG;7 zM^0=cJbbvF)i(9A@YsfotzRZVu6Pz0m%xCLFt==s$68Z4e}D7zmYpkWRYFTa*B{4~ zC5}~+#Dj(4*LJvQ)wn&q&(*v|dF9l~d%zZVZUCN~4I5tm)Hwa0v?-I@edI>a(c>iU ztdE5u=*WLwDIZlV2)*h|O^S<6N=otJBN6z7(}I;4G0*0yOMRU_dwXa8M}lOpZ0-B0 ze~lQxh~bo>|DOcCou6?(TpfYBYsuHG2X*z=l{%lV2>^P{m|Db6iRb8rM}K#kqZ*PF zNQIu^E$~B`p&C*YD3PAj8l(Zp;tDQOoj-_C8+X%z>%^jrbDc-%Ttdg-#$|u-XeqdH zrI~_f889vpj%d7LX!!AU_W{Q7j`>Er+QNN6r8mI~Ap65uzBL_TW;1aBvPfkJQG?#$ zEnl2(eUJgz_tOY%^-8IlOu$euOYR&+zwNz!MLNjX9?nRZbq;lo{=Zl9`uP7BQf4{+ zqT|fMaD3u`W#*gSPW0J98?hEoL6f~J@}Iq4yCw9RZ>XyJ^_s!Jpl>Jumfl#!D_EO1 zM+{*$bfwCqQjIy1#SN;>hXdfi_t|+Q1s-kS0ipE&)#hEyuY&TE6jQIw%STJo!f7%4HkmO z$Hmh(sW;QTKfK?bv(Ol*KdRCk(P}kEj(X_xLppxg5dMSPH-tcBl1ljzBqD)H0(arb z)n%&K0?WOKi2WQbUmoX!%4;4)1cCWO{t=H}4~=4S=SB6S*blRoXEa*3E40T-G-LIa z0eWDf-b32TC$x>_ai!3I1Q!;k(xp^g(j!sHR8=Tc7Hk#C9v7sby_g9hMp%Y7Z0hb~ ztxU3gGU9Qnemq1zW3CoO;eR6mv4`)uRvmbia_P6srA~;FiT42V*GwAv~S3HG!qq&K(TkL z%(obM3#|M}Ad&D>j!;-{xE>ZxNH7Z#Fku=@)h+cw zfVac=5ZTyvA#kz3IDXt+QD{?$NZ-t;vTj6N&|J6^*cBI_QrG)v%EycoccrU@ zljLR`ayiXI6){4=`Jt>kU){iT&e1z2OmA`DGICy~37$RXSXt*Dtx9L7aYN~;9(-A3 zIU5%>{pj4_!=LRvQGG=t+X@}iSwXowUlgdBy#)b(i)reO8uw!7S+&9^~cpyibYwRj>qKSa#;ld#f}S@D}#wC|Jqjq|5K?BiiZHmBEE)oGJzkdmz4pwom6`B z(2bh=CjJIlx;OXTsJOo$?DZ>;QwUP~qKLGOy=f9D(=42a|Ah;TJ$&1_>fi?{mwwF% ze*4(wS$wV?5imO0d#}fDXjy6;`|&K@36TUyojw6-UM0yu!`2(92d-367E^k9dyWHv ze`siaJTWxLKSeFA?7eH*Joxl{?ld=|j4zk2r9`K|fN$fXPC0D*z|sE&)`pG0y-lr( z>~kwV7wP?l-Sx3cWD4bm0i~C`p+8kF1-1XdCEtqGL-^K^nS@iYtH!T$9KBVft>#$@ zslh1df@u}-rm+{1ed!4=F0+u(FmYhwefQ|Vo0ihbh?q><2S26yH;Hat(tci*HmH&g zU$_jMpC>E{LZ1{JApT4UR9<6Wk4^wK4XCy*)w|IaQ2rM-oIMN1nFWcbVQnF02k4sD zHe~APT9O_KOw(C^-akJMbN*8F*N?z%(B3-!^FdMI5l#wyYp=C=yQDnae$CU@9L629 z?=jXSe}f4B1YiU#&Rw7cvLjBJw@$xK_53vxKCvq5ReII=eT3(|FRlj=Xb#X_)uNymJ5M0}1JKsa+G+wx3Q-O78x2zmP5ON}o$Oy?=A)%scL;|5yvS~1UOSsqe zG__Er2t=!Xp>sbqgXM42Jpak}87%taO=?NRplj(7FyQI@*K6U6h$7R;9i#Pvg}4Z2|vW%OT!VtG_S$@CT;UuGn(HmT|BhSzPF>NpDN_UW;%maS6LU(q>_fY4|fVY}&| zPa?OxftkBCCu8U7>P^tpk?0ILorelB1=tS>51%U-do--w*yMXb;~cT|%@UUP_{{>l z7n1&E6Fi&$Oe5FNOqNaJ-OfWx;XH6e|9)@XIl3& zOVG?zV1ofvzuQLE4`bb`svkuJgZaY&;07ryEZXf%(x(4KA^Vy_iVa+cnjXa^1l}8V z%N;Kk3!0h-z<9K&kbP?GZayWN!n2PbKmI|vSlc_%mnjiKnh{e-Q3QqA9Q9&we;@td za$D?K_p*kHtCA+BtST>z?OSskJ>uCv><e&>)Reqc=GU3uHFaZ6-? zXRt0>c*9_1kb9^G3hQ$0C$j$OO^&v1D#50Hq=wvV7mFG$C%OMyX1_D*zmu+L+vXCV zN0yJ|n*(DuTuOBNFM8sjU=ns)nt)4Cq2Isy>Z}-Bt+|0dc}Q>|^G5KX67lt|kFF8| zM*QN)t@a5%%Dz*DpqA>tj#7e{`$&Z2Unpq@Hi|a9< z;pmHd4h-9cF5$?Y192ap6Qi~0K8u7SkqIkuiC%q7z>)xbVs|-xY?xaqr!f5$KW7@y z;+B8+%{LH23*Gxm5oEHZh%ouM@o^|2*b<5lg7-5>-Xksg=Wds~RZr&sKU+A%35cHD z^>Wl_r|r$)s9O!Yo?MLHdMRwEw%T3m3_9w3V*s&~aP4r*!ps)e=Qnmv%;%(^e^aeF ztkqT=Ip(3;M7MqKXgRSXFj7Sz^Ftf+C=!{#Aw0r=Z5cY{T~69sLm3kIzEZN0(=`RM?+kCZ?a6mOC<S<6Zr)|?vgU%^PvXKn3?bxhc9JhE?Yd~9EGW1^n+X2e+) zaJ%((SGz#e@^+llZ>7|8Q^b;8zZ!hD1d#v#Ai5e0l=pA?)noknGx#i`yyO6Iex5LQ z;|3;zJbf^RC4dW*;L|GE5&augY3B}|)gQa?qQQB&mGVBDT$1F^EGbux^NN3$Ss^TF zL@b>JmT4C^-2CAsf9^ZO<{1xiMV$0;OwTs>EI3T(K{Q)(FBfXjeH%=&!_ymn}(g%o>=(W zkmv}5w4!5g2kWbqXSZ{n@1ND@{I)h@-pZbYg)5g5Mi&+BW4m_Y)sNTLqZ&X253EbS zy_)^}K%xtfM~QWHsCtmG=f$%}UG%JfBelLCw7GV1yy0&{ zy`RjG()T3;pS4!lbd>2FJH3|!x;NS7)nD}h{RSeAKeI_+BennAh-gO_qEGGnnt{t& z_b?^Z?huXxmKlvNxQU75Wwl0hUU>;e$D>C+`FK1ETEdRvQO&dFZ&`Ynfb1`kcGSnum|bt$W0M9d_WRj|#1Mah zFI}*IBkpf}MEUi_D>Zp~FI82iJ_!Chm?l&8J@v2a8{#i0KE69^_F_!`_AA@^Uw1*( z%Ve9b_UQ1|qUGtt>9pmp$^m!cfTQJ4SyQVIiZAo+*sOiKWjsyCVfxh1y|&;T{8m&x zdfQD>)3Ec#!j^6kg?Epw!d8jtagtvaLtX6?=K99^r;+4$?rJNQd2|x<=_<>izOUQa zlDs`Ps;knvgI=^#kb5_2VqR7;uTge~-Xf)u(4kL=J^|^;Y|iC5RO&^}_2>l19VgZ8 zqWz?uc;JT`x$@mQ!SZ|eRmgT=nrILGD?TscdUHu@M$<=U3XgUiei!ZJ|fd zVRc1=T4D*hwQVbJb^E*@5(9IK!&Q~{$9r^yS&|6&oqVZ3k;zvrHUy4>yl~N#D#78m z!R-a+LdBFhJ&TYvW%gYBLcqXD|Eke`-<9f~t?BUDnEi?wK3US&@m}w;J52)#L6euHtQRa`}?%cTJE<*YlD9gmYef6GB`E%^0a zQf0gQmu0mtG{#=_7{SgLB_ToByEC_L_qT2dL_q6Gk?{H8X-xJ}t?qw&qhT`V=~34T zE%>L6yWIW7n;xUzRFTp;yAd7RfPIMnL}$=?Td3ye|`HXw3D z+9H(*SbTnMb%X<-!xajfeT{qphb`dOR)^d31Z;tzp*1)phlDKhyB5M@RqncArXW7)=j9`|>avn}JZa90mjQY5@xL2qQ&@F%%a6a+{-PlBzc#c=-kp+E zTlaJ5R~-N^vwvaV)`}dxTI0bA4#1vWNt*t;;Ttb`i;kRBBNR((g_5m4G4jdezyD!9 zt;Bf|e5k{Jj*eFxp?1Lk4E9zgcBed$vh&dH+2>5zosz(|otHhlr&QIcGe?Y$e3rg_ zM&$#yEi(nbKXCwx%h`p6wQ)MkRj;Mor^S(ZhrHtn%k#$!cz?luN(q7HVYt1uZW4ze)}Uh(pg9~;(E@&X#EP%|?UWnX1 zDI>G&bibZF7s+xN%o!ze+i4{%gZLe%0${Ze?rZN4r)79M!vmS=Ubb*JJ=4d%5reav z{z<0!VgX`3g~v2EY?M3nLz(Ckk%Y;sv{wS}g;w1VNvT?;=`(hgU zI&)k{@%%x-Jgrn?PJNHP zQld~7Jo6i4|&7pr zTzf_>T+rm$cr+gOeOSs%U8hA4Se&B5cpDy&TIK6^LozH~QClVMMM~NpV_B9yMP2L3 zRAPnLqcxnXkK!zTYm*4TZDG{R23;U<#^4#*O;;=Mkui+`xm3{_UmzKo)ve=!@t~re zQQT$pXmLF1QcO^ZbZ{&mbGhkwPQH^Qz`k1#P~tUhs@-46-)cIhC2V0-57m|+uLByH z(3NKmvY1z) zu`qGjPiuweENMDL$WJ6weK52cY3*+HMs}}`s8+t2^A}H)EC>t<3gF4gIN~%$nqH9zIkF1gdbUJ-53|Gsh#wT z^WsO{Wx1k?#^mx5s~D5!_WQ3ZSM=F2(m14M48SZ*2aPtK^XrD|{G2t41-#6rjWiW0 zTwl#qppa$d&68~UxF15IAOP=u?HsAAqVnF`8Izy;ra6_F62Ld=e7{gXa2De$2O0e@ zz&k=WcCf>8K+!0#Y*K5&jB~(ua@!0-7|aQZc;3jsJ7S126lDz`U;yv4b*CTMcl&v@ z5{6Ki(TPzJd@OSNV@7f?sK6E=KjqF!xrcy%^vVK$kvtT4Mz}F3yi7!c@YSm;FVEkW z^3zCMO2-9>U{ruuBb)!D5uGYjq9CC?5~Z$QiSLPl+Y<9#9=>&T$W!5ojXbq8=zzD! zA*He50O>#5e@1Lm@|KBH7uXKoKz_sk=SFac@Hk(2%@_4Lbv9R!sm~A#?qMz~55wh^Qf0AM$LOm3C9~?c`tPtf$P_jW)i(bdZQ9jjP0AXeArC~T*3G%; z_}?ebK9@8KS?`w`=G3>efQLXqo(y%%B=A<;hT)4ll9Lk$#A}sF$ksoO1;C=Fjl``p zA=G&&$V?Dbh8Bn4b530&AA}>hNlzvGtryc$*ODWx3;7u0;}GQ`09QCR|L8H z0Q<#u$>>d6UWH}6!6>TL7*bko=+}v?O{_UqnJ4fRyUZ-a-^Fd+l@FX99!=jf7Zv5} z58nmHv)fCfn^j~m;gn{pniN5#+q7a*`mFUrPsVS0hka?PichRbV|YcPLoD+$EoU~2BOgv>|)_; z35^G$ZIL#DsReh20qFC0Mc$bofJ?9b@fSlCM4PPjDS>U;cZ2BAVm2|QK}-=x37`#M z-;=B)7lp6MYi1QdH+Z&#D6wIxz%}g;K{tif$ee@<=@>M3Lnj%`CQltWe3(&s;20|! zjj?zTcpM1U;t19ntSh!ITO!H!-8lls@OM)On_fr`wsX#k5Fjf85QPt}Kw9RzWN8yA zRY>TMzxw8IXMFbYF2sKI8B|%5`o-ovyXGu#gK^cHwGD~dN{L21$|o2^jzo^ynXjr<;6Tv7dD8a{gMfeSw zgZ%n_aLf2*l4`<-U7*x$3OwB_f;eP`ynEnr@V%=x7~U%Y3JV3`5YoV!&0U?xpdu5jH1lCOa#2d}Mq)H79!xh?sTIsqVP> zzPY}*@>GB=H8_tTtawAi^nmXKLC?a&uct-b)*6jS)yH zE@s|QQw)NN2bcNMy=#LJ5pL?*`ltvORb5SZq>Hk?4h+UCqtv95Y^qd})u`|wFcvf# zWA(rR`R~UUJ0}(06NbxU&$ukSkZa(cFqWR(M$Av_7j%IjgbN6-bxU%iF^_N9U}z~d z9tN|ApZ@B5Af%zJBxO_ zyX@Z)IQL@6V>;#VsM^$b^(;OF>Va{%$0_-HXaN)5d>BjqD ztrCSI6Y~Q!awLk1JvXSUQE-uhFW{CDp$2H8>o-(8NE+?}xPOkvnvExwjaD$~+kfurb}xW9a+wnQY*5Xt%42o($*{vdE4BF3E<8GdR9(a2F&ICL-X*L%Qs*(j{k%EGw z5SE8u+v&(+q1NB91cQuJDoG~9V(FBn;*VQ^&zdf%EnS{Yx9n;6Z#q`WzJeaHDO*ZJ zwv=LCQj}Lcq71;wpi4xdSq7ekiR04YT zWA-vzD~^l;(HH?e`(Y=UgE>b|ff)VC#6X7ud(N-=B2?*!_oj}9_}j;V;;Yg|LUvSD zU3sh$M2`Yu3n285<(JWP;&>pW#{lHHr?S=RiX5sy7x!4-Pfrj^(i(*zktQ^>eUb9I zgYHVPDR|2=P=>2BZj32G5&xpGGU*aN=zVQ$%2;q(ZnQWaDWJqUIFmf|)}(u*%@L?? z81HY!vWWZM*rRad5iIsHfQz(LtWoJF=~%cuwVZ9$p~u#}jRNccrnkJtVqTkl3A>E( zxdKOB^1)mJ2lw2QX^nhV+S~Wcpe0g%EhFOa$d=T_hg(wSN5G$q*ltWubj$N1kl_fL zmlQo}2ErR{QW$l;0zpH|0AxFX8ry*gN3Ntmjhce6daDdZ`(qzD2&qeHpLQxfH``9M zUH-8ScI8OnhHJ;mH_Rih0G!u~`G?U6`=R%*JgSTxc^paprOoW;r;+xfFFhX`V@GDg zC_jTs&nuCFiV*dx5XWGE?5++_0k*yDUJpNRbZC*pfIl=??)4FG$z`@hIh6*NUyXeV ziT&;drd$~J6keN!yv?=KIQ-IU{gx!xF8;Wk?qS?XA@LPeID9gR%x`yBlZmf=u-#2V z^A2W<1lbg!AcsammfL*5LiBDO`QsYZW5_2?-mqDhBjQpy|NH0bKh&p+xc;lMYg(NP zV{p%x>~PGKnpSX+q$CZ{S#9h|gqnj!t2u~CHoL9g0t6!NuDN2L`=84_;4Qi^+*%xZ zSBs}15n+_Pv!MFG?rbv2fSAP&l_Ah1d>$iM4*aOkPrGJ`NxC#2$MLVFV((XL#jCd} zF)~6E4vKF+7uz}B!jTd{KEI>Rx8uhkSU`U|yR@}RY}plPqcHG9KI-@@LkKvh_j4Td zqD9SR^Cx?yg0t8PV3rXvJe8xzci1wX4d3qtgR1q#!a(l2f|kZBE+ig_cU87FT=ta; z135KS08GT6*xRgEWPZH73GfXsJu(~XV`467>KkIC&Q>(kMMt|=G&Z`5U$9Rt7{T%~ zp&XYVpp-$&2^hC=dC4tEs62;841~?(`ZqQ~Q+3_p&ik_u?t{a}|9rDr&Z;2!+6OIw z=IzfG@iQqxeh!UD7TJ+aeXDq;k!Xq@$-JUf<}@T(NK`Su7~!NQA&O?UtaM z%xYrr-I0Bv}v3Zz!23=~$s(9~B0?Nhcs$OR^Ixo7w4 zm9?$42`Aa5dWouctBiTEGZruPRdIBhC@~%paD}f6m@VXAdnacdFtKOJ2mTQOwF7G+ z*8+k)moI0wVUHIvhA78Oc|4St(ORhN)DhIcFJMA_amqdS1yS5YO5u@vQ?3A$v)^FY zhMbg^8!u|}*nT&hh$pv$mpj1-au&-&e!z z?-A7h9Y`k6N^TE#@xMDQ&Zj*jQ8!4D1+=*Ne8$N_L3RB<$3LEQ#NtK3(IESfG6@jws|DTT>P7d*n^h8AEWJiVnn-aM{upF^zAuEeD`#)wJ zP);QY?B!kwh>*X05B@*y@Xv4JS+tAp#crjPTh6iIs9ui#M_Q1{Y@-REgG45xe;in# zC86c5?^2P(TQ*5H38dQ|kq3WbCH(u|((nsp^|4aHJDXFEe(}0%aZ3{a(W(M{E%X!f z-$7;TpJvL?3c_l@=-*82xx{~{<1+As+TPu(U$5O%o9MtP)l1X?j%mLaYC;MaBo#8% z7SKHAb=3sXT9*geE?mFBE#@*ncYOYpF8jR&4a`J8;!AXK?4sSK0fP)h@j!Q&Sszl4 zj#TOx(^9m`_FUz=F7YgN8+||hKt)^MiMaubw}p}2<)!Dk@j`5_0%!{)yzHq;{UqZg zeL}Aqv(u`{$Na7~x*twKXZj;#GwJ0>k{y-t<(^n0uGs!%sIbd|fxz7b?e{OkXwkR; zL@NH`b*-`iXUvMjK1Z*0<#wTL0bMS8B12ct4D;%pjD!AAyYVGcwU23np;6f%ZCBz< zyc)H&NRY6Lw9%&|Yt=7b4Z4siuz<^r#8B1a!l-&aqe&BTp+-y!AJmj56@2uifdAPC z`7Qn@UVvd?3#Ah51si+0ZCu#6x#{9@;Gg_&a>r6M{iR0sS$%AN;N9?@vB&R>6V$b}HMBuxP;!v!PF<-GXb9qkJ>!`y z19d_A>$xJYgTuQHzPI?CHH9mdQ8AKhY=a-szSg^NgpeIuVwm8|2c!Xkd}lBTfv|U& z(Km3XOM{K$|6i_$A@F=sEFdSuM{l{|ieOe> zFPIOiNchTa1}@z=Qy#3XdX$t0K$u(?h=Lc+cX6vp@t2wORzd@;3`I`IoBS8}8nAA+ z8g?eUl4a((TQyN$&MSLWYdmYCi$%TA%~APBdvh%%VL+Jho+=(cakTh#UK{I+-#^p` z>)E<^%)1(+2!16K-;jl$6VO{rgV^p9sQWT|_ogHBkCT0OjXfVwfATeNHHq5}$_$zw z{;ORGTYBL=@bG%#-HD~NH|FsE9&uCR1=e$~#(Q{g&$vV+SuA8rH#e3F$cNOIl4O#W zY?dRe;sv2F`NfjqSz~>DRm*OK(>oY4bFS9>GPBRlqGfahrZ;9ho&OZKxg#KkqDY16 z_$|bi6(Y?*m;&enOb&ThC3RtD^01ZdjM@4Dh~9=NTKSPy|0%$y55FYj4@gaMTRT{k z&8w$JJ7p|N@+PhN_9ukmlv5{RVmf9Lv(W@J99al*sTy)~osojo3c1|Ba3DIGDUA53 zAf#orkk*7Y%VV|>Bp+xF0`+&x<0*MLuk2N=(Mc;L?4!|fl|)Z#LGOW9`Y`IeUg~=> zofy4>I@7`rWFeA(g+c@Uo3Yg9pDj5>%jDapD`in##}oJOt1asK12HE7#1j-^M)@uM zq~{jiO-ONdx~v{%#UZyF-SUx-G(-t$2tqypZ`PT+48MT?L{ePQeZlZ$!)`-jtw#`} z+iVZ3vt9v8&UI88pqC?$Jo3mR1>=*VvMv%Y8`c+t(5zdW93-JDS?Rw~=4Vr_>WtWW zKP&QkX5_Q%$ZrE6v4eo`SIGGAAVgoI#C*USiU7>=sCIg#$XT}^PN+G{{$5u5C(+Kg zTkF^8{{$k%e?|J|e%k7-F!=5kB~zM01`5w3BS|`5sk85AE$Tq%;y@+np`u}04-$Zc z=#8{Exixz@w1;boVar>>Jo8M+_@rcf_OPu4DTv$q3+m?vqn2Z}lHX75_uah6#~B|W z;j2VF7$o-;CPPS?!slwp;VHF=7C)V}9nd>`kjRf526?cgK?DPKlcGmYXJpeolTzg= zMFm!#$R!goWQBn!irkWU6)nTb;Myq~cIvlq3!q+iG)uiVZgkoqW4$jh2_Ht7*YV^6 zw!7W04Pd5W8qZ=jGaNPC30ME63_QG!YwcjX?lv4V&{=aAkQ+wj%h$o6sYvjmhKHJO zaxy$TH`C&ug3_YxueZiIzc+GqGeIvVy>5uVt5yMS_oW4+TG%=s0}KY+0lrkS0WXdB zT3&6?yzXc$ddU1=4-0=XJXR1IM)*oJ-S_N&L}N;J9Juctr6n#n1Zakl#4z0y;;bPg z+H>dKHg%bqn2v$JQT&_6AMdxezEaQb1_)uv$0|a5B(L7_ufokFR2pu;jI@Lm2na748lqB4Z{BtlJb~~()TBQ;Dd+KSq7-V}_lrahf8YZp;g@20 ze%zJGD|=O|$b-?{i)FKxNif`%kqHWZLhCps%o3_&ZHU~e##~kemiabHnux-HTr!bG z*2Pk|J#V_KH+kJS!@5N*2N{v7{u$X$9;;$H!d{=Y&NPWV)W-TYJmV-oEPg{s)mLGI%sb3 zi6Wi{xOG+P$8t(D5Hyb19(6>-H$=o1B0~ECsXJf_a3-E0V!B}v^kG-Ev_PCFh5525 z(pQ08FCzG&a8X5xs_`Z4?xrlteN1Kk0(rbmiBNerpH97MS=?!u6C@0v$05v?we&kA zwn8Pv^2l|)^oZfngh9eP^XdXcq}&qEDFq4=>F5^D6CIZq1|r>4iUz z;o|TF@nE7RurIE7dUN@0S%<%G$^oxrI#Vz`0UI%POB_>iqO|OHV6+)zJ*K_;YSyOl zkP*6AxVNwg6*G|{vsHKmtnP&~!0KE*Pi9aK&fO&lPz4EjqoQmqi(7!t#FOS|x{qXU z?sqD_WdKcF!#t|#rj`z>Ox0BcR6!wlaRc5pefpq^9uP3UmAOrXeqnw8k!qecyxDDp z54+CrOLtZt8lty9`HLuVW|gi}vs#+B3;3tm5o>|gY00q5*tT>VmymNT+5o+m>}o8) z1lebpW4CV%^bC?Go-~K?buM?zCO1e?b@ai|imet@nW3vls`B*hH--s@>C>?aNE4A( zl?pN#)6j<5g^8ksw2t@7)WAENjUjx&Fs^%vQ2i1qe0PvcT&qKUZ`P$Zlr?AGK1&DF z`oDnTBy}I|+HC+(3{MetX zif}lqj4CK>TJ{Uls7G89;tvq#%m&s})hb1)*Dgr;36cF}3E(Gfc%qO$5rr8!5|N_` z*c2snDvqjA6>)%n*hUiYvbiX_h#%zFbmwu$l_JoK$J1#J0wAl(Y4F@*$3RfMPhHc8b$muFwr zFw>`ayEsM-x4)<(VJSsO zoMqQe=`G_C0qh;}O#~3Nba1?_I%f+9UDlfs4A2Q`K>_CGx*%3t(Rp0_3}bq~QmG%& zn>HX1-)XbLE+oE+*dYTjKVgJl7#=x9z6LQ5s|sf*m|;HFWP;caO@j4$2!2QMXI)c|K`ey`hS<@zJComAKG zd#ST~ZWb%#sQrS(4RtLWCJfV;Zg^68Ij^K@MYke4*fe6+GJZz73SOq!rY47{45Eq( zV-!tpQQZv1KrCuJrbg0lP3w~!|;P;5De|DIc+5i`k76~@u z`(LrmzIzs z`5t1c|SXxV~V_BH&d!Sg8MAC&X41 zX%gahC+;>U>HRW$uz4_J6_xs1V@d|Ck%EZy5ge8d4J9aX)<*bnbT(*Ucsj^W6w$#M zM(i&nv~_GxdVZ0LWexG&oVG;9G#FrZ)Bl*Jd#Wuc)$uYZlH{xZkVtlXMB9{&LZ6Gt>MoANYW57Z(@g-SEOhD4BGVe_w?RgY|?cE3= z#qM-}Y9=lRR%f&Fh~XpKh1!p~kh%3xKCI3h&WX%AkQbR-UgSn5KEBV->0zB0!}aIh zv*f4s`ANs!BV;uzhK*cl+ua6Z>plrr&4JTU=in6ZIP?6Mp!%_s)z;+<5Q*%pCR6e> zlFao?+WnR#8sg3e)<>N253a^N zMvw5o5fs*v+j$4^;KlU#pKVg#EhPFZV^%XpVo%D#PW|F#=l>%Ok!RzMt>^uFj+47!_ zMc(0wr4IKEsz~x+G|OG%OyLu1v|X6*-~Kb{zZ~Jz&#TYv(zmaKTxu9EH=$;gy4e~K zO>TC}%D|YC+G>3tbHjCazv1nfKMdc##%-lsDL;)(5doqWk?P^CVTYzk-Lf(;<}dBw zTgD=ZDsLhPN#Ru`jfbT2k#sE_ZFzqskko>tZ^7#WuSLn2&4a5WpCdxQSi3Wa1X**V!u)6+KukRB;NYUupr;<<6Fh26yt8%S5A86?HK$|+}nD? z2?pe`^OO-gb=Mai_2OIZ!@LpFI&c=AtmkhQA-tI)^!#tV_(m^7uZL8)RYgM-tL#sg zJ5{l8spR|Hzmj{W*irh9N4g*KiM|tm@fNqm$Q)NvNqit@b|-NwA8 z^A}s|K=1Od!82S(MliuPG7l`Cl9g;^pE~Z~9&o}|aJ?^Q31dEi{&{p+y6>cqR6?AD zqogfJe*<^|zM!C}5Xi4sf@Q!R-|m(Jczo_AaIQsF-3qqB&G8C4rt>P@qE5OEcVIqs z#oa5U$hjTcBGS^~;A${#2o9Yaib_2LFs0w>kS~~Wg<~+L8*u#A_@D~Kk)51ERg78n zYGeIExfcQWf?m*z`ZcrHn~am-Y(3>2ObzB>YB6w%t8*_80sQKC+dls6kJ4m>gPCda zebv-x3=TE4Uyvdn!dD-nyEQJ&mgEcHU-J3E!s-{kGRki(v&irKVAfuF+duIaznQ@w z7VYL#ee$z3H;j;2TW>RPMz=w!S9hl770}T!Ws-EVI{QCz%41a0;!6|(yBO(sAivbgZl0Y=d!gcyyZ}6_S^cQ5EIK2&BYm~d`c<6rV5D)29Kb*xQ`qQI2s+rOK7^WY_ za(uyh{f`zmb4+|zA6NUu=vW?$T$5M)ITqS4{p1Bn0+59ird;5V=WHhtDG3FlP`@h@ z59_p7!qpD=hW zS_$LNgwaSCKM}@{gmIcMrV&OWVf>3QmJ!Ap!l)uFEf}02jB$h|8G~;V#{Va{`Tm9h zAqf_X5vjmegmIEEenuFd5)N0B9;-lo!stv`rovzqVVp^@=n9-7EHKC+ES6^H;})F? zRbUih943s}gb@;)UCu`Lf}Y(SKZ0DGG5~vM1DaA09#JgjP-;v%6+F}eQPkOQCNaX& zWkI`Qhkglz-E@x0;v?I5WNg`xP2W|#i#6b>}Gh0ID2>T-(`ekJcJndUG3e;dNpG(%@X3S_oC zF-})g$3Z=QbO^y%!XeKUW2wD=iI7cJ^o1UHhyH0b)AKNGNQ060JlgK|oDltr54fP_ z`X5WQ#`_aeuBP90k5Dv`;V!G$xd!>u)3qUkLq**qU6(O_nCH4m!J=bhin1;TCv5s1{*xpuD4NTtwEKK96Hg zi2p=Xx$JQ<;q<)VcpBY_*FB@{*(Y0u*+wnQYB^3UeIoB)Kb)B?a{~8;TgbC66Xr0; zGc12^t3&^ssz1Bt;2e)MEF)CZ1v=^)i>{rE0w`?TTVu`-XlhvWT`4HY%a_R;C?xUrW%<=(mk0KIJRyZ5kM z_9k->1x+4GZ_L7jYK{)RD=i*P0X*grnrON2%R?Ol6kBr7)Kn>oi-!M<>F=g-Wq{vs z)TV&!@T|MB!+|9180B&)S6~uyuQHA}HvjHA_UFHe1>^x;qk=GkIq1RY8NH(@>Ov1m z7xFlc3jmDiXDbJ6LU8@wW(~I$?Q(3-lz<>&xq~};ZUz+K+??LoVvdJMYQ7W1QD+Z6 zO~gHkR#A(;B}FRM0deiJ0z1GQkf|5`b3m>_g8y{Shr7YBG5y`K$~8y@yas4GaB|E= zzhLK|`gD!wATegBvLFwKpD+$4_+I`XJX-E;Og#NUHyU34DnM2V>JC47oDot(1}9OfKErYe4l6lQMEe4Dd#nalq2l`q#{Kx4#w<)M*0}eiwn`inY~A*W-CBDN zxW41|0+Q`y?%9DW4PtV%$j-?-Osih{*R5Tk^<(6~)zHR#z9};0<1ts`vd? z@%I`Jzcjymsde!vpC<7(z~^{;Ce;^sGD<>>PQ<50-3A57D}08puna%qUxx{# z-{v;IOC}?0-`lYuNc;fAVmnZb*C8w}29{$(OdKZ10cflNfFZx3AZ^2<0^o3R2TMz`0%N^BUzkT%w;mza6lVS$& z1l*R4AiIH!wgNQT8gTadW}M5N-AsRhdV>DFrcbe@=j>lk{x!x(XEESUh3 zyy5ASt@{%=7#Ezh4>X<=}60nHI7FQ^dOu<_Lh62vA15+vq=| zM6RpCSnmA<4gB9gk?LlYZ86*dWMaZ#G0HD<`C88H0{B3)q-_51on?NRhk?uMX4so& zcfE5F%#*QK`QXfVvVV{Fmc)QH4!KXYJ><6WMTl!U+V4>!$0fiq0kLqE&y2g~mwdKk zVBi;lk{0MwBA2kEo@OESs|H=WU~=se$uS$gn9v}7$H%E7<%17g$;cLC-u>g7j4{VIUwhKhD2~!7_R?t5 zyO`ex1F^fm0LvXKJE0r>H_}7@Jgu8+Zr_7=QcJ6x_{UOqVCeY1=Jfw#{ILH`CR5Na zUnZalVq5XrRR5vBthzB~aA%(Ozj#~yz?pl_B?>H@qR-Ey9$>Hz&XY1NE9#btk>0!r=~Yvi}Km?YgH}z zf9fNsURWUKOS~HN2lI}_h+=j&cl|!bm}oyYE5)GU0TjK<#;d;|eSfNB!!~lJjB4s! zrZi5CO|S6zia>c;uzS6=Zzu4p7W~|`@m3$vr>mtx$lcicyNlV?zK>UKmC5M)&DTSy z+pbFhrL4_aMf$jZ!}ht05mhd^R3w+Ui}gJvw61@ZZ4nlZIpySk-`mwWsC>=co0d|l zbPmK_^s8`vQ=R`4(CkVc_)dQv4f^>{pl)D6wDlU!QU73Z%{Ti9s&P(IX*W5-tYxpy z&*lYYZ9#$9wxyl2H&wc3yn^3ir3d~55J(Wguo5De2wQ(|2RC1g=Xp)p%bF?|-%MuH zP+s)#%QHpnwQ6XQm){f$r@qXs>u(o*`DS^!9RCKQ+yD7=`UmLTzgT64j{YsOL+zi9 z{i1eA`RAX%>gEM^v;0e4ym=JL$D#gbSLqi&#lOk?TS1nC{$N_Zyp`E=73lA0YIo@V zv*4gi`0jG{!~HAwf0H|#`M>`v=#jI#ZPro|0T;jo7H-pWsHZao!M9fe6K_WASBqKE zP;u2e4t+@hnxXvMnfC4;^8_@<(9s%s0010_>YMfZCege=jH({d|M|4nkW|m%};F0bc9_oelUk_Q3Xad)`0m0c1a}q;4bLX-GdV zF#@=o0D!Mok6!~RGNzP*UKw^iI9W;G%&yAw8nnVCw{yxK&3RGcnCB8P(;sCijUJ21 zv9jI%C3?^mC(CcnCir&^*2?yslbsK}HELi1ddcxydfi>elaxD}&akktlQ3dtVrpiT zw-*z>F)I_vQ6OLeddYDGg5;QJcgjRc*peuG!b_%*QnTzhuO^ z*}$}Hk0tlJ!UH*lrsr}r1R&;K(m--%SD!H!*xI!d7X!qA6(p;v$1dU= zak4-5;CStWCo*(_WJwpO^>w~ptMOjgJ7+R;AvN$xG2BNnsSDZK_1G%grOy`HCHL%n zS?9yv2e`nY#HpI(7iT(!>YQnPImYpx5yc`=C=hUgLx~e2QFIf=9Mjb#>Ds``7-r16 z4v%`1GXY;}n^} zj5M{0L_@u~!53v2NyRMJ48oio3D>$X znxl^*K94>mdn;_rI`|DOo6b+C6<4UBY`Tb`XgENvf;|?n`kZ7-RloBv+&eCFUX;y~ z+4@PKcgbXr;v8igZ)La7-WThajpj%%Z`#9#GZ8%$)#Ps@#K~)z^T1DVBl@BD|Ko!& zI95ORm=>Rm#jtcqQfSRLuk_`E=ZQ}iAPV9Lg9r7KMi3GGq{ezqoRZUKOL>1~S_+Y} zRBnmtb+nl&>iBK;N^b6z#O|dK%vd>)go^_|oNy}LlnpTu1XhqdvErv{WGuWWJ@X`c zc>R>mSQXe#Bvul(ltzz|ApIa69V6M8>MvXo{zHL9FL&jO2%1a(FaJ=ABGPe1w$%5j zK+2M=l$vEHdFjAo2`T9(b<&>($IDy2)+P32F`ZL98~t>9`SuoCT{NC2PG^?3WW|dA z<9_|J@f`V3seXPlBlh8dcS_TW)9_~)}=q(A0dKm`Bf*CGTNgmiF1L=w)B^kyd2UU zhRKav_GzYEj^wP0c|M8Y3LnAM1rSqeb-lrO`H3KdpAoQUA)R$PLjupZTp(jdRxO|V zeY%t$ngqIZ6!XW#K8HB2BMx`uk5NY;`^ljJ);f^Tb`K$1Wr`B<*YwLtEC`dED10;5 z9rL@uZT3SNB!DrUXw3iE>4ex09hnE*G%^m#UW}z+?y+pCikNO((n%Hv=p*)-RSJVG z#68DV1n>$1t6`y!F5>{$3@t8M*bCx#}hKBcsag{e@sw zomynmQCg~4$28@&N{Q>a+)u{vVoAzLuhIaYBs3g#(qo7t^su}n6ycF$HrqJM6i0OT z=1s;z* zXf4FcQ9Z7Ph*riPn^R+s{AMz^^)8xqwBmaQjMt;6u?5$Iz0Yk^N>#0nCXJ5&6j88R zgyA#yJO4ae>oIu{y5>S9VdV2kYX}ftoS~5CCIqTLN7`WwD@+V{Zr2>*-yl{qaaG^{kvD&2S z1b8;m5hEq`x5|^Xexz6c<0mY$n)Ec%S*Ketpj=2t;xR}kL~bV~BJ~;kbR|-z0x=!- zxbUdWqn6YVEzv#lBylYL%RkdH{PdS;-Es}vOmG=d!j6SX3-5zsRtD2YOWz-6#W zE+G;{H)=vga@;$APD0m2%RR8&h7%|mPF7V{e2p)LOQz( zQkM}YeLXPGqr%G=gpqh$E|3~bb{9C$6L}qxU2}4GPS;gVcNM9wNvc~4sa0!?$wI(O z*od~fjv2J^bfqf8F;JxUOG{bxS99Xdc}BMC(!k+ zujyB)P+rC$wx^Srh3fU%;b!RWo$Ps3co~EAlM{9M^iqR3lAR;xc_MEl5s=U0w4L1>KS<~~P9F2}3Wni`j zI$t**2xpv$wb`y5b=hz&DPGsWl%K|S%F z6!+7vHlhbkvnTqMa0kmeFJZs>)f!60IrMU$lW88K+mCqsgAw5IrD zgBn@ZSYir&+sxLe^8CFt>MH>eL#~m80c~lsQwsya2h=xYXa25{FNTl+H>r)mbH}s* zunF_YtjJgMdgWZjwN*Lyr##30HAAMPdNdp%9&Zn0pXJYvq2Na>A1Ioc5Q#gi9`7f+XUx0}qa=^i(6s!qG{?@__nH;dKWoL_77~-^lsU(8EQ9#;A{vYns@f*-;YYeEoU>uSQ)lP+U1KRr%