diff --git a/.gitignore b/.gitignore index 747968848..c3c539d61 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ "cps/" node_modules/ +*.env \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 9053f7386..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,11 +0,0 @@ -# Contributing to Personalized Learning Path - -Thanks for considering contributing! Please follow these steps: - -1. Fork the repository. -2. Create your feature branch: `git checkout -b feature/your-feature-name`. -3. Commit your changes: `git commit -m "Add some feature"`. -4. Push to the branch: `git push origin feature/your-feature-name`. -5. Open a Pull Request on GitHub and describe your changes clearly. - -Please ensure your code follows existing style and you add meaningful commit messages. diff --git a/LICENSE b/LICENSE deleted file mode 100644 index ca1191330..000000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 bhavitha9052004 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..70b515342 --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# πŸŽ“ CPS Personalized Learning System Using Knowledge Graph +An AI-powered platform that delivers personalized learning paths using knowledge graphs and adaptive quizzes. + +## πŸš€ Features +- User Authentication +- Personalized Recommendations via Concept Graph +- Quiz Generation using GPT-4o (RAG) +- Mastery-based Weight Updates +- Progress Visualization + +## 🧠 How It Works +1. User selects learned and target topics. +2. System finds shortest path using the concept graph. +3. Quizzes are generated per topic using RAG. +4. Scores update mastery weights between 0.1–0.9. +5. Future recommendations adapt based on mastery. + +## πŸ›  Tech Stack +| Tech | Purpose | +|--------------|--------------------------------------| +| React + TypeScript | Frontend | +| Node.js + Express | Backend APIs | +| MongoDB | Persistent storage | +| OpenAI GPT-4o | Quiz generation using RAG | +| Zustand | Global state management | +| Tailwind CSS | UI styling | + + +## πŸ“‚ Project Structure +client/ +server/ +data/ + + +## πŸ“¦ Setup & Installation + +1. Clone the repo +2. Install dependencies +3. Setup environment variables +4. Run dev servers + {(cd client;npm run dev) +(cd server;npm run dev)---> All set!! +ensure the portno. of client to be 5173} + +## πŸ“Š Future Enhancements +- Gamification badges +- Teacher dashboard +- More granular topic-level quizzes +- Enhance recommendation engine on advanced DSA topics +- UI improvements as always + + +## πŸ™Œ Acknowledgments +- MIT OCW for scraped content +- OpenAI for GPT-4o API +-IIT Ropar for the mentor and tech supoort and a lovely team. + + + +## πŸ“ƒ License +This project is licensed under the MIT License. diff --git a/cg_visualization.py b/cg_visualization.py deleted file mode 100644 index 45d2c88d3..000000000 --- a/cg_visualization.py +++ /dev/null @@ -1,56 +0,0 @@ -from pyvis.network import Network -import networkx as nx -import json -from networkx.readwrite import json_graph - -with open("concept_graph_full.json", "r", encoding="utf-8") as f: - data = json.load(f) -G_loaded = json_graph.node_link_graph(data) - -# Created a pyvis network -net = Network( - height="800px", - width="100%", - bgcolor="#ffffff", - font_color=True, - directed=True -) - -# Converted from networkx -net.from_nx(G_loaded) -#node properties -for node in net.nodes: - node["size"] = 20 - node["color"] = "#97C2FC" - node["borderWidth"] = 2 - node["borderColor"] = "#2B7CE9" - node["font"] = {"size": 12} - -# edge properties -for edge in net.edges: - edge["color"] = "#848484" - edge["smooth"] = {"type": "continuous"} - edge["arrows"] = "to" - edge["arrows"] = {"to": {"enabled": True, "scaleFactor": 0.5}} - -# Configure dynamics -net.set_options(""" - var options = { - "physics": { - "enabled": true, - "stabilization": {"iterations": 100}, - "barnesHut": { - "gravitationalConstant": -2000, - "springConstant": 0.04, - "springLength": 95 - } - } - } -""") - -# Saved the graph -try: - net.write_html("concept_graph.html") - print("Graph has been saved as 'concept_graph.html'. Please open it in a web browser to view.") -except Exception as e: - print(f"Error saving graph: {str(e)}") diff --git a/concept-graph.py b/concept-graph.py deleted file mode 100644 index 008ccac1f..000000000 --- a/concept-graph.py +++ /dev/null @@ -1,64 +0,0 @@ -import networkx as nx -import matplotlib.pyplot as plt -import json -from networkx.readwrite import json_graph -concept_map = { - "What is computation?": ["Computation", "Algorithms", "Problem Solving"], - "Branching and Iteration": ["Conditionals", "Loops", "Control Flow"], - "String Manipulation, Guess and Check, Approximations, Bisection": [ - "String Manipulation", "Guess and Check", "Approximation", "Bisection Search" - ], - "Decomposition, Abstractions, Functions": ["Decomposition", "Abstraction", "Functions"], - "Tuples, Lists, Aliasing, Mutability, Cloning": [ - "Tuples", "Lists", "Aliasing", "Mutability", "Cloning" - ], - "Recursion, Dictionaries": ["Recursion", "Dictionaries"], - "Testing, Debugging, Exceptions, Assertions": [ - "Testing", "Debugging", "Exceptions", "Assertions" - ], - "Object Oriented Programming": ["Classes", "OOP", "Encapsulation"], - "Python Classes and Inheritance": ["Inheritance", "Subclasses", "Class Hierarchies"], - "Understanding Program Efficiency, Part 1": ["Big-O Notation", "Efficiency"], - "Understanding Program Efficiency, Part 2": ["Efficiency", "Space Complexity"], - "Searching and Sorting": ["Search Algorithms", "Sorting Algorithms"], -} - -G = nx.DiGraph() - -# Converted concept_map to a list of concept lists in lecture order -concept_lists = list(concept_map.values()) - -# graph -for i, concepts in enumerate(concept_lists): - # Connected all concepts within the same lecture in sequence - for j in range(len(concepts) - 1): - G.add_edge(concepts[j], concepts[j + 1]) - - # Connected last concept of this lecture to all concepts in the next lecture - if i < len(concept_lists) - 1: - last_concept = concepts[-1] - next_concepts = concept_lists[i + 1] - for next_concept in next_concepts: - G.add_edge(last_concept, next_concept) - - -data = json_graph.node_link_data(G) - -# Saved to json file -with open("concept_graph_full.json", "w", encoding="utf-8") as f: - json.dump(data, f, indent=4) - -print("Full graph saved to concept_graph_full.json") - - -''' -plt.figure(figsize=(22, 14)) -pos = nx.spring_layout(G, k=0.5, seed=42) -nx.draw(G, pos, with_labels=True, - node_color="lightblue", node_size=2500, - edge_color="gray", arrows=True, width=2, font_size=10) -plt.title("Concept Graph from Manually Curated Lecture Concepts", fontsize=14) -plt.axis("off") -plt.tight_layout() -plt.show() -''' diff --git a/concept_graph.html b/concept_graph.html deleted file mode 100644 index a9e161654..000000000 --- a/concept_graph.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - -
-

-
- - - - - - -
-

-
- - - - - -
- - -
-
- - - - - - - \ No newline at end of file diff --git a/concept_graph.json b/concept_graph.json deleted file mode 100644 index 6dea722e7..000000000 --- a/concept_graph.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { "id": "1", "name": "What is computation?", "prerequisites": [] }, - { "id": "2", "name": "Branching and Iteration", "prerequisites": ["1"] }, - { "id": "3", "name": "String Manipulation, Guess and Check, Approximations, Bisection", "prerequisites": ["2"] }, - { "id": "4", "name": "Decomposition, Abstractions, Functions", "prerequisites": ["3"] }, - { "id": "5", "name": "Tuples, Lists, Aliasing, Mutability, Cloning", "prerequisites": ["4"] }, - { "id": "6", "name": "Recursion, Dictionaries", "prerequisites": ["5"] }, - { "id": "7", "name": "Testing, Debugging, Exceptions, Assertions", "prerequisites": ["6"] }, - { "id": "8", "name": "Object Oriented Programming", "prerequisites": ["7"] }, - { "id": "9", "name": "Python Classes and Inheritance", "prerequisites": ["8"] }, - { "id": "10", "name": "Understanding Program Efficiency, Part 1", "prerequisites": ["9"] }, - { "id": "11", "name": "Understanding Program Efficiency, Part 2", "prerequisites": ["10"] }, - { "id": "12", "name": "Searching and Sorting", "prerequisites": ["11"] } -] diff --git a/concept_graph_full.json b/concept_graph_full.json deleted file mode 100644 index f256d4bc9..000000000 --- a/concept_graph_full.json +++ /dev/null @@ -1,338 +0,0 @@ -{ - "directed": true, - "multigraph": false, - "graph": {}, - "nodes": [ - { - "id": "Computation" - }, - { - "id": "Algorithms" - }, - { - "id": "Problem Solving" - }, - { - "id": "Conditionals" - }, - { - "id": "Loops" - }, - { - "id": "Control Flow" - }, - { - "id": "String Manipulation" - }, - { - "id": "Guess and Check" - }, - { - "id": "Approximation" - }, - { - "id": "Bisection Search" - }, - { - "id": "Decomposition" - }, - { - "id": "Abstraction" - }, - { - "id": "Functions" - }, - { - "id": "Tuples" - }, - { - "id": "Lists" - }, - { - "id": "Aliasing" - }, - { - "id": "Mutability" - }, - { - "id": "Cloning" - }, - { - "id": "Recursion" - }, - { - "id": "Dictionaries" - }, - { - "id": "Testing" - }, - { - "id": "Debugging" - }, - { - "id": "Exceptions" - }, - { - "id": "Assertions" - }, - { - "id": "Classes" - }, - { - "id": "OOP" - }, - { - "id": "Encapsulation" - }, - { - "id": "Inheritance" - }, - { - "id": "Subclasses" - }, - { - "id": "Class Hierarchies" - }, - { - "id": "Big-O Notation" - }, - { - "id": "Efficiency" - }, - { - "id": "Space Complexity" - }, - { - "id": "Search Algorithms" - }, - { - "id": "Sorting Algorithms" - } - ], - "links": [ - { - "source": "Computation", - "target": "Algorithms" - }, - { - "source": "Algorithms", - "target": "Problem Solving" - }, - { - "source": "Problem Solving", - "target": "Conditionals" - }, - { - "source": "Problem Solving", - "target": "Loops" - }, - { - "source": "Problem Solving", - "target": "Control Flow" - }, - { - "source": "Conditionals", - "target": "Loops" - }, - { - "source": "Loops", - "target": "Control Flow" - }, - { - "source": "Control Flow", - "target": "String Manipulation" - }, - { - "source": "Control Flow", - "target": "Guess and Check" - }, - { - "source": "Control Flow", - "target": "Approximation" - }, - { - "source": "Control Flow", - "target": "Bisection Search" - }, - { - "source": "String Manipulation", - "target": "Guess and Check" - }, - { - "source": "Guess and Check", - "target": "Approximation" - }, - { - "source": "Approximation", - "target": "Bisection Search" - }, - { - "source": "Bisection Search", - "target": "Decomposition" - }, - { - "source": "Bisection Search", - "target": "Abstraction" - }, - { - "source": "Bisection Search", - "target": "Functions" - }, - { - "source": "Decomposition", - "target": "Abstraction" - }, - { - "source": "Abstraction", - "target": "Functions" - }, - { - "source": "Functions", - "target": "Tuples" - }, - { - "source": "Functions", - "target": "Lists" - }, - { - "source": "Functions", - "target": "Aliasing" - }, - { - "source": "Functions", - "target": "Mutability" - }, - { - "source": "Functions", - "target": "Cloning" - }, - { - "source": "Tuples", - "target": "Lists" - }, - { - "source": "Lists", - "target": "Aliasing" - }, - { - "source": "Aliasing", - "target": "Mutability" - }, - { - "source": "Mutability", - "target": "Cloning" - }, - { - "source": "Cloning", - "target": "Recursion" - }, - { - "source": "Cloning", - "target": "Dictionaries" - }, - { - "source": "Recursion", - "target": "Dictionaries" - }, - { - "source": "Dictionaries", - "target": "Testing" - }, - { - "source": "Dictionaries", - "target": "Debugging" - }, - { - "source": "Dictionaries", - "target": "Exceptions" - }, - { - "source": "Dictionaries", - "target": "Assertions" - }, - { - "source": "Testing", - "target": "Debugging" - }, - { - "source": "Debugging", - "target": "Exceptions" - }, - { - "source": "Exceptions", - "target": "Assertions" - }, - { - "source": "Assertions", - "target": "Classes" - }, - { - "source": "Assertions", - "target": "OOP" - }, - { - "source": "Assertions", - "target": "Encapsulation" - }, - { - "source": "Classes", - "target": "OOP" - }, - { - "source": "OOP", - "target": "Encapsulation" - }, - { - "source": "Encapsulation", - "target": "Inheritance" - }, - { - "source": "Encapsulation", - "target": "Subclasses" - }, - { - "source": "Encapsulation", - "target": "Class Hierarchies" - }, - { - "source": "Inheritance", - "target": "Subclasses" - }, - { - "source": "Subclasses", - "target": "Class Hierarchies" - }, - { - "source": "Class Hierarchies", - "target": "Big-O Notation" - }, - { - "source": "Class Hierarchies", - "target": "Efficiency" - }, - { - "source": "Big-O Notation", - "target": "Efficiency" - }, - { - "source": "Efficiency", - "target": "Efficiency" - }, - { - "source": "Efficiency", - "target": "Space Complexity" - }, - { - "source": "Space Complexity", - "target": "Search Algorithms" - }, - { - "source": "Space Complexity", - "target": "Sorting Algorithms" - }, - { - "source": "Search Algorithms", - "target": "Sorting Algorithms" - } - ] -} \ No newline at end of file diff --git a/cps b/cps deleted file mode 160000 index 2d768b1cd..000000000 --- a/cps +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2d768b1cd5a5a8bd133ad47fd1b3abf48d2f041d diff --git a/fetch_lectures.py b/fetch_lectures.py deleted file mode 100644 index 742c02125..000000000 --- a/fetch_lectures.py +++ /dev/null @@ -1,44 +0,0 @@ -import requests -import time -from bs4 import BeautifulSoup -from bs4.element import Tag -import json - -url = "https://ocw.mit.edu/courses/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/pages/lecture-slides-code/" - -session = requests.Session() -time.sleep(2) # Sleep to avoid overwhelming the server -r = session.get(url) - -with open("lecture_slides_code.html", "w", encoding='utf-8') as f: - f.write(r.text) -print("HTML content retrieved and saved to lecture_slides_code.html") - -with open("lecture_slides_code.html", "r", encoding='utf-8') as f: - html_content = f.read() - -soup = BeautifulSoup(html_content, 'html.parser') -rows = soup.find_all("tr") - -lecture_titles = [] - -for row in rows: - if isinstance(row, Tag): - cols = row.find_all("td") - if len(cols) >= 2: - title = cols[1].get_text(strip=True) - if title: - lecture_titles.append(title) - -# Save lecture titles to a text file (optional) -with open("lecture_titles.txt", "w", encoding='utf-8') as f: - for title in lecture_titles: - f.write(title + "\n") - -print(f"Extracted {len(lecture_titles)} lecture titles and saved to lecture_titles.txt") - -# Save lecture titles to JSON file -with open("lecture_titles.json", "w", encoding='utf-8') as f_json: - json.dump(lecture_titles, f_json, ensure_ascii=False, indent=2) - -print(f"Saved {len(lecture_titles)} lecture titles to lecture_titles.json") diff --git a/index.html b/index.html deleted file mode 100644 index 039e57648..000000000 --- a/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - MIT OCW Python Course Graph - - - - -

MIT OCW Python Course Graph

-
- - - - diff --git a/learner_profiles.json b/learner_profiles.json deleted file mode 100644 index 63f1f1f88..000000000 --- a/learner_profiles.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "learner_id": "L001", - "mastered_concepts": ["Computation", "Algorithms"], - "weak_concepts": ["Problem Solving"] - }, - { - "learner_id": "L002", - "mastered_concepts": ["Computation"], - "weak_concepts": [] - } -] \ No newline at end of file diff --git a/lecture_prerequisites_graph (1).png b/lecture_prerequisites_graph (1).png deleted file mode 100644 index b134c4ff9..000000000 Binary files a/lecture_prerequisites_graph (1).png and /dev/null differ diff --git a/lecture_slides_code.html b/lecture_slides_code.html deleted file mode 100644 index 6df87b1a0..000000000 --- a/lecture_slides_code.html +++ /dev/null @@ -1,2695 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Lecture Slides and Code | Introduction to Computer Science and Programming in Python | Electrical Engineering and Computer Science | MIT OpenCourseWare - - - - - - - - - -
- - - - - - - - - - - -
- -
- - -
- -
- -
-
-
- - - -
-
-
-
- - 6.0001 | Fall 2016 | Undergraduate -
-
-

- Introduction to Computer Science and Programming in Python -

-
-
-
-
-
-
- - -
-
-
-
-
-
-
- -
- -
-
- - - - - - -
-
-
-
-
-
-
-
-
- - - - -
-
- -
-
-
-
-
-
-
- -
-
-
-
- -

Lecture Slides and Code

-
-
-
- -
-

The slides and code from each lecture are available below.

-

- - - - - - - - - - - - -

- - -

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

-

- - - - - - - - - - -

- - -
- -SES # - - -TOPICS - - -LECTURE SLIDES - - -LECTURE CODES -
- -1 - - -What is computation? - - -Slides for Lecture 1 (PDF) - - -Code for Lecture 1 (PY) -
- -2 - - -Branching and Iteration - - -Slides for Lecture 2 (PDF) - - -Code for Lecture 2 (PY) -
- -3 - - -String Manipulation, Guess and Check, Approximations, Bisection - - -Slides for Lecture 3 (PDF) - - -Code for Lecture 3 (PY) -
- -4 - - -Decomposition, Abstractions, Functions - - -Slides for Lecture 4 (PDF 1.1MB) - - -Code for Lecture 4 (PY) -
- -5 - - -Tuples, Lists, Aliasing, Mutability, Cloning - - -Slides for Lecture 5 (PDF) - - -Code for Lecture 5 (PY) -
- -6 - - -Recursion, Dictionaries - - -Slides for Lecture 6 (PDF - 1.3MB) - - -Code for Lecture 6 (PY) -
- -7 - - -Testing, Debugging, Exceptions, Assertions - - -Slides for Lecture 7 (PDF) - - -Code for Lecture 7 (PY) -
- -8 - - -Object Oriented Programming - - -Slides for Lecture 8 (PDF) - - -Code for Lecture 8 (PY) -
- -9 - - -Python Classes and Inheritance - - -Slides for Lecture 9 (PDF - 1.6MB) - - -Code for Lecture 9 (PY) -
- -10 - - -Understanding Program Efficiency, Part 1 - - -Slides for Lecture 10 (PDF) - - -Code for Lecture 10 (PY) -
- -11 - - -Understanding Program Efficiency, Part 2 - - -Slides for Lecture 11 (PDF) - - -Code for Lecture 11 (PY) -
- -12 - - -Searching and Sorting - - -Slides for Lecture 12 (PDF - 2.4MB) - - -Code for Lecture 12 (PY) -
- -

-
-
- - -
-
- - - -
- - -
-
-

- Course Info -

