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 +![Network Diagram](../imgs/network-topology.png) +``` + +--- + +## 📁 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 = () => ( -
-
-

Welcome to Hacking Tutorial

-

Select a lesson from the sidebar to get started

-
-

Available Courses:

-
    -
  • Ethical Hacking - Learn penetration testing and security fundamentals
  • -
  • Binary Exploitation - Understand buffer overflows and memory corruption
  • -
  • Python for Ethical Hacking - Master Python tools for security testing
  • -
  • Python Scripts - Collection of useful security scripts
  • -
-
-
-
-) - -// Sidebar component -const Sidebar = () => { - const [isEthicalHackingOpen, setIsEthicalHackingOpen] = useState(false); - const [isBinaryExploitOpen, setIsBinaryExploitOpen] = useState(false); - const [isPythonHackingOpen, setIsPythonHackingOpen] = useState(false); - const [isPythonScriptsOpen, setIsPythonScriptsOpen] = useState(false); - - const lessons = [ - { - id: 'lesson-01', - title: 'Getting Started with Ethical Hacking', - path: '/ethical-hacking/lesson-01' - }, - { - id: 'lesson-02', - title: 'Network Reconnaissance', - path: '/ethical-hacking/lesson-02' - }, - { - id: 'lesson-03', - title: 'Network Discovery', - path: '/ethical-hacking/lesson-03' - }, - { - id: 'lesson-04', - title: 'Vulnerability Assessment', - path: '/ethical-hacking/lesson-04' - }, - { - id: 'lesson-05', - title: 'Web Application Security', - path: '/ethical-hacking/lesson-05' - }, - { - id: 'lesson-06', - title: 'Advanced Exploitation', - path: '/ethical-hacking/lesson-06' - }, - { - id: 'lesson-cyberchef', - title: 'CyberChef', - path: '/ethical-hacking/cyberchef' - }, - { - id: 'lesson-fing', - title: 'Fing', - path: '/ethical-hacking/fing' - }, - { - id: 'lesson-password-attack', - title: 'Password Attack & Hash Cracking', - path: '/ethical-hacking/password-attack' - }, - { - id: 'lesson-phishing', - title: 'Phishing Toolkit', - path: '/ethical-hacking/phishing' - } - ] - - const binaryExploit = [ - { - id: 'intro', - title: 'Introduction to Buffer Overflow', - path: '/binary-exploitation/intro' - } - ] - - const pythonHacking = [ - { - id: 'mac-changer', - title: 'Writing A MAC Address Changer', - path: '/python-hacking/mac-changer' - } - ] - - const pythonScripts = [ - // Add Python scripts here when available - ] - - const toggleEthicalHacking = () => { - setIsEthicalHackingOpen(!isEthicalHackingOpen); - } - - const toggleBinaryExploit = () => { - setIsBinaryExploitOpen(!isBinaryExploitOpen); - } - - const togglePythonHacking = () => { - setIsPythonHackingOpen(!isPythonHackingOpen); - } - - const togglePythonScripts = () => { - setIsPythonScriptsOpen(!isPythonScriptsOpen); - } +const App = () => { + // Get all lessons to find the first one for the default redirect + const lessons = getAllLessons(); + const firstLesson = lessons.length > 0 ? lessons[0] : null; return ( -
-
-
- Ethical Hacking - -
- {isEthicalHackingOpen && ( -
- {lessons.map((lesson) => ( - - {lesson.title} - - ))} -
- )} -
- -
-
- Binary Exploitation - -
- {isBinaryExploitOpen && ( -
- {binaryExploit.map((lesson) => ( - - {lesson.title} - - ))} -
- )} -
- -
-
- Python for Ethical Hacking - -
- {isPythonHackingOpen && ( -
- {pythonHacking.map((lesson) => ( - - {lesson.title} - - ))} -
- )} -
- -
-
- Python Scripts - -
- {isPythonScriptsOpen && ( -
- {pythonScripts.length > 0 ? pythonScripts.map((lesson) => ( - - {lesson.title} - - )) : ( -
No scripts available
- )} -
- )} -
-
- ) -} - -function App() { - return ( - -
- - - - - - } /> - } /> - } /> - } /> - } /> - {/* Add more routes as you create more lesson components */} - -
-
- ) -} - -export default App \ No newline at end of file + + + {/* Redirect root to first lesson */} + + ) : ( +
+

No lessons found

+

Please add markdown files to the content folder.

+
+ ) + } + /> + + {/* Dynamic lesson route */} + } /> + + {/* 404 fallback */} + +

404 - Page Not Found

+

The page you're looking for doesn't exist.

+ {firstLesson && ( + + Go to First Lesson + + )} + + } + /> +
+
+ ); +}; + +export default App; \ No newline at end of file diff --git a/UI/frontend/src/Pages/Binary_Exploitation/BinaryIntro.jsx b/UI/frontend/src/Pages/Binary_Exploitation/BinaryIntro.jsx deleted file mode 100644 index 11069bb..0000000 --- a/UI/frontend/src/Pages/Binary_Exploitation/BinaryIntro.jsx +++ /dev/null @@ -1,114 +0,0 @@ -import React from 'react'; -import './LessonStyles.css'; - -const BinaryIntro = () => { - return ( -
-

Introduction to Buffer Overflow: The Dangerous gets() Function

-
-
-

My First Encounter with Buffer Overflows

-

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().

-
- -
-

What is a Buffer Overflow?

-

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 Culprit: gets() Function

-

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.

-
- -
-

A Simple Example That Shows the Problem

-

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;
-}`}
-            
-
- -

What Happens When Things Go Wrong?

-
    -
  1. Normal input: "Alice" → Everything works fine
  2. -
  3. Long input: "A" repeated 100 times → CRASH!
  4. -
- -

When you input more than 64 characters, the excess data overwrites:

-
    -
  • Local variables
  • -
  • Return addresses
  • -
  • Function pointers
  • -
  • Other critical memory locations
  • -
-
- -
-

Memory Layout

-

Understanding how memory is organized is crucial for buffer overflow exploitation:

- -
-

Stack Memory Layout

-
    -
  • Higher Memory Addresses
  • -
  • Return Address
  • -
  • Saved Frame Pointer
  • -
  • Local Variables (including buffer)
  • -
  • Lower Memory Addresses
  • -
-
-
- -
-

Exploitation Techniques

-

Stack Smashing

-

By overflowing a buffer, we can overwrite the return address and redirect program execution.

- -

Return-to-libc

-

Instead of injecting shellcode, we can return to existing functions in the system.

- -

ROP (Return-Oriented Programming)

-

Chaining together small code sequences called "gadgets" to perform complex operations.

-
- -
-

Protection Mechanisms

-

Modern Protections

-
    -
  • Stack Canaries: Random values placed before return addresses
  • -
  • ASLR: Address Space Layout Randomization
  • -
  • NX Bit: Non-executable stack protection
  • -
  • Stack Guard: Compiler-based protection
  • -
