Showing preview only (1,770K chars total). Download the full file or copy to clipboard to get everything.
Repository: OpenAssistantGPT/OpenAssistantGPT
Branch: main
Commit: 644f2a5f6812
Files: 325
Total size: 1.6 MB
Directory structure:
gitextract_72r5kauc/
├── .eslintrc.json
├── .github/
│ └── ISSUE_TEMPLATE/
│ ├── bug_report.md
│ └── feature_request.md
├── .gitignore
├── .vscode/
│ └── settings.json
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── app/
│ ├── (auth)/
│ │ ├── layout.tsx
│ │ └── login/
│ │ └── page.tsx
│ ├── (dashboard)/
│ │ └── dashboard/
│ │ ├── billing/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── chatbots/
│ │ │ ├── [chatbotId]/
│ │ │ │ ├── chat/
│ │ │ │ │ ├── chatWindow/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── embed/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── errors/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── inquiries/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ ├── not-found.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── crawlers/
│ │ │ ├── [crawlerId]/
│ │ │ │ ├── crawl/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ ├── not-found.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ ├── not-found.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── exports/
│ │ │ └── page.tsx
│ │ ├── files/
│ │ │ ├── loading.tsx
│ │ │ ├── page.tsx
│ │ │ └── upload/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ ├── loading.tsx
│ │ ├── new/
│ │ │ ├── chatbot/
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── crawler/
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── export/
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ └── importChatbot/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── onboarding/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── page.tsx
│ │ ├── settings/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ └── support/
│ │ ├── loading.tsx
│ │ └── page.tsx
│ ├── (docs)/
│ │ ├── docs/
│ │ │ ├── [[...slug]]/
│ │ │ │ └── page.tsx
│ │ │ └── layout.tsx
│ │ ├── guides/
│ │ │ ├── [...slug]/
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ └── page.tsx
│ │ └── layout.tsx
│ ├── (embed)/
│ │ ├── embed/
│ │ │ └── [id]/
│ │ │ ├── button/
│ │ │ │ └── page.tsx
│ │ │ └── window/
│ │ │ └── page.tsx
│ │ └── layout.tsx
│ ├── (marketing)/
│ │ ├── changelog/
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── (welcome)/
│ │ ├── layout.tsx
│ │ └── welcome/
│ │ └── page.tsx
│ ├── api/
│ │ ├── auth/
│ │ │ └── [...nextauth]/
│ │ │ └── route.ts
│ │ ├── chatbots/
│ │ │ ├── [chatbotId]/
│ │ │ │ ├── chat/
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── [fileId]/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ └── route.ts
│ │ │ │ ├── config/
│ │ │ │ │ ├── advanced/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── branding/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── customization/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── fileAttachement/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── inquiry/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── route.ts
│ │ │ │ │ └── security/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── errors/
│ │ │ │ │ └── [errorId]/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── imported/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── inquiries/
│ │ │ │ │ ├── [inquiryId]/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ └── route.ts
│ │ │ │ └── route.ts
│ │ │ ├── import/
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── crawlers/
│ │ │ ├── [crawlerId]/
│ │ │ │ ├── crawling/
│ │ │ │ │ └── route.ts
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── exports/
│ │ │ ├── [exportId]/
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── files/
│ │ │ ├── [fileId]/
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── models/
│ │ │ └── route.ts
│ │ ├── og/
│ │ │ └── route.tsx
│ │ ├── route.ts
│ │ ├── session/
│ │ │ └── route.ts
│ │ ├── upload/
│ │ │ └── route.ts
│ │ ├── users/
│ │ │ ├── [userId]/
│ │ │ │ ├── notifications/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── openai/
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ └── route.ts
│ │ │ │ └── route.ts
│ │ │ └── stripe/
│ │ │ └── route.ts
│ │ └── webhooks/
│ │ └── stripe/
│ │ └── route.ts
│ ├── global-error.jsx
│ └── layout.tsx
├── components/
│ ├── aos-init.tsx
│ ├── auth-status.tsx
│ ├── background.tsx
│ ├── billing-form.tsx
│ ├── button-scroll-to-bottom.tsx
│ ├── callout.tsx
│ ├── card-skeleton.tsx
│ ├── chat-export-items.tsx
│ ├── chat-footer-text.tsx
│ ├── chat-history.tsx
│ ├── chat-message-actions.tsx
│ ├── chat-message.tsx
│ ├── chat-sdk.tsx
│ ├── chat.module.css
│ ├── chat.tsx
│ ├── chatbot-advanced-settings.tsx
│ ├── chatbot-branding-pro-settings.tsx
│ ├── chatbot-button.tsx
│ ├── chatbot-create-button.tsx
│ ├── chatbot-file-attachement-pro-settings.tsx
│ ├── chatbot-form.tsx
│ ├── chatbot-item.tsx
│ ├── chatbot-operations.tsx
│ ├── chatbot-security-settings.tsx
│ ├── chatbot.tsx
│ ├── crawler-create-button.tsx
│ ├── crawler-form.tsx
│ ├── crawler-item.tsx
│ ├── crawler-operations.tsx
│ ├── customization-settings.tsx
│ ├── empty-placeholder.tsx
│ ├── error-items.tsx
│ ├── error-operations.tsx
│ ├── error-short-item.tsx
│ ├── export-messages-button.tsx
│ ├── external-link.tsx
│ ├── faq.tsx
│ ├── file-items.tsx
│ ├── file-operations.tsx
│ ├── file-upload-button.tsx
│ ├── github-card.tsx
│ ├── github-login-form.tsx
│ ├── google-login-form.tsx
│ ├── gradient-picker.tsx
│ ├── header.tsx
│ ├── icons.tsx
│ ├── imported-chatbot-form.tsx
│ ├── inquiries.tsx
│ ├── inquiry-display.tsx
│ ├── inquiry-extension.tsx
│ ├── inquiry-item.tsx
│ ├── inquiry-list.tsx
│ ├── inquiry-settings.tsx
│ ├── loading-dots.module.css
│ ├── loading-dots.tsx
│ ├── main-nav.tsx
│ ├── markdown.tsx
│ ├── mdx-card.tsx
│ ├── mdx-components.tsx
│ ├── message-overview.tsx
│ ├── messages-export-operation.tsx
│ ├── mobile-nav.tsx
│ ├── move-to-crawlers-button.tsx
│ ├── nav.tsx
│ ├── new-chatbot-form.tsx
│ ├── new-crawler-form.tsx
│ ├── new-import-chatbot-form.tsx
│ ├── new-message-export.tsx
│ ├── next-auth-provider.tsx
│ ├── notification-settings-form.tsx
│ ├── openai-config-form.tsx
│ ├── page-header.tsx
│ ├── pager.tsx
│ ├── sdk-banner.tsx
│ ├── shell.tsx
│ ├── sidebar-nav.tsx
│ ├── site-footer.tsx
│ ├── start-crawling-button.tsx
│ ├── theme-provider.tsx
│ ├── toc.tsx
│ ├── ui/
│ │ ├── accordion.tsx
│ │ ├── alert-dialog.tsx
│ │ ├── avatar.tsx
│ │ ├── badge.tsx
│ │ ├── button.tsx
│ │ ├── calendar.tsx
│ │ ├── card.tsx
│ │ ├── checkbox.tsx
│ │ ├── codeblock.tsx
│ │ ├── dialog.tsx
│ │ ├── dropdown-menu.tsx
│ │ ├── form.tsx
│ │ ├── input.tsx
│ │ ├── label.tsx
│ │ ├── popover.tsx
│ │ ├── radio-group.tsx
│ │ ├── resizable.tsx
│ │ ├── scroll-area.tsx
│ │ ├── select.tsx
│ │ ├── separator.tsx
│ │ ├── skeleton.tsx
│ │ ├── switch.tsx
│ │ ├── table.tsx
│ │ ├── tabs.tsx
│ │ ├── textarea.tsx
│ │ ├── toast.tsx
│ │ ├── toaster.tsx
│ │ ├── tooltip.tsx
│ │ └── use-toast.tsx
│ ├── upgrade-plan-button.tsx
│ ├── upload-file-form.tsx
│ ├── user-account-nav.tsx
│ ├── user-avatar.tsx
│ └── user-name-form.tsx
├── components.json
├── config/
│ ├── dashboard.ts
│ ├── docs.ts
│ ├── marketing.ts
│ ├── site.ts
│ └── subscriptions.ts
├── content/
│ ├── authors/
│ │ └── marcolivierbouch.mdx
│ ├── docs/
│ │ ├── documentation/
│ │ │ ├── chatbots/
│ │ │ │ └── index.mdx
│ │ │ ├── crawlers/
│ │ │ │ └── index.mdx
│ │ │ ├── embed/
│ │ │ │ └── index.mdx
│ │ │ ├── files/
│ │ │ │ └── index.mdx
│ │ │ ├── index.mdx
│ │ │ └── openai-assistant-api/
│ │ │ └── index.mdx
│ │ ├── in-progress.mdx
│ │ ├── index.mdx
│ │ ├── legal/
│ │ │ ├── privacy.mdx
│ │ │ └── terms.mdx
│ │ ├── licensing/
│ │ │ └── index.mdx
│ │ └── pricing/
│ │ └── index.mdx
│ └── guides/
│ ├── how-to-build-a-good-prompt-for-your-chatbot/
│ │ └── index.mdx
│ ├── how-to-build-smart-chatbot-for-your-webiste/
│ │ └── index.mdx
│ ├── how-to-see-all-your-chatbot-threads/
│ │ └── index.mdx
│ └── how-to-use-message-exports-correctly/
│ └── index.mdx
├── contentlayer.config.js
├── emails/
│ ├── inquiry.tsx
│ └── welcome.tsx
├── hooks/
│ ├── use-assistant.ts
│ ├── use-copy-to-clipboard.ts
│ ├── use-enter-submit.ts
│ ├── use-inquiries.ts
│ ├── use-lock-body.ts
│ └── use-mouted.ts
├── lib/
│ ├── assistant-response.ts
│ ├── auth.ts
│ ├── construct-metadata.ts
│ ├── core/
│ │ ├── generate-text/
│ │ │ ├── tool-call.ts
│ │ │ └── tool-result.ts
│ │ └── tool.ts
│ ├── db.ts
│ ├── email.ts
│ ├── emails/
│ │ ├── send-inquiry.ts
│ │ └── send-welcome.ts
│ ├── exceptions.ts
│ ├── generate-id.ts
│ ├── getIP.ts
│ ├── googleAnalytics.ts
│ ├── read-data-stream.ts
│ ├── session.ts
│ ├── stream-parts.ts
│ ├── stripe.ts
│ ├── subscription.ts
│ ├── toc.ts
│ ├── utils.ts
│ ├── validations/
│ │ ├── advancedSettings.ts
│ │ ├── chat.ts
│ │ ├── chatBrandingConfig.ts
│ │ ├── chatFileAttachement.ts
│ │ ├── chatbot.ts
│ │ ├── codeInterpreter.ts
│ │ ├── crawler.ts
│ │ ├── customization.ts
│ │ ├── exportMessages.ts
│ │ ├── fileSearch.ts
│ │ ├── fileUpload.ts
│ │ ├── importChatbot.ts
│ │ ├── inquiry.ts
│ │ ├── inquiryCustomization.ts
│ │ ├── message.ts
│ │ ├── notification.ts
│ │ ├── og.ts
│ │ ├── openaiConfig.ts
│ │ ├── stripeCheckout.ts
│ │ └── user.ts
│ └── value-of.ts
├── middleware.ts
├── next-env.d.ts
├── next.config.js
├── notes.md
├── package.json
├── postcss.config.js
├── prisma/
│ ├── migrations/
│ │ ├── 20231119141309_setup_auth/
│ │ │ └── migration.sql
│ │ └── migration_lock.toml
│ └── schema.prisma
├── public/
│ ├── chatbot.css
│ ├── chatbot.js
│ ├── chatbotlegacy.js
│ ├── chatbotwindow.js
│ ├── chatwindow.css
│ ├── chatwindowlegacy.js
│ ├── robots.txt
│ └── sitemap.xml
├── references.md
├── sentry.client.config.ts
├── sentry.edge.config.ts
├── sentry.server.config.ts
├── styles/
│ ├── globals.css
│ └── mdx.css
├── tailwind.config.js
├── tsconfig.json
├── types/
│ ├── index.d.ts
│ └── next-auth-d.ts
└── website_tests/
├── index.html
├── index2.html
└── index_script.html
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintrc.json
================================================
{
"extends": "next/core-web-vitals"
}
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
.contentlayer
# dependencies
/node_modules
node_modules
dist
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# local env files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# vercel
.vercel
.env*.local
# Sentry Config File
.sentryclirc
================================================
FILE: .vscode/settings.json
================================================
{
"typescript.tsdk": "node_modules/typescript/lib"
}
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
================================================
FILE: README.md
================================================
# Welcome to OpenAssistantGPT
<p>
<img alt="Vercel Build Status" src="https://vercelbadge.vercel.app/api/marcolivierbouch/OpenAssistantGPT" />
<img alt="GitHub Last Commit" src="https://img.shields.io/github/last-commit/marcolivierbouch/OpenAssistantGPT" />
<img alt="" src="https://img.shields.io/github/repo-size/marcolivierbouch/OpenAssistantGPT" />
<img alt="GitHub Issues" src="https://img.shields.io/github/issues/marcolivierbouch/OpenAssistantGPT" />
<img alt="GitHub Pull Requests" src="https://img.shields.io/github/issues-pr/marcolivierbouch/OpenAssistantGPT" />
</p>
OpenAssistantGPT is an open source platform for building chatbot assistants using OpenAI's Assistant. It offers features like easy website integration, low cost, and an open source codebase available on GitHub.
Users can build their chatbot with minimal coding required, and OpenAssistantGPT supports direct billing through OpenAI without extra charges. The platform is particularly user-friendly and cost-effective, appealing to those seeking to integrate AI chatbot functionalities into their websites.
For more detailed information and implementation guidelines, you can visit our [website](https://openassistantgpt.io/).

## How to create my Chatbot
1. Open [OpenAI](https://openai.com/) and create an account.
2. Open [OpenAssistantGPT](https://openassistantgpt.io/) and create an account.
3. Set your OpenAI API key in your [OpenAssistantGPT dashboard](https://openassistantgpt.io/dashboard).
4. Create a crawler or upload your own file.
5. Create your chatbot with the file you uploaded.
6. Test your chatbot!
## Technical Features
## Crawlers
- Crawlers exist within the assistant in order to crawl through websites and extract certain information. Criteria such as strings or sections can be specified in order to allow the crawler to collect data.
- The data collected is stored in files
- The files can be used to help train your chatbot to become more intelligent
## Files
- Files can be used to train your chatbot
- File uploads allow the user to upload a table of questions and answers to provide the chatbot with more knowledge
- File uploads enhance chatbot performance
- File types are currently limited. Refer to https://www.openassistantgpt.io/docs/documentation/files to see which file types can be uploaded.
## Chatbots
- Users can create or import chatbots
- Created chatbots can be configured with a display name, welcome message, default prompt, and OpenAI Model
- Users must enter an OpenAI API key when creating a chatbot
- Files can be uploaded when the chatbot is created in order for the AI to be able to search for content when a query is made
## Web Search
- If the chatbot cannot generate an answer, the web search feature will be used
- The web search feature is sometimes also used in coordination with the chatbot's knowledge in order to generate more accurate responses
- Users can influence the use of the web search feature based on context of their questions, asking follow up questions, and by explicitly prompting the chatbot to do a web search
## Benefits:
- Improves accuracy
- Better experience for the users
- More knowledge to pull from
## Tips
- In order for the chatbot to perform as expected, users should create clearly state their objectives to the chatbot
- The chatbot can be configured to respond with certain message lengths, as well as with a positive tone
- The chatbot can be configured to inform users that their question is out of scope if the question asked is off topic
## Use Cases
- Building a smart chatbot for your website
- Building a smart chatbot to assist with classwork
- Building a smart chatbot to respond to emails
- And much more depending on user needs!
## Integrating the smart chatbot to your website
Integrating your smart chatbot with your website is quite simple. You will need the following two accounts before beginning:
- Google or Github account
- OpenAI account
1. Create a new secret key on https://platform.openai.com/api-keys, and set this new secret key in your OpenAssistantGPT settings
2. Upload any files with the content you desire to train the chatbot
3. Create your new chatbot
4. Embed the chatbot in your website
## Documentation
For full documentation, visit our [documentation](https://openassistantgpt.io/docs)
## Contributing
We love our contributors! Here's the list of who contributed:
<a href="https://github.com/marcolivierbouch/OpenAssistantGPT/graphs/contributors">
<img src="https://contrib.rocks/image?repo=marcolivierbouch/OpenAssistantGPT" />
</a>
## Tech Stack
Next.js – framework
TypeScript – language
Tailwind – CSS
Supabase – database
NextAuth.js – auth
Stripe – payments
Resend – emails
Vercel – deployments
## Repo Activity

================================================
FILE: app/(auth)/layout.tsx
================================================
interface AuthLayoutProps {
children: React.ReactNode
}
export default function AuthLayout({ children }: AuthLayoutProps) {
return <div className="min-h-screen">{children}</div>
}
================================================
FILE: app/(auth)/login/page.tsx
================================================
import Link from "next/link";
import { Metadata } from "next";
import { cn } from "@/lib/utils"
import { buttonVariants } from "@/components/ui/button"
import { Icons } from "@/components/icons"
import { getCurrentUser } from "@/lib/session";
import { redirect } from "next/navigation";
import GithubLoginForm from "@/components/github-login-form";
import GoogleLoginForm from "@/components/google-login-form";
export const metadata: Metadata = {
title: "Login",
description: "Login to your account",
}
export default async function Login() {
const user = await getCurrentUser()
if (user) {
redirect("/dashboard")
}
return (
<div className="container flex h-screen w-screen flex-col items-center justify-center">
<Link
href="/"
className={cn(
buttonVariants({ variant: "ghost" }),
"absolute left-4 top-4 md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
<div data-aos="fade-up" data-aos-duration="1000" className="mx-auto flex w-full flex-col justify-center space-y-6 sm:w-[350px]">
<div className="flex flex-col space-y-2 text-center">
<Icons.bot className="mx-auto h-6 w-6" />
<h1 className="text-2xl font-semibold tracking-tight">
Welcome
</h1>
<p className="text-sm text-muted-foreground">
Use your Google or Github account to sign in.
</p>
<div className="py-4">
<GithubLoginForm />
<GoogleLoginForm />
</div>
<p className="text-sm text-muted-foreground">
By connecting your account, you agree to our <a href="/docs/legal/terms">Terms of Service</a> and <a href="/docs/legal/privacy">Privacy Policy</a>.
</p>
</div>
</div>
</div>
);
}
================================================
FILE: app/(dashboard)/dashboard/billing/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function DashboardBillingLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Billing"
text="Manage billing and your subscription plan."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/billing/page.tsx
================================================
import { redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import { BillingForm } from "@/components/billing-form"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { siteConfig } from "@/config/site"
import { stripe } from "@/lib/stripe"
import { getUserSubscriptionPlan } from "@/lib/subscription"
export const metadata = {
title: `${siteConfig.name} - Billing`,
description: "Manage billing and your subscription plan.",
}
export default async function BillingPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const subscriptionPlan = await getUserSubscriptionPlan(user.id)
// If user has a pro plan, check cancel status on Stripe.
let isCanceled = false
if (subscriptionPlan.stripeSubscriptionId) {
const stripePlan = await stripe.subscriptions.retrieve(
subscriptionPlan.stripeSubscriptionId
)
isCanceled = stripePlan.cancel_at_period_end
}
return (
<DashboardShell>
<DashboardHeader
heading="Billing"
text="Manage billing and your subscription plan. For more information about our plans, visit our documentation pricing page or you can ask our chatbot."
/>
<BillingForm
subscriptionPlan={{
...subscriptionPlan,
isCanceled,
}}
/>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/chatWindow/page.tsx
================================================
import { notFound } from "next/navigation"
import { Chat, ClientSideChatbotProps } from "@/components/chat-sdk"
import { Chatbot } from "@prisma/client"
import { db } from "@/lib/db"
import { getUserSubscriptionPlan } from "@/lib/subscription"
import { getClientIP } from "@/lib/getIP"
import { Icons } from "@/components/icons"
var ipRangeCheck = require("ip-range-check");
interface ChatbotSettingsProps {
params: { chatbotId: string, defaultMessage: string, withExitX: boolean, clientSidePrompt: string }
}
async function getChatbotForUser(chatbotId: Chatbot["id"]) {
return await db.chatbot.findFirst({
where: {
id: chatbotId,
},
})
}
export default async function ChatbotPage({ params }: ChatbotSettingsProps) {
const chatbot = await getChatbotForUser(params.chatbotId)
let accessDenied = false
if (!chatbot) {
notFound()
}
// validate ip restrictions
const ip = getClientIP()
if (!chatbot?.allowEveryone) {
if (!ipRangeCheck(ip, chatbot?.allowedIpRanges || [])) {
accessDenied = true
}
}
// validate is ip is banned
if(ipRangeCheck(ip, chatbot.bannedIps)) {
accessDenied = true
}
const plan = await getUserSubscriptionPlan(chatbot.userId)
if (chatbot.displayBranding === false && plan?.brandingCustomization === false) {
chatbot.displayBranding = true
}
if (chatbot.chatFileAttachementEnabled && plan?.chatFileAttachments === false) {
chatbot.chatFileAttachementEnabled = false
}
if (chatbot.chatbotLogoURL !== '' && plan?.basicCustomization === false) {
chatbot.chatbotLogoURL = null
}
if (accessDenied) {
return (
<div className="flex min-h-[100dvh] flex-col items-center justify-center bg-background px-4 py-12 sm:px-6 lg:px-8">
<div className="mx-auto max-w-md text-center">
<Icons.lock className="mx-auto h-12 w-12 text-primary" />
<h1 className="mt-4 text-3xl font-bold tracking-tight text-foreground sm:text-4xl">Access Denied</h1>
<p className="mt-4 text-muted-foreground">
You don't have permission to access this page. Please contact an administrator if you believe this is an
error.
</p>
</div>
</div>
)
}
const clientSideChatbot: ClientSideChatbotProps = {
id: chatbot.id,
name: chatbot.name,
userId: chatbot.userId,
openaiId: chatbot.openaiId,
createdAt: chatbot.createdAt,
welcomeMessage: chatbot.welcomeMessage,
chatbotErrorMessage: chatbot.chatbotErrorMessage,
isImported: chatbot.isImported,
chatTitle: chatbot.chatTitle,
chatbotLogoURL: chatbot.chatbotLogoURL || '',
chatMessagePlaceHolder: chatbot.chatMessagePlaceHolder,
rightToLeftLanguage: chatbot.rightToLeftLanguage,
bubbleColor: chatbot.bubbleColor,
bubbleTextColor: chatbot.bubbleTextColor,
chatHeaderBackgroundColor: chatbot.chatHeaderBackgroundColor,
chatHeaderTextColor: chatbot.chatHeaderTextColor,
chatbotReplyBackgroundColor: chatbot.chatbotReplyBackgroundColor,
chatbotReplyTextColor: chatbot.chatbotReplyTextColor,
userReplyBackgroundColor: chatbot.userReplyBackgroundColor,
userReplyTextColor: chatbot.userReplyTextColor,
chatInputStyle: chatbot.chatInputStyle,
inquiryEnabled: chatbot.inquiryEnabled,
inquiryLinkText: chatbot.inquiryLinkText,
inquiryTitle: chatbot.inquiryTitle,
inquirySubtitle: chatbot.inquirySubtitle,
inquiryEmailLabel: chatbot.inquiryEmailLabel,
inquiryMessageLabel: chatbot.inquiryMessageLabel,
inquirySendButtonText: chatbot.inquirySendButtonText,
inquiryAutomaticReplyText: chatbot.inquiryAutomaticReplyText,
inquiryDisplayLinkAfterXMessage: chatbot.inquiryDisplayLinkAfterXMessage,
chatHistoryEnabled: chatbot.chatHistoryEnabled,
displayBranding: chatbot.displayBranding,
chatFileAttachementEnabled: chatbot.chatFileAttachementEnabled,
bannedIps: chatbot.bannedIps,
allowEveryone: chatbot.allowEveryone,
allowedIpRanges: chatbot.allowedIpRanges,
}
return (
<Chat chatbot={clientSideChatbot} withExitX={params.withExitX} defaultMessage={params.defaultMessage || ""} clientSidePrompt={params.clientSidePrompt || ""}></Chat>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/loading.tsx
================================================
import { Skeleton } from "@/components/ui/skeleton"
export default function Loading() {
return (
<div className="grid w-full gap-10">
<div className="flex w-full items-center justify-between">
<Skeleton className="h-[38px] w-[90px]" />
<Skeleton className="h-[38px] w-[80px]" />
</div>
<div className="mx-auto w-[800px] space-y-6">
<Skeleton className="h-[50px] w-full" />
<Skeleton className="h-[20px] w-2/3" />
<Skeleton className="h-[20px] w-full" />
<Skeleton className="h-[20px] w-full" />
</div>
</div>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/page.tsx
================================================
import { getCurrentUser } from "@/lib/session"
import { notFound, redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { Chatbot, User } from "@prisma/client"
import { db } from "@/lib/db"
import Link from "next/link"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
interface ChatbotSettingsProps {
params: { chatbotId: string }
}
async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User["id"]) {
return await db.chatbot.findFirst({
where: {
id: chatbotId,
userId: userId,
},
})
}
export default async function ChatbotPage({ params }: ChatbotSettingsProps) {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const chatbot = await getChatbotForUser(params.chatbotId, user.id)
if (!chatbot) {
notFound()
}
return (
<DashboardShell>
<DashboardHeader heading="Chat" text="Start chatting with your chatbot">
<Link
href={`/dashboard/chatbots`}
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="h-svh">
<iframe
src={`/embed/${chatbot.id}/window?chatbox=false`}
className="overflow-hidden border border-1 rounded-lg shadow-lg w-full h-4/6"
allowFullScreen allow="clipboard-read; clipboard-write"
></iframe>
</div>
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/embed/loading.tsx
================================================
import { Skeleton } from "@/components/ui/skeleton"
export default function Loading() {
return (
<div className="grid w-full gap-10">
<div className="flex w-full items-center justify-between">
<Skeleton className="h-[38px] w-[90px]" />
<Skeleton className="h-[38px] w-[80px]" />
</div>
<div className="mx-auto w-[800px] space-y-6">
<Skeleton className="h-[50px] w-full" />
<Skeleton className="h-[20px] w-2/3" />
<Skeleton className="h-[20px] w-full" />
<Skeleton className="h-[20px] w-full" />
</div>
</div>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/embed/page.tsx
================================================
import { getCurrentUser } from "@/lib/session"
import { notFound, redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { Chatbot, User } from "@prisma/client"
import { db } from "@/lib/db"
import Link from "next/link"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { CodeBlock } from "@/components/ui/codeblock"
import { siteConfig } from "@/config/site"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
interface ChatbotSettingsProps {
params: { chatbotId: string }
}
async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User["id"]) {
return await db.chatbot.findFirst({
where: {
id: chatbotId,
userId: userId,
},
})
}
export default async function EmbedOnSitePage({ params }: ChatbotSettingsProps) {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const chatbot = await getChatbotForUser(params.chatbotId, user.id)
if (!chatbot) {
notFound()
}
return (
<DashboardShell>
<DashboardHeader heading="Embed On Website" text="Make your chatbot publicly accessible for users.">
<Link
href={`/dashboard/chatbots`}
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<Tabs className="w-full overflow-x-auto max-w-full" defaultValue="widget">
<TabsList className="mb-10 grid w-full grid-cols-5 gap-4">
<TabsTrigger value="widget">Widget</TabsTrigger>
<TabsTrigger value="window">Window</TabsTrigger>
</TabsList>
<TabsContent value="window">
<div className="space-y-4">
<CodeBlock
language="html"
value={`<iframe
src="${siteConfig.url}embed/${params.chatbotId}/window?chatbox=false"
style="overflow: hidden; height: 80vh; width: 480px; bottom: -30px; border: 2px solid #e2e8f0; border-radius: 0.375rem; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);"
allowfullscreen allow="clipboard-read; clipboard-write"
>
</iframe>
<!-- This chatbot is build using https://openassistantgpt.io/ -->
`}>
</CodeBlock>
</div>
</TabsContent>
<TabsContent value="widget">
<div className="space-y-4">
<div className="bg-orange-100 border-l-4 border-orange-500 text-orange-700 p-4" role="alert">
<p className="font-bold text-md">Warning</p>
<p className="text-sm">Depending on which platform you are adding our chatbot you may have to change the width and the height of the button. If you see a scroll bar it means the IFRAME is the wrong size and you have to change it.</p>
<p className="text-sm">By default we have `width: 56px; height: 56px;` but if you see the scroll bar try to use `width: 60px; height: 60px;` </p>
</div>
<CodeBlock
language="html"
value={`<script>
window.addEventListener("message",function(t){var e=document.getElementById("openassistantgpt-chatbot-iframe"),s=document.getElementById("openassistantgpt-chatbot-button-iframe");"openChat"===t.data&&(console.log("Toggle chat visibility"),e&&s?(e.contentWindow.postMessage("openChat","*"),s.contentWindow.postMessage("openChat","*"),e.style.pointerEvents="auto",e.style.display="block",window.innerWidth<640?(e.style.position="fixed",e.style.width="100%",e.style.height="100%",e.style.top="0",e.style.left="0",e.style.zIndex="9999"):(e.style.position="fixed",e.style.width="30rem",e.style.height="65vh",e.style.bottom="0",e.style.right="0",e.style.top="",e.style.left="")):console.error("iframe not found")),"closeChat"===t.data&&e&&s&&(e.style.display="none",e.style.pointerEvents="none",e.contentWindow.postMessage("closeChat","*"),s.contentWindow.postMessage("closeChat","*"))});
</script>
<body>
<iframe src="${siteConfig.url}embed/${params.chatbotId}/button?chatbox=false"
style="z-index: 50; margin-right: 1rem; margin-bottom: 1rem; position: fixed; right: 0; bottom: 0; width: 56px; height: 56px; border: 0; border: 2px solid #e2e8f0; border-radius: 50%; color-scheme: none; background: none;box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);"
id="openassistantgpt-chatbot-button-iframe"></iframe>
<!-- This chatbot is build using https://openassistantgpt.io/ -->
<iframe src="${siteConfig.url}embed/${params.chatbotId}/window?chatbox=false&withExitX=true"
style="z-index: 50; margin-right: 1rem; margin-bottom: 6rem; display: none; position: fixed; right: 0; bottom: 0; pointer-events: none; overflow: hidden; height: 65vh; border: 2px solid #e2e8f0; border-radius: 0.375rem; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); width: 30rem;"
allow="clipboard-read; clipboard-write"
allowfullscreen id="openassistantgpt-chatbot-iframe"></iframe>
</body>
`}>
</CodeBlock>
<CodeBlock
language="javascript"
value={`
export default function Chatbot() {
const customStyle = {
marginRight: '1rem',
marginBottom: '6rem',
display: 'none',
position: 'fixed',
right: 0,
bottom: 0,
pointerEvents: 'none',
overflow: 'hidden',
height: '65vh',
border: '2px solid #e2e8f0',
borderRadius: '0.375rem',
boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
width: '30rem'
};
return (
<div>
<script dangerouslySetInnerHTML={{
__html: \`
window.addEventListener("message",function(t){var e=document.getElementById("openassistantgpt-chatbot-iframe"),s=document.getElementById("openassistantgpt-chatbot-button-iframe");"openChat"===t.data&&(console.log("Toggle chat visibility"),e&&s?(e.contentWindow.postMessage("openChat","*"),s.contentWindow.postMessage("openChat","*"),e.style.pointerEvents="auto",e.style.display="block",window.innerWidth<640?(e.style.position="fixed",e.style.width="100%",e.style.height="100%",e.style.top="0",e.style.left="0",e.style.zIndex="9999"):(e.style.position="fixed",e.style.width="30rem",e.style.height="65vh",e.style.bottom="0",e.style.right="0",e.style.top="",e.style.left="")):console.error("iframe not found")),"closeChat"===t.data&&e&&s&&(e.style.display="none",e.style.pointerEvents="none",e.contentWindow.postMessage("closeChat","*"),s.contentWindow.postMessage("closeChat","*"))});
\`}} />
<iframe
src="${siteConfig.url}embed/${params.chatbotId}/button?chatbox=false"
scrolling='no'
id="openassistantgpt-chatbot-button-iframe"
className="fixed bottom-0 right-0 mb-4 z-50 flex items-end inline-block mr-4 w-14 h-14 border border-gray-300 rounded-full shadow-md"
></iframe>
<!-- This chatbot is build using https://openassistantgpt.io/ -->
<iframe
src="${siteConfig.url}embed/${params.chatbotId}/window?chatbox=false&withExitX=true"
style={customStyle}
allow="clipboard-read; clipboard-write"
className="z-50"
id="openassistantgpt-chatbot-iframe"
></iframe>
</div>
)
}
`}>
</CodeBlock>
</div>
</TabsContent>
</Tabs>
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/errors/loading.tsx
================================================
import { Skeleton } from "@/components/ui/skeleton"
export default function Loading() {
return (
<div className="grid w-full gap-10">
<div className="flex w-full items-center justify-between">
<Skeleton className="h-[38px] w-[90px]" />
<Skeleton className="h-[38px] w-[80px]" />
</div>
<div className="mx-auto w-[800px] space-y-6">
<Skeleton className="h-[50px] w-full" />
<Skeleton className="h-[20px] w-2/3" />
<Skeleton className="h-[20px] w-full" />
<Skeleton className="h-[20px] w-full" />
</div>
</div>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/errors/page.tsx
================================================
import { getCurrentUser } from "@/lib/session"
import { notFound, redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { Chatbot, User } from "@prisma/client"
import { db } from "@/lib/db"
import Link from "next/link"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { ErrorItem } from "@/components/error-items"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
interface ChatbotSettingsProps {
params: { chatbotId: string }
}
async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User["id"]) {
return await db.chatbot.findFirst({
where: {
id: chatbotId,
userId: userId,
},
})
}
export default async function ChatbotErrorPage({ params }: ChatbotSettingsProps) {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const chatbot = await getChatbotForUser(params.chatbotId, user.id)
if (!chatbot) {
notFound()
}
const errors = await db.chatbotErrors.findMany({
where: {
chatbotId: chatbot.id
}
})
return (
<DashboardShell>
<DashboardHeader heading="Chatbot Errors" text="All unexpected errors generated by users using your chatbot.">
<Link
href={`/dashboard/chatbots`}
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
{errors.length ?
<div className="divide-y divide-border rounded-md border">
{errors.map((error) => (
<ErrorItem error={error} key={error.id} />
))}
</div>
:
<div className="grid gap-10">
<EmptyPlaceholder>
<EmptyPlaceholder.Icon name="warning" />
<EmptyPlaceholder.Title>No chatbot errors</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You don't have any chatbot errors. Keep an eye on this page for any unexpected errors.
</EmptyPlaceholder.Description>
</EmptyPlaceholder>
</div>
}
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/inquiries/loading.tsx
================================================
import { Skeleton } from "@/components/ui/skeleton"
export default function Loading() {
return (
<div className="grid w-full gap-10">
<div className="flex w-full items-center justify-between">
<Skeleton className="h-[38px] w-[90px]" />
<Skeleton className="h-[38px] w-[80px]" />
</div>
<div className="mx-auto w-[800px] space-y-6">
<Skeleton className="h-[50px] w-full" />
<Skeleton className="h-[20px] w-2/3" />
<Skeleton className="h-[20px] w-full" />
<Skeleton className="h-[20px] w-full" />
</div>
</div>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/inquiries/page.tsx
================================================
import { getCurrentUser } from "@/lib/session"
import { notFound, redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { Chatbot, User } from "@prisma/client"
import { db } from "@/lib/db"
import Link from "next/link"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { Inquiries } from "@/components/inquiries"
import { InquiryMessages } from "@/types"
interface ChatbotSettingsProps {
params: { chatbotId: string }
}
async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User["id"]) {
return await db.chatbot.findFirst({
where: {
id: chatbotId,
userId: userId,
},
})
}
export default async function UserInquiryPage({ params }: ChatbotSettingsProps) {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const chatbot = await getChatbotForUser(params.chatbotId, user.id)
if (!chatbot) {
notFound()
}
// select the messages with the thread id
const inquiries = await db.clientInquiries.findMany({
select: {
id: true,
email: true,
threadId: true,
inquiry: true,
createdAt: true,
chatbotId: true,
deletedAt: true
},
where: {
chatbotId: chatbot.id,
},
orderBy: {
createdAt: "desc",
},
})
// for each inquiry get the messages thread using threadid
const inquiriesWithMessages: InquiryMessages[] = await Promise.all(
inquiries.map(async (inquiry) => {
const messages = await db.message.findMany({
where: {
threadId: inquiry.threadId,
chatbotId: inquiry.chatbotId
}
})
return {
...inquiry,
messages
}
}
)
)
return (
<DashboardShell>
<DashboardHeader heading="User Inquiries" text="All the users that contacted you using your chatbot">
<Link
href={`/dashboard/chatbots`}
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<Inquiries inquiries={inquiriesWithMessages} />
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/loading.tsx
================================================
import { Skeleton } from "@/components/ui/skeleton"
export default function Loading() {
return (
<div className="grid w-full gap-10">
<div className="flex w-full items-center justify-between">
<Skeleton className="h-[38px] w-[90px]" />
<Skeleton className="h-[38px] w-[80px]" />
</div>
<div className="mx-auto w-[800px] space-y-6">
<Skeleton className="h-[50px] w-full" />
<Skeleton className="h-[20px] w-2/3" />
<Skeleton className="h-[20px] w-full" />
<Skeleton className="h-[20px] w-full" />
</div>
</div>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/not-found.tsx
================================================
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
export default function NotFound() {
return (
<EmptyPlaceholder className="mx-auto max-w-[800px]">
<EmptyPlaceholder.Icon name="warning" />
<EmptyPlaceholder.Title>Uh oh! Not Found</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
This chatbot cound not be found. Please try again.
</EmptyPlaceholder.Description>
<Link href="/dashboard" className={buttonVariants({ variant: "ghost" })}>
Go to chatbots
</Link>
</EmptyPlaceholder>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/page.tsx
================================================
import { notFound, redirect } from "next/navigation"
import { ChatbotForm } from "@/components/chatbot-form"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { db } from "@/lib/db"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Input } from "@/components/ui/input"
import { siteConfig } from "@/config/site"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { CustomizationSettings } from "@/components/customization-settings"
import { InquirySettings } from "@/components/inquiry-settings"
import { ImportedChatbotForm } from "@/components/imported-chatbot-form"
import { ChatbotBrandingProSettingsForm } from "@/components/chatbot-branding-pro-settings"
import { ChatbotFileAttachementProSettingsForm } from "@/components/chatbot-file-attachement-pro-settings"
import { ChatbotAdvancedSettingsForm } from "@/components/chatbot-advanced-settings"
import { ChatbotAdvancedSecuritySettingsForm } from "@/components/chatbot-security-settings"
interface ChatbotSettingsProps {
params: { chatbotId: string }
}
export default async function ChatbotPage({ params }: ChatbotSettingsProps) {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const chatbot = await db.chatbot.findFirst({
where: {
id: params.chatbotId,
userId: user.id,
},
})
if (!chatbot) {
notFound()
}
const files = await db.file.findMany({
where: {
userId: user.id,
},
})
const currentFiles = await db.chatbotFiles.findMany({
select: {
id: true,
chatbotId: true,
file: {
select: {
id: true,
name: true,
}
},
},
where: {
chatbotId: chatbot.id,
},
})
const models = await db.chatbotModel.findMany({})
return (
<DashboardShell>
<DashboardHeader heading="Chatbot" text="Configure your chatbot here">
<Link
href="/dashboard/chatbots"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<Tabs className="w-full" defaultValue="settings">
<TabsList className="mb-5 grid w-full grid-cols-5 gap-4">
<TabsTrigger value="settings">General Settings</TabsTrigger>
<TabsTrigger value="advancedSettings">Advanced Settings</TabsTrigger>
<TabsTrigger value="customizations">Customizations</TabsTrigger>
<TabsTrigger value="inquiry">User Inquiry Settings</TabsTrigger>
<TabsTrigger value="pro">Pro features 👑</TabsTrigger>
</TabsList>
<TabsContent value="settings">
<div className="space-y-4">
<div className="grid gap-10">
{
!chatbot.isImported ?
<ChatbotForm
user={user}
files={files}
currentFiles={currentFiles.map((file) => file.file.id)}
models={models}
chatbot={chatbot} />
:
<ImportedChatbotForm
user={user}
chatbot={chatbot}
/>
}
</div>
<Card>
<CardHeader>
<CardTitle>Chatbot id</CardTitle>
<CardDescription>
This is the unique chatbot id generated by {siteConfig.name}.
</CardDescription>
</CardHeader>
<CardContent>
<div className="flex space-x-2">
<Input value={chatbot.id} readOnly />
</div>
</CardContent>
</Card>
</div>
</TabsContent>
<TabsContent value="advancedSettings">
<div className="space-y-4">
<ChatbotAdvancedSettingsForm chatbot={chatbot} />
<ChatbotAdvancedSecuritySettingsForm chatbot={chatbot} />
</div>
</TabsContent>
<TabsContent value="customizations">
<div className="space-y-4">
<CustomizationSettings chatbot={chatbot} />
</div>
</TabsContent>
<TabsContent value="inquiry">
<InquirySettings chatbot={chatbot} />
</TabsContent>
<TabsContent value="pro">
<div className="space-y-4">
<ChatbotBrandingProSettingsForm chatbot={chatbot} />
<ChatbotFileAttachementProSettingsForm chatbot={chatbot} />
</div>
</TabsContent>
</Tabs>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function ChatbotsLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Chatbots"
text="Create and manage your chatbots."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/chatbots/page.tsx
================================================
import { redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { db } from "@/lib/db"
import { getCurrentUser } from "@/lib/session"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { ChatbotCreateButton } from "@/components/chatbot-create-button"
import { ChatbotItem } from "@/components/chatbot-item"
import { siteConfig } from "@/config/site"
export const metadata = {
title: `${siteConfig.name} - Chatbots`,
}
export default async function ChatbotsPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const bots: any[] = await db.chatbot.findMany({
where: {
userId: user.id,
},
select: {
id: true,
name: true,
createdAt: true,
openaiId: true,
isImported: true,
model: {
select: {
id: true,
name: true,
}
},
},
orderBy: {
createdAt: "desc",
},
})
return (
<DashboardShell>
<DashboardHeader heading="Chatbots" text="Create and manage your chatbots.">
<ChatbotCreateButton />
</DashboardHeader>
<div>
{bots?.length ? (
<div className="divide-y divide-border rounded-md border">
{bots.map((bot) => (
<ChatbotItem key={bot.id} chatbot={bot} model={bot.model} />
))}
</div>
) : (
<EmptyPlaceholder>
<EmptyPlaceholder.Icon name="bot" />
<EmptyPlaceholder.Title>No chatbot created</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You don't have any chatbot yet. Start creating.
</EmptyPlaceholder.Description>
<ChatbotCreateButton variant="outline" />
</EmptyPlaceholder>
)}
</div>
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function CrawlingLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Crawling"
text="Start crawling to import files."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/not-found.tsx
================================================
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
export default function NotFound() {
return (
<EmptyPlaceholder className="mx-auto max-w-[800px]">
<EmptyPlaceholder.Icon name="warning" />
<EmptyPlaceholder.Title>Uh oh! Not Found</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
This crawler cound not be found. Please try again.
</EmptyPlaceholder.Description>
<Link href="/dashboard/crawlers" className={buttonVariants({ variant: "ghost" })}>
Go to Crawlers
</Link>
</EmptyPlaceholder>
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/page.tsx
================================================
import { notFound, redirect } from "next/navigation"
import { Crawler, User } from "@prisma/client"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { db } from "@/lib/db"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
import { StartCrawlingButton } from "@/components/start-crawling-button"
import { FileItem } from "@/components/file-items"
interface CrawlerSettingsProps {
params: { crawlerId: string }
}
async function getCrawlerForUser(crawlerId: Crawler["id"], userId: User["id"]) {
return await db.crawler.findFirst({
where: {
id: crawlerId,
userId: userId,
},
})
}
export default async function CrawlingPage({ params }: CrawlerSettingsProps) {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const crawler = await getCrawlerForUser(params.crawlerId, user.id)
if (!crawler) {
notFound()
}
const files = await db.file.findMany({
where: {
crawlerId: crawler.id,
},
})
return (
<DashboardShell>
<DashboardHeader heading="Crawling" text="Start crawling to import files">
<Link
href="/dashboard/crawlers"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
{files?.length ?
<>
<div className="divide-y divide-border rounded-md border">
{files.map((file) => (
<FileItem file={file} key={file.id} />
))}
</div>
<StartCrawlingButton crawler={crawler} />
</>
: <div className="grid gap-10">
<EmptyPlaceholder>
<EmptyPlaceholder.Icon name="laptop" />
<EmptyPlaceholder.Title>Start crawling now to import files</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You don't have any files yet. Start crawling.
</EmptyPlaceholder.Description>
<StartCrawlingButton crawler={crawler} />
</EmptyPlaceholder>
</div>
}
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/loading.tsx
================================================
import { Skeleton } from "@/components/ui/skeleton"
export default function Loading() {
return (
<div className="grid w-full gap-10">
<div className="flex w-full items-center justify-between">
<Skeleton className="h-[38px] w-[90px]" />
<Skeleton className="h-[38px] w-[80px]" />
</div>
<div className="mx-auto w-[800px] space-y-6">
<Skeleton className="h-[50px] w-full" />
<Skeleton className="h-[20px] w-2/3" />
<Skeleton className="h-[20px] w-full" />
<Skeleton className="h-[20px] w-full" />
</div>
</div>
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/not-found.tsx
================================================
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
export default function NotFound() {
return (
<EmptyPlaceholder className="mx-auto max-w-[800px]">
<EmptyPlaceholder.Icon name="warning" />
<EmptyPlaceholder.Title>Uh oh! Not Found</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
This crawler cound not be found. Please try again.
</EmptyPlaceholder.Description>
<Link href="/dashboard/crawlers" className={buttonVariants({ variant: "ghost" })}>
Go to Crawlers
</Link>
</EmptyPlaceholder>
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/page.tsx
================================================
import { notFound, redirect } from "next/navigation"
import { Crawler, User } from "@prisma/client"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { db } from "@/lib/db"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { CrawlerForm } from "@/components/crawler-form"
interface CrawlerSettingsProps {
params: { crawlerId: string }
}
async function getCrawlerForUser(crawlerId: Crawler["id"], userId: User["id"]) {
return await db.crawler.findFirst({
where: {
id: crawlerId,
userId: userId,
},
})
}
export default async function CrawlerSettingsPage({ params }: CrawlerSettingsProps) {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const crawler = await getCrawlerForUser(params.crawlerId, user.id)
if (!crawler) {
notFound()
}
return (
<DashboardShell>
<DashboardHeader heading="Settings" text="Manage your crawling settings">
<Link
href="/dashboard/crawlers"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="grid gap-10">
<CrawlerForm crawler={crawler} />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function CrawlersSettingsLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Crawlers"
text="Manage your crawlers and crawling configuration."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/crawlers/page.tsx
================================================
import { redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
import { CrawlerCreateButton } from "@/components/crawler-create-button"
import { db } from "@/lib/db"
import { CrawlerItem } from "@/components/crawler-item"
import { siteConfig } from "@/config/site"
export const metadata = {
title: `${siteConfig.name} - Crawlers`,
description: "Manage your crawlers and crawling configuration.",
}
export default async function CrawlersPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const crawlers = await db.crawler.findMany({
where: {
userId: user.id,
},
})
return (
<DashboardShell>
<DashboardHeader heading="Crawlers" text="Manage your crawlers and crawling configuration.">
<CrawlerCreateButton />
</DashboardHeader>
<div className="bg-orange-100 border-l-4 border-orange-500 text-orange-700 p-4" role="alert">
<p className="font-bold text-md">Warning</p>
<p className="text-sm">Our crawlers don't support website generated with javascript at runtime yet. If your website isn’t SSR or static we won't be able to fetch the content.</p>
<p className="text-sm">We recommend use <a className="underline" href="https://github.com/BuilderIO/gpt-crawler">gpt-crawler</a> to crawl your website localy and then upload your file to {siteConfig.name}.</p>
</div>
<div>
{crawlers?.length ? (
<div className="divide-y divide-border rounded-md border">
{crawlers.map((crawler: any) => (
<CrawlerItem key={crawler.id} crawler={crawler} />
))}
</div>
) : (
<EmptyPlaceholder>
<EmptyPlaceholder.Icon name="post" />
<EmptyPlaceholder.Title>No crawler created</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You don't have any crawler yet. Start importing content.
</EmptyPlaceholder.Description>
<CrawlerCreateButton variant="outline" />
</EmptyPlaceholder>
)}
</div>
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/exports/page.tsx
================================================
import { redirect } from "next/navigation"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { db } from "@/lib/db"
import { getCurrentUser } from "@/lib/session"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
import { Label } from "@/components/ui/label"
import { siteConfig } from "@/config/site"
import { ChatExportItem } from "@/components/chat-export-items"
import { MessageExportButton } from "@/components/export-messages-button"
export const metadata = {
title: `${siteConfig.name} - Exported Messages`,
}
export default async function MessagesExportPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const chatbots = await db.chatbot.findMany({
where: {
userId: user.id,
},
select: {
id: true,
name: true,
ChatbotMessagesExport: {
select: {
id: true,
blobDownloadUrl: true,
blobUrl: true,
lastXDays: true,
createdAt: true,
}
}
},
})
return (
<DashboardShell>
<DashboardHeader heading="Messages Export" text="Export Messages from your chatbot. This feature will generate a JSON file with all the messages received by a chatbot.">
</DashboardHeader>
<div className="bg-blue-100 border-l-4 border-blue-500 text-blue-700 p-4" role="alert">
<p className="font-bold text-md">Need help when using message exports?</p>
<p>Check our guide on how to use message exports correctly.</p>
<p>Click <a href='/guides/how-to-use-message-exports-correctly' className="underline">here</a> to open our guide.</p>
</div>
<div className="flex flex-col">
<div className="mb-4 flex items-center justify-between px-2">
<Label className="text-lg">All Message Export</Label>
<MessageExportButton variant={"outline"} />
</div>
{chatbots.length > 0 && chatbots.some(chatbot => chatbot.ChatbotMessagesExport.length > 0) ?
<div className="">
{
chatbots.map((chatbot) => (
chatbot.ChatbotMessagesExport.length > 0 && (
<div key={chatbot.id}>
<div className="divide-y divide-border rounded-md border">
{
chatbot.ChatbotMessagesExport.map((messagesExport) => (
<ChatExportItem key={messagesExport.id} messagesExport={messagesExport} chatbotName={chatbot.name} />
))
}
</div>
</div>
)
))
}
</div>
: <div className="grid gap-10">
<EmptyPlaceholder>
<EmptyPlaceholder.Icon name="folder" />
<EmptyPlaceholder.Title>Create a message export now</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You can export your chatbot messages to a file.
</EmptyPlaceholder.Description>
<MessageExportButton variant={"outline"} />
</EmptyPlaceholder>
</div>
}
</div>
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/files/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function FilesLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Files"
text="List of all of your imported and crawled files."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/files/page.tsx
================================================
import { redirect } from "next/navigation"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { db } from "@/lib/db"
import { getCurrentUser } from "@/lib/session"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
import { Label } from "@/components/ui/label"
import { CrawlerCreateButton } from "@/components/crawler-create-button"
import { FileUploadButton } from "@/components/file-upload-button"
import { FileItem } from "@/components/file-items"
import { siteConfig } from "@/config/site"
export const metadata = {
title: `${siteConfig.name} - Files`,
}
export default async function FilePage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const files = await db.file.findMany({
select: {
id: true,
name: true,
createdAt: true,
openAIFileId: true,
blobUrl: true,
crawler: {
select: {
id: true,
name: true,
}
}
},
where: {
userId: user.id,
},
})
const uploadedFiles = files.filter((file) => !file.crawler)
const filesWithCrawler = files.filter((file) => {
if (file.crawler) {
return true
}
return false
})
return (
<DashboardShell>
<DashboardHeader heading="Files" text="List of all of your imported and crawled files.">
</DashboardHeader>
<div className="flex flex-col">
<div className="mb-4 flex items-center justify-between px-2">
<Label className="text-lg">Uploaded files</Label>
<FileUploadButton variant={"outline"} />
</div>
{uploadedFiles.length ?
<div className="divide-y divide-border rounded-md border">
{uploadedFiles.map((file) => (
<FileItem key={file.id} file={file} />
))
}
</div>
: <div className="grid gap-10">
<EmptyPlaceholder>
<EmptyPlaceholder.Icon name="folder" />
<EmptyPlaceholder.Title>Import a file now</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You don't have any files yet. Import a file.
</EmptyPlaceholder.Description>
<FileUploadButton variant={"outline"} />
</EmptyPlaceholder>
</div>
}
<div className="my-4" />
<div className="mb-4 flex items-center justify-between px-2">
<Label className="text-lg">Crawlers' files</Label>
<CrawlerCreateButton variant={"outline"} />
</div>
{filesWithCrawler.length ?
<div className="divide-y divide-border rounded-md border">
{
filesWithCrawler.map((file) => (
<FileItem file={file} key={file.id} />
))
}
</div>
:
<div className="grid gap-10">
<EmptyPlaceholder>
<EmptyPlaceholder.Icon name="laptop" />
<EmptyPlaceholder.Title>Start crawling now to import files</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You don't have any files yet. Start crawling.
</EmptyPlaceholder.Description>
<CrawlerCreateButton variant={"outline"} />
</EmptyPlaceholder>
</div>
}
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/files/upload/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function UploadFileLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Upload file"
text="Upload a file and then you'll be able to use it with your chatbot."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/files/upload/page.tsx
================================================
import { redirect } from "next/navigation"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { UploadFileForm } from "@/components/upload-file-form"
export default async function UploadFilePage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
return (
<DashboardShell>
<DashboardHeader heading="Upload file" text="Upload a file and then you'll be able to use it with your chatbot.">
<Link
href="/dashboard/files"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="grid gap-10">
<UploadFileForm />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/layout.tsx
================================================
import { notFound } from "next/navigation"
import { dashboardConfig } from "@/config/dashboard"
import { getCurrentUser } from "@/lib/session"
import { MainNav } from "@/components/main-nav"
import { DashboardNav } from "@/components/nav"
import { SiteFooter } from "@/components/site-footer"
import { UserAccountNav } from "@/components/user-account-nav"
import { db } from "@/lib/db"
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"
import { OpenAIForm } from "@/components/openai-config-form"
import Image from "next/image"
interface DashboardLayoutProps {
children?: React.ReactNode
}
export default async function DashboardLayout({
children,
}: DashboardLayoutProps) {
const user = await getCurrentUser()
if (!user) {
return notFound()
}
const openAIKey = await db.openAIConfig.findFirst({
where: {
userId: user.id,
},
})
return (
<div className="flex min-h-screen flex-col space-y-6">
<header className="sticky top-0 z-40 border-b bg-background">
<div className="container flex h-16 items-center justify-between py-4">
<MainNav items={dashboardConfig.mainNav} />
<UserAccountNav
user={{
name: user.name,
image: user.image,
email: user.email,
}}
/>
</div>
</header>
<div className="container grid flex-1 gap-12 md:grid-cols-[200px_1fr]">
<aside className="hidden w-[200px] flex-col md:flex">
<DashboardNav items={dashboardConfig.sidebarNav} />
</aside>
<main className="flex w-full flex-1 flex-col overflow-hidden">
<Dialog defaultOpen={!openAIKey}>
<DialogContent>
<DialogHeader>
<DialogTitle>
<div className="flex justify-center">
<Image src="/openai-logo.svg" alt="OpenAI logo" width={120} height={120} />
</div>
<div className="flex justify-center pt-4">
Before we start, let's configure OpenAI! 🚀
</div>
</DialogTitle>
<div className="">
<OpenAIForm className="border-0 shadow-none" user={user} />
</div>
</DialogHeader>
</DialogContent>
</Dialog>
{children}
</main>
</div>
<SiteFooter simpleFooter={true} />
</div>
)
}
================================================
FILE: app/(dashboard)/dashboard/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { ChatbotCreateButton } from "@/components/chatbot-create-button"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function DashboardLoading() {
return (
<DashboardShell>
<DashboardHeader heading="Dashboard" text="Welcome to Your Chatbot Dashboard">
<ChatbotCreateButton />
</DashboardHeader>
<CardSkeleton />
<CardSkeleton />
<CardSkeleton />
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/chatbot/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function CreateChatbotLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Create your chatbot"
text="Create your chatbot and start talking with him."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/chatbot/page.tsx
================================================
import { redirect } from "next/navigation"
import { NewChatbotForm } from "@/components/new-chatbot-form"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { ImportChatbotForm } from "@/components/new-import-chatbot-form"
export default async function ChatbotCreatePage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
return (
<DashboardShell>
<DashboardHeader heading="Create your chatbot" text="Create your chatbot and start talking with him.">
<Link
href="/dashboard"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="grid gap-10">
<NewChatbotForm user={user} isOnboarding={false} />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/crawler/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function CreateCrawlerLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Create crawler"
text="Create a crawler to start importing files."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/crawler/page.tsx
================================================
import { redirect } from "next/navigation"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { NewCrawlerForm } from "@/components/new-crawler-form"
export default async function CrawlerCreatePage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
return (
<DashboardShell>
<DashboardHeader heading="Create your crawler" text="Create a crawler to start importing files.">
<Link
href="/dashboard/crawlers"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="grid gap-10">
<NewCrawlerForm />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/export/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function CreateExportLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Export Messages"
text="Create an export of your chatbot messages."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/export/page.tsx
================================================
import { redirect } from "next/navigation"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { NewMessageExportForm } from "@/components/new-message-export"
import { db } from "@/lib/db"
export default async function CreateMessageExportPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const chatbots = await db.chatbot.findMany({
where: {
userId: user.id,
},
select: {
id: true,
name: true,
openaiId: true,
},
})
return (
<DashboardShell>
<DashboardHeader heading="Export Messages" text="Create an export of your chatbot messages.">
<Link
href="/dashboard/exports"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="grid gap-10">
<NewMessageExportForm chatbots={chatbots} />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/importChatbot/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function ImportChatbotLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Create your chatbot"
text="Create your chatbot and start talking with him."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/new/importChatbot/page.tsx
================================================
import { redirect } from "next/navigation"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { Icons } from "@/components/icons"
import { ImportChatbotForm } from "@/components/new-import-chatbot-form"
export default async function ImportChatbotPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
return (
<DashboardShell>
<DashboardHeader heading="Import your chatbot" text="Import a chatbot that already exist in the OpenAI platform.">
<Link
href="/dashboard"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="grid gap-10">
<ImportChatbotForm user={user} />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/onboarding/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function CrawlersSettingsLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Onboarding"
text="Create your first chatbot"
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/onboarding/page.tsx
================================================
import { redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { UploadFileForm } from "@/components/upload-file-form"
import { NewChatbotForm } from "@/components/new-chatbot-form"
import { db } from "@/lib/db"
import { siteConfig } from "@/config/site"
import { Icons } from "@/components/icons"
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
import { cn } from "@/lib/utils"
import { OpenAIForm } from "@/components/openai-config-form"
import { Card, CardContent, CardHeader } from "@/components/ui/card"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
export const metadata = {
title: `${siteConfig.name} - Onboarding`,
description: "Onboarding - Create your first chatbot.",
}
export default async function OnboardingPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
let currentStep = 1
const openAIConfig = await db.openAIConfig.findFirst({
select: {
id: true,
globalAPIKey: true,
},
where: {
userId: user.id,
},
})
if (openAIConfig) {
currentStep = 2
}
const files = await db.file.count({
where: {
userId: user.id,
},
})
if (files > 0) {
currentStep = 3
}
const chatbot = await db.chatbot.findFirst({
where: {
userId: user.id,
},
})
if (chatbot) {
currentStep = 4
}
return (
<DashboardShell>
<DashboardHeader heading="Onboarding" text="Step-by-Step Guide for Building Your First Chatbot">
<Link
href="/dashboard"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div className="flex">
<aside className="w-64 h-full border-r">
<div className="p-4">
<h2 className="text-xl font-bold mb-4">Progress Steps</h2>
<div className="space-y-6">
<Card className={currentStep > 1 ? "border border-green-500 p-4" : "p-4"}>
<CardHeader>
<div className="flex items-center">
<Badge className="mr-2">1</Badge>
<h3 className="text-lg font-medium">Configuration</h3>
</div>
</CardHeader>
{currentStep == 1 &&
<CardContent>
<p className="text-sm text-gray-500">
This step is where we configure your OpenAI API Key. You will have to go <a target="_blank" className="underline" href="https://platform.openai.com/account/api-keys">here</a> to create your API Key. Once you have it, you can paste it in the form below.
</p>
</CardContent>
}
</Card>
<Card className={currentStep > 2 ? "border border-green-500 p-4" : "p-4"}>
<CardHeader>
<div className="flex items-center">
<Badge className="mr-2">2</Badge>
<h3 className="text-lg font-medium">Upload file</h3>
</div>
</CardHeader>
{currentStep == 2 &&
<CardContent>
<p className="text-sm text-gray-500">
This step is where you upload a file for your chatbot to use. This file can be a PDF, a Word document, or a text file. It will be used to train your chatbot.
</p>
</CardContent>
}
</Card>
<Card className={currentStep > 3 ? "border border-green-500 p-4" : "p-4"}>
<CardHeader>
<div className="flex items-center">
<Badge className="mr-2">3</Badge>
<h3 className="text-lg font-medium">Create your Chatbot</h3>
</div>
</CardHeader>
{currentStep == 3 &&
<CardContent>
<p className="text-sm text-gray-500">
This step is where you create your first smart chatbot. Then we will be able to chat with him. 🤖
</p>
</CardContent>
}
</Card>
<Card className={currentStep > 4 ? "border border-green-500 p-4" : "p-4"}>
<CardHeader>
<div className="flex items-center">
<Badge className="mr-2">4</Badge>
<h3 className="text-lg font-medium">Chat</h3>
</div>
</CardHeader>
{currentStep == 4 &&
<CardContent>
<p className="text-sm text-gray-500">
Chat with your chatbot for the first time! 🎉
</p>
</CardContent>
}
</Card>
</div>
</div>
</aside>
<main className="flex-grow p-6">
{currentStep == 1 &&
<OpenAIForm user={{ id: user.id }} />
}
{currentStep == 2 &&
<UploadFileForm />
}
{currentStep == 3 &&
<NewChatbotForm user={user} isOnboarding={true} />
}
{currentStep == 4 &&
<div>
<div className="mb-4 bg-blue-100 border-l-4 border-blue-500 text-black p-4" role="info">
<p className="font-bold text-md">Congratulations 🎉 </p>
<p className="text-sm">Now that your first chatbot is created your now chat with him.</p>
<p className="text-sm">There is still one more step if you want to embed the chatbot in your website like we did for this website you are currently in.</p>
<br />
<p className="borderinline-flex items-center text-sm justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background" >
<Link href={`/dashboard/chatbots/${chatbot!.id}/embed`} className="flex w-full">
<Button>
See how to embed our chatbot on your website
</Button>
</Link>
</p>
</div>
<iframe
src={`/embed/${chatbot?.id}/window?chatbox=false`}
className="overflow-hidden border border-1 rounded-lg shadow-lg w-full h-[65vh]"
allowFullScreen allow="clipboard-read; clipboard-write"
></iframe>
</div>
}
</main>
</div>
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/page.tsx
================================================
import { redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { db } from "@/lib/db"
import { getCurrentUser } from "@/lib/session"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { ChatbotCreateButton } from "@/components/chatbot-create-button"
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "@/components/ui/card"
import { Icons } from "@/components/icons"
import { siteConfig } from "@/config/site"
import { MessagesOverview } from "@/components/message-overview"
import { Button } from "@/components/ui/button"
import { EmptyPlaceholder } from "@/components/empty-placeholder"
import { InquiryItem } from "@/components/inquiry-item"
import { ErrorShortItem } from "@/components/error-short-item"
import { constructMetadata } from "@/lib/construct-metadata"
export const metadata = constructMetadata()
export default async function DashboardPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const bots = await db.chatbot.count({
where: {
userId: user.id,
},
})
const crawlers = await db.crawler.count({
where: {
userId: user.id,
},
})
const files = await db.file.count({
where: {
userId: user.id,
},
})
const messageCountLast30Days = await db.message.count({
where: {
userId: user.id,
createdAt: {
gte: new Date(new Date().setDate(new Date().getDate() - 30))
}
}
})
// get message for each day for the last 7 days
const messages = await db.message.findMany({
where: {
userId: user.id,
createdAt: {
gte: new Date(new Date().setDate(new Date().getDate() - 30))
}
},
select: {
createdAt: true,
},
})
const data: any = [];
for (let i = 0; i < 30; i++) {
const date = new Date();
date.setDate(date.getDate() - i);
const formattedDate = date.toISOString().split('T')[0]; // Format date as 'YYYY-MM-DD'
data.push({ name: formattedDate, total: 0 });
}
// Count messages for each day
messages.forEach(message => {
const messageDate = message.createdAt.toISOString().split('T')[0];
const dataEntry = data.find(entry => entry.name === messageDate);
if (dataEntry) {
dataEntry.total++;
}
});
// Reverse the data array to start from the oldest date
data.reverse();
const chatbotIds = await db.chatbot.findMany({
where: {
userId: user.id,
},
select: {
id: true,
},
})
const userInquiries = await db.clientInquiries.findMany({
select: {
id: true,
chatbotId: true,
threadId: true,
email: true,
inquiry: true,
createdAt: true,
},
where: {
chatbotId: {
in: chatbotIds.map(chatbot => chatbot.id),
},
deletedAt: null,
},
orderBy: {
createdAt: 'desc',
},
take: 4,
})
const chatbotErrors = await db.chatbotErrors.findMany({
where: {
chatbotId: {
in: chatbotIds.map(chatbot => chatbot.id),
}
},
orderBy: {
createdAt: 'desc',
},
take: 4,
})
const chatbotNamesForIds = await db.chatbot.findMany({
where: {
userId: user.id,
},
select: {
id: true,
name: true,
}
})
return (
<DashboardShell>
<DashboardHeader heading="Dashboard" text="Welcome to Your Chatbot Dashboard">
<ChatbotCreateButton />
</DashboardHeader>
<div>
{bots === 0 &&
<div className="mb-4 bg-blue-100 border-l-4 border-blue-500 text-black p-4" role="info">
<p className="font-bold text-md">Welcome to {siteConfig.name} 🎉</p>
<p className="text-sm">You are probably new to this platform.</p>
<p className="text-sm">We recommend starting with our <a className="underline" href="/dashboard/onboarding">onboarding</a> for a step-by-step guide on how to create your first chatbot.</p>
<p className="text-sm">If you prefer you can also start with our <a target="_blank" className="underline" href="/guides/how-to-build-smart-chatbot-for-your-webiste">tutorial</a>.</p>
<br />
<a href="/dashboard/onboarding"><Button><p className="pr-2">Open Onboarding</p> <Icons.help className="h-4 w-4" /> </Button></a>
</div>
}
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">
Total Chatbots
</CardTitle>
<Icons.bot className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{bots}</div>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">
Total Crawlers
</CardTitle>
<Icons.post className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{crawlers}</div>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">
Total Files
</CardTitle>
<Icons.folder className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{files}</div>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">
Messages last 30 days
</CardTitle>
<Icons.message className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{messageCountLast30Days}</div>
</CardContent>
</Card>
</div>
</div>
<div className="grid gap-4 grid-cols-1 lg:grid-cols-2">
<Card>
<CardHeader>
<CardTitle>Messages per day</CardTitle>
</CardHeader>
<CardContent className="pl-2">
<MessagesOverview items={data} />
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Recent User Inquiries</CardTitle>
</CardHeader>
<CardContent>
{userInquiries.length ?
<div className="grid gap-2 w-full">
{
userInquiries.map((inquiry) => (
<InquiryItem key={inquiry.id} inquiry={inquiry} chatbotName={
chatbotNamesForIds.find(chatbot => chatbot.id === inquiry.chatbotId)?.name || ''
}></InquiryItem>
))
}
</div>
:
<div className="grid gap-10">
<EmptyPlaceholder className="border-0">
<EmptyPlaceholder.Icon name="help" />
<EmptyPlaceholder.Title>No User Inquiry</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
You don't have any new user inquiries. User Inquiries are disabled by default, you can enable them in your chatbot settings.
</EmptyPlaceholder.Description>
</EmptyPlaceholder>
</div>
}
</CardContent>
</Card>
</div>
<Card>
<CardHeader>
<CardTitle>Recent Chatbot Errors</CardTitle>
</CardHeader>
<CardContent>
{chatbotErrors.length ?
<div className="grid gap-2 w-full">
{
chatbotErrors.map((error) => (
<ErrorShortItem key={error.id} error={error} chatbotName={
chatbotNamesForIds.find(chatbot => chatbot.id === error.chatbotId)?.name || ''
}></ErrorShortItem>
))
}
</div>
:
<div className="grid gap-10">
<EmptyPlaceholder className="border-0">
<EmptyPlaceholder.Icon name="warning" />
<EmptyPlaceholder.Title>No Chatbot Error</EmptyPlaceholder.Title>
<EmptyPlaceholder.Description>
If you have any errors you will see a comprehensive breakdown of user-generated errors within your chatbot.
</EmptyPlaceholder.Description>
</EmptyPlaceholder>
</div>
}
</CardContent>
</Card>
</DashboardShell >
)
}
================================================
FILE: app/(dashboard)/dashboard/settings/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function DashboardSettingsLoading() {
return (
<DashboardShell>
<DashboardHeader
heading="Settings"
text="Manage Account and Website Settings."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/settings/page.tsx
================================================
import { redirect } from "next/navigation"
import { authOptions } from "@/lib/auth"
import { getCurrentUser } from "@/lib/session"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
import { UserNameForm } from "@/components/user-name-form"
import { OpenAIForm } from "@/components/openai-config-form"
import { siteConfig } from "@/config/site"
import { NotificationSettingsForm } from "@/components/notification-settings-form"
import { db } from "@/lib/db"
export const metadata = {
title: `${siteConfig.name} - Settings`,
description: "Manage Account and Website Settings.",
}
export default async function SettingsPage() {
const user = await getCurrentUser()
if (!user) {
redirect(authOptions?.pages?.signIn || "/login")
}
const userNotifications = await db.user.findFirst({
where: {
id: user.id,
},
select: {
inquiryEmailEnabled: true,
marketingEmailEnabled: true,
},
})
return (
<DashboardShell>
<DashboardHeader
heading="Settings"
text="Manage Account and Website Settings."
/>
<div className="grid gap-10">
<div className="grid gap-10">
<UserNameForm user={{ id: user.id, name: user.name || "" }} />
<OpenAIForm user={{ id: user.id }} />
<NotificationSettingsForm user={{ id: user.id }} marketingEmailEnabled={userNotifications?.marketingEmailEnabled!} inquiryNotificationEnabled={userNotifications?.inquiryEmailEnabled!} />
</div>
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/support/loading.tsx
================================================
import { CardSkeleton } from "@/components/card-skeleton"
import { DashboardHeader } from "@/components/header"
import { DashboardShell } from "@/components/shell"
export default function Loading() {
return (
<DashboardShell>
<DashboardHeader
heading="Support"
text="Welcome to Our Support Page."
/>
<div className="grid gap-10">
<CardSkeleton />
</div>
</DashboardShell>
)
}
================================================
FILE: app/(dashboard)/dashboard/support/page.tsx
================================================
import { DashboardHeader } from "@/components/header"
import { Icons } from "@/components/icons"
import { DashboardShell } from "@/components/shell"
import { buttonVariants } from "@/components/ui/button"
import { siteConfig } from "@/config/site"
import { cn } from "@/lib/utils"
import Link from "next/link"
export const metadata = {
title: `${siteConfig.name} - Support`,
}
export default async function SupportPage() {
return (
<DashboardShell>
<DashboardHeader heading="Support" text="Welcome to Our Support Page.">
<Link
href="/dashboard"
className={cn(
buttonVariants({ variant: "ghost" }),
"md:left-8 md:top-8"
)}
>
<>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
Back
</>
</Link>
</DashboardHeader>
<div >
<p className="text-lg font-semibold">How can we help you?</p>
<p className="text-muted-foreground">
First, before reaching out you can always try our chatbot. He knows a lot about our platform he might be able to help you.
<br />
If you still have issue with our app you can open a <a className="underline" href={siteConfig.links.github + '/issues'}>Github issue</a>, so we can help you to fix it and it will help us to improve our app.
</p>
<div className="min-w-[85%] min-h-[15rem] text-left items-left pt-6">
<iframe
src="/embed/clq6m06gc000114hm42s838g2/window?chatbox=false"
className="overflow-hidden border border-1 rounded-lg shadow-lg w-full h-[65vh]"
allowFullScreen allow="clipboard-read; clipboard-write"
></iframe>
</div>
</div>
</DashboardShell >
)
}
================================================
FILE: app/(docs)/docs/[[...slug]]/page.tsx
================================================
import { notFound } from "next/navigation"
import { allDocs } from "contentlayer/generated"
import { getTableOfContents } from "@/lib/toc"
import { Mdx } from "@/components/mdx-components"
import { DocsPageHeader } from "@/components/page-header"
import { DocsPager } from "@/components/pager"
import { DashboardTableOfContents } from "@/components/toc"
import "@/styles/mdx.css"
import { Metadata } from "next"
import { absoluteUrl } from "@/lib/utils"
interface DocPageProps {
params: {
slug: string[]
}
}
async function getDocFromParams(params: any) {
const slug = params.slug?.join("/") || ""
const doc = allDocs.find((doc: any) => doc.slugAsParams === slug)
if (!doc) {
null
}
return doc
}
export async function generateMetadata({
params,
}: DocPageProps): Promise<Metadata> {
const doc = await getDocFromParams(params)
if (!doc) {
return {}
}
const url = process.env.NEXT_PUBLIC_VERCEL_URL
const ogUrl = new URL(`${url}/api/og`)
ogUrl.searchParams.set("heading", doc.description ?? doc.title)
ogUrl.searchParams.set("type", "Documentation")
ogUrl.searchParams.set("mode", "dark")
return {
title: doc.title,
description: doc.description,
openGraph: {
title: doc.title,
description: doc.description,
type: "article",
url: absoluteUrl(doc.slug),
images: [
{
url: ogUrl.toString(),
width: 1200,
height: 630,
alt: doc.title,
},
],
},
twitter: {
card: "summary_large_image",
title: doc.title,
description: doc.description,
images: [ogUrl.toString()],
},
}
}
export async function generateStaticParams(): Promise<
DocPageProps["params"][]
> {
return allDocs.map((doc) => ({
slug: doc.slugAsParams.split("/"),
}))
}
export default async function DocPage({ params }: DocPageProps) {
const doc = await getDocFromParams(params)
if (!doc) {
notFound()
}
const toc = await getTableOfContents(doc.body.raw)
return (
<main className="relative py-6 lg:gap-10 lg:py-10 xl:grid xl:grid-cols-[1fr_300px]">
<div className="mx-auto w-full min-w-0">
<DocsPageHeader heading={doc.title} text={doc.description} />
<Mdx code={doc.body.code} />
<hr className="my-4 md:my-6" />
<DocsPager doc={doc} />
</div>
<div className="hidden text-sm xl:block">
<div className="sticky top-16 -mt-10 max-h-[calc(var(--vh)-4rem)] overflow-y-auto pt-10">
<DashboardTableOfContents toc={toc} />
</div>
</div>
</main>
)
}
================================================
FILE: app/(docs)/docs/layout.tsx
================================================
import { docsConfig } from "@/config/docs"
import { DocsSidebarNav } from "@/components/sidebar-nav"
interface DocsLayoutProps {
children: React.ReactNode
}
export default function DocsLayout({ children }: DocsLayoutProps) {
return (
<div className="flex-1 md:grid md:grid-cols-[220px_1fr] md:gap-6 lg:grid-cols-[240px_1fr] lg:gap-10">
<aside className="fixed top-14 z-30 hidden h-[calc(100vh-3.5rem)] w-full shrink-0 overflow-y-auto border-r py-6 pr-2 md:sticky md:block lg:py-10">
<DocsSidebarNav items={docsConfig.sidebarNav} />
</aside>
{children}
</div>
)
}
================================================
FILE: app/(docs)/guides/[...slug]/page.tsx
================================================
import Link from "next/link"
import { notFound } from "next/navigation"
import { allGuides } from "contentlayer/generated"
import { getTableOfContents } from "@/lib/toc"
import { Icons } from "@/components/icons"
import { Mdx } from "@/components/mdx-components"
import { DocsPageHeader } from "@/components/page-header"
import { DashboardTableOfContents } from "@/components/toc"
import "@/styles/mdx.css"
import { Metadata } from "next"
import { absoluteUrl, cn } from "@/lib/utils"
import { buttonVariants } from "@/components/ui/button"
interface GuidePageProps {
params: {
slug: string[]
}
}
async function getGuideFromParams(params: any) {
const slug = params?.slug?.join("/")
const guide = allGuides.find((guide) => guide.slugAsParams === slug)
if (!guide) {
null
}
return guide
}
export async function generateMetadata({
params,
}: GuidePageProps): Promise<Metadata> {
const guide = await getGuideFromParams(params)
if (!guide) {
return {}
}
const url = process.env.NEXT_PUBLIC_VERCEL_URL
const ogUrl = new URL(`${url}/api/og`)
ogUrl.searchParams.set("heading", guide.title)
ogUrl.searchParams.set("type", "Guide")
ogUrl.searchParams.set("mode", "dark")
return {
title: guide.title,
description: guide.description,
openGraph: {
title: guide.title,
description: guide.description,
type: "article",
url: absoluteUrl(guide.slug),
images: [
{
url: ogUrl.toString(),
width: 1200,
height: 630,
alt: guide.title,
},
],
},
twitter: {
card: "summary_large_image",
title: guide.title,
description: guide.description,
images: [ogUrl.toString()],
},
}
}
export async function generateStaticParams(): Promise<
GuidePageProps["params"][]
> {
return allGuides.map((guide) => ({
slug: guide.slugAsParams.split("/"),
}))
}
export default async function GuidePage({ params }: GuidePageProps) {
const guide = await getGuideFromParams(params)
if (!guide) {
notFound()
}
const toc = await getTableOfContents(guide.body.raw)
return (
<main className="relative py-6 lg:grid lg:grid-cols-[1fr_300px] lg:gap-10 lg:py-10 xl:gap-20">
<div>
<DocsPageHeader heading={guide.title} text={guide.description} />
<Mdx code={guide.body.code} />
<hr className="my-4" />
<div className="flex justify-center py-6 lg:py-10">
<Link
href="/guides"
className={cn(buttonVariants({ variant: "ghost" }))}
>
<Icons.chevronLeft className="mr-2 h-4 w-4" />
See all guides
</Link>
</div>
</div>
<div className="hidden text-sm lg:block">
<div className="sticky top-16 -mt-10 max-h-[calc(var(--vh)-4rem)] overflow-y-auto pt-10">
<DashboardTableOfContents toc={toc} />
</div>
</div>
</main>
)
}
================================================
FILE: app/(docs)/guides/layout.tsx
================================================
interface GuidesLayoutProps {
children: React.ReactNode
}
export default function GuidesLayout({ children }: GuidesLayoutProps) {
return <div className="mx-auto max-w-5xl">{children}</div>
}
================================================
FILE: app/(docs)/guides/page.tsx
================================================
import Link from "next/link"
import { allGuides } from "contentlayer/generated"
import { compareDesc } from "date-fns"
import { formatDate } from "@/lib/utils"
import { DocsPageHeader } from "@/components/page-header"
import { siteConfig } from "@/config/site"
export const metadata = {
title: "Guides",
description:
`This section includes for ${siteConfig.name} apps.`,
}
export default function GuidesPage() {
const guides = allGuides
.filter((guide) => guide.published)
.sort((a, b) => {
return compareDesc(new Date(a.date), new Date(b.date))
})
return (
<div className="py-6 lg:py-10">
<DocsPageHeader
heading="Guides"
text={`This section includes for ${siteConfig.name} apps.`}
/>
{guides?.length ? (
<div className="grid gap-4 md:grid-cols-2 md:gap-6">
{guides.map((guide) => (
<article
key={guide._id}
className="group relative rounded-lg border p-6 shadow-md transition-shadow hover:shadow-lg"
>
{guide.featured && (
<span className="absolute right-4 top-4 rounded-full px-3 py-1 text-xs font-medium">
Featured
</span>
)}
<div className="flex flex-col justify-between space-y-4">
<div className="space-y-2">
<h2 className="text-xl font-medium tracking-tight">
{guide.title}
</h2>
{guide.description && (
<p className="text-muted-foreground">{guide.description}</p>
)}
</div>
{guide.date && (
<p className="text-sm text-muted-foreground">
{formatDate(guide.date)}
</p>
)}
</div>
<Link href={guide.slug} className="absolute inset-0">
<span className="sr-only">View</span>
</Link>
</article>
))}
</div>
) : (
<p>No guides published.</p>
)}
</div>
)
}
================================================
FILE: app/(docs)/layout.tsx
================================================
import Link from "next/link"
import { docsConfig } from "@/config/docs"
import { siteConfig } from "@/config/site"
import { Icons } from "@/components/icons"
import { MainNav } from "@/components/main-nav"
import { DocsSidebarNav } from "@/components/sidebar-nav"
import { SiteFooter } from "@/components/site-footer"
interface DocsLayoutProps {
children: React.ReactNode
}
export default function DocsLayout({ children }: DocsLayoutProps) {
return (
<div className="flex min-h-screen flex-col">
<header className="sticky top-0 z-40 w-full border-b bg-background">
<div className="container flex h-16 items-center space-x-4 sm:justify-between sm:space-x-0">
<MainNav items={docsConfig.mainNav}>
<DocsSidebarNav items={docsConfig.sidebarNav} />
</MainNav>
<div className="flex flex-1 items-center space-x-4 sm:justify-end">
<nav className="flex space-x-4">
<Link
href={siteConfig.links.github}
target="_blank"
rel="noreferrer"
>
<Icons.gitHub className="h-7 w-7" />
<span className="sr-only">GitHub</span>
</Link>
</nav>
</div>
</div>
</header>
<div className="container flex-1">{children}</div>
<SiteFooter className="border-t" />
</div>
)
}
================================================
FILE: app/(embed)/embed/[id]/button/page.tsx
================================================
import ChatbotButton from '@/components/chatbot-button';
import { db } from '@/lib/db';
import { notFound } from 'next/navigation';
export interface ChatComponentProps {
params: { id: string };
}
export default async function Button({ params }: ChatComponentProps) {
/*
<iframe src="http://localhost:3000/embed/clq5598dc000hrrwh5zvt6s1m/window"
style="overflow: hidden; height: 80vh; border: 0 none; width: 480px; bottom: -30px;" allowfullscreen
></iframe>
*/
const chatbot = await db.chatbot.findUnique({
where: {
id: params.id
}
});
if (!chatbot) {
return notFound();
}
return (
<ChatbotButton textColor={chatbot?.bubbleTextColor} backgroundColor={chatbot?.bubbleColor} />
)
}
================================================
FILE: app/(embed)/embed/[id]/window/page.tsx
================================================
import ChatWindow from '@/app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/chatWindow/page';
export interface ChatComponentProps {
params: { id: string };
searchParams: URLSearchParams;
}
export default function Chat({ params, searchParams }: ChatComponentProps) {
/*
<iframe src="http://localhost:3000/embed/clq5598dc000hrrwh5zvt6s1m/window"
style="overflow: hidden; height: 80vh; border: 0 none; width: 480px; bottom: -30px;" allowfullscreen
allowtransparency></iframe>
*/
console.log(params, searchParams);
return <ChatWindow params={{ chatbotId: params.id, withExitX: searchParams.withExitX === 'true' ? true : false, clientSidePrompt: searchParams.clientSidePrompt || "", defaultMessage: searchParams.defaultMessage || "" }} />;
}
================================================
FILE: app/(embed)/layout.tsx
================================================
interface AuthLayoutProps {
children: React.ReactNode
}
export default function AuthLayout({ children }: AuthLayoutProps) {
return children
}
================================================
FILE: app/(marketing)/changelog/page.tsx
================================================
import { siteConfig } from '@/config/site'
import { twMerge } from 'tailwind-merge'
export default function ChangelogPage() {
return (
<div className="w-full flex flex-col items-center">
<div className="w-full text-center p-8 pb-24">
<h1 className="w-full text-lg">Changelog</h1>
<p className="w-full text-4xl text-neutral-500 mt-3">
What's new in {siteConfig.name}?
</p>
</div>
<div className="p-4 max-w-screen-sm">
<Release
isFirst={true}
version="0.3.1"
date="2024-08-06"
improvements={[
{
title: 'Fix issue when downloading file generated by assistant',
description: 'Fix issue when downloading file generated by assistant. Now the file will be downloaded correctly.',
}
]}
/>
<Release
version="0.3.0"
date="2024-08-05"
improvements={[
{
title: 'Improve UX for the chatbot by using our own new SDK',
description: 'We now use our own SDK to improve the chatbot experience. This will allow us to provide better support and more features in the future.',
}
]}
/>
<Release
version="0.2.27"
date="2024-07-29"
new={[
{
title: 'Download transcripts',
description: 'We now support downloading the chat transcripts, users can download the chat to export it.',
image: new URL(
'/public/download_feature.png',
import.meta.url,
).toString()
},
]}
bugs={[
{
title: 'Fix issue when the assistant reply was leaving empty space on the right',
description: 'Now the assistant reply will not leave empty space on the right. The chatbox will be resized to fit the assistant reply.',
}
]}
/>
<Release
version="0.2.26"
date="2024-07-28"
bugs={[
{
title: 'Fix issue when assistant was searching for files but could not find them',
description: 'Fix issue when assistant was searching for files but could not find them. Now tools are only enabled when needed',
}
]}
/>
<Release
version="0.2.25"
date="2024-07-24"
new={[
{
title: 'New Chatbot SDK released',
description: 'We now have a new chatbot SDK to help people build chatbots. The SDK is open source and can be used to build chatbots for any platform. Find out more about the SDK here https://sdk.openassistantgpt.io',
},
]}
bugs={[
{
title: 'Fix issue when updating crawler number of pages to crawl',
description: 'Missing validation was preventing the user from updating the number of pages to crawl. This issue has been fixed and you can now update the number of pages to crawl.',
}
]}
/>
<Release
version="0.2.24"
date="2024-07-18"
new={[
{
title: 'We now support gpt-4o-mini',
description: 'We support the latest model from OpenAI, gpt-4o-mini. This model is faster and cheaper.',
},
]}
/>
<Release
version="0.2.23"
date="2024-07-15"
improvements={[
{
title: 'Add option to configure max number of pages to crawl',
description: 'This feature will allow you to configure the maximum number of pages to crawl. This will prevent the crawler from crawling too many pages and using too much resources.',
},
]}
/>
<Release
version="0.2.22"
date="2024-07-12"
improvements={[
{
title: 'Exports now contain user IP',
description: 'Exports now contain the user IP. This will allow you to see the IP of the user who sent the message in the export.',
},
]}
bugs={[
{
title: 'Chat history was displaying thread name after doing a click in the ui',
description: 'Issue was fixed and now the chat history is displaying the thread name correctly.',
},
]}
/>
<Release
version="0.2.21"
date="2024-07-11"
new={[
{
title: 'Chat History',
description: 'You can now enable the chat history in customization settings. This will allow the user to see his previous messages in the chatbot. The chat history will be displayed in the chatbot window.',
image: new URL(
'/public/chat_history.png',
import.meta.url,
).toString()
},
]}
/>
<Release
version="0.2.20"
date="2024-07-08"
new={[
{
title: 'Network Security',
description: 'You can now make chatbot fully private, only accessible by your IP. This will prevent unauthorized access to your chatbot. You can also ban specific IPs from accessing the chatbot.',
image: new URL(
'/public/network_security.png',
import.meta.url,
).toString()
},
]}
/>
<Release
version="0.2.19"
date="2024-06-28"
new={[
{
title: 'Multiple line text input instead of single line',
description: 'Now the text input in the chatbot is a multiple line input. This will allow you to write longer messages in the chatbot. The input will grow as you write more text.',
},
{
title: 'Input style',
description: 'You can now choose default input style or max width input style in the chatbot. This will allow you to choose the style of the input in the chatbot.',
image: new URL(
'/public/new_input_style.png',
import.meta.url,
).toString()
},
]}
/>
<Release
version="0.2.18"
date="2024-06-26"
new={[
{
title: 'User message attachments',
description: 'We now use message instead of updating the thread. This will allow you to attach files to a message. The chatbot will then analyse the file and provide a response. You\'ll get better result',
},
]}
/>
<Release
version="0.2.17"
date="2024-06-23"
new={[
{
title: 'Default messages',
description: 'You can now set default messages for your chatbot. This will allow you to set a message that will be displayed when the chatbot is loaded. You can set this message in the chatbot IFRAME url.',
image: new URL(
'/public/default_message.png',
import.meta.url,
).toString()
},
]}
/>
<Release
version="0.2.16"
date="2024-06-21"
new={[
{
title: 'Create new modal for the OpenAI configuration',
description: 'Now when you need to configure OpenAI, a new modal will be displayed. This will allow you to configure OpenAI without leaving the page.',
image: new URL(
'/public/new_openai_modal.png',
import.meta.url,
).toString()
},
]}
/>
<Release
version="0.2.15"
date="2024-06-19"
improvements={[
{
title: 'Chatbox UX Improvements',
description: 'Now the text size is smaller in the chatbox. This will allow you to see more messages in the chatbox. The header is also sticky when you scroll down. This will allow you to always see the chatbox header.',
image: new URL(
'/public/file_attachements_v2.png',
import.meta.url,
).toString()
},
]}
bugs={[
{
title: 'Fix issue in mobile when link was too long',
description: 'We add a new CSS rule to prevent the link from overflowing the chatbox. Now the link will be displayed on multiple lines if it is too long.'
}
]}
/>
<Release
version="0.2.14"
date="2024-06-16"
improvements={[
{
title: 'Hangle Right to Left languages',
description: 'We now support right to left languages in the chatbot. This will allow you to use languages like Arabic, Hebrew and more.',
},
]}
/>
<Release
version="0.2.13"
date="2024-06-14"
improvements={[
{
title: 'Improve how file attachments works',
description: 'Better UX when uploading files in the chatbot. We now display the file name and we can also remove the file from the chat.',
image: new URL(
'/public/file_attachements_v2.png',
import.meta.url,
).toString()
},
]}
/>
<Release
version="0.2.12"
date="2024-06-09"
improvements={[
{
title: 'Add validation for the max_completion_tokens and max_prompt_tokens',
description: 'In the advanced settings of your chatbot, you can now configure the max_completion_tokens and max_prompt_tokens. We added validation to prevent you from entering a value lower than 256. This will prevent the chatbot from returning an error when the value is too low.',
},
]}
/>
<Release
version="0.2.11"
date="2024-06-09"
new={[
{
title: 'Messages Export',
description: 'This feature is created for exporting messages from your chatbot. This feature will generate a JSON file with all the messages received by a chatbot.',
image: new URL(
'/public/exports.png',
import.meta.url,
).toString()
},
]}
/>
<Release
version="0.2.10"
date="2024-06-07"
new={[
{
title: 'Copy to clipboard feature',
description: 'Now you can copy to your clipboard the chatbot response by clicking on the copy icon in the chat.',
},
]}
improvements={[
{
title: 'We added Z index on the chatbot HTML code',
description: 'This will prevent the chatbot from being hidden by other elements on the page.',
},
]}
/>
<Release
version="0.2.9"
date="2024-06-03"
new={[
{
title: 'Configure max_completion_tokens and max_prompt_tokens',
description: 'Now in the advanced settings of your chatbot, you can configure the max_completion_tokens and max_prompt_tokens. This will allow you to control the number of tokens used in the completion and prompt.',
},
]}
bugs={[
{
title: 'Fix issue while customizing the chatbot could create infinite loading',
description: 'Now we can update the chatbot customization without having an infinite loading issue.',
},
]}
/>
<Release
version="0.2.8"
date="2024-06-02"
new={[
{
title: 'You can now unsubscribe from marketing emails',
description: 'New feature to unsubscribe from marketing emails. You can now manage your communication preferences in the settings page.',
},
]}
/>
<Release
version="0.2.7"
date="2024-06-01"
new={[
{
title: 'Free trials!',
description: 'You can now try our basic and pro plan for free for 7 days. It will give you access to all the features of the plan.',
},
{
title: 'Enable auto scroll in chatbox',
description: 'We re-enabled the auto scroll in the chatbox. This will make the chatbox scroll to the bottom when a new message is received.',
}
]}
/>
<Release
version="0.2.6"
date="2024-05-29"
new={[
{
title: 'Chat file attachments',
description: 'User in the chat can now upload files, images and more to the chatbot. The chatbot will then analyse the file and provide a response. It uses the "code_execution" function in OpenAI',
image: new URL(
'/public/file_attachements.png',
import.meta.url,
).toString()
},
{
title: 'Display images generated by Assistant in the chat',
description: 'When the assistant generates an image, it will now be displayed in the chat.',
image: new URL(
'/public/pie_chart.png',
import.meta.url,
).toString()
}
]}
improvements={[
{
title: 'Chatbotjs script now migrates you to the latest version',
description: 'You will automaticly get migrated to our iframe version of the chatbot when you use the chatbotjs script.',
},
{
title: 'Removed 3$ pricing plans',
description: 'For a better futur of the project we are removing the 3$ pricing plans. With Stripe fees, taxes and server costs we can not sustain this pricing plan. Users who already have this pricing plan will keep it and still pay 3$.',
}
]}
/>
<Release
version="0.2.5"
date="2024-05-25"
new={[
{
title: 'Change Chatbot Logo image in chatbox',
description: 'You can now update Chatbot Logo in the Chatbox, this will help you to personalize your chatbot even more.',
}
]}
/>
<Release
version="0.2.4"
date="2024-05-24"
new={[
{
title: 'Improve chatbot bubbles',
description: 'Improve design of chatbot bubbles on user\'s reply.',
image: new URL(
'/public/new_bubbles.png',
import.meta.url,
).toString()
}
]}
improvements={[
{
title: 'Improve UX for chatbot',
description: 'Remove auto focus on input after message.',
},
]}
/>
<Release
version="0.2.3"
date="2024-05-17"
new={[
{
title: 'New Client Side Prompt in Chatbox IFrame',
description:
"It is now possible to use client side prompt on your chatbot for more personalization depending on the context. Heres's how you can use it '&clientSidePrompt=You are currently talking to {User X} help him to understand the book {Book Name X}.' You can find more information in our documentation.",
},
]}
/>
<Release
version="0.2.2"
date="2024-05-10"
new={[
{
title: 'New Chatbox UI in IFrame',
description:
"You can now embed the chatbox in your website using an IFrame. This will prevent CSS conflicts and provide a smoother user experience.",
image: new URL(
'/public/chatbox-iframe.png',
import.meta.url,
).toString(),
},
]}
/>
<Release
version="0.2.1"
date="2024-05-10"
new={[
{
title: 'Display LaTex Math function in the chat',
description:
"When you ask your chatbot to output math function and starting them with $$ it will display math function in LaTex style. Here's what your prompt should look like to display LaTex: 'Display a math function in latex and the function text must always start with $$'",
image: new URL(
'/public/chatmessage-latex.png',
import.meta.url,
).toString(),
},
]}
/>
<Release
version="0.2.0"
date="2024-05-10"
new={[
{
title: 'New Chatbot Window UI',
description:
"We improved UI to make it look better. We also now have an integration via IFrame which means no more CSS conflicts and a smoother user experience.",
image: new URL(
'/public/new_chatbot_ui.jpg',
import.meta.url,
).toString(),
},
]}
/>
<Release
version="0.1.2"
date="2024-05-1"
new={[
{
title: 'Import Assistant from OpenAI',
description:
"You can now import an assistant that you've trained on OpenAI in our app without having to recreate everything.",
image: new URL(
'/public/import_assistant.png',
import.meta.url,
).toString(),
},
]}
/>
<Release
version="0.1.1"
date="2024-04-28"
new={[
{
title: 'Email notifications',
description:
"We now have email notifications! You'll receive an email when you receive a new user inquiry.",
image: new URL(
'/public/email_test_image.png',
import.meta.url,
).toString(),
},
]}
improvements={[
{
title: 'Improve list of valid file extensions',
description:
'Update the list of valid file extensions to match OpenAI list.',
},
]}
/>
<Release
version="0.1.0"
date="2024-04-15"
new={[
{
title: 'New dashboard tile',
description:
'You can now see your recent user inquiry and chatbot errors in the main dashboard.',
image: new URL(
'/public/dashboard_improvement.png',
import.meta.url,
).toString(),
},
{
title: 'Chatbot Error Tracking',
description:
'We now track chatbot errors and display them in the dashboard. We this feature you can easily see what went wrong and fix it.',
},
]}
/>
</div>
</div>
)
}
function Release(props: { isFirst?: boolean; version: string; date: string; new?: any[]; improvements?: any[]; bugs?: any[] }) {
return (
<div
className={twMerge(
'flex flex-col gap-4 border-t pt-4 mt-8',
props.isFirst && 'border-t-0 mt-0',
)}
>
<div>
<div className="font-bold text-3xl">
Version <span className="">{props.version}</span>
</div>
<div className="text-neutral-500 font-semibold">{props.date}</div>
</div>
{props.new && (
<div className="grid grid-cols-1 gap-3">
<span className="font-semibold text-xs uppercase bg-emerald-500 border border-emerald-600 text-white px-1.5 py-0.5 rounded w-fit">
New
</span>
<div className="flex flex-col gap-2">
{props.new?.map((item, index) => (
<div className="mb-2" key={`new-${index}`}>
<div className="font-bold pb-1 text-base">🎉 {item.title}</div>
<div className="text-neutral-500 text-sm pb-3">
{item.description}
</div>
{item.image && (
<img
src={item.image}
className="w-2/3 rounded shadow border mb-2"
/>
)}
</div>
))}
</div>
</div>
)}
{props.improvements && (
<div className="grid grid-cols-1 gap-3">
<span className="font-semibold text-xs uppercase bg-blue-500 border border-blue-600 text-white px-1.5 py-0.5 rounded w-fit">
Improvements
</span>
<div className="flex flex-col gap-2">
{props.improvements?.map((item, index) => (
<div className="mb-2" key={`improvements-${index}`}>
<div className="font-bold pb-1 text-base">🚀 {item.title}</div>
<div className="text-neutral-500 text-sm pb-3">
{item.description}
</div>
{item.image && (
<img
src={item.image}
className="w-2/3 rounded shadow border mb-2"
/>
)}
</div>
))}
</div>
</div>
)}
{props.bugs && (
<div className="grid grid-cols-1 gap-3">
<span className="font-semibold text-xs uppercase bg-rose-500 border border-rose-600 text-white px-1.5 py-0.5 rounded w-fit">
Bugs
</span>
<div className="flex flex-col gap-2">
{props.bugs?.map((item, index) => (
<div className="mb-2" key={`bugs-${index}`}>
<div className="font-bold pb-1 text-base">🐛 {item.title}</div>
<div className="text-neutral-500 text-sm pb-3">
{item.description}
</div>
{item.image && (
<img
src={item.image}
className="w-2/3 rounded shadow border mb-2"
/>
)}
</div>
))}
</div>
</div>
)}
</div>
)
}
================================================
FILE: app/(marketing)/layout.tsx
================================================
'use client'
import Link from "next/link"
import { marketingConfig } from "@/config/marketing"
import { cn } from "@/lib/utils"
import { buttonVariants } from "@/components/ui/button"
import { MainNav } from "@/components/main-nav"
import { SiteFooter } from "@/components/site-footer"
import { Background } from "@/components/background"
import { useEffect, useState } from "react"
import { SDKBanner } from "@/components/sdk-banner"
interface MarketingLayoutProps {
children: React.ReactNode
}
export default function MarketingLayout({
children,
}: MarketingLayoutProps) {
const [isHeaderTransparent, setIsHeaderTransparent] = useState(true);
useEffect(() => {
const handleScroll = () => {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
setIsHeaderTransparent(scrollTop === 0);
};
window.addEventListener("scroll", handleScroll);
return () => {
window.removeEventListener("scroll", handleScroll);
};
}, []);
return (
<div className="flex min-h-screen flex-col">
<Background />
<header
className={`z-40 ${isHeaderTransparent ? "bg-transparent" : "bg-white/75 backdrop-blur-lg border-b"
} sticky inset-x-0 top-0 w-full transition-all duration-1000`}
>
<SDKBanner />
<div className="container flex h-20 items-center justify-between py-6 ">
<MainNav items={marketingConfig.mainNav} />
<nav>
<Link
href="/login"
className={cn(
buttonVariants({ variant: "secondary", size: "sm" }),
"px-4 border shadow-md"
)}
>
Login
</Link>
</nav>
</div>
</header>
<main className="flex-1 z-10">
{children}
</main>
<SiteFooter className="z-40" simpleFooter={false} />
</div>
);
}
================================================
FILE: app/(marketing)/page.tsx
================================================
import { GithubCard } from "@/components/github-card";
import { buttonVariants } from "@/components/ui/button";
import { cn } from "@/lib/utils";
import Link from "next/link";
import Image from "next/image";
import { siteConfig } from "@/config/site";
import { Icons } from "@/components/icons";
import { FAQ } from '@/components/faq';
import { freePlan, basicPlan, proPlan } from "@/config/subscriptions";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
export default function IndexPage() {
return (
<>
<section data-aos="fade-up" className="space-y-6 pb-8 pt-6 md:pb-12 md:pt-10 py-12 md:py-24 lg:py-32">
<div className="container flex max-w-[64rem] flex-col items-center gap-4 text-center">
<Link
href={siteConfig.links.twitter}
className="rounded-2xl border shadow-md bg-muted px-4 py-1.5 text-sm font-medium"
target="_blank"
>
Find us on 𝕏
</Link>
<h1 className="font-heading text-3xl sm:text-5xl md:text-6xl lg:text-7xl">
Build your own chatbot with OpenAI Assistant
</h1>
<p className="max-w-[42rem] leading-normal text-muted-foreground sm:text-xl sm:leading-8">
An open source platform for building chatbot with the Assistant API. We offer seamless integration for effortlessly incorporating a chatbot into your website.
</p>
<div className="space-x-4 space-y-4">
<Link href="/login" className={cn(buttonVariants({ size: "lg" }))}>
<Icons.bot className="h-4 w-4 mr-2"></Icons.bot>
Get Started for Free
</Link>
<Link
href={siteConfig.links.github}
target="_blank"
rel="noreferrer"
className={cn(buttonVariants({ variant: "outline", size: "lg" }), 'bg-white')}
>
<Icons.gitHub className="h-4 w-4 mr-2"></Icons.gitHub> GitHub
</Link>
</div>
<Image data-aos="zoom-in" priority={false} className="mt-10 border shadow-lg" src="/dashboard.png" width={810} height={540} alt="Dashboard" />
</div>
</section>
<section data-aos="fade-up" id="chat" className="container py-12 md:py-24 lg:py-32">
<div className="mx-auto flex max-w-[58rem] flex-col items-center justify-center gap-4 text-center">
<h2 className="font-heading text-3xl leading-[1.1] sm:text-3xl md:text-6xl">
Test our chatbot assistant
</h2>
<p className="max-w-[85%] leading-normal text-muted-foreground sm:text-lg sm:leading-7">
Ask any question about OpenAssistantGPT to our chatbot powered by OpenAI Assistant API and see how it responds. You can also try the chatbot buttom right of the window.
</p>
<div className="min-w-[85%] min-h-[15rem] text-left items-left pt-6">
<iframe
src="/embed/clq6m06gc000114hm42s838g2/window?chatbox=false&defaultMessage=How%20many%20chatbot%20can%20I%20create%20for%20free?"
className="overflow-hidden border border-1 rounded-lg shadow-lg w-full h-[65vh]"
allowFullScreen allow="clipboard-read; clipboard-write"
></iframe>
</div>
</div>
</section>
<section data-aos="fade-up" id="features" className="container space-y-6 py-12 md:py-24 lg:py-32">
<div className="mx-auto flex max-w-[58rem] flex-col items-center space-y-4 text-center">
<h2 className="font-heading text-3xl leading-[1.1] sm:text-3xl md:text-6xl">
Features
</h2>
<p className="max-w-[85%] leading-normal text-muted-foreground sm:text-lg sm:leading-7">
Build your own chatbot with OpenAI's assistant. Give us the URL to crawl and we finish the job.
</p>
</div>
<div className="mx-auto grid justify-center gap-4 sm:grid-cols-2 md:max-w-[64rem] md:grid-cols-3 mt-6">
<div className="relative overflow-hidden rounded-lg border bg-background p-2">
<div className="flex h-[180px] flex-col justify-between rounded-md p-6">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" preserveAspectRatio="xMidYMid" viewBox="0 0 256 260"><path d="M239.184 106.203a64.716 64.716 0 0 0-5.576-53.103C219.452 28.459 191 15.784 163.213 21.74A65.586 65.586 0 0 0 52.096 45.22a64.716 64.716 0 0 0-43.23 31.36c-14.31 24.602-11.061 55.634 8.033 76.74a64.665 64.665 0 0 0 5.525 53.102c14.174 24.65 42.644 37.324 70.446 31.36a64.72 64.72 0 0 0 48.754 21.744c28.481.025 53.714-18.361 62.414-45.481a64.767 64.767 0 0 0 43.229-31.36c14.137-24.558 10.875-55.423-8.083-76.483Zm-97.56 136.338a48.397 48.397 0 0 1-31.105-11.255l1.535-.87 51.67-29.825a8.595 8.595 0 0 0 4.247-7.367v-72.85l21.845 12.636c.218.111.37.32.409.563v60.367c-.056 26.818-21.783 48.545-48.601 48.601Zm-104.466-44.61a48.345 48.345 0 0 1-5.781-32.589l1.534.921 51.722 29.826a8.339 8.339 0 0 0 8.441 0l63.181-36.425v25.221a.87.87 0 0 1-.358.665l-52.335 30.184c-23.257 13.398-52.97 5.431-66.404-17.803ZM23.549 85.38a48.499 48.499 0 0 1 25.58-21.333v61.39a8.288 8.288 0 0 0 4.195 7.316l62.874 36.272-21.845 12.636a.819.819 0 0 1-.767 0L41.353 151.53c-23.211-13.454-31.171-43.144-17.804-66.405v.256Zm179.466 41.695-63.08-36.63L161.73 77.86a.819.819 0 0 1 .768 0l52.233 30.184a48.6 48.6 0 0 1-7.316 87.635v-61.391a8.544 8.544 0 0 0-4.4-7.213Zm21.742-32.69-1.535-.922-51.619-30.081a8.39 8.39 0 0 0-8.492 0L99.98 99.808V74.587a.716.716 0 0 1 .307-.665l52.233-30.133a48.652 48.652 0 0 1 72.236 50.391v.205ZM88.061 139.097l-21.845-12.585a.87.87 0 0 1-.41-.614V65.685a48.652 48.652 0 0 1 79.757-37.346l-1.535.87-51.67 29.825a8.595 8.595 0 0 0-4.246 7.367l-.051 72.697Zm11.868-25.58 28.138-16.217 28.188 16.218v32.434l-28.086 16.218-28.188-16.218-.052-32.434Z" /></svg>
<div className="space-y-2">
<h3 className="font-bold">OpenAI Assistants</h3>
<p className="text-sm">
We use OpenAI Assistant to power our chatbots. You can use GPT-4, GTP-3.5 and GPT-4o
</p>
</div>
</div>
</div>
<div className="relative overflow-hidden rounded-lg border bg-background p-2">
<div className="flex h-[180px] flex-col justify-between rounded-md p-6">
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" viewBox="0 0 190.5 190.5"><path fill="#fff" d="M95.252 142.873c26.304 0 47.627-21.324 47.627-47.628s-21.323-47.628-47.627-47.628-47.627 21.324-47.627 47.628 21.323 47.628 47.627 47.628z" /><path fill="#229342" d="m54.005 119.07-41.24-71.43a95.227 95.227 0 0 0-.
gitextract_72r5kauc/
├── .eslintrc.json
├── .github/
│ └── ISSUE_TEMPLATE/
│ ├── bug_report.md
│ └── feature_request.md
├── .gitignore
├── .vscode/
│ └── settings.json
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── app/
│ ├── (auth)/
│ │ ├── layout.tsx
│ │ └── login/
│ │ └── page.tsx
│ ├── (dashboard)/
│ │ └── dashboard/
│ │ ├── billing/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── chatbots/
│ │ │ ├── [chatbotId]/
│ │ │ │ ├── chat/
│ │ │ │ │ ├── chatWindow/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── embed/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── errors/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── inquiries/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ ├── not-found.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── crawlers/
│ │ │ ├── [crawlerId]/
│ │ │ │ ├── crawl/
│ │ │ │ │ ├── loading.tsx
│ │ │ │ │ ├── not-found.tsx
│ │ │ │ │ └── page.tsx
│ │ │ │ ├── loading.tsx
│ │ │ │ ├── not-found.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── exports/
│ │ │ └── page.tsx
│ │ ├── files/
│ │ │ ├── loading.tsx
│ │ │ ├── page.tsx
│ │ │ └── upload/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ ├── loading.tsx
│ │ ├── new/
│ │ │ ├── chatbot/
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── crawler/
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── export/
│ │ │ │ ├── loading.tsx
│ │ │ │ └── page.tsx
│ │ │ └── importChatbot/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── onboarding/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ ├── page.tsx
│ │ ├── settings/
│ │ │ ├── loading.tsx
│ │ │ └── page.tsx
│ │ └── support/
│ │ ├── loading.tsx
│ │ └── page.tsx
│ ├── (docs)/
│ │ ├── docs/
│ │ │ ├── [[...slug]]/
│ │ │ │ └── page.tsx
│ │ │ └── layout.tsx
│ │ ├── guides/
│ │ │ ├── [...slug]/
│ │ │ │ └── page.tsx
│ │ │ ├── layout.tsx
│ │ │ └── page.tsx
│ │ └── layout.tsx
│ ├── (embed)/
│ │ ├── embed/
│ │ │ └── [id]/
│ │ │ ├── button/
│ │ │ │ └── page.tsx
│ │ │ └── window/
│ │ │ └── page.tsx
│ │ └── layout.tsx
│ ├── (marketing)/
│ │ ├── changelog/
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── (welcome)/
│ │ ├── layout.tsx
│ │ └── welcome/
│ │ └── page.tsx
│ ├── api/
│ │ ├── auth/
│ │ │ └── [...nextauth]/
│ │ │ └── route.ts
│ │ ├── chatbots/
│ │ │ ├── [chatbotId]/
│ │ │ │ ├── chat/
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── [fileId]/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ └── route.ts
│ │ │ │ ├── config/
│ │ │ │ │ ├── advanced/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── branding/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── customization/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── fileAttachement/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── inquiry/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ ├── route.ts
│ │ │ │ │ └── security/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── errors/
│ │ │ │ │ └── [errorId]/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── imported/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── inquiries/
│ │ │ │ │ ├── [inquiryId]/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ └── route.ts
│ │ │ │ └── route.ts
│ │ │ ├── import/
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── crawlers/
│ │ │ ├── [crawlerId]/
│ │ │ │ ├── crawling/
│ │ │ │ │ └── route.ts
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── exports/
│ │ │ ├── [exportId]/
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── files/
│ │ │ ├── [fileId]/
│ │ │ │ └── route.ts
│ │ │ └── route.ts
│ │ ├── models/
│ │ │ └── route.ts
│ │ ├── og/
│ │ │ └── route.tsx
│ │ ├── route.ts
│ │ ├── session/
│ │ │ └── route.ts
│ │ ├── upload/
│ │ │ └── route.ts
│ │ ├── users/
│ │ │ ├── [userId]/
│ │ │ │ ├── notifications/
│ │ │ │ │ └── route.ts
│ │ │ │ ├── openai/
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── route.ts
│ │ │ │ │ └── route.ts
│ │ │ │ └── route.ts
│ │ │ └── stripe/
│ │ │ └── route.ts
│ │ └── webhooks/
│ │ └── stripe/
│ │ └── route.ts
│ ├── global-error.jsx
│ └── layout.tsx
├── components/
│ ├── aos-init.tsx
│ ├── auth-status.tsx
│ ├── background.tsx
│ ├── billing-form.tsx
│ ├── button-scroll-to-bottom.tsx
│ ├── callout.tsx
│ ├── card-skeleton.tsx
│ ├── chat-export-items.tsx
│ ├── chat-footer-text.tsx
│ ├── chat-history.tsx
│ ├── chat-message-actions.tsx
│ ├── chat-message.tsx
│ ├── chat-sdk.tsx
│ ├── chat.module.css
│ ├── chat.tsx
│ ├── chatbot-advanced-settings.tsx
│ ├── chatbot-branding-pro-settings.tsx
│ ├── chatbot-button.tsx
│ ├── chatbot-create-button.tsx
│ ├── chatbot-file-attachement-pro-settings.tsx
│ ├── chatbot-form.tsx
│ ├── chatbot-item.tsx
│ ├── chatbot-operations.tsx
│ ├── chatbot-security-settings.tsx
│ ├── chatbot.tsx
│ ├── crawler-create-button.tsx
│ ├── crawler-form.tsx
│ ├── crawler-item.tsx
│ ├── crawler-operations.tsx
│ ├── customization-settings.tsx
│ ├── empty-placeholder.tsx
│ ├── error-items.tsx
│ ├── error-operations.tsx
│ ├── error-short-item.tsx
│ ├── export-messages-button.tsx
│ ├── external-link.tsx
│ ├── faq.tsx
│ ├── file-items.tsx
│ ├── file-operations.tsx
│ ├── file-upload-button.tsx
│ ├── github-card.tsx
│ ├── github-login-form.tsx
│ ├── google-login-form.tsx
│ ├── gradient-picker.tsx
│ ├── header.tsx
│ ├── icons.tsx
│ ├── imported-chatbot-form.tsx
│ ├── inquiries.tsx
│ ├── inquiry-display.tsx
│ ├── inquiry-extension.tsx
│ ├── inquiry-item.tsx
│ ├── inquiry-list.tsx
│ ├── inquiry-settings.tsx
│ ├── loading-dots.module.css
│ ├── loading-dots.tsx
│ ├── main-nav.tsx
│ ├── markdown.tsx
│ ├── mdx-card.tsx
│ ├── mdx-components.tsx
│ ├── message-overview.tsx
│ ├── messages-export-operation.tsx
│ ├── mobile-nav.tsx
│ ├── move-to-crawlers-button.tsx
│ ├── nav.tsx
│ ├── new-chatbot-form.tsx
│ ├── new-crawler-form.tsx
│ ├── new-import-chatbot-form.tsx
│ ├── new-message-export.tsx
│ ├── next-auth-provider.tsx
│ ├── notification-settings-form.tsx
│ ├── openai-config-form.tsx
│ ├── page-header.tsx
│ ├── pager.tsx
│ ├── sdk-banner.tsx
│ ├── shell.tsx
│ ├── sidebar-nav.tsx
│ ├── site-footer.tsx
│ ├── start-crawling-button.tsx
│ ├── theme-provider.tsx
│ ├── toc.tsx
│ ├── ui/
│ │ ├── accordion.tsx
│ │ ├── alert-dialog.tsx
│ │ ├── avatar.tsx
│ │ ├── badge.tsx
│ │ ├── button.tsx
│ │ ├── calendar.tsx
│ │ ├── card.tsx
│ │ ├── checkbox.tsx
│ │ ├── codeblock.tsx
│ │ ├── dialog.tsx
│ │ ├── dropdown-menu.tsx
│ │ ├── form.tsx
│ │ ├── input.tsx
│ │ ├── label.tsx
│ │ ├── popover.tsx
│ │ ├── radio-group.tsx
│ │ ├── resizable.tsx
│ │ ├── scroll-area.tsx
│ │ ├── select.tsx
│ │ ├── separator.tsx
│ │ ├── skeleton.tsx
│ │ ├── switch.tsx
│ │ ├── table.tsx
│ │ ├── tabs.tsx
│ │ ├── textarea.tsx
│ │ ├── toast.tsx
│ │ ├── toaster.tsx
│ │ ├── tooltip.tsx
│ │ └── use-toast.tsx
│ ├── upgrade-plan-button.tsx
│ ├── upload-file-form.tsx
│ ├── user-account-nav.tsx
│ ├── user-avatar.tsx
│ └── user-name-form.tsx
├── components.json
├── config/
│ ├── dashboard.ts
│ ├── docs.ts
│ ├── marketing.ts
│ ├── site.ts
│ └── subscriptions.ts
├── content/
│ ├── authors/
│ │ └── marcolivierbouch.mdx
│ ├── docs/
│ │ ├── documentation/
│ │ │ ├── chatbots/
│ │ │ │ └── index.mdx
│ │ │ ├── crawlers/
│ │ │ │ └── index.mdx
│ │ │ ├── embed/
│ │ │ │ └── index.mdx
│ │ │ ├── files/
│ │ │ │ └── index.mdx
│ │ │ ├── index.mdx
│ │ │ └── openai-assistant-api/
│ │ │ └── index.mdx
│ │ ├── in-progress.mdx
│ │ ├── index.mdx
│ │ ├── legal/
│ │ │ ├── privacy.mdx
│ │ │ └── terms.mdx
│ │ ├── licensing/
│ │ │ └── index.mdx
│ │ └── pricing/
│ │ └── index.mdx
│ └── guides/
│ ├── how-to-build-a-good-prompt-for-your-chatbot/
│ │ └── index.mdx
│ ├── how-to-build-smart-chatbot-for-your-webiste/
│ │ └── index.mdx
│ ├── how-to-see-all-your-chatbot-threads/
│ │ └── index.mdx
│ └── how-to-use-message-exports-correctly/
│ └── index.mdx
├── contentlayer.config.js
├── emails/
│ ├── inquiry.tsx
│ └── welcome.tsx
├── hooks/
│ ├── use-assistant.ts
│ ├── use-copy-to-clipboard.ts
│ ├── use-enter-submit.ts
│ ├── use-inquiries.ts
│ ├── use-lock-body.ts
│ └── use-mouted.ts
├── lib/
│ ├── assistant-response.ts
│ ├── auth.ts
│ ├── construct-metadata.ts
│ ├── core/
│ │ ├── generate-text/
│ │ │ ├── tool-call.ts
│ │ │ └── tool-result.ts
│ │ └── tool.ts
│ ├── db.ts
│ ├── email.ts
│ ├── emails/
│ │ ├── send-inquiry.ts
│ │ └── send-welcome.ts
│ ├── exceptions.ts
│ ├── generate-id.ts
│ ├── getIP.ts
│ ├── googleAnalytics.ts
│ ├── read-data-stream.ts
│ ├── session.ts
│ ├── stream-parts.ts
│ ├── stripe.ts
│ ├── subscription.ts
│ ├── toc.ts
│ ├── utils.ts
│ ├── validations/
│ │ ├── advancedSettings.ts
│ │ ├── chat.ts
│ │ ├── chatBrandingConfig.ts
│ │ ├── chatFileAttachement.ts
│ │ ├── chatbot.ts
│ │ ├── codeInterpreter.ts
│ │ ├── crawler.ts
│ │ ├── customization.ts
│ │ ├── exportMessages.ts
│ │ ├── fileSearch.ts
│ │ ├── fileUpload.ts
│ │ ├── importChatbot.ts
│ │ ├── inquiry.ts
│ │ ├── inquiryCustomization.ts
│ │ ├── message.ts
│ │ ├── notification.ts
│ │ ├── og.ts
│ │ ├── openaiConfig.ts
│ │ ├── stripeCheckout.ts
│ │ └── user.ts
│ └── value-of.ts
├── middleware.ts
├── next-env.d.ts
├── next.config.js
├── notes.md
├── package.json
├── postcss.config.js
├── prisma/
│ ├── migrations/
│ │ ├── 20231119141309_setup_auth/
│ │ │ └── migration.sql
│ │ └── migration_lock.toml
│ └── schema.prisma
├── public/
│ ├── chatbot.css
│ ├── chatbot.js
│ ├── chatbotlegacy.js
│ ├── chatbotwindow.js
│ ├── chatwindow.css
│ ├── chatwindowlegacy.js
│ ├── robots.txt
│ └── sitemap.xml
├── references.md
├── sentry.client.config.ts
├── sentry.edge.config.ts
├── sentry.server.config.ts
├── styles/
│ ├── globals.css
│ └── mdx.css
├── tailwind.config.js
├── tsconfig.json
├── types/
│ ├── index.d.ts
│ └── next-auth-d.ts
└── website_tests/
├── index.html
├── index2.html
└── index_script.html
SYMBOL INDEX (2070 symbols across 222 files)
FILE: app/(auth)/layout.tsx
type AuthLayoutProps (line 1) | interface AuthLayoutProps {
function AuthLayout (line 5) | function AuthLayout({ children }: AuthLayoutProps) {
FILE: app/(auth)/login/page.tsx
function Login (line 18) | async function Login() {
FILE: app/(dashboard)/dashboard/billing/loading.tsx
function DashboardBillingLoading (line 5) | function DashboardBillingLoading() {
FILE: app/(dashboard)/dashboard/billing/page.tsx
function BillingPage (line 18) | async function BillingPage() {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/chatWindow/page.tsx
type ChatbotSettingsProps (line 12) | interface ChatbotSettingsProps {
function getChatbotForUser (line 16) | async function getChatbotForUser(chatbotId: Chatbot["id"]) {
function ChatbotPage (line 24) | async function ChatbotPage({ params }: ChatbotSettingsProps) {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/loading.tsx
function Loading (line 3) | function Loading() {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/page.tsx
type ChatbotSettingsProps (line 13) | interface ChatbotSettingsProps {
function getChatbotForUser (line 17) | async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User[...
function ChatbotPage (line 26) | async function ChatbotPage({ params }: ChatbotSettingsProps) {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/embed/loading.tsx
function Loading (line 3) | function Loading() {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/embed/page.tsx
type ChatbotSettingsProps (line 16) | interface ChatbotSettingsProps {
function getChatbotForUser (line 20) | async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User[...
function EmbedOnSitePage (line 29) | async function EmbedOnSitePage({ params }: ChatbotSettingsProps) {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/errors/loading.tsx
function Loading (line 3) | function Loading() {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/errors/page.tsx
type ChatbotSettingsProps (line 15) | interface ChatbotSettingsProps {
function getChatbotForUser (line 19) | async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User[...
function ChatbotErrorPage (line 28) | async function ChatbotErrorPage({ params }: ChatbotSettingsProps) {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/inquiries/loading.tsx
function Loading (line 3) | function Loading() {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/inquiries/page.tsx
type ChatbotSettingsProps (line 15) | interface ChatbotSettingsProps {
function getChatbotForUser (line 19) | async function getChatbotForUser(chatbotId: Chatbot["id"], userId: User[...
function UserInquiryPage (line 28) | async function UserInquiryPage({ params }: ChatbotSettingsProps) {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/loading.tsx
function Loading (line 3) | function Loading() {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/not-found.tsx
function NotFound (line 6) | function NotFound() {
FILE: app/(dashboard)/dashboard/chatbots/[chatbotId]/page.tsx
type ChatbotSettingsProps (line 25) | interface ChatbotSettingsProps {
function ChatbotPage (line 29) | async function ChatbotPage({ params }: ChatbotSettingsProps) {
FILE: app/(dashboard)/dashboard/chatbots/loading.tsx
function ChatbotsLoading (line 5) | function ChatbotsLoading() {
FILE: app/(dashboard)/dashboard/chatbots/page.tsx
function ChatbotsPage (line 17) | async function ChatbotsPage() {
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/loading.tsx
function CrawlingLoading (line 5) | function CrawlingLoading() {
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/not-found.tsx
function NotFound (line 6) | function NotFound() {
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/page.tsx
type CrawlerSettingsProps (line 18) | interface CrawlerSettingsProps {
function getCrawlerForUser (line 22) | async function getCrawlerForUser(crawlerId: Crawler["id"], userId: User[...
function CrawlingPage (line 32) | async function CrawlingPage({ params }: CrawlerSettingsProps) {
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/loading.tsx
function Loading (line 3) | function Loading() {
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/not-found.tsx
function NotFound (line 6) | function NotFound() {
FILE: app/(dashboard)/dashboard/crawlers/[crawlerId]/page.tsx
type CrawlerSettingsProps (line 16) | interface CrawlerSettingsProps {
function getCrawlerForUser (line 20) | async function getCrawlerForUser(crawlerId: Crawler["id"], userId: User[...
function CrawlerSettingsPage (line 30) | async function CrawlerSettingsPage({ params }: CrawlerSettingsProps) {
FILE: app/(dashboard)/dashboard/crawlers/loading.tsx
function CrawlersSettingsLoading (line 5) | function CrawlersSettingsLoading() {
FILE: app/(dashboard)/dashboard/crawlers/page.tsx
function CrawlersPage (line 21) | async function CrawlersPage() {
FILE: app/(dashboard)/dashboard/exports/page.tsx
function MessagesExportPage (line 18) | async function MessagesExportPage() {
FILE: app/(dashboard)/dashboard/files/loading.tsx
function FilesLoading (line 5) | function FilesLoading() {
FILE: app/(dashboard)/dashboard/files/page.tsx
function FilePage (line 19) | async function FilePage() {
FILE: app/(dashboard)/dashboard/files/upload/loading.tsx
function UploadFileLoading (line 5) | function UploadFileLoading() {
FILE: app/(dashboard)/dashboard/files/upload/page.tsx
function UploadFilePage (line 15) | async function UploadFilePage() {
FILE: app/(dashboard)/dashboard/layout.tsx
type DashboardLayoutProps (line 13) | interface DashboardLayoutProps {
function DashboardLayout (line 17) | async function DashboardLayout({
FILE: app/(dashboard)/dashboard/loading.tsx
function DashboardLoading (line 6) | function DashboardLoading() {
FILE: app/(dashboard)/dashboard/new/chatbot/loading.tsx
function CreateChatbotLoading (line 5) | function CreateChatbotLoading() {
FILE: app/(dashboard)/dashboard/new/chatbot/page.tsx
function ChatbotCreatePage (line 17) | async function ChatbotCreatePage() {
FILE: app/(dashboard)/dashboard/new/crawler/loading.tsx
function CreateCrawlerLoading (line 5) | function CreateCrawlerLoading() {
FILE: app/(dashboard)/dashboard/new/crawler/page.tsx
function CrawlerCreatePage (line 15) | async function CrawlerCreatePage() {
FILE: app/(dashboard)/dashboard/new/export/loading.tsx
function CreateExportLoading (line 5) | function CreateExportLoading() {
FILE: app/(dashboard)/dashboard/new/export/page.tsx
function CreateMessageExportPage (line 16) | async function CreateMessageExportPage() {
FILE: app/(dashboard)/dashboard/new/importChatbot/loading.tsx
function ImportChatbotLoading (line 5) | function ImportChatbotLoading() {
FILE: app/(dashboard)/dashboard/new/importChatbot/page.tsx
function ImportChatbotPage (line 15) | async function ImportChatbotPage() {
FILE: app/(dashboard)/dashboard/onboarding/loading.tsx
function CrawlersSettingsLoading (line 5) | function CrawlersSettingsLoading() {
FILE: app/(dashboard)/dashboard/onboarding/page.tsx
function OnboardingPage (line 27) | async function OnboardingPage() {
FILE: app/(dashboard)/dashboard/page.tsx
function DashboardPage (line 26) | async function DashboardPage() {
FILE: app/(dashboard)/dashboard/settings/loading.tsx
function DashboardSettingsLoading (line 5) | function DashboardSettingsLoading() {
FILE: app/(dashboard)/dashboard/settings/page.tsx
function SettingsPage (line 19) | async function SettingsPage() {
FILE: app/(dashboard)/dashboard/support/loading.tsx
function Loading (line 5) | function Loading() {
FILE: app/(dashboard)/dashboard/support/page.tsx
function SupportPage (line 13) | async function SupportPage() {
FILE: app/(docs)/docs/[[...slug]]/page.tsx
type DocPageProps (line 15) | interface DocPageProps {
function getDocFromParams (line 21) | async function getDocFromParams(params: any) {
function generateMetadata (line 32) | async function generateMetadata({
function generateStaticParams (line 74) | async function generateStaticParams(): Promise<
function DocPage (line 82) | async function DocPage({ params }: DocPageProps) {
FILE: app/(docs)/docs/layout.tsx
type DocsLayoutProps (line 4) | interface DocsLayoutProps {
function DocsLayout (line 8) | function DocsLayout({ children }: DocsLayoutProps) {
FILE: app/(docs)/guides/[...slug]/page.tsx
type GuidePageProps (line 17) | interface GuidePageProps {
function getGuideFromParams (line 23) | async function getGuideFromParams(params: any) {
function generateMetadata (line 34) | async function generateMetadata({
function generateStaticParams (line 76) | async function generateStaticParams(): Promise<
function GuidePage (line 84) | async function GuidePage({ params }: GuidePageProps) {
FILE: app/(docs)/guides/layout.tsx
type GuidesLayoutProps (line 2) | interface GuidesLayoutProps {
function GuidesLayout (line 6) | function GuidesLayout({ children }: GuidesLayoutProps) {
FILE: app/(docs)/guides/page.tsx
function GuidesPage (line 15) | function GuidesPage() {
FILE: app/(docs)/layout.tsx
type DocsLayoutProps (line 10) | interface DocsLayoutProps {
function DocsLayout (line 14) | function DocsLayout({ children }: DocsLayoutProps) {
FILE: app/(embed)/embed/[id]/button/page.tsx
type ChatComponentProps (line 5) | interface ChatComponentProps {
function Button (line 9) | async function Button({ params }: ChatComponentProps) {
FILE: app/(embed)/embed/[id]/window/page.tsx
type ChatComponentProps (line 3) | interface ChatComponentProps {
function Chat (line 8) | function Chat({ params, searchParams }: ChatComponentProps) {
FILE: app/(embed)/layout.tsx
type AuthLayoutProps (line 2) | interface AuthLayoutProps {
function AuthLayout (line 6) | function AuthLayout({ children }: AuthLayoutProps) {
FILE: app/(marketing)/changelog/page.tsx
function ChangelogPage (line 4) | function ChangelogPage() {
function Release (line 507) | function Release(props: { isFirst?: boolean; version: string; date: stri...
FILE: app/(marketing)/layout.tsx
type MarketingLayoutProps (line 14) | interface MarketingLayoutProps {
function MarketingLayout (line 18) | function MarketingLayout({
FILE: app/(marketing)/page.tsx
function IndexPage (line 13) | function IndexPage() {
FILE: app/(welcome)/layout.tsx
type AuthLayoutProps (line 1) | interface AuthLayoutProps {
function AuthLayout (line 5) | function AuthLayout({ children }: AuthLayoutProps) {
FILE: app/(welcome)/welcome/page.tsx
function Welcome (line 18) | async function Welcome() {
FILE: app/api/chatbots/[chatbotId]/chat/file/[fileId]/route.ts
function GET (line 14) | async function GET(
FILE: app/api/chatbots/[chatbotId]/chat/route.ts
function OPTIONS (line 30) | async function OPTIONS(req: Request) {
function POST (line 34) | async function POST(
FILE: app/api/chatbots/[chatbotId]/config/advanced/route.ts
function verifyCurrentUserHasAccessToChatbot (line 15) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function PATCH (line 28) | async function PATCH(
FILE: app/api/chatbots/[chatbotId]/config/branding/route.ts
function verifyCurrentUserHasAccessToChatbot (line 15) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function PATCH (line 28) | async function PATCH(
FILE: app/api/chatbots/[chatbotId]/config/customization/route.ts
function verifyCurrentUserHasAccessToChatbot (line 16) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function PATCH (line 29) | async function PATCH(
FILE: app/api/chatbots/[chatbotId]/config/fileAttachement/route.ts
function verifyCurrentUserHasAccessToChatbot (line 15) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function PATCH (line 28) | async function PATCH(
FILE: app/api/chatbots/[chatbotId]/config/inquiry/route.ts
function verifyCurrentUserHasAccessToChatbot (line 15) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function PATCH (line 28) | async function PATCH(
FILE: app/api/chatbots/[chatbotId]/config/route.ts
function GET (line 10) | async function GET(
FILE: app/api/chatbots/[chatbotId]/config/security/route.ts
function verifyCurrentUserHasAccessToChatbot (line 14) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function PATCH (line 27) | async function PATCH(
FILE: app/api/chatbots/[chatbotId]/errors/[errorId]/route.ts
function verifyCurrentUserHasAccessToChatbot (line 13) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function DELETE (line 27) | async function DELETE(
FILE: app/api/chatbots/[chatbotId]/imported/route.ts
function verifyCurrentUserHasAccessToChatbot (line 16) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function PATCH (line 29) | async function PATCH(
function DELETE (line 94) | async function DELETE(
FILE: app/api/chatbots/[chatbotId]/inquiries/[inquiryId]/route.ts
function verifyCurrentUserHasAccessToChatbot (line 14) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function DELETE (line 28) | async function DELETE(
FILE: app/api/chatbots/[chatbotId]/inquiries/route.ts
function OPTIONS (line 15) | async function OPTIONS(req: Request) {
function POST (line 19) | async function POST(
FILE: app/api/chatbots/[chatbotId]/route.ts
function verifyCurrentUserHasAccessToChatbot (line 18) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function GET (line 31) | async function GET(
function PATCH (line 61) | async function PATCH(
function DELETE (line 236) | async function DELETE(
FILE: app/api/chatbots/import/route.ts
function POST (line 12) | async function POST(req: Request) {
FILE: app/api/chatbots/route.ts
function GET (line 14) | async function GET(request: Request) {
function POST (line 40) | async function POST(req: Request) {
FILE: app/api/crawlers/[crawlerId]/crawling/route.ts
function verifyCurrentUserHasAccessToCrawler (line 25) | async function verifyCurrentUserHasAccessToCrawler(crawlerId: string) {
function crawl (line 39) | async function crawl(url: string, selector: string, maxPagesToCrawl: num...
function GET (line 99) | async function GET(
FILE: app/api/crawlers/[crawlerId]/route.ts
function verifyCurrentUserHasAccessToCrawler (line 16) | async function verifyCurrentUserHasAccessToCrawler(crawlerId: string) {
function DELETE (line 29) | async function DELETE(
function PATCH (line 70) | async function PATCH(
FILE: app/api/crawlers/route.ts
function GET (line 11) | async function GET(request: Request) {
function POST (line 39) | async function POST(req: Request) {
FILE: app/api/exports/[exportId]/route.ts
function verifyCurrentUserHasAccessToExport (line 15) | async function verifyCurrentUserHasAccessToExport(exportId: string) {
function DELETE (line 32) | async function DELETE(
FILE: app/api/exports/route.ts
function verifyCurrentUserHasAccessToChatbot (line 9) | async function verifyCurrentUserHasAccessToChatbot(chatbotId: string) {
function POST (line 22) | async function POST(
FILE: app/api/files/[fileId]/route.ts
function verifyCurrentUserHasAccessToFile (line 16) | async function verifyCurrentUserHasAccessToFile(fileId: string) {
function DELETE (line 30) | async function DELETE(
FILE: app/api/files/route.ts
function GET (line 6) | async function GET(request: Request) {
FILE: app/api/models/route.ts
function GET (line 5) | async function GET(request: Request) {
FILE: app/api/og/route.tsx
function GET (line 15) | async function GET(req: Request) {
FILE: app/api/route.ts
function GET (line 4) | async function GET(request: Request) {
FILE: app/api/session/route.ts
function GET (line 6) | async function GET(request: Request) {
FILE: app/api/upload/route.ts
function POST (line 15) | async function POST(request: Request) {
FILE: app/api/users/[userId]/notifications/route.ts
function PATCH (line 14) | async function PATCH(
FILE: app/api/users/[userId]/openai/models/route.ts
function GET (line 14) | async function GET(
FILE: app/api/users/[userId]/openai/route.ts
function PATCH (line 15) | async function PATCH(
FILE: app/api/users/[userId]/route.ts
function PATCH (line 14) | async function PATCH(
FILE: app/api/users/stripe/route.ts
function POST (line 13) | async function POST(req: Request) {
FILE: app/api/webhooks/stripe/route.ts
function POST (line 8) | async function POST(req: Request) {
FILE: app/global-error.jsx
function GlobalError (line 7) | function GlobalError({ error }) {
FILE: app/layout.tsx
function RootLayout (line 29) | async function RootLayout({
FILE: components/auth-status.tsx
function AuthStatus (line 3) | async function AuthStatus() {
FILE: components/background.tsx
function Background (line 1) | function Background() {
FILE: components/billing-form.tsx
type BillingFormProps (line 22) | interface BillingFormProps extends React.HTMLAttributes<HTMLFormElement> {
function BillingForm (line 28) | function BillingForm({
FILE: components/button-scroll-to-bottom.tsx
type ButtonScrollToBottomProps (line 9) | interface ButtonScrollToBottomProps extends ButtonProps {
function ButtonScrollToBottom (line 14) | function ButtonScrollToBottom({
FILE: components/callout.tsx
type CalloutProps (line 3) | interface CalloutProps {
function Callout (line 9) | function Callout({
FILE: components/card-skeleton.tsx
function CardSkeleton (line 4) | function CardSkeleton() {
FILE: components/chat-export-items.tsx
type MessagesExportProps (line 8) | interface MessagesExportProps {
function ChatExportItem (line 13) | async function ChatExportItem({ messagesExport, chatbotName }: MessagesE...
FILE: components/chat-footer-text.tsx
function FooterText (line 8) | function FooterText({ className, ...props }: React.ComponentProps<'p'>) {
FILE: components/chat-history.tsx
function ChatHistory (line 10) | function ChatHistory({
FILE: components/chat-message-actions.tsx
type ChatMessageActionsProps (line 10) | interface ChatMessageActionsProps extends React.ComponentProps<'div'> {
function ChatMessageActions (line 14) | function ChatMessageActions({
FILE: components/chat-message.tsx
type ChatMessageProps (line 16) | interface ChatMessageProps {
function ChatMessage (line 25) | function ChatMessage({ message, children, chatbot, isFirst, ...props }: ...
FILE: components/chat-sdk.tsx
type ClientSideChatbotProps (line 8) | interface ClientSideChatbotProps {
type ChatbotProps (line 59) | interface ChatbotProps {
function Chat (line 67) | function Chat({ chatbot, defaultMessage, className, withExitX = false, c...
FILE: components/chat.tsx
type ChatbotProps (line 25) | interface ChatbotProps {
function Chat (line 33) | function Chat({ chatbot, defaultMessage, className, withExitX = false, c...
FILE: components/chatbot-advanced-settings.tsx
type ChatbotFormProps (line 26) | interface ChatbotFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 30) | type FormData = z.infer<typeof advancedSettingsSchema>
function ChatbotAdvancedSettingsForm (line 32) | function ChatbotAdvancedSettingsForm({ chatbot, ...props }: ChatbotFormP...
FILE: components/chatbot-branding-pro-settings.tsx
type ChatbotFormProps (line 25) | interface ChatbotFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 29) | type FormData = z.infer<typeof chatBrandingSettingsSchema>
function ChatbotBrandingProSettingsForm (line 31) | function ChatbotBrandingProSettingsForm({ chatbot, className, ...props }...
FILE: components/chatbot-button.tsx
type ChatbotButtonComponentProps (line 6) | interface ChatbotButtonComponentProps {
function ChatbotButton (line 11) | function ChatbotButton({ textColor, backgroundColor }: ChatbotButtonComp...
FILE: components/chatbot-create-button.tsx
type ChatbotCreateButtonProps (line 12) | interface ChatbotCreateButtonProps extends ButtonProps { }
function ChatbotCreateButton (line 14) | function ChatbotCreateButton({
FILE: components/chatbot-file-attachement-pro-settings.tsx
type ChatbotFormProps (line 25) | interface ChatbotFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 29) | type FormData = z.infer<typeof chatFileAttachementSettingsSchema>
function ChatbotFileAttachementProSettingsForm (line 31) | function ChatbotFileAttachementProSettingsForm({ chatbot, className, ......
FILE: components/chatbot-form.tsx
type ChatbotFormProps (line 29) | interface ChatbotFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 37) | type FormData = z.infer<typeof chatbotSchema>
function ChatbotForm (line 39) | function ChatbotForm({ chatbot, currentFiles, models, files, className, ...
FILE: components/chatbot-item.tsx
type ChatbotProps (line 8) | interface ChatbotProps {
function ChatbotItem (line 13) | function ChatbotItem({ chatbot, model }: ChatbotProps) {
FILE: components/chatbot-operations.tsx
type ChatbotOperationsProps (line 29) | interface ChatbotOperationsProps {
function ChatbotOperations (line 33) | function ChatbotOperations({ chatbot }: ChatbotOperationsProps) {
FILE: components/chatbot-security-settings.tsx
type ChatbotFormProps (line 27) | interface ChatbotFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 31) | type FormData = z.infer<typeof advancedSettingsSecurityFormSchema>
function ChatbotAdvancedSecuritySettingsForm (line 33) | function ChatbotAdvancedSecuritySettingsForm({ chatbot, ...props }: Chat...
FILE: components/chatbot.tsx
function Chatbot (line 7) | function Chatbot() {
FILE: components/crawler-create-button.tsx
type CrawlerCreateButtonProps (line 10) | interface CrawlerCreateButtonProps extends ButtonProps { }
function CrawlerCreateButton (line 12) | function CrawlerCreateButton({
FILE: components/crawler-form.tsx
type CrawlerFormProps (line 26) | interface CrawlerFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 30) | type FormData = z.infer<typeof crawlerSchema>
function CrawlerForm (line 32) | function CrawlerForm({ crawler, className, ...props }: CrawlerFormProps) {
FILE: components/crawler-item.tsx
type CrawlerItemProps (line 8) | interface CrawlerItemProps {
function CrawlerItem (line 12) | function CrawlerItem({ crawler }: CrawlerItemProps) {
FILE: components/crawler-operations.tsx
function deleteCrawler (line 28) | async function deleteCrawler(crawlerId: string) {
type CrawlerOperationsProps (line 44) | interface CrawlerOperationsProps {
function CrawlerOperations (line 48) | function CrawlerOperations({ crawler }: CrawlerOperationsProps) {
FILE: components/customization-settings.tsx
type ChatbotOperationsProps (line 32) | interface ChatbotOperationsProps {
function CustomizationSettings (line 36) | function CustomizationSettings({ chatbot }: ChatbotOperationsProps) {
FILE: components/empty-placeholder.tsx
type EmptyPlaceholderProps (line 6) | interface EmptyPlaceholderProps extends React.HTMLAttributes<HTMLDivElem...
function EmptyPlaceholder (line 8) | function EmptyPlaceholder({
type EmptyPlaceholderIconProps (line 28) | interface EmptyPlaceholderIconProps
type EmptyPlacholderTitleProps (line 51) | interface EmptyPlacholderTitleProps
type EmptyPlacholderDescriptionProps (line 63) | interface EmptyPlacholderDescriptionProps
FILE: components/error-items.tsx
type UploadFileProps (line 8) | interface UploadFileProps {
function ErrorItem (line 12) | async function ErrorItem({ error }: UploadFileProps) {
FILE: components/error-operations.tsx
type ErrorOperationsProps (line 27) | interface ErrorOperationsProps {
function ErrorOperations (line 31) | function ErrorOperations({ error }: ErrorOperationsProps) {
FILE: components/error-short-item.tsx
type UploadFileProps (line 8) | interface UploadFileProps {
function ErrorShortItem (line 13) | async function ErrorShortItem({ error, chatbotName }: UploadFileProps) {
FILE: components/export-messages-button.tsx
type MessageExportButtonProps (line 10) | interface MessageExportButtonProps extends ButtonProps { }
function MessageExportButton (line 12) | function MessageExportButton({
FILE: components/external-link.tsx
function ExternalLink (line 1) | function ExternalLink({
FILE: components/faq.tsx
function FAQ (line 7) | function FAQ() {
FILE: components/file-items.tsx
type UploadFileProps (line 9) | interface UploadFileProps {
function FileItem (line 13) | async function FileItem({ file }: UploadFileProps) {
FILE: components/file-operations.tsx
type FileOperationsProps (line 30) | interface FileOperationsProps {
function FileOperations (line 34) | function FileOperations({ file }: FileOperationsProps) {
FILE: components/file-upload-button.tsx
type FileUploadButtonProps (line 10) | interface FileUploadButtonProps extends ButtonProps { }
function FileUploadButton (line 12) | function FileUploadButton({
FILE: components/github-card.tsx
function getGitHubStars (line 26) | async function getGitHubStars(): Promise<string | null> {
function GithubCard (line 53) | async function GithubCard() {
FILE: components/github-login-form.tsx
function GithubLoginForm (line 9) | function GithubLoginForm() {
FILE: components/google-login-form.tsx
function GoogleLoginForm (line 9) | function GoogleLoginForm() {
FILE: components/gradient-picker.tsx
function GradientPicker (line 15) | function GradientPicker({
FILE: components/header.tsx
type DashboardHeaderProps (line 1) | interface DashboardHeaderProps {
function DashboardHeader (line 7) | function DashboardHeader({
FILE: components/icons.tsx
type Icon (line 47) | type Icon = LucideIcon
FILE: components/imported-chatbot-form.tsx
type ChatbotFormProps (line 28) | interface ChatbotFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 33) | type FormData = z.infer<typeof importChatbotSchema>
function ImportedChatbotForm (line 35) | function ImportedChatbotForm({ chatbot, className, ...props }: ChatbotFo...
FILE: components/inquiries.tsx
type InquiryProps (line 22) | interface InquiryProps {
function Inquiries (line 27) | function Inquiries({
FILE: components/inquiry-display.tsx
type InquiryDisplayProps (line 24) | interface InquiryDisplayProps {
function InquiryDisplay (line 28) | function InquiryDisplay({ inquiry }: InquiryDisplayProps) {
FILE: components/inquiry-extension.tsx
function SupportInquiry (line 22) | function SupportInquiry({chatbot, threadId}: {chatbot: ClientSideChatbo...
FILE: components/inquiry-item.tsx
type UploadFileProps (line 8) | interface UploadFileProps {
function InquiryItem (line 13) | async function InquiryItem({ inquiry, chatbotName }: UploadFileProps) {
FILE: components/inquiry-list.tsx
type InquiryListProps (line 10) | interface InquiryListProps {
function InquiryList (line 14) | function InquiryList({ inquiries }: InquiryListProps) {
FILE: components/inquiry-settings.tsx
type ChatbotOperationsProps (line 26) | interface ChatbotOperationsProps {
function InquirySettings (line 30) | function InquirySettings({ chatbot }: ChatbotOperationsProps) {
FILE: components/main-nav.tsx
type MainNavProps (line 13) | interface MainNavProps {
function MainNav (line 18) | function MainNav({ items, children }: MainNavProps) {
FILE: components/mdx-card.tsx
type CardProps (line 5) | interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
function MdxCard (line 10) | function MdxCard({
FILE: components/mdx-components.tsx
type MdxProps (line 155) | interface MdxProps {
function Mdx (line 159) | function Mdx({ code }: MdxProps) {
FILE: components/message-overview.tsx
type OverviewProps (line 5) | interface OverviewProps {
function MessagesOverview (line 9) | function MessagesOverview({ items }: OverviewProps) {
FILE: components/messages-export-operation.tsx
type MessagesExportOperationsProps (line 30) | interface MessagesExportOperationsProps {
function MessagesExportOperations (line 34) | function MessagesExportOperations({ messagesExport }: MessagesExportOper...
FILE: components/mobile-nav.tsx
type MobileNavProps (line 10) | interface MobileNavProps {
function MobileNav (line 15) | function MobileNav({ items, children }: MobileNavProps) {
FILE: components/move-to-crawlers-button.tsx
type MoveToCrawlersButtonProps (line 10) | interface MoveToCrawlersButtonProps extends ButtonProps { }
function MoveToCrawlersButton (line 12) | function MoveToCrawlersButton({
FILE: components/nav.tsx
type DashboardNavProps (line 13) | interface DashboardNavProps {
function DashboardNav (line 17) | function DashboardNav({ items }: DashboardNavProps) {
FILE: components/new-chatbot-form.tsx
type FormData (line 29) | type FormData = z.infer<typeof chatbotSchema>
type NewChatbotProps (line 31) | interface NewChatbotProps extends React.HTMLAttributes<HTMLElement> {
function NewChatbotForm (line 37) | function NewChatbotForm({ isOnboarding, className, ...props }: NewChatbo...
FILE: components/new-crawler-form.tsx
type FormData (line 25) | type FormData = z.infer<typeof crawlerSchema>
function NewCrawlerForm (line 27) | function NewCrawlerForm({ className, ...props }: React.HTMLAttributes<HT...
FILE: components/new-import-chatbot-form.tsx
type FormData (line 28) | type FormData = z.infer<typeof importChatbotSchema>
type ImportChatbotProps (line 30) | interface ImportChatbotProps extends React.HTMLAttributes<HTMLElement> {
function ImportChatbotForm (line 34) | function ImportChatbotForm({ className, ...props }: ImportChatbotProps) {
FILE: components/new-message-export.tsx
type FormData (line 26) | type FormData = z.infer<typeof exportMessagesSchema>
type NewMessageExportFormProps (line 28) | interface NewMessageExportFormProps extends React.HTMLAttributes<HTMLFor...
function NewMessageExportForm (line 32) | function NewMessageExportForm({ chatbots, className, ...props }: NewMess...
FILE: components/next-auth-provider.tsx
function NextAuthProvider (line 6) | function NextAuthProvider({
FILE: components/notification-settings-form.tsx
type NotificationSettingsFormProps (line 26) | interface NotificationSettingsFormProps extends React.HTMLAttributes<HTM...
type FormData (line 32) | type FormData = z.infer<typeof notificationSchema>
function NotificationSettingsForm (line 34) | function NotificationSettingsForm({ user, inquiryNotificationEnabled, ma...
FILE: components/openai-config-form.tsx
type UserNameFormProps (line 27) | interface UserNameFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 31) | type FormData = z.infer<typeof openAIConfigSchema>
function OpenAIForm (line 33) | function OpenAIForm({ user, className, ...props }: UserNameFormProps) {
FILE: components/page-header.tsx
type DocsPageHeaderProps (line 3) | interface DocsPageHeaderProps extends React.HTMLAttributes<HTMLDivElemen...
function DocsPageHeader (line 8) | function DocsPageHeader({
FILE: components/pager.tsx
type DocsPagerProps (line 9) | interface DocsPagerProps {
function DocsPager (line 13) | function DocsPager({ doc }: DocsPagerProps) {
function getPagerForDoc (line 44) | function getPagerForDoc(doc: Doc) {
function flatten (line 60) | function flatten(links: { items?}[]) {
FILE: components/sdk-banner.tsx
function SDKBanner (line 7) | function SDKBanner() {
FILE: components/shell.tsx
type DashboardShellProps (line 5) | interface DashboardShellProps extends React.HTMLAttributes<HTMLDivElemen...
function DashboardShell (line 7) | function DashboardShell({
FILE: components/sidebar-nav.tsx
type DocsSidebarNavProps (line 9) | interface DocsSidebarNavProps {
function DocsSidebarNav (line 13) | function DocsSidebarNav({ items }: DocsSidebarNavProps) {
type DocsSidebarNavItemsProps (line 32) | interface DocsSidebarNavItemsProps {
function DocsSidebarNavItems (line 37) | function DocsSidebarNavItems({
FILE: components/site-footer.tsx
type SiteFooterProps (line 7) | interface SiteFooterProps extends React.HTMLAttributes<HTMLElement> {
function SiteFooter (line 11) | function SiteFooter({ simpleFooter, className }: SiteFooterProps) {
FILE: components/start-crawling-button.tsx
type CrawlingProps (line 13) | interface CrawlingProps extends React.HTMLAttributes<HTMLFormElement> {
function StartCrawlingButton (line 17) | function StartCrawlingButton({
FILE: components/theme-provider.tsx
function ThemeProvider (line 7) | function ThemeProvider({ children, ...props }: ThemeProviderProps) {
FILE: components/toc.tsx
type TocProps (line 9) | interface TocProps {
function DashboardTableOfContents (line 13) | function DashboardTableOfContents({ toc }: TocProps) {
function useActiveItem (line 40) | function useActiveItem(itemIds: (string | undefined)[]) {
type TreeProps (line 83) | interface TreeProps {
function Tree (line 89) | function Tree({ tree, level = 1, activeItem }: TreeProps) {
FILE: components/ui/badge.tsx
type BadgeProps (line 26) | interface BadgeProps
function Badge (line 30) | function Badge({ className, variant, ...props }: BadgeProps) {
FILE: components/ui/button.tsx
type ButtonProps (line 37) | interface ButtonProps
FILE: components/ui/calendar.tsx
type CalendarProps (line 10) | type CalendarProps = React.ComponentProps<typeof DayPicker>
function Calendar (line 12) | function Calendar({
FILE: components/ui/codeblock.tsx
type Props (line 11) | interface Props {
type languageMap (line 16) | interface languageMap {
FILE: components/ui/form.tsx
type FormFieldContextValue (line 18) | type FormFieldContextValue<
type FormItemContextValue (line 65) | type FormItemContextValue = {
FILE: components/ui/input.tsx
type InputProps (line 5) | interface InputProps
FILE: components/ui/skeleton.tsx
function Skeleton (line 3) | function Skeleton({
FILE: components/ui/textarea.tsx
type TextareaProps (line 5) | interface TextareaProps
FILE: components/ui/toast.tsx
type ToastProps (line 113) | type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>
type ToastActionElement (line 115) | type ToastActionElement = React.ReactElement<typeof ToastAction>
FILE: components/ui/toaster.tsx
function Toaster (line 13) | function Toaster() {
FILE: components/ui/use-toast.tsx
constant TOAST_LIMIT (line 6) | const TOAST_LIMIT = 1
constant TOAST_REMOVE_DELAY (line 7) | const TOAST_REMOVE_DELAY = 1000000
type ToasterToast (line 9) | type ToasterToast = ToastProps & {
function genId (line 25) | function genId() {
type ActionType (line 30) | type ActionType = typeof actionTypes
type Action (line 32) | type Action =
type State (line 50) | interface State {
function dispatch (line 131) | function dispatch(action: Action) {
type Toast (line 138) | interface Toast extends Omit<ToasterToast, "id"> { }
function toast (line 140) | function toast({ ...props }: Toast) {
function useToast (line 169) | function useToast() {
FILE: components/upgrade-plan-button.tsx
type UpgradePlanButtonProps (line 10) | interface UpgradePlanButtonProps extends ButtonProps { }
function UpgradePlanButton (line 12) | function UpgradePlanButton({
FILE: components/upload-file-form.tsx
type UploadFileFormProps (line 26) | interface UploadFileFormProps extends React.HTMLAttributes<HTMLFormEleme...
type FormData (line 28) | type FormData = z.infer<typeof fileUploadSchema>
function UploadFileForm (line 30) | function UploadFileForm({ className, ...props }: UploadFileFormProps) {
FILE: components/user-account-nav.tsx
type UserAccountNavProps (line 16) | interface UserAccountNavProps extends React.HTMLAttributes<HTMLDivElemen...
function UserAccountNav (line 20) | function UserAccountNav({ user }: UserAccountNavProps) {
FILE: components/user-avatar.tsx
type UserAvatarProps (line 7) | interface UserAvatarProps extends AvatarProps {
function UserAvatar (line 11) | function UserAvatar({ user, ...props }: UserAvatarProps) {
FILE: components/user-name-form.tsx
type UserNameFormProps (line 26) | interface UserNameFormProps extends React.HTMLAttributes<HTMLFormElement> {
type FormData (line 30) | type FormData = z.infer<typeof userNameSchema>
function UserNameForm (line 32) | function UserNameForm({ user, className, ...props }: UserNameFormProps) {
FILE: contentlayer.config.js
method onVisitLine (line 156) | onVisitLine(node) {
method onVisitHighlightedLine (line 163) | onVisitHighlightedLine(node) {
method onVisitHighlightedWord (line 166) | onVisitHighlightedWord(node) {
FILE: emails/inquiry.tsx
type InquiryEmailProps (line 18) | interface InquiryEmailProps {
function InquiryEmail (line 26) | function InquiryEmail({ ownerName, userEmail, userInquiry, chatbotName, ...
FILE: emails/welcome.tsx
type WelcomeEmailProps (line 18) | interface WelcomeEmailProps {
function WelcomeEmail (line 22) | function WelcomeEmail({ name }: WelcomeEmailProps) {
FILE: hooks/use-assistant.ts
type UseAssistantHelpers (line 11) | type UseAssistantHelpers = {
function useAssistant (line 42) | function useAssistant({
FILE: hooks/use-copy-to-clipboard.ts
type useCopyToClipboardProps (line 5) | interface useCopyToClipboardProps {
function useCopyToClipboard (line 9) | function useCopyToClipboard({
FILE: hooks/use-enter-submit.ts
function useEnterSubmit (line 3) | function useEnterSubmit(): {
FILE: hooks/use-inquiries.ts
type Config (line 5) | type Config = {
function useInquiry (line 13) | function useInquiry() {
FILE: hooks/use-lock-body.ts
function useLockBody (line 4) | function useLockBody() {
FILE: hooks/use-mouted.ts
function useMounted (line 3) | function useMounted() {
FILE: lib/assistant-response.ts
type AssistantResponseSettings (line 9) | type AssistantResponseSettings = {
type AssistantResponseCallback (line 24) | type AssistantResponseCallback = (options: {
function AssistantResponse (line 56) | function AssistantResponse(
FILE: lib/auth.ts
method session (line 31) | async session({ token, session }) {
method jwt (line 41) | async jwt({ token, user }) {
method createUser (line 64) | async createUser(message) {
FILE: lib/construct-metadata.ts
function constructMetadata (line 3) | function constructMetadata({
FILE: lib/core/generate-text/tool-call.ts
type ToolCall (line 16) | interface ToolCall<NAME extends string, ARGS> {
type ToToolCall (line 34) | type ToToolCall<TOOLS extends Record<string, CoreTool>> = ValueOf<{
type ToToolCallArray (line 43) | type ToToolCallArray<TOOLS extends Record<string, CoreTool>> = Array<
function parseToolCall (line 47) | function parseToolCall<TOOLS extends Record<string, CoreTool>>({
FILE: lib/core/generate-text/tool-result.ts
type ToolResult (line 9) | interface ToolResult<NAME extends string, ARGS, RESULT> {
type ToToolsWithExecute (line 32) | type ToToolsWithExecute<TOOLS extends Record<string, CoreTool>> = {
type ToToolsWithDefinedExecute (line 37) | type ToToolsWithDefinedExecute<TOOLS extends Record<string, CoreTool>> = {
type ToToolResultObject (line 44) | type ToToolResultObject<TOOLS extends Record<string, CoreTool>> = ValueOf<{
type ToToolResult (line 54) | type ToToolResult<TOOLS extends Record<string, CoreTool>> =
type ToToolResultArray (line 57) | type ToToolResultArray<TOOLS extends Record<string, CoreTool>> = Array<
FILE: lib/core/tool.ts
type CoreTool (line 9) | interface CoreTool<PARAMETERS extends z.ZodTypeAny = any, RESULT = any> {
function tool (line 47) | function tool<PARAMETERS extends z.ZodTypeAny, RESULT = any>(
type ExperimentalTool (line 56) | type ExperimentalTool = CoreTool;
FILE: lib/emails/send-inquiry.ts
function sendNewInquiryEmail (line 5) | async function sendNewInquiryEmail({ email, ownerName, userEmail, userIn...
FILE: lib/emails/send-welcome.ts
function sendWelcomeEmail (line 6) | async function sendWelcomeEmail({ name, email }: { name: string | null |...
FILE: lib/exceptions.ts
class RequiresHigherPlanError (line 1) | class RequiresHigherPlanError extends Error {
method constructor (line 2) | constructor(message = "This action requires higher plan") {
FILE: lib/getIP.ts
function getClientIP (line 3) | function getClientIP() {
FILE: lib/read-data-stream.ts
constant NEWLINE (line 3) | const NEWLINE = '\n'.charCodeAt(0);
function concatChunks (line 6) | function concatChunks(chunks: Uint8Array[], totalLength: number) {
FILE: lib/session.ts
function getCurrentUser (line 5) | async function getCurrentUser() {
FILE: lib/stream-parts.ts
type StreamPart (line 12) | interface StreamPart<CODE extends string, NAME extends string, TYPE> {
type StreamParts (line 319) | type StreamParts =
type StreamPartValueType (line 335) | type StreamPartValueType = {
type StreamPartType (line 339) | type StreamPartType =
function formatStreamPart (line 438) | function formatStreamPart<T extends keyof StreamPartValueType>(
FILE: lib/subscription.ts
function getUserSubscriptionPlan (line 8) | async function getUserSubscriptionPlan(
FILE: lib/toc.ts
function flattenNode (line 10) | function flattenNode(node) {
type Item (line 19) | interface Item {
type Items (line 25) | interface Items {
function getItems (line 29) | function getItems(node, current): Items {
type TableOfContents (line 71) | type TableOfContents = Items
function getTableOfContents (line 73) | async function getTableOfContents(
FILE: lib/utils.ts
function cn (line 5) | function cn(...inputs: ClassValue[]) {
function formatDate (line 9) | function formatDate(input: string | number): string {
function sleep (line 18) | function sleep(ms: number) {
function absoluteUrl (line 22) | function absoluteUrl(path: string) {
function createChunkDecoder (line 56) | function createChunkDecoder(complex?: boolean) {
type StreamString (line 84) | type StreamString =
FILE: lib/value-of.ts
type ValueOf (line 62) | type ValueOf<
FILE: middleware.ts
method authorized (line 34) | async authorized() {
FILE: next.config.js
method headers (line 10) | async headers() {
FILE: prisma/migrations/20231119141309_setup_auth/migration.sql
type "Account" (line 2) | CREATE TABLE "Account" (
type "Session" (line 18) | CREATE TABLE "Session" (
type "User" (line 31) | CREATE TABLE "User" (
type "VerificationRequest" (line 44) | CREATE TABLE "VerificationRequest" (
type "Account" (line 56) | CREATE UNIQUE INDEX "Account_providerId_providerAccountId_key" ON "Accou...
type "Session" (line 59) | CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken")
type "Session" (line 62) | CREATE UNIQUE INDEX "Session_accessToken_key" ON "Session"("accessToken")
type "User" (line 65) | CREATE UNIQUE INDEX "User_email_key" ON "User"("email")
type "VerificationRequest" (line 68) | CREATE UNIQUE INDEX "VerificationRequest_token_key" ON "VerificationRequ...
type "VerificationRequest" (line 71) | CREATE UNIQUE INDEX "VerificationRequest_identifier_token_key" ON "Verif...
FILE: public/chatbotlegacy.js
function CC (line 1) | function CC(e){return e===null||typeof e!="object"?null:(e=ty&&e[ty]||e[...
function Aa (line 1) | function Aa(e,t,r){this.props=e,this.context=t,this.refs=ly,this.updater...
function uy (line 1) | function uy(){}
function jf (line 1) | function jf(e,t,r){this.props=e,this.context=t,this.refs=ly,this.updater...
function dy (line 1) | function dy(e,t,r){var n,a={},o=null,l=null;if(t!=null)for(n in t.ref!==...
function IC (line 1) | function IC(e,t){return{$$typeof:Ko,type:e.type,key:t,ref:e.ref,props:e....
function Gf (line 1) | function Gf(e){return typeof e=="object"&&e!==null&&e.$$typeof===Ko}
function kC (line 1) | function kC(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,fun...
function Vf (line 1) | function Vf(e,t){return typeof e=="object"&&e!==null&&e.key!=null?kC(""+...
function Ri (line 1) | function Ri(e,t,r,n,a){var o=typeof e;(o==="undefined"||o==="boolean")&&...
function Di (line 1) | function Di(e,t,r){if(e==null)return e;var n=[],a=0;return Ri(e,n,"","",...
function PC (line 1) | function PC(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(...
function OC (line 1) | function OC(e){return e===null||typeof e!="object"?null:(e=py&&e[py]||e[...
function _a (line 1) | function _a(e,t,r){this.props=e,this.context=t,this.refs=vy,this.updater...
function xy (line 1) | function xy(){}
function Qf (line 1) | function Qf(e,t,r){this.props=e,this.context=t,this.refs=vy,this.updater...
function Sy (line 1) | function Sy(e,t,r){var n,a={},o=null,l=null;if(t!=null)for(n in t.ref!==...
function UC (line 1) | function UC(e,t){return{$$typeof:Xo,type:e.type,key:t,ref:e.ref,props:e....
function Zf (line 1) | function Zf(e){return typeof e=="object"&&e!==null&&e.$$typeof===Xo}
function HC (line 1) | function HC(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,fun...
function qf (line 1) | function qf(e,t){return typeof e=="object"&&e!==null&&e.key!=null?HC(""+...
function zi (line 1) | function zi(e,t,r,n,a){var o=typeof e;(o==="undefined"||o==="boolean")&&...
function _i (line 1) | function _i(e,t,r){if(e==null)return e;var n=[],a=0;return zi(e,n,"","",...
function VC (line 1) | function VC(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(...
function uc (line 1) | function uc(e,t){var r=e.length;e.push(t);e:for(;0<r;){var n=r-1>>>1,a=e...
function Zt (line 1) | function Zt(e){return e.length===0?null:e[0]}
function Gi (line 1) | function Gi(e){if(e.length===0)return null;var t=e[0],r=e.pop();if(r!==t...
function Wi (line 1) | function Wi(e,t){var r=e.sortIndex-t.sortIndex;return r!==0?r:e.id-t.id}
function ic (line 1) | function ic(e){for(var t=Zt(rn);t!==null;){if(t.callback===null)Gi(rn);e...
function sc (line 1) | function sc(e){if(el=!1,ic(e),!Yn)if(Zt(hr)!==null)Yn=!0,fc(dc);else{var...
function dc (line 1) | function dc(e,t){Yn=!1,el&&(el=!1,$y(tl),tl=-1),qi=!0;var r=Oe;try{for(i...
function Qy (line 1) | function Qy(){return!(G.unstable_now()-qy<Gy)}
function oc (line 1) | function oc(){if($i!==null){var e=G.unstable_now();qy=e;var t=!0;try{t=$...
function fc (line 1) | function fc(e){$i=e,Qi||(Qi=!0,bo())}
function cc (line 1) | function cc(e,t){tl=Wy(function(){e(G.unstable_now())},t)}
function k (line 1) | function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
function da (line 1) | function da(e,t){no(e,t),no(e+"Capture",t)}
function no (line 1) | function no(e,t){for(Cl[e]=t,e=0;e<t.length;e++)a0.add(t[e])}
function CI (line 1) | function CI(e){return zc.call(Jy,e)?!0:zc.call(Yy,e)?!1:SI.test(e)?Jy[e]...
function II (line 1) | function II(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){c...
function kI (line 1) | function kI(e,t,r,n){if(t===null||typeof t>"u"||II(e,t,r,n))return!0;if(...
function rt (line 1) | function rt(e,t,r,n,a,o,l){this.acceptsBooleans=t===2||t===3||t===4,this...
function Tp (line 1) | function Tp(e){return e[1].toUpperCase()}
function Mp (line 1) | function Mp(e,t,r,n){var a=Re.hasOwnProperty(t)?Re[t]:null;(a!==null?a.t...
function rl (line 1) | function rl(e){return e===null||typeof e!="object"?null:(e=by&&e[by]||e[...
function dl (line 1) | function dl(e){if(pc===void 0)try{throw Error()}catch(r){var t=r.stack.t...
function hc (line 2) | function hc(e,t){if(!e||mc)return"";mc=!0;var r=Error.prepareStackTrace;...
function PI (line 5) | function PI(e){switch(e.tag){case 5:return dl(e.type);case 16:return dl(...
function Uc (line 5) | function Uc(e){if(e==null)return null;if(typeof e=="function")return e.d...
function EI (line 5) | function EI(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:r...
function xn (line 5) | function xn(e){switch(typeof e){case"boolean":case"number":case"string":...
function i0 (line 5) | function i0(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="inp...
function TI (line 5) | function TI(e){var t=i0(e)?"checked":"value",r=Object.getOwnPropertyDesc...
function Xi (line 5) | function Xi(e){e._valueTracker||(e._valueTracker=TI(e))}
function s0 (line 5) | function s0(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r...
function Cs (line 5) | function Cs(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u...
function Hc (line 5) | function Hc(e,t){var r=t.checked;return oe({},t,{defaultChecked:void 0,d...
function ev (line 5) | function ev(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checke...
function d0 (line 5) | function d0(e,t){t=t.checked,t!=null&&Mp(e,"checked",t,!1)}
function Vc (line 5) | function Vc(e,t){d0(e,t);var r=xn(t.value),n=t.type;if(r!=null)n==="numb...
function tv (line 5) | function tv(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
function jc (line 5) | function jc(e,t,r){(t!=="number"||Cs(e.ownerDocument)!==e)&&(r==null?e.d...
function Ya (line 5) | function Ya(e,t,r,n){if(e=e.options,t){t={};for(var a=0;a<r.length;a++)t...
function Wc (line 5) | function Wc(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(k(91));r...
function rv (line 5) | function rv(e,t){var r=t.value;if(r==null){if(r=t.children,t=t.defaultVa...
function f0 (line 5) | function f0(e,t){var r=xn(t.value),n=xn(t.defaultValue);r!=null&&(r=""+r...
function nv (line 5) | function nv(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!=...
function c0 (line 5) | function c0(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
function $c (line 5) | function $c(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?c0(t...
function Il (line 5) | function Il(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeT...
function m0 (line 5) | function m0(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typ...
function h0 (line 5) | function h0(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=...
function Gc (line 5) | function Gc(e,t){if(t){if(FI[e]&&(t.children!=null||t.dangerouslySetInne...
function qc (line 5) | function qc(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";swi...
function Ap (line 5) | function Ap(e){return e=e.target||e.srcElement||window,e.correspondingUs...
function av (line 5) | function av(e){if(e=jl(e)){if(typeof Kc!="function")throw Error(k(280));...
function g0 (line 5) | function g0(e){Ja?ba?ba.push(e):ba=[e]:Ja=e}
function y0 (line 5) | function y0(){if(Ja){var e=Ja,t=ba;if(ba=Ja=null,av(e),t)for(e=0;e<t.len...
function v0 (line 5) | function v0(e,t){return e(t)}
function x0 (line 5) | function x0(){}
function L0 (line 5) | function L0(e,t,r){if(gc)return e(t,r);gc=!0;try{return v0(e,t,r)}finall...
function kl (line 5) | function kl(e,t){var r=e.stateNode;if(r===null)return null;var n=Ys(r);i...
function DI (line 5) | function DI(e,t,r,n,a,o,l,u,i){var f=Array.prototype.slice.call(argument...
function AI (line 5) | function AI(e,t,r,n,a,o,l,u,i){hl=!1,Is=null,DI.apply(RI,arguments)}
function _I (line 5) | function _I(e,t,r,n,a,o,l,u,i){if(AI.apply(this,arguments),hl){if(hl){va...
function fa (line 5) | function fa(e){var t=e,r=e;if(e.alternate)for(;t.return;)t=t.return;else...
function w0 (line 5) | function w0(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.al...
function ov (line 5) | function ov(e){if(fa(e)!==e)throw Error(k(188))}
function zI (line 5) | function zI(e){var t=e.alternate;if(!t){if(t=fa(e),t===null)throw Error(...
function S0 (line 5) | function S0(e){return e=zI(e),e!==null?C0(e):null}
function C0 (line 5) | function C0(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;)...
function HI (line 5) | function HI(e){if(xr&&typeof xr.onCommitFiberRoot=="function")try{xr.onC...
function WI (line 5) | function WI(e){return e>>>=0,e===0?32:31-(VI(e)/jI|0)|0}
function cl (line 5) | function cl(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
function Es (line 5) | function Es(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,a=e.susp...
function $I (line 5) | function $I(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
function GI (line 5) | function GI(e,t){for(var r=e.suspendedLanes,n=e.pingedLanes,a=e.expirati...
function Yc (line 5) | function Yc(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?...
function E0 (line 5) | function E0(){var e=Yi;return Yi<<=1,!(Yi&4194240)&&(Yi=64),e}
function yc (line 5) | function yc(e){for(var t=[],r=0;31>r;r++)t.push(e);return t}
function Hl (line 5) | function Hl(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,...
function qI (line 5) | function qI(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLan...
function zp (line 5) | function zp(e,t){var r=e.entangledLanes|=t;for(e=e.entanglements;r;){var...
function T0 (line 5) | function T0(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}
function uv (line 5) | function uv(e,t){switch(e){case"focusin":case"focusout":fn=null;break;ca...
function nl (line 5) | function nl(e,t,r,n,a,o){return e===null||e.nativeEvent!==o?(e={blockedO...
function KI (line 5) | function KI(e,t,r,n,a){switch(t){case"focusin":return fn=nl(fn,e,t,r,n,a...
function A0 (line 5) | function A0(e){var t=ea(e.target);if(t!==null){var r=fa(t);if(r!==null){...
function ps (line 5) | function ps(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContaine...
function iv (line 5) | function iv(e,t,r){ps(e)&&r.delete(t)}
function XI (line 5) | function XI(){Jc=!1,fn!==null&&ps(fn)&&(fn=null),cn!==null&&ps(cn)&&(cn=...
function al (line 5) | function al(e,t){e.blockedOn===t&&(e.blockedOn=null,Jc||(Jc=!0,It.unstab...
function Tl (line 5) | function Tl(e){function t(a){return al(a,e)}if(0<bi.length){al(bi[0],e);...
function ZI (line 5) | function ZI(e,t,r,n){var a=j,o=eo.transition;eo.transition=null;try{j=1,...
function YI (line 5) | function YI(e,t,r,n){var a=j,o=eo.transition;eo.transition=null;try{j=4,...
function Bp (line 5) | function Bp(e,t,r,n){if(Ts){var a=bc(e,t,r,n);if(a===null)Ic(e,t,n,Ms,r)...
function bc (line 5) | function bc(e,t,r,n){if(Ms=null,e=Ap(n),e=ea(e),e!==null)if(t=fa(e),t===...
function _0 (line 5) | function _0(e){switch(e){case"cancel":case"click":case"close":case"conte...
function z0 (line 5) | function z0(){if(ms)return ms;var e,t=Op,r=t.length,n,a="value"in sn?sn....
function hs (line 5) | function hs(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&...
function es (line 5) | function es(){return!0}
function sv (line 5) | function sv(){return!1}
function kt (line 5) | function kt(e){function t(r,n,a,o,l){this._reactName=r,this._targetInst=...
function dk (line 5) | function dk(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
function Hp (line 5) | function Hp(){return dk}
function B0 (line 5) | function B0(e,t){switch(e){case"keyup":return Lk.indexOf(t.keyCode)!==-1...
function O0 (line 5) | function O0(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:n...
function Sk (line 5) | function Sk(e,t){switch(e){case"compositionend":return O0(t);case"keypre...
function Ck (line 5) | function Ck(e,t){if(Va)return e==="compositionend"||!Vp&&B0(e,t)?(e=z0()...
function hv (line 5) | function hv(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===...
function U0 (line 5) | function U0(e,t,r,n){g0(n),t=Fs(t,"onChange"),0<t.length&&(r=new Up("onC...
function kk (line 5) | function kk(e){Z0(e,0)}
function Xs (line 5) | function Xs(e){var t=$a(e);if(s0(t))return e}
function Pk (line 5) | function Pk(e,t){if(e==="change")return t}
function gv (line 5) | function gv(){yl&&(yl.detachEvent("onpropertychange",V0),Ml=yl=null)}
function V0 (line 5) | function V0(e){if(e.propertyName==="value"&&Xs(Ml)){var t=[];U0(t,Ml,e,A...
function Ek (line 5) | function Ek(e,t,r){e==="focusin"?(gv(),yl=t,Ml=r,yl.attachEvent("onprope...
function Tk (line 5) | function Tk(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")retu...
function Mk (line 5) | function Mk(e,t){if(e==="click")return Xs(t)}
function Fk (line 5) | function Fk(e,t){if(e==="input"||e==="change")return Xs(t)}
function Dk (line 5) | function Dk(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
function Fl (line 5) | function Fl(e,t){if(nr(e,t))return!0;if(typeof e!="object"||e===null||ty...
function yv (line 5) | function yv(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
function vv (line 5) | function vv(e,t){var r=yv(e);e=0;for(var n;r;){if(r.nodeType===3){if(n=e...
function j0 (line 5) | function j0(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType...
function W0 (line 5) | function W0(){for(var e=window,t=Cs();t instanceof e.HTMLIFrameElement;)...
function jp (line 5) | function jp(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
function Rk (line 5) | function Rk(e){var t=W0(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r...
function xv (line 5) | function xv(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.owne...
function ns (line 5) | function ns(e,t){var r={};return r[e.toLowerCase()]=t.toLowerCase(),r["W...
function Zs (line 5) | function Zs(e){if(Sc[e])return Sc[e];if(!Wa[e])return e;var t=Wa[e],r;fo...
function wn (line 5) | function wn(e,t){X0.set(e,t),da(t,[e])}
function Cv (line 5) | function Cv(e,t,r){var n=e.type||"unknown-event";e.currentTarget=r,_I(n,...
function Z0 (line 5) | function Z0(e,t){t=(t&4)!==0;for(var r=0;r<e.length;r++){var n=e[r],a=n....
function Y (line 5) | function Y(e,t){var r=t[lp];r===void 0&&(r=t[lp]=new Set);var n=e+"__bub...
function Cc (line 5) | function Cc(e,t,r){var n=0;t&&(n|=4),Y0(r,e,n,t)}
function Dl (line 5) | function Dl(e){if(!e[ls]){e[ls]=!0,a0.forEach(function(r){r!=="selection...
function Y0 (line 5) | function Y0(e,t,r,n){switch(_0(t)){case 1:var a=ZI;break;case 4:a=YI;bre...
function Ic (line 5) | function Ic(e,t,r,n,a){var o=n;if(!(t&1)&&!(t&2)&&n!==null)e:for(;;){if(...
function Rl (line 5) | function Rl(e,t,r){return{instance:e,listener:t,currentTarget:r}}
function Fs (line 5) | function Fs(e,t){for(var r=t+"Capture",n=[];e!==null;){var a=e,o=a.state...
function Oa (line 5) | function Oa(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5)...
function Iv (line 5) | function Iv(e,t,r,n,a){for(var o=t._reactName,l=[];r!==null&&r!==n;){var...
function kv (line 5) | function kv(e){return(typeof e=="string"?e:""+e).replace(zk,`
function us (line 6) | function us(e,t,r){if(t=kv(t),kv(e)!==t&&r)throw Error(k(425))}
function Ds (line 6) | function Ds(){}
function ap (line 6) | function ap(e,t){return e==="textarea"||e==="noscript"||typeof t.childre...
function Uk (line 6) | function Uk(e){setTimeout(function(){throw e})}
function kc (line 6) | function kc(e,t){var r=t,n=0;do{var a=r.nextSibling;if(e.removeChild(r),...
function mn (line 6) | function mn(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||...
function Ev (line 6) | function Ev(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){va...
function ea (line 6) | function ea(e){var t=e[vr];if(t)return t;for(var r=e.parentNode;r;){if(t...
function jl (line 6) | function jl(e){return e=e[vr]||e[Hr],!e||e.tag!==5&&e.tag!==6&&e.tag!==1...
function $a (line 6) | function $a(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(k(...
function Ys (line 6) | function Ys(e){return e[Al]||null}
function Sn (line 6) | function Sn(e){return{current:e}}
function J (line 6) | function J(e){0>Ga||(e.current=up[Ga],up[Ga]=null,Ga--)}
function q (line 6) | function q(e,t){Ga++,up[Ga]=e.current,e.current=t}
function ao (line 6) | function ao(e,t){var r=e.type.contextTypes;if(!r)return Ln;var n=e.state...
function ct (line 6) | function ct(e){return e=e.childContextTypes,e!=null}
function Rs (line 6) | function Rs(){J(ft),J(je)}
function Tv (line 6) | function Tv(e,t,r){if(je.current!==Ln)throw Error(k(168));q(je,t),q(ft,r)}
function J0 (line 6) | function J0(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.g...
function As (line 6) | function As(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
function Mv (line 6) | function Mv(e,t,r){var n=e.stateNode;if(!n)throw Error(k(169));r?(e=J0(e...
function b0 (line 6) | function b0(e){zr===null?zr=[e]:zr.push(e)}
function jk (line 6) | function jk(e){Js=!0,b0(e)}
function Cn (line 6) | function Cn(){if(!Pc&&zr!==null){Pc=!0;var e=0,t=j;try{var r=zr;for(j=1;...
function Jn (line 6) | function Jn(e,t){qa[Qa++]=zs,qa[Qa++]=_s,_s=e,zs=t}
function e1 (line 6) | function e1(e,t,r){Nt[Bt++]=Nr,Nt[Bt++]=Br,Nt[Bt++]=la,la=e;var n=Nr;e=B...
function Wp (line 6) | function Wp(e){e.return!==null&&(Jn(e,1),e1(e,1,0))}
function $p (line 6) | function $p(e){for(;e===_s;)_s=qa[--Qa],qa[Qa]=null,zs=qa[--Qa],qa[Qa]=n...
function t1 (line 6) | function t1(e,t){var r=Ot(5,null,null,0);r.elementType="DELETED",r.state...
function Fv (line 6) | function Fv(e,t){switch(e.tag){case 5:var r=e.type;return t=t.nodeType!=...
function ip (line 6) | function ip(e){return(e.mode&1)!==0&&(e.flags&128)===0}
function sp (line 6) | function sp(e){if(te){var t=St;if(t){var r=t;if(!Fv(e,t)){if(ip(e))throw...
function Dv (line 6) | function Dv(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13...
function is (line 6) | function is(e){if(e!==Ct)return!1;if(!te)return Dv(e),te=!0,!1;var t;if(...
function r1 (line 6) | function r1(){for(var e=St;e;)e=mn(e.nextSibling)}
function oo (line 6) | function oo(){St=Ct=null,te=!1}
function Gp (line 6) | function Gp(e){er===null?er=[e]:er.push(e)}
function Jt (line 6) | function Jt(e,t){if(e&&e.defaultProps){t=oe({},t),e=e.defaultProps;for(v...
function Qp (line 6) | function Qp(){qp=Ka=Bs=null}
function Kp (line 6) | function Kp(e){var t=Ns.current;J(Ns),e._currentValue=t}
function dp (line 6) | function dp(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)...
function to (line 6) | function to(e,t){Bs=e,qp=Ka=null,e=e.dependencies,e!==null&&e.firstConte...
function Ht (line 6) | function Ht(e){var t=e._currentValue;if(qp!==e)if(e={context:e,memoizedV...
function Xp (line 6) | function Xp(e){ta===null?ta=[e]:ta.push(e)}
function n1 (line 6) | function n1(e,t,r,n){var a=t.interleaved;return a===null?(r.next=r,Xp(t)...
function Vr (line 6) | function Vr(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t)...
function Zp (line 6) | function Zp(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
function a1 (line 6) | function a1(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
function Or (line 6) | function Or(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
function hn (line 6) | function hn(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.sh...
function gs (line 6) | function gs(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!...
function Rv (line 6) | function Rv(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.upd...
function Os (line 6) | function Os(e,t,r,n){var a=e.updateQueue;on=!1;var o=a.firstBaseUpdate,l...
function Av (line 6) | function Av(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.le...
function fp (line 6) | function fp(e,t,r,n){t=e.memoizedState,r=r(n,t),r=r==null?t:oe({},t,r),e...
function _v (line 6) | function _v(e,t,r,n,a,o,l){return e=e.stateNode,typeof e.shouldComponent...
function l1 (line 6) | function l1(e,t,r){var n=!1,a=Ln,o=t.contextType;return typeof o=="objec...
function zv (line 6) | function zv(e,t,r,n){e=t.state,typeof t.componentWillReceiveProps=="func...
function cp (line 6) | function cp(e,t,r,n){var a=e.stateNode;a.props=r,a.state=e.memoizedState...
function ll (line 6) | function ll(e,t,r){if(e=r.ref,e!==null&&typeof e!="function"&&typeof e!=...
function ss (line 6) | function ss(e,t){throw e=Object.prototype.toString.call(t),Error(k(31,e=...
function Nv (line 6) | function Nv(e){var t=e._init;return t(e._payload)}
function u1 (line 6) | function u1(e){function t(d,s){if(e){var c=d.deletions;c===null?(d.delet...
function ra (line 6) | function ra(e){if(e===Wl)throw Error(k(174));return e}
function Yp (line 6) | function Yp(e,t){switch(q(zl,t),q(_l,e),q(Lr,Wl),e=t.nodeType,e){case 9:...
function uo (line 6) | function uo(){J(Lr),J(_l),J(zl)}
function s1 (line 6) | function s1(e){ra(zl.current);var t=ra(Lr.current),r=$c(t,e.type);t!==r&...
function Jp (line 6) | function Jp(e){_l.current===e&&(J(Lr),J(_l))}
function Us (line 6) | function Us(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedSta...
function bp (line 6) | function bp(){for(var e=0;e<Ec.length;e++)Ec[e]._workInProgressVersionPr...
function Ue (line 6) | function Ue(){throw Error(k(321))}
function em (line 6) | function em(e,t){if(t===null)return!1;for(var r=0;r<t.length&&r<e.length...
function tm (line 6) | function tm(e,t,r,n,a,o){if(ua=o,ae=t,t.memoizedState=null,t.updateQueue...
function rm (line 6) | function rm(){var e=Nl!==0;return Nl=0,e}
function yr (line 6) | function yr(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
function Vt (line 6) | function Vt(){if(xe===null){var e=ae.alternate;e=e!==null?e.memoizedStat...
function Bl (line 6) | function Bl(e,t){return typeof t=="function"?t(e):t}
function Mc (line 6) | function Mc(e){var t=Vt(),r=t.queue;if(r===null)throw Error(k(311));r.la...
function Fc (line 6) | function Fc(e){var t=Vt(),r=t.queue;if(r===null)throw Error(k(311));r.la...
function d1 (line 6) | function d1(){}
function f1 (line 6) | function f1(e,t){var r=ae,n=Vt(),a=t(),o=!nr(n.memoizedState,a);if(o&&(n...
function c1 (line 6) | function c1(e,t,r){e.flags|=16384,e={getSnapshot:t,value:r},t=ae.updateQ...
function p1 (line 6) | function p1(e,t,r,n){t.value=r,t.getSnapshot=n,h1(t)&&g1(e)}
function m1 (line 6) | function m1(e,t,r){return r(function(){h1(t)&&g1(e)})}
function h1 (line 6) | function h1(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!nr(e,r...
function g1 (line 6) | function g1(e){var t=Vr(e,1);t!==null&&rr(t,e,1,-1)}
function Bv (line 6) | function Bv(e){var t=yr();return typeof e=="function"&&(e=e()),t.memoize...
function Ol (line 6) | function Ol(e,t,r,n){return e={tag:e,create:t,destroy:r,deps:n,next:null...
function y1 (line 6) | function y1(){return Vt().memoizedState}
function vs (line 6) | function vs(e,t,r,n){var a=yr();ae.flags|=e,a.memoizedState=Ol(1|t,r,voi...
function ed (line 6) | function ed(e,t,r,n){var a=Vt();n=n===void 0?null:n;var o=void 0;if(xe!=...
function Ov (line 6) | function Ov(e,t){return vs(8390656,8,e,t)}
function nm (line 6) | function nm(e,t){return ed(2048,8,e,t)}
function v1 (line 6) | function v1(e,t){return ed(4,2,e,t)}
function x1 (line 6) | function x1(e,t){return ed(4,4,e,t)}
function L1 (line 6) | function L1(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(...
function w1 (line 6) | function w1(e,t,r){return r=r!=null?r.concat([e]):null,ed(4,4,L1.bind(nu...
function am (line 6) | function am(){}
function S1 (line 6) | function S1(e,t){var r=Vt();t=t===void 0?null:t;var n=r.memoizedState;re...
function C1 (line 6) | function C1(e,t){var r=Vt();t=t===void 0?null:t;var n=r.memoizedState;re...
function I1 (line 6) | function I1(e,t,r){return ua&21?(nr(r,t)||(r=E0(),ae.lanes|=r,ia|=r,e.ba...
function Gk (line 6) | function Gk(e,t){var r=j;j=r!==0&&4>r?r:4,e(!0);var n=Tc.transition;Tc.t...
function k1 (line 6) | function k1(){return Vt().memoizedState}
function qk (line 6) | function qk(e,t,r){var n=yn(e);if(r={lane:n,action:r,hasEagerState:!1,ea...
function Qk (line 6) | function Qk(e,t,r){var n=yn(e),a={lane:n,action:r,hasEagerState:!1,eager...
function P1 (line 6) | function P1(e){var t=e.alternate;return e===ae||t!==null&&t===ae}
function E1 (line 6) | function E1(e,t){xl=Hs=!0;var r=e.pending;r===null?t.next=t:(t.next=r.ne...
function T1 (line 6) | function T1(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t....
function io (line 6) | function io(e,t){try{var r="",n=t;do r+=PI(n),n=n.return;while(n);var a=...
function Dc (line 8) | function Dc(e,t,r){return{value:e,source:null,stack:r??null,digest:t??nu...
function pp (line 8) | function pp(e,t){try{console.error(t.value)}catch(r){setTimeout(function...
function M1 (line 8) | function M1(e,t,r){r=Or(-1,r),r.tag=3,r.payload={element:null};var n=t.v...
function F1 (line 8) | function F1(e,t,r){r=Or(-1,r),r.tag=3;var n=e.type.getDerivedStateFromEr...
function Uv (line 8) | function Uv(e,t,r){var n=e.pingCache;if(n===null){n=e.pingCache=new Yk;v...
function Hv (line 8) | function Hv(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null...
function Vv (line 8) | function Vv(e,t,r,n,a){return e.mode&1?(e.flags|=65536,e.lanes=a,e):(e==...
function et (line 8) | function et(e,t,r,n){t.child=e===null?i1(t,null,r,n):lo(t,e.child,r,n)}
function jv (line 8) | function jv(e,t,r,n,a){r=r.render;var o=t.ref;return to(t,a),n=tm(e,t,r,...
function Wv (line 8) | function Wv(e,t,r,n,a){if(e===null){var o=r.type;return typeof o=="funct...
function D1 (line 8) | function D1(e,t,r,n,a){if(e!==null){var o=e.memoizedProps;if(Fl(o,n)&&e....
function R1 (line 8) | function R1(e,t,r){var n=t.pendingProps,a=n.children,o=e!==null?e.memoiz...
function A1 (line 8) | function A1(e,t){var r=t.ref;(e===null&&r!==null||e!==null&&e.ref!==r)&&...
function mp (line 8) | function mp(e,t,r,n,a){var o=ct(r)?oa:je.current;return o=ao(t,o),to(t,a...
function $v (line 8) | function $v(e,t,r,n,a){if(ct(r)){var o=!0;As(t)}else o=!1;if(to(t,a),t.s...
function hp (line 8) | function hp(e,t,r,n,a,o){A1(e,t);var l=(t.flags&128)!==0;if(!n&&!l)retur...
function _1 (line 8) | function _1(e){var t=e.stateNode;t.pendingContext?Tv(e,t.pendingContext,...
function Gv (line 8) | function Gv(e,t,r,n,a){return oo(),Gp(a),t.flags|=256,et(e,t,r,n),t.child}
function yp (line 8) | function yp(e){return{baseLanes:e,cachePool:null,transitions:null}}
function z1 (line 8) | function z1(e,t,r){var n=t.pendingProps,a=ne.current,o=!1,l=(t.flags&128...
function om (line 8) | function om(e,t){return t=nd({mode:"visible",children:t},e.mode,0,null),...
function ds (line 8) | function ds(e,t,r,n){return n!==null&&Gp(n),lo(t,e.child,null,r),e=om(t,...
function bk (line 8) | function bk(e,t,r,n,a,o,l){if(r)return t.flags&256?(t.flags&=-257,n=Dc(E...
function qv (line 8) | function qv(e,t,r){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),d...
function Rc (line 8) | function Rc(e,t,r,n,a){var o=e.memoizedState;o===null?e.memoizedState={i...
function N1 (line 8) | function N1(e,t,r){var n=t.pendingProps,a=n.revealOrder,o=n.tail;if(et(e...
function xs (line 8) | function xs(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=nu...
function jr (line 8) | function jr(e,t,r){if(e!==null&&(t.dependencies=e.dependencies),ia|=t.la...
function e2 (line 8) | function e2(e,t,r){switch(t.tag){case 3:_1(t),oo();break;case 5:s1(t);br...
function ul (line 8) | function ul(e,t){if(!te)switch(e.tailMode){case"hidden":t=e.tail;for(var...
function He (line 8) | function He(e){var t=e.alternate!==null&&e.alternate.child===e.child,r=0...
function t2 (line 8) | function t2(e,t,r){var n=t.pendingProps;switch($p(t),t.tag){case 2:case ...
function r2 (line 8) | function r2(e,t){switch($p(t),t.tag){case 1:return ct(t.type)&&Rs(),e=t....
function Xa (line 8) | function Xa(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(n...
function xp (line 8) | function xp(e,t,r){try{r()}catch(n){fe(e,t,n)}}
function a2 (line 8) | function a2(e,t){if(rp=Ts,e=W0(),jp(e)){if("selectionStart"in e)var r={s...
function Ll (line 8) | function Ll(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n...
function td (line 8) | function td(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==nul...
function Lp (line 8) | function Lp(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){...
function H1 (line 8) | function H1(e){var t=e.alternate;t!==null&&(e.alternate=null,H1(t)),e.ch...
function V1 (line 8) | function V1(e){return e.tag===5||e.tag===3||e.tag===4}
function Kv (line 8) | function Kv(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||V1(...
function wp (line 8) | function wp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeTyp...
function Sp (line 8) | function Sp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertB...
function nn (line 8) | function nn(e,t,r){for(r=r.child;r!==null;)j1(e,t,r),r=r.sibling}
function j1 (line 8) | function j1(e,t,r){if(xr&&typeof xr.onCommitFiberUnmount=="function")try...
function Xv (line 8) | function Xv(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r...
function Yt (line 8) | function Yt(e,t){var r=t.deletions;if(r!==null)for(var n=0;n<r.length;n+...
function W1 (line 8) | function W1(e,t){var r=e.alternate,n=e.flags;switch(e.tag){case 0:case 1...
function gr (line 8) | function gr(e){var t=e.flags;if(t&2){try{e:{for(var r=e.return;r!==null;...
function o2 (line 8) | function o2(e,t,r){D=e,$1(e,t,r)}
function $1 (line 8) | function $1(e,t,r){for(var n=(e.mode&1)!==0;D!==null;){var a=D,o=a.child...
function Zv (line 8) | function Zv(e){for(;D!==null;){var t=D;if(t.flags&8772){var r=t.alternat...
function Yv (line 8) | function Yv(e){for(;D!==null;){var t=D;if(t===e){D=null;break}var r=t.si...
function Jv (line 8) | function Jv(e){for(;D!==null;){var t=D;try{switch(t.tag){case 0:case 11:...
function tt (line 8) | function tt(){return B&6?me():Ls!==-1?Ls:Ls=me()}
function yn (line 8) | function yn(e){return e.mode&1?B&2&&De!==0?De&-De:Wk.transition!==null?(...
function rr (line 8) | function rr(e,t,r,n){if(50<Sl)throw Sl=0,Ip=null,Error(k(185));Hl(e,r,n)...
function pt (line 8) | function pt(e,t){var r=e.callbackNode;GI(e,t);var n=Es(e,e===ke?De:0);if...
function G1 (line 8) | function G1(e,t){if(Ls=-1,ws=0,B&6)throw Error(k(327));var r=e.callbackN...
function kp (line 8) | function kp(e,t){var r=wl;return e.current.memoizedState.isDehydrated&&(...
function Pp (line 8) | function Pp(e){st===null?st=e:st.push.apply(st,e)}
function u2 (line 8) | function u2(e){for(var t=e;;){if(t.flags&16384){var r=t.updateQueue;if(r...
function un (line 8) | function un(e,t){for(t&=~um,t&=~rd,e.suspendedLanes|=t,e.pingedLanes&=~t...
function bv (line 8) | function bv(e){if(B&6)throw Error(k(327));ro();var t=Es(e,0);if(!(t&1))r...
function sm (line 8) | function sm(e,t){var r=B;B|=1;try{return e(t)}finally{B=r,B===0&&(so=me(...
function sa (line 8) | function sa(e){dn!==null&&dn.tag===0&&!(B&6)&&ro();var t=B;B|=1;var r=Ut...
function dm (line 8) | function dm(){wt=Za.current,J(Za)}
function na (line 8) | function na(e,t){e.finishedWork=null,e.finishedLanes=0;var r=e.timeoutHa...
function q1 (line 8) | function q1(e,t){do{var r=ye;try{if(Qp(),ys.current=Vs,Hs){for(var n=ae....
function Q1 (line 8) | function Q1(){var e=js.current;return js.current=Vs,e===null?Vs:e}
function fm (line 8) | function fm(){(Le===0||Le===3||Le===2)&&(Le=4),ke===null||!(ia&268435455...
function Gs (line 8) | function Gs(e,t){var r=B;B|=2;var n=Q1();(ke!==e||De!==t)&&(_r=null,na(e...
function i2 (line 8) | function i2(){for(;ye!==null;)K1(ye)}
function s2 (line 8) | function s2(){for(;ye!==null&&!NI();)K1(ye)}
function K1 (line 8) | function K1(e){var t=Y1(e.alternate,e,wt);e.memoizedProps=e.pendingProps...
function X1 (line 8) | function X1(e){var t=e;do{var r=t.alternate;if(e=t.return,t.flags&32768)...
function bn (line 8) | function bn(e,t,r){var n=j,a=Ut.transition;try{Ut.transition=null,j=1,d2...
function d2 (line 8) | function d2(e,t,r,n){do ro();while(dn!==null);if(B&6)throw Error(k(327))...
function ro (line 8) | function ro(){if(dn!==null){var e=T0($s),t=Ut.transition,r=j;try{if(Ut.t...
function e0 (line 8) | function e0(e,t,r){t=io(r,t),t=M1(e,t,1),e=hn(e,t,1),t=tt(),e!==null&&(H...
function fe (line 8) | function fe(e,t,r){if(e.tag===3)e0(e,e,r);else for(;t!==null;){if(t.tag=...
function f2 (line 8) | function f2(e,t,r){var n=e.pingCache;n!==null&&n.delete(t),t=tt(),e.ping...
function Z1 (line 8) | function Z1(e,t){t===0&&(e.mode&1?(t=Ji,Ji<<=1,!(Ji&130023424)&&(Ji=4194...
function c2 (line 8) | function c2(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),Z1(e,r)}
function p2 (line 8) | function p2(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,a=e.mem...
function J1 (line 8) | function J1(e,t){return I0(e,t)}
function m2 (line 8) | function m2(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this....
function Ot (line 8) | function Ot(e,t,r,n){return new m2(e,t,r,n)}
function cm (line 8) | function cm(e){return e=e.prototype,!(!e||!e.isReactComponent)}
function h2 (line 8) | function h2(e){if(typeof e=="function")return cm(e)?1:0;if(e!=null){if(e...
function vn (line 8) | function vn(e,t){var r=e.alternate;return r===null?(r=Ot(e.tag,t,e.key,e...
function Ss (line 8) | function Ss(e,t,r,n,a,o){var l=2;if(n=e,typeof e=="function")cm(e)&&(l=1...
function aa (line 8) | function aa(e,t,r,n){return e=Ot(7,e,n,t),e.lanes=r,e}
function nd (line 8) | function nd(e,t,r,n){return e=Ot(22,e,n,t),e.elementType=u0,e.lanes=r,e....
function Ac (line 8) | function Ac(e,t,r){return e=Ot(6,e,null,t),e.lanes=r,e}
function _c (line 8) | function _c(e,t,r){return t=Ot(4,e.children!==null?e.children:[],e.key,t...
function g2 (line 8) | function g2(e,t,r,n,a){this.tag=t,this.containerInfo=e,this.finishedWork...
function pm (line 8) | function pm(e,t,r,n,a,o,l,u,i){return e=new g2(e,t,r,u,i),t===1?(t=1,o==...
function y2 (line 8) | function y2(e,t,r){var n=3<arguments.length&&arguments[3]!==void 0?argum...
function b1 (line 8) | function b1(e){if(!e)return Ln;e=e._reactInternals;e:{if(fa(e)!==e||e.ta...
function ex (line 8) | function ex(e,t,r,n,a,o,l,u,i){return e=pm(r,n,!0,e,a,o,l,u,i),e.context...
function ad (line 8) | function ad(e,t,r,n){var a=t.current,o=tt(),l=yn(a);return r=b1(r),t.con...
function qs (line 8) | function qs(e){if(e=e.current,!e.child)return null;switch(e.child.tag){c...
function t0 (line 8) | function t0(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var...
function mm (line 8) | function mm(e,t){t0(e,t),(e=e.alternate)&&t0(e,t)}
function v2 (line 8) | function v2(){return null}
function hm (line 8) | function hm(e){this._internalRoot=e}
function od (line 8) | function od(e){this._internalRoot=e}
function gm (line 8) | function gm(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function ld (line 8) | function ld(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function r0 (line 8) | function r0(){}
function x2 (line 8) | function x2(e,t,r,n,a){if(a){if(typeof n=="function"){var o=n;n=function...
function ud (line 8) | function ud(e,t,r,n,a){var o=r._reactRootContainer;if(o){var l=o;if(type...
function nx (line 8) | function nx(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __R...
function A2 (line 8) | function A2(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
function U2 (line 8) | function U2(e,t){var r=t(),n=z2({inst:{value:r,getSnapshot:t}}),a=n[0].i...
function Lm (line 8) | function Lm(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!_2(e,r...
function H2 (line 8) | function H2(e,t){return t()}
function Um (line 8) | function Um(e,t){var r=e.length;e.push(t);e:for(;0<r;){var n=r-1>>>1,a=e...
function or (line 8) | function or(e){return e.length===0?null:e[0]}
function xd (line 8) | function xd(e){if(e.length===0)return null;var t=e[0],r=e.pop();if(r!==t...
function yd (line 8) | function yd(e,t){var r=e.sortIndex-t.sortIndex;return r!==0?r:e.id-t.id}
function Hm (line 8) | function Hm(e){for(var t=or(Pn);t!==null;){if(t.callback===null)xd(Pn);e...
function Vm (line 8) | function Vm(e){if(Hu=!1,Hm(e),!ca)if(or(Cr)!==null)ca=!0,Wm(jm);else{var...
function jm (line 8) | function jm(e,t){ca=!1,Hu&&(Hu=!1,Ux(Vu),Vu=-1),Ld=!0;var r=We;try{for(H...
function jx (line 8) | function jx(){return!(Q.unstable_now()-Vx<Hx)}
function Bm (line 8) | function Bm(){if(vd!==null){var e=Q.unstable_now();Vx=e;var t=!0;try{t=v...
function Wm (line 8) | function Wm(e){vd=e,wd||(wd=!0,Uu())}
function $m (line 8) | function $m(e,t){Vu=Ox(function(){e(Q.unstable_now())},t)}
function P (line 8) | function P(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
function ka (line 8) | function ka(e,t){Oo(e,t),Oo(e+"Capture",t)}
function Oo (line 8) | function Oo(e,t){for(si[e]=t,e=0;e<t.length;e++)bL.add(t[e])}
function vP (line 8) | function vP(e){return ph.call(Qx,e)?!0:ph.call(qx,e)?!1:yP.test(e)?Qx[e]...
function xP (line 8) | function xP(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){c...
function LP (line 8) | function LP(e,t,r,n){if(t===null||typeof t>"u"||xP(e,t,r,n))return!0;if(...
function ot (line 8) | function ot(e,t,r,n,a,o,l){this.acceptsBooleans=t===2||t===3||t===4,this...
function lg (line 8) | function lg(e){return e[1].toUpperCase()}
function ug (line 8) | function ug(e,t,r,n){var a=ze.hasOwnProperty(t)?ze[t]:null;(a!==null?a.t...
function ju (line 8) | function ju(e){return e===null||typeof e!="object"?null:(e=Kx&&e[Kx]||e[...
function Zu (line 8) | function Zu(e){if(Gm===void 0)try{throw Error()}catch(r){var t=r.stack.t...
function Qm (line 9) | function Qm(e,t){if(!e||qm)return"";qm=!0;var r=Error.prepareStackTrace;...
function wP (line 12) | function wP(e){switch(e.tag){case 5:return Zu(e.type);case 16:return Zu(...
function yh (line 12) | function yh(e){if(e==null)return null;if(typeof e=="function")return e.d...
function SP (line 12) | function SP(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:r...
function jn (line 12) | function jn(e){switch(typeof e){case"boolean":case"number":case"string":...
function nw (line 12) | function nw(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="inp...
function CP (line 12) | function CP(e){var t=nw(e)?"checked":"value",r=Object.getOwnPropertyDesc...
function Cd (line 12) | function Cd(e){e._valueTracker||(e._valueTracker=CP(e))}
function aw (line 12) | function aw(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r...
function Yd (line 12) | function Yd(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u...
function vh (line 12) | function vh(e,t){var r=t.checked;return se({},t,{defaultChecked:void 0,d...
function Xx (line 12) | function Xx(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checke...
function ow (line 12) | function ow(e,t){t=t.checked,t!=null&&ug(e,"checked",t,!1)}
function xh (line 12) | function xh(e,t){ow(e,t);var r=jn(t.value),n=t.type;if(r!=null)n==="numb...
function Zx (line 12) | function Zx(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
function Lh (line 12) | function Lh(e,t,r){(t!=="number"||Yd(e.ownerDocument)!==e)&&(r==null?e.d...
function Ro (line 12) | function Ro(e,t,r,n){if(e=e.options,t){t={};for(var a=0;a<r.length;a++)t...
function wh (line 12) | function wh(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(P(91));r...
function Yx (line 12) | function Yx(e,t){var r=t.value;if(r==null){if(r=t.children,t=t.defaultVa...
function lw (line 12) | function lw(e,t){var r=jn(t.value),n=jn(t.defaultValue);r!=null&&(r=""+r...
function Jx (line 12) | function Jx(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!=...
function uw (line 12) | function uw(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
function Sh (line 12) | function Sh(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?uw(t...
function di (line 12) | function di(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeT...
function sw (line 12) | function sw(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typ...
function dw (line 12) | function dw(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=...
function Ch (line 12) | function Ch(e,t){if(t){if(kP[e]&&(t.children!=null||t.dangerouslySetInne...
function Ih (line 12) | function Ih(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";swi...
function fg (line 12) | function fg(e){return e=e.target||e.srcElement||window,e.correspondingUs...
function bx (line 12) | function bx(e){if(e=Ti(e)){if(typeof Ph!="function")throw Error(P(280));...
function fw (line 12) | function fw(e){Ao?_o?_o.push(e):_o=[e]:Ao=e}
function cw (line 12) | function cw(){if(Ao){var e=Ao,t=_o;if(_o=Ao=null,bx(e),t)for(e=0;e<t.len...
function pw (line 12) | function pw(e,t){return e(t)}
function mw (line 12) | function mw(){}
function hw (line 12) | function hw(e,t,r){if(Km)return e(t,r);Km=!0;try{return pw(e,t,r)}finall...
function fi (line 12) | function fi(e,t){var r=e.stateNode;if(r===null)return null;var n=Pf(r);i...
function PP (line 12) | function PP(e,t,r,n,a,o,l,u,i){var f=Array.prototype.slice.call(argument...
function TP (line 12) | function TP(e,t,r,n,a,o,l,u,i){ti=!1,Jd=null,PP.apply(EP,arguments)}
function MP (line 12) | function MP(e,t,r,n,a,o,l,u,i){if(TP.apply(this,arguments),ti){if(ti){va...
function Pa (line 12) | function Pa(e){var t=e,r=e;if(e.alternate)for(;t.return;)t=t.return;else...
function gw (line 12) | function gw(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.al...
function eL (line 12) | function eL(e){if(Pa(e)!==e)throw Error(P(188))}
function FP (line 12) | function FP(e){var t=e.alternate;if(!t){if(t=Pa(e),t===null)throw Error(...
function yw (line 12) | function yw(e){return e=FP(e),e!==null?vw(e):null}
function vw (line 12) | function vw(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;)...
function zP (line 12) | function zP(e){if(Er&&typeof Er.onCommitFiberRoot=="function")try{Er.onC...
function OP (line 12) | function OP(e){return e>>>=0,e===0?32:31-(NP(e)/BP|0)|0}
function Ju (line 12) | function Ju(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
function tf (line 12) | function tf(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,a=e.susp...
function UP (line 12) | function UP(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
function HP (line 12) | function HP(e,t){for(var r=e.suspendedLanes,n=e.pingedLanes,a=e.expirati...
function Mh (line 12) | function Mh(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?...
function Sw (line 12) | function Sw(){var e=kd;return kd<<=1,!(kd&4194240)&&(kd=64),e}
function Xm (line 12) | function Xm(e){for(var t=[],r=0;31>r;r++)t.push(e);return t}
function Pi (line 12) | function Pi(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,...
function VP (line 12) | function VP(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLan...
function pg (line 12) | function pg(e,t){var r=e.entangledLanes|=t;for(e=e.entanglements;r;){var...
function Cw (line 12) | function Cw(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}
function rL (line 12) | function rL(e,t){switch(e){case"focusin":case"focusout":_n=null;break;ca...
function Wu (line 12) | function Wu(e,t,r,n,a,o){return e===null||e.nativeEvent!==o?(e={blockedO...
function WP (line 12) | function WP(e,t,r,n,a){switch(t){case"focusin":return _n=Wu(_n,e,t,r,n,a...
function Tw (line 12) | function Tw(e){var t=ha(e.target);if(t!==null){var r=Pa(t);if(r!==null){...
function Vd (line 12) | function Vd(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContaine...
function nL (line 12) | function nL(e,t,r){Vd(e)&&r.delete(t)}
function $P (line 12) | function $P(){Fh=!1,_n!==null&&Vd(_n)&&(_n=null),zn!==null&&Vd(zn)&&(zn=...
function $u (line 12) | function $u(e,t){e.blockedOn===t&&(e.blockedOn=null,Fh||(Fh=!0,Ft.unstab...
function mi (line 12) | function mi(e){function t(a){return $u(a,e)}if(0<Ed.length){$u(Ed[0],e);...
function GP (line 12) | function GP(e,t,r,n){var a=W,o=zo.transition;zo.transition=null;try{W=1,...
function qP (line 12) | function qP(e,t,r,n){var a=W,o=zo.transition;zo.transition=null;try{W=4,...
function hg (line 12) | function hg(e,t,r,n){if(rf){var a=Dh(e,t,r,n);if(a===null)rh(e,t,n,nf,r)...
function Dh (line 12) | function Dh(e,t,r,n){if(nf=null,e=fg(n),e=ha(e),e!==null)if(t=Pa(e),t===...
function Mw (line 12) | function Mw(e){switch(e){case"cancel":case"click":case"close":case"conte...
function Fw (line 12) | function Fw(){if(jd)return jd;var e,t=gg,r=t.length,n,a="value"in Rn?Rn....
function Wd (line 12) | function Wd(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&...
function Td (line 12) | function Td(){return!0}
function aL (line 12) | function aL(){return!1}
function Dt (line 12) | function Dt(e){function t(r,n,a,o,l){this._reactName=r,this._targetInst=...
function o3 (line 12) | function o3(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
function vg (line 12) | function vg(){return o3}
function Rw (line 12) | function Rw(e,t){switch(e){case"keyup":return h3.indexOf(t.keyCode)!==-1...
function Aw (line 12) | function Aw(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:n...
function y3 (line 12) | function y3(e,t){switch(e){case"compositionend":return Aw(t);case"keypre...
function v3 (line 12) | function v3(e,t){if(So)return e==="compositionend"||!xg&&Rw(e,t)?(e=Fw()...
function dL (line 12) | function dL(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===...
function _w (line 12) | function _w(e,t,r,n){fw(n),t=af(t,"onChange"),0<t.length&&(r=new yg("onC...
function L3 (line 12) | function L3(e){Gw(e,0)}
function If (line 12) | function If(e){var t=ko(e);if(aw(t))return e}
function w3 (line 12) | function w3(e,t){if(e==="change")return t}
function fL (line 12) | function fL(){ni&&(ni.detachEvent("onpropertychange",Nw),hi=ni=null)}
function Nw (line 12) | function Nw(e){if(e.propertyName==="value"&&If(hi)){var t=[];_w(t,hi,e,f...
function S3 (line 12) | function S3(e,t,r){e==="focusin"?(fL(),ni=t,hi=r,ni.attachEvent("onprope...
function C3 (line 12) | function C3(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")retu...
function I3 (line 12) | function I3(e,t){if(e==="click")return If(t)}
function k3 (line 12) | function k3(e,t){if(e==="input"||e==="change")return If(t)}
function P3 (line 12) | function P3(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
function gi (line 12) | function gi(e,t){if(cr(e,t))return!0;if(typeof e!="object"||e===null||ty...
function cL (line 12) | function cL(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
function pL (line 12) | function pL(e,t){var r=cL(e);e=0;for(var n;r;){if(r.nodeType===3){if(n=e...
function Bw (line 12) | function Bw(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType...
function Ow (line 12) | function Ow(){for(var e=window,t=Yd();t instanceof e.HTMLIFrameElement;)...
function Lg (line 12) | function Lg(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
function E3 (line 12) | function E3(e){var t=Ow(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r...
function mL (line 12) | function mL(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.owne...
function Dd (line 12) | function Dd(e,t){var r={};return r[e.toLowerCase()]=t.toLowerCase(),r["W...
function kf (line 12) | function kf(e){if(eh[e])return eh[e];if(!Io[e])return e;var t=Io[e],r;fo...
function $n (line 12) | function $n(e,t){$w.set(e,t),ka(t,[e])}
function vL (line 12) | function vL(e,t,r){var n=e.type||"unknown-event";e.currentTarget=r,MP(n,...
function Gw (line 12) | function Gw(e,t){t=(t&4)!==0;for(var r=0;r<e.length;r++){var n=e[r],a=n....
function b (line 12) | function b(e,t){var r=t[Oh];r===void 0&&(r=t[Oh]=new Set);var n=e+"__bub...
function th (line 12) | function th(e,t,r){var n=0;t&&(n|=4),qw(r,e,n,t)}
function yi (line 12) | function yi(e){if(!e[_d]){e[_d]=!0,bL.forEach(function(r){r!=="selection...
function qw (line 12) | function qw(e,t,r,n){switch(Mw(t)){case 1:var a=GP;break;case 4:a=qP;bre...
function rh (line 12) | function rh(e,t,r,n,a){var o=n;if(!(t&1)&&!(t&2)&&n!==null)e:for(;;){if(...
function vi (line 12) | function vi(e,t,r){return{instance:e,listener:t,currentTarget:r}}
function af (line 12) | function af(e,t){for(var r=t+"Capture",n=[];e!==null;){var a=e,o=a.state...
function xo (line 12) | function xo(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5)...
function xL (line 12) | function xL(e,t,r,n,a){for(var o=t._reactName,l=[];r!==null&&r!==n;){var...
function LL (line 12) | function LL(e){return(typeof e=="string"?e:""+e).replace(F3,`
function zd (line 13) | function zd(e,t,r){if(t=LL(t),LL(e)!==t&&r)throw Error(P(425))}
function of (line 13) | function of(){}
function Nh (line 13) | function Nh(e,t){return e==="textarea"||e==="noscript"||typeof t.childre...
function _3 (line 13) | function _3(e){setTimeout(function(){throw e})}
function nh (line 13) | function nh(e,t){var r=t,n=0;do{var a=r.nextSibling;if(e.removeChild(r),...
function Bn (line 13) | function Bn(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||...
function SL (line 13) | function SL(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){va...
function ha (line 13) | function ha(e){var t=e[Pr];if(t)return t;for(var r=e.parentNode;r;){if(t...
function Ti (line 13) | function Ti(e){return e=e[Pr]||e[Zr],!e||e.tag!==5&&e.tag!==6&&e.tag!==1...
function ko (line 13) | function ko(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(P(...
function Pf (line 13) | function Pf(e){return e[xi]||null}
function Gn (line 13) | function Gn(e){return{current:e}}
function ee (line 13) | function ee(e){0>Po||(e.current=Uh[Po],Uh[Po]=null,Po--)}
function K (line 13) | function K(e,t){Po++,Uh[Po]=e.current,e.current=t}
function Uo (line 13) | function Uo(e,t){var r=e.type.contextTypes;if(!r)return Wn;var n=e.state...
function vt (line 13) | function vt(e){return e=e.childContextTypes,e!=null}
function lf (line 13) | function lf(){ee(yt),ee(Qe)}
function CL (line 13) | function CL(e,t,r){if(Qe.current!==Wn)throw Error(P(168));K(Qe,t),K(yt,r)}
function Qw (line 13) | function Qw(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.g...
function uf (line 13) | function uf(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
function IL (line 13) | function IL(e,t,r){var n=e.stateNode;if(!n)throw Error(P(169));r?(e=Qw(e...
function Kw (line 13) | function Kw(e){Gr===null?Gr=[e]:Gr.push(e)}
function B3 (line 13) | function B3(e){Ef=!0,Kw(e)}
function qn (line 13) | function qn(){if(!ah&&Gr!==null){ah=!0;var e=0,t=W;try{var r=Gr;for(W=1;...
function pa (line 13) | function pa(e,t){Eo[To++]=df,Eo[To++]=sf,sf=e,df=t}
function Xw (line 13) | function Xw(e,t,r){Wt[$t++]=qr,Wt[$t++]=Qr,Wt[$t++]=wa,wa=e;var n=qr;e=Q...
function wg (line 13) | function wg(e){e.return!==null&&(pa(e,1),Xw(e,1,0))}
function Sg (line 13) | function Sg(e){for(;e===sf;)sf=Eo[--To],Eo[To]=null,df=Eo[--To],Eo[To]=n...
function Zw (line 13) | function Zw(e,t){var r=Gt(5,null,null,0);r.elementType="DELETED",r.state...
function kL (line 13) | function kL(e,t){switch(e.tag){case 5:var r=e.type;return t=t.nodeType!=...
function Hh (line 13) | function Hh(e){return(e.mode&1)!==0&&(e.flags&128)===0}
function Vh (line 13) | function Vh(e){if(re){var t=Tt;if(t){var r=t;if(!kL(e,t)){if(Hh(e))throw...
function PL (line 13) | function PL(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13...
function Nd (line 13) | function Nd(e){if(e!==Mt)return!1;if(!re)return PL(e),re=!0,!1;var t;if(...
function Yw (line 13) | function Yw(){for(var e=Tt;e;)e=Bn(e.nextSibling)}
function Ho (line 13) | function Ho(){Tt=Mt=null,re=!1}
function Cg (line 13) | function Cg(e){sr===null?sr=[e]:sr.push(e)}
function ur (line 13) | function ur(e,t){if(e&&e.defaultProps){t=se({},t),e=e.defaultProps;for(v...
function kg (line 13) | function kg(){Ig=Mo=cf=null}
function Pg (line 13) | function Pg(e){var t=ff.current;ee(ff),e._currentValue=t}
function jh (line 13) | function jh(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)...
function No (line 13) | function No(e,t){cf=e,Ig=Mo=null,e=e.dependencies,e!==null&&e.firstConte...
function Qt (line 13) | function Qt(e){var t=e._currentValue;if(Ig!==e)if(e={context:e,memoizedV...
function Eg (line 13) | function Eg(e){ga===null?ga=[e]:ga.push(e)}
function Jw (line 13) | function Jw(e,t,r,n){var a=t.interleaved;return a===null?(r.next=r,Eg(t)...
function Yr (line 13) | function Yr(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t)...
function Tg (line 13) | function Tg(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
function bw (line 13) | function bw(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
function Kr (line 13) | function Kr(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
function On (line 13) | function On(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.sh...
function $d (line 13) | function $d(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!...
function EL (line 13) | function EL(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.upd...
function pf (line 13) | function pf(e,t,r,n){var a=e.updateQueue;Mn=!1;var o=a.firstBaseUpdate,l...
function TL (line 13) | function TL(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.le...
function Wh (line 13) | function Wh(e,t,r,n){t=e.memoizedState,r=r(n,t),r=r==null?t:se({},t,r),e...
function ML (line 13) | function ML(e,t,r,n,a,o,l){return e=e.stateNode,typeof e.shouldComponent...
function tS (line 13) | function tS(e,t,r){var n=!1,a=Wn,o=t.contextType;return typeof o=="objec...
function FL (line 13) | function FL(e,t,r,n){e=t.state,typeof t.componentWillReceiveProps=="func...
function $h (line 13) | function $h(e,t,r,n){var a=e.stateNode;a.props=r,a.state=e.memoizedState...
function qu (line 13) | function qu(e,t,r){if(e=r.ref,e!==null&&typeof e!="function"&&typeof e!=...
function Bd (line 13) | function Bd(e,t){throw e=Object.prototype.toString.call(t),Error(P(31,e=...
function DL (line 13) | function DL(e){var t=e._init;return t(e._payload)}
function rS (line 13) | function rS(e){function t(d,s){if(e){var c=d.deletions;c===null?(d.delet...
function ya (line 13) | function ya(e){if(e===Mi)throw Error(P(174));return e}
function Mg (line 13) | function Mg(e,t){switch(K(wi,t),K(Li,e),K(Tr,Mi),e=t.nodeType,e){case 9:...
function jo (line 13) | function jo(){ee(Tr),ee(Li),ee(wi)}
function aS (line 13) | function aS(e){ya(wi.current);var t=ya(Tr.current),r=Sh(t,e.type);t!==r&...
function Fg (line 13) | function Fg(e){Li.current===e&&(ee(Tr),ee(Li))}
function mf (line 13) | function mf(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedSta...
function Dg (line 13) | function Dg(){for(var e=0;e<oh.length;e++)oh[e]._workInProgressVersionPr...
function $e (line 13) | function $e(){throw Error(P(321))}
function Rg (line 13) | function Rg(e,t){if(t===null)return!1;for(var r=0;r<t.length&&r<e.length...
function Ag (line 13) | function Ag(e,t,r,n,a,o){if(Sa=o,ie=t,t.memoizedState=null,t.updateQueue...
function _g (line 13) | function _g(){var e=Si!==0;return Si=0,e}
function kr (line 13) | function kr(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
function Kt (line 13) | function Kt(){if(we===null){var e=ie.alternate;e=e!==null?e.memoizedStat...
function Ci (line 13) | function Ci(e,t){return typeof t=="function"?t(e):t}
function uh (line 13) | function uh(e){var t=Kt(),r=t.queue;if(r===null)throw Error(P(311));r.la...
function ih (line 13) | function ih(e){var t=Kt(),r=t.queue;if(r===null)throw Error(P(311));r.la...
function oS (line 13) | function oS(){}
function lS (line 13) | function lS(e,t){var r=ie,n=Kt(),a=t(),o=!cr(n.memoizedState,a);if(o&&(n...
function uS (line 13) | function uS(e,t,r){e.flags|=16384,e={getSnapshot:t,value:r},t=ie.updateQ...
function iS (line 13) | function iS(e,t,r,n){t.value=r,t.getSnapshot=n,dS(t)&&fS(e)}
function sS (line 13) | function sS(e,t,r){return r(function(){dS(t)&&fS(e)})}
function dS (line 13) | function dS(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!cr(e,r...
function fS (line 13) | function fS(e){var t=Yr(e,1);t!==null&&fr(t,e,1,-1)}
function RL (line 13) | function RL(e){var t=kr();return typeof e=="function"&&(e=e()),t.memoize...
function Ii (line 13) | function Ii(e,t,r,n){return e={tag:e,create:t,destroy:r,deps:n,next:null...
function cS (line 13) | function cS(){return Kt().memoizedState}
function qd (line 13) | function qd(e,t,r,n){var a=kr();ie.flags|=e,a.memoizedState=Ii(1|t,r,voi...
function Mf (line 13) | function Mf(e,t,r,n){var a=Kt();n=n===void 0?null:n;var o=void 0;if(we!=...
function AL (line 13) | function AL(e,t){return qd(8390656,8,e,t)}
function zg (line 13) | function zg(e,t){return Mf(2048,8,e,t)}
function pS (line 13) | function pS(e,t){return Mf(4,2,e,t)}
function mS (line 13) | function mS(e,t){return Mf(4,4,e,t)}
function hS (line 13) | function hS(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(...
function gS (line 13) | function gS(e,t,r){return r=r!=null?r.concat([e]):null,Mf(4,4,hS.bind(nu...
function Ng (line 13) | function Ng(){}
function yS (line 13) | function yS(e,t){var r=Kt();t=t===void 0?null:t;var n=r.memoizedState;re...
function vS (line 13) | function vS(e,t){var r=Kt();t=t===void 0?null:t;var n=r.memoizedState;re...
function xS (line 13) | function xS(e,t,r){return Sa&21?(cr(r,t)||(r=Sw(),ie.lanes|=r,Ca|=r,e.ba...
function H3 (line 13) | function H3(e,t){var r=W;W=r!==0&&4>r?r:4,e(!0);var n=lh.transition;lh.t...
function LS (line 13) | function LS(){return Kt().memoizedState}
function V3 (line 13) | function V3(e,t,r){var n=Hn(e);if(r={lane:n,action:r,hasEagerState:!1,ea...
function j3 (line 13) | function j3(e,t,r){var n=Hn(e),a={lane:n,action:r,hasEagerState:!1,eager...
function wS (line 13) | function wS(e){var t=e.alternate;return e===ie||t!==null&&t===ie}
function SS (line 13) | function SS(e,t){oi=hf=!0;var r=e.pending;r===null?t.next=t:(t.next=r.ne...
function CS (line 13) | function CS(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t....
function Wo (line 13) | function Wo(e,t){try{var r="",n=t;do r+=wP(n),n=n.return;while(n);var a=...
function sh (line 15) | function sh(e,t,r){return{value:e,source:null,stack:r??null,digest:t??nu...
function Gh (line 15) | function Gh(e,t){try{console.error(t.value)}catch(r){setTimeout(function...
function IS (line 15) | function IS(e,t,r){r=Kr(-1,r),r.tag=3,r.payload={element:null};var n=t.v...
function kS (line 15) | function kS(e,t,r){r=Kr(-1,r),r.tag=3;var n=e.type.getDerivedStateFromEr...
function _L (line 15) | function _L(e,t,r){var n=e.pingCache;if(n===null){n=e.pingCache=new q3;v...
function zL (line 15) | function zL(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null...
function NL (line 15) | function NL(e,t,r,n,a){return e.mode&1?(e.flags|=65536,e.lanes=a,e):(e==...
function nt (line 15) | function nt(e,t,r,n){t.child=e===null?nS(t,null,r,n):Vo(t,e.child,r,n)}
function BL (line 15) | function BL(e,t,r,n,a){r=r.render;var o=t.ref;return No(t,a),n=Ag(e,t,r,...
function OL (line 15) | function OL(e,t,r,n,a){if(e===null){var o=r.type;return typeof o=="funct...
function PS (line 15) | function PS(e,t,r,n,a){if(e!==null){var o=e.memoizedProps;if(gi(o,n)&&e....
function ES (line 15) | function ES(e,t,r){var n=t.pendingProps,a=n.children,o=e!==null?e.memoiz...
function TS (line 15) | function TS(e,t){var r=t.ref;(e===null&&r!==null||e!==null&&e.ref!==r)&&...
function qh (line 15) | function qh(e,t,r,n,a){var o=vt(r)?La:Qe.current;return o=Uo(t,o),No(t,a...
function UL (line 15) | function UL(e,t,r,n,a){if(vt(r)){var o=!0;uf(t)}else o=!1;if(No(t,a),t.s...
function Qh (line 15) | function Qh(e,t,r,n,a,o){TS(e,t);var l=(t.flags&128)!==0;if(!n&&!l)retur...
function MS (line 15) | function MS(e){var t=e.stateNode;t.pendingContext?CL(e,t.pendingContext,...
function HL (line 15) | function HL(e,t,r,n,a){return Ho(),Cg(a),t.flags|=256,nt(e,t,r,n),t.child}
function Xh (line 15) | function Xh(e){return{baseLanes:e,cachePool:null,transitions:null}}
function FS (line 15) | function FS(e,t,r){var n=t.pendingProps,a=ue.current,o=!1,l=(t.flags&128...
function Bg (line 15) | function Bg(e,t){return t=Rf({mode:"visible",children:t},e.mode,0,null),...
function Od (line 15) | function Od(e,t,r,n){return n!==null&&Cg(n),Vo(t,e.child,null,r),e=Bg(t,...
function K3 (line 15) | function K3(e,t,r,n,a,o,l){if(r)return t.flags&256?(t.flags&=-257,n=sh(E...
function VL (line 15) | function VL(e,t,r){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),j...
function dh (line 15) | function dh(e,t,r,n,a){var o=e.memoizedState;o===null?e.memoizedState={i...
function DS (line 15) | function DS(e,t,r){var n=t.pendingProps,a=n.revealOrder,o=n.tail;if(nt(e...
function Qd (line 15) | function Qd(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=nu...
function Jr (line 15) | function Jr(e,t,r){if(e!==null&&(t.dependencies=e.dependencies),Ca|=t.la...
function X3 (line 15) | function X3(e,t,r){switch(t.tag){case 3:MS(t),Ho();break;case 5:aS(t);br...
function Qu (line 15) | function Qu(e,t){if(!re)switch(e.tailMode){case"hidden":t=e.tail;for(var...
function Ge (line 15) | function Ge(e){var t=e.alternate!==null&&e.alternate.child===e.child,r=0...
function Z3 (line 15) | function Z3(e,t,r){var n=t.pendingProps;switch(Sg(t),t.tag){case 2:case ...
function Y3 (line 15) | function Y3(e,t){switch(Sg(t),t.tag){case 1:return vt(t.type)&&lf(),e=t....
function Fo (line 15) | function Fo(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(n...
function Yh (line 15) | function Yh(e,t,r){try{r()}catch(n){ce(e,t,n)}}
function b3 (line 15) | function b3(e,t){if(_h=rf,e=Ow(),Lg(e)){if("selectionStart"in e)var r={s...
function li (line 15) | function li(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n...
function Ff (line 15) | function Ff(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==nul...
function Jh (line 15) | function Jh(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){...
function zS (line 15) | function zS(e){var t=e.alternate;t!==null&&(e.alternate=null,zS(t)),e.ch...
function NS (line 15) | function NS(e){return e.tag===5||e.tag===3||e.tag===4}
function WL (line 15) | function WL(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||NS(...
function bh (line 15) | function bh(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeTyp...
function eg (line 15) | function eg(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertB...
function En (line 15) | function En(e,t,r){for(r=r.child;r!==null;)BS(e,t,r),r=r.sibling}
function BS (line 15) | function BS(e,t,r){if(Er&&typeof Er.onCommitFiberUnmount=="function")try...
function $L (line 15) | function $L(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r...
function lr (line 15) | function lr(e,t){var r=t.deletions;if(r!==null)for(var n=0;n<r.length;n+...
function OS (line 15) | function OS(e,t){var r=e.alternate,n=e.flags;switch(e.tag){case 0:case 1...
function Ir (line 15) | function Ir(e){var t=e.flags;if(t&2){try{e:{for(var r=e.return;r!==null;...
function eE (line 15) | function eE(e,t,r){R=e,US(e,t,r)}
function US (line 15) | function US(e,t,r){for(var n=(e.mode&1)!==0;R!==null;){var a=R,o=a.child...
function GL (line 15) | function GL(e){for(;R!==null;){var t=R;if(t.flags&8772){var r=t.alternat...
function qL (line 15) | function qL(e){for(;R!==null;){var t=R;if(t===e){R=null;break}var r=t.si...
function QL (line 15) | function QL(e){for(;R!==null;){var t=R;try{switch(t.tag){case 0:case 11:...
function at (line 15) | function at(){return U&6?ge():Kd!==-1?Kd:Kd=ge()}
function Hn (line 15) | function Hn(e){return e.mode&1?U&2&&_e!==0?_e&-_e:O3.transition!==null?(...
function fr (line 15) | function fr(e,t,r,n){if(50<ii)throw ii=0,rg=null,Error(P(185));Pi(e,r,n)...
function xt (line 15) | function xt(e,t){var r=e.callbackNode;HP(e,t);var n=tf(e,e===Te?_e:0);if...
function HS (line 15) | function HS(e,t){if(Kd=-1,Xd=0,U&6)throw Error(P(327));var r=e.callbackN...
function ng (line 15) | function ng(e,t){var r=ui;return e.current.memoizedState.isDehydrated&&(...
function ag (line 15) | function ag(e){ht===null?ht=e:ht.push.apply(ht,e)}
function rE (line 15) | function rE(e){for(var t=e;;){if(t.flags&16384){var r=t.updateQueue;if(r...
function Dn (line 15) | function Dn(e,t){for(t&=~Ug,t&=~Df,e.suspendedLanes|=t,e.pingedLanes&=~t...
function KL (line 15) | function KL(e){if(U&6)throw Error(P(327));Bo();var t=tf(e,0);if(!(t&1))r...
function Vg (line 15) | function Vg(e,t){var r=U;U|=1;try{return e(t)}finally{U=r,U===0&&($o=ge(...
function Ia (line 15) | function Ia(e){An!==null&&An.tag===0&&!(U&6)&&Bo();var t=U;U|=1;var r=qt...
function jg (line 15) | function jg(){Et=Do.current,ee(Do)}
function va (line 15) | function va(e,t){e.finishedWork=null,e.finishedLanes=0;var r=e.timeoutHa...
function VS (line 15) | function VS(e,t){do{var r=ve;try{if(kg(),Gd.current=gf,hf){for(var n=ie....
function jS (line 15) | function jS(){var e=yf.current;return yf.current=gf,e===null?gf:e}
function Wg (line 15) | function Wg(){(Se===0||Se===3||Se===2)&&(Se=4),Te===null||!(Ca&268435455...
function Lf (line 15) | function Lf(e,t){var r=U;U|=2;var n=jS();(Te!==e||_e!==t)&&($r=null,va(e...
function nE (line 15) | function nE(){for(;ve!==null;)WS(ve)}
function aE (line 15) | function aE(){for(;ve!==null&&!DP();)WS(ve)}
function WS (line 15) | function WS(e){var t=qS(e.alternate,e,Et);e.memoizedProps=e.pendingProps...
function $S (line 15) | function $S(e){var t=e;do{var r=t.alternate;if(e=t.return,t.flags&32768)...
function ma (line 15) | function ma(e,t,r){var n=W,a=qt.transition;try{qt.transition=null,W=1,oE...
function oE (line 15) | function oE(e,t,r,n){do Bo();while(An!==null);if(U&6)throw Error(P(327))...
function Bo (line 15) | function Bo(){if(An!==null){var e=Cw(xf),t=qt.transition,r=W;try{if(qt.t...
function XL (line 15) | function XL(e,t,r){t=Wo(r,t),t=IS(e,t,1),e=On(e,t,1),t=at(),e!==null&&(P...
function ce (line 15) | function ce(e,t,r){if(e.tag===3)XL(e,e,r);else for(;t!==null;){if(t.tag=...
function lE (line 15) | function lE(e,t,r){var n=e.pingCache;n!==null&&n.delete(t),t=at(),e.ping...
function GS (line 15) | function GS(e,t){t===0&&(e.mode&1?(t=Pd,Pd<<=1,!(Pd&130023424)&&(Pd=4194...
function uE (line 15) | function uE(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),GS(e,r)}
function iE (line 15) | function iE(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,a=e.mem...
function QS (line 15) | function QS(e,t){return xw(e,t)}
function sE (line 15) | function sE(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this....
function Gt (line 15) | function Gt(e,t,r,n){return new sE(e,t,r,n)}
function $g (line 15) | function $g(e){return e=e.prototype,!(!e||!e.isReactComponent)}
function dE (line 15) | function dE(e){if(typeof e=="function")return $g(e)?1:0;if(e!=null){if(e...
function Vn (line 15) | function Vn(e,t){var r=e.alternate;return r===null?(r=Gt(e.tag,t,e.key,e...
function Zd (line 15) | function Zd(e,t,r,n,a,o){var l=2;if(n=e,typeof e=="function")$g(e)&&(l=1...
function xa (line 15) | function xa(e,t,r,n){return e=Gt(7,e,n,t),e.lanes=r,e}
function Rf (line 15) | function Rf(e,t,r,n){return e=Gt(22,e,n,t),e.elementType=rw,e.lanes=r,e....
function fh (line 15) | function fh(e,t,r){return e=Gt(6,e,null,t),e.lanes=r,e}
function ch (line 15) | function ch(e,t,r){return t=Gt(4,e.children!==null?e.children:[],e.key,t...
function fE (line 15) | function fE(e,t,r,n,a){this.tag=t,this.containerInfo=e,this.finishedWork...
function Gg (line 15) | function Gg(e,t,r,n,a,o,l,u,i){return e=new fE(e,t,r,u,i),t===1?(t=1,o==...
function cE (line 15) | function cE(e,t,r){var n=3<arguments.length&&arguments[3]!==void 0?argum...
function KS (line 15) | function KS(e){if(!e)return Wn;e=e._reactInternals;e:{if(Pa(e)!==e||e.ta...
function XS (line 15) | function XS(e,t,r,n,a,o,l,u,i){return e=Gg(r,n,!0,e,a,o,l,u,i),e.context...
function Af (line 15) | function Af(e,t,r,n){var a=t.current,o=at(),l=Hn(a);return r=KS(r),t.con...
function wf (line 15) | function wf(e){if(e=e.current,!e.child)return null;switch(e.child.tag){c...
function ZL (line 15) | function ZL(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var...
function qg (line 15) | function qg(e,t){ZL(e,t),(e=e.alternate)&&ZL(e,t)}
function pE (line 15) | function pE(){return null}
function Qg (line 15) | function Qg(e){this._internalRoot=e}
function _f (line 15) | function _f(e){this._internalRoot=e}
function Kg (line 15) | function Kg(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function zf (line 15) | function zf(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function YL (line 15) | function YL(){}
function mE (line 15) | function mE(e,t,r,n,a){if(a){if(typeof n=="function"){var o=n;n=function...
function Nf (line 15) | function Nf(e,t,r,n,a){var o=r._reactRootContainer;if(o){var l=o;if(type...
function JS (line 15) | function JS(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __R...
function ky (line 15) | function ky(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+...
function Py (line 15) | function Py(){for(var e,t,r=0,n="";r<arguments.length;)(e=arguments[r++]...
function My (line 15) | function My(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+...
function Fy (line 15) | function Fy(){for(var e,t,r=0,n="",a=arguments.length;r<a;r++)(e=argumen...
function WC (line 15) | function WC(e){let t=GC(e),{conflictingClassGroups:r,conflictingClassGro...
function Ay (line 15) | function Ay(e,t){if(e.length===0)return t.classGroupId;let r=e[0],n=t.ne...
function $C (line 15) | function $C(e){if(Dy.test(e)){let t=Dy.exec(e)[1],r=t?.substring(0,t.ind...
function GC (line 15) | function GC(e){let{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]...
function Yf (line 15) | function Yf(e,t,r,n){e.forEach(a=>{if(typeof a=="string"){let o=a===""?t...
function Ry (line 15) | function Ry(e,t){let r=e;return t.split(Jf).forEach(n=>{r.nextPart.has(n...
function qC (line 15) | function qC(e){return e.isThemeGetter}
function QC (line 15) | function QC(e,t){return t?e.map(([r,n])=>{let a=n.map(o=>typeof o=="stri...
function KC (line 15) | function KC(e){if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=...
function XC (line 15) | function XC(e){let t=e.separator,r=t.length===1,n=t[0],a=t.length;return...
function ZC (line 15) | function ZC(e){if(e.length<=1)return e;let t=[],r=[];return e.forEach(n=...
function YC (line 15) | function YC(e){return{cache:KC(e.cacheSize),splitModifiers:XC(e),...WC(e)}}
function bC (line 15) | function bC(e,t){let{splitModifiers:r,getClassGroupId:n,getConflictingCl...
function eI (line 15) | function eI(){let e=0,t,r,n="";for(;e<arguments.length;)(t=arguments[e++...
function zy (line 15) | function zy(e){if(typeof e=="string")return e;let t,r="";for(let n=0;n<e...
function tI (line 15) | function tI(e,...t){let r,n,a,o=l;function l(i){let f=t.reduce((p,h)=>h(...
function Z (line 15) | function Z(e){let t=r=>r[e]||[];return t.isThemeGetter=!0,t}
function Ar (line 15) | function Ar(e){return Zn(e)||nI.has(e)||rI.test(e)}
function en (line 15) | function en(e){return Na(e,"length",gI)}
function Zn (line 15) | function Zn(e){return!!e&&!Number.isNaN(Number(e))}
function Oi (line 15) | function Oi(e){return Na(e,"number",Zn)}
function Zo (line 15) | function Zo(e){return!!e&&Number.isInteger(Number(e))}
function sI (line 15) | function sI(e){return e.endsWith("%")&&Zn(e.slice(0,-1))}
function A (line 15) | function A(e){return Ny.test(e)}
function tn (line 15) | function tn(e){return aI.test(e)}
function fI (line 15) | function fI(e){return Na(e,dI,By)}
function cI (line 15) | function cI(e){return Na(e,"position",By)}
function mI (line 15) | function mI(e){return Na(e,pI,vI)}
function hI (line 15) | function hI(e){return Na(e,"",yI)}
function Yo (line 15) | function Yo(){return!0}
function Na (line 15) | function Na(e,t,r){let n=Ny.exec(e);return n?n[1]?typeof t=="string"?n[1...
function gI (line 15) | function gI(e){return oI.test(e)&&!lI.test(e)}
function By (line 15) | function By(){return!1}
function yI (line 15) | function yI(e){return uI.test(e)}
function vI (line 15) | function vI(e){return iI.test(e)}
function xI (line 15) | function xI(){let e=Z("colors"),t=Z("spacing"),r=Z("blur"),n=Z("brightne...
function be (line 15) | function be(...e){return Oy(Fy(e))}
function mr (line 15) | function mr(){return mr=Object.assign?Object.assign.bind():function(e){f...
function C2 (line 15) | function C2(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}
function lx (line 15) | function lx(...e){return t=>e.forEach(r=>C2(r,t))}
function k2 (line 15) | function k2(e){return(0,le.isValidElement)(e)&&e.type===I2}
function P2 (line 15) | function P2(e,t){let r={...t};for(let n in t){let a=e[n],o=t[n];/^on[A-Z...
function Dm (line 15) | async function Dm(...e){let[t,r,n,a]=e,o=Sr({populateCache:!0,throwOnErr...
function X (line 15) | function X(){let pe=ar(f)?f(I().data):f;pe&&V!==-1&&(V=setTimeout(Be,pe))}
function Be (line 15) | function Be(){!I().error&&(p||w().isVisible())&&(h||w().isOnline())?Fa(_...
method data (line 15) | get data(){return Ce.data=!0,Ta}
method error (line 15) | get error(){return Ce.error=!0,Xn}
method isValidating (line 15) | get isValidating(){return Ce.isValidating=!0,Of}
method isLoading (line 15) | get isLoading(){return Ce.isLoading=!0,Fr}
function cP (line 15) | function cP(e,t){let r=new Uint8Array(t),n=0;for(let a of e)r.set(a,n),n...
function mP (line 16) | function mP({api:e,threadId:t,credentials:r,headers:n,body:a,onError:o})...
function zm (line 16) | function zm(){let[e,t]=(0,E.useState)(!0),[r,n]=(0,E.useState)(),[a,o]=(...
function hP (line 17) | function hP(e){return E.default.createElement("svg",{...e,xmlns:"http://...
FILE: public/chatwindowlegacy.js
function wC (line 1) | function wC(e){return e===null||typeof e!="object"?null:(e=bg&&e[bg]||e[...
function ka (line 1) | function ka(e,t,r){this.props=e,this.context=t,this.refs=ay,this.updater...
function oy (line 1) | function oy(){}
function Bf (line 1) | function Bf(e,t,r){this.props=e,this.context=t,this.refs=ay,this.updater...
function iy (line 1) | function iy(e,t,r){var n,a={},o=null,l=null;if(t!=null)for(n in t.ref!==...
function SC (line 1) | function SC(e,t){return{$$typeof:Ho,type:e.type,key:t,ref:e.ref,props:e....
function Hf (line 1) | function Hf(e){return typeof e=="object"&&e!==null&&e.$$typeof===Ho}
function CC (line 1) | function CC(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,fun...
function Nf (line 1) | function Nf(e,t){return typeof e=="object"&&e!==null&&e.key!=null?CC(""+...
function ki (line 1) | function ki(e,t,r,n,a){var o=typeof e;(o==="undefined"||o==="boolean")&&...
function Ii (line 1) | function Ii(e,t,r){if(e==null)return e;var n=[],a=0;return ki(e,n,"","",...
function IC (line 1) | function IC(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(...
function sy (line 1) | function sy(){throw Error("act(...) is not supported in production build...
function NC (line 1) | function NC(e){return e===null||typeof e!="object"?null:(e=cy&&e[cy]||e[...
function Pa (line 1) | function Pa(e,t,r){this.props=e,this.context=t,this.refs=yy,this.updater...
function vy (line 1) | function vy(){}
function jf (line 1) | function jf(e,t,r){this.props=e,this.context=t,this.refs=yy,this.updater...
function wy (line 1) | function wy(e,t,r){var n,a={},o=null,l=null;if(t!=null)for(n in t.ref!==...
function BC (line 1) | function BC(e,t){return{$$typeof:Vo,type:e.type,key:t,ref:e.ref,props:e....
function Gf (line 1) | function Gf(e){return typeof e=="object"&&e!==null&&e.$$typeof===Vo}
function OC (line 1) | function OC(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,fun...
function Vf (line 1) | function Vf(e,t){return typeof e=="object"&&e!==null&&e.key!=null?OC(""+...
function Ti (line 1) | function Ti(e,t,r,n,a){var o=typeof e;(o==="undefined"||o==="boolean")&&...
function Ei (line 1) | function Ei(e,t,r){if(e==null)return e;var n=[],a=0;return Ti(e,n,"","",...
function UC (line 1) | function UC(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(...
function Yf (line 1) | function Yf(e,t){var r=e.length;e.push(t);e:for(;0<r;){var n=r-1>>>1,a=e...
function Xt (line 1) | function Xt(e){return e.length===0?null:e[0]}
function Oi (line 1) | function Oi(e){if(e.length===0)return null;var t=e[0],r=e.pop();if(r!==t...
function Ni (line 1) | function Ni(e,t){var r=e.sortIndex-t.sortIndex;return r!==0?r:e.id-t.id}
function Jf (line 1) | function Jf(e){for(var t=Xt(tn);t!==null;){if(t.callback===null)Oi(tn);e...
function bf (line 1) | function bf(e){if(Go=!1,Jf(e),!Qn)if(Xt(mr)!==null)Qn=!0,tc(ec);else{var...
function ec (line 1) | function ec(e,t){Qn=!1,Go&&(Go=!1,Wy(qo),qo=-1),Ui=!0;var r=Be;try{for(J...
function qy (line 1) | function qy(){return!(W.unstable_now()-Gy<$y)}
function Xf (line 1) | function Xf(){if(Bi!==null){var e=W.unstable_now();Gy=e;var t=!0;try{t=B...
function tc (line 1) | function tc(e){Bi=e,Hi||(Hi=!0,$o())}
function rc (line 1) | function rc(e,t){qo=jy(function(){e(W.unstable_now())},t)}
function k (line 1) | function k(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
function la (line 1) | function la(e,t){Xa(e,t),Xa(e+"Capture",t)}
function Xa (line 1) | function Xa(e,t){for(ml[e]=t,e=0;e<t.length;e++)n0.add(t[e])}
function wI (line 1) | function wI(e){return kc.call(Yy,e)?!0:kc.call(Zy,e)?!1:LI.test(e)?Yy[e]...
function SI (line 1) | function SI(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){c...
function CI (line 1) | function CI(e,t,r,n){if(t===null||typeof t>"u"||SI(e,t,r,n))return!0;if(...
function et (line 1) | function et(e,t,r,n,a,o,l){this.acceptsBooleans=t===2||t===3||t===4,this...
function vp (line 1) | function vp(e){return e[1].toUpperCase()}
function xp (line 1) | function xp(e,t,r,n){var a=Re.hasOwnProperty(t)?Re[t]:null;(a!==null?a.t...
function Qo (line 1) | function Qo(e){return e===null||typeof e!="object"?null:(e=Jy&&e[Jy]||e[...
function tl (line 1) | function tl(e){if(nc===void 0)try{throw Error()}catch(r){var t=r.stack.t...
function oc (line 2) | function oc(e,t){if(!e||ac)return"";ac=!0;var r=Error.prepareStackTrace;...
function II (line 5) | function II(e){switch(e.tag){case 5:return tl(e.type);case 16:return tl(...
function Mc (line 5) | function Mc(e){if(e==null)return null;if(typeof e=="function")return e.d...
function kI (line 5) | function kI(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:r...
function vn (line 5) | function vn(e){switch(typeof e){case"boolean":case"number":case"string":...
function u0 (line 5) | function u0(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="inp...
function PI (line 5) | function PI(e){var t=u0(e)?"checked":"value",r=Object.getOwnPropertyDesc...
function ji (line 5) | function ji(e){e._valueTracker||(e._valueTracker=PI(e))}
function i0 (line 5) | function i0(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r...
function gs (line 5) | function gs(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u...
function Fc (line 5) | function Fc(e,t){var r=t.checked;return ae({},t,{defaultChecked:void 0,d...
function by (line 5) | function by(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checke...
function s0 (line 5) | function s0(e,t){t=t.checked,t!=null&&xp(e,"checked",t,!1)}
function Dc (line 5) | function Dc(e,t){s0(e,t);var r=vn(t.value),n=t.type;if(r!=null)n==="numb...
function ev (line 5) | function ev(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
function Rc (line 5) | function Rc(e,t,r){(t!=="number"||gs(e.ownerDocument)!==e)&&(r==null?e.d...
function Wa (line 5) | function Wa(e,t,r,n){if(e=e.options,t){t={};for(var a=0;a<r.length;a++)t...
function Ac (line 5) | function Ac(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(k(91));r...
function tv (line 5) | function tv(e,t){var r=t.value;if(r==null){if(r=t.children,t=t.defaultVa...
function d0 (line 5) | function d0(e,t){var r=vn(t.value),n=vn(t.defaultValue);r!=null&&(r=""+r...
function rv (line 5) | function rv(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!=...
function f0 (line 5) | function f0(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
function _c (line 5) | function _c(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?f0(t...
function hl (line 5) | function hl(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeT...
function p0 (line 5) | function p0(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typ...
function m0 (line 5) | function m0(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=...
function zc (line 5) | function zc(e,t){if(t){if(TI[e]&&(t.children!=null||t.dangerouslySetInne...
function Nc (line 5) | function Nc(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";swi...
function Cp (line 5) | function Cp(e){return e=e.target||e.srcElement||window,e.correspondingUs...
function nv (line 5) | function nv(e){if(e=Al(e)){if(typeof Oc!="function")throw Error(k(280));...
function h0 (line 5) | function h0(e){$a?Ga?Ga.push(e):Ga=[e]:$a=e}
function g0 (line 5) | function g0(){if($a){var e=$a,t=Ga;if(Ga=$a=null,nv(e),t)for(e=0;e<t.len...
function y0 (line 5) | function y0(e,t){return e(t)}
function v0 (line 5) | function v0(){}
function x0 (line 5) | function x0(e,t,r){if(lc)return e(t,r);lc=!0;try{return y0(e,t,r)}finall...
function gl (line 5) | function gl(e,t){var r=e.stateNode;if(r===null)return null;var n=$s(r);i...
function MI (line 5) | function MI(e,t,r,n,a,o,l,u,i){var f=Array.prototype.slice.call(argument...
function DI (line 5) | function DI(e,t,r,n,a,o,l,u,i){ll=!1,ys=null,MI.apply(FI,arguments)}
function RI (line 5) | function RI(e,t,r,n,a,o,l,u,i){if(DI.apply(this,arguments),ll){if(ll){va...
function ua (line 5) | function ua(e){var t=e,r=e;if(e.alternate)for(;t.return;)t=t.return;else...
function L0 (line 5) | function L0(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.al...
function av (line 5) | function av(e){if(ua(e)!==e)throw Error(k(188))}
function AI (line 5) | function AI(e){var t=e.alternate;if(!t){if(t=ua(e),t===null)throw Error(...
function w0 (line 5) | function w0(e){return e=AI(e),e!==null?S0(e):null}
function S0 (line 5) | function S0(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;)...
function OI (line 5) | function OI(e){if(vr&&typeof vr.onCommitFiberRoot=="function")try{vr.onC...
function VI (line 5) | function VI(e){return e>>>=0,e===0?32:31-(UI(e)/HI|0)|0}
function nl (line 5) | function nl(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
function Ls (line 5) | function Ls(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,a=e.susp...
function jI (line 5) | function jI(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
function WI (line 5) | function WI(e,t){for(var r=e.suspendedLanes,n=e.pingedLanes,a=e.expirati...
function Vc (line 5) | function Vc(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?...
function P0 (line 5) | function P0(){var e=$i;return $i<<=1,!($i&4194240)&&($i=64),e}
function uc (line 5) | function uc(e){for(var t=[],r=0;31>r;r++)t.push(e);return t}
function Dl (line 5) | function Dl(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,...
function $I (line 5) | function $I(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLan...
function kp (line 5) | function kp(e,t){var r=e.entangledLanes|=t;for(e=e.entanglements;r;){var...
function E0 (line 5) | function E0(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}
function lv (line 5) | function lv(e,t){switch(e){case"focusin":case"focusout":dn=null;break;ca...
function Ko (line 5) | function Ko(e,t,r,n,a,o){return e===null||e.nativeEvent!==o?(e={blockedO...
function qI (line 5) | function qI(e,t,r,n,a){switch(t){case"focusin":return dn=Ko(dn,e,t,r,n,a...
function R0 (line 5) | function R0(e){var t=Zn(e.target);if(t!==null){var r=ua(t);if(r!==null){...
function ls (line 5) | function ls(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContaine...
function uv (line 5) | function uv(e,t,r){ls(e)&&r.delete(t)}
function QI (line 5) | function QI(){jc=!1,dn!==null&&ls(dn)&&(dn=null),fn!==null&&ls(fn)&&(fn=...
function Xo (line 5) | function Xo(e,t){e.blockedOn===t&&(e.blockedOn=null,jc||(jc=!0,Lt.unstab...
function xl (line 5) | function xl(e){function t(a){return Xo(a,e)}if(0<qi.length){Xo(qi[0],e);...
function KI (line 5) | function KI(e,t,r,n){var a=V,o=qa.transition;qa.transition=null;try{V=1,...
function XI (line 5) | function XI(e,t,r,n){var a=V,o=qa.transition;qa.transition=null;try{V=4,...
function Ep (line 5) | function Ep(e,t,r,n){if(ws){var a=Wc(e,t,r,n);if(a===null)mc(e,t,n,Ss,r)...
function Wc (line 5) | function Wc(e,t,r,n){if(Ss=null,e=Cp(n),e=Zn(e),e!==null)if(t=ua(e),t===...
function A0 (line 5) | function A0(e){switch(e){case"cancel":case"click":case"close":case"conte...
function _0 (line 5) | function _0(){if(us)return us;var e,t=Tp,r=t.length,n,a="value"in un?un....
function is (line 5) | function is(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&...
function Qi (line 5) | function Qi(){return!0}
function iv (line 5) | function iv(){return!1}
function wt (line 5) | function wt(e){function t(r,n,a,o,l){this._reactName=r,this._targetInst=...
function ik (line 5) | function ik(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
function Fp (line 5) | function Fp(){return ik}
function N0 (line 5) | function N0(e,t){switch(e){case"keyup":return vk.indexOf(t.keyCode)!==-1...
function B0 (line 5) | function B0(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:n...
function Lk (line 5) | function Lk(e,t){switch(e){case"compositionend":return B0(t);case"keypre...
function wk (line 5) | function wk(e,t){if(Aa)return e==="compositionend"||!Dp&&N0(e,t)?(e=_0()...
function mv (line 5) | function mv(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===...
function O0 (line 5) | function O0(e,t,r,n){h0(n),t=Cs(t,"onChange"),0<t.length&&(r=new Mp("onC...
function Ck (line 5) | function Ck(e){X0(e,0)}
function js (line 5) | function js(e){var t=Na(e);if(i0(t))return e}
function Ik (line 5) | function Ik(e,t){if(e==="change")return t}
function hv (line 5) | function hv(){il&&(il.detachEvent("onpropertychange",H0),Ll=il=null)}
function H0 (line 5) | function H0(e){if(e.propertyName==="value"&&js(Ll)){var t=[];O0(t,Ll,e,C...
function kk (line 5) | function kk(e,t,r){e==="focusin"?(hv(),il=t,Ll=r,il.attachEvent("onprope...
function Pk (line 5) | function Pk(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")retu...
function Ek (line 5) | function Ek(e,t){if(e==="click")return js(t)}
function Tk (line 5) | function Tk(e,t){if(e==="input"||e==="change")return js(t)}
function Mk (line 5) | function Mk(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
function wl (line 5) | function wl(e,t){if(rr(e,t))return!0;if(typeof e!="object"||e===null||ty...
function gv (line 5) | function gv(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
function yv (line 5) | function yv(e,t){var r=gv(e);e=0;for(var n;r;){if(r.nodeType===3){if(n=e...
function V0 (line 5) | function V0(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType...
function j0 (line 5) | function j0(){for(var e=window,t=gs();t instanceof e.HTMLIFrameElement;)...
function Rp (line 5) | function Rp(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
function Fk (line 5) | function Fk(e){var t=j0(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r...
function vv (line 5) | function vv(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.owne...
function Zi (line 5) | function Zi(e,t){var r={};return r[e.toLowerCase()]=t.toLowerCase(),r["W...
function Ws (line 5) | function Ws(e){if(cc[e])return cc[e];if(!za[e])return e;var t=za[e],r;fo...
function Ln (line 5) | function Ln(e,t){K0.set(e,t),la(t,[e])}
function Sv (line 5) | function Sv(e,t,r){var n=e.type||"unknown-event";e.currentTarget=r,RI(n,...
function X0 (line 5) | function X0(e,t){t=(t&4)!==0;for(var r=0;r<e.length;r++){var n=e[r],a=n....
function Z (line 5) | function Z(e,t){var r=t[Zc];r===void 0&&(r=t[Zc]=new Set);var n=e+"__bub...
function pc (line 5) | function pc(e,t,r){var n=0;t&&(n|=4),Z0(r,e,n,t)}
function Sl (line 5) | function Sl(e){if(!e[bi]){e[bi]=!0,n0.forEach(function(r){r!=="selection...
function Z0 (line 5) | function Z0(e,t,r,n){switch(A0(t)){case 1:var a=KI;break;case 4:a=XI;bre...
function mc (line 5) | function mc(e,t,r,n,a){var o=n;if(!(t&1)&&!(t&2)&&n!==null)e:for(;;){if(...
function Cl (line 5) | function Cl(e,t,r){return{instance:e,listener:t,currentTarget:r}}
function Cs (line 5) | function Cs(e,t){for(var r=t+"Capture",n=[];e!==null;){var a=e,o=a.state...
function Fa (line 5) | function Fa(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5)...
function Cv (line 5) | function Cv(e,t,r,n,a){for(var o=t._reactName,l=[];r!==null&&r!==n;){var...
function Iv (line 5) | function Iv(e){return(typeof e=="string"?e:""+e).replace(Ak,`
function es (line 6) | function es(e,t,r){if(t=Iv(t),Iv(e)!==t&&r)throw Error(k(425))}
function Is (line 6) | function Is(){}
function Kc (line 6) | function Kc(e,t){return e==="textarea"||e==="noscript"||typeof t.childre...
function Bk (line 6) | function Bk(e){setTimeout(function(){throw e})}
function hc (line 6) | function hc(e,t){var r=t,n=0;do{var a=r.nextSibling;if(e.removeChild(r),...
function pn (line 6) | function pn(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||...
function Pv (line 6) | function Pv(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){va...
function Zn (line 6) | function Zn(e){var t=e[yr];if(t)return t;for(var r=e.parentNode;r;){if(t...
function Al (line 6) | function Al(e){return e=e[yr]||e[Or],!e||e.tag!==5&&e.tag!==6&&e.tag!==1...
function Na (line 6) | function Na(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(k(...
function $s (line 6) | function $s(e){return e[Il]||null}
function wn (line 6) | function wn(e){return{current:e}}
function Y (line 6) | function Y(e){0>Ba||(e.current=Yc[Ba],Yc[Ba]=null,Ba--)}
function $ (line 6) | function $(e,t){Ba++,Yc[Ba]=e.current,e.current=t}
function Za (line 6) | function Za(e,t){var r=e.type.contextTypes;if(!r)return xn;var n=e.state...
function it (line 6) | function it(e){return e=e.childContextTypes,e!=null}
function ks (line 6) | function ks(){Y(ut),Y(Ve)}
function Ev (line 6) | function Ev(e,t,r){if(Ve.current!==xn)throw Error(k(168));$(Ve,t),$(ut,r)}
function Y0 (line 6) | function Y0(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.g...
function Ps (line 6) | function Ps(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
function Tv (line 6) | function Tv(e,t,r){var n=e.stateNode;if(!n)throw Error(k(169));r?(e=Y0(e...
function J0 (line 6) | function J0(e){Ar===null?Ar=[e]:Ar.push(e)}
function Hk (line 6) | function Hk(e){Gs=!0,J0(e)}
function Sn (line 6) | function Sn(){if(!gc&&Ar!==null){gc=!0;var e=0,t=V;try{var r=Ar;for(V=1;...
function Kn (line 6) | function Kn(e,t){Oa[Ua++]=Ts,Oa[Ua++]=Es,Es=e,Ts=t}
function b0 (line 6) | function b0(e,t,r){_t[zt++]=_r,_t[zt++]=zr,_t[zt++]=ra,ra=e;var n=_r;e=z...
function Ap (line 6) | function Ap(e){e.return!==null&&(Kn(e,1),b0(e,1,0))}
function _p (line 6) | function _p(e){for(;e===Es;)Es=Oa[--Ua],Oa[Ua]=null,Ts=Oa[--Ua],Oa[Ua]=n...
function e1 (line 6) | function e1(e,t){var r=Nt(5,null,null,0);r.elementType="DELETED",r.state...
function Mv (line 6) | function Mv(e,t){switch(e.tag){case 5:var r=e.type;return t=t.nodeType!=...
function Jc (line 6) | function Jc(e){return(e.mode&1)!==0&&(e.flags&128)===0}
function bc (line 6) | function bc(e){if(ee){var t=vt;if(t){var r=t;if(!Mv(e,t)){if(Jc(e))throw...
function Fv (line 6) | function Fv(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13...
function ts (line 6) | function ts(e){if(e!==xt)return!1;if(!ee)return Fv(e),ee=!0,!1;var t;if(...
function t1 (line 6) | function t1(){for(var e=vt;e;)e=pn(e.nextSibling)}
function Ya (line 6) | function Ya(){vt=xt=null,ee=!1}
function zp (line 6) | function zp(e){bt===null?bt=[e]:bt.push(e)}
function Yt (line 6) | function Yt(e,t){if(e&&e.defaultProps){t=ae({},t),e=e.defaultProps;for(v...
function Bp (line 6) | function Bp(){Np=Ha=Fs=null}
function Op (line 6) | function Op(e){var t=Ms.current;Y(Ms),e._currentValue=t}
function ep (line 6) | function ep(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)...
function Qa (line 6) | function Qa(e,t){Fs=e,Np=Ha=null,e=e.dependencies,e!==null&&e.firstConte...
function Ot (line 6) | function Ot(e){var t=e._currentValue;if(Np!==e)if(e={context:e,memoizedV...
function Up (line 6) | function Up(e){Yn===null?Yn=[e]:Yn.push(e)}
function r1 (line 6) | function r1(e,t,r,n){var a=t.interleaved;return a===null?(r.next=r,Up(t)...
function Ur (line 6) | function Ur(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t)...
function Hp (line 6) | function Hp(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
function n1 (line 6) | function n1(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
function Nr (line 6) | function Nr(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
function mn (line 6) | function mn(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.sh...
function ss (line 6) | function ss(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!...
function Dv (line 6) | function Dv(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.upd...
function Ds (line 6) | function Ds(e,t,r,n){var a=e.updateQueue;an=!1;var o=a.firstBaseUpdate,l...
function Rv (line 6) | function Rv(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.le...
function tp (line 6) | function tp(e,t,r,n){t=e.memoizedState,r=r(n,t),r=r==null?t:ae({},t,r),e...
function Av (line 6) | function Av(e,t,r,n,a,o,l){return e=e.stateNode,typeof e.shouldComponent...
function o1 (line 6) | function o1(e,t,r){var n=!1,a=xn,o=t.contextType;return typeof o=="objec...
function _v (line 6) | function _v(e,t,r,n){e=t.state,typeof t.componentWillReceiveProps=="func...
function rp (line 6) | function rp(e,t,r,n){var a=e.stateNode;a.props=r,a.state=e.memoizedState...
function Yo (line 6) | function Yo(e,t,r){if(e=r.ref,e!==null&&typeof e!="function"&&typeof e!=...
function rs (line 6) | function rs(e,t){throw e=Object.prototype.toString.call(t),Error(k(31,e=...
function zv (line 6) | function zv(e){var t=e._init;return t(e._payload)}
function l1 (line 6) | function l1(e){function t(d,s){if(e){var c=d.deletions;c===null?(d.delet...
function Jn (line 6) | function Jn(e){if(e===_l)throw Error(k(174));return e}
function Vp (line 6) | function Vp(e,t){switch($(Pl,t),$(kl,e),$(xr,_l),e=t.nodeType,e){case 9:...
function ba (line 6) | function ba(){Y(xr),Y(kl),Y(Pl)}
function i1 (line 6) | function i1(e){Jn(Pl.current);var t=Jn(xr.current),r=_c(t,e.type);t!==r&...
function jp (line 6) | function jp(e){kl.current===e&&(Y(xr),Y(kl))}
function Rs (line 6) | function Rs(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedSta...
function Wp (line 6) | function Wp(){for(var e=0;e<yc.length;e++)yc[e]._workInProgressVersionPr...
function Oe (line 6) | function Oe(){throw Error(k(321))}
function $p (line 6) | function $p(e,t){if(t===null)return!1;for(var r=0;r<t.length&&r<e.length...
function Gp (line 6) | function Gp(e,t,r,n,a,o){if(na=o,ne=t,t.memoizedState=null,t.updateQueue...
function qp (line 6) | function qp(){var e=El!==0;return El=0,e}
function gr (line 6) | function gr(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
function Ut (line 6) | function Ut(){if(Le===null){var e=ne.alternate;e=e!==null?e.memoizedStat...
function Tl (line 6) | function Tl(e,t){return typeof t=="function"?t(e):t}
function xc (line 6) | function xc(e){var t=Ut(),r=t.queue;if(r===null)throw Error(k(311));r.la...
function Lc (line 6) | function Lc(e){var t=Ut(),r=t.queue;if(r===null)throw Error(k(311));r.la...
function s1 (line 6) | function s1(){}
function d1 (line 6) | function d1(e,t){var r=ne,n=Ut(),a=t(),o=!rr(n.memoizedState,a);if(o&&(n...
function f1 (line 6) | function f1(e,t,r){e.flags|=16384,e={getSnapshot:t,value:r},t=ne.updateQ...
function c1 (line 6) | function c1(e,t,r,n){t.value=r,t.getSnapshot=n,m1(t)&&h1(e)}
function p1 (line 6) | function p1(e,t,r){return r(function(){m1(t)&&h1(e)})}
function m1 (line 6) | function m1(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!rr(e,r...
function h1 (line 6) | function h1(e){var t=Ur(e,1);t!==null&&tr(t,e,1,-1)}
function Nv (line 6) | function Nv(e){var t=gr();return typeof e=="function"&&(e=e()),t.memoize...
function Ml (line 6) | function Ml(e,t,r,n){return e={tag:e,create:t,destroy:r,deps:n,next:null...
function g1 (line 6) | function g1(){return Ut().memoizedState}
function fs (line 6) | function fs(e,t,r,n){var a=gr();ne.flags|=e,a.memoizedState=Ml(1|t,r,voi...
function Qs (line 6) | function Qs(e,t,r,n){var a=Ut();n=n===void 0?null:n;var o=void 0;if(Le!=...
function Bv (line 6) | function Bv(e,t){return fs(8390656,8,e,t)}
function Qp (line 6) | function Qp(e,t){return Qs(2048,8,e,t)}
function y1 (line 6) | function y1(e,t){return Qs(4,2,e,t)}
function v1 (line 6) | function v1(e,t){return Qs(4,4,e,t)}
function x1 (line 6) | function x1(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(...
function L1 (line 6) | function L1(e,t,r){return r=r!=null?r.concat([e]):null,Qs(4,4,x1.bind(nu...
function Kp (line 6) | function Kp(){}
function w1 (line 6) | function w1(e,t){var r=Ut();t=t===void 0?null:t;var n=r.memoizedState;re...
function S1 (line 6) | function S1(e,t){var r=Ut();t=t===void 0?null:t;var n=r.memoizedState;re...
function C1 (line 6) | function C1(e,t,r){return na&21?(rr(r,t)||(r=P0(),ne.lanes|=r,aa|=r,e.ba...
function Wk (line 6) | function Wk(e,t){var r=V;V=r!==0&&4>r?r:4,e(!0);var n=vc.transition;vc.t...
function I1 (line 6) | function I1(){return Ut().memoizedState}
function $k (line 6) | function $k(e,t,r){var n=gn(e);if(r={lane:n,action:r,hasEagerState:!1,ea...
function Gk (line 6) | function Gk(e,t,r){var n=gn(e),a={lane:n,action:r,hasEagerState:!1,eager...
function k1 (line 6) | function k1(e){var t=e.alternate;return e===ne||t!==null&&t===ne}
function P1 (line 6) | function P1(e,t){dl=As=!0;var r=e.pending;r===null?t.next=t:(t.next=r.ne...
function E1 (line 6) | function E1(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t....
function eo (line 6) | function eo(e,t){try{var r="",n=t;do r+=II(n),n=n.return;while(n);var a=...
function wc (line 8) | function wc(e,t,r){return{value:e,source:null,stack:r??null,digest:t??nu...
function np (line 8) | function np(e,t){try{console.error(t.value)}catch(r){setTimeout(function...
function T1 (line 8) | function T1(e,t,r){r=Nr(-1,r),r.tag=3,r.payload={element:null};var n=t.v...
function M1 (line 8) | function M1(e,t,r){r=Nr(-1,r),r.tag=3;var n=e.type.getDerivedStateFromEr...
function Ov (line 8) | function Ov(e,t,r){var n=e.pingCache;if(n===null){n=e.pingCache=new Xk;v...
function Uv (line 8) | function Uv(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null...
function Hv (line 8) | function Hv(e,t,r,n,a){return e.mode&1?(e.flags|=65536,e.lanes=a,e):(e==...
function Je (line 8) | function Je(e,t,r,n){t.child=e===null?u1(t,null,r,n):Ja(t,e.child,r,n)}
function Vv (line 8) | function Vv(e,t,r,n,a){r=r.render;var o=t.ref;return Qa(t,a),n=Gp(e,t,r,...
function jv (line 8) | function jv(e,t,r,n,a){if(e===null){var o=r.type;return typeof o=="funct...
function F1 (line 8) | function F1(e,t,r,n,a){if(e!==null){var o=e.memoizedProps;if(wl(o,n)&&e....
function D1 (line 8) | function D1(e,t,r){var n=t.pendingProps,a=n.children,o=e!==null?e.memoiz...
function R1 (line 8) | function R1(e,t){var r=t.ref;(e===null&&r!==null||e!==null&&e.ref!==r)&&...
function ap (line 8) | function ap(e,t,r,n,a){var o=it(r)?ta:Ve.current;return o=Za(t,o),Qa(t,a...
function Wv (line 8) | function Wv(e,t,r,n,a){if(it(r)){var o=!0;Ps(t)}else o=!1;if(Qa(t,a),t.s...
function op (line 8) | function op(e,t,r,n,a,o){R1(e,t);var l=(t.flags&128)!==0;if(!n&&!l)retur...
function A1 (line 8) | function A1(e){var t=e.stateNode;t.pendingContext?Ev(e,t.pendingContext,...
function $v (line 8) | function $v(e,t,r,n,a){return Ya(),zp(a),t.flags|=256,Je(e,t,r,n),t.child}
function up (line 8) | function up(e){return{baseLanes:e,cachePool:null,transitions:null}}
function _1 (line 8) | function _1(e,t,r){var n=t.pendingProps,a=re.current,o=!1,l=(t.flags&128...
function Xp (line 8) | function Xp(e,t){return t=Zs({mode:"visible",children:t},e.mode,0,null),...
function ns (line 8) | function ns(e,t,r,n){return n!==null&&zp(n),Ja(t,e.child,null,r),e=Xp(t,...
function Yk (line 8) | function Yk(e,t,r,n,a,o,l){if(r)return t.flags&256?(t.flags&=-257,n=wc(E...
function Gv (line 8) | function Gv(e,t,r){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),e...
function Sc (line 8) | function Sc(e,t,r,n,a){var o=e.memoizedState;o===null?e.memoizedState={i...
function z1 (line 8) | function z1(e,t,r){var n=t.pendingProps,a=n.revealOrder,o=n.tail;if(Je(e...
function cs (line 8) | function cs(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=nu...
function Hr (line 8) | function Hr(e,t,r){if(e!==null&&(t.dependencies=e.dependencies),aa|=t.la...
function Jk (line 8) | function Jk(e,t,r){switch(t.tag){case 3:A1(t),Ya();break;case 5:i1(t);br...
function Jo (line 8) | function Jo(e,t){if(!ee)switch(e.tailMode){case"hidden":t=e.tail;for(var...
function Ue (line 8) | function Ue(e){var t=e.alternate!==null&&e.alternate.child===e.child,r=0...
function bk (line 8) | function bk(e,t,r){var n=t.pendingProps;switch(_p(t),t.tag){case 2:case ...
function e2 (line 8) | function e2(e,t){switch(_p(t),t.tag){case 1:return it(t.type)&&ks(),e=t....
function Va (line 8) | function Va(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(n...
function sp (line 8) | function sp(e,t,r){try{r()}catch(n){de(e,t,n)}}
function r2 (line 8) | function r2(e,t){if(qc=ws,e=j0(),Rp(e)){if("selectionStart"in e)var r={s...
function fl (line 8) | function fl(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n...
function Ks (line 8) | function Ks(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==nul...
function dp (line 8) | function dp(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){...
function U1 (line 8) | function U1(e){var t=e.alternate;t!==null&&(e.alternate=null,U1(t)),e.ch...
function H1 (line 8) | function H1(e){return e.tag===5||e.tag===3||e.tag===4}
function Qv (line 8) | function Qv(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||H1(...
function fp (line 8) | function fp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeTyp...
function cp (line 8) | function cp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertB...
function rn (line 8) | function rn(e,t,r){for(r=r.child;r!==null;)V1(e,t,r),r=r.sibling}
function V1 (line 8) | function V1(e,t,r){if(vr&&typeof vr.onCommitFiberUnmount=="function")try...
function Kv (line 8) | function Kv(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r...
function Zt (line 8) | function Zt(e,t){var r=t.deletions;if(r!==null)for(var n=0;n<r.length;n+...
function j1 (line 8) | function j1(e,t){var r=e.alternate,n=e.flags;switch(e.tag){case 0:case 1...
function hr (line 8) | function hr(e){var t=e.flags;if(t&2){try{e:{for(var r=e.return;r!==null;...
function n2 (line 8) | function n2(e,t,r){F=e,W1(e,t,r)}
function W1 (line 8) | function W1(e,t,r){for(var n=(e.mode&1)!==0;F!==null;){var a=F,o=a.child...
function Xv (line 8) | function Xv(e){for(;F!==null;){var t=F;if(t.flags&8772){var r=t.alternat...
function Zv (line 8) | function Zv(e){for(;F!==null;){var t=F;if(t===e){F=null;break}var r=t.si...
function Yv (line 8) | function Yv(e){for(;F!==null;){var t=F;try{switch(t.tag){case 0:case 11:...
function be (line 8) | function be(){return B&6?pe():ps!==-1?ps:ps=pe()}
function gn (line 8) | function gn(e){return e.mode&1?B&2&&De!==0?De&-De:Vk.transition!==null?(...
function tr (line 8) | function tr(e,t,r,n){if(50<pl)throw pl=0,mp=null,Error(k(185));Dl(e,r,n)...
function st (line 8) | function st(e,t){var r=e.callbackNode;WI(e,t);var n=Ls(e,e===ke?De:0);if...
function $1 (line 8) | function $1(e,t){if(ps=-1,ms=0,B&6)throw Error(k(327));var r=e.callbackN...
function hp (line 8) | function hp(e,t){var r=cl;return e.current.memoizedState.isDehydrated&&(...
function gp (line 8) | function gp(e){ot===null?ot=e:ot.push.apply(ot,e)}
function o2 (line 8) | function o2(e){for(var t=e;;){if(t.flags&16384){var r=t.updateQueue;if(r...
function ln (line 8) | function ln(e,t){for(t&=~Yp,t&=~Xs,e.suspendedLanes|=t,e.pingedLanes&=~t...
function Jv (line 8) | function Jv(e){if(B&6)throw Error(k(327));Ka();var t=Ls(e,0);if(!(t&1))r...
function bp (line 8) | function bp(e,t){var r=B;B|=1;try{return e(t)}finally{B=r,B===0&&(to=pe(...
function oa (line 8) | function oa(e){sn!==null&&sn.tag===0&&!(B&6)&&Ka();var t=B;B|=1;var r=Bt...
function em (line 8) | function em(){yt=ja.current,Y(ja)}
function bn (line 8) | function bn(e,t){e.finishedWork=null,e.finishedLanes=0;var r=e.timeoutHa...
function G1 (line 8) | function G1(e,t){do{var r=ye;try{if(Bp(),ds.current=_s,As){for(var n=ne....
function q1 (line 8) | function q1(){var e=zs.current;return zs.current=_s,e===null?_s:e}
function tm (line 8) | function tm(){(we===0||we===3||we===2)&&(we=4),ke===null||!(aa&268435455...
function Os (line 8) | function Os(e,t){var r=B;B|=2;var n=q1();(ke!==e||De!==t)&&(Rr=null,bn(e...
function l2 (line 8) | function l2(){for(;ye!==null;)Q1(ye)}
function u2 (line 8) | function u2(){for(;ye!==null&&!_I();)Q1(ye)}
function Q1 (line 8) | function Q1(e){var t=Z1(e.alternate,e,yt);e.memoizedProps=e.pendingProps...
function K1 (line 8) | function K1(e){var t=e;do{var r=t.alternate;if(e=t.return,t.flags&32768)...
function Xn (line 8) | function Xn(e,t,r){var n=V,a=Bt.transition;try{Bt.transition=null,V=1,i2...
function i2 (line 8) | function i2(e,t,r,n){do Ka();while(sn!==null);if(B&6)throw Error(k(327))...
function Ka (line 8) | function Ka(){if(sn!==null){var e=E0(Bs),t=Bt.transition,r=V;try{if(Bt.t...
function bv (line 8) | function bv(e,t,r){t=eo(r,t),t=T1(e,t,1),e=mn(e,t,1),t=be(),e!==null&&(D...
function de (line 8) | function de(e,t,r){if(e.tag===3)bv(e,e,r);else for(;t!==null;){if(t.tag=...
function s2 (line 8) | function s2(e,t,r){var n=e.pingCache;n!==null&&n.delete(t),t=be(),e.ping...
function X1 (line 8) | function X1(e,t){t===0&&(e.mode&1?(t=Gi,Gi<<=1,!(Gi&130023424)&&(Gi=4194...
function d2 (line 8) | function d2(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),X1(e,r)}
function f2 (line 8) | function f2(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,a=e.mem...
function Y1 (line 8) | function Y1(e,t){return C0(e,t)}
function c2 (line 8) | function c2(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this....
function Nt (line 8) | function Nt(e,t,r,n){return new c2(e,t,r,n)}
function rm (line 8) | function rm(e){return e=e.prototype,!(!e||!e.isReactComponent)}
function p2 (line 8) | function p2(e){if(typeof e=="function")return rm(e)?1:0;if(e!=null){if(e...
function yn (line 8) | function yn(e,t){var r=e.alternate;return r===null?(r=Nt(e.tag,t,e.key,e...
function hs (line 8) | function hs(e,t,r,n,a,o){var l=2;if(n=e,typeof e=="function")rm(e)&&(l=1...
function ea (line 8) | function ea(e,t,r,n){return e=Nt(7,e,n,t),e.lanes=r,e}
function Zs (line 8) | function Zs(e,t,r,n){return e=Nt(22,e,n,t),e.elementType=l0,e.lanes=r,e....
function Cc (line 8) | function Cc(e,t,r){return e=Nt(6,e,null,t),e.lanes=r,e}
function Ic (line 8) | function Ic(e,t,r){return t=Nt(4,e.children!==null?e.children:[],e.key,t...
function m2 (line 8) | function m2(e,t,r,n,a){this.tag=t,this.containerInfo=e,this.finishedWork...
function nm (line 8) | function nm(e,t,r,n,a,o,l,u,i){return e=new m2(e,t,r,u,i),t===1?(t=1,o==...
function h2 (line 8) | function h2(e,t,r){var n=3<arguments.length&&arguments[3]!==void 0?argum...
function J1 (line 8) | function J1(e){if(!e)return xn;e=e._reactInternals;e:{if(ua(e)!==e||e.ta...
function b1 (line 8) | function b1(e,t,r,n,a,o,l,u,i){return e=nm(r,n,!0,e,a,o,l,u,i),e.context...
function Ys (line 8) | function Ys(e,t,r,n){var a=t.current,o=be(),l=gn(a);return r=J1(r),t.con...
function Us (line 8) | function Us(e){if(e=e.current,!e.child)return null;switch(e.child.tag){c...
function e0 (line 8) | function e0(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var...
function am (line 8) | function am(e,t){e0(e,t),(e=e.alternate)&&e0(e,t)}
function g2 (line 8) | function g2(){return null}
function om (line 8) | function om(e){this._internalRoot=e}
function Js (line 8) | function Js(e){this._internalRoot=e}
function lm (line 8) | function lm(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function bs (line 8) | function bs(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function t0 (line 8) | function t0(){}
function y2 (line 8) | function y2(e,t,r,n,a){if(a){if(typeof n=="function"){var o=n;n=function...
function ed (line 8) | function ed(e,t,r,n,a){var o=r._reactRootContainer;if(o){var l=o;if(type...
function rx (line 8) | function rx(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __R...
function D2 (line 8) | function D2(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
function B2 (line 8) | function B2(e,t){var r=t(),n=A2({inst:{value:r,getSnapshot:t}}),a=n[0].i...
function mm (line 8) | function mm(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!R2(e,r...
function O2 (line 8) | function O2(e,t){return t()}
function Am (line 8) | function Am(e,t){var r=e.length;e.push(t);e:for(;0<r;){var n=r-1>>>1,a=e...
function ar (line 8) | function ar(e){return e.length===0?null:e[0]}
function hd (line 8) | function hd(e){if(e.length===0)return null;var t=e[0],r=e.pop();if(r!==t...
function pd (line 8) | function pd(e,t){var r=e.sortIndex-t.sortIndex;return r!==0?r:e.id-t.id}
function _m (line 8) | function _m(e){for(var t=ar(In);t!==null;){if(t.callback===null)hd(In);e...
function zm (line 8) | function zm(e){if(Du=!1,_m(e),!ia)if(ar(Sr)!==null)ia=!0,Bm(Nm);else{var...
function Nm (line 8) | function Nm(e,t){ia=!1,Du&&(Du=!1,Ox(Ru),Ru=-1),gd=!0;var r=je;try{for(_...
function Vx (line 8) | function Vx(){return!(G.unstable_now()-Hx<Ux)}
function Dm (line 8) | function Dm(){if(md!==null){var e=G.unstable_now();Hx=e;var t=!0;try{t=m...
function Bm (line 8) | function Bm(e){md=e,yd||(yd=!0,Fu())}
function Om (line 8) | function Om(e,t){Ru=Bx(function(){e(G.unstable_now())},t)}
function P (line 8) | function P(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
function wa (line 8) | function wa(e,t){Fo(e,t),Fo(e+"Capture",t)}
function Fo (line 8) | function Fo(e,t){for(ei[e]=t,e=0;e<t.length;e++)YL.add(t[e])}
function gP (line 8) | function gP(e){return uh.call(qx,e)?!0:uh.call(Gx,e)?!1:hP.test(e)?qx[e]...
function yP (line 8) | function yP(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){c...
function vP (line 8) | function vP(e,t,r,n){if(t===null||typeof t>"u"||yP(e,t,r,n))return!0;if(...
function nt (line 8) | function nt(e,t,r,n,a,o,l){this.acceptsBooleans=t===2||t===3||t===4,this...
function eg (line 8) | function eg(e){return e[1].toUpperCase()}
function tg (line 8) | function tg(e,t,r,n){var a=ze.hasOwnProperty(t)?ze[t]:null;(a!==null?a.t...
function Au (line 8) | function Au(e){return e===null||typeof e!="object"?null:(e=Qx&&e[Qx]||e[...
function Vu (line 8) | function Vu(e){if(Um===void 0)try{throw Error()}catch(r){var t=r.stack.t...
function Vm (line 9) | function Vm(e,t){if(!e||Hm)return"";Hm=!0;var r=Error.prepareStackTrace;...
function xP (line 12) | function xP(e){switch(e.tag){case 5:return Vu(e.type);case 16:return Vu(...
function fh (line 12) | function fh(e){if(e==null)return null;if(typeof e=="function")return e.d...
function LP (line 12) | function LP(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:r...
function Hn (line 12) | function Hn(e){switch(typeof e){case"boolean":case"number":case"string":...
function tw (line 12) | function tw(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="inp...
function wP (line 12) | function wP(e){var t=tw(e)?"checked":"value",r=Object.getOwnPropertyDesc...
function xd (line 12) | function xd(e){e._valueTracker||(e._valueTracker=wP(e))}
function rw (line 12) | function rw(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r...
function Qd (line 12) | function Qd(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u...
function ch (line 12) | function ch(e,t){var r=t.checked;return ie({},t,{defaultChecked:void 0,d...
function Kx (line 12) | function Kx(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checke...
function nw (line 12) | function nw(e,t){t=t.checked,t!=null&&tg(e,"checked",t,!1)}
function ph (line 12) | function ph(e,t){nw(e,t);var r=Hn(t.value),n=t.type;if(r!=null)n==="numb...
function Xx (line 12) | function Xx(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
function mh (line 12) | function mh(e,t,r){(t!=="number"||Qd(e.ownerDocument)!==e)&&(r==null?e.d...
function Io (line 12) | function Io(e,t,r,n){if(e=e.options,t){t={};for(var a=0;a<r.length;a++)t...
function hh (line 12) | function hh(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(P(91));r...
function Zx (line 12) | function Zx(e,t){var r=t.value;if(r==null){if(r=t.children,t=t.defaultVa...
function aw (line 12) | function aw(e,t){var r=Hn(t.value),n=Hn(t.defaultValue);r!=null&&(r=""+r...
function Yx (line 12) | function Yx(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!=...
function ow (line 12) | function ow(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
function gh (line 12) | function gh(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?ow(t...
function ti (line 12) | function ti(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeT...
function uw (line 12) | function uw(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typ...
function iw (line 12) | function iw(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=...
function yh (line 12) | function yh(e,t){if(t){if(CP[e]&&(t.children!=null||t.dangerouslySetInne...
function vh (line 12) | function vh(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";swi...
function og (line 12) | function og(e){return e=e.target||e.srcElement||window,e.correspondingUs...
function Jx (line 12) | function Jx(e){if(e=xi(e)){if(typeof Lh!="function")throw Error(P(280));...
function sw (line 12) | function sw(e){ko?Po?Po.push(e):Po=[e]:ko=e}
function dw (line 12) | function dw(){if(ko){var e=ko,t=Po;if(Po=ko=null,Jx(e),t)for(e=0;e<t.len...
function fw (line 12) | function fw(e,t){return e(t)}
function cw (line 12) | function cw(){}
function pw (line 12) | function pw(e,t,r){if(jm)return e(t,r);jm=!0;try{return fw(e,t,r)}finall...
function ri (line 12) | function ri(e,t){var r=e.stateNode;if(r===null)return null;var n=Sf(r);i...
function IP (line 12) | function IP(e,t,r,n,a,o,l,u,i){var f=Array.prototype.slice.call(argument...
function PP (line 12) | function PP(e,t,r,n,a,o,l,u,i){qu=!1,Kd=null,IP.apply(kP,arguments)}
function EP (line 12) | function EP(e,t,r,n,a,o,l,u,i){if(PP.apply(this,arguments),qu){if(qu){va...
function Sa (line 12) | function Sa(e){var t=e,r=e;if(e.alternate)for(;t.return;)t=t.return;else...
function mw (line 12) | function mw(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.al...
function bx (line 12) | function bx(e){if(Sa(e)!==e)throw Error(P(188))}
function TP (line 12) | function TP(e){var t=e.alternate;if(!t){if(t=Sa(e),t===null)throw Error(...
function hw (line 12) | function hw(e){return e=TP(e),e!==null?gw(e):null}
function gw (line 12) | function gw(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;)...
function AP (line 12) | function AP(e){if(Pr&&typeof Pr.onCommitFiberRoot=="function")try{Pr.onC...
function NP (line 12) | function NP(e){return e>>>=0,e===0?32:31-(_P(e)/zP|0)|0}
function Wu (line 12) | function Wu(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
function Yd (line 12) | function Yd(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,a=e.susp...
function BP (line 12) | function BP(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
function OP (line 12) | function OP(e,t){for(var r=e.suspendedLanes,n=e.pingedLanes,a=e.expirati...
function Ch (line 12) | function Ch(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?...
function Lw (line 12) | function Lw(){var e=wd;return wd<<=1,!(wd&4194240)&&(wd=64),e}
function Wm (line 12) | function Wm(e){for(var t=[],r=0;31>r;r++)t.push(e);return t}
function yi (line 12) | function yi(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,...
function UP (line 12) | function UP(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLan...
function ug (line 12) | function ug(e,t){var r=e.entangledLanes|=t;for(e=e.entanglements;r;){var...
function ww (line 12) | function ww(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}
function tL (line 12) | function tL(e,t){switch(e){case"focusin":case"focusout":Rn=null;break;ca...
function _u (line 12) | function _u(e,t,r,n,a,o){return e===null||e.nativeEvent!==o?(e={blockedO...
function VP (line 12) | function VP(e,t,r,n,a){switch(t){case"focusin":return Rn=_u(Rn,e,t,r,n,a...
function Pw (line 12) | function Pw(e){var t=fa(e.target);if(t!==null){var r=Sa(t);if(r!==null){...
function Bd (line 12) | function Bd(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContaine...
function rL (line 12) | function rL(e,t,r){Bd(e)&&r.delete(t)}
function jP (line 12) | function jP(){Ih=!1,Rn!==null&&Bd(Rn)&&(Rn=null),An!==null&&Bd(An)&&(An=...
function zu (line 12) | function zu(e,t){e.blockedOn===t&&(e.blockedOn=null,Ih||(Ih=!0,Pt.unstab...
function oi (line 12) | function oi(e){function t(a){return zu(a,e)}if(0<Cd.length){zu(Cd[0],e);...
function WP (line 12) | function WP(e,t,r,n){var a=j,o=Eo.transition;Eo.transition=null;try{j=1,...
function $P (line 12) | function $P(e,t,r,n){var a=j,o=Eo.transition;Eo.transition=null;try{j=4,...
function sg (line 12) | function sg(e,t,r,n){if(Jd){var a=kh(e,t,r,n);if(a===null)Zm(e,t,n,bd,r)...
function kh (line 12) | function kh(e,t,r,n){if(bd=null,e=og(n),e=fa(e),e!==null)if(t=Sa(e),t===...
function Ew (line 12) | function Ew(e){switch(e){case"cancel":case"click":case"close":case"conte...
function Tw (line 12) | function Tw(){if(Od)return Od;var e,t=dg,r=t.length,n,a="value"in Fn?Fn....
function Ud (line 12) | function Ud(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&...
function Id (line 12) | function Id(){return!0}
function nL (line 12) | function nL(){return!1}
function Et (line 12) | function Et(e){function t(r,n,a,o,l){this._reactName=r,this._targetInst=...
function n3 (line 12) | function n3(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
function cg (line 12) | function cg(){return n3}
function Fw (line 12) | function Fw(e,t){switch(e){case"keyup":return p3.indexOf(t.keyCode)!==-1...
function Dw (line 12) | function Dw(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:n...
function h3 (line 12) | function h3(e,t){switch(e){case"compositionend":return Dw(t);case"keypre...
function g3 (line 12) | function g3(e,t){if(mo)return e==="compositionend"||!pg&&Fw(e,t)?(e=Tw()...
function sL (line 12) | function sL(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===...
function Rw (line 12) | function Rw(e,t,r,n){sw(n),t=ef(t,"onChange"),0<t.length&&(r=new fg("onC...
function v3 (line 12) | function v3(e){Ww(e,0)}
function Lf (line 12) | function Lf(e){var t=yo(e);if(rw(t))return e}
function x3 (line 12) | function x3(e,t){if(e==="change")return t}
function dL (line 12) | function dL(){Ku&&(Ku.detachEvent("onpropertychange",_w),li=Ku=null)}
function _w (line 12) | function _w(e){if(e.propertyName==="value"&&Lf(li)){var t=[];Rw(t,li,e,o...
function L3 (line 12) | function L3(e,t,r){e==="focusin"?(dL(),Ku=t,li=r,Ku.attachEvent("onprope...
function w3 (line 12) | function w3(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")retu...
function S3 (line 12) | function S3(e,t){if(e==="click")return Lf(t)}
function C3 (line 12) | function C3(e,t){if(e==="input"||e==="change")return Lf(t)}
function I3 (line 12) | function I3(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
function ui (line 12) | function ui(e,t){if(fr(e,t))return!0;if(typeof e!="object"||e===null||ty...
function fL (line 12) | function fL(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
function cL (line 12) | function cL(e,t){var r=fL(e);e=0;for(var n;r;){if(r.nodeType===3){if(n=e...
function zw (line 12) | function zw(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType...
function Nw (line 12) | function Nw(){for(var e=window,t=Qd();t instanceof e.HTMLIFrameElement;)...
function mg (line 12) | function mg(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
function k3 (line 12) | function k3(e){var t=Nw(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r...
function pL (line 12) | function pL(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.owne...
function Ed (line 12) | function Ed(e,t){var r={};return r[e.toLowerCase()]=t.toLowerCase(),r["W...
function wf (line 12) | function wf(e){if(Km[e])return Km[e];if(!go[e])return e;var t=go[e],r;fo...
function jn (line 12) | function jn(e,t){jw.set(e,t),wa(t,[e])}
function yL (line 12) | function yL(e,t,r){var n=e.type||"unknown-event";e.currentTarget=r,EP(n,...
function Ww (line 12) | function Ww(e,t){t=(t&4)!==0;for(var r=0;r<e.length;r++){var n=e[r],a=n....
function J (line 12) | function J(e,t){var r=t[Rh];r===void 0&&(r=t[Rh]=new Set);var n=e+"__bub...
function Xm (line 12) | function Xm(e,t,r){var n=0;t&&(n|=4),$w(r,e,n,t)}
function ii (line 12) | function ii(e){if(!e[Fd]){e[Fd]=!0,YL.forEach(function(r){r!=="selection...
function $w (line 12) | function $w(e,t,r,n){switch(Ew(t)){case 1:var a=WP;break;case 4:a=$P;bre...
function Zm (line 12) | function Zm(e,t,r,n,a){var o=n;if(!(t&1)&&!(t&2)&&n!==null)e:for(;;){if(...
function si (line 12) | function si(e,t,r){return{instance:e,listener:t,currentTarget:r}}
function ef (line 12) | function ef(e,t){for(var r=t+"Capture",n=[];e!==null;){var a=e,o=a.state...
function fo (line 12) | function fo(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5)...
function vL (line 12) | function vL(e,t,r,n,a){for(var o=t._reactName,l=[];r!==null&&r!==n;){var...
function xL (line 12) | function xL(e){return(typeof e=="string"?e:""+e).replace(T3,`
function Dd (line 13) | function Dd(e,t,r){if(t=xL(t),xL(e)!==t&&r)throw Error(P(425))}
function tf (line 13) | function tf(){}
function Fh (line 13) | function Fh(e,t){return e==="textarea"||e==="noscript"||typeof t.childre...
function R3 (line 13) | function R3(e){setTimeout(function(){throw e})}
function Ym (line 13) | function Ym(e,t){var r=t,n=0;do{var a=r.nextSibling;if(e.removeChild(r),...
function zn (line 13) | function zn(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||...
function wL (line 13) | function wL(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){va...
function fa (line 13) | function fa(e){var t=e[kr];if(t)return t;for(var r=e.parentNode;r;){if(t...
function xi (line 13) | function xi(e){return e=e[kr]||e[Kr],!e||e.tag!==5&&e.tag!==6&&e.tag!==1...
function yo (line 13) | function yo(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(P(...
function Sf (line 13) | function Sf(e){return e[di]||null}
function Wn (line 13) | function Wn(e){return{current:e}}
function b (line 13) | function b(e){0>vo||(e.current=Ah[vo],Ah[vo]=null,vo--)}
function q (line 13) | function q(e,t){vo++,Ah[vo]=e.current,e.current=t}
function Do (line 13) | function Do(e,t){var r=e.type.contextTypes;if(!r)return Vn;var n=e.state...
function ht (line 13) | function ht(e){return e=e.childContextTypes,e!=null}
function rf (line 13) | function rf(){b(mt),b(qe)}
function SL (line 13) | function SL(e,t,r){if(qe.current!==Vn)throw Error(P(168));q(qe,t),q(mt,r)}
function Gw (line 13) | function Gw(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.g...
function nf (line 13) | function nf(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
function CL (line 13) | function CL(e,t,r){var n=e.stateNode;if(!n)throw Error(P(169));r?(e=Gw(e...
function qw (line 13) | function qw(e){Wr===null?Wr=[e]:Wr.push(e)}
function z3 (line 13) | function z3(e){Cf=!0,qw(e)}
function $n (line 13) | function $n(){if(!Jm&&Wr!==null){Jm=!0;var e=0,t=j;try{var r=Wr;for(j=1;...
function sa (line 13) | function sa(e,t){xo[Lo++]=of,xo[Lo++]=af,af=e,of=t}
function Qw (line 13) | function Qw(e,t,r){Vt[jt++]=$r,Vt[jt++]=Gr,Vt[jt++]=ya,ya=e;var n=$r;e=G...
function hg (line 13) | function hg(e){e.return!==null&&(sa(e,1),Qw(e,1,0))}
function gg (line 13) | function gg(e){for(;e===af;)af=xo[--Lo],xo[Lo]=null,of=xo[--Lo],xo[Lo]=n...
function Kw (line 13) | function Kw(e,t){var r=Wt(5,null,null,0);r.elementType="DELETED",r.state...
function IL (line 13) | function IL(e,t){switch(e.tag){case 5:var r=e.type;return t=t.nodeType!=...
function _h (line 13) | function _h(e){return(e.mode&1)!==0&&(e.flags&128)===0}
function zh (line 13) | function zh(e){if(te){var t=It;if(t){var r=t;if(!IL(e,t)){if(_h(e))throw...
function kL (line 13) | function kL(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13...
function Rd (line 13) | function Rd(e){if(e!==kt)return!1;if(!te)return kL(e),te=!0,!1;var t;if(...
function Xw (line 13) | function Xw(){for(var e=It;e;)e=zn(e.nextSibling)}
function Ro (line 13) | function Ro(){It=kt=null,te=!1}
function yg (line 13) | function yg(e){ir===null?ir=[e]:ir.push(e)}
function Bu (line 13) | function Bu(e,t,r){if(e=r.ref,e!==null&&typeof e!="function"&&typeof e!=...
function Ad (line 13) | function Ad(e,t){throw e=Object.prototype.toString.call(t),Error(P(31,e=...
function PL (line 13) | function PL(e){var t=e._init;return t(e._payload)}
function Zw (line 13) | function Zw(e){function t(d,s){if(e){var c=d.deletions;c===null?(d.delet...
function xg (line 13) | function xg(){vg=wo=uf=null}
function Lg (line 13) | function Lg(e){var t=lf.current;b(lf),e._currentValue=t}
function Nh (line 13) | function Nh(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)...
function To (line 13) | function To(e,t){uf=e,vg=wo=null,e=e.dependencies,e!==null&&e.firstConte...
function Gt (line 13) | function Gt(e){var t=e._currentValue;if(vg!==e)if(e={context:e,memoizedV...
function wg (line 13) | function wg(e){ca===null?ca=[e]:ca.push(e)}
function Jw (line 13) | function Jw(e,t,r,n){var a=t.interleaved;return a===null?(r.next=r,wg(t)...
function Xr (line 13) | function Xr(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t)...
function Sg (line 13) | function Sg(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
function bw (line 13) | function bw(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
function qr (line 13) | function qr(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
function Nn (line 13) | function Nn(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.sh...
function Hd (line 13) | function Hd(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!...
function EL (line 13) | function EL(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.upd...
function sf (line 13) | function sf(e,t,r,n){var a=e.updateQueue;En=!1;var o=a.firstBaseUpdate,l...
function TL (line 13) | function TL(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.le...
function pa (line 13) | function pa(e){if(e===Li)throw Error(P(174));return e}
function Cg (line 13) | function Cg(e,t){switch(q(ci,t),q(fi,e),q(Er,Li),e=t.nodeType,e){case 9:...
function _o (line 13) | function _o(){b(Er),b(fi),b(ci)}
function eS (line 13) | function eS(e){pa(ci.current);var t=pa(Er.current),r=gh(t,e.type);t!==r&...
function Ig (line 13) | function Ig(e){fi.current===e&&(b(Er),b(fi))}
function df (line 13) | function df(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedSta...
function kg (line 13) | function kg(){for(var e=0;e<bm.length;e++)bm[e]._workInProgressVersionPr...
function We (line 13) | function We(){throw Error(P(321))}
function Pg (line 13) | function Pg(e,t){if(t===null)return!1;for(var r=0;r<t.length&&r<e.length...
function Eg (line 13) | function Eg(e,t,r,n,a,o){if(va=o,ue=t,t.memoizedState=null,t.updateQueue...
function Tg (line 13) | function Tg(){var e=pi!==0;return pi=0,e}
function Ir (line 13) | function Ir(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
function qt (line 13) | function qt(){if(Se===null){var e=ue.alternate;e=e!==null?e.memoizedStat...
function mi (line 13) | function mi(e,t){return typeof t=="function"?t(e):t}
function th (line 13) | function th(e){var t=qt(),r=t.queue;if(r===null)throw Error(P(311));r.la...
function rh (line 13) | function rh(e){var t=qt(),r=t.queue;if(r===null)throw Error(P(311));r.la...
function tS (line 13) | function tS(){}
function rS (line 13) | function rS(e,t){var r=ue,n=qt(),a=t(),o=!fr(n.memoizedState,a);if(o&&(n...
function nS (line 13) | function nS(e,t,r){e.flags|=16384,e={getSnapshot:t,value:r},t=ue.updateQ...
function aS (line 13) | function aS(e,t,r,n){t.value=r,t.getSnapshot=n,lS(t)&&uS(e)}
function oS (line 13) | function oS(e,t,r){return r(function(){lS(t)&&uS(e)})}
function lS (line 13) | function lS(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!fr(e,r...
function uS (line 13) | function uS(e){var t=Xr(e,1);t!==null&&dr(t,e,1,-1)}
function ML (line 13) | function ML(e){var t=Ir();return typeof e=="function"&&(e=e()),t.memoize...
function hi (line 13) | function hi(e,t,r,n){return e={tag:e,create:t,destroy:r,deps:n,next:null...
function iS (line 13) | function iS(){return qt().memoizedState}
function jd (line 13) | function jd(e,t,r,n){var a=Ir();ue.flags|=e,a.memoizedState=hi(1|t,r,voi...
function If (line 13) | function If(e,t,r,n){var a=qt();n=n===void 0?null:n;var o=void 0;if(Se!=...
function FL (line 13) | function FL(e,t){return jd(8390656,8,e,t)}
function Mg (line 13) | function Mg(e,t){return If(2048,8,e,t)}
function sS (line 13) | function sS(e,t){return If(4,2,e,t)}
function dS (line 13) | function dS(e,t){return If(4,4,e,t)}
function fS (line 13) | function fS(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(...
function cS (line 13) | function cS(e,t,r){return r=r!=null?r.concat([e]):null,If(4,4,fS.bind(nu...
function Fg (line 13) | function Fg(){}
function pS (line 13) | function pS(e,t){var r=qt();t=t===void 0?null:t;var n=r.memoizedState;re...
function mS (line 13) | function mS(e,t){var r=qt();t=t===void 0?null:t;var n=r.memoizedState;re...
function hS (line 13) | function hS(e,t,r){return va&21?(fr(r,t)||(r=Lw(),ue.lanes|=r,xa|=r,e.ba...
function O3 (line 13) | function O3(e,t){var r=j;j=r!==0&&4>r?r:4,e(!0);var n=eh.transition;eh.t...
function gS (line 13) | function gS(){return qt().memoizedState}
function U3 (line 13) | function U3(e,t,r){var n=On(e);if(r={lane:n,action:r,hasEagerState:!1,ea...
function H3 (line 13) | function H3(e,t,r){var n=On(e),a={lane:n,action:r,hasEagerState:!1,eager...
function yS (line 13) | function yS(e){var t=e.alternate;return e===ue||t!==null&&t===ue}
function vS (line 13) | function vS(e,t){Zu=ff=!0;var r=e.pending;r===null?t.next=t:(t.next=r.ne...
function xS (line 13) | function xS(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t....
function lr (line 13) | function lr(e,t){if(e&&e.defaultProps){t=ie({},t),e=e.defaultProps;for(v...
function Bh (line 13) | function Bh(e,t,r,n){t=e.memoizedState,r=r(n,t),r=r==null?t:ie({},t,r),e...
function DL (line 13) | function DL(e,t,r,n,a,o,l){return e=e.stateNode,typeof e.shouldComponent...
function LS (line 13) | function LS(e,t,r){var n=!1,a=Vn,o=t.contextType;return typeof o=="objec...
function RL (line 13) | function RL(e,t,r,n){e=t.state,typeof t.componentWillReceiveProps=="func...
function Oh (line 13) | function Oh(e,t,r,n){var a=e.stateNode;a.props=r,a.state=e.memoizedState...
function zo (line 13) | function zo(e,t){try{var r="",n=t;do r+=xP(n),n=n.return;while(n);var a=...
function nh (line 15) | function nh(e,t,r){return{value:e,source:null,stack:r??null,digest:t??nu...
function Uh (line 15) | function Uh(e,t){try{console.error(t.value)}catch(r){setTimeout(function...
function wS (line 15) | function wS(e,t,r){r=qr(-1,r),r.tag=3,r.payload={element:null};var n=t.v...
function SS (line 15) | function SS(e,t,r){r=qr(-1,r),r.tag=3;var n=e.type.getDerivedStateFromEr...
function AL (line 15) | function AL(e,t,r){var n=e.pingCache;if(n===null){n=e.pingCache=new $3;v...
function _L (line 15) | function _L(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null...
function zL (line 15) | function zL(e,t,r,n,a){return e.mode&1?(e.flags|=65536,e.lanes=a,e):(e==...
function tt (line 15) | function tt(e,t,r,n){t.child=e===null?Yw(t,null,r,n):Ao(t,e.child,r,n)}
function NL (line 15) | function NL(e,t,r,n,a){r=r.render;var o=t.ref;return To(t,a),n=Eg(e,t,r,...
function BL (line 15) | function BL(e,t,r,n,a){if(e===null){var o=r.type;return typeof o=="funct...
function CS (line 15) | function CS(e,t,r,n,a){if(e!==null){var o=e.memoizedProps;if(ui(o,n)&&e....
function IS (line 15) | function IS(e,t,r){var n=t.pendingProps,a=n.children,o=e!==null?e.memoiz...
function kS (line 15) | function kS(e,t){var r=t.ref;(e===null&&r!==null||e!==null&&e.ref!==r)&&...
function Hh (line 15) | function Hh(e,t,r,n,a){var o=ht(r)?ga:qe.current;return o=Do(t,o),To(t,a...
function OL (line 15) | function OL(e,t,r,n,a){if(ht(r)){var o=!0;nf(t)}else o=!1;if(To(t,a),t.s...
function Vh (line 15) | function Vh(e,t,r,n,a,o){kS(e,t);var l=(t.flags&128)!==0;if(!n&&!l)retur...
function PS (line 15) | function PS(e){var t=e.stateNode;t.pendingContext?SL(e,t.pendingContext,...
function UL (line 15) | function UL(e,t,r,n,a){return Ro(),yg(a),t.flags|=256,tt(e,t,r,n),t.child}
function Wh (line 15) | function Wh(e){return{baseLanes:e,cachePool:null,transitions:null}}
function ES (line 15) | function ES(e,t,r){var n=t.pendingProps,a=le.current,o=!1,l=(t.flags&128...
function Dg (line 15) | function Dg(e,t){return t=Tf({mode:"visible",children:t},e.mode,0,null),...
function _d (line 15) | function _d(e,t,r,n){return n!==null&&yg(n),Ao(t,e.child,null,r),e=Dg(t,...
function q3 (line 15) | function q3(e,t,r,n,a,o,l){if(r)return t.flags&256?(t.flags&=-257,n=nh(E...
function HL (line 15) | function HL(e,t,r){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),N...
function ah (line 15) | function ah(e,t,r,n,a){var o=e.memoizedState;o===null?e.memoizedState={i...
function TS (line 15) | function TS(e,t,r){var n=t.pendingProps,a=n.revealOrder,o=n.tail;if(tt(e...
function Wd (line 15) | function Wd(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=nu...
function Zr (line 15) | function Zr(e,t,r){if(e!==null&&(t.dependencies=e.dependencies),xa|=t.la...
function Q3 (line 15) | function Q3(e,t,r){switch(t.tag){case 3:PS(t),Ro();break;case 5:eS(t);br...
function Ou (line 15) | function Ou(e,t){if(!te)switch(e.tailMode){case"hidden":t=e.tail;for(var...
function $e (line 15) | function $e(e){var t=e.alternate!==null&&e.alternate.child===e.child,r=0...
function K3 (line 15) | function K3(e,t,r){var n=t.pendingProps;switch(gg(t),t.tag){case 2:case ...
function X3 (line 15) | function X3(e,t){switch(gg(t),t.tag){case 1:return ht(t.type)&&rf(),e=t....
function So (line 15) | function So(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(n...
function Gh (line 15) | function Gh(e,t,r){try{r()}catch(n){fe(e,t,n)}}
function Y3 (line 15) | function Y3(e,t){if(Th=Jd,e=Nw(),mg(e)){if("selectionStart"in e)var r={s...
function Yu (line 15) | function Yu(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n...
function Pf (line 15) | function Pf(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==nul...
function qh (line 15) | function qh(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){...
function RS (line 15) | function RS(e){var t=e.alternate;t!==null&&(e.alternate=null,RS(t)),e.ch...
function AS (line 15) | function AS(e){return e.tag===5||e.tag===3||e.tag===4}
function jL (line 15) | function jL(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||AS(...
function Qh (line 15) | function Qh(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeTyp...
function Kh (line 15) | function Kh(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertB...
function kn (line 15) | function kn(e,t,r){for(r=r.child;r!==null;)_S(e,t,r),r=r.sibling}
function _S (line 15) | function _S(e,t,r){if(Pr&&typeof Pr.onCommitFiberUnmount=="function")try...
function WL (line 15) | function WL(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r...
function or (line 15) | function or(e,t){var r=t.deletions;if(r!==null)for(var n=0;n<r.length;n+...
function zS (line 15) | function zS(e,t){var r=e.alternate,n=e.flags;switch(e.tag){case 0:case 1...
function Cr (line 15) | function Cr(e){var t=e.flags;if(t&2){try{e:{for(var r=e.return;r!==null;...
function J3 (line 15) | function J3(e,t,r){D=e,NS(e,t,r)}
function NS (line 15) | function NS(e,t,r){for(var n=(e.mode&1)!==0;D!==null;){var a=D,o=a.child...
function $L (line 15) | function $L(e){for(;D!==null;){var t=D;if(t.flags&8772){var r=t.alternat...
function GL (line 15) | function GL(e){for(;D!==null;){var t=D;if(t===e){D=null;break}var r=t.si...
function qL (line 15) | function qL(e){for(;D!==null;){var t=D;try{switch(t.tag){case 0:case 11:...
function rt (line 15) | function rt(){return U&6?he():$d!==-1?$d:$d=he()}
function On (line 15) | function On(e){return e.mode&1?U&2&&_e!==0?_e&-_e:N3.transition!==null?(...
function dr (line 15) | function dr(e,t,r,n){if(50<bu)throw bu=0,Zh=null,Error(P(185));yi(e,r,n)...
function gt (line 15) | function gt(e,t){var r=e.callbackNode;OP(e,t);var n=Yd(e,e===Te?_e:0);if...
function BS (line 15) | function BS(e,t){if($d=-1,Gd=0,U&6)throw Error(P(327));var r=e.callbackN...
function Yh (line 15) | function Yh(e,t){var r=Ju;return e.current.memoizedState.isDehydrated&&(...
function Jh (line 15) | function Jh(e){ct===null?ct=e:ct.push.apply(ct,e)}
function eE (line 15) | function eE(e){for(var t=e;;){if(t.flags&16384){var r=t.updateQueue;if(r...
function Mn (line 15) | function Mn(e,t){for(t&=~Ag,t&=~Ef,e.suspendedLanes|=t,e.pingedLanes&=~t...
function QL (line 15) | function QL(e){if(U&6)throw Error(P(327));Mo();var t=Yd(e,0);if(!(t&1))r...
function zg (line 15) | function zg(e,t){var r=U;U|=1;try{return e(t)}finally{U=r,U===0&&(No=he(...
function La (line 15) | function La(e){Dn!==null&&Dn.tag===0&&!(U&6)&&Mo();var t=U;U|=1;var r=$t...
function Ng (line 15) | function Ng(){Ct=Co.current,b(Co)}
function ma (line 15) | function ma(e,t){e.finishedWork=null,e.finishedLanes=0;var r=e.timeoutHa...
function OS (line 15) | function OS(e,t){do{var r=ve;try{if(xg(),Vd.current=cf,ff){for(var n=ue....
function US (line 15) | function US(){var e=pf.current;return pf.current=cf,e===null?cf:e}
function Bg (line 15) | function Bg(){(Ce===0||Ce===3||Ce===2)&&(Ce=4),Te===null||!(xa&268435455...
function gf (line 15) | function gf(e,t){var r=U;U|=2;var n=US();(Te!==e||_e!==t)&&(jr=null,ma(e...
function tE (line 15) | function tE(){for(;ve!==null;)HS(ve)}
function rE (line 15) | function rE(){for(;ve!==null&&!MP();)HS(ve)}
function HS (line 15) | function HS(e){var t=WS(e.alternate,e,Ct);e.memoizedProps=e.pendingProps...
function VS (line 15) | function VS(e){var t=e;do{var r=t.alternate;if(e=t.return,t.flags&32768)...
function da (line 15) | function da(e,t,r){var n=j,a=$t.transition;try{$t.transition=null,j=1,nE...
function nE (line 15) | function nE(e,t,r,n){do Mo();while(Dn!==null);if(U&6)throw Error(P(327))...
function Mo (line 15) | function Mo(){if(Dn!==null){var e=ww(hf),t=$t.transition,r=j;try{if($t.t...
function KL (line 15) | function KL(e,t,r){t=zo(r,t),t=wS(e,t,1),e=Nn(e,t,1),t=rt(),e!==null&&(y...
function fe (line 15) | function fe(e,t,r){if(e.tag===3)KL(e,e,r);else for(;t!==null;){if(t.tag=...
function aE (line 15) | function aE(e,t,r){var n=e.pingCache;n!==null&&n.delete(t),t=rt(),e.ping...
function jS (line 15) | function jS(e,t){t===0&&(e.mode&1?(t=Sd,Sd<<=1,!(Sd&130023424)&&(Sd=4194...
function oE (line 15) | function oE(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),jS(e,r)}
function lE (line 15) | function lE(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,a=e.mem...
function $S (line 15) | function $S(e,t){return yw(e,t)}
function uE (line 15) | function uE(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this....
function Wt (line 15) | function Wt(e,t,r,n){return new uE(e,t,r,n)}
function Og (line 15) | function Og(e){return e=e.prototype,!(!e||!e.isReactComponent)}
function iE (line 15) | function iE(e){if(typeof e=="function")return Og(e)?1:0;if(e!=null){if(e...
function Un (line 15) | function Un(e,t){var r=e.alternate;return r===null?(r=Wt(e.tag,t,e.key,e...
function qd (line 15) | function qd(e,t,r,n,a,o){var l=2;if(n=e,typeof e=="function")Og(e)&&(l=1...
function ha (line 15) | function ha(e,t,r,n){return e=Wt(7,e,n,t),e.lanes=r,e}
function Tf (line 15) | function Tf(e,t,r,n){return e=Wt(22,e,n,t),e.elementType=ew,e.lanes=r,e....
function oh (line 15) | function oh(e,t,r){return e=Wt(6,e,null,t),e.lanes=r,e}
function lh (line 15) | function lh(e,t,r){return t=Wt(4,e.children!==null?e.children:[],e.key,t...
function sE (line 15) | function sE(e,t,r,n,a){this.tag=t,this.containerInfo=e,this.finishedWork...
function Ug (line 15) | function Ug(e,t,r,n,a,o,l,u,i){return e=new sE(e,t,r,u,i),t===1?(t=1,o==...
function dE (line 15) | function dE(e,t,r){var n=3<arguments.length&&arguments[3]!==void 0?argum...
function GS (line 15) | function GS(e){if(!e)return Vn;e=e._reactInternals;e:{if(Sa(e)!==e||e.ta...
function qS (line 15) | function qS(e,t,r,n,a,o,l,u,i){return e=Ug(r,n,!0,e,a,o,l,u,i),e.context...
function Mf (line 15) | function Mf(e,t,r,n){var a=t.current,o=rt(),l=On(a);return r=GS(r),t.con...
function yf (line 15) | function yf(e){if(e=e.current,!e.child)return null;switch(e.child.tag){c...
function XL (line 15) | function XL(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var...
function Hg (line 15) | function Hg(e,t){XL(e,t),(e=e.alternate)&&XL(e,t)}
function fE (line 15) | function fE(){return null}
function Vg (line 15) | function Vg(e){this._internalRoot=e}
function Ff (line 15) | function Ff(e){this._internalRoot=e}
function jg (line 15) | function jg(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function Df (line 15) | function Df(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
function ZL (line 15) | function ZL(){}
function cE (line 15) | function cE(e,t,r,n,a){if(a){if(typeof n=="function"){var o=n;n=function...
function Rf (line 15) | function Rf(e,t,r,n,a){var o=r._reactRootContainer;if(o){var l=o;if(type...
function XS (line 15) | function XS(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __R...
function Iy (line 15) | function Iy(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+...
function ky (line 15) | function ky(){for(var e,t,r=0,n="";r<arguments.length;)(e=arguments[r++]...
function Ty (line 15) | function Ty(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+...
function My (line 15) | function My(){for(var e,t,r=0,n="",a=arguments.length;r<a;r++)(e=argumen...
function VC (line 15) | function VC(e){let t=WC(e),{conflictingClassGroups:r,conflictingClassGro...
function Ry (line 15) | function Ry(e,t){if(e.length===0)return t.classGroupId;let r=e[0],n=t.ne...
function jC (line 15) | function jC(e){if(Fy.test(e)){let t=Fy.exec(e)[1],r=t?.substring(0,t.ind...
function WC (line 15) | function WC(e){let{theme:t,prefix:r}=e,n={nextPart:new Map,validators:[]...
function qf (line 15) | function qf(e,t,r,n){e.forEach(a=>{if(typeof a=="string"){let o=a===""?t...
function Dy (line 15) | function Dy(e,t){let r=e;return t.split(Qf).forEach(n=>{r.nextPart.has(n...
function $C (line 15) | function $C(e){return e.isThemeGetter}
function GC (line 15) | function GC(e,t){return t?e.map(([r,n])=>{let a=n.map(o=>typeof o=="stri...
function qC (line 15) | function qC(e){if(e<1)return{get:()=>{},set:()=>{}};let t=0,r=new Map,n=...
function QC (line 15) | function QC(e){let t=e.separator,r=t.length===1,n=t[0],a=t.length;return...
function KC (line 15) | function KC(e){if(e.length<=1)return e;let t=[],r=[];return e.forEach(n=...
function XC (line 15) | function XC(e){return{cache:qC(e.cacheSize),splitModifiers:QC(e),...VC(e)}}
function YC (line 15) | function YC(e,t){let{splitModifiers:r,getClassGroupId:n,getConflictingCl...
function JC (line 15) | function JC(){let e=0,t,r,n="";for(;e<arguments.length;)(t=arguments[e++...
function _y (line 15) | function _y(e){if(typeof e=="string")return e;let t,r="";for(let n=0;n<e...
function bC (line 15) | function bC(e,...t){let r,n,a,o=l;function l(i){let f=t.reduce((p,h)=>h(...
function X (line 15) | function X(e){let t=r=>r[e]||[];return t.isThemeGetter=!0,t}
function Dr (line 15) | function Dr(e){return qn(e)||tI.has(e)||eI.test(e)}
function br (line 15) | function br(e){return Ta(e,"length",mI)}
function qn (line 15) | function qn(e){return!!e&&!Number.isNaN(Number(e))}
function Di (line 15) | function Di(e){return Ta(e,"number",qn)}
function jo (line 15) | function jo(e){return!!e&&Number.isInteger(Number(e))}
function uI (line 15) | function uI(e){return e.endsWith("%")&&qn(e.slice(0,-1))}
function A (line 15) | function A(e){return zy.test(e)}
function en (line 15) | function en(e){return rI.test(e)}
function sI (line 15) | function sI(e){return Ta(e,iI,Ny)}
function dI (line 15) | function dI(e){return Ta(e,"position",Ny)}
function cI (line 15) | function cI(e){return Ta(e,fI,gI)}
function pI (line 15) | function pI(e){return Ta(e,"",hI)}
function Wo (line 15) | function Wo(){return!0}
function Ta (line 15) | function Ta(e,t,r){let n=zy.exec(e);return n?n[1]?typeof t=="string"?n[1...
function mI (line 15) | function mI(e){return nI.test(e)&&!aI.test(e)}
function Ny (line 15) | function Ny(){return!1}
function hI (line 15) | function hI(e){return oI.test(e)}
function gI (line 15) | function gI(e){return lI.test(e)}
function yI (line 15) | function yI(){let e=X("colors"),t=X("spacing"),r=X("blur"),n=X("brightne...
function Ye (line 15) | function Ye(...e){return By(My(e))}
function pr (line 15) | function pr(){return pr=Object.assign?Object.assign.bind():function(e){f...
function w2 (line 15) | function w2(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}
function ox (line 15) | function ox(...e){return t=>e.forEach(r=>w2(r,t))}
function C2 (line 15) | function C2(e){return(0,oe.isValidElement)(e)&&e.type===S2}
function I2 (line 15) | function I2(e,t){let r={...t};for(let n in t){let a=e[n],o=t[n];/^on[A-Z...
function km (line 15) | async function km(...e){let[t,r,n,a]=e,o=wr({populateCache:!0,throwOnErr...
function K (line 15) | function K(){let ce=nr(f)?f(I().data):f;ce&&Q!==-1&&(Q=setTimeout(Ne,ce))}
function Ne (line 15) | function Ne(){!I().error&&(p||w().isVisible())&&(h||w().isOnline())?Uo(T...
method data (line 15) | get data(){return ge.data=!0,Ci}
method error (line 15) | get error(){return ge.error=!0,Si}
method isValidating (line 15) | get isValidating(){return ge.isValidating=!0,rC}
method isLoading (line 15) | get isLoading(){return ge.isLoading=!0,nC}
function dP (line 15) | function dP(e,t){let r=new Uint8Array(t),n=0;for(let a of e)r.set(a,n),n...
function cP (line 16) | function cP({api:e,threadId:t,credentials:r,headers:n,body:a,onError:o})...
function Mm (line 16) | function Mm(){let[e,t]=(0,R.useState)(),[r,n]=(0,R.useState)(),[a,o]=(0,...
FILE: types/index.d.ts
type InquiryMessages (line 8) | type InquiryMessages = {
type NavItem (line 19) | type NavItem = {
type MainNavItem (line 25) | type MainNavItem = NavItem
type SidebarNavItem (line 27) | type SidebarNavItem = {
type DashboardConfig (line 44) | type DashboardConfig = {
type DocsConfig (line 49) | type DocsConfig = {
type SiteConfig (line 54) | type SiteConfig = {
type UserSubscriptionPlan (line 66) | type UserSubscriptionPlan = SubscriptionPlan &
type ChatbotConfig (line 71) | type ChatbotConfig = {
type MarketingConfig (line 97) | type MarketingConfig = {
type CrawlerPublishedFile (line 101) | type CrawlerPublishedFile = {
type UploadPublishedFile (line 107) | type UploadPublishedFile = {
type SubscriptionPlan (line 113) | type SubscriptionPlan = {
type UserSubscriptionPlan (line 141) | type UserSubscriptionPlan = SubscriptionPlan &
FILE: types/next-auth-d.ts
type UserId (line 4) | type UserId = string
type JWT (line 7) | interface JWT {
type Session (line 13) | interface Session {
Condensed preview — 325 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,787K chars).
[
{
"path": ".eslintrc.json",
"chars": 40,
"preview": "{\n \"extends\": \"next/core-web-vitals\"\n}\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 834,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 595,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
},
{
"path": ".gitignore",
"chars": 488,
"preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n.contentlayer\n\n# dependencies\n/no"
},
{
"path": ".vscode/settings.json",
"chars": 56,
"preview": "{\n \"typescript.tsdk\": \"node_modules/typescript/lib\"\n}"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5202,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "LICENSE",
"chars": 34523,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "README.md",
"chars": 5080,
"preview": "# Welcome to OpenAssistantGPT\n\n<p>\n<img alt=\"Vercel Build Status\" src=\"https://vercelbadge.vercel.app/api/marcolivierbou"
},
{
"path": "app/(auth)/layout.tsx",
"chars": 184,
"preview": "interface AuthLayoutProps {\n children: React.ReactNode\n}\n\nexport default function AuthLayout({ children }: AuthLayoutPr"
},
{
"path": "app/(auth)/login/page.tsx",
"chars": 1890,
"preview": "import Link from \"next/link\";\n\nimport { Metadata } from \"next\";\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariant"
},
{
"path": "app/(dashboard)/dashboard/billing/loading.tsx",
"chars": 526,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/billing/page.tsx",
"chars": 1631,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { authOptions } from \"@/lib/auth\"\nimport { getCurrentUser } from \"@/"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/chatWindow/page.tsx",
"chars": 4524,
"preview": "import { notFound } from \"next/navigation\"\nimport { Chat, ClientSideChatbotProps } from \"@/components/chat-sdk\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/loading.tsx",
"chars": 681,
"preview": "import { Skeleton } from \"@/components/ui/skeleton\"\n\nexport default function Loading() {\n return (\n <div class"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/page.tsx",
"chars": 2052,
"preview": "import { getCurrentUser } from \"@/lib/session\"\nimport { notFound, redirect } from \"next/navigation\"\nimport { authOptions"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/embed/loading.tsx",
"chars": 681,
"preview": "import { Skeleton } from \"@/components/ui/skeleton\"\n\nexport default function Loading() {\n return (\n <div class"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/embed/page.tsx",
"chars": 8383,
"preview": "import { getCurrentUser } from \"@/lib/session\"\nimport { notFound, redirect } from \"next/navigation\"\nimport { authOptions"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/errors/loading.tsx",
"chars": 681,
"preview": "import { Skeleton } from \"@/components/ui/skeleton\"\n\nexport default function Loading() {\n return (\n <div class"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/errors/page.tsx",
"chars": 2816,
"preview": "import { getCurrentUser } from \"@/lib/session\"\nimport { notFound, redirect } from \"next/navigation\"\nimport { authOptions"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/inquiries/loading.tsx",
"chars": 681,
"preview": "import { Skeleton } from \"@/components/ui/skeleton\"\n\nexport default function Loading() {\n return (\n <div class"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/inquiries/page.tsx",
"chars": 2846,
"preview": "import { getCurrentUser } from \"@/lib/session\"\nimport { notFound, redirect } from \"next/navigation\"\nimport { authOptions"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/loading.tsx",
"chars": 681,
"preview": "import { Skeleton } from \"@/components/ui/skeleton\"\n\nexport default function Loading() {\n return (\n <div class"
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/not-found.tsx",
"chars": 721,
"preview": "import Link from \"next/link\"\n\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { EmptyPlaceholder } from \""
},
{
"path": "app/(dashboard)/dashboard/chatbots/[chatbotId]/page.tsx",
"chars": 6164,
"preview": "import { notFound, redirect } from \"next/navigation\"\n\nimport { ChatbotForm } from \"@/components/chatbot-form\"\nimport { D"
},
{
"path": "app/(dashboard)/dashboard/chatbots/loading.tsx",
"chars": 509,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/chatbots/page.tsx",
"chars": 1983,
"preview": "import { redirect } from \"next/navigation\"\n\nimport { authOptions } from \"@/lib/auth\"\nimport { db } from \"@/lib/db\"\nimpor"
},
{
"path": "app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/loading.tsx",
"chars": 508,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/not-found.tsx",
"chars": 730,
"preview": "import Link from \"next/link\"\n\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { EmptyPlaceholder } from \""
},
{
"path": "app/(dashboard)/dashboard/crawlers/[crawlerId]/crawl/page.tsx",
"chars": 2980,
"preview": "\nimport { notFound, redirect } from \"next/navigation\"\nimport { Crawler, User } from \"@prisma/client\"\n\nimport { Dashboard"
},
{
"path": "app/(dashboard)/dashboard/crawlers/[crawlerId]/loading.tsx",
"chars": 681,
"preview": "import { Skeleton } from \"@/components/ui/skeleton\"\n\nexport default function Loading() {\n return (\n <div class"
},
{
"path": "app/(dashboard)/dashboard/crawlers/[crawlerId]/not-found.tsx",
"chars": 730,
"preview": "import Link from \"next/link\"\n\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { EmptyPlaceholder } from \""
},
{
"path": "app/(dashboard)/dashboard/crawlers/[crawlerId]/page.tsx",
"chars": 1877,
"preview": "\nimport { notFound, redirect } from \"next/navigation\"\nimport { Crawler, User } from \"@prisma/client\"\n\nimport { Dashboard"
},
{
"path": "app/(dashboard)/dashboard/crawlers/loading.tsx",
"chars": 533,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/crawlers/page.tsx",
"chars": 2399,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { authOptions } from \"@/lib/auth\"\nimport { getCurrentUser } from \"@/"
},
{
"path": "app/(dashboard)/dashboard/exports/page.tsx",
"chars": 4000,
"preview": "import { redirect } from \"next/navigation\"\n\nimport { DashboardHeader } from \"@/components/header\"\nimport { DashboardShel"
},
{
"path": "app/(dashboard)/dashboard/files/loading.tsx",
"chars": 518,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/files/page.tsx",
"chars": 4215,
"preview": "import { redirect } from \"next/navigation\"\n\nimport { DashboardHeader } from \"@/components/header\"\nimport { DashboardShel"
},
{
"path": "app/(dashboard)/dashboard/files/upload/loading.tsx",
"chars": 548,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/files/upload/page.tsx",
"chars": 1380,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { DashboardHeader } from \"@/components/header\"\nimport { DashboardShe"
},
{
"path": "app/(dashboard)/dashboard/layout.tsx",
"chars": 2988,
"preview": "import { notFound } from \"next/navigation\"\nimport { dashboardConfig } from \"@/config/dashboard\"\nimport { getCurrentUser "
},
{
"path": "app/(dashboard)/dashboard/loading.tsx",
"chars": 603,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { ChatbotCreateButton } from \"@/components/chatbot-crea"
},
{
"path": "app/(dashboard)/dashboard/new/chatbot/loading.tsx",
"chars": 540,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/new/chatbot/page.tsx",
"chars": 1473,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { NewChatbotForm } from \"@/components/new-chatbot-form\"\n\nimport { Da"
},
{
"path": "app/(dashboard)/dashboard/new/crawler/loading.tsx",
"chars": 530,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/new/crawler/page.tsx",
"chars": 1370,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { DashboardHeader } from \"@/components/header\"\nimport { DashboardShe"
},
{
"path": "app/(dashboard)/dashboard/new/export/loading.tsx",
"chars": 530,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/new/export/page.tsx",
"chars": 1652,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { DashboardHeader } from \"@/components/header\"\nimport { DashboardShe"
},
{
"path": "app/(dashboard)/dashboard/new/importChatbot/loading.tsx",
"chars": 540,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/new/importChatbot/page.tsx",
"chars": 1403,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { DashboardHeader } from \"@/components/header\"\nimport { DashboardShe"
},
{
"path": "app/(dashboard)/dashboard/onboarding/loading.tsx",
"chars": 512,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/onboarding/page.tsx",
"chars": 7110,
"preview": "import { redirect } from \"next/navigation\"\n\nimport { authOptions } from \"@/lib/auth\"\nimport { getCurrentUser } from \"@/l"
},
{
"path": "app/(dashboard)/dashboard/page.tsx",
"chars": 9032,
"preview": "import { redirect } from \"next/navigation\"\n\nimport { authOptions } from \"@/lib/auth\"\nimport { db } from \"@/lib/db\"\nimpor"
},
{
"path": "app/(dashboard)/dashboard/settings/loading.tsx",
"chars": 522,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/settings/page.tsx",
"chars": 1729,
"preview": "\nimport { redirect } from \"next/navigation\"\n\nimport { authOptions } from \"@/lib/auth\"\nimport { getCurrentUser } from \"@/"
},
{
"path": "app/(dashboard)/dashboard/support/loading.tsx",
"chars": 496,
"preview": "import { CardSkeleton } from \"@/components/card-skeleton\"\nimport { DashboardHeader } from \"@/components/header\"\nimport {"
},
{
"path": "app/(dashboard)/dashboard/support/page.tsx",
"chars": 2056,
"preview": "import { DashboardHeader } from \"@/components/header\"\nimport { Icons } from \"@/components/icons\"\nimport { DashboardShell"
},
{
"path": "app/(docs)/docs/[[...slug]]/page.tsx",
"chars": 2909,
"preview": "import { notFound } from \"next/navigation\"\nimport { allDocs } from \"contentlayer/generated\"\n\nimport { getTableOfContents"
},
{
"path": "app/(docs)/docs/layout.tsx",
"chars": 644,
"preview": "import { docsConfig } from \"@/config/docs\"\nimport { DocsSidebarNav } from \"@/components/sidebar-nav\"\n\ninterface DocsLayo"
},
{
"path": "app/(docs)/guides/[...slug]/page.tsx",
"chars": 3348,
"preview": "import Link from \"next/link\"\nimport { notFound } from \"next/navigation\"\nimport { allGuides } from \"contentlayer/generate"
},
{
"path": "app/(docs)/guides/layout.tsx",
"chars": 201,
"preview": "\ninterface GuidesLayoutProps {\n children: React.ReactNode\n}\n\nexport default function GuidesLayout({ children }: Guide"
},
{
"path": "app/(docs)/guides/page.tsx",
"chars": 2711,
"preview": "import Link from \"next/link\"\nimport { allGuides } from \"contentlayer/generated\"\nimport { compareDesc } from \"date-fns\"\n\n"
},
{
"path": "app/(docs)/layout.tsx",
"chars": 1648,
"preview": "import Link from \"next/link\"\n\nimport { docsConfig } from \"@/config/docs\"\nimport { siteConfig } from \"@/config/site\"\nimpo"
},
{
"path": "app/(embed)/embed/[id]/button/page.tsx",
"chars": 732,
"preview": "import ChatbotButton from '@/components/chatbot-button';\nimport { db } from '@/lib/db';\nimport { notFound } from 'next/n"
},
{
"path": "app/(embed)/embed/[id]/window/page.tsx",
"chars": 763,
"preview": "import ChatWindow from '@/app/(dashboard)/dashboard/chatbots/[chatbotId]/chat/chatWindow/page';\n\nexport interface ChatCo"
},
{
"path": "app/(embed)/layout.tsx",
"chars": 151,
"preview": "\ninterface AuthLayoutProps {\n children: React.ReactNode\n}\n\nexport default function AuthLayout({ children }: AuthLayou"
},
{
"path": "app/(marketing)/changelog/page.tsx",
"chars": 29338,
"preview": "import { siteConfig } from '@/config/site'\nimport { twMerge } from 'tailwind-merge'\n\nexport default function ChangelogPa"
},
{
"path": "app/(marketing)/layout.tsx",
"chars": 1902,
"preview": "'use client'\n\nimport Link from \"next/link\"\n\nimport { marketingConfig } from \"@/config/marketing\"\nimport { cn } from \"@/l"
},
{
"path": "app/(marketing)/page.tsx",
"chars": 21876,
"preview": "import { GithubCard } from \"@/components/github-card\";\nimport { buttonVariants } from \"@/components/ui/button\";\nimport {"
},
{
"path": "app/(welcome)/layout.tsx",
"chars": 184,
"preview": "interface AuthLayoutProps {\n children: React.ReactNode\n}\n\nexport default function AuthLayout({ children }: AuthLayoutPr"
},
{
"path": "app/(welcome)/welcome/page.tsx",
"chars": 2939,
"preview": "import Link from \"next/link\";\n\nimport { Metadata } from \"next\";\n\nimport { cn } from \"@/lib/utils\"\nimport { Button, butto"
},
{
"path": "app/api/auth/[...nextauth]/route.ts",
"chars": 161,
"preview": "import NextAuth from \"next-auth\";\nimport { authOptions } from '@/lib/auth';\n\nconst handler = NextAuth(authOptions);\n\nexp"
},
{
"path": "app/api/chatbots/[chatbotId]/chat/file/[fileId]/route.ts",
"chars": 889,
"preview": "import { db } from \"@/lib/db\";\nimport { OpenAI } from \"openai\";\nimport { z } from \"zod\";\n\nimport { handleFileFunction } "
},
{
"path": "app/api/chatbots/[chatbotId]/chat/route.ts",
"chars": 8736,
"preview": "import { db } from \"@/lib/db\"\nimport OpenAI from \"openai\"\n\nimport { z } from \"zod\"\nimport { getUserSubscriptionPlan } fr"
},
{
"path": "app/api/chatbots/[chatbotId]/config/advanced/route.ts",
"chars": 2335,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { RequiresHigherPlanError } from \"@/lib/"
},
{
"path": "app/api/chatbots/[chatbotId]/config/branding/route.ts",
"chars": 2234,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { RequiresHigherPlanError } from \"@/lib/"
},
{
"path": "app/api/chatbots/[chatbotId]/config/customization/route.ts",
"chars": 3602,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { RequiresHigherPlanError } from \"@/lib/"
},
{
"path": "app/api/chatbots/[chatbotId]/config/fileAttachement/route.ts",
"chars": 2228,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { RequiresHigherPlanError } from \"@/lib/"
},
{
"path": "app/api/chatbots/[chatbotId]/config/inquiry/route.ts",
"chars": 2718,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { RequiresHigherPlanError } from \"@/lib/"
},
{
"path": "app/api/chatbots/[chatbotId]/config/route.ts",
"chars": 1671,
"preview": "import { db } from \"@/lib/db\";\nimport { z } from \"zod\";\n\nconst routeContextSchema = z.object({\n params: z.object({\n "
},
{
"path": "app/api/chatbots/[chatbotId]/config/security/route.ts",
"chars": 1965,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { RequiresHigherPlanError } from \"@/lib/"
},
{
"path": "app/api/chatbots/[chatbotId]/errors/[errorId]/route.ts",
"chars": 1204,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { getServerSession } from \"next-auth\";\ni"
},
{
"path": "app/api/chatbots/[chatbotId]/imported/route.ts",
"chars": 3503,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { importChatbotSchema } from \"@/lib/vali"
},
{
"path": "app/api/chatbots/[chatbotId]/inquiries/[inquiryId]/route.ts",
"chars": 1645,
"preview": "\nimport { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { z } from \"zod\"\nimport { getServerSess"
},
{
"path": "app/api/chatbots/[chatbotId]/inquiries/route.ts",
"chars": 2932,
"preview": "import { db } from \"@/lib/db\";\nimport { RequiresHigherPlanError } from \"@/lib/exceptions\";\nimport { getUserSubscriptionP"
},
{
"path": "app/api/chatbots/[chatbotId]/route.ts",
"chars": 7163,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { chatbotSchema } from \"@/lib/validation"
},
{
"path": "app/api/chatbots/import/route.ts",
"chars": 2933,
"preview": "import { getServerSession } from \"next-auth\";\nimport { authOptions } from \"@/lib/auth\";\n\nimport { db } from \"@/lib/db\"\ni"
},
{
"path": "app/api/chatbots/route.ts",
"chars": 5262,
"preview": "import { getServerSession } from \"next-auth\";\nimport { authOptions } from \"@/lib/auth\";\n\nimport { db } from \"@/lib/db\"\ni"
},
{
"path": "app/api/crawlers/[crawlerId]/crawling/route.ts",
"chars": 6341,
"preview": "\nimport { getServerSession } from \"next-auth/next\"\nimport { z } from \"zod\"\n\nimport { authOptions } from \"@/lib/auth\"\nimp"
},
{
"path": "app/api/crawlers/[crawlerId]/route.ts",
"chars": 2764,
"preview": "\nimport { getServerSession } from \"next-auth/next\"\nimport { z } from \"zod\"\nimport { del } from '@vercel/blob';\n\nimport {"
},
{
"path": "app/api/crawlers/route.ts",
"chars": 2549,
"preview": "import { getServerSession } from \"next-auth\";\nimport { authOptions } from \"@/lib/auth\";\nimport * as z from \"zod\"\n\nimport"
},
{
"path": "app/api/exports/[exportId]/route.ts",
"chars": 1778,
"preview": "import { del } from '@vercel/blob';\nimport { NextResponse } from 'next/server';\nimport { getServerSession } from \"next-a"
},
{
"path": "app/api/exports/route.ts",
"chars": 3091,
"preview": "import { authOptions } from \"@/lib/auth\";\nimport { db } from \"@/lib/db\";\nimport { exportMessagesSchema } from \"@/lib/val"
},
{
"path": "app/api/files/[fileId]/route.ts",
"chars": 2520,
"preview": "import { del } from '@vercel/blob';\nimport { NextResponse } from 'next/server';\nimport { getServerSession } from \"next-a"
},
{
"path": "app/api/files/route.ts",
"chars": 823,
"preview": "import { getServerSession } from \"next-auth\";\nimport { authOptions } from \"@/lib/auth\";\n\nimport { db } from \"@/lib/db\"\n\n"
},
{
"path": "app/api/models/route.ts",
"chars": 409,
"preview": "import { db } from \"@/lib/db\"\n\nexport const revalidate = 60\n\nexport async function GET(request: Request) {\n try {\n\n "
},
{
"path": "app/api/og/route.tsx",
"chars": 9101,
"preview": "import { ImageResponse } from \"@vercel/og\"\n\nimport { ogImageSchema } from \"@/lib/validations/og\"\n\nexport const runtime ="
},
{
"path": "app/api/route.ts",
"chars": 268,
"preview": "\nexport const dynamic = 'force-dynamic' // defaults to auto\n\nexport async function GET(request: Request) {\n return ne"
},
{
"path": "app/api/session/route.ts",
"chars": 315,
"preview": "\nimport { getServerSession } from \"next-auth\";\nimport { authOptions } from \"@/lib/auth\";\nimport { NextResponse } from \"n"
},
{
"path": "app/api/upload/route.ts",
"chars": 3051,
"preview": "import { put } from '@vercel/blob';\nimport { NextResponse } from 'next/server';\nimport { getServerSession } from \"next-a"
},
{
"path": "app/api/users/[userId]/notifications/route.ts",
"chars": 1547,
"preview": "import { getServerSession } from \"next-auth/next\"\nimport { z } from \"zod\"\n\nimport { authOptions } from \"@/lib/auth\"\nimpo"
},
{
"path": "app/api/users/[userId]/openai/models/route.ts",
"chars": 1632,
"preview": "import { getServerSession } from \"next-auth/next\"\nimport { z } from \"zod\"\n\nimport { authOptions } from \"@/lib/auth\"\nimpo"
},
{
"path": "app/api/users/[userId]/openai/route.ts",
"chars": 1880,
"preview": "import { getServerSession } from \"next-auth/next\"\nimport { z } from \"zod\"\n\nimport { authOptions } from \"@/lib/auth\"\nimpo"
},
{
"path": "app/api/users/[userId]/route.ts",
"chars": 1423,
"preview": "import { getServerSession } from \"next-auth/next\"\nimport { z } from \"zod\"\n\nimport { authOptions } from \"@/lib/auth\"\nimpo"
},
{
"path": "app/api/users/stripe/route.ts",
"chars": 3514,
"preview": "import { getServerSession } from \"next-auth/next\"\nimport { z } from \"zod\"\n\nimport { authOptions } from \"@/lib/auth\"\nimpo"
},
{
"path": "app/api/webhooks/stripe/route.ts",
"chars": 4193,
"preview": "\nimport { headers } from \"next/headers\"\nimport Stripe from \"stripe\"\n\nimport { db } from \"@/lib/db\"\nimport { stripe } fro"
},
{
"path": "app/global-error.jsx",
"chars": 332,
"preview": "\"use client\";\n\nimport * as Sentry from \"@sentry/nextjs\";\nimport Error from \"next/error\";\nimport { useEffect } from \"reac"
},
{
"path": "app/layout.tsx",
"chars": 1744,
"preview": "import { Analytics } from '@vercel/analytics/react'\n// These styles apply to every route in the application\nimport \"@/st"
},
{
"path": "components/aos-init.tsx",
"chars": 203,
"preview": "'use client';\n\nimport { useEffect } from 'react';\nimport AOS from \"aos\";\nimport \"aos/dist/aos.css\";\n\nexport const AOSIni"
},
{
"path": "components/auth-status.tsx",
"chars": 381,
"preview": "import { getServerSession } from \"next-auth/next\";\n\nexport default async function AuthStatus() {\n const session = await"
},
{
"path": "components/background.tsx",
"chars": 2234,
"preview": "export function Background() {\n return (\n <div style={styles.backgroundMain}>\n <div style={styles.backgro"
},
{
"path": "components/billing-form.tsx",
"chars": 16732,
"preview": "\"use client\"\n\nimport { useState } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport {\n Card,\n CardDescription,"
},
{
"path": "components/button-scroll-to-bottom.tsx",
"chars": 948,
"preview": "'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\nimport { Button, type ButtonProps } from "
},
{
"path": "components/callout.tsx",
"chars": 677,
"preview": "import { cn } from \"@/lib/utils\"\n\ninterface CalloutProps {\n icon?: string\n children?: React.ReactNode\n type?: \""
},
{
"path": "components/card-skeleton.tsx",
"chars": 540,
"preview": "import { Card, CardContent, CardFooter, CardHeader } from \"@/components/ui/card\"\nimport { Skeleton } from \"@/components/"
},
{
"path": "components/chat-export-items.tsx",
"chars": 1535,
"preview": "import Link from \"next/link\"\nimport { ChatbotMessagesExport, File } from \"@prisma/client\"\n\nimport { formatDate } from \"@"
},
{
"path": "components/chat-footer-text.tsx",
"chars": 578,
"preview": "\nimport React from 'react'\n\nimport { cn } from '@/lib/utils'\nimport { ExternalLink } from '@/components/external-link'\ni"
},
{
"path": "components/chat-history.tsx",
"chars": 8948,
"preview": "'use client';\n\nimport { useState } from 'react';\nimport { Button } from \"./ui/button\";\nimport { Card, CardContent, CardH"
},
{
"path": "components/chat-message-actions.tsx",
"chars": 1194,
"preview": "'use client'\n\nimport { type Message } from 'ai'\n\nimport { Button } from '@/components/ui/button'\nimport { useCopyToClipb"
},
{
"path": "components/chat-message.tsx",
"chars": 6613,
"preview": "import { Message } from 'ai'\nimport remarkGfm from 'remark-gfm'\nimport remarkMath from 'remark-math'\n\nimport { MathJax, "
},
{
"path": "components/chat-sdk.tsx",
"chars": 2673,
"preview": "\"use client\"\n\nimport { OpenAssistantGPTChat } from 'openassistantgpt'\nimport { Message } from 'openassistantgpt'\nimport "
},
{
"path": "components/chat.module.css",
"chars": 1598,
"preview": ".chatContainer {\n display: flex;\n flex-direction: column-reverse;\n height: 100%;\n width: 100%;\n}\n\n.inputForm"
},
{
"path": "components/chat.tsx",
"chars": 15806,
"preview": "\"use client\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Cha"
},
{
"path": "components/chatbot-advanced-settings.tsx",
"chars": 6295,
"preview": "\"use client\"\n\nimport { useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \""
},
{
"path": "components/chatbot-branding-pro-settings.tsx",
"chars": 5053,
"preview": "\"use client\"\n\nimport { useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \""
},
{
"path": "components/chatbot-button.tsx",
"chars": 2263,
"preview": "'use client'\n\nimport { Icons } from '@/components/icons';\nimport { useState, useEffect } from 'react';\n\nexport interface"
},
{
"path": "components/chatbot-create-button.tsx",
"chars": 3285,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\n\nimport { cn } from \"@/lib/util"
},
{
"path": "components/chatbot-file-attachement-pro-settings.tsx",
"chars": 5171,
"preview": "\"use client\"\n\nimport { useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \""
},
{
"path": "components/chatbot-form.tsx",
"chars": 15678,
"preview": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolv"
},
{
"path": "components/chatbot-item.tsx",
"chars": 1660,
"preview": "import Link from \"next/link\"\nimport { Chatbot, ChatbotModel } from \"@prisma/client\"\n\nimport { formatDate } from \"@/lib/u"
},
{
"path": "components/chatbot-operations.tsx",
"chars": 5529,
"preview": "\n\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\nimport { useRouter } from \"next/navigation\"\ni"
},
{
"path": "components/chatbot-security-settings.tsx",
"chars": 9590,
"preview": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolv"
},
{
"path": "components/chatbot.tsx",
"chars": 4139,
"preview": "\"use client\"\n\nimport { Suspense, useEffect } from 'react'\nimport { useSearchParams } from \"next/navigation\";\n\n\nexport de"
},
{
"path": "components/crawler-create-button.tsx",
"chars": 1220,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\n\nimport { cn } from \"@/lib/util"
},
{
"path": "components/crawler-form.tsx",
"chars": 9441,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \"@h"
},
{
"path": "components/crawler-item.tsx",
"chars": 1484,
"preview": "import Link from \"next/link\"\nimport { Crawler } from \"@prisma/client\"\n\nimport { formatDate } from \"@/lib/utils\"\nimport {"
},
{
"path": "components/crawler-operations.tsx",
"chars": 4579,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\nimport { useRouter } from \"next/navigation\"\nim"
},
{
"path": "components/customization-settings.tsx",
"chars": 28935,
"preview": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useForm } from \"react-hook-form\"\nimport { z"
},
{
"path": "components/empty-placeholder.tsx",
"chars": 2071,
"preview": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Icons } from \"@/components/icons\"\n\ninterface E"
},
{
"path": "components/error-items.tsx",
"chars": 1282,
"preview": "import { ChatbotErrors } from \"@prisma/client\"\n\nimport { formatDate } from \"@/lib/utils\"\nimport { Skeleton } from \"@/com"
},
{
"path": "components/error-operations.tsx",
"chars": 4187,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { ChatbotErrors } from \""
},
{
"path": "components/error-short-item.tsx",
"chars": 2000,
"preview": "import Link from \"next/link\"\nimport { ChatbotErrors } from \"@prisma/client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { S"
},
{
"path": "components/export-messages-button.tsx",
"chars": 1223,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\n\nimport { cn } from \"@/lib/util"
},
{
"path": "components/external-link.tsx",
"chars": 805,
"preview": "export function ExternalLink({\n href,\n children\n}: {\n href: string\n children: React.ReactNode\n}) {\n retur"
},
{
"path": "components/faq.tsx",
"chars": 3440,
"preview": "/**\n * This code was generated by v0 by Vercel.\n * @see https://v0.dev/t/q78qlbK\n */\nimport { AccordionTrigger, Accordio"
},
{
"path": "components/file-items.tsx",
"chars": 1414,
"preview": "import Link from \"next/link\"\nimport { File } from \"@prisma/client\"\n\nimport { formatDate } from \"@/lib/utils\"\nimport { Sk"
},
{
"path": "components/file-operations.tsx",
"chars": 4501,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\nimport { useRouter } from \"next/navigation\"\nim"
},
{
"path": "components/file-upload-button.tsx",
"chars": 1212,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\n\nimport { cn } from \"@/lib/util"
},
{
"path": "components/github-card.tsx",
"chars": 3689,
"preview": "\nimport {\n ChevronDownIcon,\n CircleIcon,\n StarIcon,\n} from \"@radix-ui/react-icons\"\n\nimport { Button } from \"@/c"
},
{
"path": "components/github-login-form.tsx",
"chars": 1297,
"preview": "\"use client\";\n\nimport { useState } from \"react\";\nimport { useSearchParams } from \"next/navigation\"\nimport { signIn } fro"
},
{
"path": "components/google-login-form.tsx",
"chars": 1297,
"preview": "\"use client\";\n\nimport { useState } from \"react\";\nimport { signIn } from \"next-auth/react\";\nimport { useSearchParams } fr"
},
{
"path": "components/gradient-picker.tsx",
"chars": 5935,
"preview": "'use client'\n\nimport { Button } from '@/components/ui/button'\nimport { Input } from '@/components/ui/input'\nimport {\n "
},
{
"path": "components/header.tsx",
"chars": 550,
"preview": "interface DashboardHeaderProps {\n heading: string\n text?: string\n children?: React.ReactNode\n}\n\nexport function"
},
{
"path": "components/icons.tsx",
"chars": 4159,
"preview": "import {\n AlertTriangle,\n ArrowRight,\n Check,\n ChevronLeft,\n ChevronRight,\n Command,\n CreditCard,\n File,\n FileT"
},
{
"path": "components/imported-chatbot-form.tsx",
"chars": 11106,
"preview": "\"use client\"\n\nimport { useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \""
},
{
"path": "components/inquiries.tsx",
"chars": 3134,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n"
},
{
"path": "components/inquiry-display.tsx",
"chars": 6022,
"preview": "\"use client\"\n\nimport format from \"date-fns/format\"\nimport {\n Trash2,\n} from \"lucide-react\"\n\nimport {\n Avatar,\n "
},
{
"path": "components/inquiry-extension.tsx",
"chars": 4836,
"preview": "\"use client\"\n\nimport { Button } from './ui/button';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n D"
},
{
"path": "components/inquiry-item.tsx",
"chars": 2006,
"preview": "import Link from \"next/link\"\nimport { ClientInquiries } from \"@prisma/client\"\n\nimport { cn } from \"@/lib/utils\"\nimport {"
},
{
"path": "components/inquiry-list.tsx",
"chars": 2051,
"preview": "\"use client\"\n\nimport formatDistanceToNow from \"date-fns/formatDistanceToNow\"\n\nimport { cn } from \"@/lib/utils\"\nimport { "
},
{
"path": "components/inquiry-settings.tsx",
"chars": 16681,
"preview": "\"use client\"\n\nimport { zodResolver } from \"@hookform/resolvers/zod\"\nimport { useForm } from \"react-hook-form\"\nimport { z"
},
{
"path": "components/loading-dots.module.css",
"chars": 564,
"preview": ".loading {\n display: inline-flex;\n align-items: center;\n}\n\n.loading .spacer {\n margin-right: 2px;\n}\n\n.loading span {\n"
},
{
"path": "components/loading-dots.tsx",
"chars": 363,
"preview": "import styles from \"./loading-dots.module.css\";\n\nconst LoadingDots = ({ color = \"#000\" }: { color?: string }) => {\n ret"
},
{
"path": "components/main-nav.tsx",
"chars": 1924,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\nimport { useSelectedLayoutSegment } from \"next"
},
{
"path": "components/markdown.tsx",
"chars": 301,
"preview": "import { FC, memo } from 'react'\nimport ReactMarkdown, { Options } from 'react-markdown'\n\nexport const MemoizedReactMark"
},
{
"path": "components/mdx-card.tsx",
"chars": 1036,
"preview": "import Link from \"next/link\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface CardProps extends React.HTMLAttributes<HTMLDiv"
},
{
"path": "components/mdx-components.tsx",
"chars": 4727,
"preview": "import * as React from \"react\"\nimport Image from \"next/image\"\nimport { useMDXComponent } from \"next-contentlayer/hooks\"\n"
},
{
"path": "components/message-overview.tsx",
"chars": 923,
"preview": "\"use client\"\n\nimport { Bar, BarChart, ResponsiveContainer, XAxis, YAxis } from \"recharts\"\n\ninterface OverviewProps {\n "
},
{
"path": "components/messages-export-operation.tsx",
"chars": 4648,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport Link from \"next/link\"\nimport { useRouter } from \"next/navigation\"\nim"
},
{
"path": "components/mobile-nav.tsx",
"chars": 1484,
"preview": "import * as React from \"react\"\nimport Link from \"next/link\"\n\nimport { MainNavItem } from \"@/types\"\nimport { siteConfig }"
},
{
"path": "components/move-to-crawlers-button.tsx",
"chars": 1227,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\n\nimport { cn } from \"@/lib/util"
},
{
"path": "components/nav.tsx",
"chars": 2219,
"preview": "\n\"use client\"\n\nimport Link from \"next/link\"\nimport { usePathname } from \"next/navigation\"\n\nimport { SidebarNavItem } fro"
},
{
"path": "components/new-chatbot-form.tsx",
"chars": 14879,
"preview": "'use client'\n\nimport { useEffect, useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolv"
},
{
"path": "components/new-crawler-form.tsx",
"chars": 9179,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \"@h"
},
{
"path": "components/new-import-chatbot-form.tsx",
"chars": 9770,
"preview": "'use client'\n\nimport { useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \""
},
{
"path": "components/new-message-export.tsx",
"chars": 6106,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \"@h"
},
{
"path": "components/next-auth-provider.tsx",
"chars": 247,
"preview": "'use client';\n\nimport { SessionProvider } from 'next-auth/react';\nimport { ReactNode } from 'react';\n\nexport default fun"
},
{
"path": "components/notification-settings-form.tsx",
"chars": 5852,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \"@h"
},
{
"path": "components/openai-config-form.tsx",
"chars": 5251,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { zodResolver } from \"@h"
},
{
"path": "components/page-header.tsx",
"chars": 643,
"preview": "import { cn } from \"@/lib/utils\"\n\ninterface DocsPageHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n headi"
},
{
"path": "components/pager.tsx",
"chars": 1853,
"preview": "import Link from \"next/link\"\nimport { Doc } from \"contentlayer/generated\"\n\nimport { docsConfig } from \"@/config/docs\"\nim"
},
{
"path": "components/sdk-banner.tsx",
"chars": 1627,
"preview": "\"use client\";\n\nimport { Icons } from \"./icons\"\n\nimport React, { useState } from 'react';\n\nexport function SDKBanner() {\n"
},
{
"path": "components/shell.tsx",
"chars": 382,
"preview": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\ninterface DashboardShellProps extends React.HTMLAttrib"
},
{
"path": "components/sidebar-nav.tsx",
"chars": 2107,
"preview": "\"use client\"\n\nimport Link from \"next/link\"\nimport { usePathname } from \"next/navigation\"\n\nimport { SidebarNavItem } from"
},
{
"path": "components/site-footer.tsx",
"chars": 2400,
"preview": "import * as React from \"react\"\n\nimport { siteConfig } from \"@/config/site\"\nimport { Icons } from \"@/components/icons\"\nim"
},
{
"path": "components/start-crawling-button.tsx",
"chars": 2438,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { useRouter } from \"next/navigation\"\n\nimport { cn } from \"@/lib/util"
},
{
"path": "components/theme-provider.tsx",
"chars": 323,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { ThemeProvider as NextThemesProvider } from \"next-themes\"\nimport { "
},
{
"path": "components/toc.tsx",
"chars": 3236,
"preview": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { TableOfContents } from \"@/lib/toc\"\nimport { cn } from \"@/lib/util"
},
{
"path": "components/ui/accordion.tsx",
"chars": 1991,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { Ch"
},
{
"path": "components/ui/alert-dialog.tsx",
"chars": 4657,
"preview": "\n\"use client\"\n\nimport * as React from \"react\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimpo"
},
{
"path": "components/ui/avatar.tsx",
"chars": 1510,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } fr"
},
{
"path": "components/ui/badge.tsx",
"chars": 1253,
"preview": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/"
},
{
"path": "components/ui/button.tsx",
"chars": 1711,
"preview": "import * as React from \"react\"\nimport { VariantProps, cva } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/u"
},
{
"path": "components/ui/calendar.tsx",
"chars": 3298,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronLeftIcon, ChevronRightIcon } from \"@radix-ui/react-icons\"\ni"
},
{
"path": "components/ui/card.tsx",
"chars": 2014,
"preview": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n "
},
{
"path": "components/ui/checkbox.tsx",
"chars": 1132,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Chec"
},
{
"path": "components/ui/codeblock.tsx",
"chars": 4739,
"preview": "'use client'\n\nimport { FC, memo } from 'react'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimp"
},
{
"path": "components/ui/dialog.tsx",
"chars": 4171,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { Cross2Ic"
},
{
"path": "components/ui/dropdown-menu.tsx",
"chars": 7440,
"preview": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimpo"
},
{
"path": "components/ui/form.tsx",
"chars": 4459,
"preview": "import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { Slot } from \"@radix-ui/r"
},
{
"path": "components/ui/input.tsx",
"chars": 883,
"preview": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface InputProps\n extends React.InputHTM"
}
]
// ... and 125 more files (download for full content)
About this extraction
This page contains the full source code of the OpenAssistantGPT/OpenAssistantGPT GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 325 files (1.6 MB), approximately 485.4k tokens, and a symbol index with 2070 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.