-
-
-
-
- -
- -
- Instructors -
-
- - - - - - - - -
-
- - - - -
-
- Departments -
-
- - - - - - - - -
-
- - - -
-
- As Taught In -
-
- Fall - - 2016 - -
-
- -
-
- Level -
-
- - - Undergraduate
- - -
-
- -
- - -
-
-
- -
- - - - - - -
-
- Topics -
- -
- - - - - -
-
- Learning Resource Types -
-
-
- -
- - -
-
- - Problem Sets -
-
- -
- -
- - -
-
- - Lecture Notes -
-
- -
- -
- - -
-
- - Lecture Videos -
-
- -
- -
- - -
-
- - Programming Assignments with Examples -
-
- -
- -
-
-
- - -
- -
-
- - -
-
-
-
-
-
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/lecture_titles.json b/lecture_titles.json deleted file mode 100644 index 0944128ea..000000000 --- a/lecture_titles.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - "What is computation?", - "Branching and Iteration", - "String Manipulation, Guess and Check, Approximations, Bisection", - "Decomposition, Abstractions, Functions", - "Tuples, Lists, Aliasing, Mutability, Cloning", - "Recursion, Dictionaries", - "Testing, Debugging, Exceptions, Assertions", - "Object Oriented Programming", - "Python Classes and Inheritance", - "Understanding Program Efficiency, Part 1", - "Understanding Program Efficiency, Part 2", - "Searching and Sorting" -] \ No newline at end of file diff --git a/lecture_titles.txt b/lecture_titles.txt deleted file mode 100644 index 68f640f73..000000000 --- a/lecture_titles.txt +++ /dev/null @@ -1,12 +0,0 @@ -What is computation? -Branching and Iteration -String Manipulation, Guess and Check, Approximations, Bisection -Decomposition, Abstractions, Functions -Tuples, Lists, Aliasing, Mutability, Cloning -Recursion, Dictionaries -Testing, Debugging, Exceptions, Assertions -Object Oriented Programming -Python Classes and Inheritance -Understanding Program Efficiency, Part 1 -Understanding Program Efficiency, Part 2 -Searching and Sorting diff --git a/lectures.json b/lectures.json deleted file mode 100644 index dd78a2e78..000000000 --- a/lectures.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { "id": 1, "title": "Introduction to Python" }, - { "id": 2, "title": "Data Types and Variables" }, - { "id": 3, "title": "Control Structures" }, - { "id": 4, "title": "Functions" }, - { "id": 5, "title": "Modules and Packages" }, - { "id": 6, "title": "Object-Oriented Programming" } -] diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ddedb5691..000000000 --- a/package-lock.json +++ /dev/null @@ -1,1224 +0,0 @@ -{ - "name": "learning_path", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "learning_path", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "bcryptjs": "^3.0.2", - "cors": "^2.8.5", - "express": "^5.1.0", - "jsonwebtoken": "^9.0.2", - "mongodb": "^6.17.0", - "mongoose": "^8.15.1" - } - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", - "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==", - "license": "MIT", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "license": "MIT" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", - "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", - "license": "MIT", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/bcryptjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", - "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", - "license": "BSD-3-Clause", - "bin": { - "bcrypt": "bin/bcrypt" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/bson": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", - "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kareem": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", - "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "license": "MIT" - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mongodb": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz", - "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.4", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", - "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", - "license": "Apache-2.0", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^14.1.0 || ^13.0.0" - } - }, - "node_modules/mongoose": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz", - "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==", - "license": "MIT", - "dependencies": { - "bson": "^6.10.3", - "kareem": "2.6.3", - "mongodb": "~6.16.0", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "17.1.3" - }, - "engines": { - "node": ">=16.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mongoose/node_modules/mongodb": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", - "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "license": "MIT", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", - "license": "MIT" - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 1ee29c497..000000000 --- a/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "learning_path", - "version": "1.0.0", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "description": "", - "dependencies": { - "bcryptjs": "^3.0.2", - "cors": "^2.8.5", - "express": "^5.1.0", - "jsonwebtoken": "^9.0.2", - "mongodb": "^6.17.0", - "mongoose": "^8.15.1" - } -} diff --git a/project-alpha/.gitignore b/project-alpha/.gitignore deleted file mode 100644 index 3168325eb..000000000 --- a/project-alpha/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -.env -dist -.DS_Store \ No newline at end of file diff --git a/project-alpha/LICENSE b/project-alpha/LICENSE deleted file mode 100644 index 1a15e1b51..000000000 --- a/project-alpha/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 sivasai - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/project-alpha/README.md b/project-alpha/README.md deleted file mode 100644 index e63ee9a43..000000000 --- a/project-alpha/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# Personalized Learning Path Recommendation - -An experimental AI-powered educational tool that recommends personalized learning paths based on a user’s target topic. The system dynamically constructs a prerequisite concept graph to identify foundational knowledge, and uses GPT-based analysis to generate diagnostic assessments β€” ensuring learners build a strong conceptual base before progressing. - -This project is actively being developed using the MERN stack, with plans to integrate advanced agentic reasoning and adaptive feedback for scalable and personalized learning support. - - - ---- - -## Status - -> This project is currently in early development. Features and APIs are subject to frequent changes. - ---- - -## System Workflow (4 Stages) - -### Stage 1: Prerequisite Graph Construction - -- Accepts any user-given topic (e.g., "Machine Learning"). -- Uses GPT-4o to generate 5–7 relevant prerequisite concepts -- Visualizes them as a Directed Acyclic Graph (DAG). - -### Stage 2: MCQ Exam Generator - -- Automatically generates diagnostic multiple-choice questions based on each prerequisite concept. -- Questions are AI-generated and domain-aware. - -### Stage 3: Result Display and Analysis -- Evaluates user responses to identify strengths and knowledge gaps. -- Provides clear, structured feedback - -### Stage 4: Personalized Learning Path Recommendation -- Constructs a custom learning path based on analysis of prerequisite performance -- Highlights weak areas and recommends learning order - ---- - -## How to Run the Project - -### 1. Clone the Repository - -### 2. Add Your OpenRouter API Key - -* Create a `.env` file in the **`backend/`** directory. -* Add the following lines to the `.env` file: - -```env -OPENROUTER_API_KEY=your_openrouter_key_here -MONGO_URI=mongodb://localhost:27017/cps-prerequisites -``` - -> Make sure the `.env` file is located inside the `backend/` folder. - ---- - -### 3. Start the Application - -#### In Terminal 1 (Frontend) - -```bash -cd frontend -npm install -npm start -``` - -This will start the frontend on http://localhost:5173 (Vite default) - -#### In Terminal 2 (Backend) - -```bash -cd backend -npm install -npm start -``` - ---- - -## What Happens Now - -* Enter a concept or topic in the input field (e.g., "Machine Learning"). -* The system will: - * Call OpenRouter (GPT-4o) to generate 5–7 prerequisite concepts. - * Save the topic and prerequisites in MongoDB. - * Display them as a bullet list and a directed graph (DAG) on the frontend. - ---- - -## Tech Stack - -* **Frontend**: React (TypeScript) -* **Backend**: Node.js + Express -* **Database**: MongoDB -* **AI/LLM**: GPT-4o via OpenRouter -* **Graph Rendering**: vis-network -* **Environment Management**: dotenv - - diff --git a/project-alpha/backend/package-lock.json b/project-alpha/backend/package-lock.json deleted file mode 100644 index f0afbfb8b..000000000 --- a/project-alpha/backend/package-lock.json +++ /dev/null @@ -1,2066 +0,0 @@ -{ - "name": "backend", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "backend", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "axios": "^1.9.0", - "cors": "^2.8.5", - "dotenv": "^16.5.0", - "express": "^5.1.0", - "mongoose": "^8.15.1" - }, - "devDependencies": { - "@types/cors": "^2.8.19", - "@types/dotenv": "^6.1.1", - "@types/express": "^5.0.3", - "@types/node": "^24.0.0", - "ts-node-dev": "^2.0.0", - "typescript": "^5.8.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", - "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==", - "license": "MIT", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/dotenv": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", - "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", - "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz", - "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "license": "MIT" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", - "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", - "license": "MIT", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bson": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", - "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/kareem": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", - "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "license": "MIT" - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mongodb": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", - "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", - "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", - "license": "Apache-2.0", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^14.1.0 || ^13.0.0" - } - }, - "node_modules/mongoose": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz", - "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==", - "license": "MIT", - "dependencies": { - "bson": "^6.10.3", - "kareem": "2.6.3", - "mongodb": "~6.16.0", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "17.1.3" - }, - "engines": { - "node": ">=16.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "license": "MIT", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node-dev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", - "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.1", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^10.4.0", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" - }, - "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "node-notifier": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/project-alpha/backend/package.json b/project-alpha/backend/package.json deleted file mode 100644 index 221318db6..000000000 --- a/project-alpha/backend/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "backend", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "ts-node-dev src/index.ts", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", - "dependencies": { - "axios": "^1.9.0", - "cors": "^2.8.5", - "dotenv": "^16.5.0", - "express": "^5.1.0", - "mongoose": "^8.15.1" - }, - "devDependencies": { - "@types/cors": "^2.8.19", - "@types/dotenv": "^6.1.1", - "@types/express": "^5.0.3", - "@types/node": "^24.0.0", - "ts-node-dev": "^2.0.0", - "typescript": "^5.8.3" - } -} \ No newline at end of file diff --git a/project-alpha/backend/src/index.ts b/project-alpha/backend/src/index.ts deleted file mode 100644 index c927b89f0..000000000 --- a/project-alpha/backend/src/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import express from 'express'; -import mongoose from 'mongoose'; -import cors from 'cors'; -import dotenv from 'dotenv'; -import prereqRoutes from './routes/prerequisites'; - -dotenv.config(); // Load .env - -const app = express(); -app.use(cors()); -app.use(express.json()); - -app.use('/api/prerequisites', prereqRoutes); - -mongoose.connect(process.env.MONGO_URI!) - .then(() => console.log('MongoDB connected')) - .catch(err => console.error(err)); - -const PORT = process.env.PORT || 5000; -app.listen(PORT, () => console.log(`Server running on port ${PORT}`)); \ No newline at end of file diff --git a/project-alpha/backend/src/models/Prereq.ts b/project-alpha/backend/src/models/Prereq.ts deleted file mode 100644 index 65237acf9..000000000 --- a/project-alpha/backend/src/models/Prereq.ts +++ /dev/null @@ -1,8 +0,0 @@ -import mongoose from 'mongoose'; - -const prereqSchema = new mongoose.Schema({ - topic: { type: String, required: true }, - prerequisites: { type: [String], required: true }, -}); - -export default mongoose.model('Prereq', prereqSchema); \ No newline at end of file diff --git a/project-alpha/backend/src/routes/prerequisites.ts b/project-alpha/backend/src/routes/prerequisites.ts deleted file mode 100644 index af99d5fd7..000000000 --- a/project-alpha/backend/src/routes/prerequisites.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Router, Request, Response } from 'express'; -import Prereq from '../models/Prereq'; -import { generatePrerequisites } from '../services/prereqGenerator'; - -const router = Router(); - -router.post('/', async (req: Request, res: Response) => { - const { topic } = req.body; - try { - const prereqs = await generatePrerequisites(topic); - const newEntry = new Prereq({ topic, prerequisites: prereqs }); - await newEntry.save(); - res.json({ topic, prerequisites: prereqs }); - } catch (err) { - res.status(500).json({ error: 'Error generating prerequisites' }); - } -}); - -export default router; \ No newline at end of file diff --git a/project-alpha/backend/src/services/prereqGenerator.ts b/project-alpha/backend/src/services/prereqGenerator.ts deleted file mode 100644 index 31c70fd40..000000000 --- a/project-alpha/backend/src/services/prereqGenerator.ts +++ /dev/null @@ -1,40 +0,0 @@ -import axios from 'axios'; - -export async function generatePrerequisites(topic: string): Promise { - try { - console.log('⏳ Asking GPT-4o via OpenRouter for topic:', topic); - - const response = await axios.post( - 'https://openrouter.ai/api/v1/chat/completions', - { - model: 'openai/gpt-4o', - max_tokens: 200, // βœ… Limit token usage to fit free plan - messages: [ - { - role: 'user', - content: `List 5 to 7 prerequisite concepts needed to understand "${topic}" in computer science. Only return the concepts as a plain numbered list.`, - }, - ], - }, - { - headers: { - Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`, - 'Content-Type': 'application/json', - }, - } - ); - - const content: string = response.data.choices[0]?.message?.content ?? ''; - console.log('βœ… GPT Response:', content); - - const list = content - .split('\n') - .map((line: string) => line.replace(/^\d+\.?\s*/, '').trim()) - .filter(Boolean); - - return list.length > 0 ? list : ['⚠️ Could not generate prerequisites. Try another topic.']; - } catch (error: any) { - console.error('❌ GPT API error:\n', error?.response?.data || error.message); - return ['⚠️ Unable to generate prerequisites. Try another topic.']; - } -} \ No newline at end of file diff --git a/project-alpha/backend/tsconfig.json b/project-alpha/backend/tsconfig.json deleted file mode 100644 index 570128d5f..000000000 --- a/project-alpha/backend/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "module": "commonjs", - "rootDir": "./src", - "outDir": "./dist", - "esModuleInterop": true, - "strict": true, - "skipLibCheck": true - } -} \ No newline at end of file diff --git a/project-alpha/frontend/index.html b/project-alpha/frontend/index.html deleted file mode 100644 index e4b78eae1..000000000 --- a/project-alpha/frontend/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/project-alpha/frontend/src/App.css b/project-alpha/frontend/src/App.css deleted file mode 100644 index b9d355df2..000000000 --- a/project-alpha/frontend/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/project-alpha/frontend/src/App.tsx b/project-alpha/frontend/src/App.tsx deleted file mode 100644 index 2618f3ea6..000000000 --- a/project-alpha/frontend/src/App.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { useState } from 'react'; -import axios from 'axios'; -import Graph from './components/Graph'; -//import PrereqList from './components/PrereqList'; - -type PrereqData = { - topic: string; - prerequisites: string[]; -}; - -function App() { - const [topic, setTopic] = useState(''); - const [data, setData] = useState(null); - - const handleSubmit = async () => { - if (!topic.trim()) return; - - try { - const res = await axios.post('http://localhost:5000/api/prerequisites', { topic }); - setData(res.data); - } catch (err) { - console.error('Error fetching prerequisites', err); - } - }; - - return ( -
-
- {/* LEFT SIDE */} -
-

- Concept Prerequisite Graph -

