+ {children}
+
+ diff --git a/README-FRONTEND.md b/README-FRONTEND.md new file mode 100644 index 0000000..f45500b --- /dev/null +++ b/README-FRONTEND.md @@ -0,0 +1,412 @@ +# HackLearn - Ethical Hacking Tutorial Platform + +A modern, dark-themed web platform for learning ethical hacking through interactive tutorials. Built with React, Vite, and dynamic markdown rendering. + +## 🚀 Quick Start + +### Prerequisites + +- **Node.js**: Version 20.19+ or 22.12+ recommended +- **npm**: Version 9.0 or higher +- **Git**: For version control + +### Installation + +1. **Clone the repository** + ```bash + git clone https://github.com/HarzhMehta/hacking-tutorial_fork.git + cd hacking-tutorial_fork + ``` + +2. **Navigate to frontend directory** + ```bash + cd UI/frontend + ``` + +3. **Install dependencies** + ```bash + npm install + ``` + +4. **Start development server** + ```bash + npm run dev + ``` + +5. **Open in browser** + - The app will run at `http://localhost:5173` + - Navigate to any lesson using the sidebar + +### Build for Production + +```bash +npm run build +``` + +The production-ready files will be in the `dist/` folder. + +### Preview Production Build + +```bash +npm run preview +``` + +--- + +## 📝 Markdown File Format Rules + +All tutorial lessons **must** follow this frontmatter format for proper rendering and navigation. + +### Required Frontmatter Structure + +Every `.md` file in the content folders (`ethical-hacking/`, `python-for-eth-hacking/`, etc.) must include frontmatter at the top: + +```markdown +--- +title: "Your Lesson Title" +slug: "lesson-slug-name" +order: 1 +category: "category-name" +prev: "previous-lesson-slug" +next: "next-lesson-slug" +--- + +# Your Lesson Content Starts Here + +Regular markdown content... +``` + +### Field Definitions + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `title` | String | ✅ Yes | Display name of the lesson (shown in navigation) | +| `slug` | String | ✅ Yes | URL-friendly identifier (must be unique) | +| `order` | Number | ✅ Yes | Sequential order for sorting (1, 2, 3, ...) | +| `category` | String | ✅ Yes | Group lessons by topic (e.g., "ethical-hacking") | +| `prev` | String | ⚠️ Optional | Slug of the previous lesson (null for first lesson) | +| `next` | String | ⚠️ Optional | Slug of the next lesson (null for last lesson) | + +### Example: Complete Lesson File + +**File:** `ethical-hacking/lesson-01.md` + +```markdown +--- +title: "Introduction to Ethical Hacking" +slug: "lesson-01" +order: 1 +category: "ethical-hacking" +prev: null +next: "lesson-02" +--- + +# Introduction to Ethical Hacking + +Welcome to the first lesson! In this tutorial, you'll learn: + +- What is ethical hacking? +- Legal and ethical considerations +- Essential tools and techniques + +## Getting Started + +To begin your journey... + +### Prerequisites + +- Basic understanding of networking +- Linux command line familiarity +- Python programming basics + +## Course Structure + +This course is divided into multiple modules: + +1. **Network Fundamentals** +2. **Reconnaissance Techniques** +3. **Vulnerability Assessment** +4. **Exploitation Methods** + +--- + +**Next Lesson:** [Network Scanning Basics](lesson-02) +``` + +### Naming Conventions + +#### File Names +- Use lowercase with hyphens: `lesson-01.md`, `network-scanning.md` +- Be descriptive: `lesson-password-cracking.md` (not `lesson-7.md`) +- Keep consistent across categories + +#### Slugs +- Must match the file name (without `.md`) +- Use lowercase letters, numbers, and hyphens only +- Examples: `lesson-01`, `wifi-hacking`, `python-basics` + +#### Categories +Available categories (must match exactly): +- `ethical-hacking` - General cybersecurity topics +- `python-for-ethical-hacking` - Python scripting lessons +- `binary-exploitation` - Low-level exploitation +- `cli-editors` - Command-line tools + +### Navigation Chain + +Lessons must form a **complete chain** using `prev` and `next` fields: + +``` +lesson-01 → lesson-02 → lesson-03 → ... → lesson-N +(prev: null) (next: null) +``` + +**Example Navigation Setup:** + +```markdown + +--- +prev: null +next: "lesson-02" +--- + + +--- +prev: "lesson-01" +next: "lesson-03" +--- + + +--- +prev: "lesson-02" +next: null +--- +``` + +### Supported Markdown Features + +The platform supports **GitHub Flavored Markdown** (GFM): + +✅ **Supported:** +- Headers (H1-H6) +- Bold, italic, strikethrough +- Code blocks with syntax highlighting +- Inline code +- Lists (ordered and unordered) +- Links and images +- Blockquotes +- Tables +- Task lists +- Raw HTML (limited) + +#### Code Blocks with Syntax Highlighting + +```python +# Python example +def scan_network(target): + print(f"Scanning {target}...") + return results +``` + +```bash +# Bash example +nmap -sV -O 192.168.1.1 +``` + +#### Tables + +```markdown +| Tool | Purpose | Difficulty | +|------|---------|------------| +| Nmap | Port Scanning | Beginner | +| Metasploit | Exploitation | Advanced | +``` + +#### Images + +```markdown + +``` + +--- + +## 📁 Project Structure + +``` +hacking-tutorial_fork/ +├── UI/ +│ └── frontend/ +│ ├── src/ +│ │ ├── components/ +│ │ │ ├── LessonTemplate.jsx # Renders markdown content +│ │ │ ├── LessonTemplate.css # Lesson styling +│ │ │ └── Navbar.jsx # Top navigation +│ │ ├── pages/ +│ │ │ └── LessonPage.jsx # Dynamic lesson route +│ │ ├── utils/ +│ │ │ └── markdownloader.js # Loads & parses MD files +│ │ ├── App.jsx # Main app & routing +│ │ ├── App.css # Global styles +│ │ └── index.css # CSS variables +│ ├── package.json +│ └── vite.config.js +├── ethical-hacking/ # Lesson content +│ ├── lesson-01.md +│ ├── lesson-02.md +│ └── ... +├── python-for-eth-hacking/ # Python tutorials +│ └── ... +└── imgs/ # Shared images +``` + +--- + +## 🎨 Theme & Styling + +The platform uses a **dark hacker theme** with bright green accents: + +### CSS Variables + +```css +--bg-primary: #0a0e1a /* Dark navy background */ +--bg-secondary: #121829 /* Slightly lighter panels */ +--bg-tertiary: #1a1f3a /* Elevated elements */ +--accent-green: #00ff88 /* Bright neon green */ +--accent-green-light: #33ffaa /* Lighter green hover */ +--text-primary: #e5e7eb /* Light gray text */ +--text-secondary: #9ca3af /* Muted gray */ +``` + +### Customization + +Edit `src/index.css` to change theme colors globally. + +--- + +## 🔧 Adding New Lessons + +### Step 1: Create Markdown File + +Create a new `.md` file in the appropriate category folder: + +```bash +# Example: Adding a new lesson +cd ethical-hacking +touch lesson-network-security.md +``` + +### Step 2: Add Frontmatter + +```markdown +--- +title: "Network Security Fundamentals" +slug: "lesson-network-security" +order: 7 +category: "ethical-hacking" +prev: "lesson-06" +next: "lesson-08" +--- + +# Your content here... +``` + +### Step 3: Update Navigation Chain + +Update the `next` field of the previous lesson and `prev` field of the next lesson: + +```markdown + +--- +next: "lesson-network-security" # Changed from "lesson-08" +--- + + +--- +prev: "lesson-network-security" # Changed from "lesson-06" +--- +``` + +### Step 4: Test Locally + +```bash +npm run dev +# Navigate to http://localhost:5173/lessons/lesson-network-security +``` + +--- + +## 🐛 Troubleshooting + +### "No lessons found" Error +- **Cause:** Frontmatter parsing failed or missing `query: '?raw'` in Vite config +- **Fix:** Ensure all `.md` files have valid frontmatter and check `vite.config.js` + +### Navigation buttons not working +- **Cause:** Incorrect `prev`/`next` slug values +- **Fix:** Verify slugs match exactly (case-sensitive) + +### Styles not applying +- **Cause:** CSS variable not defined or typo +- **Fix:** Check `index.css` for all `--variable-name` definitions + +### Dev server won't start +- **Cause:** Node.js version incompatibility +- **Fix:** Upgrade to Node.js 20.19+ or 22.12+ + +--- + +## 📦 Dependencies + +### Core +- **React** (^18.3.1) - UI framework +- **React Router DOM** (^7.1.1) - Client-side routing +- **Vite** (^6.0.5) - Build tool + +### Markdown Processing +- **react-markdown** (^9.0.1) - Markdown renderer +- **gray-matter** (^4.0.3) - Frontmatter parser +- **remark-gfm** (^4.0.0) - GitHub Flavored Markdown +- **rehype-raw** (^7.0.0) - Raw HTML support + +--- + +## 🤝 Contributing + +1. **Fork the repository** +2. **Create a feature branch** (`git checkout -b feature/new-lesson`) +3. **Follow the markdown format rules** (see above) +4. **Test locally** with `npm run dev` +5. **Commit changes** (`git commit -m 'Add new lesson on XYZ'`) +6. **Push to branch** (`git push origin feature/new-lesson`) +7. **Open a Pull Request** + +--- + +## 📄 License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +--- + +## 🌟 Features + +✅ Dynamic markdown rendering +✅ Automatic lesson navigation (prev/next) +✅ Dark hacker-themed UI with neon green accents +✅ Syntax highlighting for code blocks +✅ Responsive design (mobile-optimized) +✅ Sidebar lesson browser with categories +✅ Full-width content area +✅ GitHub Flavored Markdown support + +--- + +## 🔗 Links + +- **GitHub Repository:** [HarzhMehta/hacking-tutorial_fork](https://github.com/HarzhMehta/hacking-tutorial_fork) +- **Live Demo:** (Add deployment URL here) +- **Report Issues:** [GitHub Issues](https://github.com/HarzhMehta/hacking-tutorial_fork/issues) + +--- + +**Happy Hacking! 🔐** diff --git a/SYNC-UPSTREAM.md b/SYNC-UPSTREAM.md new file mode 100644 index 0000000..a23138f --- /dev/null +++ b/SYNC-UPSTREAM.md @@ -0,0 +1,315 @@ +# How to Sync Your Fork with the Original Repository + +This guide explains how to keep your fork up-to-date with changes from the original (upstream) repository. + +## 🔄 One-Time Setup + +### Step 1: Add the Upstream Remote + +First, you need to add the original repository as a remote called "upstream": + +```bash +# Navigate to your project directory +cd d:\CLG\OpenSrc\cyber\tree\hacking-tutorial_fork + +# Add the upstream remote (replace with actual original repo URL) +git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git + +# Verify the new upstream remote +git remote -v +``` + +You should now see: +``` +origin https://github.com/HarzhMehta/hacking-tutorial_fork.git (fetch) +origin https://github.com/HarzhMehta/hacking-tutorial_fork.git (push) +upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git (fetch) +upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git (push) +``` + +--- + +## 📥 Syncing Process (Repeat as Needed) + +### Step 2: Fetch Upstream Changes + +Fetch all branches and commits from the upstream repository: + +```bash +git fetch upstream +``` + +### Step 3: Checkout Your Main Branch + +Make sure you're on your main branch: + +```bash +git checkout main +``` + +### Step 4: Merge Upstream Changes + +Merge the upstream changes into your local main branch: + +```bash +git merge upstream/main +``` + +**Alternative - Rebase (cleaner history):** +```bash +git rebase upstream/main +``` + +### Step 5: Resolve Conflicts (if any) + +If there are merge conflicts: + +1. **View conflicted files:** + ```bash + git status + ``` + +2. **Open each conflicted file** and look for conflict markers: + ``` + <<<<<<< HEAD + Your changes + ======= + Upstream changes + >>>>>>> upstream/main + ``` + +3. **Edit the files** to resolve conflicts manually + +4. **Stage the resolved files:** + ```bash + git add path/to/resolved/file + ``` + +5. **Complete the merge:** + ```bash + git commit -m "Merge upstream changes" + ``` + +### Step 6: Push to Your Fork + +Push the updated main branch to your GitHub fork: + +```bash +git push origin main +``` + +If you used rebase and encounter issues: +```bash +git push origin main --force-with-lease +``` + +⚠️ **Warning:** Only use `--force-with-lease` on branches where you're the only contributor! + +--- + +## 🚀 Quick Command Summary + +### First Time Setup +```bash +git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git +``` + +### Regular Sync (Run These Commands) +```bash +# 1. Fetch upstream changes +git fetch upstream + +# 2. Switch to main branch +git checkout main + +# 3. Merge upstream changes +git merge upstream/main + +# 4. Push to your fork +git push origin main +``` + +--- + +## 🎯 Common Scenarios + +### Scenario 1: Simple Sync (No Conflicts) +```bash +git fetch upstream +git checkout main +git merge upstream/main +git push origin main +``` + +### Scenario 2: Sync with Local Uncommitted Changes +```bash +# Stash your changes +git stash + +# Sync with upstream +git fetch upstream +git checkout main +git merge upstream/main +git push origin main + +# Restore your changes +git stash pop +``` + +### Scenario 3: Sync a Specific Branch +```bash +git fetch upstream +git checkout your-feature-branch +git merge upstream/main +git push origin your-feature-branch +``` + +### Scenario 4: Discard All Local Changes and Match Upstream +```bash +git fetch upstream +git checkout main +git reset --hard upstream/main +git push origin main --force +``` + +⚠️ **WARNING:** This will **DELETE** all your local changes! + +--- + +## 🔍 Checking What Changed + +### View commits that are in upstream but not in your fork +```bash +git log origin/main..upstream/main +``` + +### View file differences +```bash +git diff origin/main..upstream/main +``` + +### View list of changed files +```bash +git diff --name-only origin/main..upstream/main +``` + +--- + +## 📋 Best Practices + +1. **Sync regularly** - Don't let your fork get too far behind +2. **Commit your work first** - Always commit or stash local changes before syncing +3. **Test after merging** - Run your application to ensure everything works +4. **Keep main branch clean** - Do your work in feature branches +5. **Review changes** - Use `git log` or `git diff` to see what's coming in + +--- + +## 🛠️ Troubleshooting + +### Problem: "fatal: 'upstream' does not appear to be a git repository" +**Solution:** You haven't added the upstream remote yet. Run: +```bash +git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git +``` + +### Problem: "Your local changes would be overwritten by merge" +**Solution:** Stash or commit your changes first: +```bash +git stash +# or +git commit -am "Save local changes" +``` + +### Problem: Merge conflicts are too complex +**Solution:** Create a backup and start fresh: +```bash +# Create a backup branch +git branch backup-main + +# Reset to upstream +git fetch upstream +git reset --hard upstream/main +git push origin main --force +``` + +### Problem: Accidentally pushed conflicts to GitHub +**Solution:** Force push the corrected version: +```bash +# After resolving conflicts locally +git push origin main --force-with-lease +``` + +--- + +## 📊 Workflow Example + +Let's say you want to add a new lesson while keeping your fork in sync: + +```bash +# 1. Sync with upstream first +git fetch upstream +git checkout main +git merge upstream/main +git push origin main + +# 2. Create a feature branch for your new lesson +git checkout -b add-lesson-network-security + +# 3. Make your changes (create new lesson files, etc.) +# ... edit files ... + +# 4. Commit your changes +git add . +git commit -m "Add new lesson on network security" + +# 5. Push to your fork +git push origin add-lesson-network-security + +# 6. Create Pull Request on GitHub (if contributing back) +# Or merge into main if just for your fork: +git checkout main +git merge add-lesson-network-security +git push origin main +``` + +--- + +## 🔗 Useful Git Commands + +### View all remotes +```bash +git remote -v +``` + +### Remove upstream remote (if needed) +```bash +git remote remove upstream +``` + +### Rename a remote +```bash +git remote rename old-name new-name +``` + +### Update upstream URL +```bash +git remote set-url upstream https://github.com/NEW_OWNER/NEW_REPO.git +``` + +### Fetch all remotes +```bash +git fetch --all +``` + +--- + +## 📝 Notes + +- **origin** = Your fork (HarzhMehta/hacking-tutorial_fork) +- **upstream** = Original repository (the one you forked from) +- **main** = Default branch name (might be `master` in older repos) + +--- + +**Remember:** Always sync with upstream before starting new work to minimize conflicts! diff --git a/UI/frontend/FRONTMATTER_SUMMARY.md b/UI/frontend/FRONTMATTER_SUMMARY.md new file mode 100644 index 0000000..ac40395 --- /dev/null +++ b/UI/frontend/FRONTMATTER_SUMMARY.md @@ -0,0 +1,6 @@ +=== FRONTMATTER ADDED TO ALL MARKDOWN FILES === + +## Summary of Changes + +Frontmatter has been added to all 14 Markdown files in the MD_Content_ethical-hacking folder. + diff --git a/UI/frontend/SETUP_COMPLETE.md b/UI/frontend/SETUP_COMPLETE.md new file mode 100644 index 0000000..63cb861 --- /dev/null +++ b/UI/frontend/SETUP_COMPLETE.md @@ -0,0 +1,236 @@ +# ✅ Dynamic Markdown Rendering Setup - Complete! + +## 🎉 What We've Built + +A complete **dynamic Markdown rendering system** for your ethical hacking tutorial project! All Markdown files now automatically become interactive React pages with navigation. + +--- + +## 📁 Files Created + +### 1. **Markdown Loader** (`src/utils/markdownloader.js`) +- ✅ Imports all `.md` files from `MD_Content_ethical-hacking` folder +- ✅ Parses frontmatter (title, slug, order, category, prev, next) +- ✅ Sorts lessons by order +- ✅ Provides helper functions: + - `getAllLessons()` - Get all lessons + - `getLessonBySlug(slug)` - Get specific lesson + - `getNavigation(slug)` - Get prev/next navigation + - `getLessonsByCategory(category)` - Filter by category + - `getCategories()` - Get all categories + +### 2. **Lesson Template Component** (`src/components/LessonTemplate.jsx`) +- ✅ Reusable component for displaying lessons +- ✅ Renders Markdown with `react-markdown` +- ✅ Custom code block styling with language labels +- ✅ Automatic prev/next navigation buttons +- ✅ Lazy loading for images +- ✅ External link indicators +- ✅ 404 handling for missing lessons + +### 3. **Lesson Template Styles** (`src/components/LessonTemplate.css`) +- ✅ Professional, clean design +- ✅ Responsive (mobile-friendly) +- ✅ Dark mode support +- ✅ Syntax-highlighted code blocks +- ✅ Hover effects on navigation buttons +- ✅ Category badges with gradients + +### 4. **Dynamic Lesson Page** (`src/pages/LessonPage.jsx`) +- ✅ Uses React Router's `useParams()` to get lesson slug +- ✅ Loads lesson data based on URL +- ✅ Auto-scrolls to top on lesson change +- ✅ Loading state indicator + +### 5. **Updated App.jsx** +- ✅ BrowserRouter setup +- ✅ Dynamic route: `/lessons/:slug` +- ✅ Auto-redirect from `/` to first lesson +- ✅ 404 fallback page + +### 6. **Updated vite.config.js** +- ✅ Configured to treat `.md` files as assets + +--- + +## 🔧 Frontmatter Added to All Files + +All 15 Markdown files now have frontmatter: + +```yaml +--- +title: "Lesson Title" +slug: "unique-slug" +order: 1 +category: "ethical-hacking" or "python-for-ethical-hacking" +prev: "previous-slug" or null +next: "next-slug" or null +--- +``` + +### Complete Lesson Chain: +1. lesson-01 (Getting Started) +2. lesson-02 (Pre Connection Attacks) +3. lesson-03 (WEP Cracking) +4. lesson-04 (WPA/WPA2 Cracking) +5. lesson-05 (Information Gathering) +6. lesson-06 (MITM Attacks) +7. lesson-cyberchef (CyberChef) +8. lesson-fing (Network Scanning) +9. lesson-password_attack-and_hashcracking +10. lesson-passwordcracking +11. lesson-phising-toolkit +12. binary-exploitation +13. port-scanning (Python) +14. mac-address-changer (Python) +15. ids-probe-lesson (Python) + +--- + +## 📦 Dependencies Installed + +```json +{ + "react-router-dom": "latest", + "react-markdown": "latest", + "gray-matter": "latest", + "remark-gfm": "latest", + "rehype-raw": "latest" +} +``` + +--- + +## 🚀 How to Run + +⚠️ **Node.js Upgrade Required**: Your current Node.js version is 20.16.0, but Vite requires 20.19+ or 22.12+. + +### After Upgrading Node.js: + +```bash +# Navigate to frontend folder +cd D:\CLG\OpenSrc\cyber\tree\hacking-tutorial_fork\UI\frontend + +# Start development server +npm run dev +``` + +The app will be available at: `http://localhost:5173` + +--- + +## 🎯 How It Works + +### 1. **Adding a New Lesson** +Just create a new `.md` file with frontmatter: + +```markdown +--- +title: "My New Lesson" +slug: "my-new-lesson" +order: 16 +category: "ethical-hacking" +prev: "ids-probe-lesson" +next: null +--- + +# My New Lesson Content +``` + +**That's it!** The new lesson automatically appears in the navigation chain. + +### 2. **Accessing Lessons** +- Go to: `http://localhost:5173/lessons/lesson-01` +- Or any slug: `http://localhost:5173/lessons/binary-exploitation` + +### 3. **Navigation** +- Click "Previous Lesson" or "Next Lesson" buttons +- Navigation is automatic based on frontmatter + +--- + +## 🎨 Features + +✅ **Automatic Navigation** - Prev/next buttons generated from frontmatter +✅ **Dynamic Routing** - Each lesson has its own URL +✅ **Code Syntax Highlighting** - Beautiful code blocks with language labels +✅ **Image Support** - Lazy loading and responsive images +✅ **External Links** - Open in new tab with indicator +✅ **Category Badges** - Visual category identification +✅ **Responsive Design** - Works on mobile and desktop +✅ **Dark Mode** - Automatic dark mode support +✅ **Loading States** - Smooth transitions between lessons +✅ **404 Handling** - Graceful error pages + +--- + +## 📸 Expected UI + +### Lesson Page: +``` +┌─────────────────────────────────────┐ +│ Getting Started with Ethical Hacking +│ [ethical-hacking] Lesson 1 +├─────────────────────────────────────┤ +│ │ +│ [Markdown content rendered here] │ +│ - Images displayed │ +│ - Code blocks highlighted │ +│ - Links working │ +│ │ +├─────────────────────────────────────┤ +│ ← Previous │ Next → │ +│ [None] │ Lesson 02 │ +└─────────────────────────────────────┘ +``` + +--- + +## 🐛 Troubleshooting + +### If images don't load: +- Check image paths in markdown files +- Images should be in `src/content/imgs/` or use relative paths + +### If lessons don't appear: +- Check console for errors +- Verify frontmatter syntax (valid YAML) +- Ensure all files have unique slugs + +### If navigation is broken: +- Verify `prev` and `next` slugs match actual lesson slugs +- Check order numbers are sequential + +--- + +## 🎓 Next Steps + +1. **Upgrade Node.js** to 20.19+ or 22.12+ +2. **Run the dev server**: `npm run dev` +3. **Test navigation** by visiting `/lessons/lesson-01` +4. **Add more lessons** by creating new `.md` files +5. **Customize styling** in `LessonTemplate.css` +6. **Add a sidebar** (optional) to show all lessons +7. **Add search functionality** (optional) + +--- + +## 💡 Tips + +- **Keep slugs URL-friendly**: Use lowercase with hyphens +- **Maintain sequential order numbers**: Makes sorting predictable +- **Write descriptive titles**: They appear in navigation buttons +- **Use categories**: Group related lessons together +- **Test on mobile**: Responsive design is already implemented + +--- + +## 🎉 Success! + +Your ethical hacking tutorial now has: +- ✅ Professional UI +- ✅ Automatic navigation +- ✅ Dynamic routing +- ✅ Easy content management + +Just add Markdown files and they become pages automatically! diff --git a/UI/frontend/package-lock.json b/UI/frontend/package-lock.json index 90ab5b8..22eab45 100644 --- a/UI/frontend/package-lock.json +++ b/UI/frontend/package-lock.json @@ -8,9 +8,14 @@ "name": "frontend", "version": "0.0.0", "dependencies": { + "buffer": "^6.0.3", + "gray-matter": "^4.0.3", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-router-dom": "^7.9.4" + "react-markdown": "^10.1.0", + "react-router-dom": "^7.9.4", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1" }, "devDependencies": { "@eslint/js": "^9.36.0", @@ -1367,13 +1372,39 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1381,11 +1412,25 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.2.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -1401,6 +1446,18 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, "node_modules/@vitejs/plugin-react": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz", @@ -1485,6 +1542,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1492,6 +1559,26 @@ "dev": true, "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/baseline-browser-mapping": { "version": "2.8.14", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.14.tgz", @@ -1547,6 +1634,30 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1578,6 +1689,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1595,6 +1716,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1615,6 +1776,16 @@ "dev": true, "license": "MIT" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1657,14 +1828,12 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1678,6 +1847,19 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1685,6 +1867,28 @@ "dev": true, "license": "MIT" }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.233", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", @@ -1692,6 +1896,18 @@ "dev": true, "license": "ISC" }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/esbuild": { "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", @@ -1889,6 +2105,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -1925,6 +2154,16 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -1935,6 +2174,24 @@ "node": ">=0.10.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2076,6 +2333,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2086,6 +2380,190 @@ "node": ">=8" } }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2123,17 +2601,66 @@ "node": ">=0.8.19" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-glob": { + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", @@ -2146,6 +2673,28 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2227,55 +2776,929 @@ "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", @@ -2294,7 +3717,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -2393,6 +3815,43 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2472,6 +3931,16 @@ "node": ">= 0.8.0" } }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2503,6 +3972,33 @@ "react": "^19.2.0" } }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -2551,6 +4047,87 @@ "react-dom": ">=18" } }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2609,6 +4186,19 @@ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2658,6 +4248,45 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2671,6 +4300,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-js": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.18.tgz", + "integrity": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.11" + } + }, + "node_modules/style-to-object": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.11.tgz", + "integrity": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2701,6 +4348,26 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2714,6 +4381,93 @@ "node": ">= 0.8.0" } }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -2755,6 +4509,48 @@ "punycode": "^2.1.0" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "7.1.9", "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", @@ -2830,6 +4626,16 @@ } } }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2875,6 +4681,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/UI/frontend/package.json b/UI/frontend/package.json index 2dc8b0d..6dfb9b9 100644 --- a/UI/frontend/package.json +++ b/UI/frontend/package.json @@ -10,9 +10,14 @@ "preview": "vite preview" }, "dependencies": { + "buffer": "^6.0.3", + "gray-matter": "^4.0.3", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-router-dom": "^7.9.4" + "react-markdown": "^10.1.0", + "react-router-dom": "^7.9.4", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1" }, "devDependencies": { "@eslint/js": "^9.36.0", diff --git a/UI/frontend/src/App.css b/UI/frontend/src/App.css index 1be07e8..bdbf51c 100644 --- a/UI/frontend/src/App.css +++ b/UI/frontend/src/App.css @@ -1,87 +1,57 @@ -/* Hacker Theme - Black & Green */ +/* Dark Hacker Theme with Green Accents */ * { - font-weight: bold; /* Make all fonts thicker */ + box-sizing: border-box; } body { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - background-color: #000000; - color: #00ff00; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; + background-color: var(--bg-primary); + color: var(--text-primary); margin: 0; padding: 0; - font-weight: bold; } #root { max-width: 100%; margin: 0; padding: 0; - text-align: center; - background-color: #000000; -} - -.home-button{ - position: fixed; - top: 0; - left: 0; - margin: 0; - padding: 1rem; - text-align: left; - width: 100%; - display: flex; - justify-content: space-between; - align-items: center; - background-color: #000000; - border-bottom: 2px solid #00ff00; - z-index: 1000; - box-shadow: 0 2px 10px rgba(0, 255, 0, 0.3); -} - -.home-title{ - padding: 0; - margin: 0; - font-size: 1.8rem; - color: #00ff00; - font-weight: bold; -} - -.home-title-link { - text-decoration: none; - color: inherit; + background-color: var(--bg-primary); + min-height: 100vh; } .home-button a { margin-right: 2%; - color: #00ff00; + color: var(--accent-green); font-size: 1rem; text-decoration: none; padding: 8px 16px; - border: 1px solid #00ff00; + border: 1px solid var(--accent-green); border-radius: 4px; transition: all 0.3s ease; } .home-button a:hover { color: #000000; - background-color: #00ff00; - box-shadow: 0 0 15px #00ff00; + background-color: var(--accent-green); + box-shadow: 0 0 15px var(--accent-green); } .home-title:hover{ - color: #000000; + color: var(--accent-green-light); } + .sidebar { position: fixed; top: 80px; left: 0; width: 280px; height: calc(100vh - 80px); - background-color: #000000; - border-right: 2px solid #00ff00; + background-color: var(--bg-secondary); + border-right: 2px solid var(--accent-green); padding: 1rem; overflow-y: auto; z-index: 999; - box-shadow: 2px 0 10px rgba(0, 255, 0, 0.2); + box-shadow: 2px 0 10px rgba(0, 255, 136, 0.2); } .sidebar::-webkit-scrollbar { @@ -99,24 +69,24 @@ body { justify-content: space-between; align-items: center; padding: 12px 16px; - background-color: #111111; - color: #00ff00; + background-color: var(--bg-tertiary); + color: var(--accent-green); cursor: pointer; - border: 1px solid #00ff00; + border: 1px solid var(--accent-green); border-radius: 4px; transition: all 0.3s ease; font-weight: bold; } .dropdown-header:hover { - background-color: #001a00; - box-shadow: 0 0 10px rgba(0, 255, 0, 0.5); + background-color: rgba(0, 255, 136, 0.1); + box-shadow: 0 0 10px rgba(0, 255, 136, 0.3); } .arrow { transition: transform 0.3s; font-size: 12px; - color: #00ff00; + color: var(--accent-green); } .arrow.open { @@ -124,27 +94,27 @@ body { } .dropdown-content { - background-color: #111111; - border: 1px solid #00ff00; + background-color: var(--bg-tertiary); + border: 1px solid var(--accent-green); border-top: none; border-radius: 0 0 4px 4px; margin-top: 0; - box-shadow: 0 4px 15px rgba(0, 255, 0, 0.3); + box-shadow: 0 4px 15px rgba(0, 255, 136, 0.2); } .lesson-item { padding: 10px 16px; - color: #00cc00; + color: var(--text-secondary); cursor: pointer; - border-bottom: 1px solid #003300; + border-bottom: 1px solid var(--border-color); transition: all 0.3s ease; text-decoration: none; display: block; } .lesson-item:hover { - background-color: #002200; - color: #00ff00; + background-color: rgba(0, 255, 136, 0.1); + color: var(--accent-green); } .lesson-item:last-child { @@ -156,25 +126,35 @@ body { margin-top: 100px; padding: 2rem; text-align: left; - background-color: #000000; - color: #00ff00; + background-color: var(--bg-primary); + color: var(--text-primary); min-height: calc(100vh - 100px); + width: calc(100% - 300px); } .main-content h2 { - color: #00ff00; + color: var(--accent-green); font-size: 2rem; - border-bottom: 2px solid #00ff00; + border-bottom: 2px solid var(--accent-green); padding-bottom: 10px; margin-bottom: 20px; } .main-content p { - color: #00cc00; + color: var(--text-secondary); font-size: 1.1rem; line-height: 1.6; margin-bottom: 15px; - font-weight: bold; + font-weight: 400; +} + +@media (max-width: 768px) { + .main-content { + margin-left: 0; + width: 100%; + margin-top: 60px; + padding: 1rem; + } } .lesson-content { @@ -182,30 +162,30 @@ body { } .markdown-content { - background-color: #111111; - border: 1px solid #00ff00; + background-color: var(--bg-secondary); + border: 1px solid var(--accent-green); border-radius: 8px; padding: 20px; - color: #00ff00; + color: var(--text-primary); font-size: 14px; line-height: 1.6; white-space: pre-wrap; overflow-x: auto; - font-weight: bold; + font-weight: 400; } .welcome-info { margin-top: 30px; padding: 20px; - background-color: #111111; - border: 1px solid #00ff00; + background-color: var(--bg-secondary); + border: 1px solid var(--accent-green); border-radius: 8px; } .welcome-info h3 { - color: #00ff00; + color: var(--accent-green); margin-bottom: 15px; - font-weight: bold; + font-weight: 700; } .welcome-info ul { @@ -214,12 +194,12 @@ body { } .welcome-info li { - color: #00cc00; + color: var(--text-secondary); margin-bottom: 10px; padding: 8px; - background-color: #001a00; + background-color: var(--bg-tertiary); border-radius: 4px; - font-weight: bold; + font-weight: 400; } @media (max-width: 768px) { @@ -228,7 +208,10 @@ body { } .main-content { - margin-left: 220px; + margin-left: 0; + width: 100%; + margin-top: 60px; + padding: 1rem; } .home-title { diff --git a/UI/frontend/src/App.jsx b/UI/frontend/src/App.jsx index 3a824f5..66ec4ca 100644 --- a/UI/frontend/src/App.jsx +++ b/UI/frontend/src/App.jsx @@ -1,239 +1,53 @@ -import React, { useState } from 'react' -import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom' -import './App.css' +import React from 'react'; +import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; +import LessonPage from './pages/LessonPage'; +import { getAllLessons } from './utils/markdownloader'; +import './App.css'; -// Import lesson components -import Lesson01 from './Pages/Ethical_Hacking/Lesson01' -import Lesson02 from './Pages/Ethical_Hacking/Lesson02' -import BinaryIntro from './Pages/Binary_Exploitation/BinaryIntro' -import MacChanger from './Pages/Python_for_Hacking/MacChanger' - -// Home component -const Home = () => ( -
Select a lesson from the sidebar to get started
-Please add markdown files to the content folder.
+The page you're looking for doesn't exist.
+ {firstLesson && ( + + Go to First Lesson + + )} + + } + /> +Let me tell you about the day I accidentally crashed my friend's demo program during a C programming class. I was just trying to input my ridiculously long name, and suddenly—SEGMENTATION FAULT. My friend stared at me in disbelief. That's when I learned about one of the most notorious functions in C: gets().
Think of a buffer like a parking lot with exactly 10 spaces. A buffer overflow is like trying to park 15 cars in those 10 spaces—the extra cars spill over into the neighboring area, potentially causing chaos. In programming terms, it's when data exceeds the allocated memory space and overwrites adjacent memory locations.
-The gets() function reads a line from standard input and stores it in a buffer. Sounds innocent, right? WRONG. Here's why it's considered one of the most dangerous functions in C:
-{`char buffer[50];
-gets(buffer); // This is a ticking time bomb!`}
-
- The problem? gets() has no bounds checking. It doesn't care if your buffer can hold 50 characters—if you input 100 characters, it'll happily write all 100, obliterating whatever was stored in the memory after your buffer.
Let me show you a vulnerable program I wrote during my learning journey:
- -
-{`#include
-#include
-
-void vulnerable_function() {
- char buffer[64];
- printf("Enter your name: ");
- gets(buffer); // The dangerous line
- printf("Hello, %s!\\n", buffer);
-}
-
-int main() {
- vulnerable_function();
- return 0;
-}`}
-
- When you input more than 64 characters, the excess data overwrites:
-Understanding how memory is organized is crucial for buffer overflow exploitation:
- -By overflowing a buffer, we can overwrite the return address and redirect program execution.
- -Instead of injecting shellcode, we can return to existing functions in the system.
- -Chaining together small code sequences called "gadgets" to perform complex operations.
-Hacking is getting unauthorized access to a system.
-Hackers generally are of three types:
-Hacking actually do have a really big industry, due to large need of organizations to secure there data, and systems.
-For, this purpose we will utilise the concept of Virtual Machines, to replicate various systems.
-Let's discuss each component for this course:
-Virtualization is the process of creating a virtual version of something, including virtual computer hardware platforms, storage devices, and computer network resources.
-Penetration testing is a simulated cyber attack against your computer system to check for exploitable vulnerabilities.
- -To perform wireless attacks, you need to connect a compatible wireless adapter to your Kali Linux VM.
- -Wireless interfaces can operate in different modes:
-Monitor mode is essential for wireless penetration testing as it allows you to capture all wireless traffic in the area.
-RSA is a public-key cryptosystem that is widely used for secure data transmission.
- -Choose two large prime numbers p and q.
- -Calculate n = p × q
- -Calculate φ(n) = (p-1)(q-1)
- -Choose e such that 1 < e < φ(n) and gcd(e, φ(n)) = 1
- -Calculate d such that d × e ≡ 1 (mod φ(n))
- -Public key: (n, e), Private key: (n, d)
- -Encryption: c = m^e mod n
-Decryption: m = c^d mod n
-Reconnaissance is the first phase of penetration testing where we gather information about the target.
- -Collecting publicly available information about the target.
- -Domain Name System enumeration to gather information about domain names and IP addresses.
- -MAC stands for Media Access Control. It is a permanent, physical and unique address assigned to network interfaces by the device manufacturer.
- -So, whether you have a wireless card or wired or ethernet card, each of them come with a specific address that is unique to the card, so there are no 2 devices in the world with the same MAC Address.
- -This address will always be the same to this specific device, even if we unplug it from our computer, and connect it to another computer. Then this network device will always have the same address.
- -Each piece of data or packet that is sent within the network contains a source MAC and Destination MAC. Therefore, this packet will flow from the Source MAC to Destination MAC.
-Because this is a unique physical address to each interface, to each network device, and used to identify devices, changing it will make you anonymous on the network.
- -Run the ifconfig command on the computer. This will list all the interfaces available on the computer. When we say interface, we mean a network card.
ifconfig-
When we execute the command it shows eth0 which is a virtual interface. eth0 is not real. It is created by the virtual box, because the VM is set to use a NAT network, by default.
We can also see lo which is also a virtual interface created by linux.
To change the MAC Address of the Interface, we must first disable the interface.
- -ifconfig [interface_name] down-
If you don't see any errors, it means the command got executed properly.
- -Now that the interface is disabled, we can modify its options. The option that we want to modify is the ether, which is the MAC Address.
ifconfig [interface_name] hw ether [new_mac_address]-
Now, we need to again re-enable the interface using the following command:
- -ifconfig [interface_name] up-
If we don't see any errors, it means the command got executed properly.
- -Use the ifconfig command again to check if the MAC Address has changed. Look at the ether option of the interface you modified.
-{`# Check current MAC address
-ifconfig
-
-# Disable the interface
-sudo ifconfig eth0 down
-
-# Change MAC address
-sudo ifconfig eth0 hw ether 00:11:22:33:44:55
-
-# Enable the interface
-sudo ifconfig eth0 up
-
-# Verify the change
-ifconfig eth0`}
-
- We can create a Python script to automate this process:
- -
-{`#!/usr/bin/env python3
-
-import subprocess
-import optparse
-import re
-
-def get_arguments():
- parser = optparse.OptionParser()
- parser.add_option("-i", "--interface", dest="interface",
- help="Interface to change its MAC address")
- parser.add_option("-m", "--mac", dest="new_mac",
- help="New MAC address")
- (options, arguments) = parser.parse_args()
- if not options.interface:
- parser.error("[-] Please specify an interface")
- elif not options.new_mac:
- parser.error("[-] Please specify a new MAC address")
- return options
-
-def change_mac(interface, new_mac):
- print("[+] Changing MAC address for " + interface + " to " + new_mac)
- subprocess.call(["ifconfig", interface, "down"])
- subprocess.call(["ifconfig", interface, "hw", "ether", new_mac])
- subprocess.call(["ifconfig", interface, "up"])
-
-options = get_arguments()
-change_mac(options.interface, options.new_mac)`}
-
- The lesson you're looking for doesn't exist.
+ Go to First Lesson +
+ {children}
+
+
@@ -178,3 +187,8 @@ print("[+] Done")
---
+### Path
+
+<- [Previous Lesson: Binary Exploitation](../Binary-Exploitation.MD)
+-> [Next Lesson: Writing A MAC Address Changer](./lesson-1.md)
+
diff --git a/python-for-eth-hacking/lesson-1.md b/UI/frontend/src/content/MD_Content_ethical-hacking/python-for-eth-hacking/lesson-1.md
similarity index 97%
rename from python-for-eth-hacking/lesson-1.md
rename to UI/frontend/src/content/MD_Content_ethical-hacking/python-for-eth-hacking/lesson-1.md
index eb3e4cb..b8e9509 100644
--- a/python-for-eth-hacking/lesson-1.md
+++ b/UI/frontend/src/content/MD_Content_ethical-hacking/python-for-eth-hacking/lesson-1.md
@@ -1,3 +1,12 @@
+---
+title: "Writing A MAC Address Changer"
+slug: "mac-address-changer"
+order: 14
+category: "python-for-ethical-hacking"
+prev: "port-scanning"
+next: "ids-probe-lesson"
+---
+
# Writing A MAC Address Changer