-
-
-
- ); -}; - -export default BinaryIntro; \ No newline at end of file diff --git a/UI/frontend/src/Pages/Binary_Exploitation/LessonStyles.css b/UI/frontend/src/Pages/Binary_Exploitation/LessonStyles.css deleted file mode 100644 index d069300..0000000 --- a/UI/frontend/src/Pages/Binary_Exploitation/LessonStyles.css +++ /dev/null @@ -1,182 +0,0 @@ -/* Lesson Page Styles */ -.lesson-page { - padding: 2rem; - max-width: 1200px; - margin: 0 auto; - margin-left: 300px; /* Account for sidebar width */ - margin-top: 100px; /* Account for navbar height */ - color: #00ff00; - background-color: #000000; - min-height: calc(100vh - 100px); -} - -.lesson-page h1 { - color: #00ff00; - font-size: 2.5rem; - margin-bottom: 2rem; - border-bottom: 3px solid #00ff00; - padding-bottom: 1rem; - font-weight: bold; -} - -.lesson-page h2 { - color: #00ff00; - font-size: 1.8rem; - margin-top: 2rem; - margin-bottom: 1rem; - border-bottom: 2px solid #00ff00; - padding-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page h3 { - color: #00ff00; - font-size: 1.4rem; - margin-top: 1.5rem; - margin-bottom: 0.8rem; - font-weight: bold; -} - -.lesson-page h4 { - color: #00ff00; - font-size: 1.2rem; - margin-top: 1rem; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page p { - color: #00cc00; - font-size: 1.1rem; - line-height: 1.6; - margin-bottom: 1rem; - font-weight: bold; -} - -.lesson-page ul, .lesson-page ol { - color: #00cc00; - margin-bottom: 1rem; - padding-left: 2rem; -} - -.lesson-page li { - margin-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page strong { - color: #00ff00; - font-weight: bold; -} - -.lesson-page code { - background-color: #111111; - color: #00ff00; - padding: 2px 6px; - border-radius: 3px; - border: 1px solid #00ff00; - font-family: 'Courier New', monospace; - font-weight: bold; -} - -.code-block { - background-color: #111111; - border: 2px solid #00ff00; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; - overflow-x: auto; -} - -.code-block pre { - color: #00ff00; - font-family: 'Courier New', monospace; - font-size: 14px; - line-height: 1.4; - margin: 0; - white-space: pre-wrap; - font-weight: bold; -} - -.lesson-content section { - margin-bottom: 2rem; - padding: 1rem; - background-color: #0a0a0a; - border: 1px solid #003300; - border-radius: 8px; -} - -.memory-layout { - background-color: #111111; - border: 2px solid #00ff00; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; -} - -.memory-layout h3 { - color: #00ff00; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.memory-layout ul { - list-style: none; - padding: 0; -} - -.memory-layout li { - background-color: #002200; - margin: 0.2rem 0; - padding: 0.5rem; - border: 1px solid #00ff00; - border-radius: 4px; - text-align: center; - font-weight: bold; -} - -.warning-box { - background-color: #1a0a00; - border: 2px solid #ff6600; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; -} - -.warning-box h3 { - color: #ff6600; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.warning-box ul { - color: #ffaa66; -} - -.warning-box li { - font-weight: bold; -} - -/* Responsive Design */ -@media (max-width: 768px) { - .lesson-page { - padding: 1rem; - margin-left: 220px; /* Account for smaller sidebar on mobile */ - } - - .lesson-page h1 { - font-size: 2rem; - } - - .lesson-page h2 { - font-size: 1.5rem; - } - - .lesson-page h3 { - font-size: 1.3rem; - } - - .code-block { - font-size: 12px; - } -} \ No newline at end of file diff --git a/UI/frontend/src/Pages/Ethical_Hacking/Lesson01.jsx b/UI/frontend/src/Pages/Ethical_Hacking/Lesson01.jsx deleted file mode 100644 index f0c2c77..0000000 --- a/UI/frontend/src/Pages/Ethical_Hacking/Lesson01.jsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from 'react'; -import './LessonStyles.css'; - -const Lesson01 = () => { - return ( -
-

Getting Started with Ethical Hacking

-
-
-

Introduction

-

Hacking is getting unauthorized access to a system.

-

Hackers generally are of three types:

-
    -
  • Black Hat: Such hackers generally tend to cause some damage, steal information
  • -
  • White Hat: These hakers utilise the hacking knowledge for security/educational purposes
  • -
  • Grey Hat: These hackers intrude into systems but don't cause any damage to the sytem, nor steal information.
  • -
-

Hacking actually do have a really big industry, due to large need of organizations to secure there data, and systems.

-
- -
-

Setup for learning

-

For, this purpose we will utilise the concept of Virtual Machines, to replicate various systems.

-

Let's discuss each component for this course:

-
    -
  • Host Machine: This is your main PC or Laptop with it's current OS
  • -
  • Hacking Machine: [Kali Linux VM] This is the VM from where attack will be executed.
  • -
- -

Virtualization

-

Virtualization is the process of creating a virtual version of something, including virtual computer hardware platforms, storage devices, and computer network resources.

-
- -
-

Introduction to Penetration Testing

-

Penetration testing is a simulated cyber attack against your computer system to check for exploitable vulnerabilities.

- -

Connecting Wireless adapter to Kali

-

To perform wireless attacks, you need to connect a compatible wireless adapter to your Kali Linux VM.

- -

Wireless Modes

-

Wireless interfaces can operate in different modes:

-
    -
  • Managed Mode: Normal client mode
  • -
  • Monitor Mode: Allows capturing of all wireless traffic
  • -
- -

Enabling Monitor Mode on Wireless Adapter

-

Monitor mode is essential for wireless penetration testing as it allows you to capture all wireless traffic in the area.

-
- -
-

Extras - Learning Section - 🔐 RSA Encryption

-

📌 What is RSA?

-

RSA is a public-key cryptosystem that is widely used for secure data transmission.

- -

🧮 The Math Behind RSA (Step by Step)

-

Step 1: Pick Two Large Primes ✨

-

Choose two large prime numbers p and q.

- -

Step 2: Build the Modulus 🔲

-

Calculate n = p × q

- -

Step 3: Euler Joins the Party 🧑‍🏫

-

Calculate φ(n) = (p-1)(q-1)

- -

Step 4: Pick the Public Exponent 🔑

-

Choose e such that 1 < e < φ(n) and gcd(e, φ(n)) = 1

- -

Step 5: Find the Secret Ingredient 🧙

-

Calculate d such that d × e ≡ 1 (mod φ(n))

- -

Step 6: Keys Ready 🎉

-

Public key: (n, e), Private key: (n, d)

- -

Step 7: Encryption & Decryption 🔐

-

Encryption: c = m^e mod n

-

Decryption: m = c^d mod n

-
-
-
- ); -}; - -export default Lesson01; \ No newline at end of file diff --git a/UI/frontend/src/Pages/Ethical_Hacking/Lesson02.jsx b/UI/frontend/src/Pages/Ethical_Hacking/Lesson02.jsx deleted file mode 100644 index ee68635..0000000 --- a/UI/frontend/src/Pages/Ethical_Hacking/Lesson02.jsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react'; -import './LessonStyles.css'; - -const Lesson02 = () => { - return ( -
-

Network Reconnaissance and Information Gathering

-
-
-

Introduction to Reconnaissance

-

Reconnaissance is the first phase of penetration testing where we gather information about the target.

- -

Types of Reconnaissance

-
    -
  • Passive Reconnaissance: Gathering information without directly interacting with the target
  • -
  • Active Reconnaissance: Directly probing the target system
  • -
-
- -
-

Information Gathering Techniques

-

OSINT (Open Source Intelligence)

-

Collecting publicly available information about the target.

- -

Tools for Information Gathering

-
    -
  • Google Dorking
  • -
  • Shodan
  • -
  • TheHarvester
  • -
  • Maltego
  • -
-
- -
-

DNS Enumeration

-

Domain Name System enumeration to gather information about domain names and IP addresses.

- -

Common DNS Tools

-
    -
  • nslookup
  • -
  • dig
  • -
  • fierce
  • -
  • dnsrecon
  • -
-
-
-
- ); -}; - -export default Lesson02; \ No newline at end of file diff --git a/UI/frontend/src/Pages/Ethical_Hacking/LessonStyles.css b/UI/frontend/src/Pages/Ethical_Hacking/LessonStyles.css deleted file mode 100644 index d069300..0000000 --- a/UI/frontend/src/Pages/Ethical_Hacking/LessonStyles.css +++ /dev/null @@ -1,182 +0,0 @@ -/* Lesson Page Styles */ -.lesson-page { - padding: 2rem; - max-width: 1200px; - margin: 0 auto; - margin-left: 300px; /* Account for sidebar width */ - margin-top: 100px; /* Account for navbar height */ - color: #00ff00; - background-color: #000000; - min-height: calc(100vh - 100px); -} - -.lesson-page h1 { - color: #00ff00; - font-size: 2.5rem; - margin-bottom: 2rem; - border-bottom: 3px solid #00ff00; - padding-bottom: 1rem; - font-weight: bold; -} - -.lesson-page h2 { - color: #00ff00; - font-size: 1.8rem; - margin-top: 2rem; - margin-bottom: 1rem; - border-bottom: 2px solid #00ff00; - padding-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page h3 { - color: #00ff00; - font-size: 1.4rem; - margin-top: 1.5rem; - margin-bottom: 0.8rem; - font-weight: bold; -} - -.lesson-page h4 { - color: #00ff00; - font-size: 1.2rem; - margin-top: 1rem; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page p { - color: #00cc00; - font-size: 1.1rem; - line-height: 1.6; - margin-bottom: 1rem; - font-weight: bold; -} - -.lesson-page ul, .lesson-page ol { - color: #00cc00; - margin-bottom: 1rem; - padding-left: 2rem; -} - -.lesson-page li { - margin-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page strong { - color: #00ff00; - font-weight: bold; -} - -.lesson-page code { - background-color: #111111; - color: #00ff00; - padding: 2px 6px; - border-radius: 3px; - border: 1px solid #00ff00; - font-family: 'Courier New', monospace; - font-weight: bold; -} - -.code-block { - background-color: #111111; - border: 2px solid #00ff00; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; - overflow-x: auto; -} - -.code-block pre { - color: #00ff00; - font-family: 'Courier New', monospace; - font-size: 14px; - line-height: 1.4; - margin: 0; - white-space: pre-wrap; - font-weight: bold; -} - -.lesson-content section { - margin-bottom: 2rem; - padding: 1rem; - background-color: #0a0a0a; - border: 1px solid #003300; - border-radius: 8px; -} - -.memory-layout { - background-color: #111111; - border: 2px solid #00ff00; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; -} - -.memory-layout h3 { - color: #00ff00; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.memory-layout ul { - list-style: none; - padding: 0; -} - -.memory-layout li { - background-color: #002200; - margin: 0.2rem 0; - padding: 0.5rem; - border: 1px solid #00ff00; - border-radius: 4px; - text-align: center; - font-weight: bold; -} - -.warning-box { - background-color: #1a0a00; - border: 2px solid #ff6600; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; -} - -.warning-box h3 { - color: #ff6600; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.warning-box ul { - color: #ffaa66; -} - -.warning-box li { - font-weight: bold; -} - -/* Responsive Design */ -@media (max-width: 768px) { - .lesson-page { - padding: 1rem; - margin-left: 220px; /* Account for smaller sidebar on mobile */ - } - - .lesson-page h1 { - font-size: 2rem; - } - - .lesson-page h2 { - font-size: 1.5rem; - } - - .lesson-page h3 { - font-size: 1.3rem; - } - - .code-block { - font-size: 12px; - } -} \ No newline at end of file diff --git a/UI/frontend/src/Pages/Python_for_Hacking/LessonStyles.css b/UI/frontend/src/Pages/Python_for_Hacking/LessonStyles.css deleted file mode 100644 index d069300..0000000 --- a/UI/frontend/src/Pages/Python_for_Hacking/LessonStyles.css +++ /dev/null @@ -1,182 +0,0 @@ -/* Lesson Page Styles */ -.lesson-page { - padding: 2rem; - max-width: 1200px; - margin: 0 auto; - margin-left: 300px; /* Account for sidebar width */ - margin-top: 100px; /* Account for navbar height */ - color: #00ff00; - background-color: #000000; - min-height: calc(100vh - 100px); -} - -.lesson-page h1 { - color: #00ff00; - font-size: 2.5rem; - margin-bottom: 2rem; - border-bottom: 3px solid #00ff00; - padding-bottom: 1rem; - font-weight: bold; -} - -.lesson-page h2 { - color: #00ff00; - font-size: 1.8rem; - margin-top: 2rem; - margin-bottom: 1rem; - border-bottom: 2px solid #00ff00; - padding-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page h3 { - color: #00ff00; - font-size: 1.4rem; - margin-top: 1.5rem; - margin-bottom: 0.8rem; - font-weight: bold; -} - -.lesson-page h4 { - color: #00ff00; - font-size: 1.2rem; - margin-top: 1rem; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page p { - color: #00cc00; - font-size: 1.1rem; - line-height: 1.6; - margin-bottom: 1rem; - font-weight: bold; -} - -.lesson-page ul, .lesson-page ol { - color: #00cc00; - margin-bottom: 1rem; - padding-left: 2rem; -} - -.lesson-page li { - margin-bottom: 0.5rem; - font-weight: bold; -} - -.lesson-page strong { - color: #00ff00; - font-weight: bold; -} - -.lesson-page code { - background-color: #111111; - color: #00ff00; - padding: 2px 6px; - border-radius: 3px; - border: 1px solid #00ff00; - font-family: 'Courier New', monospace; - font-weight: bold; -} - -.code-block { - background-color: #111111; - border: 2px solid #00ff00; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; - overflow-x: auto; -} - -.code-block pre { - color: #00ff00; - font-family: 'Courier New', monospace; - font-size: 14px; - line-height: 1.4; - margin: 0; - white-space: pre-wrap; - font-weight: bold; -} - -.lesson-content section { - margin-bottom: 2rem; - padding: 1rem; - background-color: #0a0a0a; - border: 1px solid #003300; - border-radius: 8px; -} - -.memory-layout { - background-color: #111111; - border: 2px solid #00ff00; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; -} - -.memory-layout h3 { - color: #00ff00; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.memory-layout ul { - list-style: none; - padding: 0; -} - -.memory-layout li { - background-color: #002200; - margin: 0.2rem 0; - padding: 0.5rem; - border: 1px solid #00ff00; - border-radius: 4px; - text-align: center; - font-weight: bold; -} - -.warning-box { - background-color: #1a0a00; - border: 2px solid #ff6600; - border-radius: 8px; - padding: 1rem; - margin: 1rem 0; -} - -.warning-box h3 { - color: #ff6600; - margin-bottom: 0.5rem; - font-weight: bold; -} - -.warning-box ul { - color: #ffaa66; -} - -.warning-box li { - font-weight: bold; -} - -/* Responsive Design */ -@media (max-width: 768px) { - .lesson-page { - padding: 1rem; - margin-left: 220px; /* Account for smaller sidebar on mobile */ - } - - .lesson-page h1 { - font-size: 2rem; - } - - .lesson-page h2 { - font-size: 1.5rem; - } - - .lesson-page h3 { - font-size: 1.3rem; - } - - .code-block { - font-size: 12px; - } -} \ No newline at end of file diff --git a/UI/frontend/src/Pages/Python_for_Hacking/MacChanger.jsx b/UI/frontend/src/Pages/Python_for_Hacking/MacChanger.jsx deleted file mode 100644 index c1ae773..0000000 --- a/UI/frontend/src/Pages/Python_for_Hacking/MacChanger.jsx +++ /dev/null @@ -1,159 +0,0 @@ -import React from 'react'; -import './LessonStyles.css'; - -const MacChanger = () => { - return ( -
-

Writing A MAC Address Changer

-
-
-

What is a MAC Address?

-

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.

- -
    -
  • IP Address: Used to identify computers in the network, and communicate between the devices on the Internet.
  • -
  • MAC Address: Used within the network to identify devices and transfer data between them.
  • -
- -

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.

-
- -
-

Why change MAC Address?

-

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.

- -

Benefits of MAC Address Changing:

-
    -
  • Anonymity: Makes you anonymous on the network
  • -
  • Impersonation: Lets you impersonate another device
  • -
  • Bypass Filters: Allows you to bypass MAC-based access controls
  • -
  • Network Access: Connect to networks that only allow specific MAC addresses
  • -
  • Hide Identity: Helps hide your identity during penetration testing
  • -
-
- -
-

How to change MAC Address?

- -

Step 1: Check Current Interfaces

-

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.

- -

Step 2: Disable the Interface

-

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.

- -

Step 3: Change the MAC Address

-

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]
-
- -