- -
- setTopic(e.target.value)} - placeholder="Enter a topic (e.g. Machine Learning)" - style={{ - padding: '12px', - fontSize: '16px', - flexGrow: 1, - border: '1px solid #ccc', - borderRadius: '6px', - }} - /> - -
- - {data && ( - <> -

Prerequisite List

-
    - {data.prerequisites.map((item, i) => ( -
  • - {item} -
  • - ))} -
- - )} -
- - {/* RIGHT SIDE */} -
- {data && ( - <> -

- Graph for {data.topic} -

- - - )} -
-
-
- ); -} - -export default App; \ No newline at end of file diff --git a/project-alpha/frontend/src/components/Graph.tsx b/project-alpha/frontend/src/components/Graph.tsx deleted file mode 100644 index 82f9f56b7..000000000 --- a/project-alpha/frontend/src/components/Graph.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { useEffect, useRef } from 'react'; -import { DataSet, Network } from 'vis-network/standalone'; -import type { Node, Edge } from 'vis-network'; - -type GraphProps = { - topic: string; - prerequisites: string[]; -}; - -const Graph = ({ topic, prerequisites }: GraphProps) => { - const containerRef = useRef(null); - - useEffect(() => { - if (!containerRef.current) return; - - const nodes: Node[] = [ - { id: 'Start', label: 'Start', color: '#90caf9', level: 0 }, - ...prerequisites.map((p, i) => ({ - id: p, - label: p, - color: '#a5d6a7', - level: i + 1, - })), - { id: topic, label: topic, color: '#ffab91', level: prerequisites.length + 1 }, - ]; - - const edges: Edge[] = []; - - // Connect: Start β†’ prereq1 - if (prerequisites.length > 0) { - edges.push({ from: 'Start', to: prerequisites[0], arrows: 'to' }); - - // Chain: prereq1 β†’ prereq2 β†’ ... - for (let i = 0; i < prerequisites.length - 1; i++) { - edges.push({ from: prerequisites[i], to: prerequisites[i + 1], arrows: 'to' }); - } - - // Final prereq β†’ Topic - edges.push({ from: prerequisites[prerequisites.length - 1], to: topic, arrows: 'to' }); - } else { - edges.push({ from: 'Start', to: topic, arrows: 'to' }); - } - - const data = { - nodes: new DataSet(nodes), - edges: new DataSet(edges), - }; - - const options = { - layout: { - hierarchical: { - enabled: true, - levelSeparation: 150, - direction: 'UD', // Up to Down - sortMethod: 'directed', - }, - }, - physics: { - enabled: false, - }, - edges: { - smooth: true, - arrows: { - to: { enabled: true, scaleFactor: 1 }, - }, - }, - nodes: { - shape: 'box', - font: { - face: 'Arial', - size: 14, - }, - margin: { - top: 10, - bottom: 10, - left: 10, - right: 10, - }, - }, - }; - - new Network(containerRef.current, data, options); - }, [topic, prerequisites]); - - return ( -
-
-
- ); -}; - -export default Graph; \ No newline at end of file diff --git a/project-alpha/frontend/src/components/PrereqList.tsx b/project-alpha/frontend/src/components/PrereqList.tsx deleted file mode 100644 index 7b28f59ff..000000000 --- a/project-alpha/frontend/src/components/PrereqList.tsx +++ /dev/null @@ -1,16 +0,0 @@ -type Props = { - list: string[]; -}; - -const PrereqList: React.FC = ({ list }) => ( -
-

Prerequisite List

-
    - {list.map((item, index) => ( -
  • β€’ {item}
  • - ))} -
-
-); - -export default PrereqList; \ No newline at end of file diff --git a/project-alpha/frontend/src/index.css b/project-alpha/frontend/src/index.css deleted file mode 100644 index 08a3ac9e1..000000000 --- a/project-alpha/frontend/src/index.css +++ /dev/null @@ -1,68 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/project-lambda/README.md b/project-lambda/README.md deleted file mode 100644 index a301e6fb4..000000000 --- a/project-lambda/README.md +++ /dev/null @@ -1,47 +0,0 @@ -EduVLM-Bench: A Multimodal Benchmark for Educational Concept Learning -🎯 Project Overview -EduVLM-Bench is a comprehensive benchmark designed to evaluate Vision-Language Models (VLMs) on educational concept prerequisite identification. The core problem we're addressing is: When a student fails to answer a question correctly, how can we identify the missing prerequisites that will help bridge the gap from confusion to correct understanding? -Key Innovation -Rather than just evaluating whether models can solve problems, we focus on diagnostic capability - can models identify what knowledge is missing when learning breaks down? -πŸŽ“ Research Vision -This project aims to create a framework that can: - -Identify Missing Prerequisites: Given a student's wrong answer, pinpoint specific knowledge gaps -Generate Learning Paths: Provide structured pathways from current understanding to mastery -Reduce Annotation Burden: Use AI-generated concept taxonomies to streamline human annotation -Benchmark VLM Performance: Evaluate models across different scales (2B, 4B, 7B) and architectures - -πŸ“Š Current Progress -βœ… Phase 1: Concept Taxonomy Building (IN PROGRESS) -We've successfully extracted prerequisite concepts from the first 200 questions of GSM-8K using Gemini 1.5 Flash. -Technical Implementation -python# Core extraction pipeline using Gemini API -@retry(stop=stop_after_attempt(5), wait=wait_exponential(multiplier=2)) -def get_prerequisites_with_retry(prompt): - response = model.generate_content(prompt) - return response.text.strip() -Current Statistics - -Dataset: GSM-8K first 200 questions -Model Used: Gemini 1.5 Flash -Output: Comprehensive CSV of unique mathematical concepts -Processing: 200/200 questions completed -Concepts Identified: ~[X unique concepts] (extracted and sorted) - -Sample Concepts Extracted -Addition -Addition And Subtraction Of Integers -Addition And Subtraction Of Time -Times As Old As -Twice As Old As -πŸ”„ Next Steps: Phase 2 Error-Prerequisite Mapping -Current Task: Generate wrong answers with targeted prerequisite gaps using Gemma-3-4B -Planned Approach: - -Question-by-Question Mapping: Create specific prerequisite mappings for each problem -Controlled Error Generation: Use targeted prompting to generate realistic wrong answers -Missing Concept Injection: Remove specific prerequisites to create authentic confusion - -Model Setup: -pythonimport lmstudio as lms -model = lms.llm('gemma-3-4b-it') diff --git a/project-lambda/error-generation.ipynb b/project-lambda/error-generation.ipynb deleted file mode 100644 index 1b978342f..000000000 --- a/project-lambda/error-generation.ipynb +++ /dev/null @@ -1,391 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "id": "950ea242", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "text-embedding-nomic-embed-text-v1.5\n", - "internvl3-8b\n", - "smolvlm2-2.2b-instruct\n", - "irix-12b-model_stock\n", - "deepseek-r1-0528-qwen3-8b\n", - "qwen2.5-vl-32b-instruct\n", - "qwen2.5-vl-7b-instruct\n", - "gemma-3-4b-it\n", - "qwen2-vl-2b-instruct\n", - "granite-vision-3.2-2b\n", - "smolvlm2-500m-video-instruct\n", - "gemma-3-27b-it-qat\n", - "gemma-3-12b-it-qat\n" - ] - } - ], - "source": [ - "import lmstudio as lms\n", - "\n", - "downloaded = lms.list_downloaded_models()\n", - "llm_only = lms.list_downloaded_models(\"llm\")\n", - "embedding_only = lms.list_downloaded_models(\"embedding\")\n", - "\n", - "for model in downloaded:\n", - " print(model.model_key)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "6da3875a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Okay, let's tackle this big one – the meaning of life. The short answer is: **there isn’t a single, universally agreed-upon answer.** It's arguably *the* most pondered question in human history, and that's because it's deeply personal and philosophical. \n", - "\n", - "Here's a breakdown of different perspectives, grouped into categories:\n", - "\n", - "**1. Philosophical Perspectives:**\n", - "\n", - "* **Nihilism:** This view suggests life is inherently meaningless. There’s no objective purpose or value. It can be bleak, but some find freedom in accepting this lack of inherent meaning and creating their own.\n", - "* **Existentialism:** This philosophy argues that existence precedes essence. We are born into the world without a predetermined purpose. *We* create our own meaning through our choices and actions. Key figures include Sartre and Camus. It emphasizes responsibility – we're responsible for defining ourselves.\n", - "* **Absurdism:** Closely related to existentialism, absurdism recognizes the conflict between humanity’s innate desire for meaning and the meaningless universe. It suggests embracing this absurdity rather than trying to resolve it. (Camus is a key figure here).\n", - "* **Hedonism:** The pursuit of pleasure and avoidance of pain is the primary goal and source of meaning. \n", - "* **Utilitarianism:** Meaning comes from maximizing happiness and well-being for the greatest number of people. Actions are judged by their consequences.\n", - "* **Stoicism:** Finding meaning through virtue, reason, and acceptance of what we cannot control. Focus on inner peace and living in accordance with nature.\n", - "\n", - "\n", - "**2. Religious & Spiritual Perspectives:**\n", - "\n", - "* **Theism (Various Religions):** Most religions offer answers centered around a divine being or higher power. Meaning is often found in serving God, following religious teachings, seeking salvation, and connecting with the divine. Specific meanings vary greatly between faiths (Christianity, Islam, Judaism, Hinduism, Buddhism, etc.).\n", - "* **Buddhism:** The goal is to escape suffering through enlightenment and achieving Nirvana – a state of liberation from the cycle of rebirth. Meaning comes from cultivating compassion, wisdom, and mindfulness.\n", - "* **Hinduism:** Meaning is found in fulfilling one's dharma (duty), pursuing karma (actions leading to consequences), and ultimately attaining moksha (liberation) from the cycle of reincarnation.\n", - "\n", - "**3. Psychological & Humanistic Perspectives:**\n", - "\n", - "* **Viktor Frankl’s Logotherapy:** Frankl, a Holocaust survivor, argued that the primary human drive is not pleasure or power, but *meaning*. He believed meaning can be found in:\n", - " * **Creating something (doing)** – contributing to the world through work, art, or acts of service.\n", - " * **Experiencing something (encountering)** – appreciating beauty, love, and connection with others.\n", - " * **Facing suffering (finding meaning in hardship)** – transforming adversity into a meaningful experience.\n", - "* **Self-Actualization (Maslow):** Humans have an innate drive to reach their full potential. Finding meaning involves pursuing personal growth, creativity, and fulfilling one’s unique talents.\n", - "* **Positive Psychology:** Focuses on what makes life worth living – happiness, resilience, gratitude, connection, and purpose.\n", - "\n", - "\n", - "**4. Personal & Subjective Perspectives:**\n", - "\n", - "* **Relationships:** For many, the meaning of life is found in loving relationships with family, friends, and partners.\n", - "* **Contribution:** Making a positive impact on the world, however small, can provide a sense of purpose. This could be through volunteering, activism, or simply being a good neighbor.\n", - "* **Experiences:** Seeking out new experiences, learning, and exploring the world can enrich life and give it meaning.\n", - "* **Personal Values:** Living in accordance with your core values – honesty, kindness, integrity, etc. – can provide a sense of direction and purpose.\n", - "\n", - "**Important Considerations:**\n", - "\n", - "* **Meaning is often *created*, not found.** It’s not something passively discovered; it's actively constructed through our choices and actions.\n", - "* **Meaning can evolve over time.** What gives your life meaning at one stage may change as you grow and experience new things.\n", - "* **It’s okay to not have all the answers.** The search for meaning is a lifelong journey, and it’s perfectly normal to grapple with this question.\n", - "\n", - "**Resources for Further Exploration:**\n", - "\n", - "* **Viktor Frankl's *Man's Search for Meaning***: [https://www.amazon.com/Mans-Search-Meaning-Viktor-Frankl/dp/080701427X](https://www.amazon.com/Mans-Search-Meaning-Viktor-Frankl/dp/080701427X)\n", - "* **Existentialism:** [https://en.wikipedia.org/wiki/Existentialism](https://en.wikipedia.org/wiki/Existentialism)\n", - "* **Buddhism:** [https://en.wikipedia.org/wiki/Buddhism](https://en.wikipedia.org/wiki/Buddhism)\n", - "\n", - "---\n", - "\n", - "**To help me give you a more tailored response, could you tell me:**\n", - "\n", - "* What are you hoping to get out of exploring this question? (e.g., Are you feeling lost and searching for purpose? Are you just curious about different viewpoints?)\n" - ] - } - ], - "source": [ - "model = lms.llm('gemma-3-4b-it')\n", - "print(model.respond(\"What is the meaning of life?\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "6825b16a", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\CoolA\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python312\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n", - "C:\\Users\\CoolA\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python312\\site-packages\\huggingface_hub\\file_download.py:143: UserWarning: `huggingface_hub` cache-system uses symlinks by default to efficiently store duplicated files but your machine does not support them in C:\\Users\\CoolA\\.cache\\huggingface\\hub\\datasets--openai--gsm8k. Caching files will still work but in a degraded version that might require more space on your disk. This warning can be disabled by setting the `HF_HUB_DISABLE_SYMLINKS_WARNING` environment variable. For more details, see https://huggingface.co/docs/huggingface_hub/how-to-cache#limitations.\n", - "To support symlinks on Windows, you either need to activate Developer Mode or to run Python as an administrator. In order to activate developer mode, see this article: https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development\n", - " warnings.warn(message)\n", - "Generating train split: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 7473/7473 [00:00<00:00, 1158658.65 examples/s]\n", - "Generating test split: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 1319/1319 [00:00<00:00, 344690.78 examples/s]\n" - ] - } - ], - "source": [ - "from datasets import load_dataset\n", - "\n", - "ds = load_dataset(\"openai/gsm8k\", \"main\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "81f56dad", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processing question 1/200...\n", - "Processing question 2/200...\n", - "Processing question 3/200...\n", - "Processing question 4/200...\n", - "Processing question 5/200...\n", - "Processing question 6/200...\n", - "Processing question 7/200...\n", - "Processing question 8/200...\n", - "Processing question 9/200...\n", - "Processing question 10/200...\n", - "Processing question 11/200...\n", - "Processing question 12/200...\n", - "Processing question 13/200...\n", - "Processing question 14/200...\n", - "Processing question 15/200...\n", - "Processing question 16/200...\n", - "Processing question 17/200...\n", - "Processing question 18/200...\n", - "Processing question 19/200...\n", - "Processing question 20/200...\n", - "Processing question 21/200...\n", - "Processing question 22/200...\n", - "Processing question 23/200...\n", - "Processing question 24/200...\n", - "Processing question 25/200...\n", - "Processing question 26/200...\n", - "Processing question 27/200...\n", - "Processing question 28/200...\n", - "Processing question 29/200...\n", - "Processing question 30/200...\n", - "Processing question 31/200...\n", - "Processing question 32/200...\n", - "Processing question 33/200...\n", - "Processing question 34/200...\n", - "Processing question 35/200...\n", - "Processing question 36/200...\n", - "Processing question 37/200...\n", - "Processing question 38/200...\n", - "Processing question 39/200...\n", - "Processing question 40/200...\n", - "Processing question 41/200...\n", - "Processing question 42/200...\n", - "Processing question 43/200...\n", - "Processing question 44/200...\n", - "Processing question 45/200...\n", - "Processing question 46/200...\n", - "Processing question 47/200...\n", - "Processing question 48/200...\n", - "Processing question 49/200...\n", - "Processing question 50/200...\n", - "Processing question 51/200...\n", - "Processing question 52/200...\n", - "Processing question 53/200...\n", - "Processing question 54/200...\n", - "Processing question 55/200...\n", - "Processing question 56/200...\n", - "Processing question 57/200...\n", - "Processing question 58/200...\n", - "Processing question 59/200...\n", - "Processing question 60/200...\n", - "Processing question 61/200...\n", - "Processing question 62/200...\n", - "Processing question 63/200...\n", - "Processing question 64/200...\n", - "Processing question 65/200...\n", - "Processing question 66/200...\n", - "Processing question 67/200...\n", - "Processing question 68/200...\n", - "Processing question 69/200...\n", - "Processing question 70/200...\n", - "Processing question 71/200...\n", - "Processing question 72/200...\n", - "Processing question 73/200...\n", - "Processing question 74/200...\n", - "Processing question 75/200...\n", - "Processing question 76/200...\n", - "Processing question 77/200...\n", - "Processing question 78/200...\n", - "Processing question 79/200...\n", - "Processing question 80/200...\n", - "Processing question 81/200...\n", - "Processing question 82/200...\n", - "Processing question 83/200...\n", - "Processing question 84/200...\n", - "Processing question 85/200...\n", - "Processing question 86/200...\n", - "Processing question 87/200...\n", - "Processing question 88/200...\n", - "Processing question 89/200...\n", - "Processing question 90/200...\n", - "Processing question 91/200...\n", - "Processing question 92/200...\n", - "Processing question 93/200...\n", - "Processing question 94/200...\n", - "Processing question 95/200...\n", - "Processing question 96/200...\n", - "Processing question 97/200...\n", - "Processing question 98/200...\n", - "Processing question 99/200...\n", - "Processing question 100/200...\n", - "Processing question 101/200...\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "import lmstudio as lms\n", - "from datasets import load_dataset\n", - "import json\n", - "import random\n", - "\n", - "# Load dataset and prerequisites\n", - "ds = load_dataset(\"openai/gsm8k\", \"main\")\n", - "concepts_df = pd.read_csv(\"D:\\\\eduvlm-bench\\\\cps\\\\project-lambda\\\\gsm8k_unique_concepts.csv\")\n", - "unique_concepts = concepts_df['Concept'].tolist()\n", - "\n", - "# Load model\n", - "model = lms.llm('gemma-3-4b-it')\n", - "\n", - "def identify_prerequisites_for_question(question, concepts_list):\n", - " \"\"\"\n", - " Use LLM to identify which prerequisites are needed for a specific question\n", - " \"\"\"\n", - " prompt = f\"\"\"\n", - "Given this math word problem and a list of mathematical concepts, identify which concepts are ESSENTIAL prerequisites to solve this problem.\n", - "\n", - "Problem: {question}\n", - "\n", - "Available Concepts:\n", - "{', '.join(concepts_list)}\n", - "\n", - "Instructions:\n", - "- Only list concepts that are absolutely necessary to solve this problem\n", - "- Be precise - don't include concepts that are merely related but not required\n", - "- Return only the concept names, separated by commas\n", - "- If none of the listed concepts are needed, return \"None\"\n", - "\n", - "Essential Prerequisites:\"\"\"\n", - " \n", - " response = model.respond(prompt)\n", - " # Parse the response to extract concept names\n", - " prerequisites = [concept.strip() for concept in response.content.split(',') if concept.strip() in concepts_list]\n", - " return prerequisites\n", - "\n", - "def generate_wrong_answer_with_missing_prerequisite(question, missing_concept):\n", - " \"\"\"\n", - " Generate wrong answer by having model pretend it doesn't know a specific concept\n", - " \"\"\"\n", - " prompt = f\"\"\"\n", - "You are solving a math word problem, but you have a gap in your mathematical knowledge - you don't understand or remember how to work with \"{missing_concept}\".\n", - "\n", - "Problem: {question}\n", - "\n", - "Instructions:\n", - "- Attempt to solve this problem step by step\n", - "- When you encounter the concept \"{missing_concept}\", make a plausible mistake or use incorrect reasoning\n", - "- Show your work clearly\n", - "- Your final answer should be wrong due to the missing knowledge\n", - "- Make the mistake realistic - something a student might actually do\n", - "\n", - "Your solution:\"\"\"\n", - " \n", - " response = model.respond(prompt)\n", - " return response\n", - "\n", - "# Main processing loop for first 200 questions\n", - "results = []\n", - "\n", - "for i in range(min(200, len(ds['train']))):\n", - " question = ds['train'][i]['question']\n", - " correct_answer = ds['train'][i]['answer']\n", - " \n", - " print(f\"Processing question {i+1}/200...\")\n", - " \n", - " # Step 1: Identify prerequisites for this specific question\n", - " prerequisites = identify_prerequisites_for_question(question, unique_concepts)\n", - " \n", - " if not prerequisites:\n", - " print(f\"No prerequisites identified for question {i+1}, skipping...\")\n", - " continue\n", - " \n", - " # Step 2: Randomly select one prerequisite to remove\n", - " missing_concept = random.choice(prerequisites)\n", - " \n", - " # Step 3: Generate wrong answer with missing prerequisite\n", - " wrong_answer = generate_wrong_answer_with_missing_prerequisite(question, missing_concept)\n", - " wrong_answer = wrong_answer.content\n", - " \n", - " # Store results\n", - " result = {\n", - " 'question_id': i,\n", - " 'question': question,\n", - " 'correct_answer': correct_answer,\n", - " 'all_prerequisites': prerequisites,\n", - " 'missing_prerequisite': missing_concept,\n", - " 'wrong_answer': wrong_answer\n", - " }\n", - " \n", - " results.append(result)\n", - " \n", - " # Save intermediate results every 10 questions\n", - " if (i + 1) % 10 == 0:\n", - " with open(f'gsm8k_wrong_answers_checkpoint_{i+1}.json', 'w') as f:\n", - " json.dump(results, f, indent=2)\n", - "\n", - "# Save final results\n", - "results_df = pd.DataFrame(results)\n", - "results_df.to_csv('gsm8k_wrong_answers_with_missing_prerequisites.csv', index=False)\n", - "\n", - "print(f\"Completed processing {len(results)} questions!\")\n", - "print(\"Results saved to 'gsm8k_wrong_answers_with_missing_prerequisites.csv'\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "da4f7c49", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/project-lambda/gsm8_concepts_retry.py b/project-lambda/gsm8_concepts_retry.py deleted file mode 100644 index 7927dc144..000000000 --- a/project-lambda/gsm8_concepts_retry.py +++ /dev/null @@ -1,69 +0,0 @@ -# gsm8k_unique_concepts_with_retry.py - -from datasets import load_dataset -import google.generativeai as genai -import csv -import time -import os -from dotenv import load_dotenv -from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_message - - -load_dotenv() -gemini_api_key = os.getenv("GEMINI_API_KEY") - -print("Loading GSM8K dataset...") -dataset = load_dataset("gsm8k", "main", split="train") -subset = dataset.select(range(200)) - -# Configure Gemini API -genai.configure(api_key=gemini_api_key) -model = genai.GenerativeModel("gemini-1.5-flash") - -# Retry logic for API calls -@retry( - stop=stop_after_attempt(5), # Retry up to 5 times - wait=wait_exponential(multiplier=2, min=2, max=10), # 2s, 4s, 8s, ... - retry=retry_if_exception_message(match="rate limit exceeded|Quota.*exceeded|429") -) -def get_prerequisites_with_retry(prompt): - response = model.generate_content(prompt) - return response.text.strip() - -unique_concepts = set() - -print("Sending prompts to Gemini Flash...") - -for idx, entry in enumerate(subset): - question = entry["question"] - - prompt = ( - f"Problem: {question}\n" - "Task: List the prerequisite concepts or skills that a student must understand to solve this problem.\n" - "Provide the concepts in the correct learning order, starting from the most basic to the most advanced.\n" - "Respond with a comma-separated list like: concept1, concept2, concept3" - ) - - try: - prerequisites = get_prerequisites_with_retry(prompt) - concepts = [c.strip().title() for c in prerequisites.split(',') if c.strip()] - unique_concepts.update(concepts) - - except Exception as e: - print(f"[{idx + 1}/200] ERROR: {str(e)}") - continue - - print(f"[{idx + 1}/200] Processed") - time.sleep(1) - -# Save to CSV -output_file = "gsm8k_unique_concepts.csv" -print(f"Saving {len(unique_concepts)} unique concepts to {output_file}...") - -with open(output_file, mode="w", newline='', encoding="utf-8") as f: - writer = csv.writer(f) - writer.writerow(["Concept"]) - for concept in sorted(unique_concepts): - writer.writerow([concept]) - -print("Done. File saved successfully.") diff --git a/project-lambda/gsm8k_concept.py b/project-lambda/gsm8k_concept.py deleted file mode 100644 index a6f5947bf..000000000 --- a/project-lambda/gsm8k_concept.py +++ /dev/null @@ -1,58 +0,0 @@ -# gsm8k_concepts_extraction.py - -from datasets import load_dataset -import google.generativeai as genai -import csv -import time -import os -from dotenv import load_dotenv - -load_dotenv() -gemini_api_key = os.getenv("GEMINI_API_KEY") - -print("Loading GSM8K dataset...") -dataset = load_dataset("gsm8k", "main", split="train") -subset = dataset.select(range(200)) # First 200 entries - -genai.configure(api_key=gemini_api_key) -model = genai.GenerativeModel("gemini-1.5-flash") - -unique_concepts = set() - -print("Sending prompts to Gemini Flash...") - -for idx, entry in enumerate(subset): - question = entry["question"] - - prompt = ( - f"Problem: {question}\n" - "Task: List the prerequisite concepts or skills that a student must understand to solve this problem.\n" - "Provide the concepts in the correct learning order, starting from the most basic to the most advanced.\n" - "Respond with a comma-separated list like: concept1, concept2, concept3" - ) - - try: - response = model.generate_content(prompt) - prerequisites = response.text.strip() - - # Split the response by commas and clean each concept - concepts = [c.strip().title() for c in prerequisites.split(',') if c.strip()] - unique_concepts.update(concepts) - - except Exception as e: - print(f"[{idx + 1}/200] ERROR: {str(e)}") - continue - - print(f"[{idx + 1}/200] Processed") - time.sleep(1) # To avoid API rate limits - -output_file = "gsm8k_unique_concepts.csv" -print(f"Saving {len(unique_concepts)} unique concepts to {output_file}...") - -with open(output_file, mode="w", newline='', encoding="utf-8") as f: - writer = csv.writer(f) - writer.writerow(["Concept"]) - for concept in sorted(unique_concepts): - writer.writerow([concept]) - -print("Done. File saved successfully.") diff --git a/project-lambda/gsm8k_prerequisite.py b/project-lambda/gsm8k_prerequisite.py deleted file mode 100644 index 33572fdb4..000000000 --- a/project-lambda/gsm8k_prerequisite.py +++ /dev/null @@ -1,70 +0,0 @@ - -from datasets import load_dataset -import google.generativeai as genai -import csv -import time -import os -from dotenv import load_dotenv - - -load_dotenv() - -gemini_api_key = os.getenv("GEMINI_API_KEY") - -#Load GSM8K dataset -print("Loading GSM8K dataset...") -dataset = load_dataset("gsm8k", "main", split="train") - -# Select 200 questions -subset = dataset.select(range(200)) - - -genai.configure(api_key=gemini_api_key) - -model = genai.GenerativeModel("gemini-1.5-flash") - -# Prepare a list to store the question and its ordered prerequisites -results = [] - -print("Sending prompts to Gemini Flash...") - -#Iterate over each question and get ordered prerequisite concepts -for idx, entry in enumerate(subset): - question = entry["question"] - - # structured prompt asking for ordered prerequisite knowledge - prompt = ( - f"Problem: {question}\n" - "Task: List the prerequisite concepts or skills that a student must understand to solve this problem.\n" - "Provide the concepts in the correct learning order, starting from the most basic to the most advanced.\n" - "Respond with a comma-separated list like: concept1, concept2, concept3" - ) - - try: - response = model.generate_content(prompt) - prerequisites = response.text.strip() - - except Exception as e: - prerequisites = f"ERROR: {str(e)}" - - results.append({ - "question": question, - "prerequisites": prerequisites - }) - - # Print progress - print(f"[{idx + 1}/200] Processed") - - # Delay to avoid hitting API rate limits - time.sleep(1) - -#CSV generation -output_file = "gsm8k_ordered_prerequisites.csv" -print(f"Saving results to {output_file}...") - -with open(output_file, mode="w", newline='', encoding="utf-8") as f: - writer = csv.DictWriter(f, fieldnames=["question", "prerequisites"]) - writer.writeheader() - writer.writerows(results) - -print("Done. File saved successfully.") diff --git a/project-lambda/gsm8k_unique_concepts.csv b/project-lambda/gsm8k_unique_concepts.csv deleted file mode 100644 index 7cb8bd918..000000000 --- a/project-lambda/gsm8k_unique_concepts.csv +++ /dev/null @@ -1,219 +0,0 @@ -Concept -Times As Old As -Twice As Old As -Addition -Addition And Subtraction Of Integers -Addition And Subtraction Of Time -Addition Of Fractions -Addition Of Fractions With Different Denominators -Addition Of Multiple-Digit Numbers -Addition Of Single-Digit Numbers -Addition Of Whole Numbers -Addition With Carrying (Optional Depending On The Student'S Skill Level) -Age Calculation -And Applying Multiple Steps In A Word Problem -Application Of Arithmetic Operations In Real-World Scenarios -Application Of Unit Rates -Applying A Given Formula To A Word Problem -Applying Discounts -Applying Multiple Steps In A Calculation -Applying Multiplication To Solve Word Problems -Applying Percentages To A Base Value -Applying The Formula Distance = Speed Γ— Time -Area Of A Rectangle -Arithmetic Operations (Addition -Arithmetic Sequences -Basic Addition -Basic Addition And Subtraction -Basic Arithmetic -Basic Arithmetic (Addition -Basic Arithmetic Operations (Addition -Basic Division -Basic Multiplication -Basic Subtraction -Calculating A Percentage Of A Number -Calculating Average Speed -Calculating Averages -Calculating Averages (Mean) -Calculating Hourly Rates -Calculating Overtime Pay -Calculating Percentage Increase -Calculating Percentage Of A Number -Calculating Percentages -Calculating Percentages Of A Number -Calculating Percentages Of A Whole Number -Calculating Time From Rate And Distance (Or In This Case -Combining Quantities With Different Units. -Comparing Numbers Using Greater Than/Less Than -Comparison Of Numbers -Compound Growth -Concept Of Speed And Distance -Conversion Between Units Of Length (Feet To Inches) -Converting Fractions To Minutes -Converting Units (Dollars To Cents) -Converting Units (Minutes To Hours) -Counting -Counting And Basic Addition -Counting And Number Recognition -Counting And Place Value -Counting Objects -Counting Whole Numbers -Decimal Multiplication -Decimal Numbers -Decimal Representation Of Money -Decimal Representation Of Percentages -Division -Division By Whole Numbers -Division -Feet -Finding A Fraction Of A Quantity -Finding A Fraction Of A Whole Number -Forming And Solving Equations With One Unknown -Forming And Solving Simple Equations -Fraction Addition And Subtraction -Fraction Multiplication -Fraction Of A Quantity -Fractions -Fractions (Specifically Halves And Quarters) -Fractions (Specifically Halves) -Fractions Of A Whole Number -Geometric Sequence/Exponential Growth -Geometric Sequences -Hours -Interpreting Word Problems -Monetary Units (Cents And Dollars) -Money Calculations -Multi-Step Problem Solving -Multi-Step Word Problems -Multiplication -Multiplication And Division By 2 (Halving) -Multiplication And Division Of Integers -Multiplication By A Fraction -Multiplication By A Whole Number -Multiplication By Fractions -Multiplication Of Decimals -Multiplication Of Fractions -Multiplication Of Fractions And Whole Numbers -Multiplication Of Fractions By Whole Numbers -Multiplication Of Whole Numbers -Multiplication With Carrying -Multiplication With Decimals -Multiplication With Larger Numbers -Multiplication Word Problems -Multiplication -Next Year'S Age -Number Of Days In A Week -Number Of Weeks In A Year -Number Patterns -Number Recognition -Order Of Operations -Percentage -Percentage Calculation -Percentage Calculations -Percentages -Problem Solving (Word Problems) -Problem Solving Involving Multiple Steps -Problem Solving/Applying Math To Real-World Situations -Problem-Solving Using Multiple Steps -Profit Calculation (Revenue - Cost) -Proportion -Proportional Reasoning -Proportions -Rate -Rate And Data Size) -Ratio -Ratio And Proportion -Ratios -Reading Comprehension -Remainders -Rounding Up To The Nearest Whole Number -Sentences) -Simple Interest Calculation -Simplifying Ratios -Solving Algebraic Equations -Solving Equations -Solving Equations With One Variable -Solving For An Unknown In A Proportion -Solving Linear Equations -Solving Multi-Step Equations -Solving Multi-Step Word Problems -Solving One-Step Equations -Solving Proportions -Solving Simple Algebraic Equations -Solving Simple Equations -Solving Simultaneous Equations (Or A Logical Approach To Subtracting Overlapping Percentages). -Solving Word Problems -Solving Word Problems Involving Multiple Steps -Solving Word Problems Involving Subtraction -Solving Word Problems With Multiple Steps -Subtraction -Subtraction Of Fractions -Subtraction Of Whole Numbers -Subtraction) -Telling Time (Minutes And Hours) -Time Conversion (Minutes To Hours) -Time Units And Conversions -Time Units Conversion -Translating Word Problems Into Algebraic Equations -Translating Word Problems Into Algebraic Expressions -Translating Word Problems Into Equations -Translating Word Problems Into Mathematical Equations -Two-Step Problem Solving -Two-Step Word Problem Solving -Two-Step Word Problems -Understanding Averages -Understanding Comparative Statements (E.G. -Understanding Comparison Sentences (More Than/Less Than) -Understanding Fractions -Understanding Half -Understanding Numbers -"Understanding Of ""Twice As Frequently"" And ""One-Third The Frequency""" -"Understanding Of ""Twice""" -Understanding Of A Year'S Duration (Days In A Year) -Understanding Of Age -"Understanding Of Comparative Statements (""Half Of"")." -Understanding Of Fractions -Understanding Of Fractions (Specifically Halves) -Understanding Of Installments And Down Payments -Understanding Of Overlapping Sets (Or Venn Diagrams Conceptually) -Understanding Of Percentages -Understanding Of Time Units (Minutes -Understanding Of Units -Understanding Of Units (Minutes -Understanding Of Whole Numbers -Understanding Of Word Problems -Understanding Percentages -Understanding Rates (Speed Of Work). -Understanding Rates (Speed) -Understanding Remainders -"Understanding The Meaning Of ""Half Of""" -"Understanding The Meaning Of ""Twice As Many""" -Understanding Time Units (Minutes -Understanding Units Of Measurement (Cups And Teaspoons) -Understanding Whole Numbers -Understanding Word Problems -Unit Conversion -Unit Conversion (Days To Weeks) -Unit Conversion (Grams To Kilograms) -Unit Conversion (Liters To Milliliters) -Unit Conversion (Minutes To Hours) -Unit Conversion (Months To Years) -Unit Rates -Units Conversion (Miles To Hours) -Units Of Length (Inches -Units Of Measurement -Units Of Time (Minutes -Volume Calculation -Whole Number Addition -Whole Number Addition And Subtraction -Whole Number Arithmetic -Whole Number Division -Whole Number Multiplication -Whole Number Subtraction -Whole Numbers -Whole-Number Addition -Word Problem Comprehension -Word Problem Interpretation -Word Problem Solving -Word Problem Translation -Working With Fractions diff --git a/recommendation_engine.py b/recommendation_engine.py deleted file mode 100644 index bae57537b..000000000 --- a/recommendation_engine.py +++ /dev/null @@ -1,60 +0,0 @@ -import json -import heapq - - -def load_graph(graph_path): - with open(graph_path, 'r') as f: - graph_data = json.load(f) - - graph = {} - for link in graph_data["links"]: - src = link["source"] - tgt = link["target"] - if src not in graph: - graph[src] = [] - graph[src].append(tgt) - return graph - - -def dijkstra_recommendation(graph, start_concepts, weak_concepts, target="Sorting Algorithms"): - # Each weak concept adds a higher "cost" to traversal - visited = set() - heap = [] - - for concept in start_concepts: - heapq.heappush(heap, (0, [concept])) # (cost, path) - - while heap: - cost, path = heapq.heappop(heap) - current = path[-1] - - if current == target: - return {"path": path, "cost": cost} - - if current in visited: - continue - - visited.add(current) - - for neighbor in graph.get(current, []): - edge_cost = 5 if neighbor in weak_concepts else 1 - heapq.heappush(heap, (cost + edge_cost, path + [neighbor])) - - return {"path": [], "cost": float('inf')} -if __name__ == "__main__": - concept_graph_path = "concept_graph_full.json" - learner_profile = { - "learner_id": "L001", - "mastered_concepts": ["Computation", "Algorithms"], - "weak_concepts": ["Problem Solving"] - } - - graph = load_graph(concept_graph_path) - result = dijkstra_recommendation( - graph, - start_concepts=learner_profile["mastered_concepts"], - weak_concepts=learner_profile["weak_concepts"] - ) - - print("Recommended Path:", result["path"]) - print("Total Cost:", result["cost"]) diff --git a/recommendations_L001.json b/recommendations_L001.json deleted file mode 100644 index 749da0b25..000000000 --- a/recommendations_L001.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "learner_id": "L001", - "recommended_concepts": [ - "Problem Solving" - ] -} \ No newline at end of file diff --git a/recommendations_L002.json b/recommendations_L002.json deleted file mode 100644 index 3f448d8b5..000000000 --- a/recommendations_L002.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "learner_id": "L002", - "recommended_concepts": [ - "Algorithms" - ] -} \ No newline at end of file diff --git a/server.js b/server.js deleted file mode 100644 index 8155a2543..000000000 --- a/server.js +++ /dev/null @@ -1,14 +0,0 @@ -const express = require('express'); -const fs = require('fs'); -const cors = require('cors'); -const app = express(); -const PORT = 5000; - -app.use(cors()); - -app.get('/api/lectures', (req, res) => { - const data = fs.readFileSync('lectures.json', 'utf-8'); - res.json(JSON.parse(data)); -}); - -app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`)); diff --git a/server/package-lock.json b/server/package-lock.json deleted file mode 100644 index 208245bab..000000000 --- a/server/package-lock.json +++ /dev/null @@ -1,1705 +0,0 @@ -{ - "name": "server", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "server", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "cors": "^2.8.5", - "express": "^5.1.0" - }, - "devDependencies": { - "@types/body-parser": "^1.19.6", - "@types/cors": "^2.8.19", - "@types/express": "^5.0.3", - "@types/node": "^24.0.1", - "ts-node-dev": "^2.0.0", - "typescript": "^5.8.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", - "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.1.tgz", - "integrity": "sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node-dev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", - "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.1", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^10.4.0", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" - }, - "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "node-notifier": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/server/package.json b/server/package.json deleted file mode 100644 index c5f662ba8..000000000 --- a/server/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "server", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node dist/app.js", - "dev": "ts-node-dev --respawn --transpile-only src/app.ts", - "build": "tsc", - "test": "jest", - "watch": "tsc -w" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", - "dependencies": { - "cors": "^2.8.5", - "express": "^5.1.0" - }, - "devDependencies": { - "@types/body-parser": "^1.19.6", - "@types/cors": "^2.8.19", - "@types/express": "^5.0.3", - "@types/node": "^24.0.1", - "ts-node-dev": "^2.0.0", - "typescript": "^5.8.3" - } -} diff --git a/server/src/app.ts b/server/src/app.ts deleted file mode 100644 index 97ea80337..000000000 --- a/server/src/app.ts +++ /dev/null @@ -1,19 +0,0 @@ -// src/app.ts - -import express from "express"; -import bodyParser from "body-parser"; -import learningPathRoutes from "./routes/learningPath"; -import cors from 'cors'; -// frontend port - - -const app = express(); -const PORT = 3000; - -app.use(bodyParser.json()); -app.use("/api", learningPathRoutes); - -app.listen(PORT, () => { - console.log(`Server running on http://localhost:${PORT}`); -}); -app.use(cors({ origin: 'http://localhost:5173' })); diff --git a/team-bhavitha-dsarecommender/MIT_OCW_Scraper/extract_topics.py b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/extract_topics.py new file mode 100644 index 000000000..a93fa0b17 --- /dev/null +++ b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/extract_topics.py @@ -0,0 +1,46 @@ +import fitz # PyMuPDF +import os +import json + +# Step 1: Topics to search for +topics = ["Loops", "Algorithms", "Conditionals", "Variables", "Functions", "Recursion", "Branching", "Expressions", "Computation"] + +# Step 2: Extract text from PDF +def extract_text(pdf_path): + text = "" + doc = fitz.open(pdf_path) + for page in doc: + text += page.get_text() + return text.strip() + +# Step 3: Match text with topics +def find_topics(text): + found = [] + for topic in topics: + if topic.lower() in text.lower(): + found.append(topic) + return found + +# Step 4: Main script +def main(): + pdf_path = "mit_pdfs/lecture_01.pdf" + raw_text = extract_text(pdf_path) + + # Save raw text + os.makedirs("raw_text", exist_ok=True) + with open("raw_text/lecture_01_raw.txt", "w", encoding="utf-8") as f: + f.write(raw_text) + + # Find matched topics + matched_topics = find_topics(raw_text) + + # Save concept JSON + os.makedirs("json_output", exist_ok=True) + data = [{"title": topic, "content": raw_text} for topic in matched_topics] + with open("json_output/lecture_01_concepts.json", "w", encoding="utf-8") as f: + json.dump(data, f, indent=2) + + print("βœ… Lecture 1 processed and saved!") + +if __name__ == "__main__": + main() diff --git a/team-bhavitha-dsarecommender/MIT_OCW_Scraper/json_output/lecture_01_concepts.json b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/json_output/lecture_01_concepts.json new file mode 100644 index 000000000..ff9747c88 --- /dev/null +++ b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/json_output/lecture_01_concepts.json @@ -0,0 +1,22 @@ +[ + { + "title": "Algorithms", + "content": "WELCOME!\n(download slides and .py files and follow along!)\n6.0001 LECTURE 1\n1\n6.0001 LECTURE 1\nTODAY\n\uf0a7course info\n\uf0a7what is computation\n\uf0a7python basics\n\uf0a7mathematical operations\n\uf0a7python variables and types\n\uf0a7NOTE: slides and code files up before each lecture\no highly encourage you to download them before lecture\no take notes and run code files when I do\no bring computers to answer in-class practice exercises!\n2\n6.0001 LECTURE 1\nCOURSE INFO\n\uf0a7Grading\n\u25e6approx. 20% Quiz\n\u25e6approx. 40% Final \n\u25e6approx. 30% Problem Sets \n\u25e6approx. 10% MITx Finger Exercises\n3\n6.0001 LECTURE 1\nCOURSE POLICIES\n\uf0a7Collaboration\n\u25e6may collaborate with anyone\n\u25e6required to write code independently and write names of \nall collaborators on submission\n\u25e6we will be running a code similarity program on all psets\n\uf0a7Extensions\n\u25e6no extensions\n\u25e6late days, see course website for details\n\u25e6drop and roll weight of max two psets in final exam grade\n\u25e6should be EMERGENCY use only\n4\n6.0001 LECTURE 1\nRECITATIONS\n\uf0a7not mandatory\n\uf0a7two flavors\n1) Lecture review: review lecture material \no if you missed lecture \no if you need a different take on the same concepts\n2) Problem solving: teach you how to solve programming \nproblems\no useful if you don\u2019t know how to set up pseudocode from pset words \no we show a couple of harder questions\no walk you through how to approach solving the problem\no brainstorm code solution along with the recitation instructor\no will post solutions after\n6.0001 LECTURE 1\n5\nFAST PACED COURSE\n\uf0a7Position yourself to succeed!\n\u25e6read psets when they come out and come back to them later\n\u25e6use late days in emergency situations\n\uf0a7New to programming? PRACTICE. PRACTICE? PRACTICE! \n\u25e6can\u2019t passively absorb programming as a skill\n\u25e6download code before lecture and follow along\n\u25e6do MITx finger exercises \n\u25e6don\u2019t be afraid to try out Python commands! \n6\n6.0001 LECTURE 1\nPRACTICE\n7\n6.0001 LECTURE 1\nPROBLEM \nSOLVING\nPROGRAMMING \nSKILL\nKNOWLEDGE \nOF CONCEPTS\nTOPICS\n\uf0a7represent knowledge with data structures\n\uf0a7iteration and recursion as computational metaphors\n\uf0a7abstraction of procedures and data types\n\uf0a7organize and modularize systems using object classes \nand methods\n\uf0a7different classes of algorithms, searching and sorting\n\uf0a7complexity of algorithms\n6.0001 LECTURE 1\n8\nWHAT DOES A COMPUTER DO\n\uf0a7Fundamentally:\n\u25e6performs calculations\na billion calculations per second!\n\u25e6remembers results\n100s of gigabytes of storage!\n\uf0a7What kinds of calculations?\n\u25e6built-in to the language\n\u25e6ones that you define as the programmer\n\uf0a7computers only know what you tell them\n6.0001 LECTURE 1\n9\nTYPES OF KNOWLEDGE\n\uf0a7declarative knowledge is statements of fact. \n\u25e6someone will win a Google \nCardboard before class ends\n\uf0a7imperative knowledge is a recipe or \u201chow-to\u201d. \n1) Students sign up for raffle\n2) Ana opens her IDE\n3) Ana chooses a random number between 1st and nth responder\n4) Ana finds the number in the responders sheet. Winner!\n6.0001 LECTURE 1\n10\nA NUMERICAL EXAMPLE\n\uf0a7square root of a number x is y such that y*y = x\n\uf0a7recipe for deducing square root of a number x (16)\n1) Start with a guess, g\n2) If g*g is close enough to x, stop and say g is the \nanswer \n3) Otherwise make a new guess by averaging g and x/g\n4) Using the new guess, repeat process until close enough\n6.0001 LECTURE 1\n11\ng\ng*g\nx/g\n(g+x/g)/2\n3\n9\n16/3\n4.17\n4.17\n17.36\n3.837\n4.0035\n4.0035\n16.0277\n3.997\n4.000002\nWHAT IS A RECIPE\n1)\nsequence of simple steps\n2)\nflow of control process that specifies when each \nstep is executed\n3)\na means of determining when to stop\n1+2+3 = an algorithm!\n6.0001 LECTURE 1\n12\nCOMPUTERS ARE MACHINES\n\uf0a7how to capture a recipe in a mechanical process\n\uf0a7fixed program computer\n\u25e6calculator\n\uf0a7stored program computer\n\u25e6machine stores and executes instructions\n6.0001 LECTURE 1\n13\nBASIC MACHINE ARCHITECTURE\n6.0001 LECTURE 1\n14\nMEMORY\nCONTROL \nUNIT\nARITHMETIC \nLOGIC UNIT\nINPUT\nOUTPUT\nprogram counter\ndo primitive ops\nSTORED PROGRAM COMPUTER\n\uf0a7sequence of instructions stored inside computer\n\u25e6built from predefined set of primitive instructions\n1)\narithmetic and logic\n2)\nsimple tests\n3)\nmoving data\n\uf0a7special program (interpreter) executes each \ninstruction in order\n\u25e6use tests to change flow of control through sequence\n\u25e6stop when done\n6.0001 LECTURE 1\n15\nBASIC PRIMITIVES\n\uf0a7Turing showed that you can compute anything using 6 \nprimitives\n\uf0a7modern programming languages have more \nconvenient set of primitives\n\uf0a7can abstract methods to create new primitives\n\uf0a7anything computable in one language is computable in \nany other programming language\n6.0001 LECTURE 1\n16\nCREATING RECIPES\n\uf0a7a programming language provides a set of primitive \noperations\n\uf0a7expressions are complex but legal combinations of \nprimitives in a programming language\n\uf0a7expressions and computations have values and \nmeanings in a programming language\n6.0001 LECTURE 1\n17\nASPECTS OF LANGUAGES\n\uf0a7primitive constructs\n\u25e6English: words\n\u25e6programming language: numbers, strings, simple \noperators\n6.0001 LECTURE 1\n18\nWord Cloud copyright Michael Twardos, All Right Reserved. This content is excluded from our\nCreative Commons license. For more information, see https://ocw.mit.edu/help/faq-fair-use/.\nWord Cloud copyright unknown, All Right Reserved.\nThis content is excluded from our Creative\nCommons license. For more information, see\nhttps://ocw.mit.edu/help/faq-fair-use/.\nASPECTS OF LANGUAGES\n\uf0a7syntax\n\u25e6English: \"cat dog boy\" \uf0e0not syntactically valid\n\"cat hugs boy\" \uf0e0syntactically valid\n\u25e6programming language: \"hi\"5 \uf0e0not syntactically valid\n3.2*5 \uf0e0syntactically valid\n6.0001 LECTURE 1\n19\nASPECTS OF LANGUAGES\n\uf0a7static semantics is which syntactically valid strings \nhave meaning\n\u25e6English: \"I are hungry\" \uf0e0syntactically valid\nbut static semantic error\n\u25e6programming language: 3.2*5\n\uf0e0syntactically valid\n3+\"hi\" \uf0e0static semantic error\n6.0001 LECTURE 1\n20\nASPECTS OF LANGUAGES\n\uf0a7semantics is the meaning associated with a \nsyntactically correct string of symbols with no static \nsemantic errors\n\u25e6English: can have many meanings \"Flying planes \ncan be dangerous\"\n\u25e6programming languages: have only one meaning but may \nnot be what programmer intended\n6.0001 LECTURE 1\n21\nWHERE THINGS GO WRONG\n\uf0a7syntactic errors\n\u25e6common and easily caught\n\uf0a7static semantic errors\n\u25e6some languages check for these before running program\n\u25e6can cause unpredictable behavior\n\uf0a7no semantic errors but different meaning than what \nprogrammer intended\n\u25e6program crashes, stops running\n\u25e6program runs forever\n\u25e6program gives an answer but different than expected\n6.0001 LECTURE 1\n22\nPYTHON PROGRAMS\n\uf0a7a program is a sequence of definitions and commands\n\u25e6definitions evaluated \n\u25e6commands executed by Python interpreter in a shell\n\uf0a7commands (statements) instruct interpreter to do \nsomething\n\uf0a7can be typed directly in a shell or stored in a file that \nis read into the shell and evaluated\n\u25e6Problem Set 0 will introduce you to these in Anaconda\n6.0001 LECTURE 1\n23\nOBJECTS\n\uf0a7programs manipulate data objects\n\uf0a7objects have a type that defines the kinds of things \nprograms can do to them\n\u25e6Ana is a human so she can walk, speak English, etc.\n\u25e6Chewbacca is a wookie so he can walk, \u201cmwaaarhrhh\u201d, etc.\n\uf0a7objects are\n\u25e6scalar (cannot be subdivided)\n\u25e6non-scalar (have internal structure that can be accessed)\n6.0001 LECTURE 1\n24\nSCALAR OBJECTS\n\uf0a7int \u2013 represent integers, ex. 5\n\uf0a7float \u2013 represent real numbers, ex. 3.27\n\uf0a7bool \u2013 represent Boolean values True and False\n\uf0a7NoneType \u2013 special and has one value, None\n\uf0a7can use type() to see the type of an object\n>>> type(5)\nint\n>>> type(3.0)\nfloat\n6.0001 LECTURE 1\n25\nTYPE CONVERSIONS (CAST)\n\uf0a7can convert object of one type to another\n\uf0a7float(3) converts integer 3 to float 3.0\n\uf0a7int(3.9) truncates float 3.9 to integer 3\n6.0001 LECTURE 1\n26\nPRINTING TO CONSOLE\n\uf0a7to show output from code to a user, use print\ncommand\nIn [11]: 3+2\nOut[11]: 5\nIn [12]: print(3+2)\n5\n6.0001 LECTURE 1\n27\nEXPRESSIONS\n\uf0a7combine objects and operators to form expressions\n\uf0a7an expression has a value, which has a type\n\uf0a7syntax for a simple expression\n \n6.0001 LECTURE 1\n28\nOPERATORS ON ints and floats\n\uf0a7i+j\n\uf0e0the sum\n\uf0a7i-j\n\uf0e0the difference\n\uf0a7i*j\n\uf0e0the product\n\uf0a7i/j\n\uf0e0division\n\uf0a7i%j\n\uf0e0the remainder when i is divided by j\n\uf0a7i**j \uf0e0i to the power of j\n6.0001 LECTURE 1\n29\nif both are ints, result is int\nif either or both are floats, result is float\nresult is float\nSIMPLE OPERATIONS\n\uf0a7parentheses used to tell Python to do these \noperations first\n\uf0a7operator precedence without parentheses\n\u25e6**\n\u25e6*\n\u25e6/\n\u25e6+ and \u2013 executed left to right, as appear in expression\n6.0001 LECTURE 1\n30\nBINDING VARIABLES AND \nVALUES\n\uf0a7equal sign is an assignment of a value to a variable \nname\npi = 3.14159\npi_approx = 22/7\n\uf0a7value stored in computer memory\n\uf0a7an assignment binds name to value\n\uf0a7retrieve value associated with name or variable by \ninvoking the name, by typing pi\n6.0001 LECTURE 1\n31\nABSTRACTING EXPRESSIONS\n\uf0a7why give names to values of expressions?\n\uf0a7to reuse names instead of values\n\uf0a7easier to change code later\npi = 3.14159\nradius = 2.2\narea = pi*(radius**2)\n6.0001 LECTURE 1\n32\nPROGRAMMING vs MATH\n\uf0a7in programming, you do not \u201csolve for x\u201d\npi = 3.14159\nradius = 2.2\n# area of circle\narea = pi*(radius**2)\nradius = radius+1\n6.0001 LECTURE 1\n33\nCHANGING BINDINGS\n\uf0a7can re-bind variable names using new assignment \nstatements\n\uf0a7previous value may still stored in memory but lost the \nhandle for it\n\uf0a7value for area does not change until you tell the \ncomputer to do the calculation again\n6.0001 LECTURE 1\n34\npi\nradius\narea\n3.14\n2.2\n15.1976\n3.2\npi = 3.14\nradius = 2.2\narea = pi*(radius**2)\nradius = radius+1\nMIT OpenCourseWare\nhttps://ocw.mit.edu\n6.0001 Introduction to Computer Science and Programming in Python\nFall 2016\nFor information about citing these materials or our Terms of Use, visit: https://ocw.mit.edu/terms." + }, + { + "title": "Variables", + "content": "WELCOME!\n(download slides and .py files and follow along!)\n6.0001 LECTURE 1\n1\n6.0001 LECTURE 1\nTODAY\n\uf0a7course info\n\uf0a7what is computation\n\uf0a7python basics\n\uf0a7mathematical operations\n\uf0a7python variables and types\n\uf0a7NOTE: slides and code files up before each lecture\no highly encourage you to download them before lecture\no take notes and run code files when I do\no bring computers to answer in-class practice exercises!\n2\n6.0001 LECTURE 1\nCOURSE INFO\n\uf0a7Grading\n\u25e6approx. 20% Quiz\n\u25e6approx. 40% Final \n\u25e6approx. 30% Problem Sets \n\u25e6approx. 10% MITx Finger Exercises\n3\n6.0001 LECTURE 1\nCOURSE POLICIES\n\uf0a7Collaboration\n\u25e6may collaborate with anyone\n\u25e6required to write code independently and write names of \nall collaborators on submission\n\u25e6we will be running a code similarity program on all psets\n\uf0a7Extensions\n\u25e6no extensions\n\u25e6late days, see course website for details\n\u25e6drop and roll weight of max two psets in final exam grade\n\u25e6should be EMERGENCY use only\n4\n6.0001 LECTURE 1\nRECITATIONS\n\uf0a7not mandatory\n\uf0a7two flavors\n1) Lecture review: review lecture material \no if you missed lecture \no if you need a different take on the same concepts\n2) Problem solving: teach you how to solve programming \nproblems\no useful if you don\u2019t know how to set up pseudocode from pset words \no we show a couple of harder questions\no walk you through how to approach solving the problem\no brainstorm code solution along with the recitation instructor\no will post solutions after\n6.0001 LECTURE 1\n5\nFAST PACED COURSE\n\uf0a7Position yourself to succeed!\n\u25e6read psets when they come out and come back to them later\n\u25e6use late days in emergency situations\n\uf0a7New to programming? PRACTICE. PRACTICE? PRACTICE! \n\u25e6can\u2019t passively absorb programming as a skill\n\u25e6download code before lecture and follow along\n\u25e6do MITx finger exercises \n\u25e6don\u2019t be afraid to try out Python commands! \n6\n6.0001 LECTURE 1\nPRACTICE\n7\n6.0001 LECTURE 1\nPROBLEM \nSOLVING\nPROGRAMMING \nSKILL\nKNOWLEDGE \nOF CONCEPTS\nTOPICS\n\uf0a7represent knowledge with data structures\n\uf0a7iteration and recursion as computational metaphors\n\uf0a7abstraction of procedures and data types\n\uf0a7organize and modularize systems using object classes \nand methods\n\uf0a7different classes of algorithms, searching and sorting\n\uf0a7complexity of algorithms\n6.0001 LECTURE 1\n8\nWHAT DOES A COMPUTER DO\n\uf0a7Fundamentally:\n\u25e6performs calculations\na billion calculations per second!\n\u25e6remembers results\n100s of gigabytes of storage!\n\uf0a7What kinds of calculations?\n\u25e6built-in to the language\n\u25e6ones that you define as the programmer\n\uf0a7computers only know what you tell them\n6.0001 LECTURE 1\n9\nTYPES OF KNOWLEDGE\n\uf0a7declarative knowledge is statements of fact. \n\u25e6someone will win a Google \nCardboard before class ends\n\uf0a7imperative knowledge is a recipe or \u201chow-to\u201d. \n1) Students sign up for raffle\n2) Ana opens her IDE\n3) Ana chooses a random number between 1st and nth responder\n4) Ana finds the number in the responders sheet. Winner!\n6.0001 LECTURE 1\n10\nA NUMERICAL EXAMPLE\n\uf0a7square root of a number x is y such that y*y = x\n\uf0a7recipe for deducing square root of a number x (16)\n1) Start with a guess, g\n2) If g*g is close enough to x, stop and say g is the \nanswer \n3) Otherwise make a new guess by averaging g and x/g\n4) Using the new guess, repeat process until close enough\n6.0001 LECTURE 1\n11\ng\ng*g\nx/g\n(g+x/g)/2\n3\n9\n16/3\n4.17\n4.17\n17.36\n3.837\n4.0035\n4.0035\n16.0277\n3.997\n4.000002\nWHAT IS A RECIPE\n1)\nsequence of simple steps\n2)\nflow of control process that specifies when each \nstep is executed\n3)\na means of determining when to stop\n1+2+3 = an algorithm!\n6.0001 LECTURE 1\n12\nCOMPUTERS ARE MACHINES\n\uf0a7how to capture a recipe in a mechanical process\n\uf0a7fixed program computer\n\u25e6calculator\n\uf0a7stored program computer\n\u25e6machine stores and executes instructions\n6.0001 LECTURE 1\n13\nBASIC MACHINE ARCHITECTURE\n6.0001 LECTURE 1\n14\nMEMORY\nCONTROL \nUNIT\nARITHMETIC \nLOGIC UNIT\nINPUT\nOUTPUT\nprogram counter\ndo primitive ops\nSTORED PROGRAM COMPUTER\n\uf0a7sequence of instructions stored inside computer\n\u25e6built from predefined set of primitive instructions\n1)\narithmetic and logic\n2)\nsimple tests\n3)\nmoving data\n\uf0a7special program (interpreter) executes each \ninstruction in order\n\u25e6use tests to change flow of control through sequence\n\u25e6stop when done\n6.0001 LECTURE 1\n15\nBASIC PRIMITIVES\n\uf0a7Turing showed that you can compute anything using 6 \nprimitives\n\uf0a7modern programming languages have more \nconvenient set of primitives\n\uf0a7can abstract methods to create new primitives\n\uf0a7anything computable in one language is computable in \nany other programming language\n6.0001 LECTURE 1\n16\nCREATING RECIPES\n\uf0a7a programming language provides a set of primitive \noperations\n\uf0a7expressions are complex but legal combinations of \nprimitives in a programming language\n\uf0a7expressions and computations have values and \nmeanings in a programming language\n6.0001 LECTURE 1\n17\nASPECTS OF LANGUAGES\n\uf0a7primitive constructs\n\u25e6English: words\n\u25e6programming language: numbers, strings, simple \noperators\n6.0001 LECTURE 1\n18\nWord Cloud copyright Michael Twardos, All Right Reserved. This content is excluded from our\nCreative Commons license. For more information, see https://ocw.mit.edu/help/faq-fair-use/.\nWord Cloud copyright unknown, All Right Reserved.\nThis content is excluded from our Creative\nCommons license. For more information, see\nhttps://ocw.mit.edu/help/faq-fair-use/.\nASPECTS OF LANGUAGES\n\uf0a7syntax\n\u25e6English: \"cat dog boy\" \uf0e0not syntactically valid\n\"cat hugs boy\" \uf0e0syntactically valid\n\u25e6programming language: \"hi\"5 \uf0e0not syntactically valid\n3.2*5 \uf0e0syntactically valid\n6.0001 LECTURE 1\n19\nASPECTS OF LANGUAGES\n\uf0a7static semantics is which syntactically valid strings \nhave meaning\n\u25e6English: \"I are hungry\" \uf0e0syntactically valid\nbut static semantic error\n\u25e6programming language: 3.2*5\n\uf0e0syntactically valid\n3+\"hi\" \uf0e0static semantic error\n6.0001 LECTURE 1\n20\nASPECTS OF LANGUAGES\n\uf0a7semantics is the meaning associated with a \nsyntactically correct string of symbols with no static \nsemantic errors\n\u25e6English: can have many meanings \"Flying planes \ncan be dangerous\"\n\u25e6programming languages: have only one meaning but may \nnot be what programmer intended\n6.0001 LECTURE 1\n21\nWHERE THINGS GO WRONG\n\uf0a7syntactic errors\n\u25e6common and easily caught\n\uf0a7static semantic errors\n\u25e6some languages check for these before running program\n\u25e6can cause unpredictable behavior\n\uf0a7no semantic errors but different meaning than what \nprogrammer intended\n\u25e6program crashes, stops running\n\u25e6program runs forever\n\u25e6program gives an answer but different than expected\n6.0001 LECTURE 1\n22\nPYTHON PROGRAMS\n\uf0a7a program is a sequence of definitions and commands\n\u25e6definitions evaluated \n\u25e6commands executed by Python interpreter in a shell\n\uf0a7commands (statements) instruct interpreter to do \nsomething\n\uf0a7can be typed directly in a shell or stored in a file that \nis read into the shell and evaluated\n\u25e6Problem Set 0 will introduce you to these in Anaconda\n6.0001 LECTURE 1\n23\nOBJECTS\n\uf0a7programs manipulate data objects\n\uf0a7objects have a type that defines the kinds of things \nprograms can do to them\n\u25e6Ana is a human so she can walk, speak English, etc.\n\u25e6Chewbacca is a wookie so he can walk, \u201cmwaaarhrhh\u201d, etc.\n\uf0a7objects are\n\u25e6scalar (cannot be subdivided)\n\u25e6non-scalar (have internal structure that can be accessed)\n6.0001 LECTURE 1\n24\nSCALAR OBJECTS\n\uf0a7int \u2013 represent integers, ex. 5\n\uf0a7float \u2013 represent real numbers, ex. 3.27\n\uf0a7bool \u2013 represent Boolean values True and False\n\uf0a7NoneType \u2013 special and has one value, None\n\uf0a7can use type() to see the type of an object\n>>> type(5)\nint\n>>> type(3.0)\nfloat\n6.0001 LECTURE 1\n25\nTYPE CONVERSIONS (CAST)\n\uf0a7can convert object of one type to another\n\uf0a7float(3) converts integer 3 to float 3.0\n\uf0a7int(3.9) truncates float 3.9 to integer 3\n6.0001 LECTURE 1\n26\nPRINTING TO CONSOLE\n\uf0a7to show output from code to a user, use print\ncommand\nIn [11]: 3+2\nOut[11]: 5\nIn [12]: print(3+2)\n5\n6.0001 LECTURE 1\n27\nEXPRESSIONS\n\uf0a7combine objects and operators to form expressions\n\uf0a7an expression has a value, which has a type\n\uf0a7syntax for a simple expression\n \n6.0001 LECTURE 1\n28\nOPERATORS ON ints and floats\n\uf0a7i+j\n\uf0e0the sum\n\uf0a7i-j\n\uf0e0the difference\n\uf0a7i*j\n\uf0e0the product\n\uf0a7i/j\n\uf0e0division\n\uf0a7i%j\n\uf0e0the remainder when i is divided by j\n\uf0a7i**j \uf0e0i to the power of j\n6.0001 LECTURE 1\n29\nif both are ints, result is int\nif either or both are floats, result is float\nresult is float\nSIMPLE OPERATIONS\n\uf0a7parentheses used to tell Python to do these \noperations first\n\uf0a7operator precedence without parentheses\n\u25e6**\n\u25e6*\n\u25e6/\n\u25e6+ and \u2013 executed left to right, as appear in expression\n6.0001 LECTURE 1\n30\nBINDING VARIABLES AND \nVALUES\n\uf0a7equal sign is an assignment of a value to a variable \nname\npi = 3.14159\npi_approx = 22/7\n\uf0a7value stored in computer memory\n\uf0a7an assignment binds name to value\n\uf0a7retrieve value associated with name or variable by \ninvoking the name, by typing pi\n6.0001 LECTURE 1\n31\nABSTRACTING EXPRESSIONS\n\uf0a7why give names to values of expressions?\n\uf0a7to reuse names instead of values\n\uf0a7easier to change code later\npi = 3.14159\nradius = 2.2\narea = pi*(radius**2)\n6.0001 LECTURE 1\n32\nPROGRAMMING vs MATH\n\uf0a7in programming, you do not \u201csolve for x\u201d\npi = 3.14159\nradius = 2.2\n# area of circle\narea = pi*(radius**2)\nradius = radius+1\n6.0001 LECTURE 1\n33\nCHANGING BINDINGS\n\uf0a7can re-bind variable names using new assignment \nstatements\n\uf0a7previous value may still stored in memory but lost the \nhandle for it\n\uf0a7value for area does not change until you tell the \ncomputer to do the calculation again\n6.0001 LECTURE 1\n34\npi\nradius\narea\n3.14\n2.2\n15.1976\n3.2\npi = 3.14\nradius = 2.2\narea = pi*(radius**2)\nradius = radius+1\nMIT OpenCourseWare\nhttps://ocw.mit.edu\n6.0001 Introduction to Computer Science and Programming in Python\nFall 2016\nFor information about citing these materials or our Terms of Use, visit: https://ocw.mit.edu/terms." + }, + { + "title": "Recursion", + "content": "WELCOME!\n(download slides and .py files and follow along!)\n6.0001 LECTURE 1\n1\n6.0001 LECTURE 1\nTODAY\n\uf0a7course info\n\uf0a7what is computation\n\uf0a7python basics\n\uf0a7mathematical operations\n\uf0a7python variables and types\n\uf0a7NOTE: slides and code files up before each lecture\no highly encourage you to download them before lecture\no take notes and run code files when I do\no bring computers to answer in-class practice exercises!\n2\n6.0001 LECTURE 1\nCOURSE INFO\n\uf0a7Grading\n\u25e6approx. 20% Quiz\n\u25e6approx. 40% Final \n\u25e6approx. 30% Problem Sets \n\u25e6approx. 10% MITx Finger Exercises\n3\n6.0001 LECTURE 1\nCOURSE POLICIES\n\uf0a7Collaboration\n\u25e6may collaborate with anyone\n\u25e6required to write code independently and write names of \nall collaborators on submission\n\u25e6we will be running a code similarity program on all psets\n\uf0a7Extensions\n\u25e6no extensions\n\u25e6late days, see course website for details\n\u25e6drop and roll weight of max two psets in final exam grade\n\u25e6should be EMERGENCY use only\n4\n6.0001 LECTURE 1\nRECITATIONS\n\uf0a7not mandatory\n\uf0a7two flavors\n1) Lecture review: review lecture material \no if you missed lecture \no if you need a different take on the same concepts\n2) Problem solving: teach you how to solve programming \nproblems\no useful if you don\u2019t know how to set up pseudocode from pset words \no we show a couple of harder questions\no walk you through how to approach solving the problem\no brainstorm code solution along with the recitation instructor\no will post solutions after\n6.0001 LECTURE 1\n5\nFAST PACED COURSE\n\uf0a7Position yourself to succeed!\n\u25e6read psets when they come out and come back to them later\n\u25e6use late days in emergency situations\n\uf0a7New to programming? PRACTICE. PRACTICE? PRACTICE! \n\u25e6can\u2019t passively absorb programming as a skill\n\u25e6download code before lecture and follow along\n\u25e6do MITx finger exercises \n\u25e6don\u2019t be afraid to try out Python commands! \n6\n6.0001 LECTURE 1\nPRACTICE\n7\n6.0001 LECTURE 1\nPROBLEM \nSOLVING\nPROGRAMMING \nSKILL\nKNOWLEDGE \nOF CONCEPTS\nTOPICS\n\uf0a7represent knowledge with data structures\n\uf0a7iteration and recursion as computational metaphors\n\uf0a7abstraction of procedures and data types\n\uf0a7organize and modularize systems using object classes \nand methods\n\uf0a7different classes of algorithms, searching and sorting\n\uf0a7complexity of algorithms\n6.0001 LECTURE 1\n8\nWHAT DOES A COMPUTER DO\n\uf0a7Fundamentally:\n\u25e6performs calculations\na billion calculations per second!\n\u25e6remembers results\n100s of gigabytes of storage!\n\uf0a7What kinds of calculations?\n\u25e6built-in to the language\n\u25e6ones that you define as the programmer\n\uf0a7computers only know what you tell them\n6.0001 LECTURE 1\n9\nTYPES OF KNOWLEDGE\n\uf0a7declarative knowledge is statements of fact. \n\u25e6someone will win a Google \nCardboard before class ends\n\uf0a7imperative knowledge is a recipe or \u201chow-to\u201d. \n1) Students sign up for raffle\n2) Ana opens her IDE\n3) Ana chooses a random number between 1st and nth responder\n4) Ana finds the number in the responders sheet. Winner!\n6.0001 LECTURE 1\n10\nA NUMERICAL EXAMPLE\n\uf0a7square root of a number x is y such that y*y = x\n\uf0a7recipe for deducing square root of a number x (16)\n1) Start with a guess, g\n2) If g*g is close enough to x, stop and say g is the \nanswer \n3) Otherwise make a new guess by averaging g and x/g\n4) Using the new guess, repeat process until close enough\n6.0001 LECTURE 1\n11\ng\ng*g\nx/g\n(g+x/g)/2\n3\n9\n16/3\n4.17\n4.17\n17.36\n3.837\n4.0035\n4.0035\n16.0277\n3.997\n4.000002\nWHAT IS A RECIPE\n1)\nsequence of simple steps\n2)\nflow of control process that specifies when each \nstep is executed\n3)\na means of determining when to stop\n1+2+3 = an algorithm!\n6.0001 LECTURE 1\n12\nCOMPUTERS ARE MACHINES\n\uf0a7how to capture a recipe in a mechanical process\n\uf0a7fixed program computer\n\u25e6calculator\n\uf0a7stored program computer\n\u25e6machine stores and executes instructions\n6.0001 LECTURE 1\n13\nBASIC MACHINE ARCHITECTURE\n6.0001 LECTURE 1\n14\nMEMORY\nCONTROL \nUNIT\nARITHMETIC \nLOGIC UNIT\nINPUT\nOUTPUT\nprogram counter\ndo primitive ops\nSTORED PROGRAM COMPUTER\n\uf0a7sequence of instructions stored inside computer\n\u25e6built from predefined set of primitive instructions\n1)\narithmetic and logic\n2)\nsimple tests\n3)\nmoving data\n\uf0a7special program (interpreter) executes each \ninstruction in order\n\u25e6use tests to change flow of control through sequence\n\u25e6stop when done\n6.0001 LECTURE 1\n15\nBASIC PRIMITIVES\n\uf0a7Turing showed that you can compute anything using 6 \nprimitives\n\uf0a7modern programming languages have more \nconvenient set of primitives\n\uf0a7can abstract methods to create new primitives\n\uf0a7anything computable in one language is computable in \nany other programming language\n6.0001 LECTURE 1\n16\nCREATING RECIPES\n\uf0a7a programming language provides a set of primitive \noperations\n\uf0a7expressions are complex but legal combinations of \nprimitives in a programming language\n\uf0a7expressions and computations have values and \nmeanings in a programming language\n6.0001 LECTURE 1\n17\nASPECTS OF LANGUAGES\n\uf0a7primitive constructs\n\u25e6English: words\n\u25e6programming language: numbers, strings, simple \noperators\n6.0001 LECTURE 1\n18\nWord Cloud copyright Michael Twardos, All Right Reserved. This content is excluded from our\nCreative Commons license. For more information, see https://ocw.mit.edu/help/faq-fair-use/.\nWord Cloud copyright unknown, All Right Reserved.\nThis content is excluded from our Creative\nCommons license. For more information, see\nhttps://ocw.mit.edu/help/faq-fair-use/.\nASPECTS OF LANGUAGES\n\uf0a7syntax\n\u25e6English: \"cat dog boy\" \uf0e0not syntactically valid\n\"cat hugs boy\" \uf0e0syntactically valid\n\u25e6programming language: \"hi\"5 \uf0e0not syntactically valid\n3.2*5 \uf0e0syntactically valid\n6.0001 LECTURE 1\n19\nASPECTS OF LANGUAGES\n\uf0a7static semantics is which syntactically valid strings \nhave meaning\n\u25e6English: \"I are hungry\" \uf0e0syntactically valid\nbut static semantic error\n\u25e6programming language: 3.2*5\n\uf0e0syntactically valid\n3+\"hi\" \uf0e0static semantic error\n6.0001 LECTURE 1\n20\nASPECTS OF LANGUAGES\n\uf0a7semantics is the meaning associated with a \nsyntactically correct string of symbols with no static \nsemantic errors\n\u25e6English: can have many meanings \"Flying planes \ncan be dangerous\"\n\u25e6programming languages: have only one meaning but may \nnot be what programmer intended\n6.0001 LECTURE 1\n21\nWHERE THINGS GO WRONG\n\uf0a7syntactic errors\n\u25e6common and easily caught\n\uf0a7static semantic errors\n\u25e6some languages check for these before running program\n\u25e6can cause unpredictable behavior\n\uf0a7no semantic errors but different meaning than what \nprogrammer intended\n\u25e6program crashes, stops running\n\u25e6program runs forever\n\u25e6program gives an answer but different than expected\n6.0001 LECTURE 1\n22\nPYTHON PROGRAMS\n\uf0a7a program is a sequence of definitions and commands\n\u25e6definitions evaluated \n\u25e6commands executed by Python interpreter in a shell\n\uf0a7commands (statements) instruct interpreter to do \nsomething\n\uf0a7can be typed directly in a shell or stored in a file that \nis read into the shell and evaluated\n\u25e6Problem Set 0 will introduce you to these in Anaconda\n6.0001 LECTURE 1\n23\nOBJECTS\n\uf0a7programs manipulate data objects\n\uf0a7objects have a type that defines the kinds of things \nprograms can do to them\n\u25e6Ana is a human so she can walk, speak English, etc.\n\u25e6Chewbacca is a wookie so he can walk, \u201cmwaaarhrhh\u201d, etc.\n\uf0a7objects are\n\u25e6scalar (cannot be subdivided)\n\u25e6non-scalar (have internal structure that can be accessed)\n6.0001 LECTURE 1\n24\nSCALAR OBJECTS\n\uf0a7int \u2013 represent integers, ex. 5\n\uf0a7float \u2013 represent real numbers, ex. 3.27\n\uf0a7bool \u2013 represent Boolean values True and False\n\uf0a7NoneType \u2013 special and has one value, None\n\uf0a7can use type() to see the type of an object\n>>> type(5)\nint\n>>> type(3.0)\nfloat\n6.0001 LECTURE 1\n25\nTYPE CONVERSIONS (CAST)\n\uf0a7can convert object of one type to another\n\uf0a7float(3) converts integer 3 to float 3.0\n\uf0a7int(3.9) truncates float 3.9 to integer 3\n6.0001 LECTURE 1\n26\nPRINTING TO CONSOLE\n\uf0a7to show output from code to a user, use print\ncommand\nIn [11]: 3+2\nOut[11]: 5\nIn [12]: print(3+2)\n5\n6.0001 LECTURE 1\n27\nEXPRESSIONS\n\uf0a7combine objects and operators to form expressions\n\uf0a7an expression has a value, which has a type\n\uf0a7syntax for a simple expression\n \n6.0001 LECTURE 1\n28\nOPERATORS ON ints and floats\n\uf0a7i+j\n\uf0e0the sum\n\uf0a7i-j\n\uf0e0the difference\n\uf0a7i*j\n\uf0e0the product\n\uf0a7i/j\n\uf0e0division\n\uf0a7i%j\n\uf0e0the remainder when i is divided by j\n\uf0a7i**j \uf0e0i to the power of j\n6.0001 LECTURE 1\n29\nif both are ints, result is int\nif either or both are floats, result is float\nresult is float\nSIMPLE OPERATIONS\n\uf0a7parentheses used to tell Python to do these \noperations first\n\uf0a7operator precedence without parentheses\n\u25e6**\n\u25e6*\n\u25e6/\n\u25e6+ and \u2013 executed left to right, as appear in expression\n6.0001 LECTURE 1\n30\nBINDING VARIABLES AND \nVALUES\n\uf0a7equal sign is an assignment of a value to a variable \nname\npi = 3.14159\npi_approx = 22/7\n\uf0a7value stored in computer memory\n\uf0a7an assignment binds name to value\n\uf0a7retrieve value associated with name or variable by \ninvoking the name, by typing pi\n6.0001 LECTURE 1\n31\nABSTRACTING EXPRESSIONS\n\uf0a7why give names to values of expressions?\n\uf0a7to reuse names instead of values\n\uf0a7easier to change code later\npi = 3.14159\nradius = 2.2\narea = pi*(radius**2)\n6.0001 LECTURE 1\n32\nPROGRAMMING vs MATH\n\uf0a7in programming, you do not \u201csolve for x\u201d\npi = 3.14159\nradius = 2.2\n# area of circle\narea = pi*(radius**2)\nradius = radius+1\n6.0001 LECTURE 1\n33\nCHANGING BINDINGS\n\uf0a7can re-bind variable names using new assignment \nstatements\n\uf0a7previous value may still stored in memory but lost the \nhandle for it\n\uf0a7value for area does not change until you tell the \ncomputer to do the calculation again\n6.0001 LECTURE 1\n34\npi\nradius\narea\n3.14\n2.2\n15.1976\n3.2\npi = 3.14\nradius = 2.2\narea = pi*(radius**2)\nradius = radius+1\nMIT OpenCourseWare\nhttps://ocw.mit.edu\n6.0001 Introduction to Computer Science and Programming in Python\nFall 2016\nFor information about citing these materials or our Terms of Use, visit: https://ocw.mit.edu/terms." + }, + { + "title": "Expressions", + "content": "WELCOME!\n(download slides and .py files and follow along!)\n6.0001 LECTURE 1\n1\n6.0001 LECTURE 1\nTODAY\n\uf0a7course info\n\uf0a7what is computation\n\uf0a7python basics\n\uf0a7mathematical operations\n\uf0a7python variables and types\n\uf0a7NOTE: slides and code files up before each lecture\no highly encourage you to download them before lecture\no take notes and run code files when I do\no bring computers to answer in-class practice exercises!\n2\n6.0001 LECTURE 1\nCOURSE INFO\n\uf0a7Grading\n\u25e6approx. 20% Quiz\n\u25e6approx. 40% Final \n\u25e6approx. 30% Problem Sets \n\u25e6approx. 10% MITx Finger Exercises\n3\n6.0001 LECTURE 1\nCOURSE POLICIES\n\uf0a7Collaboration\n\u25e6may collaborate with anyone\n\u25e6required to write code independently and write names of \nall collaborators on submission\n\u25e6we will be running a code similarity program on all psets\n\uf0a7Extensions\n\u25e6no extensions\n\u25e6late days, see course website for details\n\u25e6drop and roll weight of max two psets in final exam grade\n\u25e6should be EMERGENCY use only\n4\n6.0001 LECTURE 1\nRECITATIONS\n\uf0a7not mandatory\n\uf0a7two flavors\n1) Lecture review: review lecture material \no if you missed lecture \no if you need a different take on the same concepts\n2) Problem solving: teach you how to solve programming \nproblems\no useful if you don\u2019t know how to set up pseudocode from pset words \no we show a couple of harder questions\no walk you through how to approach solving the problem\no brainstorm code solution along with the recitation instructor\no will post solutions after\n6.0001 LECTURE 1\n5\nFAST PACED COURSE\n\uf0a7Position yourself to succeed!\n\u25e6read psets when they come out and come back to them later\n\u25e6use late days in emergency situations\n\uf0a7New to programming? PRACTICE. PRACTICE? PRACTICE! \n\u25e6can\u2019t passively absorb programming as a skill\n\u25e6download code before lecture and follow along\n\u25e6do MITx finger exercises \n\u25e6don\u2019t be afraid to try out Python commands! \n6\n6.0001 LECTURE 1\nPRACTICE\n7\n6.0001 LECTURE 1\nPROBLEM \nSOLVING\nPROGRAMMING \nSKILL\nKNOWLEDGE \nOF CONCEPTS\nTOPICS\n\uf0a7represent knowledge with data structures\n\uf0a7iteration and recursion as computational metaphors\n\uf0a7abstraction of procedures and data types\n\uf0a7organize and modularize systems using object classes \nand methods\n\uf0a7different classes of algorithms, searching and sorting\n\uf0a7complexity of algorithms\n6.0001 LECTURE 1\n8\nWHAT DOES A COMPUTER DO\n\uf0a7Fundamentally:\n\u25e6performs calculations\na billion calculations per second!\n\u25e6remembers results\n100s of gigabytes of storage!\n\uf0a7What kinds of calculations?\n\u25e6built-in to the language\n\u25e6ones that you define as the programmer\n\uf0a7computers only know what you tell them\n6.0001 LECTURE 1\n9\nTYPES OF KNOWLEDGE\n\uf0a7declarative knowledge is statements of fact. \n\u25e6someone will win a Google \nCardboard before class ends\n\uf0a7imperative knowledge is a recipe or \u201chow-to\u201d. \n1) Students sign up for raffle\n2) Ana opens her IDE\n3) Ana chooses a random number between 1st and nth responder\n4) Ana finds the number in the responders sheet. Winner!\n6.0001 LECTURE 1\n10\nA NUMERICAL EXAMPLE\n\uf0a7square root of a number x is y such that y*y = x\n\uf0a7recipe for deducing square root of a number x (16)\n1) Start with a guess, g\n2) If g*g is close enough to x, stop and say g is the \nanswer \n3) Otherwise make a new guess by averaging g and x/g\n4) Using the new guess, repeat process until close enough\n6.0001 LECTURE 1\n11\ng\ng*g\nx/g\n(g+x/g)/2\n3\n9\n16/3\n4.17\n4.17\n17.36\n3.837\n4.0035\n4.0035\n16.0277\n3.997\n4.000002\nWHAT IS A RECIPE\n1)\nsequence of simple steps\n2)\nflow of control process that specifies when each \nstep is executed\n3)\na means of determining when to stop\n1+2+3 = an algorithm!\n6.0001 LECTURE 1\n12\nCOMPUTERS ARE MACHINES\n\uf0a7how to capture a recipe in a mechanical process\n\uf0a7fixed program computer\n\u25e6calculator\n\uf0a7stored program computer\n\u25e6machine stores and executes instructions\n6.0001 LECTURE 1\n13\nBASIC MACHINE ARCHITECTURE\n6.0001 LECTURE 1\n14\nMEMORY\nCONTROL \nUNIT\nARITHMETIC \nLOGIC UNIT\nINPUT\nOUTPUT\nprogram counter\ndo primitive ops\nSTORED PROGRAM COMPUTER\n\uf0a7sequence of instructions stored inside computer\n\u25e6built from predefined set of primitive instructions\n1)\narithmetic and logic\n2)\nsimple tests\n3)\nmoving data\n\uf0a7special program (interpreter) executes each \ninstruction in order\n\u25e6use tests to change flow of control through sequence\n\u25e6stop when done\n6.0001 LECTURE 1\n15\nBASIC PRIMITIVES\n\uf0a7Turing showed that you can compute anything using 6 \nprimitives\n\uf0a7modern programming languages have more \nconvenient set of primitives\n\uf0a7can abstract methods to create new primitives\n\uf0a7anything computable in one language is computable in \nany other programming language\n6.0001 LECTURE 1\n16\nCREATING RECIPES\n\uf0a7a programming language provides a set of primitive \noperations\n\uf0a7expressions are complex but legal combinations of \nprimitives in a programming language\n\uf0a7expressions and computations have values and \nmeanings in a programming language\n6.0001 LECTURE 1\n17\nASPECTS OF LANGUAGES\n\uf0a7primitive constructs\n\u25e6English: words\n\u25e6programming language: numbers, strings, simple \noperators\n6.0001 LECTURE 1\n18\nWord Cloud copyright Michael Twardos, All Right Reserved. This content is excluded from our\nCreative Commons license. For more information, see https://ocw.mit.edu/help/faq-fair-use/.\nWord Cloud copyright unknown, All Right Reserved.\nThis content is excluded from our Creative\nCommons license. For more information, see\nhttps://ocw.mit.edu/help/faq-fair-use/.\nASPECTS OF LANGUAGES\n\uf0a7syntax\n\u25e6English: \"cat dog boy\" \uf0e0not syntactically valid\n\"cat hugs boy\" \uf0e0syntactically valid\n\u25e6programming language: \"hi\"5 \uf0e0not syntactically valid\n3.2*5 \uf0e0syntactically valid\n6.0001 LECTURE 1\n19\nASPECTS OF LANGUAGES\n\uf0a7static semantics is which syntactically valid strings \nhave meaning\n\u25e6English: \"I are hungry\" \uf0e0syntactically valid\nbut static semantic error\n\u25e6programming language: 3.2*5\n\uf0e0syntactically valid\n3+\"hi\" \uf0e0static semantic error\n6.0001 LECTURE 1\n20\nASPECTS OF LANGUAGES\n\uf0a7semantics is the meaning associated with a \nsyntactically correct string of symbols with no static \nsemantic errors\n\u25e6English: can have many meanings \"Flying planes \ncan be dangerous\"\n\u25e6programming languages: have only one meaning but may \nnot be what programmer intended\n6.0001 LECTURE 1\n21\nWHERE THINGS GO WRONG\n\uf0a7syntactic errors\n\u25e6common and easily caught\n\uf0a7static semantic errors\n\u25e6some languages check for these before running program\n\u25e6can cause unpredictable behavior\n\uf0a7no semantic errors but different meaning than what \nprogrammer intended\n\u25e6program crashes, stops running\n\u25e6program runs forever\n\u25e6program gives an answer but different than expected\n6.0001 LECTURE 1\n22\nPYTHON PROGRAMS\n\uf0a7a program is a sequence of definitions and commands\n\u25e6definitions evaluated \n\u25e6commands executed by Python interpreter in a shell\n\uf0a7commands (statements) instruct interpreter to do \nsomething\n\uf0a7can be typed directly in a shell or stored in a file that \nis read into the shell and evaluated\n\u25e6Problem Set 0 will introduce you to these in Anaconda\n6.0001 LECTURE 1\n23\nOBJECTS\n\uf0a7programs manipulate data objects\n\uf0a7objects have a type that defines the kinds of things \nprograms can do to them\n\u25e6Ana is a human so she can walk, speak English, etc.\n\u25e6Chewbacca is a wookie so he can walk, \u201cmwaaarhrhh\u201d, etc.\n\uf0a7objects are\n\u25e6scalar (cannot be subdivided)\n\u25e6non-scalar (have internal structure that can be accessed)\n6.0001 LECTURE 1\n24\nSCALAR OBJECTS\n\uf0a7int \u2013 represent integers, ex. 5\n\uf0a7float \u2013 represent real numbers, ex. 3.27\n\uf0a7bool \u2013 represent Boolean values True and False\n\uf0a7NoneType \u2013 special and has one value, None\n\uf0a7can use type() to see the type of an object\n>>> type(5)\nint\n>>> type(3.0)\nfloat\n6.0001 LECTURE 1\n25\nTYPE CONVERSIONS (CAST)\n\uf0a7can convert object of one type to another\n\uf0a7float(3) converts integer 3 to float 3.0\n\uf0a7int(3.9) truncates float 3.9 to integer 3\n6.0001 LECTURE 1\n26\nPRINTING TO CONSOLE\n\uf0a7to show output from code to a user, use print\ncommand\nIn [11]: 3+2\nOut[11]: 5\nIn [12]: print(3+2)\n5\n6.0001 LECTURE 1\n27\nEXPRESSIONS\n\uf0a7combine objects and operators to form expressions\n\uf0a7an expression has a value, which has a type\n\uf0a7syntax for a simple expression\n \n6.0001 LECTURE 1\n28\nOPERATORS ON ints and floats\n\uf0a7i+j\n\uf0e0the sum\n\uf0a7i-j\n\uf0e0the difference\n\uf0a7i*j\n\uf0e0the product\n\uf0a7i/j\n\uf0e0division\n\uf0a7i%j\n\uf0e0the remainder when i is divided by j\n\uf0a7i**j \uf0e0i to the power of j\n6.0001 LECTURE 1\n29\nif both are ints, result is int\nif either or both are floats, result is float\nresult is float\nSIMPLE OPERATIONS\n\uf0a7parentheses used to tell Python to do these \noperations first\n\uf0a7operator precedence without parentheses\n\u25e6**\n\u25e6*\n\u25e6/\n\u25e6+ and \u2013 executed left to right, as appear in expression\n6.0001 LECTURE 1\n30\nBINDING VARIABLES AND \nVALUES\n\uf0a7equal sign is an assignment of a value to a variable \nname\npi = 3.14159\npi_approx = 22/7\n\uf0a7value stored in computer memory\n\uf0a7an assignment binds name to value\n\uf0a7retrieve value associated with name or variable by \ninvoking the name, by typing pi\n6.0001 LECTURE 1\n31\nABSTRACTING EXPRESSIONS\n\uf0a7why give names to values of expressions?\n\uf0a7to reuse names instead of values\n\uf0a7easier to change code later\npi = 3.14159\nradius = 2.2\narea = pi*(radius**2)\n6.0001 LECTURE 1\n32\nPROGRAMMING vs MATH\n\uf0a7in programming, you do not \u201csolve for x\u201d\npi = 3.14159\nradius = 2.2\n# area of circle\narea = pi*(radius**2)\nradius = radius+1\n6.0001 LECTURE 1\n33\nCHANGING BINDINGS\n\uf0a7can re-bind variable names using new assignment \nstatements\n\uf0a7previous value may still stored in memory but lost the \nhandle for it\n\uf0a7value for area does not change until you tell the \ncomputer to do the calculation again\n6.0001 LECTURE 1\n34\npi\nradius\narea\n3.14\n2.2\n15.1976\n3.2\npi = 3.14\nradius = 2.2\narea = pi*(radius**2)\nradius = radius+1\nMIT OpenCourseWare\nhttps://ocw.mit.edu\n6.0001 Introduction to Computer Science and Programming in Python\nFall 2016\nFor information about citing these materials or our Terms of Use, visit: https://ocw.mit.edu/terms." + }, + { + "title": "Computation", + "content": "WELCOME!\n(download slides and .py files and follow along!)\n6.0001 LECTURE 1\n1\n6.0001 LECTURE 1\nTODAY\n\uf0a7course info\n\uf0a7what is computation\n\uf0a7python basics\n\uf0a7mathematical operations\n\uf0a7python variables and types\n\uf0a7NOTE: slides and code files up before each lecture\no highly encourage you to download them before lecture\no take notes and run code files when I do\no bring computers to answer in-class practice exercises!\n2\n6.0001 LECTURE 1\nCOURSE INFO\n\uf0a7Grading\n\u25e6approx. 20% Quiz\n\u25e6approx. 40% Final \n\u25e6approx. 30% Problem Sets \n\u25e6approx. 10% MITx Finger Exercises\n3\n6.0001 LECTURE 1\nCOURSE POLICIES\n\uf0a7Collaboration\n\u25e6may collaborate with anyone\n\u25e6required to write code independently and write names of \nall collaborators on submission\n\u25e6we will be running a code similarity program on all psets\n\uf0a7Extensions\n\u25e6no extensions\n\u25e6late days, see course website for details\n\u25e6drop and roll weight of max two psets in final exam grade\n\u25e6should be EMERGENCY use only\n4\n6.0001 LECTURE 1\nRECITATIONS\n\uf0a7not mandatory\n\uf0a7two flavors\n1) Lecture review: review lecture material \no if you missed lecture \no if you need a different take on the same concepts\n2) Problem solving: teach you how to solve programming \nproblems\no useful if you don\u2019t know how to set up pseudocode from pset words \no we show a couple of harder questions\no walk you through how to approach solving the problem\no brainstorm code solution along with the recitation instructor\no will post solutions after\n6.0001 LECTURE 1\n5\nFAST PACED COURSE\n\uf0a7Position yourself to succeed!\n\u25e6read psets when they come out and come back to them later\n\u25e6use late days in emergency situations\n\uf0a7New to programming? PRACTICE. PRACTICE? PRACTICE! \n\u25e6can\u2019t passively absorb programming as a skill\n\u25e6download code before lecture and follow along\n\u25e6do MITx finger exercises \n\u25e6don\u2019t be afraid to try out Python commands! \n6\n6.0001 LECTURE 1\nPRACTICE\n7\n6.0001 LECTURE 1\nPROBLEM \nSOLVING\nPROGRAMMING \nSKILL\nKNOWLEDGE \nOF CONCEPTS\nTOPICS\n\uf0a7represent knowledge with data structures\n\uf0a7iteration and recursion as computational metaphors\n\uf0a7abstraction of procedures and data types\n\uf0a7organize and modularize systems using object classes \nand methods\n\uf0a7different classes of algorithms, searching and sorting\n\uf0a7complexity of algorithms\n6.0001 LECTURE 1\n8\nWHAT DOES A COMPUTER DO\n\uf0a7Fundamentally:\n\u25e6performs calculations\na billion calculations per second!\n\u25e6remembers results\n100s of gigabytes of storage!\n\uf0a7What kinds of calculations?\n\u25e6built-in to the language\n\u25e6ones that you define as the programmer\n\uf0a7computers only know what you tell them\n6.0001 LECTURE 1\n9\nTYPES OF KNOWLEDGE\n\uf0a7declarative knowledge is statements of fact. \n\u25e6someone will win a Google \nCardboard before class ends\n\uf0a7imperative knowledge is a recipe or \u201chow-to\u201d. \n1) Students sign up for raffle\n2) Ana opens her IDE\n3) Ana chooses a random number between 1st and nth responder\n4) Ana finds the number in the responders sheet. Winner!\n6.0001 LECTURE 1\n10\nA NUMERICAL EXAMPLE\n\uf0a7square root of a number x is y such that y*y = x\n\uf0a7recipe for deducing square root of a number x (16)\n1) Start with a guess, g\n2) If g*g is close enough to x, stop and say g is the \nanswer \n3) Otherwise make a new guess by averaging g and x/g\n4) Using the new guess, repeat process until close enough\n6.0001 LECTURE 1\n11\ng\ng*g\nx/g\n(g+x/g)/2\n3\n9\n16/3\n4.17\n4.17\n17.36\n3.837\n4.0035\n4.0035\n16.0277\n3.997\n4.000002\nWHAT IS A RECIPE\n1)\nsequence of simple steps\n2)\nflow of control process that specifies when each \nstep is executed\n3)\na means of determining when to stop\n1+2+3 = an algorithm!\n6.0001 LECTURE 1\n12\nCOMPUTERS ARE MACHINES\n\uf0a7how to capture a recipe in a mechanical process\n\uf0a7fixed program computer\n\u25e6calculator\n\uf0a7stored program computer\n\u25e6machine stores and executes instructions\n6.0001 LECTURE 1\n13\nBASIC MACHINE ARCHITECTURE\n6.0001 LECTURE 1\n14\nMEMORY\nCONTROL \nUNIT\nARITHMETIC \nLOGIC UNIT\nINPUT\nOUTPUT\nprogram counter\ndo primitive ops\nSTORED PROGRAM COMPUTER\n\uf0a7sequence of instructions stored inside computer\n\u25e6built from predefined set of primitive instructions\n1)\narithmetic and logic\n2)\nsimple tests\n3)\nmoving data\n\uf0a7special program (interpreter) executes each \ninstruction in order\n\u25e6use tests to change flow of control through sequence\n\u25e6stop when done\n6.0001 LECTURE 1\n15\nBASIC PRIMITIVES\n\uf0a7Turing showed that you can compute anything using 6 \nprimitives\n\uf0a7modern programming languages have more \nconvenient set of primitives\n\uf0a7can abstract methods to create new primitives\n\uf0a7anything computable in one language is computable in \nany other programming language\n6.0001 LECTURE 1\n16\nCREATING RECIPES\n\uf0a7a programming language provides a set of primitive \noperations\n\uf0a7expressions are complex but legal combinations of \nprimitives in a programming language\n\uf0a7expressions and computations have values and \nmeanings in a programming language\n6.0001 LECTURE 1\n17\nASPECTS OF LANGUAGES\n\uf0a7primitive constructs\n\u25e6English: words\n\u25e6programming language: numbers, strings, simple \noperators\n6.0001 LECTURE 1\n18\nWord Cloud copyright Michael Twardos, All Right Reserved. This content is excluded from our\nCreative Commons license. For more information, see https://ocw.mit.edu/help/faq-fair-use/.\nWord Cloud copyright unknown, All Right Reserved.\nThis content is excluded from our Creative\nCommons license. For more information, see\nhttps://ocw.mit.edu/help/faq-fair-use/.\nASPECTS OF LANGUAGES\n\uf0a7syntax\n\u25e6English: \"cat dog boy\" \uf0e0not syntactically valid\n\"cat hugs boy\" \uf0e0syntactically valid\n\u25e6programming language: \"hi\"5 \uf0e0not syntactically valid\n3.2*5 \uf0e0syntactically valid\n6.0001 LECTURE 1\n19\nASPECTS OF LANGUAGES\n\uf0a7static semantics is which syntactically valid strings \nhave meaning\n\u25e6English: \"I are hungry\" \uf0e0syntactically valid\nbut static semantic error\n\u25e6programming language: 3.2*5\n\uf0e0syntactically valid\n3+\"hi\" \uf0e0static semantic error\n6.0001 LECTURE 1\n20\nASPECTS OF LANGUAGES\n\uf0a7semantics is the meaning associated with a \nsyntactically correct string of symbols with no static \nsemantic errors\n\u25e6English: can have many meanings \"Flying planes \ncan be dangerous\"\n\u25e6programming languages: have only one meaning but may \nnot be what programmer intended\n6.0001 LECTURE 1\n21\nWHERE THINGS GO WRONG\n\uf0a7syntactic errors\n\u25e6common and easily caught\n\uf0a7static semantic errors\n\u25e6some languages check for these before running program\n\u25e6can cause unpredictable behavior\n\uf0a7no semantic errors but different meaning than what \nprogrammer intended\n\u25e6program crashes, stops running\n\u25e6program runs forever\n\u25e6program gives an answer but different than expected\n6.0001 LECTURE 1\n22\nPYTHON PROGRAMS\n\uf0a7a program is a sequence of definitions and commands\n\u25e6definitions evaluated \n\u25e6commands executed by Python interpreter in a shell\n\uf0a7commands (statements) instruct interpreter to do \nsomething\n\uf0a7can be typed directly in a shell or stored in a file that \nis read into the shell and evaluated\n\u25e6Problem Set 0 will introduce you to these in Anaconda\n6.0001 LECTURE 1\n23\nOBJECTS\n\uf0a7programs manipulate data objects\n\uf0a7objects have a type that defines the kinds of things \nprograms can do to them\n\u25e6Ana is a human so she can walk, speak English, etc.\n\u25e6Chewbacca is a wookie so he can walk, \u201cmwaaarhrhh\u201d, etc.\n\uf0a7objects are\n\u25e6scalar (cannot be subdivided)\n\u25e6non-scalar (have internal structure that can be accessed)\n6.0001 LECTURE 1\n24\nSCALAR OBJECTS\n\uf0a7int \u2013 represent integers, ex. 5\n\uf0a7float \u2013 represent real numbers, ex. 3.27\n\uf0a7bool \u2013 represent Boolean values True and False\n\uf0a7NoneType \u2013 special and has one value, None\n\uf0a7can use type() to see the type of an object\n>>> type(5)\nint\n>>> type(3.0)\nfloat\n6.0001 LECTURE 1\n25\nTYPE CONVERSIONS (CAST)\n\uf0a7can convert object of one type to another\n\uf0a7float(3) converts integer 3 to float 3.0\n\uf0a7int(3.9) truncates float 3.9 to integer 3\n6.0001 LECTURE 1\n26\nPRINTING TO CONSOLE\n\uf0a7to show output from code to a user, use print\ncommand\nIn [11]: 3+2\nOut[11]: 5\nIn [12]: print(3+2)\n5\n6.0001 LECTURE 1\n27\nEXPRESSIONS\n\uf0a7combine objects and operators to form expressions\n\uf0a7an expression has a value, which has a type\n\uf0a7syntax for a simple expression\n \n6.0001 LECTURE 1\n28\nOPERATORS ON ints and floats\n\uf0a7i+j\n\uf0e0the sum\n\uf0a7i-j\n\uf0e0the difference\n\uf0a7i*j\n\uf0e0the product\n\uf0a7i/j\n\uf0e0division\n\uf0a7i%j\n\uf0e0the remainder when i is divided by j\n\uf0a7i**j \uf0e0i to the power of j\n6.0001 LECTURE 1\n29\nif both are ints, result is int\nif either or both are floats, result is float\nresult is float\nSIMPLE OPERATIONS\n\uf0a7parentheses used to tell Python to do these \noperations first\n\uf0a7operator precedence without parentheses\n\u25e6**\n\u25e6*\n\u25e6/\n\u25e6+ and \u2013 executed left to right, as appear in expression\n6.0001 LECTURE 1\n30\nBINDING VARIABLES AND \nVALUES\n\uf0a7equal sign is an assignment of a value to a variable \nname\npi = 3.14159\npi_approx = 22/7\n\uf0a7value stored in computer memory\n\uf0a7an assignment binds name to value\n\uf0a7retrieve value associated with name or variable by \ninvoking the name, by typing pi\n6.0001 LECTURE 1\n31\nABSTRACTING EXPRESSIONS\n\uf0a7why give names to values of expressions?\n\uf0a7to reuse names instead of values\n\uf0a7easier to change code later\npi = 3.14159\nradius = 2.2\narea = pi*(radius**2)\n6.0001 LECTURE 1\n32\nPROGRAMMING vs MATH\n\uf0a7in programming, you do not \u201csolve for x\u201d\npi = 3.14159\nradius = 2.2\n# area of circle\narea = pi*(radius**2)\nradius = radius+1\n6.0001 LECTURE 1\n33\nCHANGING BINDINGS\n\uf0a7can re-bind variable names using new assignment \nstatements\n\uf0a7previous value may still stored in memory but lost the \nhandle for it\n\uf0a7value for area does not change until you tell the \ncomputer to do the calculation again\n6.0001 LECTURE 1\n34\npi\nradius\narea\n3.14\n2.2\n15.1976\n3.2\npi = 3.14\nradius = 2.2\narea = pi*(radius**2)\nradius = radius+1\nMIT OpenCourseWare\nhttps://ocw.mit.edu\n6.0001 Introduction to Computer Science and Programming in Python\nFall 2016\nFor information about citing these materials or our Terms of Use, visit: https://ocw.mit.edu/terms." + } +] \ No newline at end of file diff --git a/team-bhavitha-dsarecommender/MIT_OCW_Scraper/mit_pdfs/lecture_01.pdf b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/mit_pdfs/lecture_01.pdf new file mode 100644 index 000000000..da94cceb3 Binary files /dev/null and b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/mit_pdfs/lecture_01.pdf differ diff --git a/team-bhavitha-dsarecommender/MIT_OCW_Scraper/raw_text/lecture_01_raw.txt b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/raw_text/lecture_01_raw.txt new file mode 100644 index 000000000..44024a495 --- /dev/null +++ b/team-bhavitha-dsarecommender/MIT_OCW_Scraper/raw_text/lecture_01_raw.txt @@ -0,0 +1,389 @@ +WELCOME! +(download slides and .py files and follow along!) +6.0001 LECTURE 1 +1 +6.0001 LECTURE 1 +TODAY +ο‚§course info +ο‚§what is computation +ο‚§python basics +ο‚§mathematical operations +ο‚§python variables and types +ο‚§NOTE: slides and code files up before each lecture +o highly encourage you to download them before lecture +o take notes and run code files when I do +o bring computers to answer in-class practice exercises! +2 +6.0001 LECTURE 1 +COURSE INFO +ο‚§Grading +β—¦approx. 20% Quiz +β—¦approx. 40% Final +β—¦approx. 30% Problem Sets +β—¦approx. 10% MITx Finger Exercises +3 +6.0001 LECTURE 1 +COURSE POLICIES +ο‚§Collaboration +β—¦may collaborate with anyone +β—¦required to write code independently and write names of +all collaborators on submission +β—¦we will be running a code similarity program on all psets +ο‚§Extensions +β—¦no extensions +β—¦late days, see course website for details +β—¦drop and roll weight of max two psets in final exam grade +β—¦should be EMERGENCY use only +4 +6.0001 LECTURE 1 +RECITATIONS +ο‚§not mandatory +ο‚§two flavors +1) Lecture review: review lecture material +o if you missed lecture +o if you need a different take on the same concepts +2) Problem solving: teach you how to solve programming +problems +o useful if you don’t know how to set up pseudocode from pset words +o we show a couple of harder questions +o walk you through how to approach solving the problem +o brainstorm code solution along with the recitation instructor +o will post solutions after +6.0001 LECTURE 1 +5 +FAST PACED COURSE +ο‚§Position yourself to succeed! +β—¦read psets when they come out and come back to them later +β—¦use late days in emergency situations +ο‚§New to programming? PRACTICE. PRACTICE? PRACTICE! +β—¦can’t passively absorb programming as a skill +β—¦download code before lecture and follow along +β—¦do MITx finger exercises +β—¦don’t be afraid to try out Python commands! +6 +6.0001 LECTURE 1 +PRACTICE +7 +6.0001 LECTURE 1 +PROBLEM +SOLVING +PROGRAMMING +SKILL +KNOWLEDGE +OF CONCEPTS +TOPICS +ο‚§represent knowledge with data structures +ο‚§iteration and recursion as computational metaphors +ο‚§abstraction of procedures and data types +ο‚§organize and modularize systems using object classes +and methods +ο‚§different classes of algorithms, searching and sorting +ο‚§complexity of algorithms +6.0001 LECTURE 1 +8 +WHAT DOES A COMPUTER DO +ο‚§Fundamentally: +β—¦performs calculations +a billion calculations per second! +β—¦remembers results +100s of gigabytes of storage! +ο‚§What kinds of calculations? +β—¦built-in to the language +β—¦ones that you define as the programmer +ο‚§computers only know what you tell them +6.0001 LECTURE 1 +9 +TYPES OF KNOWLEDGE +ο‚§declarative knowledge is statements of fact. +β—¦someone will win a Google +Cardboard before class ends +ο‚§imperative knowledge is a recipe or β€œhow-to”. +1) Students sign up for raffle +2) Ana opens her IDE +3) Ana chooses a random number between 1st and nth responder +4) Ana finds the number in the responders sheet. Winner! +6.0001 LECTURE 1 +10 +A NUMERICAL EXAMPLE +ο‚§square root of a number x is y such that y*y = x +ο‚§recipe for deducing square root of a number x (16) +1) Start with a guess, g +2) If g*g is close enough to x, stop and say g is the +answer +3) Otherwise make a new guess by averaging g and x/g +4) Using the new guess, repeat process until close enough +6.0001 LECTURE 1 +11 +g +g*g +x/g +(g+x/g)/2 +3 +9 +16/3 +4.17 +4.17 +17.36 +3.837 +4.0035 +4.0035 +16.0277 +3.997 +4.000002 +WHAT IS A RECIPE +1) +sequence of simple steps +2) +flow of control process that specifies when each +step is executed +3) +a means of determining when to stop +1+2+3 = an algorithm! +6.0001 LECTURE 1 +12 +COMPUTERS ARE MACHINES +ο‚§how to capture a recipe in a mechanical process +ο‚§fixed program computer +β—¦calculator +ο‚§stored program computer +β—¦machine stores and executes instructions +6.0001 LECTURE 1 +13 +BASIC MACHINE ARCHITECTURE +6.0001 LECTURE 1 +14 +MEMORY +CONTROL +UNIT +ARITHMETIC +LOGIC UNIT +INPUT +OUTPUT +program counter +do primitive ops +STORED PROGRAM COMPUTER +ο‚§sequence of instructions stored inside computer +β—¦built from predefined set of primitive instructions +1) +arithmetic and logic +2) +simple tests +3) +moving data +ο‚§special program (interpreter) executes each +instruction in order +β—¦use tests to change flow of control through sequence +β—¦stop when done +6.0001 LECTURE 1 +15 +BASIC PRIMITIVES +ο‚§Turing showed that you can compute anything using 6 +primitives +ο‚§modern programming languages have more +convenient set of primitives +ο‚§can abstract methods to create new primitives +ο‚§anything computable in one language is computable in +any other programming language +6.0001 LECTURE 1 +16 +CREATING RECIPES +ο‚§a programming language provides a set of primitive +operations +ο‚§expressions are complex but legal combinations of +primitives in a programming language +ο‚§expressions and computations have values and +meanings in a programming language +6.0001 LECTURE 1 +17 +ASPECTS OF LANGUAGES +ο‚§primitive constructs +β—¦English: words +β—¦programming language: numbers, strings, simple +operators +6.0001 LECTURE 1 +18 +Word Cloud copyright Michael Twardos, All Right Reserved. This content is excluded from our +Creative Commons license. For more information, see https://ocw.mit.edu/help/faq-fair-use/. +Word Cloud copyright unknown, All Right Reserved. +This content is excluded from our Creative +Commons license. For more information, see +https://ocw.mit.edu/help/faq-fair-use/. +ASPECTS OF LANGUAGES +ο‚§syntax +β—¦English: "cat dog boy" οƒ not syntactically valid +"cat hugs boy" οƒ syntactically valid +β—¦programming language: "hi"5 οƒ not syntactically valid +3.2*5 οƒ syntactically valid +6.0001 LECTURE 1 +19 +ASPECTS OF LANGUAGES +ο‚§static semantics is which syntactically valid strings +have meaning +β—¦English: "I are hungry" οƒ syntactically valid +but static semantic error +β—¦programming language: 3.2*5 +οƒ syntactically valid +3+"hi" οƒ static semantic error +6.0001 LECTURE 1 +20 +ASPECTS OF LANGUAGES +ο‚§semantics is the meaning associated with a +syntactically correct string of symbols with no static +semantic errors +β—¦English: can have many meanings "Flying planes +can be dangerous" +β—¦programming languages: have only one meaning but may +not be what programmer intended +6.0001 LECTURE 1 +21 +WHERE THINGS GO WRONG +ο‚§syntactic errors +β—¦common and easily caught +ο‚§static semantic errors +β—¦some languages check for these before running program +β—¦can cause unpredictable behavior +ο‚§no semantic errors but different meaning than what +programmer intended +β—¦program crashes, stops running +β—¦program runs forever +β—¦program gives an answer but different than expected +6.0001 LECTURE 1 +22 +PYTHON PROGRAMS +ο‚§a program is a sequence of definitions and commands +β—¦definitions evaluated +β—¦commands executed by Python interpreter in a shell +ο‚§commands (statements) instruct interpreter to do +something +ο‚§can be typed directly in a shell or stored in a file that +is read into the shell and evaluated +β—¦Problem Set 0 will introduce you to these in Anaconda +6.0001 LECTURE 1 +23 +OBJECTS +ο‚§programs manipulate data objects +ο‚§objects have a type that defines the kinds of things +programs can do to them +β—¦Ana is a human so she can walk, speak English, etc. +β—¦Chewbacca is a wookie so he can walk, β€œmwaaarhrhh”, etc. +ο‚§objects are +β—¦scalar (cannot be subdivided) +β—¦non-scalar (have internal structure that can be accessed) +6.0001 LECTURE 1 +24 +SCALAR OBJECTS +ο‚§int – represent integers, ex. 5 +ο‚§float – represent real numbers, ex. 3.27 +ο‚§bool – represent Boolean values True and False +ο‚§NoneType – special and has one value, None +ο‚§can use type() to see the type of an object +>>> type(5) +int +>>> type(3.0) +float +6.0001 LECTURE 1 +25 +TYPE CONVERSIONS (CAST) +ο‚§can convert object of one type to another +ο‚§float(3) converts integer 3 to float 3.0 +ο‚§int(3.9) truncates float 3.9 to integer 3 +6.0001 LECTURE 1 +26 +PRINTING TO CONSOLE +ο‚§to show output from code to a user, use print +command +In [11]: 3+2 +Out[11]: 5 +In [12]: print(3+2) +5 +6.0001 LECTURE 1 +27 +EXPRESSIONS +ο‚§combine objects and operators to form expressions +ο‚§an expression has a value, which has a type +ο‚§syntax for a simple expression + +6.0001 LECTURE 1 +28 +OPERATORS ON ints and floats +ο‚§i+j +οƒ the sum +ο‚§i-j +οƒ the difference +ο‚§i*j +οƒ the product +ο‚§i/j +οƒ division +ο‚§i%j +οƒ the remainder when i is divided by j +ο‚§i**j οƒ i to the power of j +6.0001 LECTURE 1 +29 +if both are ints, result is int +if either or both are floats, result is float +result is float +SIMPLE OPERATIONS +ο‚§parentheses used to tell Python to do these +operations first +ο‚§operator precedence without parentheses +β—¦** +β—¦* +β—¦/ +β—¦+ and – executed left to right, as appear in expression +6.0001 LECTURE 1 +30 +BINDING VARIABLES AND +VALUES +ο‚§equal sign is an assignment of a value to a variable +name +pi = 3.14159 +pi_approx = 22/7 +ο‚§value stored in computer memory +ο‚§an assignment binds name to value +ο‚§retrieve value associated with name or variable by +invoking the name, by typing pi +6.0001 LECTURE 1 +31 +ABSTRACTING EXPRESSIONS +ο‚§why give names to values of expressions? +ο‚§to reuse names instead of values +ο‚§easier to change code later +pi = 3.14159 +radius = 2.2 +area = pi*(radius**2) +6.0001 LECTURE 1 +32 +PROGRAMMING vs MATH +ο‚§in programming, you do not β€œsolve for x” +pi = 3.14159 +radius = 2.2 +# area of circle +area = pi*(radius**2) +radius = radius+1 +6.0001 LECTURE 1 +33 +CHANGING BINDINGS +ο‚§can re-bind variable names using new assignment +statements +ο‚§previous value may still stored in memory but lost the +handle for it +ο‚§value for area does not change until you tell the +computer to do the calculation again +6.0001 LECTURE 1 +34 +pi +radius +area +3.14 +2.2 +15.1976 +3.2 +pi = 3.14 +radius = 2.2 +area = pi*(radius**2) +radius = radius+1 +MIT OpenCourseWare +https://ocw.mit.edu +6.0001 Introduction to Computer Science and Programming in Python +Fall 2016 +For information about citing these materials or our Terms of Use, visit: https://ocw.mit.edu/terms. \ No newline at end of file diff --git a/team-bhavitha-dsarecommender/README.md b/team-bhavitha-dsarecommender/README.md index 8febc4823..d178d83fc 100644 --- a/team-bhavitha-dsarecommender/README.md +++ b/team-bhavitha-dsarecommender/README.md @@ -1,35 +1,70 @@ -# personalized-learning-path -Project repo for Problem Statement 2 - Personalized Learning Path Recommendation +# Personalized Learning Path Recommendation Using Knowledge Graphs + +## Project Overview + +This project aims to develop a personalized learning system that recommends the next best concept for a student to learn, based on their prior knowledge, performance, and the logical structure of concepts in a domain like Data Structures and Algorithms (DSA). + +We propose using a **knowledge graph**, where each node represents a concept and edges define prerequisite relationships. The system continuously tracks each learner’s mastery level using metrics such as quiz scores, engagement data, and attempt history. Based on this, it dynamically recommends the most suitable next concept, ensuring that all prerequisites are met before advancing. + +The solution will be built as a full-stack **MERN application** (MongoDB, Express, React, Node.js) with real-time recommendation logic and a user-friendly interface. A synthetic learner simulator will also be developed to test the accuracy and adaptability of the recommendation engine. + +The final product will be a deployable, personalized education platform that adapts to individual learning needs and promotes efficient knowledge acquisition. + +--- + +### Goal + +To develop a personalized learning system that dynamically recommends the next best concept for a student, ensuring all prerequisites are met, and promoting efficient knowledge acquisition. + +## Features + +* **Knowledge Graph Construction:** Manually building a domain-specific knowledge graph for Data Structures and Algorithms (DSA) with defined prerequisite relationships. +* **Learner Progress Tracking:** Real-time monitoring of individual learner progress and mastery using quiz scores, engagement data, and attempt history. +* **Recommendation Engine:** A system that suggests the next most suitable learning concept based on the learner's current knowledge state and the knowledge graph structure. +* **Full-Stack Web Application:** A MERN stack (MongoDB, Express, React, Node.js) application for interaction, assessment, and dynamic learning path visualization. +* **Synthetic Learner Simulator:** A module to simulate learner behaviors for testing and evaluating the recommendation system's accuracy and adaptability. + +--- + ## Our Team -We’re a collaborative team working together on this project: +We're a collaborative team working together on this project: + +| Name | Email | Role | +| :----------------------- | :---------------------------- | :---------------- | +| B Bhavitha | bhavitha9052004@gmail.com | T3 Team Lead | +| Anurag Kumar | anurag2003ias@gmail.com | T3 Contributor | +| Nishant | nishantthakurs7519@gmail.com | T3 Contributor | +| Tamalampudi Sameer Reddy | sameerreddy213@gmail.com | T3 Contributor | -| Name | Email | Role | -|-----------------------|-----------------------------|-----------------| -| B Bhavitha | bhavitha9052004@gmail.com | T3 Team Lead | -| Anurag Kumar | anurag2003ias@gmail.com | T3 Contributor | -| Nishant | nishantthakurs7519@gmail.com| T3 Contributor | -| Tamalampudi Sameer Reddy| sameerreddy213@gmail.com | T3 Contributor | +Everyone's contributions are highly valued! + +--- -Everyone’s contributions are highly valued! ## Contribution Guidelines -We welcome contributions from all team members! Here’s how you can get started: +We welcome contributions from all team members! Here's how you can get started: -1. **Fork the repository** to your own GitHub account. -2. **Clone** your fork to your local machine. -3. **Create a new branch** for your work. -4. Make your changes, ensuring they follow good coding practices. -5. **Commit** your changes with a clear message. -6. **Push** your branch to your fork. -7. **Open a Pull Request (PR)** to the main repository. +1. **Fork the repository** to your own GitHub account. +2. **Clone** your fork to your local machine. +3. **Create a new branch** for your work. +4. Make your changes, ensuring they follow good coding practices. +5. **Commit** your changes with a clear message. +6. **Push** your branch to your fork. +7. **Open a Pull Request (PR)** to the main repository. Please make sure to: -- Check if an issue already exists before starting new features or fixes. -- Follow the folder structure (`client/`, `server/`, `scraper/`, `graph/`, `docs/`). -- Add meaningful commit messages. -- Be respectful of others’ work β€” collaboration is key! +* Check if an issue already exists before starting new features or fixes. +* Follow the folder structure (`client/`, `server/`, `scraper/`, `graph/`, `docs/`). +* Add meaningful commit messages. +* Be respectful of others’ work β€” collaboration is key! Refer to [`CONTRIBUTING.md`](CONTRIBUTING.md) for more detailed guidelines. Happy contributing! + +## Acknowledgements + +This project was developed as part of a research internship under the guidance of Prof Sudarshan Iyengar, Dept of CSE, IIT Ropar and Meenakshi V, DLED Labs, IIT Ropar. + +Their support, insights, and encouragement throughout the development of This Project were invaluable. diff --git a/team-bhavitha-dsarecommender/Unconfirmed 16035.crdownload b/team-bhavitha-dsarecommender/Unconfirmed 16035.crdownload deleted file mode 100644 index 15daac582..000000000 --- a/team-bhavitha-dsarecommender/Unconfirmed 16035.crdownload +++ /dev/null @@ -1,18 +0,0 @@ -import requests -import time -#from fake_useragent import UserAgent -from bs4 import BeautifulSoup -from bs4.element import Tag -import networkx as nx -import matplotlib.pyplot as plt - -url = "https://ocw.mit.edu/courses/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/pages/lecture-slides-code/" - -session = requests.Session() -# Use a fake user agent to avoid being blocked by the server -time.sleep(2) # Sleep to avoid overwhelming the server -r = session.get(url) - -with open("lecture_slides_code.html", "w", encoding='utf-8') as f: - f.write(r.text) -print("HTML content retrieved and saved to lecture_slides_code.html") diff --git a/team-bhavitha-dsarecommender/Unconfirmed 518044.crdownload b/team-bhavitha-dsarecommender/Unconfirmed 518044.crdownload deleted file mode 100644 index 8b6636590..000000000 --- a/team-bhavitha-dsarecommender/Unconfirmed 518044.crdownload +++ /dev/null @@ -1,90 +0,0 @@ -from bs4 import BeautifulSoup -from bs4.element import Tag -import networkx as nx -import matplotlib.pyplot as plt - - -with open("lecture_slides_code.html", "r", encoding='utf-8') as f: - html_content = f.read() -soup = BeautifulSoup(html_content, 'html.parser') - -rows = soup.find_all("tr") - -# Extract lecture titles -lecture_titles = [] - - -for row in rows: - if isinstance(row, Tag): - cols = row.find_all("td") - if len(cols) >= 2: - title = cols[1].get_text(strip=True) - if title: # Only consider non-empty titles - lecture_titles.append(title) - -# Save the lecture titles to a text file -with open("lecture_titles.txt", "w", encoding='utf-8') as f: - for title in lecture_titles: - f.write(title + "\n") - -print(f"Extracted {len(lecture_titles)} lecture titles and saved to lecture_titles.txt") - - -''' -G = nx.DiGraph() - -# Added nodes and linear edges -for i in range(len(lecture_titles)): - G.add_node(lecture_titles[i]) - if i > 0: - G.add_edge(lecture_titles[i - 1], lecture_titles[i]) - -# TO visualize the graph -plt.figure(figsize=(16, 8)) -pos = nx.spring_layout(G, k=0.8, seed=42) -nx.draw(G, pos, with_labels=True, node_color='lightgreen', edge_color='gray',node_size=5000, font_size=4, font_weight='bold', arrows=True) - -plt.title("MIT 6.0001 Lecture Prerequisite Graph", fontsize=12) -plt.axis('off') -plt.tight_layout() -plt.show() -''' - -G = nx.DiGraph() - -# Added nodes and linear edges -for i in range(len(lecture_titles)): - G.add_node(lecture_titles[i]) - if i > 0: - G.add_edge(lecture_titles[i - 1], lecture_titles[i]) - -# TO visualize the graph -plt.figure(figsize=(20, 12)) # Increased figure size - -# Create a hierarchical layout with more vertical spacing -pos = nx.kamada_kawai_layout(G) -pos_dict = {} -import random -for i, node in enumerate(G.nodes()): - x, y = pos[node] - pos_dict[node] = (x, y + i * 0.1) # Add increasing vertical displacement - -# Draw with adjusted parameters -nx.draw(G, pos_dict, - with_labels=True, - node_color='lightgreen', - edge_color='gray', - node_size=2000, - font_size=8, # Increased font size - font_weight='bold', - arrows=True, - width=2, # Thicker edges - arrowsize=10, # Larger arrows - node_shape='o', # Circular nodes - alpha=0.9) # Slight transparency - -plt.title("MIT 6.0001 Lecture Prerequisite Graph", fontsize=14, pad=20) -plt.axis('off') -plt.margins(0.2) # Add margins around the graph -plt.tight_layout() -plt.show() \ No newline at end of file diff --git a/team-bhavitha-dsarecommender/Unconfirmed 558829.crdownload b/team-bhavitha-dsarecommender/Unconfirmed 558829.crdownload deleted file mode 100644 index 15daac582..000000000 --- a/team-bhavitha-dsarecommender/Unconfirmed 558829.crdownload +++ /dev/null @@ -1,18 +0,0 @@ -import requests -import time -#from fake_useragent import UserAgent -from bs4 import BeautifulSoup -from bs4.element import Tag -import networkx as nx -import matplotlib.pyplot as plt - -url = "https://ocw.mit.edu/courses/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/pages/lecture-slides-code/" - -session = requests.Session() -# Use a fake user agent to avoid being blocked by the server -time.sleep(2) # Sleep to avoid overwhelming the server -r = session.get(url) - -with open("lecture_slides_code.html", "w", encoding='utf-8') as f: - f.write(r.text) -print("HTML content retrieved and saved to lecture_slides_code.html") diff --git a/team-bhavitha-dsarecommender/app.py b/team-bhavitha-dsarecommender/app.py deleted file mode 100644 index c4f667746..000000000 --- a/team-bhavitha-dsarecommender/app.py +++ /dev/null @@ -1,33 +0,0 @@ -from flask import Flask, request, jsonify, render_template -from recommendation_engine import recommend_for_learner -import os -import json - -app = Flask(__name__, template_folder='templates') - -@app.route('/') -def home(): - return render_template('index.html') - -@app.route('/recommend', methods=['POST']) -def recommend(): - data = request.get_json() - learner_id = data.get('learner_id') - mastered_concepts = data.get('mastered_concepts', []) - - profile = { - 'learner_id': learner_id, - 'mastered_concepts': mastered_concepts - } - - recommended = recommend_for_learner(profile) - - # Save recommendations to file - os.makedirs('graph/recommendations', exist_ok=True) - with open(f'graph/recommendations/recommendations_{learner_id}.json', 'w') as f: - json.dump({'recommended_concepts': recommended}, f, indent=2) - - return jsonify({'recommended_concepts': recommended}) - -if __name__ == '__main__': - app.run(debug=True) diff --git a/team-bhavitha-dsarecommender/cg_visualization.py b/team-bhavitha-dsarecommender/cg_visualization.py deleted file mode 100644 index c9c61c4ea..000000000 --- a/team-bhavitha-dsarecommender/cg_visualization.py +++ /dev/null @@ -1,56 +0,0 @@ -from pyvis.network import Network -import networkx as nx -import json -from networkx.readwrite import json_graph - -with open("concept_graph_full.json", "r", encoding="utf-8") as f: - data = json.load(f) -G_loaded = json_graph.node_link_graph(data) - -# Created a pyvis network -net = Network( - height="800px", - width="100%", - bgcolor="#ffffff", - font_color=True, - directed=True -) - -# Converted from networkx -net.from_nx(G_loaded) -#node properties -for node in net.nodes: - node["size"] = 20 - node["color"] = "#97C2FC" - node["borderWidth"] = 2 - node["borderColor"] = "#2B7CE9" - node["font"] = {"size": 12} - -# edge properties -for edge in net.edges: - edge["color"] = "#848484" - edge["smooth"] = {"type": "continuous"} - edge["arrows"] = "to" - edge["arrows"] = {"to": {"enabled": True, "scaleFactor": 0.5}} - -# Configure dynamics -net.set_options(""" - var options = { - "physics": { - "enabled": true, - "stabilization": {"iterations": 100}, - "barnesHut": { - "gravitationalConstant": -2000, - "springConstant": 0.04, - "springLength": 95 - } - } - } -""") - -# Saved the graph -try: - net.write_html("concept_graph.html") - print("Graph has been saved as 'concept_graph.html'. Please open it in a web browser to view.") -except Exception as e: - print(f"Error saving graph: {str(e)}") diff --git a/team-bhavitha-dsarecommender/client/.env.development b/team-bhavitha-dsarecommender/client/.env.development new file mode 100644 index 000000000..64c0b3772 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/.env.development @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:5000/api diff --git a/team-bhavitha-dsarecommender/client/.env.production b/team-bhavitha-dsarecommender/client/.env.production new file mode 100644 index 000000000..85ca0416e --- /dev/null +++ b/team-bhavitha-dsarecommender/client/.env.production @@ -0,0 +1,2 @@ +VITE_API_BASE_URL=https://cps-0f50.onrender.com/api +VITE_AUTH_API_BASE_URL=https://cps-auth.vercel.app/api diff --git a/project-alpha/frontend/.gitignore b/team-bhavitha-dsarecommender/client/.gitignore similarity index 88% rename from project-alpha/frontend/.gitignore rename to team-bhavitha-dsarecommender/client/.gitignore index a547bf36d..de964337a 100644 --- a/project-alpha/frontend/.gitignore +++ b/team-bhavitha-dsarecommender/client/.gitignore @@ -22,3 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? +.env.development +.env.production diff --git a/project-alpha/frontend/README.md b/team-bhavitha-dsarecommender/client/README.md similarity index 100% rename from project-alpha/frontend/README.md rename to team-bhavitha-dsarecommender/client/README.md diff --git a/project-alpha/frontend/eslint.config.js b/team-bhavitha-dsarecommender/client/eslint.config.js similarity index 100% rename from project-alpha/frontend/eslint.config.js rename to team-bhavitha-dsarecommender/client/eslint.config.js diff --git a/team-bhavitha-dsarecommender/client/index.html b/team-bhavitha-dsarecommender/client/index.html new file mode 100644 index 000000000..89d268138 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/index.html @@ -0,0 +1,17 @@ + + + + + + + Vite + React + TS + + + + +
+
+ + + + \ No newline at end of file diff --git a/project-alpha/frontend/package-lock.json b/team-bhavitha-dsarecommender/client/package-lock.json similarity index 66% rename from project-alpha/frontend/package-lock.json rename to team-bhavitha-dsarecommender/client/package-lock.json index 36741eab5..e94798f8b 100644 --- a/project-alpha/frontend/package-lock.json +++ b/team-bhavitha-dsarecommender/client/package-lock.json @@ -1,27 +1,41 @@ { - "name": "frontend", + "name": "client", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "frontend", + "name": "client", "version": "0.0.0", "dependencies": { + "@headlessui/react": "^2.2.4", + "@heroicons/react": "^2.2.0", "axios": "^1.9.0", + "bootstrap": "^5.3.6", + "framer-motion": "^12.23.0", + "lucide-react": "^0.525.0", "react": "^19.1.0", + "react-bootstrap": "^2.10.10", "react-dom": "^19.1.0", - "vis-network": "^9.1.12" + "react-router-dom": "^7.6.2", + "react-select": "^5.10.1", + "recharts": "^2.15.3", + "zustand": "^5.0.5" }, "devDependencies": { "@eslint/js": "^9.25.0", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", + "@types/react-router-dom": "^5.3.3", + "@types/react-select": "^5.0.0", "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.21", "eslint": "^9.25.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "postcss": "^8.5.5", + "tailwindcss": "^4.1.10", "typescript": "~5.8.3", "typescript-eslint": "^8.30.1", "vite": "^6.3.5" @@ -45,7 +59,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -101,7 +114,6 @@ "version": "7.27.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.27.5", @@ -135,7 +147,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -177,7 +188,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -187,7 +197,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -221,7 +230,6 @@ "version": "7.27.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -265,11 +273,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -284,7 +300,6 @@ "version": "7.27.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -303,7 +318,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -313,7 +327,6 @@ "version": "7.27.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -323,19 +336,126 @@ "node": ">=6.9.0" } }, - "node_modules/@egjs/hammerjs": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", - "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", - "peer": true, "dependencies": { - "@types/hammerjs": "^2.0.36" + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" }, - "engines": { - "node": ">=0.8.0" + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" } }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", @@ -879,9 +999,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", "dev": true, "license": "MIT", "engines": { @@ -928,6 +1048,88 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", + "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz", + "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz", + "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@headlessui/react": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.4.tgz", + "integrity": "sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.20.2", + "@react-aria/interactions": "^3.25.0", + "@tanstack/react-virtual": "^3.13.9", + "use-sync-external-store": "^1.5.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/@heroicons/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", + "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", + "license": "MIT", + "peerDependencies": { + "react": ">= 16 || ^19.0.0-rc" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -998,7 +1200,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -1013,7 +1214,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1023,7 +1223,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1033,14 +1232,12 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1085,6 +1282,167 @@ "node": ">= 8" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/focus": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.20.5.tgz", + "integrity": "sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/interactions": "^3.25.3", + "@react-aria/utils": "^3.29.1", + "@react-types/shared": "^3.30.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.3.tgz", + "integrity": "sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.9", + "@react-aria/utils": "^3.29.1", + "@react-stately/flags": "^3.1.2", + "@react-types/shared": "^3.30.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.9.tgz", + "integrity": "sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.29.1.tgz", + "integrity": "sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.9", + "@react-stately/flags": "^3.1.2", + "@react-stately/utils": "^3.10.7", + "@react-types/shared": "^3.30.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-stately/flags": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", + "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.10.7", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.7.tgz", + "integrity": "sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.30.0.tgz", + "integrity": "sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==", + "license": "Apache-2.0", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", + "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@popperjs/core": "^2.11.8", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.5.0", + "@types/warning": "^3.0.3", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.4", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/@restart/hooks": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", + "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.14.0" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.11", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", @@ -1372,6 +1730,42 @@ "win32" ] }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.10", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.10.tgz", + "integrity": "sha512-nvrzk4E9mWB4124YdJ7/yzwou7IfHxlSef6ugCFcBfRmsnsma3heciiiV97sBNxyc3VuwtZvmwXd0aB5BpucVw==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.10", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.10.tgz", + "integrity": "sha512-sPEDhXREou5HyZYqSWIqdU580rsF6FGeN7vpzijmP3KTiOGjOMZASz4Y6+QKjiFQwhWrR58OP8izYaNGVxvViA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1417,6 +1811,69 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1424,12 +1881,12 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/hammerjs": { - "version": "2.0.46", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", - "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", - "license": "MIT", - "peer": true + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -1438,11 +1895,22 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.1.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -1458,6 +1926,54 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-select": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-5.0.0.tgz", + "integrity": "sha512-vddLcBpzUMVpVNmnBtpC5cyZ2ajaHx/g6SHUo6lmMw0FIiOzrtmoSQ4UI6TRl+sm8TGGT+Oir8NRMZfYQtgr8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "react-select": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.34.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", @@ -1818,24 +2334,96 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, + "node_modules/bootstrap": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", + "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -1910,16 +2498,15 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001722", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001722.tgz", - "integrity": "sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==", + "version": "1.0.30001723", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", + "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", "dev": true, "funding": [ { @@ -1954,6 +2541,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1986,19 +2588,6 @@ "node": ">= 0.8" } }, - "node_modules/component-emitter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-2.0.0.tgz", - "integrity": "sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2013,6 +2602,40 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2032,14 +2655,133 @@ "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/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2053,6 +2795,12 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2069,6 +2817,37 @@ "node": ">=0.4.0" } }, + "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/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2084,12 +2863,21 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.166", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz", - "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==", + "version": "1.5.167", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", + "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==", "dev": true, "license": "ISC" }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2190,7 +2978,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -2200,19 +2987,19 @@ } }, "node_modules/eslint": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", - "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", + "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", + "@eslint/config-array": "^0.20.1", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.29.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2224,9 +3011,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2377,6 +3164,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2384,6 +3177,15 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -2464,6 +3266,12 @@ "node": ">=8" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2538,6 +3346,47 @@ "node": ">= 6" } }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.23.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.0.tgz", + "integrity": "sha512-xf6NxTGAyf7zR4r2KlnhFmsRfKIbjqeBupEDBAaEtVIBJX96sAon00kMlsKButSIRwPSHjbRrAPnYdJJ9kyhbA==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.22.0", + "motion-utils": "^12.19.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2703,6 +3552,21 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2717,7 +3581,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -2740,25 +3603,64 @@ "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, - "license": "MIT", + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "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==", - "dev": true, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" - }, + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, "engines": { "node": ">=0.10.0" } @@ -2780,11 +3682,22 @@ "dev": true, "license": "ISC" }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -2804,7 +3717,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -2820,6 +3732,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2847,13 +3765,6 @@ "node": ">=6" } }, - "node_modules/keycharm": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/keycharm/-/keycharm-0.4.0.tgz", - "integrity": "sha512-TyQTtsabOVv3MeOpR92sIKk/br9wxS+zGj4BG7CR8YbK4jM3tyIBaF0zhzeBUMx36/Q/iQLOKKOT+3jOQtemRQ==", - "license": "(Apache-2.0 OR MIT)", - "peer": true - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2878,6 +3789,263 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2894,6 +4062,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2901,6 +4075,18 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2911,6 +4097,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.525.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.525.0.tgz", + "integrity": "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -2920,6 +4115,12 @@ "node": ">= 0.4" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2978,11 +4179,25 @@ "node": "*" } }, + "node_modules/motion-dom": { + "version": "12.22.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.22.0.tgz", + "integrity": "sha512-ooH7+/BPw9gOsL9VtPhEJHE2m4ltnhMlcGMhEqA0YGNhKof7jdaszvsyThXI6LVIKshJUZ9/CP6HNqQhJfV7kw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.19.0" + } + }, + "node_modules/motion-utils": { + "version": "12.19.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.19.0.tgz", + "integrity": "sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==", + "license": "MIT" + }, "node_modules/ms": { "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": { @@ -3018,6 +4233,25 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3072,7 +4306,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -3081,6 +4314,24 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3101,11 +4352,25 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -3150,6 +4415,13 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3160,6 +4432,42 @@ "node": ">= 0.8.0" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3206,6 +4514,37 @@ "node": ">=0.10.0" } }, + "node_modules/react-bootstrap": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz", + "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.9.4", + "@types/prop-types": "^15.7.12", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", @@ -3218,6 +4557,18 @@ "react": "^19.1.0" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -3228,11 +4579,152 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.2.tgz", + "integrity": "sha512-U7Nv3y+bMimgWjhlT5CRdzHPu2/KVmqPwKUCChW8en5P3znxUqwlYFlbmyj8Rgp1SF6zs5X4+77kBVknkg6a0w==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.2.tgz", + "integrity": "sha512-Q8zb6VlTbdYKK5JJBLQEN06oTUa/RAbG/oQS1auK1I0TbJOXktqm+QENEVJU6QvWynlXPRBXI3fiOQcSEA78rA==", + "license": "MIT", + "dependencies": { + "react-router": "7.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-select": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.1.tgz", + "integrity": "sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/recharts": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.3.tgz", + "integrity": "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -3336,6 +4828,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3359,6 +4857,15 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3382,6 +4889,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3395,6 +4908,37 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.10.tgz", + "integrity": "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -3466,6 +5010,12 @@ "typescript": ">=4.8.4" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3516,6 +5066,21 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -3557,69 +5122,49 @@ "punycode": "^2.1.0" } }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/vis-data": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.9.tgz", - "integrity": "sha512-COQsxlVrmcRIbZMMTYwD+C2bxYCFDNQ2EHESklPiInbD/Pk3JZ6qNL84Bp9wWjYjAzXfSlsNaFtRk+hO9yBPWA==", - "license": "(Apache-2.0 OR MIT)", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/visjs" - }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", "peerDependencies": { - "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "vis-util": "^5.0.1" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/vis-network": { - "version": "9.1.12", - "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.12.tgz", - "integrity": "sha512-kZ7eOwfK1hGwsnCsGm02M7c5WBjgwTQ7BzF9bX7JaRqntJINWyjRiFBPqeDCOoOdgLEmwCXNk/VXYcIoK0ndyw==", - "license": "(Apache-2.0 OR MIT)", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/visjs" - }, - "peerDependencies": { - "@egjs/hammerjs": "^2.0.0", - "component-emitter": "^1.3.0 || ^2.0.0", - "keycharm": "^0.2.0 || ^0.3.0 || ^0.4.0", - "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", - "vis-data": "^6.3.0 || ^7.0.0", - "vis-util": "^5.0.1" - } - }, - "node_modules/vis-util": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.7.tgz", - "integrity": "sha512-E3L03G3+trvc/X4LXvBfih3YIHcKS2WrP0XTdZefr6W6Qi/2nNCqZfe4JFfJU6DcQLm6Gxqj2Pfl+02859oL5A==", - "license": "(Apache-2.0 OR MIT)", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/visjs" - }, - "peerDependencies": { - "@egjs/hammerjs": "^2.0.0", - "component-emitter": "^1.3.0 || ^2.0.0" + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" } }, "node_modules/vite": { @@ -3725,6 +5270,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3758,6 +5312,21 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -3770,6 +5339,35 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.5.tgz", + "integrity": "sha512-mILtRfKW9xM47hqxGIxCv12gXusoY/xTSHBYApXozR0HmQv299whhBeeAcRy+KrPPybzosvJBCOmVjq6x12fCg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/project-alpha/frontend/package.json b/team-bhavitha-dsarecommender/client/package.json similarity index 57% rename from project-alpha/frontend/package.json rename to team-bhavitha-dsarecommender/client/package.json index 7a255c0e6..f35a139fc 100644 --- a/project-alpha/frontend/package.json +++ b/team-bhavitha-dsarecommender/client/package.json @@ -1,5 +1,5 @@ { - "name": "frontend", + "name": "client", "private": true, "version": "0.0.0", "type": "module", @@ -10,20 +10,34 @@ "preview": "vite preview" }, "dependencies": { + "@headlessui/react": "^2.2.4", + "@heroicons/react": "^2.2.0", "axios": "^1.9.0", + "bootstrap": "^5.3.6", + "framer-motion": "^12.23.0", + "lucide-react": "^0.525.0", "react": "^19.1.0", + "react-bootstrap": "^2.10.10", "react-dom": "^19.1.0", - "vis-network": "^9.1.12" + "react-router-dom": "^7.6.2", + "react-select": "^5.10.1", + "recharts": "^2.15.3", + "zustand": "^5.0.5" }, "devDependencies": { "@eslint/js": "^9.25.0", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", + "@types/react-router-dom": "^5.3.3", + "@types/react-select": "^5.0.0", "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.21", "eslint": "^9.25.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "postcss": "^8.5.5", + "tailwindcss": "^4.1.10", "typescript": "~5.8.3", "typescript-eslint": "^8.30.1", "vite": "^6.3.5" diff --git a/project-alpha/frontend/public/vite.svg b/team-bhavitha-dsarecommender/client/public/vite.svg similarity index 100% rename from project-alpha/frontend/public/vite.svg rename to team-bhavitha-dsarecommender/client/public/vite.svg diff --git a/team-bhavitha-dsarecommender/client/src/App.css b/team-bhavitha-dsarecommender/client/src/App.css new file mode 100644 index 000000000..2cc25c53e --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/App.css @@ -0,0 +1,690 @@ +/* client/src/App.css - Enhanced Modern Design */ + +/* Modern Color Palette */ +:root { + --primary-purple: #8b5cf6; + --primary-purple-dark: #7c3aed; + --primary-purple-light: #a78bfa; + --secondary-blue: #3b82f6; + --accent-green: #10b981; + --accent-orange: #f59e0b; + --accent-red: #ef4444; + --dark-bg: #0f172a; + --dark-card: #1e293b; + --dark-border: #334155; + --text-primary: #f8fafc; + --text-secondary: #cbd5e1; + --text-muted: #94a3b8; + --gradient-primary: linear-gradient(135deg, #8b5cf6 0%, #3b82f6 100%); + --gradient-secondary: linear-gradient(135deg, #1e293b 0%, #334155 100%); + --shadow-soft: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + --shadow-medium: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + --shadow-large: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); +} + +/* Enhanced Spinner */ +.spinner { + border: 3px solid rgba(139, 92, 246, 0.1); + border-top: 3px solid var(--primary-purple); + border-radius: 50%; + width: 24px; + height: 24px; + animation: spin 1s linear infinite; + display: inline-block; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* Enhanced Loading Overlay */ +.loading-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(135deg, rgba(15, 23, 42, 0.95) 0%, rgba(30, 41, 59, 0.95) 100%); + backdrop-filter: blur(10px); + display: flex; + justify-content: center; + align-items: center; + z-index: 1050; + color: var(--text-primary); + flex-direction: column; +} + +.loading-overlay .spinner { + width: 60px; + height: 60px; + border-width: 4px; + margin-bottom: 20px; +} + +/* Enhanced Body Styles */ +body { + background: var(--dark-bg); + color: var(--text-primary); + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + line-height: 1.6; +} + +#root { + background: var(--dark-bg); + color: var(--text-primary); + min-height: 100vh; +} + +/* Enhanced Text Colors */ +.text-dark-contrast { + color: #1e293b !important; +} + +.text-purple { + color: var(--primary-purple) !important; +} + +.text-purple-dark { + color: var(--primary-purple-dark) !important; +} + +.text-purple-light { + color: var(--primary-purple-light) !important; +} + +/* Enhanced Form Controls */ +.form-control { + background-color: var(--dark-card); + border: 2px solid var(--dark-border); + color: var(--text-primary); + border-radius: 12px; + padding: 12px 16px; + transition: all 0.3s ease; +} + +.form-control:focus { + background-color: var(--dark-card); + border-color: var(--primary-purple); + box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1); + color: var(--text-primary); +} + +.form-control::placeholder { + color: var(--text-muted); + opacity: 1; +} + +/* Enhanced Buttons */ +.btn { + border-radius: 12px; + font-weight: 600; + padding: 12px 24px; + transition: all 0.3s ease; + border: none; + position: relative; + overflow: hidden; +} + +.btn-primary { + background: var(--gradient-primary); + color: white; + box-shadow: var(--shadow-soft); +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-medium); + background: linear-gradient(135deg, var(--primary-purple-dark) 0%, var(--secondary-blue) 100%); +} + +.btn-success { + background: linear-gradient(135deg, var(--accent-green) 0%, #059669 100%); + color: white; + box-shadow: var(--shadow-soft); +} + +.btn-success:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-medium); + background: linear-gradient(135deg, #059669 0%, #047857 100%); +} + +.btn-warning { + background: linear-gradient(135deg, var(--accent-orange) 0%, #d97706 100%); + color: white; + box-shadow: var(--shadow-soft); +} + +.btn-warning:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-medium); + background: linear-gradient(135deg, #d97706 0%, #b45309 100%); +} + +.btn-info { + background: linear-gradient(135deg, var(--secondary-blue) 0%, #2563eb 100%); + color: white; + box-shadow: var(--shadow-soft); +} + +.btn-info:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-medium); + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); +} + +/* Enhanced Cards */ +.card { + background: var(--dark-card); + border: 2px solid var(--dark-border); + border-radius: 16px; + box-shadow: var(--shadow-soft); + transition: all 0.3s ease; + overflow: hidden; +} + +.card:hover { + transform: translateY(-4px); + box-shadow: var(--shadow-large); + border-color: var(--primary-purple); +} + +.card-body { + padding: 1.5rem; +} + +/* Enhanced Clickable Elements */ +.clickable-badge { + cursor: pointer; + transition: all 0.3s ease; + border-radius: 20px; + padding: 8px 16px; + font-weight: 600; +} + +.clickable-badge:hover { + background: var(--gradient-primary) !important; + color: white !important; + transform: translateY(-2px); + box-shadow: var(--shadow-medium); +} + +.clickable-card { + transition: all 0.3s ease; + cursor: pointer; +} + +.clickable-card:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: var(--shadow-large) !important; + border-color: var(--primary-purple) !important; +} + +/* Enhanced Navigation */ +.navbar { + background: rgba(15, 23, 42, 0.95) !important; + backdrop-filter: blur(20px); + border-bottom: 2px solid var(--dark-border); + box-shadow: var(--shadow-medium); +} + +.navbar-brand { + font-weight: 800; + font-size: 1.5rem; + background: var(--gradient-primary); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.nav-link { + font-weight: 600; + transition: all 0.3s ease; + border-radius: 8px; + padding: 8px 16px !important; +} + +.nav-link:hover { + background: rgba(139, 92, 246, 0.1); + color: var(--primary-purple) !important; +} + +.active-link { + background: var(--gradient-primary) !important; + color: white !important; + box-shadow: var(--shadow-soft); +} + +/* Enhanced Dropdown */ +.dropdown-menu-dark { + background: var(--dark-card); + border: 2px solid var(--dark-border); + border-radius: 12px; + box-shadow: var(--shadow-large); + backdrop-filter: blur(20px); +} + +.dropdown-menu-dark .dropdown-item { + color: var(--text-primary); + padding: 12px 20px; + transition: all 0.3s ease; + border-radius: 8px; + margin: 4px 8px; +} + +.dropdown-menu-dark .dropdown-item:hover { + background: var(--gradient-primary); + color: white; + transform: translateX(4px); +} + +.dropdown-menu-dark .dropdown-divider { + border-top-color: var(--dark-border); + margin: 8px 16px; +} + +/* Enhanced Dashboard Sections */ +.dashboard-section { + background: var(--dark-card); + border: 2px solid var(--dark-border); + border-radius: 20px; + padding: 2rem; + margin-bottom: 2rem; + box-shadow: var(--shadow-soft); + transition: all 0.3s ease; +} + +.dashboard-section:hover { + border-color: var(--primary-purple); + box-shadow: var(--shadow-medium); +} + +/* Enhanced Charts */ +.chart-container { + background: var(--dark-card); + border: 2px solid var(--dark-border); + border-radius: 16px; + padding: 1.5rem; + box-shadow: var(--shadow-soft); +} + +/* Enhanced List Groups */ +.list-group-item { + background: var(--dark-card); + border: 2px solid var(--dark-border); + color: var(--text-primary); + border-radius: 12px; + margin-bottom: 0.5rem; + transition: all 0.3s ease; +} + +.list-group-item:hover { + background: rgba(139, 92, 246, 0.1); + border-color: var(--primary-purple); + transform: translateX(4px); +} + +/* Enhanced Badges */ +.badge { + border-radius: 20px; + font-weight: 600; + padding: 8px 16px; + font-size: 0.875rem; +} + +.badge.bg-primary { + background: var(--gradient-primary) !important; +} + +.badge.bg-success { + background: linear-gradient(135deg, var(--accent-green) 0%, #059669 100%) !important; +} + +.badge.bg-warning { + background: linear-gradient(135deg, var(--accent-orange) 0%, #d97706 100%) !important; +} + +/* Enhanced Progress Bars */ +.progress { + background: var(--dark-border); + border-radius: 12px; + height: 12px; + overflow: hidden; +} + +.progress-bar { + background: var(--gradient-primary); + border-radius: 12px; + transition: all 0.3s ease; +} + +/* Enhanced Alerts */ +.alert { + border-radius: 12px; + border: none; + padding: 1rem 1.5rem; + font-weight: 600; +} + +.alert-primary { + background: rgba(139, 92, 246, 0.1); + color: var(--primary-purple); + border-left: 4px solid var(--primary-purple); +} + +.alert-success { + background: rgba(16, 185, 129, 0.1); + color: var(--accent-green); + border-left: 4px solid var(--accent-green); +} + +.alert-warning { + background: rgba(245, 158, 11, 0.1); + color: var(--accent-orange); + border-left: 4px solid var(--accent-orange); +} + +.alert-danger { + background: rgba(239, 68, 68, 0.1); + color: var(--accent-red); + border-left: 4px solid var(--accent-red); +} + +/* Enhanced Modal */ +.modal-content { + background: var(--dark-card); + border: 2px solid var(--dark-border); + border-radius: 16px; + box-shadow: var(--shadow-large); +} + +.modal-header { + border-bottom: 2px solid var(--dark-border); + padding: 1.5rem; +} + +.modal-body { + padding: 1.5rem; +} + +.modal-footer { + border-top: 2px solid var(--dark-border); + padding: 1.5rem; +} + +/* Enhanced Tables */ +.table { + color: var(--text-primary); +} + +.table-dark { + background: var(--dark-card); + border-radius: 12px; + overflow: hidden; +} + +.table-dark th { + background: var(--dark-border); + border-color: var(--dark-border); + font-weight: 600; +} + +.table-dark td { + border-color: var(--dark-border); +} + +/* Enhanced Animations */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slideInLeft { + from { + opacity: 0; + transform: translateX(-30px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes pulse { + 0%, 100% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } +} + +.animate-fade-in-up { + animation: fadeInUp 0.6s ease-out; +} + +.animate-slide-in-left { + animation: slideInLeft 0.6s ease-out; +} + +.animate-pulse { + animation: pulse 2s infinite; +} + +/* Enhanced Scrollbar */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: var(--dark-border); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: var(--gradient-primary); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--primary-purple-dark); +} + +/* Enhanced Focus States */ +*:focus { + outline: 2px solid var(--primary-purple); + outline-offset: 2px; +} + +/* Enhanced Responsive Design */ +@media (max-width: 768px) { + .card { + margin-bottom: 1rem; + } + + .btn { + width: 100%; + margin-bottom: 0.5rem; + } + + .dashboard-section { + padding: 1rem; + } +} + +/* Enhanced Loading States */ +.skeleton { + background: linear-gradient(90deg, var(--dark-border) 25%, var(--dark-card) 50%, var(--dark-border) 75%); + background-size: 200% 100%; + animation: loading 1.5s infinite; + border-radius: 8px; +} + +@keyframes loading { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } +} + +/* Enhanced Tooltips */ +.tooltip { + background: var(--dark-card); + border: 2px solid var(--dark-border); + border-radius: 8px; + box-shadow: var(--shadow-medium); +} + +.tooltip-inner { + background: var(--dark-card); + color: var(--text-primary); + border-radius: 6px; + padding: 8px 12px; +} + +/* Enhanced Form Validation */ +.form-control.is-valid { + border-color: var(--accent-green); + box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.1); +} + +.form-control.is-invalid { + border-color: var(--accent-red); + box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1); +} + +.valid-feedback { + color: var(--accent-green); + font-weight: 600; +} + +.invalid-feedback { + color: var(--accent-red); + font-weight: 600; +} + +/* Enhanced Grid System */ +.row { + margin-left: -0.75rem; + margin-right: -0.75rem; +} + +.col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +/* Enhanced Container */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 1rem; +} + +/* Enhanced Spacing Utilities */ +.mt-6 { margin-top: 4rem !important; } +.mb-6 { margin-bottom: 4rem !important; } +.pt-6 { padding-top: 4rem !important; } +.pb-6 { padding-bottom: 4rem !important; } + +/* Enhanced Border Radius */ +.rounded-xl { border-radius: 1rem !important; } +.rounded-2xl { border-radius: 1.5rem !important; } +.rounded-3xl { border-radius: 2rem !important; } + +/* Enhanced Shadows */ +.shadow-xl { + box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; +} + +.shadow-2xl { + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; +} + +/* Enhanced Gradients */ +.bg-gradient-primary { + background: var(--gradient-primary) !important; +} + +.bg-gradient-secondary { + background: var(--gradient-secondary) !important; +} + +/* Enhanced Glass Effect */ +.glass { + background: rgba(30, 41, 59, 0.8); + backdrop-filter: blur(20px); + border: 2px solid rgba(255, 255, 255, 0.1); +} + +/* Enhanced Hover Effects */ +.hover-lift:hover { + transform: translateY(-4px); + box-shadow: var(--shadow-large); +} + +.hover-scale:hover { + transform: scale(1.05); +} + +.hover-glow:hover { + box-shadow: 0 0 20px rgba(139, 92, 246, 0.3); +} + +/* Enhanced Text Gradients */ +.text-gradient { + background: var(--gradient-primary); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +/* Enhanced Border Gradients */ +.border-gradient { + border: 2px solid; + border-image: var(--gradient-primary) 1; +} + +/* Enhanced Focus Ring */ +.focus-ring { + transition: all 0.3s ease; +} + +.focus-ring:focus { + box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.3); + outline: none; +} + +/* Enhanced Disabled States */ +.btn:disabled, +.form-control:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* Enhanced Selection */ +::selection { + background: var(--primary-purple); + color: white; +} + +/* Enhanced Print Styles */ +@media print { + .no-print { + display: none !important; + } + + body { + background: white !important; + color: black !important; + } +} \ No newline at end of file diff --git a/team-bhavitha-dsarecommender/client/src/App.tsx b/team-bhavitha-dsarecommender/client/src/App.tsx new file mode 100644 index 000000000..f65462ce1 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/App.tsx @@ -0,0 +1,58 @@ +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import LoginPage from "./pages/LoginPage.tsx"; +import Dashboard from './pages/Dashboard'; +import RegisterPage from './pages/RegisterPage'; +import ProtectedRoutes from "./components/ProtectedRoutes"; +import QuizPage from "./pages/QuizPage"; +import QuizSelectPage from "./pages/QuizSelectPage"; +import HomePage from './pages/HomePage'; +import Navbar from './components/Navbar'; +import Footer from './components/Footer'; +import ExploreTopicPage from "./pages/ExploreTopicPage"; +import RecommendationPage from "./pages/RecommendationPage"; +import AppEntry from "./routes/AppEntry"; +import DiscussionDetailPage from "./pages/DiscussionDetailPage"; +import Discuss from './pages/DiscussionPage.tsx'; +import StudentDetailPage from './pages/StudentDetailPage.tsx'; +import PlaygroundPage from './pages/PlaygroundPage.tsx'; +import AskQuestionPage from './pages/AskQuestionPage.tsx'; +import StudentAssignments from './pages/StudentAssignments.tsx'; + +function App() { + return ( + +
+ +
+ + } /> + } /> + } /> + } /> + + {/* Public routes go here */} + {/* Protected routes go here */} + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + +
+
+
+
+ ); +} + +export default App; \ No newline at end of file diff --git a/project-alpha/frontend/src/assets/react.svg b/team-bhavitha-dsarecommender/client/src/assets/react.svg similarity index 100% rename from project-alpha/frontend/src/assets/react.svg rename to team-bhavitha-dsarecommender/client/src/assets/react.svg diff --git a/team-bhavitha-dsarecommender/client/src/components/AssignTaskModal.tsx b/team-bhavitha-dsarecommender/client/src/components/AssignTaskModal.tsx new file mode 100644 index 000000000..4f33ca7c4 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/AssignTaskModal.tsx @@ -0,0 +1,105 @@ +import { useState } from "react"; +import { Modal, Form, Button } from "react-bootstrap"; +import { api } from "../lib/api"; +import "./customModal.css"; +interface AssignTaskModalProps { + show: boolean; + onClose: () => void; + username: string; + onSuccess?: () => void; +} + +export default function AssignTaskModal({ show, onClose, username, onSuccess }: AssignTaskModalProps) { + const [assignmentTitle, setAssignmentTitle] = useState(""); + const [assignmentDesc, setAssignmentDesc] = useState(""); + const [file, setFile] = useState(null); + const [uploading, setUploading] = useState(false); + + const handleAssign = async () => { + if (!assignmentTitle || !assignmentDesc || !file) { + alert("All fields are required!"); + return; + } + + try { + setUploading(true); + const formData = new FormData(); + formData.append("username", username); + formData.append("title", assignmentTitle); + formData.append("description", assignmentDesc); + formData.append("file", file); + + await api.post("/assignments", formData, { + headers: { "Content-Type": "multipart/form-data" }, + }); + + alert("Task assigned successfully!"); + onClose(); + setAssignmentTitle(""); + setAssignmentDesc(""); + setFile(null); + onSuccess?.(); + } catch (err) { + console.error(err); + alert("Failed to assign task."); + } finally { + setUploading(false); + } + }; + + return ( + + + Assign Task to {username} + + + +
+ + Title + setAssignmentTitle(e.target.value)} + placeholder="Assignment title" + /> + + + + Description + setAssignmentDesc(e.target.value)} + placeholder="Describe the task..." + /> + + + + Upload File (PDF/Image) + ) => { + const selectedFile = e.target.files?.[0]; + if (selectedFile) { + setFile(selectedFile); + } + }} + /> + +
+
+ + + + + +
+ ); +} diff --git a/team-bhavitha-dsarecommender/client/src/components/AttemptHistory.tsx b/team-bhavitha-dsarecommender/client/src/components/AttemptHistory.tsx new file mode 100644 index 000000000..e77943aab --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/AttemptHistory.tsx @@ -0,0 +1,35 @@ +import React from "react"; + +type Props = { + history: Record; +}; + +const AttemptHistory = ({ history }: Props) => { + if (Object.keys(history).length === 0) + return

Play and Know...

; + + return ( +
+ {Object.entries(history).map(([concept, result]) => ( +
+

{concept}

+

+ Strong: {result.strongConcepts.join(", ") || "None"} +

+

+ Weak: {result.weakConcepts.join(", ") || "None"} +

+

+ Recommended: {result.recommendedConcepts.join(", ") || "None"} +

+
+ ))} +
+ ); +}; + +export default AttemptHistory; diff --git a/team-bhavitha-dsarecommender/client/src/components/DashboardBackground.tsx b/team-bhavitha-dsarecommender/client/src/components/DashboardBackground.tsx new file mode 100644 index 000000000..3c7b32f68 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/DashboardBackground.tsx @@ -0,0 +1,12 @@ +// components/DashboardBackground.tsx +import Dashboard from "../pages/Dashboard"; + +const DashboardBackground = () => { + return ( +
+ +
+ ); +}; + +export default DashboardBackground; diff --git a/team-bhavitha-dsarecommender/client/src/components/DiscussModal.tsx b/team-bhavitha-dsarecommender/client/src/components/DiscussModal.tsx new file mode 100644 index 000000000..c6f07be14 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/DiscussModal.tsx @@ -0,0 +1,125 @@ +// src/components/StartDiscussionModal.tsx +import { useState } from "react"; +import { Modal, Button, Form } from "react-bootstrap"; +import { api } from "../lib/api"; +import "./customModal.css"; // Make sure this is imported + +interface Props { + show: boolean; + onClose: () => void; + onRefresh: () => void; + username: string; + userRole?: string; +} + +const StartDiscussionModal = ({ show, onClose, onRefresh, username }: Props) => { + const [type, setType] = useState<"general" | "question">("general"); + const [text, setText] = useState(""); + const [topic, setTopic] = useState(""); + const [questionIndex, setQuestionIndex] = useState(""); + const [questionText, setQuestionText] = useState(""); + + const handleSubmit = async () => { + try { + if (type === "general") { + await api.post("/discuss/general", { username, text }); + } else { + await api.post("/discuss/create-or-get", { + topic, + questionIndex: Number(questionIndex), + questionText, + username, + }); + } + onRefresh(); + onClose(); + } catch (err) { + console.error("Failed to create discussion", err); + alert("Failed to create discussion"); + } + }; + + return ( + + + Start a Discussion + + +
+ setType("general")} + className="discussion-radio" + /> + setType("question")} + className="discussion-radio mb-3" + /> + + {type === "general" ? ( + + Message + setText(e.target.value)} + className="form-control-dark" + placeholder="What's on your mind?" + /> + + ) : ( + <> + + Topic + setTopic(e.target.value)} + className="form-control-dark" + placeholder="e.g., Graph Theory" + /> + + + Question Index + + setQuestionIndex(e.target.value === "" ? "" : Number(e.target.value)) + } + className="form-control-dark" + /> + + + Question Text + setQuestionText(e.target.value)} + className="form-control-dark" + /> + + + )} + +
+ + + + +
+ ); +}; + +export default StartDiscussionModal; diff --git a/team-bhavitha-dsarecommender/client/src/components/Footer.tsx b/team-bhavitha-dsarecommender/client/src/components/Footer.tsx new file mode 100644 index 000000000..a80a4ce58 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/Footer.tsx @@ -0,0 +1,242 @@ +import { motion } from 'framer-motion'; +import { Heart, Github, Linkedin, Mail, BookOpen } from 'lucide-react'; + +const Footer = () => { + const currentYear = new Date().getFullYear(); + + const containerVariants = { + hidden: { opacity: 0, y: 50 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.6, + ease: "easeOut" as const, + staggerChildren: 0.1 + } + } + }; + + const itemVariants = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.5, + ease: "easeOut" as const + } + } + }; + + return ( + +
+
+ +
+ +
LearnFlow
+
+ +
+ + + + + + + + + +
+
+ + +
Features
+
    +
  • + + Personalized Learning + +
  • +
  • + + Adaptive Quizzes + +
  • +
  • + + Progress Tracking + +
  • +
  • + + Knowledge Graph + +
  • +
+
+ + +
Resources
+
    +
  • + + Documentation + +
  • +
  • + + API Reference + +
  • +
  • + + Tutorials + +
  • +
  • + + Support + +
  • +
+
+ + +
Company
+
    +
  • + + About Us + +
  • +
  • + + Careers + +
  • +
  • + + Privacy Policy + +
  • +
  • + + Terms of Service + +
  • +
+
+ + +
Stats
+ +
+
+ + +
+
+

+ Β© {currentYear} LearnFlow. All rights reserved. +

+
+
+

+ Made with +

+
+
+
+
+
+ ); +}; + +export default Footer; diff --git a/server/.gitkeep b/team-bhavitha-dsarecommender/client/src/components/HeroSection.tsx similarity index 100% rename from server/.gitkeep rename to team-bhavitha-dsarecommender/client/src/components/HeroSection.tsx diff --git a/team-bhavitha-dsarecommender/client/src/components/LearnedConceptCard.tsx b/team-bhavitha-dsarecommender/client/src/components/LearnedConceptCard.tsx new file mode 100644 index 000000000..a2bda5db6 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/LearnedConceptCard.tsx @@ -0,0 +1,135 @@ +// client/src/components/LearnedConceptCard.tsx +import React from 'react'; +import { BookOpen, Code, FlaskConical, Calculator, BrainCircuit, Lightbulb, GraduationCap, CheckCircle, TrendingUp, Award } from 'lucide-react'; +import { motion } from 'framer-motion'; + +interface LearnedConceptCardProps { + title: string; + quizScores?: { score: number; date: string }[]; +} + +// A simple map for topic-to-icon. Expand this as needed. +const topicIcons: { [key: string]: React.ElementType } = { + 'Python Basics': Code, + 'Data Structures': BrainCircuit, + 'Algorithms': Lightbulb, + 'Calculus': Calculator, + 'Chemistry': FlaskConical, + 'Physics': GraduationCap, + // Add more mappings for your validTopics +}; + +const LearnedConceptCard = ({ title, quizScores }: LearnedConceptCardProps) => { + const IconComponent = topicIcons[title] || BookOpen; + const lastScore = quizScores && quizScores.length > 0 ? quizScores[quizScores.length - 1].score : null; + + const cardVariants = { + hidden: { opacity: 0, scale: 0.9, y: 20 }, + visible: { + opacity: 1, + scale: 1, + y: 0, + transition: { + duration: 0.5, + ease: "easeOut" as const + } + }, + hover: { + scale: 1.05, + y: -8, + transition: { + duration: 0.3, + ease: "easeOut" as const + } + } + }; + + const iconVariants = { + hover: { + rotate: 360, + scale: 1.1, + transition: { + duration: 0.6, + ease: "easeOut" as const + } + } + }; + + const getScoreColor = (score: number) => { + if (score >= 90) return "text-success"; + if (score >= 80) return "text-warning"; + if (score >= 70) return "text-info"; + return "text-secondary"; + }; + + const getScoreIcon = (score: number) => { + if (score >= 90) return Award; + if (score >= 80) return TrendingUp; + return CheckCircle; + }; + + return ( + + +
+ + + + +