@@ -164,4 +173,10 @@
- In the program, we didn't use `shell=True` in the `subprocess.call()` function. This is because we are passing the command and its arguments as a list, which is the recommended way to avoid shell injection vulnerabilities. If you use `shell=True`, you should be very careful about the input to avoid executing arbitrary commands.
+---
+
+### Path
+
+<- [Previous Lesson: IP & Port Scanning](./A-guide-to-port-scanning.md)
+
diff --git a/UI/frontend/src/assets/imgs/06f21a161921919.63cd7887d0a70.gif b/UI/frontend/src/content/imgs/06f21a161921919.63cd7887d0a70.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/06f21a161921919.63cd7887d0a70.gif
rename to UI/frontend/src/content/imgs/06f21a161921919.63cd7887d0a70.gif
diff --git a/UI/frontend/src/assets/imgs/13062024-man-in-the-middle-attack-image-terrabytegroup.com_-scaled.jpg b/UI/frontend/src/content/imgs/13062024-man-in-the-middle-attack-image-terrabytegroup.com_-scaled.jpg
similarity index 100%
rename from UI/frontend/src/assets/imgs/13062024-man-in-the-middle-attack-image-terrabytegroup.com_-scaled.jpg
rename to UI/frontend/src/content/imgs/13062024-man-in-the-middle-attack-image-terrabytegroup.com_-scaled.jpg
diff --git a/UI/frontend/src/assets/imgs/212747903-e9bdf048-2dc8-41f9-b973-0e72ff07bfba.gif b/UI/frontend/src/content/imgs/212747903-e9bdf048-2dc8-41f9-b973-0e72ff07bfba.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/212747903-e9bdf048-2dc8-41f9-b973-0e72ff07bfba.gif
rename to UI/frontend/src/content/imgs/212747903-e9bdf048-2dc8-41f9-b973-0e72ff07bfba.gif
diff --git a/UI/frontend/src/assets/imgs/212748830-4c709398-a386-4761-84d7-9e10b98fbe6e.gif b/UI/frontend/src/content/imgs/212748830-4c709398-a386-4761-84d7-9e10b98fbe6e.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/212748830-4c709398-a386-4761-84d7-9e10b98fbe6e.gif
rename to UI/frontend/src/content/imgs/212748830-4c709398-a386-4761-84d7-9e10b98fbe6e.gif
diff --git a/UI/frontend/src/assets/imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif b/UI/frontend/src/content/imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif
rename to UI/frontend/src/content/imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif
diff --git a/UI/frontend/src/assets/imgs/212749726-d36b8253-74bb-4509-870d-e29ed3b8ff4a.gif b/UI/frontend/src/content/imgs/212749726-d36b8253-74bb-4509-870d-e29ed3b8ff4a.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/212749726-d36b8253-74bb-4509-870d-e29ed3b8ff4a.gif
rename to UI/frontend/src/content/imgs/212749726-d36b8253-74bb-4509-870d-e29ed3b8ff4a.gif
diff --git a/UI/frontend/src/assets/imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif b/UI/frontend/src/content/imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif
rename to UI/frontend/src/content/imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif
diff --git a/UI/frontend/src/assets/imgs/212750996-938b257b-266c-45a7-9af7-655341c0f58b.gif b/UI/frontend/src/content/imgs/212750996-938b257b-266c-45a7-9af7-655341c0f58b.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/212750996-938b257b-266c-45a7-9af7-655341c0f58b.gif
rename to UI/frontend/src/content/imgs/212750996-938b257b-266c-45a7-9af7-655341c0f58b.gif
diff --git a/UI/frontend/src/assets/imgs/213910845-af37a709-8995-40d6-be59-724526e3c3d7.gif b/UI/frontend/src/content/imgs/213910845-af37a709-8995-40d6-be59-724526e3c3d7.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/213910845-af37a709-8995-40d6-be59-724526e3c3d7.gif
rename to UI/frontend/src/content/imgs/213910845-af37a709-8995-40d6-be59-724526e3c3d7.gif
diff --git a/UI/frontend/src/assets/imgs/216649426-0c2ee152-84d8-4707-85c4-27a378d2f78a.gif b/UI/frontend/src/content/imgs/216649426-0c2ee152-84d8-4707-85c4-27a378d2f78a.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216649426-0c2ee152-84d8-4707-85c4-27a378d2f78a.gif
rename to UI/frontend/src/content/imgs/216649426-0c2ee152-84d8-4707-85c4-27a378d2f78a.gif
diff --git a/UI/frontend/src/assets/imgs/216649450-e63af5d5-a769-4e9f-8bd1-c2b9005dc53c.gif b/UI/frontend/src/content/imgs/216649450-e63af5d5-a769-4e9f-8bd1-c2b9005dc53c.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216649450-e63af5d5-a769-4e9f-8bd1-c2b9005dc53c.gif
rename to UI/frontend/src/content/imgs/216649450-e63af5d5-a769-4e9f-8bd1-c2b9005dc53c.gif
diff --git a/UI/frontend/src/assets/imgs/216653728-5f452bd4-f1b8-401e-a337-f6fbae9d493a.gif b/UI/frontend/src/content/imgs/216653728-5f452bd4-f1b8-401e-a337-f6fbae9d493a.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216653728-5f452bd4-f1b8-401e-a337-f6fbae9d493a.gif
rename to UI/frontend/src/content/imgs/216653728-5f452bd4-f1b8-401e-a337-f6fbae9d493a.gif
diff --git a/UI/frontend/src/assets/imgs/216655813-c9147cb2-cfee-4955-b591-52cac08f1f60.gif b/UI/frontend/src/content/imgs/216655813-c9147cb2-cfee-4955-b591-52cac08f1f60.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216655813-c9147cb2-cfee-4955-b591-52cac08f1f60.gif
rename to UI/frontend/src/content/imgs/216655813-c9147cb2-cfee-4955-b591-52cac08f1f60.gif
diff --git a/UI/frontend/src/assets/imgs/216655818-2e7b9a31-49bf-4744-85a8-db8a2577c45c.gif b/UI/frontend/src/content/imgs/216655818-2e7b9a31-49bf-4744-85a8-db8a2577c45c.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216655818-2e7b9a31-49bf-4744-85a8-db8a2577c45c.gif
rename to UI/frontend/src/content/imgs/216655818-2e7b9a31-49bf-4744-85a8-db8a2577c45c.gif
diff --git a/UI/frontend/src/assets/imgs/216655846-93807a43-d6e8-448a-bf19-799b5e8c1c0a.gif b/UI/frontend/src/content/imgs/216655846-93807a43-d6e8-448a-bf19-799b5e8c1c0a.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216655846-93807a43-d6e8-448a-bf19-799b5e8c1c0a.gif
rename to UI/frontend/src/content/imgs/216655846-93807a43-d6e8-448a-bf19-799b5e8c1c0a.gif
diff --git a/UI/frontend/src/assets/imgs/216655848-cf4d7bed-52aa-4740-8c67-1832472051ec.gif b/UI/frontend/src/content/imgs/216655848-cf4d7bed-52aa-4740-8c67-1832472051ec.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216655848-cf4d7bed-52aa-4740-8c67-1832472051ec.gif
rename to UI/frontend/src/content/imgs/216655848-cf4d7bed-52aa-4740-8c67-1832472051ec.gif
diff --git a/UI/frontend/src/assets/imgs/216655853-3acb8c9c-42bd-4d0c-aaa6-27b409361578.gif b/UI/frontend/src/content/imgs/216655853-3acb8c9c-42bd-4d0c-aaa6-27b409361578.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216655853-3acb8c9c-42bd-4d0c-aaa6-27b409361578.gif
rename to UI/frontend/src/content/imgs/216655853-3acb8c9c-42bd-4d0c-aaa6-27b409361578.gif
diff --git a/UI/frontend/src/assets/imgs/216655855-e00c1861-e964-4b4f-90ae-2592cad7b272.gif b/UI/frontend/src/content/imgs/216655855-e00c1861-e964-4b4f-90ae-2592cad7b272.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216655855-e00c1861-e964-4b4f-90ae-2592cad7b272.gif
rename to UI/frontend/src/content/imgs/216655855-e00c1861-e964-4b4f-90ae-2592cad7b272.gif
diff --git a/UI/frontend/src/assets/imgs/216655859-f66df97b-6767-4ab2-b6f4-a9cba3ff3591.gif b/UI/frontend/src/content/imgs/216655859-f66df97b-6767-4ab2-b6f4-a9cba3ff3591.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216655859-f66df97b-6767-4ab2-b6f4-a9cba3ff3591.gif
rename to UI/frontend/src/content/imgs/216655859-f66df97b-6767-4ab2-b6f4-a9cba3ff3591.gif
diff --git a/UI/frontend/src/assets/imgs/216656977-ef584e23-480a-4d1c-8c3f-7d045910ddc9.gif b/UI/frontend/src/content/imgs/216656977-ef584e23-480a-4d1c-8c3f-7d045910ddc9.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216656977-ef584e23-480a-4d1c-8c3f-7d045910ddc9.gif
rename to UI/frontend/src/content/imgs/216656977-ef584e23-480a-4d1c-8c3f-7d045910ddc9.gif
diff --git a/UI/frontend/src/assets/imgs/216656982-82fce1e6-72ff-48aa-bbcd-5270671adeaa.gif b/UI/frontend/src/content/imgs/216656982-82fce1e6-72ff-48aa-bbcd-5270671adeaa.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216656982-82fce1e6-72ff-48aa-bbcd-5270671adeaa.gif
rename to UI/frontend/src/content/imgs/216656982-82fce1e6-72ff-48aa-bbcd-5270671adeaa.gif
diff --git a/UI/frontend/src/assets/imgs/216656986-e4424d73-56dd-4e0d-96ac-66f9f2c3be42.gif b/UI/frontend/src/content/imgs/216656986-e4424d73-56dd-4e0d-96ac-66f9f2c3be42.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216656986-e4424d73-56dd-4e0d-96ac-66f9f2c3be42.gif
rename to UI/frontend/src/content/imgs/216656986-e4424d73-56dd-4e0d-96ac-66f9f2c3be42.gif
diff --git a/UI/frontend/src/assets/imgs/216656987-9b3a52af-79d3-418c-8789-579955588e68.gif b/UI/frontend/src/content/imgs/216656987-9b3a52af-79d3-418c-8789-579955588e68.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216656987-9b3a52af-79d3-418c-8789-579955588e68.gif
rename to UI/frontend/src/content/imgs/216656987-9b3a52af-79d3-418c-8789-579955588e68.gif
diff --git a/UI/frontend/src/assets/imgs/216658115-017b0125-1bba-409d-b789-c04362c0adfb.gif b/UI/frontend/src/content/imgs/216658115-017b0125-1bba-409d-b789-c04362c0adfb.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/216658115-017b0125-1bba-409d-b789-c04362c0adfb.gif
rename to UI/frontend/src/content/imgs/216658115-017b0125-1bba-409d-b789-c04362c0adfb.gif
diff --git a/UI/frontend/src/assets/imgs/219923809-b86dc415-a0c2-4a38-bc88-ad6cf06395a8.gif b/UI/frontend/src/content/imgs/219923809-b86dc415-a0c2-4a38-bc88-ad6cf06395a8.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/219923809-b86dc415-a0c2-4a38-bc88-ad6cf06395a8.gif
rename to UI/frontend/src/content/imgs/219923809-b86dc415-a0c2-4a38-bc88-ad6cf06395a8.gif
diff --git a/UI/frontend/src/assets/imgs/225813708-98b745f2-7d22-48cf-9150-083f1b00d6c9.gif b/UI/frontend/src/content/imgs/225813708-98b745f2-7d22-48cf-9150-083f1b00d6c9.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/225813708-98b745f2-7d22-48cf-9150-083f1b00d6c9.gif
rename to UI/frontend/src/content/imgs/225813708-98b745f2-7d22-48cf-9150-083f1b00d6c9.gif
diff --git a/UI/frontend/src/assets/imgs/226127923-0e8b7792-7b3c-462b-951b-63c96ba1a5af.gif b/UI/frontend/src/content/imgs/226127923-0e8b7792-7b3c-462b-951b-63c96ba1a5af.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/226127923-0e8b7792-7b3c-462b-951b-63c96ba1a5af.gif
rename to UI/frontend/src/content/imgs/226127923-0e8b7792-7b3c-462b-951b-63c96ba1a5af.gif
diff --git a/UI/frontend/src/assets/imgs/226127927-3feb953e-cc01-482e-b732-311b2907991f.gif b/UI/frontend/src/content/imgs/226127927-3feb953e-cc01-482e-b732-311b2907991f.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/226127927-3feb953e-cc01-482e-b732-311b2907991f.gif
rename to UI/frontend/src/content/imgs/226127927-3feb953e-cc01-482e-b732-311b2907991f.gif
diff --git a/UI/frontend/src/assets/imgs/227779362-cacda485-cab4-4e28-8a27-a4d2a918a7ac.gif b/UI/frontend/src/content/imgs/227779362-cacda485-cab4-4e28-8a27-a4d2a918a7ac.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/227779362-cacda485-cab4-4e28-8a27-a4d2a918a7ac.gif
rename to UI/frontend/src/content/imgs/227779362-cacda485-cab4-4e28-8a27-a4d2a918a7ac.gif
diff --git a/UI/frontend/src/assets/imgs/238200842-406eb3e6-caba-401d-93c8-e0a7941c84b9.gif b/UI/frontend/src/content/imgs/238200842-406eb3e6-caba-401d-93c8-e0a7941c84b9.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/238200842-406eb3e6-caba-401d-93c8-e0a7941c84b9.gif
rename to UI/frontend/src/content/imgs/238200842-406eb3e6-caba-401d-93c8-e0a7941c84b9.gif
diff --git a/UI/frontend/src/assets/imgs/238353467-897cd757-ea1f-492d-aaf9-6d1674177e08.gif b/UI/frontend/src/content/imgs/238353467-897cd757-ea1f-492d-aaf9-6d1674177e08.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/238353467-897cd757-ea1f-492d-aaf9-6d1674177e08.gif
rename to UI/frontend/src/content/imgs/238353467-897cd757-ea1f-492d-aaf9-6d1674177e08.gif
diff --git a/UI/frontend/src/assets/imgs/238353480-219bcc70-f5dc-466b-9a60-29653d8e8433.gif b/UI/frontend/src/content/imgs/238353480-219bcc70-f5dc-466b-9a60-29653d8e8433.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/238353480-219bcc70-f5dc-466b-9a60-29653d8e8433.gif
rename to UI/frontend/src/content/imgs/238353480-219bcc70-f5dc-466b-9a60-29653d8e8433.gif
diff --git a/UI/frontend/src/assets/imgs/238355349-7d484dc9-68a9-4ee6-a767-aea59035c12d.gif b/UI/frontend/src/content/imgs/238355349-7d484dc9-68a9-4ee6-a767-aea59035c12d.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/238355349-7d484dc9-68a9-4ee6-a767-aea59035c12d.gif
rename to UI/frontend/src/content/imgs/238355349-7d484dc9-68a9-4ee6-a767-aea59035c12d.gif
diff --git a/UI/frontend/src/assets/imgs/240304586-d48893bd-0757-481c-8d7e-ba3e163feae7.png b/UI/frontend/src/content/imgs/240304586-d48893bd-0757-481c-8d7e-ba3e163feae7.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/240304586-d48893bd-0757-481c-8d7e-ba3e163feae7.png
rename to UI/frontend/src/content/imgs/240304586-d48893bd-0757-481c-8d7e-ba3e163feae7.png
diff --git a/UI/frontend/src/assets/imgs/240307504-366d67af-a5ad-4c0a-bf14-1bebfed20a3a.gif b/UI/frontend/src/content/imgs/240307504-366d67af-a5ad-4c0a-bf14-1bebfed20a3a.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/240307504-366d67af-a5ad-4c0a-bf14-1bebfed20a3a.gif
rename to UI/frontend/src/content/imgs/240307504-366d67af-a5ad-4c0a-bf14-1bebfed20a3a.gif
diff --git a/UI/frontend/src/assets/imgs/240308118-6f28d73e-0d7e-4a6c-8ddf-bb24b69a71c0.gif b/UI/frontend/src/content/imgs/240308118-6f28d73e-0d7e-4a6c-8ddf-bb24b69a71c0.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/240308118-6f28d73e-0d7e-4a6c-8ddf-bb24b69a71c0.gif
rename to UI/frontend/src/content/imgs/240308118-6f28d73e-0d7e-4a6c-8ddf-bb24b69a71c0.gif
diff --git a/UI/frontend/src/assets/imgs/240815068-993370af-11f4-48e7-9e0d-e5b79c2e7890.gif b/UI/frontend/src/content/imgs/240815068-993370af-11f4-48e7-9e0d-e5b79c2e7890.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/240815068-993370af-11f4-48e7-9e0d-e5b79c2e7890.gif
rename to UI/frontend/src/content/imgs/240815068-993370af-11f4-48e7-9e0d-e5b79c2e7890.gif
diff --git a/UI/frontend/src/assets/imgs/241763891-7bb1e704-6026-48f9-8435-2f4d40101348.gif b/UI/frontend/src/content/imgs/241763891-7bb1e704-6026-48f9-8435-2f4d40101348.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/241763891-7bb1e704-6026-48f9-8435-2f4d40101348.gif
rename to UI/frontend/src/content/imgs/241763891-7bb1e704-6026-48f9-8435-2f4d40101348.gif
diff --git a/UI/frontend/src/assets/imgs/242390524-0c7eb6ed-663b-4ce4-bfbd-18239a38ba1b.gif b/UI/frontend/src/content/imgs/242390524-0c7eb6ed-663b-4ce4-bfbd-18239a38ba1b.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/242390524-0c7eb6ed-663b-4ce4-bfbd-18239a38ba1b.gif
rename to UI/frontend/src/content/imgs/242390524-0c7eb6ed-663b-4ce4-bfbd-18239a38ba1b.gif
diff --git a/UI/frontend/src/assets/imgs/242390692-0b335028-1d3d-4ee5-b5b3-a373d499be7e.gif b/UI/frontend/src/content/imgs/242390692-0b335028-1d3d-4ee5-b5b3-a373d499be7e.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/242390692-0b335028-1d3d-4ee5-b5b3-a373d499be7e.gif
rename to UI/frontend/src/content/imgs/242390692-0b335028-1d3d-4ee5-b5b3-a373d499be7e.gif
diff --git a/UI/frontend/src/assets/imgs/250967618-de30015f-dc5f-4ecf-a49b-ccd2b89776e4.gif b/UI/frontend/src/content/imgs/250967618-de30015f-dc5f-4ecf-a49b-ccd2b89776e4.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/250967618-de30015f-dc5f-4ecf-a49b-ccd2b89776e4.gif
rename to UI/frontend/src/content/imgs/250967618-de30015f-dc5f-4ecf-a49b-ccd2b89776e4.gif
diff --git a/UI/frontend/src/assets/imgs/362d5c55859146c0c7debfca296ad321.gif b/UI/frontend/src/content/imgs/362d5c55859146c0c7debfca296ad321.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/362d5c55859146c0c7debfca296ad321.gif
rename to UI/frontend/src/content/imgs/362d5c55859146c0c7debfca296ad321.gif
diff --git "a/UI/frontend/src/assets/imgs/Movie on 27-07-25 at 9.36\342\200\257PM.mov" "b/UI/frontend/src/content/imgs/Movie on 27-07-25 at 9.36\342\200\257PM.mov"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Movie on 27-07-25 at 9.36\342\200\257PM.mov"
rename to "UI/frontend/src/content/imgs/Movie on 27-07-25 at 9.36\342\200\257PM.mov"
diff --git a/UI/frontend/src/assets/imgs/Screenshot (10).png b/UI/frontend/src/content/imgs/Screenshot (10).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (10).png
rename to UI/frontend/src/content/imgs/Screenshot (10).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (11).png b/UI/frontend/src/content/imgs/Screenshot (11).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (11).png
rename to UI/frontend/src/content/imgs/Screenshot (11).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (12).png b/UI/frontend/src/content/imgs/Screenshot (12).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (12).png
rename to UI/frontend/src/content/imgs/Screenshot (12).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (13).png b/UI/frontend/src/content/imgs/Screenshot (13).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (13).png
rename to UI/frontend/src/content/imgs/Screenshot (13).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (14).png b/UI/frontend/src/content/imgs/Screenshot (14).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (14).png
rename to UI/frontend/src/content/imgs/Screenshot (14).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (6).png b/UI/frontend/src/content/imgs/Screenshot (6).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (6).png
rename to UI/frontend/src/content/imgs/Screenshot (6).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (7).png b/UI/frontend/src/content/imgs/Screenshot (7).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (7).png
rename to UI/frontend/src/content/imgs/Screenshot (7).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (8).png b/UI/frontend/src/content/imgs/Screenshot (8).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (8).png
rename to UI/frontend/src/content/imgs/Screenshot (8).png
diff --git a/UI/frontend/src/assets/imgs/Screenshot (9).png b/UI/frontend/src/content/imgs/Screenshot (9).png
similarity index 100%
rename from UI/frontend/src/assets/imgs/Screenshot (9).png
rename to UI/frontend/src/content/imgs/Screenshot (9).png
diff --git "a/UI/frontend/src/assets/imgs/Screenshot 2025-07-21 at 11.11.34\342\200\257AM.png" "b/UI/frontend/src/content/imgs/Screenshot 2025-07-21 at 11.11.34\342\200\257AM.png"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Screenshot 2025-07-21 at 11.11.34\342\200\257AM.png"
rename to "UI/frontend/src/content/imgs/Screenshot 2025-07-21 at 11.11.34\342\200\257AM.png"
diff --git "a/UI/frontend/src/assets/imgs/Screenshot 2025-07-24 at 4.58.09\342\200\257AM.png" "b/UI/frontend/src/content/imgs/Screenshot 2025-07-24 at 4.58.09\342\200\257AM.png"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Screenshot 2025-07-24 at 4.58.09\342\200\257AM.png"
rename to "UI/frontend/src/content/imgs/Screenshot 2025-07-24 at 4.58.09\342\200\257AM.png"
diff --git "a/UI/frontend/src/assets/imgs/Screenshot 2025-07-24 at 6.49.53\342\200\257AM.png" "b/UI/frontend/src/content/imgs/Screenshot 2025-07-24 at 6.49.53\342\200\257AM.png"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Screenshot 2025-07-24 at 6.49.53\342\200\257AM.png"
rename to "UI/frontend/src/content/imgs/Screenshot 2025-07-24 at 6.49.53\342\200\257AM.png"
diff --git "a/UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 3.38.18\342\200\257PM.png" "b/UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 3.38.18\342\200\257PM.png"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 3.38.18\342\200\257PM.png"
rename to "UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 3.38.18\342\200\257PM.png"
diff --git "a/UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 3.47.22\342\200\257PM.png" "b/UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 3.47.22\342\200\257PM.png"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 3.47.22\342\200\257PM.png"
rename to "UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 3.47.22\342\200\257PM.png"
diff --git "a/UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 3.56.13\342\200\257PM.png" "b/UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 3.56.13\342\200\257PM.png"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 3.56.13\342\200\257PM.png"
rename to "UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 3.56.13\342\200\257PM.png"
diff --git "a/UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 5.54.42\342\200\257PM.png" "b/UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 5.54.42\342\200\257PM.png"
similarity index 100%
rename from "UI/frontend/src/assets/imgs/Screenshot 2025-08-09 at 5.54.42\342\200\257PM.png"
rename to "UI/frontend/src/content/imgs/Screenshot 2025-08-09 at 5.54.42\342\200\257PM.png"
diff --git a/UI/frontend/src/assets/imgs/WEP-encryption-algorithm-37.ppm.png b/UI/frontend/src/content/imgs/WEP-encryption-algorithm-37.ppm.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/WEP-encryption-algorithm-37.ppm.png
rename to UI/frontend/src/content/imgs/WEP-encryption-algorithm-37.ppm.png
diff --git a/UI/frontend/src/assets/imgs/What-is-MAC-Address.jpeg b/UI/frontend/src/content/imgs/What-is-MAC-Address.jpeg
similarity index 100%
rename from UI/frontend/src/assets/imgs/What-is-MAC-Address.jpeg
rename to UI/frontend/src/content/imgs/What-is-MAC-Address.jpeg
diff --git a/UI/frontend/src/assets/imgs/What-is-Packet-Sniffing-01.png.webp b/UI/frontend/src/content/imgs/What-is-Packet-Sniffing-01.png.webp
similarity index 100%
rename from UI/frontend/src/assets/imgs/What-is-Packet-Sniffing-01.png.webp
rename to UI/frontend/src/content/imgs/What-is-Packet-Sniffing-01.png.webp
diff --git a/UI/frontend/src/assets/imgs/WhatsApp Image 2025-07-26 at 07.47.53.jpeg b/UI/frontend/src/content/imgs/WhatsApp Image 2025-07-26 at 07.47.53.jpeg
similarity index 100%
rename from UI/frontend/src/assets/imgs/WhatsApp Image 2025-07-26 at 07.47.53.jpeg
rename to UI/frontend/src/content/imgs/WhatsApp Image 2025-07-26 at 07.47.53.jpeg
diff --git a/UI/frontend/src/assets/imgs/WhatsApp Image 2025-07-28 at 19.40.07.jpeg b/UI/frontend/src/content/imgs/WhatsApp Image 2025-07-28 at 19.40.07.jpeg
similarity index 100%
rename from UI/frontend/src/assets/imgs/WhatsApp Image 2025-07-28 at 19.40.07.jpeg
rename to UI/frontend/src/content/imgs/WhatsApp Image 2025-07-28 at 19.40.07.jpeg
diff --git a/UI/frontend/src/assets/imgs/andoroid.gif b/UI/frontend/src/content/imgs/andoroid.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/andoroid.gif
rename to UI/frontend/src/content/imgs/andoroid.gif
diff --git a/imgs/async_port_scanner.jpg b/UI/frontend/src/content/imgs/async_port_scanner.jpg
similarity index 100%
rename from imgs/async_port_scanner.jpg
rename to UI/frontend/src/content/imgs/async_port_scanner.jpg
diff --git a/UI/frontend/src/assets/imgs/b1b55f18288795.562c702fe9883.gif b/UI/frontend/src/content/imgs/b1b55f18288795.562c702fe9883.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/b1b55f18288795.562c702fe9883.gif
rename to UI/frontend/src/content/imgs/b1b55f18288795.562c702fe9883.gif
diff --git a/imgs/bettercap_arp_spoofing_script.png b/UI/frontend/src/content/imgs/bettercap_arp_spoofing_script.png
similarity index 100%
rename from imgs/bettercap_arp_spoofing_script.png
rename to UI/frontend/src/content/imgs/bettercap_arp_spoofing_script.png
diff --git a/UI/frontend/src/assets/imgs/booting-up-developer-economy-how-tech-startups-are-helping-coders-build-and-test-software-faster.jpg.webp b/UI/frontend/src/content/imgs/booting-up-developer-economy-how-tech-startups-are-helping-coders-build-and-test-software-faster.jpg.webp
similarity index 100%
rename from UI/frontend/src/assets/imgs/booting-up-developer-economy-how-tech-startups-are-helping-coders-build-and-test-software-faster.jpg.webp
rename to UI/frontend/src/content/imgs/booting-up-developer-economy-how-tech-startups-are-helping-coders-build-and-test-software-faster.jpg.webp
diff --git a/imgs/https_data_fetcher_bettercap.png b/UI/frontend/src/content/imgs/https_data_fetcher_bettercap.png
similarity index 100%
rename from imgs/https_data_fetcher_bettercap.png
rename to UI/frontend/src/content/imgs/https_data_fetcher_bettercap.png
diff --git a/imgs/https_data_fetcher_bettercap1.png b/UI/frontend/src/content/imgs/https_data_fetcher_bettercap1.png
similarity index 100%
rename from imgs/https_data_fetcher_bettercap1.png
rename to UI/frontend/src/content/imgs/https_data_fetcher_bettercap1.png
diff --git a/imgs/https_data_fetcher_bettercap2.png b/UI/frontend/src/content/imgs/https_data_fetcher_bettercap2.png
similarity index 100%
rename from imgs/https_data_fetcher_bettercap2.png
rename to UI/frontend/src/content/imgs/https_data_fetcher_bettercap2.png
diff --git a/imgs/https_data_fetcher_bettercap3.png b/UI/frontend/src/content/imgs/https_data_fetcher_bettercap3.png
similarity index 100%
rename from imgs/https_data_fetcher_bettercap3.png
rename to UI/frontend/src/content/imgs/https_data_fetcher_bettercap3.png
diff --git a/imgs/ids_probe.png b/UI/frontend/src/content/imgs/ids_probe.png
similarity index 100%
rename from imgs/ids_probe.png
rename to UI/frontend/src/content/imgs/ids_probe.png
diff --git a/imgs/ids_probe1.png b/UI/frontend/src/content/imgs/ids_probe1.png
similarity index 100%
rename from imgs/ids_probe1.png
rename to UI/frontend/src/content/imgs/ids_probe1.png
diff --git a/imgs/ids_probe2.png b/UI/frontend/src/content/imgs/ids_probe2.png
similarity index 100%
rename from imgs/ids_probe2.png
rename to UI/frontend/src/content/imgs/ids_probe2.png
diff --git a/UI/frontend/src/assets/imgs/l1.png b/UI/frontend/src/content/imgs/l1.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/l1.png
rename to UI/frontend/src/content/imgs/l1.png
diff --git a/UI/frontend/src/assets/imgs/l2.png b/UI/frontend/src/content/imgs/l2.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/l2.png
rename to UI/frontend/src/content/imgs/l2.png
diff --git a/UI/frontend/src/assets/imgs/l3.png b/UI/frontend/src/content/imgs/l3.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/l3.png
rename to UI/frontend/src/content/imgs/l3.png
diff --git a/UI/frontend/src/assets/imgs/l4.png b/UI/frontend/src/content/imgs/l4.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/l4.png
rename to UI/frontend/src/content/imgs/l4.png
diff --git a/UI/frontend/src/assets/imgs/ll1.png b/UI/frontend/src/content/imgs/ll1.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/ll1.png
rename to UI/frontend/src/content/imgs/ll1.png
diff --git a/UI/frontend/src/assets/imgs/ll2.png b/UI/frontend/src/content/imgs/ll2.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/ll2.png
rename to UI/frontend/src/content/imgs/ll2.png
diff --git a/imgs/mac_address_change.jpg b/UI/frontend/src/content/imgs/mac_address_change.jpg
similarity index 100%
rename from imgs/mac_address_change.jpg
rename to UI/frontend/src/content/imgs/mac_address_change.jpg
diff --git a/imgs/main.jpg b/UI/frontend/src/content/imgs/main.jpg
similarity index 100%
rename from imgs/main.jpg
rename to UI/frontend/src/content/imgs/main.jpg
diff --git a/imgs/mitm_attack_automator.png b/UI/frontend/src/content/imgs/mitm_attack_automator.png
similarity index 100%
rename from imgs/mitm_attack_automator.png
rename to UI/frontend/src/content/imgs/mitm_attack_automator.png
diff --git a/imgs/port-scanning1.png b/UI/frontend/src/content/imgs/port-scanning1.png
similarity index 100%
rename from imgs/port-scanning1.png
rename to UI/frontend/src/content/imgs/port-scanning1.png
diff --git a/imgs/port-scanning2.png b/UI/frontend/src/content/imgs/port-scanning2.png
similarity index 100%
rename from imgs/port-scanning2.png
rename to UI/frontend/src/content/imgs/port-scanning2.png
diff --git a/imgs/port-scanning3.png b/UI/frontend/src/content/imgs/port-scanning3.png
similarity index 100%
rename from imgs/port-scanning3.png
rename to UI/frontend/src/content/imgs/port-scanning3.png
diff --git a/imgs/port-scanning4.png b/UI/frontend/src/content/imgs/port-scanning4.png
similarity index 100%
rename from imgs/port-scanning4.png
rename to UI/frontend/src/content/imgs/port-scanning4.png
diff --git a/imgs/portscanner_test.png b/UI/frontend/src/content/imgs/portscanner_test.png
similarity index 100%
rename from imgs/portscanner_test.png
rename to UI/frontend/src/content/imgs/portscanner_test.png
diff --git a/imgs/portscanner_test2.png b/UI/frontend/src/content/imgs/portscanner_test2.png
similarity index 100%
rename from imgs/portscanner_test2.png
rename to UI/frontend/src/content/imgs/portscanner_test2.png
diff --git a/UI/frontend/src/assets/imgs/quick scan plus.png b/UI/frontend/src/content/imgs/quick scan plus.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/quick scan plus.png
rename to UI/frontend/src/content/imgs/quick scan plus.png
diff --git a/imgs/remote_collect_via_ssh.jpg b/UI/frontend/src/content/imgs/remote_collect_via_ssh.jpg
similarity index 100%
rename from imgs/remote_collect_via_ssh.jpg
rename to UI/frontend/src/content/imgs/remote_collect_via_ssh.jpg
diff --git a/imgs/remote_collect_via_ssh2.jpg b/UI/frontend/src/content/imgs/remote_collect_via_ssh2.jpg
similarity index 100%
rename from imgs/remote_collect_via_ssh2.jpg
rename to UI/frontend/src/content/imgs/remote_collect_via_ssh2.jpg
diff --git a/imgs/remote_collect_via_ssh3.jpg b/UI/frontend/src/content/imgs/remote_collect_via_ssh3.jpg
similarity index 100%
rename from imgs/remote_collect_via_ssh3.jpg
rename to UI/frontend/src/content/imgs/remote_collect_via_ssh3.jpg
diff --git a/UI/frontend/src/assets/imgs/service_view_zenmap.png b/UI/frontend/src/content/imgs/service_view_zenmap.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/service_view_zenmap.png
rename to UI/frontend/src/content/imgs/service_view_zenmap.png
diff --git a/UI/frontend/src/assets/imgs/source.gif b/UI/frontend/src/content/imgs/source.gif
similarity index 100%
rename from UI/frontend/src/assets/imgs/source.gif
rename to UI/frontend/src/content/imgs/source.gif
diff --git a/UI/frontend/src/assets/imgs/vmw-virtualization-defined.jpg b/UI/frontend/src/content/imgs/vmw-virtualization-defined.jpg
similarity index 100%
rename from UI/frontend/src/assets/imgs/vmw-virtualization-defined.jpg
rename to UI/frontend/src/content/imgs/vmw-virtualization-defined.jpg
diff --git a/UI/frontend/src/assets/imgs/weakencrpyption.png b/UI/frontend/src/content/imgs/weakencrpyption.png
similarity index 100%
rename from UI/frontend/src/assets/imgs/weakencrpyption.png
rename to UI/frontend/src/content/imgs/weakencrpyption.png
diff --git a/imgs/wep_wifi_hacking.png b/UI/frontend/src/content/imgs/wep_wifi_hacking.png
similarity index 100%
rename from imgs/wep_wifi_hacking.png
rename to UI/frontend/src/content/imgs/wep_wifi_hacking.png
diff --git a/imgs/wordlist_generator.jpg b/UI/frontend/src/content/imgs/wordlist_generator.jpg
similarity index 100%
rename from imgs/wordlist_generator.jpg
rename to UI/frontend/src/content/imgs/wordlist_generator.jpg
diff --git a/imgs/wordlist_generator2.jpg b/UI/frontend/src/content/imgs/wordlist_generator2.jpg
similarity index 100%
rename from imgs/wordlist_generator2.jpg
rename to UI/frontend/src/content/imgs/wordlist_generator2.jpg
diff --git a/imgs/wpa2_dictionary_attack.png b/UI/frontend/src/content/imgs/wpa2_dictionary_attack.png
similarity index 100%
rename from imgs/wpa2_dictionary_attack.png
rename to UI/frontend/src/content/imgs/wpa2_dictionary_attack.png
diff --git a/python-scripts/arp_spoof_detector.py b/UI/frontend/src/content/python-scripts/arp_spoof_detector.py
similarity index 100%
rename from python-scripts/arp_spoof_detector.py
rename to UI/frontend/src/content/python-scripts/arp_spoof_detector.py
diff --git a/python-scripts/async_port_scanner.md b/UI/frontend/src/content/python-scripts/async_port_scanner.md
similarity index 100%
rename from python-scripts/async_port_scanner.md
rename to UI/frontend/src/content/python-scripts/async_port_scanner.md
diff --git a/python-scripts/async_port_scanner.py b/UI/frontend/src/content/python-scripts/async_port_scanner.py
similarity index 100%
rename from python-scripts/async_port_scanner.py
rename to UI/frontend/src/content/python-scripts/async_port_scanner.py
diff --git a/python-scripts/asyncio_port_scanner_readme.md b/UI/frontend/src/content/python-scripts/asyncio_port_scanner_readme.md
similarity index 100%
rename from python-scripts/asyncio_port_scanner_readme.md
rename to UI/frontend/src/content/python-scripts/asyncio_port_scanner_readme.md
diff --git a/python-scripts/bettercap_arp_spoofing_readme.md b/UI/frontend/src/content/python-scripts/bettercap_arp_spoofing_readme.md
similarity index 100%
rename from python-scripts/bettercap_arp_spoofing_readme.md
rename to UI/frontend/src/content/python-scripts/bettercap_arp_spoofing_readme.md
diff --git a/python-scripts/bettercap_arp_spoofing_script.md b/UI/frontend/src/content/python-scripts/bettercap_arp_spoofing_script.md
similarity index 100%
rename from python-scripts/bettercap_arp_spoofing_script.md
rename to UI/frontend/src/content/python-scripts/bettercap_arp_spoofing_script.md
diff --git a/python-scripts/bettercap_arp_spoofing_script.py b/UI/frontend/src/content/python-scripts/bettercap_arp_spoofing_script.py
similarity index 100%
rename from python-scripts/bettercap_arp_spoofing_script.py
rename to UI/frontend/src/content/python-scripts/bettercap_arp_spoofing_script.py
diff --git a/python-scripts/deauth_attack.md b/UI/frontend/src/content/python-scripts/deauth_attack.md
similarity index 100%
rename from python-scripts/deauth_attack.md
rename to UI/frontend/src/content/python-scripts/deauth_attack.md
diff --git a/python-scripts/deauth_attack.py b/UI/frontend/src/content/python-scripts/deauth_attack.py
similarity index 100%
rename from python-scripts/deauth_attack.py
rename to UI/frontend/src/content/python-scripts/deauth_attack.py
diff --git a/python-scripts/https_data_fetcher_bettercap.md b/UI/frontend/src/content/python-scripts/https_data_fetcher_bettercap.md
similarity index 100%
rename from python-scripts/https_data_fetcher_bettercap.md
rename to UI/frontend/src/content/python-scripts/https_data_fetcher_bettercap.md
diff --git a/python-scripts/https_data_fetcher_bettercap.py b/UI/frontend/src/content/python-scripts/https_data_fetcher_bettercap.py
similarity index 100%
rename from python-scripts/https_data_fetcher_bettercap.py
rename to UI/frontend/src/content/python-scripts/https_data_fetcher_bettercap.py
diff --git a/python-scripts/ids_probe.md b/UI/frontend/src/content/python-scripts/ids_probe.md
similarity index 100%
rename from python-scripts/ids_probe.md
rename to UI/frontend/src/content/python-scripts/ids_probe.md
diff --git a/python-scripts/ids_probe.py b/UI/frontend/src/content/python-scripts/ids_probe.py
similarity index 100%
rename from python-scripts/ids_probe.py
rename to UI/frontend/src/content/python-scripts/ids_probe.py
diff --git a/python-scripts/images/async.png b/UI/frontend/src/content/python-scripts/images/async.png
similarity index 100%
rename from python-scripts/images/async.png
rename to UI/frontend/src/content/python-scripts/images/async.png
diff --git a/python-scripts/images/async2.png b/UI/frontend/src/content/python-scripts/images/async2.png
similarity index 100%
rename from python-scripts/images/async2.png
rename to UI/frontend/src/content/python-scripts/images/async2.png
diff --git a/python-scripts/images/async_port_scanner_flow_edges.png b/UI/frontend/src/content/python-scripts/images/async_port_scanner_flow_edges.png
similarity index 100%
rename from python-scripts/images/async_port_scanner_flow_edges.png
rename to UI/frontend/src/content/python-scripts/images/async_port_scanner_flow_edges.png
diff --git a/python-scripts/images/bettercap_arp_op.png b/UI/frontend/src/content/python-scripts/images/bettercap_arp_op.png
similarity index 100%
rename from python-scripts/images/bettercap_arp_op.png
rename to UI/frontend/src/content/python-scripts/images/bettercap_arp_op.png
diff --git a/python-scripts/images/bettercap_controller_flow_professional.png b/UI/frontend/src/content/python-scripts/images/bettercap_controller_flow_professional.png
similarity index 100%
rename from python-scripts/images/bettercap_controller_flow_professional.png
rename to UI/frontend/src/content/python-scripts/images/bettercap_controller_flow_professional.png
diff --git a/python-scripts/images/deauth_controller.png b/UI/frontend/src/content/python-scripts/images/deauth_controller.png
similarity index 100%
rename from python-scripts/images/deauth_controller.png
rename to UI/frontend/src/content/python-scripts/images/deauth_controller.png
diff --git a/python-scripts/images/mitm_attack_flow.png b/UI/frontend/src/content/python-scripts/images/mitm_attack_flow.png
similarity index 100%
rename from python-scripts/images/mitm_attack_flow.png
rename to UI/frontend/src/content/python-scripts/images/mitm_attack_flow.png
diff --git a/python-scripts/images/mitm_automation_op.png b/UI/frontend/src/content/python-scripts/images/mitm_automation_op.png
similarity index 100%
rename from python-scripts/images/mitm_automation_op.png
rename to UI/frontend/src/content/python-scripts/images/mitm_automation_op.png
diff --git a/python-scripts/images/wpa_dictionary_attack_flow.png b/UI/frontend/src/content/python-scripts/images/wpa_dictionary_attack_flow.png
similarity index 100%
rename from python-scripts/images/wpa_dictionary_attack_flow.png
rename to UI/frontend/src/content/python-scripts/images/wpa_dictionary_attack_flow.png
diff --git a/python-scripts/images/wpa_wpa2_2op.png b/UI/frontend/src/content/python-scripts/images/wpa_wpa2_2op.png
similarity index 100%
rename from python-scripts/images/wpa_wpa2_2op.png
rename to UI/frontend/src/content/python-scripts/images/wpa_wpa2_2op.png
diff --git a/python-scripts/images/wpa_wpa2op.png b/UI/frontend/src/content/python-scripts/images/wpa_wpa2op.png
similarity index 100%
rename from python-scripts/images/wpa_wpa2op.png
rename to UI/frontend/src/content/python-scripts/images/wpa_wpa2op.png
diff --git a/python-scripts/mac-address-change.md b/UI/frontend/src/content/python-scripts/mac-address-change.md
similarity index 100%
rename from python-scripts/mac-address-change.md
rename to UI/frontend/src/content/python-scripts/mac-address-change.md
diff --git a/python-scripts/mac-address-change.py b/UI/frontend/src/content/python-scripts/mac-address-change.py
similarity index 100%
rename from python-scripts/mac-address-change.py
rename to UI/frontend/src/content/python-scripts/mac-address-change.py
diff --git a/python-scripts/mitm_attack_automation_readme.md b/UI/frontend/src/content/python-scripts/mitm_attack_automation_readme.md
similarity index 100%
rename from python-scripts/mitm_attack_automation_readme.md
rename to UI/frontend/src/content/python-scripts/mitm_attack_automation_readme.md
diff --git a/python-scripts/mitm_attack_automator.md b/UI/frontend/src/content/python-scripts/mitm_attack_automator.md
similarity index 100%
rename from python-scripts/mitm_attack_automator.md
rename to UI/frontend/src/content/python-scripts/mitm_attack_automator.md
diff --git a/python-scripts/mitm_attack_automator.py b/UI/frontend/src/content/python-scripts/mitm_attack_automator.py
similarity index 100%
rename from python-scripts/mitm_attack_automator.py
rename to UI/frontend/src/content/python-scripts/mitm_attack_automator.py
diff --git a/python-scripts/network_scanner.py b/UI/frontend/src/content/python-scripts/network_scanner.py
similarity index 100%
rename from python-scripts/network_scanner.py
rename to UI/frontend/src/content/python-scripts/network_scanner.py
diff --git a/python-scripts/portscanner_test.md b/UI/frontend/src/content/python-scripts/portscanner_test.md
similarity index 100%
rename from python-scripts/portscanner_test.md
rename to UI/frontend/src/content/python-scripts/portscanner_test.md
diff --git a/python-scripts/portscanner_test.py b/UI/frontend/src/content/python-scripts/portscanner_test.py
similarity index 100%
rename from python-scripts/portscanner_test.py
rename to UI/frontend/src/content/python-scripts/portscanner_test.py
diff --git a/python-scripts/remote_collect_via_ssh.md b/UI/frontend/src/content/python-scripts/remote_collect_via_ssh.md
similarity index 100%
rename from python-scripts/remote_collect_via_ssh.md
rename to UI/frontend/src/content/python-scripts/remote_collect_via_ssh.md
diff --git a/python-scripts/remote_collect_via_ssh.py b/UI/frontend/src/content/python-scripts/remote_collect_via_ssh.py
similarity index 100%
rename from python-scripts/remote_collect_via_ssh.py
rename to UI/frontend/src/content/python-scripts/remote_collect_via_ssh.py
diff --git a/python-scripts/wep_wifi_hacking.md b/UI/frontend/src/content/python-scripts/wep_wifi_hacking.md
similarity index 100%
rename from python-scripts/wep_wifi_hacking.md
rename to UI/frontend/src/content/python-scripts/wep_wifi_hacking.md
diff --git a/python-scripts/wep_wifi_hacking.py b/UI/frontend/src/content/python-scripts/wep_wifi_hacking.py
similarity index 100%
rename from python-scripts/wep_wifi_hacking.py
rename to UI/frontend/src/content/python-scripts/wep_wifi_hacking.py
diff --git a/python-scripts/wordlist_generator.md b/UI/frontend/src/content/python-scripts/wordlist_generator.md
similarity index 100%
rename from python-scripts/wordlist_generator.md
rename to UI/frontend/src/content/python-scripts/wordlist_generator.md
diff --git a/python-scripts/wordlist_generator.py b/UI/frontend/src/content/python-scripts/wordlist_generator.py
similarity index 100%
rename from python-scripts/wordlist_generator.py
rename to UI/frontend/src/content/python-scripts/wordlist_generator.py
diff --git a/python-scripts/wpa2_dictionary_attack.md b/UI/frontend/src/content/python-scripts/wpa2_dictionary_attack.md
similarity index 100%
rename from python-scripts/wpa2_dictionary_attack.md
rename to UI/frontend/src/content/python-scripts/wpa2_dictionary_attack.md
diff --git a/python-scripts/wpa2_dictionary_attack.py b/UI/frontend/src/content/python-scripts/wpa2_dictionary_attack.py
similarity index 100%
rename from python-scripts/wpa2_dictionary_attack.py
rename to UI/frontend/src/content/python-scripts/wpa2_dictionary_attack.py
diff --git a/python-scripts/wpa2_dictionary_attack_readme.md b/UI/frontend/src/content/python-scripts/wpa2_dictionary_attack_readme.md
similarity index 100%
rename from python-scripts/wpa2_dictionary_attack_readme.md
rename to UI/frontend/src/content/python-scripts/wpa2_dictionary_attack_readme.md
diff --git a/python-scripts/wpa_wps_hack.md b/UI/frontend/src/content/python-scripts/wpa_wps_hack.md
similarity index 100%
rename from python-scripts/wpa_wps_hack.md
rename to UI/frontend/src/content/python-scripts/wpa_wps_hack.md
diff --git a/python-scripts/wpa_wps_hack.py b/UI/frontend/src/content/python-scripts/wpa_wps_hack.py
similarity index 100%
rename from python-scripts/wpa_wps_hack.py
rename to UI/frontend/src/content/python-scripts/wpa_wps_hack.py
diff --git a/safe-practice-questions/answer-key.md b/UI/frontend/src/content/safe-practice-questions/answer-key.md
similarity index 100%
rename from safe-practice-questions/answer-key.md
rename to UI/frontend/src/content/safe-practice-questions/answer-key.md
diff --git a/safe-practice-questions/questions.md b/UI/frontend/src/content/safe-practice-questions/questions.md
similarity index 100%
rename from safe-practice-questions/questions.md
rename to UI/frontend/src/content/safe-practice-questions/questions.md
diff --git a/UI/frontend/src/index.css b/UI/frontend/src/index.css
index 08a3ac9..ed431ae 100644
--- a/UI/frontend/src/index.css
+++ b/UI/frontend/src/index.css
@@ -1,11 +1,22 @@
:root {
- font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
- line-height: 1.5;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
+ line-height: 1.6;
font-weight: 400;
- color-scheme: light dark;
- color: rgba(255, 255, 255, 0.87);
- background-color: #242424;
+ /* Dark theme with bright green accents */
+ --bg-primary: #0a0e1a;
+ --bg-secondary: #121829;
+ --bg-tertiary: #1a2332;
+ --text-primary: #e5e7eb;
+ --text-secondary: #9ca3af;
+ --accent-green: #00ff88;
+ --accent-green-light: #33ffaa;
+ --accent-green-dark: #00cc6a;
+ --border-color: #1f2937;
+
+ color-scheme: dark;
+ color: var(--text-primary);
+ background-color: var(--bg-primary);
font-synthesis: none;
text-rendering: optimizeLegibility;
@@ -15,19 +26,19 @@
a {
font-weight: 500;
- color: #646cff;
- text-decoration: inherit;
+ color: var(--accent-green);
+ text-decoration: none;
+ transition: color 0.2s ease;
}
a:hover {
- color: #535bf2;
+ color: var(--accent-green-light);
}
body {
margin: 0;
- display: flex;
- place-items: center;
min-width: 320px;
min-height: 100vh;
+ background-color: var(--bg-primary);
}
h1 {
diff --git a/UI/frontend/src/main.jsx b/UI/frontend/src/main.jsx
index b9a1a6d..33ae866 100644
--- a/UI/frontend/src/main.jsx
+++ b/UI/frontend/src/main.jsx
@@ -1,8 +1,12 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
+import { Buffer } from 'buffer'
import './index.css'
import App from './App.jsx'
+// Polyfill Buffer for browser environment (needed by gray-matter)
+window.Buffer = Buffer
+
createRoot(document.getElementById('root')).render(