Step 4: Re-enable the Interface

-

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.

- -

Step 5: Verify the Change

-

Use the ifconfig command again to check if the MAC Address has changed. Look at the ether option of the interface you modified.

-
- -
-

Complete Example

-

Changing eth0 MAC Address

-
-
-{`# 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`}
-            
-
-
- -
-

Automating with Python

-

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)`}
-            
-
-
- -
-

Important Notes

-
-

⚠️ Important Considerations

-
    -
  • Legal Use Only: Only use MAC address changing for legitimate purposes
  • -
  • Temporary Change: MAC address changes are temporary and reset on reboot
  • -
  • Valid Format: Ensure the new MAC address follows the correct format (XX:XX:XX:XX:XX:XX)
  • -
  • Network Issues: Changing MAC address might cause temporary network connectivity issues
  • -
-
-
-
-
- ); -}; - -export default MacChanger; \ No newline at end of file diff --git a/UI/frontend/src/components/LessonTemplate.css b/UI/frontend/src/components/LessonTemplate.css new file mode 100644 index 0000000..522f1c1 --- /dev/null +++ b/UI/frontend/src/components/LessonTemplate.css @@ -0,0 +1,394 @@ +/* Lesson Container */ +.lesson-container { + max-width: 100%; + width: 100%; + margin: 0 auto; + padding: 2rem; + min-height: 100vh; + background-color: var(--bg-primary); + color: var(--text-primary); +} + +@media (max-width: 768px) { + .lesson-container { + padding: 1rem; + } +} + +/* Lesson Header */ +.lesson-header { + border-bottom: 2px solid var(--border-color); + padding-bottom: 1.5rem; + margin-bottom: 2rem; +} + +.lesson-header h1 { + margin: 0 0 1rem 0; + font-size: 2.5rem; + color: var(--text-primary); + line-height: 1.2; + font-weight: 700; +} + +.lesson-meta { + display: flex; + gap: 1rem; + align-items: center; +} + +.category-badge { + background: linear-gradient(135deg, var(--accent-green) 0%, var(--accent-green-dark) 100%); + color: #000000; + padding: 0.4rem 1rem; + border-radius: 20px; + font-size: 0.875rem; + font-weight: 700; + text-transform: capitalize; +} + +.lesson-number { + color: var(--text-secondary); + font-size: 0.875rem; + font-weight: 500; +} + +/* Lesson Content */ +.lesson-content { + line-height: 1.8; + color: var(--text-primary); + font-size: 1.05rem; +} + +.lesson-content h1, +.lesson-content h2, +.lesson-content h3, +.lesson-content h4 { + margin-top: 2rem; + margin-bottom: 1rem; + color: var(--text-primary); + font-weight: 700; +} + +.lesson-content h2 { + font-size: 1.8rem; + border-bottom: 2px solid var(--border-color); + padding-bottom: 0.5rem; + color: var(--accent-green-light); +} + +.lesson-content h3 { + font-size: 1.4rem; + color: var(--text-primary); +} + +.lesson-content p { + margin-bottom: 1.2rem; + color: var(--text-secondary); +} + +.lesson-content ul, +.lesson-content ol { + margin-bottom: 1.5rem; + padding-left: 2rem; + color: var(--text-secondary); +} + +.lesson-content li { + margin-bottom: 0.5rem; +} + +.lesson-content img { + max-width: 100%; + height: auto; + border-radius: 8px; + margin: 1.5rem 0; + box-shadow: 0 4px 12px rgba(16, 185, 129, 0.1); + border: 1px solid var(--border-color); +} + +.lesson-content blockquote { + border-left: 4px solid var(--accent-green); + margin: 1.5rem 0; + padding: 1rem 1.5rem; + background: var(--bg-secondary); + border-radius: 4px; + color: var(--text-secondary); +} + +.lesson-content a { + color: var(--accent-green); + text-decoration: none; + border-bottom: 1px solid transparent; + transition: all 0.2s; +} + +.lesson-content a:hover { + color: var(--accent-green-light); + border-bottom-color: var(--accent-green-light); +} + +.external-link-icon { + font-size: 0.8em; + margin-left: 0.2em; +} + +/* Code Blocks */ +.code-block-wrapper { + position: relative; + margin: 1.5rem 0; +} + +.code-language { + position: absolute; + top: 0; + right: 0; + background: var(--accent-green); + color: #000000; + padding: 0.25rem 0.75rem; + border-radius: 0 4px 0 4px; + font-size: 0.75rem; + text-transform: uppercase; + font-weight: 700; +} + +.lesson-content pre { + background: var(--bg-secondary); + color: #e5e7eb; + padding: 1.5rem; + border-radius: 8px; + overflow-x: auto; + font-family: 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace; + font-size: 0.9rem; + line-height: 1.6; + margin-top: 2rem; + border: 1px solid var(--border-color); +} + +.lesson-content code { + font-family: 'Fira Code', 'Consolas', 'Monaco', 'Courier New', monospace; +} + +.lesson-content :not(pre) > code { + background: var(--bg-secondary); + color: var(--accent-green-light); + padding: 0.2rem 0.4rem; + border-radius: 3px; + font-size: 0.9em; + border: 1px solid var(--border-color); +} + +.lesson-content table { + width: 100%; + border-collapse: collapse; + margin: 1.5rem 0; + overflow-x: auto; + display: block; + background: var(--bg-secondary); + border-radius: 8px; +} + +.lesson-content th, +.lesson-content td { + border: 1px solid var(--border-color); + padding: 0.75rem; + text-align: left; + color: var(--text-secondary); +} + +.lesson-content th { + background: var(--bg-tertiary); + font-weight: 600; + color: var(--accent-green-light); +} + +/* Navigation */ +.lesson-navigation { + display: flex; + justify-content: space-between; + gap: 1rem; + margin: 3rem 0; + padding: 2rem 0; + border-top: 2px solid var(--border-color); + border-bottom: 2px solid var(--border-color); +} + +.lesson-navigation:first-of-type { + margin-top: 2rem; +} + +.lesson-navigation:last-of-type { + margin-bottom: 2rem; +} + +.nav-left, +.nav-right { + flex: 1; + display: flex; +} + +.nav-right { + justify-content: flex-end; +} + +.nav-button { + display: flex; + align-items: center; + gap: 1rem; + padding: 1rem 1.5rem; + background: linear-gradient(135deg, var(--accent-green) 0%, var(--accent-green-dark) 100%); + color: #000000; + text-decoration: none; + border-radius: 8px; + transition: all 0.3s ease; + box-shadow: 0 4px 12px rgba(0, 255, 136, 0.3); + max-width: 350px; + font-weight: 600; + border: none; +} + +.nav-button:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(0, 255, 136, 0.5); + background: linear-gradient(135deg, var(--accent-green-light) 0%, var(--accent-green) 100%); + color: #000000; +} + +.nav-button.disabled { + background: var(--bg-secondary); + color: var(--text-secondary); + cursor: not-allowed; + box-shadow: none; + border: 1px solid var(--border-color); +} + +.nav-button.disabled:hover { + transform: none; +} + +.nav-arrow { + font-size: 1.5rem; + font-weight: bold; +} + +.nav-content { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.nav-label { + font-size: 0.75rem; + text-transform: uppercase; + opacity: 0.9; + font-weight: 700; + color: #000000; +} + +.nav-title { + font-size: 0.95rem; + font-weight: 600; + color: #000000; +} + +.nav-text { + font-size: 0.9rem; + color: inherit; +} + +.nav-arrow { + font-size: 1.5rem; + font-weight: bold; + color: #000000; +} + +/* Lesson Not Found */ +.lesson-not-found { + text-align: center; + padding: 4rem 2rem; + background: var(--bg-secondary); + border-radius: 12px; + border: 1px solid var(--border-color); +} + +.lesson-not-found h1 { + font-size: 2rem; + color: var(--text-primary); + margin-bottom: 1rem; +} + +.lesson-not-found p { + color: var(--text-secondary); + margin-bottom: 2rem; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .lesson-container { + padding: 1rem; + } + + .lesson-header h1 { + font-size: 2rem; + } + + .lesson-navigation { + flex-direction: column; + } + + .nav-left, + .nav-right { + justify-content: stretch; + } + + .nav-button { + max-width: 100%; + width: 100%; + } + + .lesson-content pre { + padding: 1rem; + font-size: 0.85rem; + } + + .lesson-content { + font-size: 1rem; + } +} + +/* Dark mode support (optional) */ +@media (prefers-color-scheme: dark) { + .lesson-container { + background: #1a1a1a; + color: #e0e0e0; + } + + .lesson-header h1, + .lesson-content h1, + .lesson-content h2, + .lesson-content h3, + .lesson-content h4 { + color: #ffffff; + } + + .lesson-content { + color: #e0e0e0; + } + + .lesson-content blockquote { + background: #2a2a2a; + border-left-color: #667eea; + } + + .lesson-content :not(pre) > code { + background: #2a2a2a; + color: #ff79c6; + } + + .lesson-header { + border-bottom-color: #333; + } + + .lesson-navigation { + border-top-color: #333; + } +} diff --git a/UI/frontend/src/components/LessonTemplate.jsx b/UI/frontend/src/components/LessonTemplate.jsx new file mode 100644 index 0000000..8cc1a14 --- /dev/null +++ b/UI/frontend/src/components/LessonTemplate.jsx @@ -0,0 +1,139 @@ +import React from 'react'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import rehypeRaw from 'rehype-raw'; +import { Link } from 'react-router-dom'; +import './LessonTemplate.css'; + +/** + * Reusable template for displaying lesson content + * @param {Object} lesson - The lesson object with frontmatter and content + * @param {Object} navigation - Object with prev and next lessons + */ +export default function LessonTemplate({ lesson, navigation }) { + if (!lesson) { + return ( +
+
+

Lesson not found

+

The lesson you're looking for doesn't exist.

+ Go to First Lesson +
+
+ ); + } + + const { frontmatter, content } = lesson; + const { prev, next } = navigation || { prev: null, next: null }; + + // Navigation component to be reused at top and bottom + const NavigationButtons = () => ( + + ); + + return ( +
+ {/* Header */} +
+

{frontmatter.title}

+
+ {frontmatter.category && ( + {frontmatter.category} + )} + {frontmatter.order && ( + Lesson {frontmatter.order} + )} +
+
+ + {/* Navigation at Top */} + + + {/* Markdown Content */} +
+ + {children} + + ) : ( +
+ {match &&
{match[1]}
} +
+                    {children}
+                  
+
+ ); + }, + // Custom rendering for images with lazy loading + img({ src, alt, ...props }) { + return ( + {alt + ); + }, + // Custom rendering for links + a({ href, children, ...props }) { + // Check if it's an external link + const isExternal = href?.startsWith('http'); + return isExternal ? ( + + {children} + + ) : ( + {children} + ); + } + }} + > + {content} +
+
+ + {/* Navigation at Bottom */} + +
+ ); +} diff --git a/UI/frontend/src/components/Navbar.css b/UI/frontend/src/components/Navbar.css new file mode 100644 index 0000000..a5d48ff --- /dev/null +++ b/UI/frontend/src/components/Navbar.css @@ -0,0 +1,86 @@ +.navbar { + background-color: var(--bg-secondary); + border-bottom: 2px solid var(--accent-green); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); + position: sticky; + top: 0; + z-index: 1000; + width: 100%; +} + +.navbar-container { + max-width: 100%; + margin: 0 auto; + padding: 1rem 2rem; + display: flex; + justify-content: space-between; + align-items: center; +} + +.navbar-brand { + display: flex; + align-items: center; + gap: 0.5rem; + text-decoration: none; + color: var(--accent-green); + font-size: 1.5rem; + font-weight: 700; + transition: all 0.3s ease; +} + +.navbar-brand:hover { + color: var(--accent-green-light); + text-shadow: 0 0 10px rgba(0, 255, 136, 0.5); +} + +.brand-icon { + font-family: 'Courier New', monospace; +} + +.navbar-links { + display: flex; + gap: 1.5rem; + align-items: center; +} + +.nav-link { + color: var(--text-primary); + text-decoration: none; + padding: 0.5rem 1rem; + border-radius: 6px; + transition: all 0.3s ease; + border: 1px solid transparent; + font-weight: 500; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.nav-link:hover { + color: var(--accent-green); + border-color: var(--accent-green); + background-color: rgba(0, 255, 136, 0.1); +} + +.github-link svg { + fill: currentColor; +} + +@media (max-width: 768px) { + .navbar-container { + padding: 1rem; + } + + .navbar-brand { + font-size: 1.2rem; + } + + .navbar-links { + gap: 0.5rem; + } + + .nav-link { + padding: 0.4rem 0.8rem; + font-size: 0.9rem; + } +} diff --git a/UI/frontend/src/components/Navbar.jsx b/UI/frontend/src/components/Navbar.jsx new file mode 100644 index 0000000..82df1f5 --- /dev/null +++ b/UI/frontend/src/components/Navbar.jsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import './Navbar.css'; + +const Navbar = () => { + return ( + + ); +} + +export default Navbar; \ No newline at end of file diff --git a/intro-to-binary-exploitation/Intro.MD b/UI/frontend/src/content/MD_Content_ethical-hacking/Binary-Exploitation.MD similarity index 93% rename from intro-to-binary-exploitation/Intro.MD rename to UI/frontend/src/content/MD_Content_ethical-hacking/Binary-Exploitation.MD index 7e98d92..35b01c9 100644 --- a/intro-to-binary-exploitation/Intro.MD +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/Binary-Exploitation.MD @@ -1,3 +1,12 @@ +--- +title: "Introduction to Buffer Overflow" +slug: "binary-exploitation" +order: 12 +category: "ethical-hacking" +prev: "lesson-phising-toolkit" +next: "port-scanning" +--- + # Introduction to Buffer Overflow: The Dangerous `gets()` Function --- @@ -157,3 +166,10 @@ p.interactive() ``` This PoC illustrates why `gets()` is banned in secure coding—always use `fgets()` instead for bounds-checked input. + +--- + +### Path + +<- [Previous Lesson: Phishing Toolkits](./lesson-phising-toolkit.md) +->[Next Lession: IP & Port Scanning](./python-for-eth-hacking/A-guide-to-port-scanning.md) diff --git a/ethical-hacking/ids-probe-lesson.md b/UI/frontend/src/content/MD_Content_ethical-hacking/ids-probe-lesson.md similarity index 98% rename from ethical-hacking/ids-probe-lesson.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/ids-probe-lesson.md index d515e4b..ad3314c 100644 --- a/ethical-hacking/ids-probe-lesson.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/ids-probe-lesson.md @@ -1,3 +1,12 @@ +--- +title: "IDS Probe — Lesson & How-To" +slug: "ids-probe-lesson" +order: 15 +category: "python-for-ethical-hacking" +prev: "mac-address-changer" +next: null +--- + # IDS Probe — Lesson & How-To diff --git a/ethical-hacking/image.png b/UI/frontend/src/content/MD_Content_ethical-hacking/image.png similarity index 100% rename from ethical-hacking/image.png rename to UI/frontend/src/content/MD_Content_ethical-hacking/image.png diff --git a/ethical-hacking/lesson-01.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-01.md similarity index 98% rename from ethical-hacking/lesson-01.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-01.md index 001edd3..b213ab9 100644 --- a/ethical-hacking/lesson-01.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-01.md @@ -1,3 +1,12 @@ +--- +title: "Getting Started with Ethical Hacking" +slug: "lesson-01" +order: 1 +category: "ethical-hacking" +prev: null +next: "lesson-02" +--- + # Getting Started with Ethical Hacking ![](../imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif) @@ -395,7 +404,6 @@ RSA is strong in theory, but weak in practice if misused: --- +### Path -## Path - -[Next Lesson: Network Hacking: Pre-Connection Attacks](./lesson-02.md) \ No newline at end of file +[Next Lesson: Network Hacking - Pre Connection Attacks](./lesson-02.md) -> \ No newline at end of file diff --git a/ethical-hacking/lesson-02.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-02.md similarity index 99% rename from ethical-hacking/lesson-02.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-02.md index 0c6a75e..382112b 100644 --- a/ethical-hacking/lesson-02.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-02.md @@ -1,3 +1,12 @@ +--- +title: "Network Hacking - Pre Connection Attacks" +slug: "lesson-02" +order: 2 +category: "ethical-hacking" +prev: "lesson-01" +next: "lesson-03" +--- + # Network Hacking - Pre Connection Attacks diff --git a/ethical-hacking/lesson-03.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-03.md similarity index 98% rename from ethical-hacking/lesson-03.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-03.md index cacc536..e255881 100644 --- a/ethical-hacking/lesson-03.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-03.md @@ -1,3 +1,12 @@ +--- +title: "Network Hacking - Gaining Access WEP Cracking" +slug: "lesson-03" +order: 3 +category: "ethical-hacking" +prev: "lesson-02" +next: "lesson-04" +--- + # Network Hacking - Gaining Access WEP Cracking diff --git a/ethical-hacking/lesson-04.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-04.md similarity index 99% rename from ethical-hacking/lesson-04.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-04.md index 8329d7a..39afac6 100644 --- a/ethical-hacking/lesson-04.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-04.md @@ -1,3 +1,12 @@ +--- +title: "Network Hacking - Gaining Access - WPA/WPA2 Cracking" +slug: "lesson-04" +order: 4 +category: "ethical-hacking" +prev: "lesson-03" +next: "lesson-05" +--- + # Network Hacking - Gaining Access - WPA/WPA2 Cracking ![](../imgs/06f21a161921919.63cd7887d0a70.gif) diff --git a/ethical-hacking/lesson-05.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-05.md similarity index 97% rename from ethical-hacking/lesson-05.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-05.md index 6a88981..9bf35d5 100644 --- a/ethical-hacking/lesson-05.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-05.md @@ -1,3 +1,12 @@ +--- +title: "Network Hacking Post Connection Attacks - Information Gathering" +slug: "lesson-05" +order: 5 +category: "ethical-hacking" +prev: "lesson-04" +next: "lesson-06" +--- + # Network Hacking Post Connection Attacks - Information Gathering ![](../imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif) diff --git a/ethical-hacking/lesson-06.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-06.md similarity index 97% rename from ethical-hacking/lesson-06.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-06.md index d0f1903..e6c51db 100644 --- a/ethical-hacking/lesson-06.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-06.md @@ -1,3 +1,12 @@ +--- +title: "Network Hacking Post Connection Attacks - MITM Attacks" +slug: "lesson-06" +order: 6 +category: "ethical-hacking" +prev: "lesson-05" +next: "lesson-cyberchef" +--- + # Network Hacking Post Connection Attacks - MITM Attacks - [Network Hacking Post Connection Attacks - MITM Attacks](#network-hacking-post-connection-attacks---mitm-attacks) @@ -283,3 +292,9 @@ The same can be performed using our automated script as well which is at the spe ![](../imgs/Screenshot%20(13).png) - In this way we can spy on the network devices using bettercap. We can see all the HTTP requests and responses in real-time, including the username and password for HTTP websites. + +--- + +### Path + +<- [Previous Lesson: Network Hacking Post Connection Attacks - Information Gathering](./lesson-05.md) | [Next Lesson: CyberChef – The Cyber Swiss Army Knife](./lesson-cyberchef.md) -> diff --git a/ethical-hacking/lesson-cyberchef.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-cyberchef.md similarity index 88% rename from ethical-hacking/lesson-cyberchef.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-cyberchef.md index 3c9d2e3..84cf23e 100644 --- a/ethical-hacking/lesson-cyberchef.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-cyberchef.md @@ -1,3 +1,12 @@ +--- +title: "CyberChef – The Cyber Swiss Army Knife" +slug: "lesson-cyberchef" +order: 7 +category: "ethical-hacking" +prev: "lesson-06" +next: "lesson-fing" +--- + # CyberChef – The Cyber Swiss Army Knife 🛠️ ## 📌 What is CyberChef? @@ -85,4 +94,12 @@ Explore [CyberChef Official Website](https://gchq.github.io/CyberChef/) and enjo * CyberChef is an all-in-one tool for data processing, cryptography, and encoding. * You can combine multiple steps (recipes) to solve complex problems. -* It is an essential tool for students, security professionals, and CTF players. \ No newline at end of file +* It is an essential tool for students, security professionals, and CTF players. + +--- + +### Path + +<- [Previous Lesson: Network Hacking Post Connection Attacks - MITM Attacks](./lesson-06.md) | [Next Lesson: Introduction to Network Scanning with Fing](./lesson-fing.md) -> + + diff --git a/ethical-hacking/lesson-fing.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-fing.md similarity index 93% rename from ethical-hacking/lesson-fing.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-fing.md index 8e27c33..2ed346e 100644 --- a/ethical-hacking/lesson-fing.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-fing.md @@ -1,3 +1,12 @@ +--- +title: "Introduction to Network Scanning with Fing" +slug: "lesson-fing" +order: 8 +category: "ethical-hacking" +prev: "lesson-cyberchef" +next: "lesson-password_attack-and_hashcracking" +--- + # Lesson: Introduction to Network Scanning with Fing Welcome, future ethical hackers! The very first step in any security assessment is **reconnaissance**. Before you can test a system's defenses, you must first understand what you're up against. What devices are on the network? What services are they running? This initial mapping phase is critical, and today, we're learning about one of the most user-friendly tools for the job: **Fing**. @@ -111,4 +120,10 @@ To continue your learning, check out the official documentation. The CLI (Comman * [Fing Official Website](https://www.fing.com/) * [Fing App Features](https://www.fing.com/products/fing-app) -* [Fing CLI User Guide (PDF)](https://www.fing.com/images/uploads/fing-cli-user-guide.pdf) \ No newline at end of file +* [Fing CLI User Guide (PDF)](https://www.fing.com/images/uploads/fing-cli-user-guide.pdf) + +--- + +### Path + +<- [Previous Lesson: CyberChef – The Cyber Swiss Army Knife](./lesson-cyberchef.md) | [Next Lesson: Password Attacks & Hash Cracking](./lesson-password_attack-and_hashcracking.md) -> \ No newline at end of file diff --git a/ethical-hacking/lesson-password_attack-and_hashcracking.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-password_attack-and_hashcracking.md similarity index 94% rename from ethical-hacking/lesson-password_attack-and_hashcracking.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-password_attack-and_hashcracking.md index 2cb466a..6299f7b 100644 --- a/ethical-hacking/lesson-password_attack-and_hashcracking.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-password_attack-and_hashcracking.md @@ -1,3 +1,12 @@ +--- +title: "Password Attacks & Hash Cracking" +slug: "lesson-password_attack-and_hashcracking" +order: 9 +category: "ethical-hacking" +prev: "lesson-fing" +next: "lesson-passwordcracking" +--- + # Lesson 07 — Password Attacks & Hash Cracking (Hashcat & John) ## Overview @@ -138,4 +147,8 @@ --- +### Path + +<- [Previous Lesson: Introduction to Network Scanning with Fing](./lesson-fing.md) | [Next Lesson: Password Cracking](./lesson-passwordcracking.md) -> + Updated: 2025-10-07 diff --git a/ethical-hacking/lesson-passwordcracking.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-passwordcracking.md similarity index 94% rename from ethical-hacking/lesson-passwordcracking.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-passwordcracking.md index e2cd8a3..1e785d6 100644 --- a/ethical-hacking/lesson-passwordcracking.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-passwordcracking.md @@ -1,3 +1,12 @@ +--- +title: "Password Cracking" +slug: "lesson-passwordcracking" +order: 10 +category: "ethical-hacking" +prev: "lesson-password_attack-and_hashcracking" +next: "lesson-phising-toolkit" +--- + # Password Cracking 🔐 ## 🔐 Password Cracking with John the Ripper @@ -166,3 +175,7 @@ cat Done.txt - It supports both hex-charset and hex-salt files. --- + +### Path + +<- [Previous Lesson: Password Attacks & Hash Cracking](./lesson-password_attack-and_hashcracking.md) | [Next Lesson: Phishing Toolkits](./lesson-phising-toolkit.md) -> diff --git a/ethical-hacking/lesson-phising-toolkit.md b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-phising-toolkit.md similarity index 96% rename from ethical-hacking/lesson-phising-toolkit.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/lesson-phising-toolkit.md index 60869d0..24de3c0 100644 --- a/ethical-hacking/lesson-phising-toolkit.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/lesson-phising-toolkit.md @@ -1,3 +1,12 @@ +--- +title: "Phishing Toolkits" +slug: "lesson-phising-toolkit" +order: 11 +category: "ethical-hacking" +prev: "lesson-passwordcracking" +next: "binary-exploitation" +--- + # Phishing Toolkits: A Deep Dive for Ethical Hacking and Defense - [Phishing Toolkits: A Deep Dive for Ethical Hacking and Defense](#phishing-toolkits-a-deep-dive-for-ethical-hacking-and-defense) @@ -136,4 +145,10 @@ A robust defense against phishing requires both technology and vigilant users. * **Advanced Email Filtering:** Deploy an email security gateway that uses sandboxing to analyze attachments and URL rewriting to scan links in real-time when they are clicked. * **Security Awareness Training:** Conduct regular, engaging training sessions and run simulated phishing campaigns. Foster a culture where employees feel comfortable reporting suspicious emails without fear of blame. * **Implement DMARC, DKIM, and SPF:** These email authentication standards are critical for preventing attackers from spoofing your company's domain, making it much harder for them to impersonate your employees or brand. - * **Web Filtering and DNS Protection:** Use services that block access to known malicious domains at the network level, preventing employees from ever reaching a phishing page. \ No newline at end of file + * **Web Filtering and DNS Protection:** Use services that block access to known malicious domains at the network level, preventing employees from ever reaching a phishing page. + +--- + +### Path + +<- [Previous Lesson: Password Cracking](./lesson-passwordcracking.md) | [Next Lesson: Introduction to Binary Exploitation](./Binary-Exploitation.MD) -> \ No newline at end of file diff --git a/python-for-eth-hacking/A-guide-to-post-scanning.md b/UI/frontend/src/content/MD_Content_ethical-hacking/python-for-eth-hacking/A-guide-to-port-scanning.md similarity index 94% rename from python-for-eth-hacking/A-guide-to-post-scanning.md rename to UI/frontend/src/content/MD_Content_ethical-hacking/python-for-eth-hacking/A-guide-to-port-scanning.md index bef1697..8c354f1 100644 --- a/python-for-eth-hacking/A-guide-to-post-scanning.md +++ b/UI/frontend/src/content/MD_Content_ethical-hacking/python-for-eth-hacking/A-guide-to-port-scanning.md @@ -1,3 +1,12 @@ +--- +title: "IP & Port Scanning" +slug: "port-scanning" +order: 13 +category: "python-for-ethical-hacking" +prev: "binary-exploitation" +next: "mac-address-changer" +--- + # IP & Port Scanning @@ -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 ![What is a MAC Address](./../imgs/What-is-MAC-Address.jpeg) @@ -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( diff --git a/UI/frontend/src/pages/LessonPage.css b/UI/frontend/src/pages/LessonPage.css new file mode 100644 index 0000000..65a1b10 --- /dev/null +++ b/UI/frontend/src/pages/LessonPage.css @@ -0,0 +1,75 @@ +.page-content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + min-height: 100vh; + width: 100%; + overflow-x: hidden; + background-color: var(--bg-primary); +} + +@media (max-width: 768px) { + .page-content { + padding: 0.5rem; + } +} + +nav.home-button { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.5rem 3rem; + background: var(--bg-secondary); + border-bottom: 1px solid var(--border-color); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.home-title-link { + text-decoration: none; + color:aqua; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.home-title { + color: var(--accent-green); + font-size: 2rem; + font-weight: 800; + margin: 0; + letter-spacing: -0.5px; + transition: color 0.2s; + background: linear-gradient(135deg, var(--accent-green) 0%, var(--accent-green-light) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.home-title-link:hover .home-title { + background:rgb(255, 255, 255); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +nav.home-button a { + color: var(--text-primary); + font-size: 1rem; + text-decoration: none; + margin-left: 2rem; + padding: 0.6rem 1.4rem; + border-radius: 6px; + background: transparent; + border: 1px solid var(--accent-green); + transition: all 0.2s; + font-weight: 600; +} + +nav.home-button a:hover { + background: var(--accent-green); + color: #0a0e1a; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3); +} \ No newline at end of file diff --git a/UI/frontend/src/pages/LessonPage.jsx b/UI/frontend/src/pages/LessonPage.jsx new file mode 100644 index 0000000..e1b26c1 --- /dev/null +++ b/UI/frontend/src/pages/LessonPage.jsx @@ -0,0 +1,48 @@ +import React, { useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; +import { getLessonBySlug, getNavigation } from '../utils/markdownloader'; +import LessonTemplate from '../components/LessonTemplate'; +import Navbar from '../components/Navbar'; +import './LessonPage.css'; + +export default function LessonPage() { + const { slug } = useParams(); + const [lesson, setLesson] = useState(null); + const [navigation, setNavigation] = useState({ prev: null, next: null }); + const [loading, setLoading] = useState(true); + + useEffect(() => { + window.scrollTo(0, 0); + setLoading(true); + try { + const currentLesson = getLessonBySlug(slug); + setLesson(currentLesson); + if (currentLesson) { + setNavigation(getNavigation(slug)); + } + } catch (error) { + console.error('Error loading lesson:', error); + setLesson(null); + } finally { + setLoading(false); + } + }, [slug]); + + if (loading) { + return ( +
+ +
+ Loading lesson... +
+
+ ); + } + + return ( +
+ + +
+ ); +} diff --git a/UI/frontend/src/utils/markdownloader.js b/UI/frontend/src/utils/markdownloader.js new file mode 100644 index 0000000..9bc9640 --- /dev/null +++ b/UI/frontend/src/utils/markdownloader.js @@ -0,0 +1,105 @@ +import matter from 'gray-matter'; + +// Import all .md files from the MD_Content_ethical-hacking folder and its subfolders +// Using Vite's import.meta.glob for dynamic imports +const mdFiles = import.meta.glob('/src/content/MD_Content_ethical-hacking/**/*.md', { + query: '?raw', + import: 'default', + eager: true +}); + +// Debug: Log what files were found +console.log('📁 Markdown files found:', Object.keys(mdFiles)); +console.log('📊 Total files:', Object.keys(mdFiles).length); + +/** + * Get all lessons from markdown files + * @returns {Array} Array of lesson objects with frontmatter and content + */ +export function getAllLessons() { + const lessons = []; + + console.log('🔍 Starting to process lessons...'); + + Object.entries(mdFiles).forEach(([filepath, content]) => { + try { + // Parse frontmatter and content from markdown file + const { data, content: markdownContent } = matter(content); + + console.log('✅ Parsed:', filepath, 'with slug:', data.slug); + + // Extract slug from frontmatter or filename + const slug = data.slug || filepath.split('/').pop().replace('.md', ''); + + lessons.push({ + slug, + filepath, + frontmatter: data, + content: markdownContent + }); + } catch (error) { + console.error(`Error parsing ${filepath}:`, error); + } + }); + + // Sort by order field in frontmatter + const sorted = lessons.sort((a, b) => { + const orderA = a.frontmatter.order || 999; + const orderB = b.frontmatter.order || 999; + return orderA - orderB; + }); + + console.log('📚 Total lessons loaded:', sorted.length); + console.log('📋 Lesson slugs:', sorted.map(l => l.slug)); + + return sorted; +} + +/** + * Get a single lesson by its slug + * @param {string} slug - The lesson slug + * @returns {Object|null} Lesson object or null if not found + */ +export function getLessonBySlug(slug) { + const lessons = getAllLessons(); + return lessons.find(lesson => lesson.slug === slug) || null; +} + +/** + * Get navigation (previous and next lessons) for a given lesson + * @param {string} currentSlug - The current lesson slug + * @returns {Object} Object with prev and next lesson objects + */ +export function getNavigation(currentSlug) { + const lessons = getAllLessons(); + const currentIndex = lessons.findIndex(l => l.slug === currentSlug); + + if (currentIndex === -1) { + return { prev: null, next: null }; + } + + return { + prev: currentIndex > 0 ? lessons[currentIndex - 1] : null, + next: currentIndex < lessons.length - 1 ? lessons[currentIndex + 1] : null + }; +} + +/** + * Get lessons by category + * @param {string} category - The category to filter by + * @returns {Array} Array of lessons in that category + */ +export function getLessonsByCategory(category) { + const lessons = getAllLessons(); + return lessons.filter(lesson => lesson.frontmatter.category === category); +} + +/** + * Get all unique categories + * @returns {Array} Array of unique category names + */ +export function getCategories() { + const lessons = getAllLessons(); + const categories = lessons.map(lesson => lesson.frontmatter.category); + return [...new Set(categories)].filter(Boolean); +} diff --git a/UI/frontend/vite.config.js b/UI/frontend/vite.config.js index 8b0f57b..c84e1b4 100644 --- a/UI/frontend/vite.config.js +++ b/UI/frontend/vite.config.js @@ -1,7 +1,20 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import { Buffer } from 'buffer' // https://vite.dev/config/ export default defineConfig({ plugins: [react()], + assetsInclude: ['**/*.md'], // Treat .md files as assets + define: { + global: 'globalThis', + }, + resolve: { + alias: { + buffer: 'buffer', + }, + }, + optimizeDeps: { + include: ['buffer'], + }, }) diff --git a/ethical-hacking/.DS_Store b/ethical-hacking/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/ethical-hacking/.DS_Store and /dev/null differ diff --git a/imgs/06f21a161921919.63cd7887d0a70.gif b/imgs/06f21a161921919.63cd7887d0a70.gif deleted file mode 100644 index 453a1d9..0000000 Binary files a/imgs/06f21a161921919.63cd7887d0a70.gif and /dev/null differ diff --git a/imgs/13062024-man-in-the-middle-attack-image-terrabytegroup.com_-scaled.jpg b/imgs/13062024-man-in-the-middle-attack-image-terrabytegroup.com_-scaled.jpg deleted file mode 100644 index c473389..0000000 Binary files a/imgs/13062024-man-in-the-middle-attack-image-terrabytegroup.com_-scaled.jpg and /dev/null differ diff --git a/imgs/212747903-e9bdf048-2dc8-41f9-b973-0e72ff07bfba.gif b/imgs/212747903-e9bdf048-2dc8-41f9-b973-0e72ff07bfba.gif deleted file mode 100644 index a86a69f..0000000 Binary files a/imgs/212747903-e9bdf048-2dc8-41f9-b973-0e72ff07bfba.gif and /dev/null differ diff --git a/imgs/212748830-4c709398-a386-4761-84d7-9e10b98fbe6e.gif b/imgs/212748830-4c709398-a386-4761-84d7-9e10b98fbe6e.gif deleted file mode 100644 index 714bc87..0000000 Binary files a/imgs/212748830-4c709398-a386-4761-84d7-9e10b98fbe6e.gif and /dev/null differ diff --git a/imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif b/imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif deleted file mode 100644 index b0cc617..0000000 Binary files a/imgs/212749447-bfb7e725-6987-49d9-ae85-2015e3e7cc41.gif and /dev/null differ diff --git a/imgs/212749726-d36b8253-74bb-4509-870d-e29ed3b8ff4a.gif b/imgs/212749726-d36b8253-74bb-4509-870d-e29ed3b8ff4a.gif deleted file mode 100644 index decbd5d..0000000 Binary files a/imgs/212749726-d36b8253-74bb-4509-870d-e29ed3b8ff4a.gif and /dev/null differ diff --git a/imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif b/imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif deleted file mode 100644 index 9ce488f..0000000 Binary files a/imgs/212750155-3ceddfbd-19d3-40a3-87af-8d329c8323c4.gif and /dev/null differ diff --git a/imgs/212750996-938b257b-266c-45a7-9af7-655341c0f58b.gif b/imgs/212750996-938b257b-266c-45a7-9af7-655341c0f58b.gif deleted file mode 100644 index b4211af..0000000 Binary files a/imgs/212750996-938b257b-266c-45a7-9af7-655341c0f58b.gif and /dev/null differ diff --git a/imgs/213910845-af37a709-8995-40d6-be59-724526e3c3d7.gif b/imgs/213910845-af37a709-8995-40d6-be59-724526e3c3d7.gif deleted file mode 100644 index 4d9d69f..0000000 Binary files a/imgs/213910845-af37a709-8995-40d6-be59-724526e3c3d7.gif and /dev/null differ diff --git a/imgs/216649426-0c2ee152-84d8-4707-85c4-27a378d2f78a.gif b/imgs/216649426-0c2ee152-84d8-4707-85c4-27a378d2f78a.gif deleted file mode 100644 index 849eeca..0000000 Binary files a/imgs/216649426-0c2ee152-84d8-4707-85c4-27a378d2f78a.gif and /dev/null differ diff --git a/imgs/216649450-e63af5d5-a769-4e9f-8bd1-c2b9005dc53c.gif b/imgs/216649450-e63af5d5-a769-4e9f-8bd1-c2b9005dc53c.gif deleted file mode 100644 index f7a364c..0000000 Binary files a/imgs/216649450-e63af5d5-a769-4e9f-8bd1-c2b9005dc53c.gif and /dev/null differ diff --git a/imgs/216653728-5f452bd4-f1b8-401e-a337-f6fbae9d493a.gif b/imgs/216653728-5f452bd4-f1b8-401e-a337-f6fbae9d493a.gif deleted file mode 100644 index eb936b9..0000000 Binary files a/imgs/216653728-5f452bd4-f1b8-401e-a337-f6fbae9d493a.gif and /dev/null differ diff --git a/imgs/216655813-c9147cb2-cfee-4955-b591-52cac08f1f60.gif b/imgs/216655813-c9147cb2-cfee-4955-b591-52cac08f1f60.gif deleted file mode 100644 index 1767b66..0000000 Binary files a/imgs/216655813-c9147cb2-cfee-4955-b591-52cac08f1f60.gif and /dev/null differ diff --git a/imgs/216655818-2e7b9a31-49bf-4744-85a8-db8a2577c45c.gif b/imgs/216655818-2e7b9a31-49bf-4744-85a8-db8a2577c45c.gif deleted file mode 100644 index be5a91e..0000000 Binary files a/imgs/216655818-2e7b9a31-49bf-4744-85a8-db8a2577c45c.gif and /dev/null differ diff --git a/imgs/216655846-93807a43-d6e8-448a-bf19-799b5e8c1c0a.gif b/imgs/216655846-93807a43-d6e8-448a-bf19-799b5e8c1c0a.gif deleted file mode 100644 index 6cdc87f..0000000 Binary files a/imgs/216655846-93807a43-d6e8-448a-bf19-799b5e8c1c0a.gif and /dev/null differ diff --git a/imgs/216655848-cf4d7bed-52aa-4740-8c67-1832472051ec.gif b/imgs/216655848-cf4d7bed-52aa-4740-8c67-1832472051ec.gif deleted file mode 100644 index 3522afd..0000000 Binary files a/imgs/216655848-cf4d7bed-52aa-4740-8c67-1832472051ec.gif and /dev/null differ diff --git a/imgs/216655853-3acb8c9c-42bd-4d0c-aaa6-27b409361578.gif b/imgs/216655853-3acb8c9c-42bd-4d0c-aaa6-27b409361578.gif deleted file mode 100644 index 6e7bf0a..0000000 Binary files a/imgs/216655853-3acb8c9c-42bd-4d0c-aaa6-27b409361578.gif and /dev/null differ diff --git a/imgs/216655855-e00c1861-e964-4b4f-90ae-2592cad7b272.gif b/imgs/216655855-e00c1861-e964-4b4f-90ae-2592cad7b272.gif deleted file mode 100644 index dff5981..0000000 Binary files a/imgs/216655855-e00c1861-e964-4b4f-90ae-2592cad7b272.gif and /dev/null differ diff --git a/imgs/216655859-f66df97b-6767-4ab2-b6f4-a9cba3ff3591.gif b/imgs/216655859-f66df97b-6767-4ab2-b6f4-a9cba3ff3591.gif deleted file mode 100644 index 28ee475..0000000 Binary files a/imgs/216655859-f66df97b-6767-4ab2-b6f4-a9cba3ff3591.gif and /dev/null differ diff --git a/imgs/216656977-ef584e23-480a-4d1c-8c3f-7d045910ddc9.gif b/imgs/216656977-ef584e23-480a-4d1c-8c3f-7d045910ddc9.gif deleted file mode 100644 index 16674a1..0000000 Binary files a/imgs/216656977-ef584e23-480a-4d1c-8c3f-7d045910ddc9.gif and /dev/null differ diff --git a/imgs/216656982-82fce1e6-72ff-48aa-bbcd-5270671adeaa.gif b/imgs/216656982-82fce1e6-72ff-48aa-bbcd-5270671adeaa.gif deleted file mode 100644 index 3a242c2..0000000 Binary files a/imgs/216656982-82fce1e6-72ff-48aa-bbcd-5270671adeaa.gif and /dev/null differ diff --git a/imgs/216656986-e4424d73-56dd-4e0d-96ac-66f9f2c3be42.gif b/imgs/216656986-e4424d73-56dd-4e0d-96ac-66f9f2c3be42.gif deleted file mode 100644 index f22015a..0000000 Binary files a/imgs/216656986-e4424d73-56dd-4e0d-96ac-66f9f2c3be42.gif and /dev/null differ diff --git a/imgs/216656987-9b3a52af-79d3-418c-8789-579955588e68.gif b/imgs/216656987-9b3a52af-79d3-418c-8789-579955588e68.gif deleted file mode 100644 index b7343eb..0000000 Binary files a/imgs/216656987-9b3a52af-79d3-418c-8789-579955588e68.gif and /dev/null differ diff --git a/imgs/216658115-017b0125-1bba-409d-b789-c04362c0adfb.gif b/imgs/216658115-017b0125-1bba-409d-b789-c04362c0adfb.gif deleted file mode 100644 index c05af58..0000000 Binary files a/imgs/216658115-017b0125-1bba-409d-b789-c04362c0adfb.gif and /dev/null differ diff --git a/imgs/219923809-b86dc415-a0c2-4a38-bc88-ad6cf06395a8.gif b/imgs/219923809-b86dc415-a0c2-4a38-bc88-ad6cf06395a8.gif deleted file mode 100644 index 7d39be4..0000000 Binary files a/imgs/219923809-b86dc415-a0c2-4a38-bc88-ad6cf06395a8.gif and /dev/null differ diff --git a/imgs/225813708-98b745f2-7d22-48cf-9150-083f1b00d6c9.gif b/imgs/225813708-98b745f2-7d22-48cf-9150-083f1b00d6c9.gif deleted file mode 100644 index 67b62ca..0000000 Binary files a/imgs/225813708-98b745f2-7d22-48cf-9150-083f1b00d6c9.gif and /dev/null differ diff --git a/imgs/226127923-0e8b7792-7b3c-462b-951b-63c96ba1a5af.gif b/imgs/226127923-0e8b7792-7b3c-462b-951b-63c96ba1a5af.gif deleted file mode 100644 index 212711f..0000000 Binary files a/imgs/226127923-0e8b7792-7b3c-462b-951b-63c96ba1a5af.gif and /dev/null differ diff --git a/imgs/226127927-3feb953e-cc01-482e-b732-311b2907991f.gif b/imgs/226127927-3feb953e-cc01-482e-b732-311b2907991f.gif deleted file mode 100644 index 920be20..0000000 Binary files a/imgs/226127927-3feb953e-cc01-482e-b732-311b2907991f.gif and /dev/null differ diff --git a/imgs/227779362-cacda485-cab4-4e28-8a27-a4d2a918a7ac.gif b/imgs/227779362-cacda485-cab4-4e28-8a27-a4d2a918a7ac.gif deleted file mode 100644 index 2b7ebbb..0000000 Binary files a/imgs/227779362-cacda485-cab4-4e28-8a27-a4d2a918a7ac.gif and /dev/null differ diff --git a/imgs/238200842-406eb3e6-caba-401d-93c8-e0a7941c84b9.gif b/imgs/238200842-406eb3e6-caba-401d-93c8-e0a7941c84b9.gif deleted file mode 100644 index a84e946..0000000 Binary files a/imgs/238200842-406eb3e6-caba-401d-93c8-e0a7941c84b9.gif and /dev/null differ diff --git a/imgs/238353467-897cd757-ea1f-492d-aaf9-6d1674177e08.gif b/imgs/238353467-897cd757-ea1f-492d-aaf9-6d1674177e08.gif deleted file mode 100644 index 09976c1..0000000 Binary files a/imgs/238353467-897cd757-ea1f-492d-aaf9-6d1674177e08.gif and /dev/null differ diff --git a/imgs/238353480-219bcc70-f5dc-466b-9a60-29653d8e8433.gif b/imgs/238353480-219bcc70-f5dc-466b-9a60-29653d8e8433.gif deleted file mode 100644 index 2c92dcb..0000000 Binary files a/imgs/238353480-219bcc70-f5dc-466b-9a60-29653d8e8433.gif and /dev/null differ diff --git a/imgs/238355349-7d484dc9-68a9-4ee6-a767-aea59035c12d.gif b/imgs/238355349-7d484dc9-68a9-4ee6-a767-aea59035c12d.gif deleted file mode 100644 index e69de29..0000000 diff --git a/imgs/240304586-d48893bd-0757-481c-8d7e-ba3e163feae7.png b/imgs/240304586-d48893bd-0757-481c-8d7e-ba3e163feae7.png deleted file mode 100644 index e69de29..0000000 diff --git a/imgs/240307504-366d67af-a5ad-4c0a-bf14-1bebfed20a3a.gif b/imgs/240307504-366d67af-a5ad-4c0a-bf14-1bebfed20a3a.gif deleted file mode 100644 index cb225b6..0000000 Binary files a/imgs/240307504-366d67af-a5ad-4c0a-bf14-1bebfed20a3a.gif and /dev/null differ diff --git a/imgs/240308118-6f28d73e-0d7e-4a6c-8ddf-bb24b69a71c0.gif b/imgs/240308118-6f28d73e-0d7e-4a6c-8ddf-bb24b69a71c0.gif deleted file mode 100644 index e79c1ed..0000000 Binary files a/imgs/240308118-6f28d73e-0d7e-4a6c-8ddf-bb24b69a71c0.gif and /dev/null differ diff --git a/imgs/240815068-993370af-11f4-48e7-9e0d-e5b79c2e7890.gif b/imgs/240815068-993370af-11f4-48e7-9e0d-e5b79c2e7890.gif deleted file mode 100644 index ccf6261..0000000 Binary files a/imgs/240815068-993370af-11f4-48e7-9e0d-e5b79c2e7890.gif and /dev/null differ diff --git a/imgs/241763891-7bb1e704-6026-48f9-8435-2f4d40101348.gif b/imgs/241763891-7bb1e704-6026-48f9-8435-2f4d40101348.gif deleted file mode 100644 index 616e9a3..0000000 Binary files a/imgs/241763891-7bb1e704-6026-48f9-8435-2f4d40101348.gif and /dev/null differ diff --git a/imgs/242390524-0c7eb6ed-663b-4ce4-bfbd-18239a38ba1b.gif b/imgs/242390524-0c7eb6ed-663b-4ce4-bfbd-18239a38ba1b.gif deleted file mode 100644 index 1847359..0000000 Binary files a/imgs/242390524-0c7eb6ed-663b-4ce4-bfbd-18239a38ba1b.gif and /dev/null differ diff --git a/imgs/242390692-0b335028-1d3d-4ee5-b5b3-a373d499be7e.gif b/imgs/242390692-0b335028-1d3d-4ee5-b5b3-a373d499be7e.gif deleted file mode 100644 index 95e0e32..0000000 Binary files a/imgs/242390692-0b335028-1d3d-4ee5-b5b3-a373d499be7e.gif and /dev/null differ diff --git a/imgs/250967618-de30015f-dc5f-4ecf-a49b-ccd2b89776e4.gif b/imgs/250967618-de30015f-dc5f-4ecf-a49b-ccd2b89776e4.gif deleted file mode 100644 index cb29639..0000000 Binary files a/imgs/250967618-de30015f-dc5f-4ecf-a49b-ccd2b89776e4.gif and /dev/null differ diff --git a/imgs/362d5c55859146c0c7debfca296ad321.gif b/imgs/362d5c55859146c0c7debfca296ad321.gif deleted file mode 100644 index 8cc8d37..0000000 Binary files a/imgs/362d5c55859146c0c7debfca296ad321.gif and /dev/null differ diff --git "a/imgs/Movie on 27-07-25 at 9.36\342\200\257PM.mov" "b/imgs/Movie on 27-07-25 at 9.36\342\200\257PM.mov" deleted file mode 100644 index 157a3ff..0000000 Binary files "a/imgs/Movie on 27-07-25 at 9.36\342\200\257PM.mov" and /dev/null differ diff --git a/imgs/Screenshot (10).png b/imgs/Screenshot (10).png deleted file mode 100644 index 59a4b48..0000000 Binary files a/imgs/Screenshot (10).png and /dev/null differ diff --git a/imgs/Screenshot (11).png b/imgs/Screenshot (11).png deleted file mode 100644 index 27b023f..0000000 Binary files a/imgs/Screenshot (11).png and /dev/null differ diff --git a/imgs/Screenshot (12).png b/imgs/Screenshot (12).png deleted file mode 100644 index 661081a..0000000 Binary files a/imgs/Screenshot (12).png and /dev/null differ diff --git a/imgs/Screenshot (13).png b/imgs/Screenshot (13).png deleted file mode 100644 index 9b2ef4f..0000000 Binary files a/imgs/Screenshot (13).png and /dev/null differ diff --git a/imgs/Screenshot (14).png b/imgs/Screenshot (14).png deleted file mode 100644 index 0f4f6d8..0000000 Binary files a/imgs/Screenshot (14).png and /dev/null differ diff --git a/imgs/Screenshot (6).png b/imgs/Screenshot (6).png deleted file mode 100644 index a5cf1be..0000000 Binary files a/imgs/Screenshot (6).png and /dev/null differ diff --git a/imgs/Screenshot (7).png b/imgs/Screenshot (7).png deleted file mode 100644 index 2fcc184..0000000 Binary files a/imgs/Screenshot (7).png and /dev/null differ diff --git a/imgs/Screenshot (8).png b/imgs/Screenshot (8).png deleted file mode 100644 index c4d2771..0000000 Binary files a/imgs/Screenshot (8).png and /dev/null differ diff --git a/imgs/Screenshot (9).png b/imgs/Screenshot (9).png deleted file mode 100644 index e6f298c..0000000 Binary files a/imgs/Screenshot (9).png and /dev/null differ diff --git "a/imgs/Screenshot 2025-07-21 at 11.11.34\342\200\257AM.png" "b/imgs/Screenshot 2025-07-21 at 11.11.34\342\200\257AM.png" deleted file mode 100644 index 10186d3..0000000 Binary files "a/imgs/Screenshot 2025-07-21 at 11.11.34\342\200\257AM.png" and /dev/null differ diff --git "a/imgs/Screenshot 2025-07-24 at 4.58.09\342\200\257AM.png" "b/imgs/Screenshot 2025-07-24 at 4.58.09\342\200\257AM.png" deleted file mode 100644 index ceb1f1c..0000000 Binary files "a/imgs/Screenshot 2025-07-24 at 4.58.09\342\200\257AM.png" and /dev/null differ diff --git "a/imgs/Screenshot 2025-07-24 at 6.49.53\342\200\257AM.png" "b/imgs/Screenshot 2025-07-24 at 6.49.53\342\200\257AM.png" deleted file mode 100644 index 560a8c2..0000000 Binary files "a/imgs/Screenshot 2025-07-24 at 6.49.53\342\200\257AM.png" and /dev/null differ diff --git "a/imgs/Screenshot 2025-08-09 at 3.38.18\342\200\257PM.png" "b/imgs/Screenshot 2025-08-09 at 3.38.18\342\200\257PM.png" deleted file mode 100644 index ab0192f..0000000 Binary files "a/imgs/Screenshot 2025-08-09 at 3.38.18\342\200\257PM.png" and /dev/null differ diff --git "a/imgs/Screenshot 2025-08-09 at 3.47.22\342\200\257PM.png" "b/imgs/Screenshot 2025-08-09 at 3.47.22\342\200\257PM.png" deleted file mode 100644 index 933af2f..0000000 Binary files "a/imgs/Screenshot 2025-08-09 at 3.47.22\342\200\257PM.png" and /dev/null differ diff --git "a/imgs/Screenshot 2025-08-09 at 3.56.13\342\200\257PM.png" "b/imgs/Screenshot 2025-08-09 at 3.56.13\342\200\257PM.png" deleted file mode 100644 index 5164d8c..0000000 Binary files "a/imgs/Screenshot 2025-08-09 at 3.56.13\342\200\257PM.png" and /dev/null differ diff --git "a/imgs/Screenshot 2025-08-09 at 5.54.42\342\200\257PM.png" "b/imgs/Screenshot 2025-08-09 at 5.54.42\342\200\257PM.png" deleted file mode 100644 index 1299a16..0000000 Binary files "a/imgs/Screenshot 2025-08-09 at 5.54.42\342\200\257PM.png" and /dev/null differ diff --git a/imgs/WEP-encryption-algorithm-37.ppm.png b/imgs/WEP-encryption-algorithm-37.ppm.png deleted file mode 100644 index 8b6957a..0000000 Binary files a/imgs/WEP-encryption-algorithm-37.ppm.png and /dev/null differ diff --git a/imgs/What-is-MAC-Address.jpeg b/imgs/What-is-MAC-Address.jpeg deleted file mode 100644 index 7cdb6cd..0000000 Binary files a/imgs/What-is-MAC-Address.jpeg and /dev/null differ diff --git a/imgs/What-is-Packet-Sniffing-01.png.webp b/imgs/What-is-Packet-Sniffing-01.png.webp deleted file mode 100644 index 5c5b699..0000000 Binary files a/imgs/What-is-Packet-Sniffing-01.png.webp and /dev/null differ diff --git a/imgs/WhatsApp Image 2025-07-26 at 07.47.53.jpeg b/imgs/WhatsApp Image 2025-07-26 at 07.47.53.jpeg deleted file mode 100644 index d79089a..0000000 Binary files a/imgs/WhatsApp Image 2025-07-26 at 07.47.53.jpeg and /dev/null differ diff --git a/imgs/WhatsApp Image 2025-07-28 at 19.40.07.jpeg b/imgs/WhatsApp Image 2025-07-28 at 19.40.07.jpeg deleted file mode 100644 index 2e26965..0000000 Binary files a/imgs/WhatsApp Image 2025-07-28 at 19.40.07.jpeg and /dev/null differ diff --git a/imgs/andoroid.gif b/imgs/andoroid.gif deleted file mode 100644 index 340fd40..0000000 Binary files a/imgs/andoroid.gif and /dev/null differ diff --git a/imgs/b1b55f18288795.562c702fe9883.gif b/imgs/b1b55f18288795.562c702fe9883.gif deleted file mode 100644 index ff95c7f..0000000 Binary files a/imgs/b1b55f18288795.562c702fe9883.gif and /dev/null differ diff --git a/imgs/booting-up-developer-economy-how-tech-startups-are-helping-coders-build-and-test-software-faster.jpg.webp b/imgs/booting-up-developer-economy-how-tech-startups-are-helping-coders-build-and-test-software-faster.jpg.webp deleted file mode 100644 index 87f0b65..0000000 Binary files a/imgs/booting-up-developer-economy-how-tech-startups-are-helping-coders-build-and-test-software-faster.jpg.webp and /dev/null differ diff --git a/imgs/l1.png b/imgs/l1.png deleted file mode 100644 index 6e7bef9..0000000 Binary files a/imgs/l1.png and /dev/null differ diff --git a/imgs/l2.png b/imgs/l2.png deleted file mode 100644 index 7df73a1..0000000 Binary files a/imgs/l2.png and /dev/null differ diff --git a/imgs/l3.png b/imgs/l3.png deleted file mode 100644 index f10c7d5..0000000 Binary files a/imgs/l3.png and /dev/null differ diff --git a/imgs/l4.png b/imgs/l4.png deleted file mode 100644 index 8dc8b7d..0000000 Binary files a/imgs/l4.png and /dev/null differ diff --git a/imgs/ll1.png b/imgs/ll1.png deleted file mode 100644 index b514e40..0000000 Binary files a/imgs/ll1.png and /dev/null differ diff --git a/imgs/ll2.png b/imgs/ll2.png deleted file mode 100644 index e6b5b7a..0000000 Binary files a/imgs/ll2.png and /dev/null differ diff --git a/imgs/quick scan plus.png b/imgs/quick scan plus.png deleted file mode 100644 index a2ffde8..0000000 Binary files a/imgs/quick scan plus.png and /dev/null differ diff --git a/imgs/service_view_zenmap.png b/imgs/service_view_zenmap.png deleted file mode 100644 index 174aa7b..0000000 Binary files a/imgs/service_view_zenmap.png and /dev/null differ diff --git a/imgs/source.gif b/imgs/source.gif deleted file mode 100644 index cbdac62..0000000 Binary files a/imgs/source.gif and /dev/null differ diff --git a/imgs/vmw-virtualization-defined.jpg b/imgs/vmw-virtualization-defined.jpg deleted file mode 100644 index be6ee78..0000000 Binary files a/imgs/vmw-virtualization-defined.jpg and /dev/null differ diff --git a/imgs/weakencrpyption.png b/imgs/weakencrpyption.png deleted file mode 100644 index 365d7e9..0000000 Binary files a/imgs/weakencrpyption.png and /dev/null differ