{title}

+ +
+ + Completed +
+ + {lastScore && ( + +
+ {React.createElement(getScoreIcon(lastScore), { size: 16, className: "me-2" })} + Last Score: {lastScore.toFixed(0)}% +
+ +
+ +
+
+ )} + + +
+ + Mastered +
+
+
+
+ ); +}; + +export default LearnedConceptCard; \ No newline at end of file diff --git a/team-bhavitha-dsarecommender/client/src/components/LoadingSpinner.tsx b/team-bhavitha-dsarecommender/client/src/components/LoadingSpinner.tsx new file mode 100644 index 000000000..0e6f68d6a --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/LoadingSpinner.tsx @@ -0,0 +1,52 @@ +// client/src/components/LoadingSpinner.tsx +import { motion } from 'framer-motion'; +import { Loader2 } from 'lucide-react'; + +interface LoadingSpinnerProps { + size?: "sm" | "md" | "lg"; + text?: string; + className?: string; + message?:string; +} + +const LoadingSpinner = ({ size = "md", text, className = "" }: LoadingSpinnerProps) => { + const sizeMap = { + sm: 16, + md: 24, + lg: 32 + }; + + const spinnerVariants = { + animate: { + rotate: 360, + transition: { + duration: 1, + repeat: Infinity, + ease: "linear" as const + } + } + }; + + return ( +
+ + + + {text && ( + + {text} + + )} +
+ ); +}; + +export default LoadingSpinner; \ No newline at end of file diff --git a/team-bhavitha-dsarecommender/client/src/components/LoadingWithQuotes.tsx b/team-bhavitha-dsarecommender/client/src/components/LoadingWithQuotes.tsx new file mode 100644 index 000000000..94cfda8eb --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/LoadingWithQuotes.tsx @@ -0,0 +1,37 @@ +import { useEffect, useState } from "react"; + +interface LoadingWithQuoteProps { + quotes?: string[]; + intervalMs?: number; +} + +const defaultQuotes = [ + "Why did the Python list break up with the array? Too much indexing drama!", + "Recursion in Python: It's like calling yourself until you believe it.", + "DSA in Python: When time complexity meets duck typing.", + "Why do Python coders love trees? Because they always branch out.", +]; + +const LoadingWithQuote = ({ quotes = defaultQuotes, intervalMs = 3000 }: LoadingWithQuoteProps) => { + const [quoteIndex, setQuoteIndex] = useState(0); + + useEffect(() => { + const interval = setInterval(() => { + setQuoteIndex((prev) => (prev + 1) % quotes.length); + }, intervalMs); + + return () => clearInterval(interval); + }, [quotes.length, intervalMs]); + + return ( +
+
+

{quotes[quoteIndex]}

+
+ ); +}; + +export default LoadingWithQuote; diff --git a/team-bhavitha-dsarecommender/client/src/components/Navbar.tsx b/team-bhavitha-dsarecommender/client/src/components/Navbar.tsx new file mode 100644 index 000000000..fbc2bdcb9 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/Navbar.tsx @@ -0,0 +1,247 @@ +import { Link, NavLink, useNavigate, useLocation } from "react-router-dom"; +import { useAuthStore } from "../store/authStore"; +import { useUserStore } from "../store/userStore"; +import { UserCircle, LogOut, Home, BookOpen, Target, MessageCircle, Upload, BarChart3 } from "lucide-react"; +import { motion } from "framer-motion"; + +const Navbar = () => { + const isAuthenticated = useAuthStore((state) => state.isAuthenticated); + const logout = useAuthStore((state) => state.logout); + const username = useUserStore((state) => state.username); + const role = useUserStore((state) => state.role); + const navigate = useNavigate(); + const location = useLocation(); + + const handleLogout = () => { + logout(); + navigate("/"); + }; + + const protectedLink = (path: string) => + isAuthenticated ? path : "/register"; + + const brandLink = isAuthenticated + ? role === "educator" + ? "/dashboard" + : `/dashboard/${username}` + : "/"; + + const navItemVariants = { + hidden: { opacity: 0, y: -10 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.3, + ease: "easeOut" as const + } + }, + hover: { + y: -2, + transition: { + duration: 0.2, + ease: "easeOut" as const + } + } + }; + + return ( + +
+ + + LearnFlow + + + + + + +
+
+ ); +}; + +export default Navbar; diff --git a/team-bhavitha-dsarecommender/client/src/components/NewThreadForm.tsx b/team-bhavitha-dsarecommender/client/src/components/NewThreadForm.tsx new file mode 100644 index 000000000..5340b2803 --- /dev/null +++ b/team-bhavitha-dsarecommender/client/src/components/NewThreadForm.tsx @@ -0,0 +1,52 @@ +// src/components/NewThreadForm.tsx +import { useState } from "react"; +import { api } from "../lib/api"; +import { useUserStore } from "../store/userStore"; + +const NewThreadForm = ({ onNewThread }: { onNewThread: (t: any) => void }) => { + const [title, setTitle] = useState(""); + const [content, setContent] = useState(""); + const username = useUserStore((state) => state.username); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + const res = await api.post("/discuss/general", { + title, + createdBy: username, + content, + }); + onNewThread(res.data); + setTitle(""); + setContent(""); + } catch (err) { + console.error("Failed to create thread:", err); + } + }; + + return ( +
+

Start a General Discussion

+ setTitle(e.target.value)} + required + /> +