├── .gitignore
├── .vscode
└── settings.json
├── README.md
├── attendees.py
├── build_graph.py
├── generate_embeddings.py
├── graph
├── .DS_Store
├── .gitignore
├── fonts
│ ├── .DS_Store
│ ├── Space_Mono
│ │ ├── OFL.txt
│ │ ├── SpaceMono-Bold.ttf
│ │ ├── SpaceMono-BoldItalic.ttf
│ │ ├── SpaceMono-Italic.ttf
│ │ └── SpaceMono-Regular.ttf
│ ├── Tiempos Headline
│ │ ├── TiemposHeadline-Black.otf
│ │ ├── TiemposHeadline-BlackItalic.otf
│ │ ├── TiemposHeadline-Bold.otf
│ │ ├── TiemposHeadline-BoldItalic.otf
│ │ ├── TiemposHeadline-Light.otf
│ │ ├── TiemposHeadline-LightItalic.otf
│ │ ├── TiemposHeadline-Medium.otf
│ │ ├── TiemposHeadline-MediumItalic.otf
│ │ ├── TiemposHeadline-Regular.otf
│ │ ├── TiemposHeadline-RegularItalic.otf
│ │ ├── TiemposHeadline-Semibold.otf
│ │ └── TiemposHeadline-SemiboldItalic.otf
│ └── Untitled Sans
│ │ ├── UntitledSans-Black.otf
│ │ ├── UntitledSans-BlackItalic.otf
│ │ ├── UntitledSans-Bold.otf
│ │ ├── UntitledSans-BoldItalic.otf
│ │ ├── UntitledSans-Light.otf
│ │ ├── UntitledSans-LightItalic.otf
│ │ ├── UntitledSans-Medium.otf
│ │ ├── UntitledSans-MediumItalic.otf
│ │ ├── UntitledSans-Regular.otf
│ │ └── UntitledSans-RegularItalic.otf
├── index.html
├── index.js
├── input.css
├── nodeSettings.js
├── package.json
├── pnpm-lock.yaml
└── tailwind.config.js
├── images
├── graph.png
└── match.png
├── main.py
├── match
├── .eslintrc.json
├── .gitignore
├── README.md
├── components.json
├── next.config.mjs
├── package-lock.json
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── public
│ ├── fonts
│ │ ├── Space_Mono
│ │ │ ├── OFL.txt
│ │ │ ├── SpaceMono-Bold.ttf
│ │ │ ├── SpaceMono-BoldItalic.ttf
│ │ │ ├── SpaceMono-Italic.ttf
│ │ │ └── SpaceMono-Regular.ttf
│ │ ├── Tiempos Headline
│ │ │ ├── TiemposHeadline-Black.otf
│ │ │ ├── TiemposHeadline-BlackItalic.otf
│ │ │ ├── TiemposHeadline-Bold.otf
│ │ │ ├── TiemposHeadline-BoldItalic.otf
│ │ │ ├── TiemposHeadline-Light.otf
│ │ │ ├── TiemposHeadline-LightItalic.otf
│ │ │ ├── TiemposHeadline-Medium.otf
│ │ │ ├── TiemposHeadline-MediumItalic.otf
│ │ │ ├── TiemposHeadline-Regular.otf
│ │ │ ├── TiemposHeadline-RegularItalic.otf
│ │ │ ├── TiemposHeadline-Semibold.otf
│ │ │ └── TiemposHeadline-SemiboldItalic.otf
│ │ └── Untitled Sans
│ │ │ ├── UntitledSans-Black.otf
│ │ │ ├── UntitledSans-BlackItalic.otf
│ │ │ ├── UntitledSans-Bold.otf
│ │ │ ├── UntitledSans-BoldItalic.otf
│ │ │ ├── UntitledSans-Light.otf
│ │ │ ├── UntitledSans-LightItalic.otf
│ │ │ ├── UntitledSans-Medium.otf
│ │ │ ├── UntitledSans-MediumItalic.otf
│ │ │ ├── UntitledSans-Regular.otf
│ │ │ └── UntitledSans-RegularItalic.otf
│ ├── next.svg
│ └── vercel.svg
├── src
│ ├── app
│ │ ├── favicon.ico
│ │ ├── globals.css
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── components
│ │ ├── Search.tsx
│ │ └── ui
│ │ │ ├── dialog.tsx
│ │ │ └── input.tsx
│ └── lib
│ │ └── utils.ts
├── tailwind.config.ts
└── tsconfig.json
├── requirements.txt
├── summarize.py
├── summarize_graph_data.py
└── utils.py
/.gitignore:
--------------------------------------------------------------------------------
1 | venv
2 | __pycache__/
3 |
4 | graph/bundle.js
5 | **/bundle.js
6 | **/output.css
7 |
8 |
9 | # Ignore the data
10 | data.csv
11 |
12 | # Ignore the embeddings db
13 | chromadb
14 |
15 | # Ignore formatted
16 | graphData.json
17 | summarizedGraphData.json
18 | attendees.json
19 | .vercel
20 |
21 | .env
22 | .DS_Store
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "liveServer.settings.port": 5501
3 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Matchmaking Tools
2 |
3 | ### Download participant data
4 |
5 | In lu.ma, go to your event page and click "Manage". Click "Guests" and click the download button to get the CSV file. Put this in the root directory of this repository as "**data.csv**"
6 |
7 | If you have your own CSV, format it as follows:
8 |
9 | | Names | Responses |
10 | | ------------------- | --------------------------------------------- |
11 | | Freeman Jiang | I wish to explore the world |
12 | | Rajan Agarwal | I want to build AGI |
13 | | Hudhayfa Nazoordeen | I want to grow more vegetables hydroponically |
14 |
15 | In `generate_embeddings.py`, set the `COLUMN_INDEX` to be the column that your responses are in. For example, In the above csv the index would be `1`.
16 |
17 | ### Running the script
18 |
19 | Install dependencies
20 |
21 | ```sh
22 | python3 -m venv venv
23 | source venv/bin/activate
24 | pip install -r requirements.txt
25 | ```
26 |
27 | Generate embeddings
28 |
29 | ```sh
30 | python generate_embeddings.py
31 | python build_graph.py # to create the graph based on the distance threshold
32 | python attendees.py # to create initial cache
33 | ```
34 |
35 | You should now successfully have a `graphData.json` file.
36 |
37 | ### Generating summarized data (optional)
38 |
39 | You now have the option to summarize each response. For example,
40 |
41 | > i want to learn how to sculpt/pottery! creating something from a block of clay would be incredible but would take a lot of time/lessons.
42 |
43 | would become
44 |
45 | > Would learn how to sculpt and create pottery from clay.
46 |
47 | We recommend this for events where you can search for people, using the `match` site. If you are just using the graph, **this is not necessary.**
48 |
49 | ```sh
50 | python summarize_graph_data.py # (OPTIONAL) to summarize responses with LLM
51 | ```
52 |
53 | then, uncomment the line in `graph/index.js`:
54 |
55 | ```js
56 | // Use the below line if you want to use the summarized graph instead
57 | //const json = require("../summarizedGraphData.json");
58 | ```
59 |
60 | If you choose to summarize the data with an LLM, a `summarizedGraphData.json` file will be present too. If you do the AI summarization, change `ai_summarization` in `attendees.py` to True. Then, run attendees again to recache.
61 |
62 | ```sh
63 | python attendees.py # create attendees.json for searching
64 | ```
65 |
66 | ## Developing the Graph
67 |
68 | 
69 |
70 | In the **graph/** directory
71 |
72 | ```sh
73 | cd graph
74 | npm i
75 | npm run dev
76 | ```
77 |
78 | Next, concurrently run Tailwind in a new terminal:
79 |
80 | ```sh
81 | npm run tailwind
82 | ```
83 |
84 | Finally, open **graph/index.html** in a browser.
85 |
86 | To serve:
87 |
88 | ```sh
89 | npm start
90 | ```
91 |
92 | ## Developing the Matchmaking Site
93 |
94 | 
95 |
96 | Now in the **match/** directory
97 |
98 | ```sh
99 | cd match
100 | npm i
101 | npm run dev
102 | ```
103 |
104 | Then open **localhost:3000** in a browser.
105 |
106 | To serve:
107 |
108 | ```sh
109 | npm start
110 | ```
111 |
112 | ### Deployment
113 |
114 | We suggest you deploy using the Vercel CLI, so you do not release personal information in the CSV. You can individually deploy `match` and `graph` with the same compiled dataset. You can check out their documentation: [Vercel CLI Docs](https://vercel.com/docs/cli).
115 |
--------------------------------------------------------------------------------
/attendees.py:
--------------------------------------------------------------------------------
1 | import json
2 |
3 | def read_graph_data(filename):
4 | with open(filename, 'r') as file:
5 | data = json.load(file)
6 | return data
7 |
8 | def extract_responses(graph_data):
9 | attendees = {}
10 | for node in graph_data['nodes']:
11 | node_id = node['id']
12 | response = node['data']['response']
13 | attendees[node_id] = response
14 | return attendees
15 |
16 | def write_attendees(attendees_data, filename):
17 | with open(filename, 'w') as file:
18 | json.dump(attendees_data, file, indent=4)
19 |
20 | def main():
21 | ai_summarization = False
22 | graph_data = read_graph_data('summarizedGraphData.json' if ai_summarization else 'graphData.json')
23 | attendees_data = extract_responses(graph_data)
24 | write_attendees(attendees_data, 'attendees.json')
25 |
26 | if __name__ == "__main__":
27 | main()
28 |
--------------------------------------------------------------------------------
/build_graph.py:
--------------------------------------------------------------------------------
1 | import json
2 | from pydantic import BaseModel
3 | import chromadb
4 |
5 | # How many matches an individual can have at maximum
6 | N_RESULTS = 10
7 |
8 | # Larger = more likely to be matched
9 | DISTANCE_THRESHOLD = 1.1
10 |
11 | # Which prompt stored in sqlite to process
12 | # We define this in generate_embeddings.py
13 | COLLECTION_TO_PROCESS = "time_prompt_embeddings"
14 |
15 | class NodeData(BaseModel):
16 | name: str
17 | major: str
18 | response: str
19 | topMatch: str
20 |
21 | class Node(BaseModel):
22 | id: str
23 | data: NodeData
24 |
25 | class Link(BaseModel):
26 | source: str
27 | target: str
28 |
29 | def process_collection(collection: chromadb.Collection, nodes: list[Node], links: list[Link]):
30 | results = collection.get(
31 | ids=None, include=["metadatas", "documents", "embeddings"])
32 | if results["embeddings"] is None or results["metadatas"] is None:
33 | raise ValueError("No embeddings found in the collection")
34 |
35 | for i, embedding in enumerate(results["embeddings"]):
36 | self_id = results["ids"][i]
37 | self_name = results["metadatas"][i]["name"]
38 | self_major = results['metadatas'][i]['program']
39 | self_response = results['documents'][i]
40 |
41 | query = collection.query(
42 | n_results=N_RESULTS,
43 | query_embeddings=[embedding],
44 | include=["metadatas", "distances", "documents"],
45 | where={
46 | "name": {
47 | "$ne": self_name,
48 | }
49 | }
50 | )
51 |
52 | nearest_ids = query["ids"][0]
53 |
54 | if not query["distances"]:
55 | raise ValueError("No distances found in the query")
56 | distances = query["distances"][0]
57 |
58 | name = str(results["metadatas"][i]["name"])
59 |
60 | print(
61 | f"{i+1}/{len(results['embeddings'])}: Processing {name} ({self_major})")
62 |
63 | # Always give a match
64 | top_match = nearest_ids[0]
65 |
66 | new_node = Node(
67 | id=self_id,
68 | data=NodeData(
69 | name=name,
70 | response=self_response,
71 | major=self_major,
72 | topMatch=top_match
73 | )
74 | )
75 |
76 | nodes.append(new_node)
77 |
78 | # Always add the links
79 | for i, distance in enumerate(distances):
80 | if distance < DISTANCE_THRESHOLD:
81 | links.append(
82 | Link(
83 | source=self_id,
84 | target=nearest_ids[i]
85 | )
86 | )
87 |
88 | def main():
89 | chroma_client = chromadb.PersistentClient(path="chromadb")
90 | nodes: list[Node] = []
91 | links: list[Link] = []
92 | collection = chroma_client.get_collection(COLLECTION_TO_PROCESS)
93 |
94 | process_collection(collection, nodes, links)
95 |
96 | print(f"Graph constructed from collection: {COLLECTION_TO_PROCESS}")
97 |
98 | with open("graphData.json", "w") as f:
99 | json.dump({"nodes": [n.model_dump() for n in nodes],
100 | "links": [l.model_dump() for l in links]}, f)
101 |
102 | if __name__ == '__main__':
103 | main()
104 |
--------------------------------------------------------------------------------
/generate_embeddings.py:
--------------------------------------------------------------------------------
1 | from typing import Optional
2 |
3 | import numpy as np
4 | import pandas as pd
5 |
6 | import chromadb
7 | from utils import chunk_array
8 |
9 | # SET THIS TO BE THE COLUMN OF YOUR RESPONSE
10 | COLUMN_INDEX = 23
11 |
12 |
13 | def generate_embeddings():
14 | chroma_client = chromadb.PersistentClient(path="chromadb")
15 | time_prompt_collection = chroma_client.get_or_create_collection(
16 | name="time_prompt_embeddings"
17 | )
18 |
19 | problem_prompt_collection = chroma_client.get_or_create_collection(
20 | name="problem_prompt_embeddings"
21 | )
22 |
23 | # Load the CSV file into a Pandas DataFrame
24 | file_path = "data.csv"
25 | df = pd.read_csv(file_path)
26 | df = df.replace({np.nan: None}) # Replace NaN with None
27 |
28 | # Lists to hold batch data
29 | time_prompts = []
30 | time_ids = []
31 | time_metadatas = []
32 |
33 | problem_prompts = []
34 | problem_ids = []
35 | problem_metadatas = []
36 |
37 | column_name_to_process = df.iloc[:, COLUMN_INDEX].name
38 |
39 | # Ask for input and accept enter or y as confirmation, else end
40 | inp = input(
41 | f'Are you sure you want to process column {COLUMN_INDEX}:\n\n "{column_name_to_process}"?\n\n(y/n): '
42 | )
43 |
44 | if inp.lower() not in ["", "y"]:
45 | print("Ending process...")
46 | return
47 |
48 | print("Processing column...")
49 |
50 | # Iterate over DataFrame to accumulate batch data
51 | for index, row in df.iterrows():
52 | api_id = row["api_id"]
53 | name = row["name"]
54 | email = row["email"]
55 | program: Optional[str] = row.iloc[21]
56 |
57 | prompt_response: Optional[str] = row.iloc[COLUMN_INDEX]
58 | # problem_prompt: Optional[str] = None
59 |
60 | # Accumulate time_prompt data
61 | if prompt_response:
62 | time_prompts.append(prompt_response)
63 | time_ids.append(api_id)
64 | time_metadatas.append(
65 | {
66 | "name": name,
67 | "email": email,
68 | "program": program or "N/A",
69 | }
70 | )
71 |
72 | # Accumulate problem_prompt data
73 | # if problem_prompt:
74 | # problem_prompts.append(problem_prompt)
75 | # problem_ids.append(api_id)
76 | # problem_metadatas.append({
77 | # "name": name,
78 | # "email": email,
79 | # "program": program or "N/A",
80 | # })
81 |
82 | print(f"{index}: Processed {name} ({program})")
83 |
84 | print("Performing batch upserts...")
85 |
86 | # Split batch data into smaller chunks of 20 participants each
87 |
88 | chunk_size = 5 # This can be any value you would like. We recommend 5
89 | time_prompts = chunk_array(time_prompts, chunk_size)
90 | time_ids = chunk_array(time_ids, chunk_size)
91 | time_metadatas = chunk_array(time_metadatas, chunk_size)
92 |
93 | problem_prompts = chunk_array(problem_prompts, chunk_size)
94 | problem_ids = chunk_array(problem_ids, chunk_size)
95 | problem_metadatas = chunk_array(problem_metadatas, chunk_size)
96 |
97 | for i in range(len(time_prompts)):
98 | time_prompt_collection.upsert(
99 | ids=time_ids[i], documents=time_prompts[i], metadatas=time_metadatas[i]
100 | )
101 | print(
102 | f"Finished {len(time_prompts[i])} time prompts ({i+1}/{len(time_prompts)})"
103 | )
104 |
105 | for i in range(len(problem_prompts)):
106 | problem_prompt_collection.upsert(
107 | ids=problem_ids[i],
108 | documents=problem_prompts[i],
109 | metadatas=problem_metadatas[i],
110 | )
111 | print(
112 | f"Finished {len(problem_prompts[i])} problem prompts ({i+1}/{len(problem_prompts)})"
113 | )
114 |
115 |
116 | if __name__ == "__main__":
117 | generate_embeddings()
118 |
--------------------------------------------------------------------------------
/graph/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/.DS_Store
--------------------------------------------------------------------------------
/graph/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 |
3 | package-lock.json
4 | .vercel
5 |
--------------------------------------------------------------------------------
/graph/fonts/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/.DS_Store
--------------------------------------------------------------------------------
/graph/fonts/Space_Mono/OFL.txt:
--------------------------------------------------------------------------------
1 | Copyright 2016 Google Inc. All Rights Reserved.
2 |
3 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
4 | This license is copied below, and is also available with a FAQ at:
5 | https://openfontlicense.org
6 |
7 |
8 | -----------------------------------------------------------
9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10 | -----------------------------------------------------------
11 |
12 | PREAMBLE
13 | The goals of the Open Font License (OFL) are to stimulate worldwide
14 | development of collaborative font projects, to support the font creation
15 | efforts of academic and linguistic communities, and to provide a free and
16 | open framework in which fonts may be shared and improved in partnership
17 | with others.
18 |
19 | The OFL allows the licensed fonts to be used, studied, modified and
20 | redistributed freely as long as they are not sold by themselves. The
21 | fonts, including any derivative works, can be bundled, embedded,
22 | redistributed and/or sold with any software provided that any reserved
23 | names are not used by derivative works. The fonts and derivatives,
24 | however, cannot be released under any other type of license. The
25 | requirement for fonts to remain under this license does not apply
26 | to any document created using the fonts or their derivatives.
27 |
28 | DEFINITIONS
29 | "Font Software" refers to the set of files released by the Copyright
30 | Holder(s) under this license and clearly marked as such. This may
31 | include source files, build scripts and documentation.
32 |
33 | "Reserved Font Name" refers to any names specified as such after the
34 | copyright statement(s).
35 |
36 | "Original Version" refers to the collection of Font Software components as
37 | distributed by the Copyright Holder(s).
38 |
39 | "Modified Version" refers to any derivative made by adding to, deleting,
40 | or substituting -- in part or in whole -- any of the components of the
41 | Original Version, by changing formats or by porting the Font Software to a
42 | new environment.
43 |
44 | "Author" refers to any designer, engineer, programmer, technical
45 | writer or other person who contributed to the Font Software.
46 |
47 | PERMISSION & CONDITIONS
48 | Permission is hereby granted, free of charge, to any person obtaining
49 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
50 | redistribute, and sell modified and unmodified copies of the Font
51 | Software, subject to the following conditions:
52 |
53 | 1) Neither the Font Software nor any of its individual components,
54 | in Original or Modified Versions, may be sold by itself.
55 |
56 | 2) Original or Modified Versions of the Font Software may be bundled,
57 | redistributed and/or sold with any software, provided that each copy
58 | contains the above copyright notice and this license. These can be
59 | included either as stand-alone text files, human-readable headers or
60 | in the appropriate machine-readable metadata fields within text or
61 | binary files as long as those fields can be easily viewed by the user.
62 |
63 | 3) No Modified Version of the Font Software may use the Reserved Font
64 | Name(s) unless explicit written permission is granted by the corresponding
65 | Copyright Holder. This restriction only applies to the primary font name as
66 | presented to the users.
67 |
68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69 | Software shall not be used to promote, endorse or advertise any
70 | Modified Version, except to acknowledge the contribution(s) of the
71 | Copyright Holder(s) and the Author(s) or with their explicit written
72 | permission.
73 |
74 | 5) The Font Software, modified or unmodified, in part or in whole,
75 | must be distributed entirely under this license, and must not be
76 | distributed under any other license. The requirement for fonts to
77 | remain under this license does not apply to any document created
78 | using the Font Software.
79 |
80 | TERMINATION
81 | This license becomes null and void if any of the above conditions are
82 | not met.
83 |
84 | DISCLAIMER
85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93 | OTHER DEALINGS IN THE FONT SOFTWARE.
94 |
--------------------------------------------------------------------------------
/graph/fonts/Space_Mono/SpaceMono-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-Bold.ttf
--------------------------------------------------------------------------------
/graph/fonts/Space_Mono/SpaceMono-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-BoldItalic.ttf
--------------------------------------------------------------------------------
/graph/fonts/Space_Mono/SpaceMono-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-Italic.ttf
--------------------------------------------------------------------------------
/graph/fonts/Space_Mono/SpaceMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Space_Mono/SpaceMono-Regular.ttf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Black.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Bold.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-Light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Light.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Medium.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Regular.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf
--------------------------------------------------------------------------------
/graph/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Black.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-BlackItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-BlackItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Bold.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-BoldItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-BoldItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-Light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Light.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-LightItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-LightItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Medium.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-MediumItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-MediumItalic.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-Regular.otf
--------------------------------------------------------------------------------
/graph/fonts/Untitled Sans/UntitledSans-RegularItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/graph/fonts/Untitled Sans/UntitledSans-RegularItalic.otf
--------------------------------------------------------------------------------
/graph/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Socratica W24 Symposium Graph
5 |
6 |
7 |
8 |
9 |
17 |
21 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
34 |
Socratica
35 |
W24 Symposium
36 |
37 |
38 |
39 | They should meet
40 |
41 |
45 |
49 |
50 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/graph/index.js:
--------------------------------------------------------------------------------
1 | const graphConfig = {
2 | nodeColor: 0xe8c6a5, // (#C6492C)
3 | nodeSize: 25,
4 | nodeHoverColor: 0xffe213, // (#ffe213)
5 | nodeConnectionColor: 0xffe213, // (#a9ba22)
6 | linkFromColor: 0x732196, // (#a33f3f)
7 | linkToColor: 0xc6492c, // (#35130b)
8 | linkConnectionFromColor: 0xffffff, // (#ffffff)
9 | linkConnectionToColor: 0xffe213, // (#ffe213)
10 | springLength: 200,
11 | springCoeff: 0.001,
12 | gravity: -10,
13 | theta: 0.2,
14 | dragCoeff: 0.3,
15 | timeStep: 1,
16 | backgroundColor: 0x0, // (Socratica Black)
17 | };
18 |
19 | var createSettingsView = require("config.pixel");
20 | var query = require("query-string").parse(window.location.search.substring(1));
21 | const json = require("../graphData.json");
22 | // Use the below line if you want to use the summarized graph instead
23 | // const json = require("../summarizedGraphData.json");
24 | var graph = getGraphFromQueryString(query);
25 | var renderGraph = require("ngraph.pixel");
26 | var addCurrentNodeSettings = require("./nodeSettings.js");
27 | var THREE = require("three");
28 | var createLayout = require("pixel.layout");
29 |
30 | let activateCycle = true;
31 |
32 | const layout = createLayout(graph);
33 |
34 | var renderer = renderGraph(graph, {
35 | // See API: https://github.com/anvaka/ngraph.pixel/blob/master/index.js#L25
36 | node: () => {
37 | return {
38 | color: graphConfig.nodeColor,
39 | size: graphConfig.nodeSize,
40 | };
41 | },
42 | link: () => {
43 | return {
44 | fromColor: graphConfig.linkFromColor,
45 | toColor: graphConfig.linkToColor,
46 | };
47 | },
48 | clearColor: graphConfig.backgroundColor, // (#121212)
49 | });
50 |
51 | var simulator = renderer.layout().simulator;
52 | simulator.springLength(graphConfig.springLength);
53 | simulator.springCoeff(graphConfig.springCoeff);
54 | simulator.gravity(graphConfig.gravity);
55 | simulator.theta(graphConfig.theta);
56 | simulator.dragCoeff(graphConfig.dragCoeff);
57 | simulator.timeStep(graphConfig.timeStep);
58 | renderer.focus();
59 | // var settingsView = createSettingsView(renderer);
60 | // var gui = settingsView.gui();
61 |
62 | // var nodeSettings = addCurrentNodeSettings(gui, renderer);
63 |
64 | renderer.on("nodehover", showNodeDetails);
65 | renderer.on("nodeclick", resetNodeDetails);
66 |
67 | const nodeAttendees = document.getElementById("nodeAttendees").textContent;
68 | console.log(nodeAttendees);
69 | document.getElementById(
70 | "nodeAttendees"
71 | ).textContent = `${json.nodes.length} People`;
72 |
73 | function showNodeDetails(node) {
74 | if (!node) {
75 | return;
76 | }
77 |
78 | // Reset node and link colors
79 | resetNodeDetails();
80 |
81 | // Update node details
82 | document.getElementById("nodeName").textContent =
83 | node.data.name.toUpperCase();
84 | document.getElementById("nodeMajor").textContent =
85 | node.data.major && node.data.major != "N/A" ? node.data.major : "";
86 | document.getElementById("nodeConnections").textContent = `${
87 | graph.getLinks(node.id)?.length || 0
88 | } Potential Connections`;
89 | document.getElementById("nodeDescription").textContent = node.data.response;
90 |
91 | const topMatch = node.data.topMatch;
92 | const topMatchNode = graph.getNode(topMatch);
93 |
94 | const topMatchName = document.getElementById("topMatchName");
95 | const topMatchResponse = document.getElementById("topMatchResponse");
96 |
97 | if (topMatch) {
98 | topMatchName.textContent = topMatchNode.data.name;
99 | topMatchResponse.textContent = `Who ${
100 | topMatchNode.data.response.charAt(0).toLowerCase() +
101 | topMatchNode.data.response.slice(1)
102 | }`;
103 | } else {
104 | topMatchName.textContent = "";
105 | topMatchResponse.textContent = "";
106 | }
107 |
108 | // Show the panel
109 | document.getElementById("nodePanel").classList.remove("hidden");
110 |
111 | // Update node and link colors as before...
112 | var nodeUI = renderer.getNode(node.id);
113 | nodeUI.color = graphConfig.nodeHoverColor;
114 |
115 | if (graph.getLinks(node.id)) {
116 | graph.getLinks(node.id).forEach(function (link) {
117 | var toNode = link.toId === node.id ? link.fromId : link.toId;
118 | var toNodeUI = renderer.getNode(toNode);
119 | toNodeUI.color = graphConfig.nodeConnectionColor;
120 |
121 | var linkUI = renderer.getLink(link.id);
122 | linkUI.fromColor = graphConfig.linkConnectionFromColor;
123 | linkUI.toColor = graphConfig.linkConnectionToColor;
124 | });
125 | }
126 | }
127 |
128 | function resetNodeDetails() {
129 | // Hide the node panel
130 | document.getElementById("nodePanel").classList.add("hidden");
131 |
132 | // Reset node and link colors as before...
133 | graph.forEachNode(function (node) {
134 | var nodeUI = renderer.getNode(node.id);
135 | nodeUI.color = graphConfig.nodeColor;
136 | });
137 | graph.forEachLink(function (link) {
138 | var linkUI = renderer.getLink(link.id);
139 | linkUI.fromColor = graphConfig.linkFromColor;
140 | linkUI.toColor = graphConfig.linkToColor;
141 | });
142 | }
143 |
144 | function getGraphFromQueryString(query) {
145 | var graphGenerators = require("ngraph.generators");
146 | var createGraph = graphGenerators[query.graph] || graphGenerators.grid;
147 | return query.graph
148 | ? createGraph(
149 | getNumber(query.n),
150 | getNumber(query.m),
151 | getNumber(query.k)
152 | )
153 | : populateGraph();
154 | }
155 |
156 | function getNumber(string, defaultValue) {
157 | var number = parseFloat(string);
158 | return typeof number === "number" && !isNaN(number)
159 | ? number
160 | : defaultValue || 10;
161 | }
162 |
163 | function populateGraph() {
164 | var createGraph = require("ngraph.graph");
165 | var g = createGraph();
166 |
167 | var nodes = json.nodes;
168 | var links = json.links;
169 |
170 | nodes.forEach(function (node) {
171 | g.addNode(node.id, node.data);
172 | });
173 | links.forEach(function (link) {
174 | g.addLink(link.source, link.target);
175 | });
176 |
177 | return g;
178 | }
179 |
180 | function intersect(from, to, r) {
181 | var dx = from.x - to.x;
182 | var dy = from.y - to.y;
183 | var dz = from.z - to.z;
184 | var r1 = Math.sqrt(dx * dx + dy * dy + dz * dz);
185 | var teta = Math.acos(dz / r1);
186 | var phi = Math.atan2(dy, dx);
187 |
188 | return {
189 | x: r * Math.sin(teta) * Math.cos(phi) + to.x,
190 | y: r * Math.sin(teta) * Math.sin(phi) + to.y,
191 | z: r * Math.cos(teta) + to.z,
192 | };
193 | }
194 |
195 | function flyTo(camera, to, radius) {
196 | if (!to || to.x === undefined || to.y === undefined || to.z === undefined) {
197 | console.error("Invalid target position:", to);
198 | return;
199 | }
200 |
201 | var from = {
202 | x: camera.position.x,
203 | y: camera.position.y,
204 | z: camera.position.z,
205 | };
206 |
207 | var cameraOffset = radius / Math.tan((Math.PI / 180.0) * camera.fov * 0.5);
208 | var cameraEndPos = intersect(from, to, cameraOffset);
209 |
210 | if (!cameraEndPos) {
211 | console.error("Failed to calculate camera end position.");
212 | return;
213 | }
214 |
215 | camera.position.set(to.x, to.y, to.z);
216 | // camera.lookAt(new THREE.Vector3(to.x, to.y, to.z));
217 | }
218 |
219 | function getRandomNodeId() {
220 | console.log(json.nodes);
221 | if (json.nodes.length === 0) return null;
222 | const randomIndex = Math.floor(Math.random() * json.nodes.length);
223 | return json.nodes[randomIndex];
224 | }
225 |
226 | function cycleThroughNodes() {
227 | setInterval(() => {
228 | const randomNode = getRandomNodeId();
229 | if (randomNode && activateCycle) {
230 | showNodeDetails(randomNode);
231 | }
232 | }, 10000);
233 | }
234 |
235 | function showSearchBar() {
236 | if (document.getElementById("searchBarContainer")) {
237 | document.getElementById("searchBarContainer").remove();
238 | }
239 |
240 | var nodes = json.nodes;
241 |
242 | var searchBarContainer = document.createElement("div");
243 | searchBarContainer.id = "searchBarContainer";
244 | searchBarContainer.style.position = "absolute";
245 | searchBarContainer.style.top = "20px";
246 | searchBarContainer.style.right = "20px";
247 | searchBarContainer.style.background = "rgba(255, 255, 255, 0.2)";
248 | searchBarContainer.style.borderRadius = "12px";
249 | searchBarContainer.style.border = "1px solid rgba(255, 255, 255, 0.18)";
250 | searchBarContainer.style.backdropFilter = "blur(5px)";
251 | searchBarContainer.style.padding = "20px";
252 | searchBarContainer.style.width = "300px";
253 | searchBarContainer.style.boxSizing = "border-box";
254 | searchBarContainer.style.fontFamily = "'Geist', sans-serif";
255 | searchBarContainer.style.display = "flex";
256 | searchBarContainer.style.flexDirection = "column";
257 | searchBarContainer.style.gap = "10px";
258 |
259 | var input = document.createElement("input");
260 | input.style.padding = "10px";
261 | input.style.borderRadius = "8px";
262 | input.style.border = "none";
263 | input.style.background = "rgba(0, 0, 0, 0.4)";
264 | input.style.borderRadius = "12px";
265 | input.style.border = "1px solid rgba(255, 255, 255, 0.18)";
266 | input.style.backdropFilter = "blur(5px)";
267 | input.style.fontFamily = "'Geist', sans-serif";
268 | input.style.outlineColor = "rgba(255, 255, 255, 0.1)";
269 | input.style.color = "white";
270 |
271 | var button = document.createElement("button");
272 | button.style.fontFamily = "'Geist', sans-serif";
273 | button.textContent = "Search";
274 | button.style.color = "white";
275 | button.style.padding = "10px";
276 | button.style.borderRadius = "8px";
277 | button.style.border = "none";
278 | button.style.cursor = "pointer";
279 | button.style.background = "rgba(0, 0, 0, 0.4)";
280 |
281 | input.addEventListener("keyup", function (event) {
282 | if (event.key === "Enter") {
283 | event.preventDefault();
284 | button.click();
285 | }
286 | });
287 |
288 | var resultsContainer = document.createElement("div");
289 | resultsContainer.id = "resultsContainer";
290 | resultsContainer.style.maxHeight = "150px";
291 | resultsContainer.style.overflowY = "auto";
292 | resultsContainer.style.marginTop = "10px";
293 | resultsContainer.style.display = "flex";
294 | resultsContainer.style.flexDirection = "column";
295 | resultsContainer.style.gap = "5px";
296 | resultsContainer.style.color = "white";
297 |
298 | searchBarContainer.appendChild(input);
299 | searchBarContainer.appendChild(button);
300 | searchBarContainer.appendChild(resultsContainer);
301 |
302 | document.body.appendChild(searchBarContainer);
303 |
304 | button.addEventListener("click", function () {
305 | resultsContainer.innerHTML = "";
306 |
307 | var query = input.value;
308 | var matchingIndexes = searchByNameOrSchool(nodes, query);
309 |
310 | matchingIndexes.forEach((index) => {
311 | var node = nodes.find((node) => node.id === index);
312 | if (node) {
313 | var result = document.createElement("div");
314 | result.innerHTML = `${node.data.name} ${
315 | node.data.major != "N/A" ? node.data.major : ""
316 | } `;
317 | resultsContainer.appendChild(result);
318 | result.style.cursor = "pointer";
319 |
320 | result.addEventListener("click", function () {
321 | var nodePosition = layout.getNodePosition
322 | ? layout.getNodePosition(node.id)
323 | : { x: 0, y: 0, z: 0 };
324 | activateCycle = false;
325 | showNodeDetails(node);
326 | console.log(renderer.camera());
327 | console.log(nodePosition);
328 | });
329 | }
330 | });
331 |
332 | if (matchingIndexes.length === 0) {
333 | resultsContainer.innerHTML = "No results found
";
334 | }
335 | });
336 | }
337 |
338 | function searchByNameOrSchool(nodes, query) {
339 | const resultIds = nodes
340 | .filter((node) => {
341 | const nameMatch = node.data.name
342 | .toLowerCase()
343 | .includes(query.toLowerCase());
344 | return nameMatch;
345 | })
346 | .map((node) => node.id);
347 |
348 | return resultIds;
349 | }
350 |
351 | // uncomment this if you want search in the graph
352 | // showSearchBar();
353 |
354 | cycleThroughNodes();
355 |
--------------------------------------------------------------------------------
/graph/input.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | // Add Tiempos Headline font in otf, from light to black
6 | @font-face {
7 | font-family: "Tiempos Headline";
8 | font-style: normal;
9 | font-weight: 300;
10 | src: url("fonts/Tiempos Headline/TiemposHeadline-Light.otf")
11 | format("opentype");
12 | }
13 |
14 | @font-face {
15 | font-family: "Tiempos Headline";
16 | font-style: normal;
17 | font-weight: 400;
18 | src: url("fonts/Tiempos Headline/TiemposHeadline-Regular.otf")
19 | format("opentype");
20 | }
21 |
22 | @font-face {
23 | font-family: "Tiempos Headline";
24 | font-style: normal;
25 | font-weight: 500;
26 | src: url("fonts/Tiempos Headline/TiemposHeadline-Medium.otf")
27 | format("opentype");
28 | }
29 |
30 | @font-face {
31 | font-family: "Tiempos Headline";
32 | font-style: normal;
33 | font-weight: 600;
34 | src: url("fonts/Tiempos Headline/TiemposHeadline-Semibold.otf")
35 | format("opentype");
36 | }
37 |
38 | @font-face {
39 | font-family: "Tiempos Headline";
40 | font-style: normal;
41 | font-weight: 700;
42 | src: url("fonts/Tiempos Headline/TiemposHeadline-Bold.otf") format("opentype");
43 | }
44 |
45 | // Add italic versions of Tiempos Headline font
46 | @font-face {
47 | font-family: "Tiempos Headline";
48 | font-style: italic;
49 | font-weight: 300;
50 | src: url("fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf")
51 | format("opentype");
52 | }
53 |
54 | @font-face {
55 | font-family: "Tiempos Headline";
56 | font-style: italic;
57 | font-weight: 400;
58 | src: url("fonts/Tiempos Headline/TiemposHeadline-Italic.otf")
59 | format("opentype");
60 | }
61 |
62 | @font-face {
63 | font-family: "Tiempos Headline";
64 | font-style: italic;
65 | font-weight: 500;
66 | src: url("fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf")
67 | format("opentype");
68 | }
69 |
70 | @font-face {
71 | font-family: "Tiempos Headline";
72 | font-style: italic;
73 | font-weight: 600;
74 | src: url("fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf")
75 | format("opentype");
76 | }
77 |
78 | @font-face {
79 | font-family: "Tiempos Headline";
80 | font-style: italic;
81 | font-weight: 700;
82 | src: url("fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf")
83 | format("opentype");
84 | }
85 |
86 | // SpaceMono
87 |
88 | @font-face {
89 | font-family: "Space Mono";
90 | font-style: normal;
91 | font-weight: 400;
92 | src: url("fonts/Space_Mono/SpaceMono-Regular.ttf") format("truetype");
93 | }
94 |
95 | @font-face {
96 | font-family: "Space Mono";
97 | font-style: normal;
98 | font-weight: 700;
99 | src: url("fonts/Space_Mono/SpaceMono-Bold.ttf") format("truetype");
100 | }
101 |
102 | @font-face {
103 | font-family: "Space Mono";
104 | font-style: italic;
105 | font-weight: 400;
106 | src: url("fonts/Space_Mono/SpaceMono-Italic.ttf") format("truetype");
107 | }
108 |
109 | @font-face {
110 | font-family: "Space Mono";
111 | font-style: italic;
112 | font-weight: 700;
113 | src: url("fonts/Space_Mono/SpaceMono-BoldItalic.ttf") format("truetype");
114 | }
115 |
116 | // Untitled Sans
117 |
118 | @font-face {
119 | font-family: "Untitled Sans";
120 | font-style: normal;
121 | font-weight: 300;
122 | src: url("fonts/Untitled Sans/UntitledSans-Light.otf") format("opentype");
123 | }
124 |
125 | @font-face {
126 | font-family: "Untitled Sans";
127 | font-style: normal;
128 | font-weight: 400;
129 | src: url("fonts/Untitled Sans/UntitledSans-Regular.otf") format("opentype");
130 | }
131 |
132 | @font-face {
133 | font-family: "Untitled Sans";
134 | font-style: normal;
135 | font-weight: 500;
136 | src: url("fonts/Untitled Sans/UntitledSans-Medium.otf") format("opentype");
137 | }
138 |
139 | @font-face {
140 | font-family: "Untitled Sans";
141 | font-style: normal;
142 | font-weight: 700;
143 | src: url("fonts/Untitled Sans/UntitledSans-Bold.otf") format("opentype");
144 | }
145 |
--------------------------------------------------------------------------------
/graph/nodeSettings.js:
--------------------------------------------------------------------------------
1 | module.exports = createNodeSettings;
2 |
3 | function createNodeSettings(gui, renderer) {
4 | var nodeSettings = gui.addFolder("Current Node");
5 | var currentNode = {
6 | id: "",
7 | color: 0,
8 | size: 0,
9 | isPinned: false,
10 | };
11 |
12 | nodeSettings.add(currentNode, "id");
13 | nodeSettings.addColor(currentNode, "color").onChange(setColor);
14 | nodeSettings.add(currentNode, "size", 0, 200).onChange(setSize);
15 | nodeSettings.add(currentNode, "isPinned").onChange(setPinned);
16 |
17 | return {
18 | setUI: setUI,
19 | };
20 |
21 | function setUI(nodeUI) {
22 | if (nodeUI) {
23 | currentNode.id = nodeUI.id;
24 | currentNode.color = nodeUI.color;
25 | currentNode.size = nodeUI.size;
26 | var layout = renderer.layout();
27 | if (layout && layout.pinNode) {
28 | currentNode.isPinned = layout.pinNode(nodeUI.id);
29 | }
30 | } else {
31 | currentNode.id = "";
32 | currentNode.color = 0;
33 | currentNode.size = 0;
34 | currentNode.isPinned = false;
35 | }
36 | gui.update();
37 | }
38 |
39 | function setColor() {
40 | var node = renderer.getNode(currentNode.id);
41 | if (node) {
42 | node.color = currentNode.color;
43 | renderer.focus();
44 | }
45 | }
46 |
47 | function setSize() {
48 | var node = renderer.getNode(currentNode.id);
49 | if (node) {
50 | node.size = currentNode.size;
51 | renderer.focus();
52 | }
53 | }
54 |
55 | function setPinned() {
56 | if (!currentNode.id) return;
57 |
58 | var layout = renderer.layout();
59 | if (layout.pinNode) {
60 | layout.pinNode(currentNode.id, currentNode.isPinned);
61 | } else {
62 | currentNode.isPinned = false;
63 | gui.update();
64 | }
65 | renderer.focus();
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/graph/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "devDependencies": {
3 | "config.pixel": "2.0.0",
4 | "ngraph.generators": "0.0.18",
5 | "query-string": "^1.0.0",
6 | "tailwindcss": "^3.4.3",
7 | "watchify": "^4.0.0"
8 | },
9 | "scripts": {
10 | "build": "npx tailwindcss -i ./input.css -o ./output.css && browserify index.js -o bundle.js",
11 | "start": "browserify index.js -o bundle.js",
12 | "dev": "watchify index.js -o bundle.js",
13 | "tailwind": "npx tailwindcss -i ./input.css -o ./output.css --watch"
14 | },
15 | "dependencies": {
16 | "browserify": "^17.0.0"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/graph/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | dependencies:
8 | browserify:
9 | specifier: ^17.0.0
10 | version: 17.0.0
11 |
12 | devDependencies:
13 | config.pixel:
14 | specifier: 2.0.0
15 | version: 2.0.0(ngraph.pixel@2.4.1)
16 | ngraph.generators:
17 | specifier: 0.0.18
18 | version: 0.0.18
19 | query-string:
20 | specifier: ^1.0.0
21 | version: 1.0.1
22 | tailwindcss:
23 | specifier: ^3.4.3
24 | version: 3.4.3
25 | watchify:
26 | specifier: ^4.0.0
27 | version: 4.0.0
28 |
29 | packages:
30 |
31 | /@alloc/quick-lru@5.2.0:
32 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
33 | engines: {node: '>=10'}
34 | dev: true
35 |
36 | /@isaacs/cliui@8.0.2:
37 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
38 | engines: {node: '>=12'}
39 | dependencies:
40 | string-width: 5.1.2
41 | string-width-cjs: /string-width@4.2.3
42 | strip-ansi: 7.1.0
43 | strip-ansi-cjs: /strip-ansi@6.0.1
44 | wrap-ansi: 8.1.0
45 | wrap-ansi-cjs: /wrap-ansi@7.0.0
46 | dev: true
47 |
48 | /@jridgewell/gen-mapping@0.3.5:
49 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
50 | engines: {node: '>=6.0.0'}
51 | dependencies:
52 | '@jridgewell/set-array': 1.2.1
53 | '@jridgewell/sourcemap-codec': 1.4.15
54 | '@jridgewell/trace-mapping': 0.3.25
55 | dev: true
56 |
57 | /@jridgewell/resolve-uri@3.1.2:
58 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
59 | engines: {node: '>=6.0.0'}
60 | dev: true
61 |
62 | /@jridgewell/set-array@1.2.1:
63 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
64 | engines: {node: '>=6.0.0'}
65 | dev: true
66 |
67 | /@jridgewell/sourcemap-codec@1.4.15:
68 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
69 | dev: true
70 |
71 | /@jridgewell/trace-mapping@0.3.25:
72 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
73 | dependencies:
74 | '@jridgewell/resolve-uri': 3.1.2
75 | '@jridgewell/sourcemap-codec': 1.4.15
76 | dev: true
77 |
78 | /@nodelib/fs.scandir@2.1.5:
79 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
80 | engines: {node: '>= 8'}
81 | dependencies:
82 | '@nodelib/fs.stat': 2.0.5
83 | run-parallel: 1.2.0
84 | dev: true
85 |
86 | /@nodelib/fs.stat@2.0.5:
87 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
88 | engines: {node: '>= 8'}
89 | dev: true
90 |
91 | /@nodelib/fs.walk@1.2.8:
92 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
93 | engines: {node: '>= 8'}
94 | dependencies:
95 | '@nodelib/fs.scandir': 2.1.5
96 | fastq: 1.17.1
97 | dev: true
98 |
99 | /@pkgjs/parseargs@0.11.0:
100 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
101 | engines: {node: '>=14'}
102 | requiresBuild: true
103 | dev: true
104 | optional: true
105 |
106 | /JSONStream@1.3.5:
107 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
108 | hasBin: true
109 | dependencies:
110 | jsonparse: 1.3.1
111 | through: 2.3.8
112 |
113 | /acorn-node@1.8.2:
114 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
115 | dependencies:
116 | acorn: 7.4.1
117 | acorn-walk: 7.2.0
118 | xtend: 4.0.2
119 |
120 | /acorn-walk@7.2.0:
121 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
122 | engines: {node: '>=0.4.0'}
123 |
124 | /acorn@7.4.1:
125 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
126 | engines: {node: '>=0.4.0'}
127 | hasBin: true
128 |
129 | /ansi-regex@5.0.1:
130 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
131 | engines: {node: '>=8'}
132 | dev: true
133 |
134 | /ansi-regex@6.0.1:
135 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
136 | engines: {node: '>=12'}
137 | dev: true
138 |
139 | /ansi-styles@4.3.0:
140 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
141 | engines: {node: '>=8'}
142 | dependencies:
143 | color-convert: 2.0.1
144 | dev: true
145 |
146 | /ansi-styles@6.2.1:
147 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
148 | engines: {node: '>=12'}
149 | dev: true
150 |
151 | /any-promise@1.3.0:
152 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
153 | dev: true
154 |
155 | /anymatch@3.1.3:
156 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
157 | engines: {node: '>= 8'}
158 | dependencies:
159 | normalize-path: 3.0.0
160 | picomatch: 2.3.1
161 | dev: true
162 |
163 | /arg@5.0.2:
164 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
165 | dev: true
166 |
167 | /asn1.js@4.10.1:
168 | resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==}
169 | dependencies:
170 | bn.js: 4.12.0
171 | inherits: 2.0.4
172 | minimalistic-assert: 1.0.1
173 |
174 | /assert@1.5.1:
175 | resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==}
176 | dependencies:
177 | object.assign: 4.1.5
178 | util: 0.10.4
179 |
180 | /available-typed-arrays@1.0.7:
181 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
182 | engines: {node: '>= 0.4'}
183 | dependencies:
184 | possible-typed-array-names: 1.0.0
185 |
186 | /balanced-match@1.0.2:
187 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
188 |
189 | /base64-js@1.5.1:
190 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
191 |
192 | /binary-extensions@2.3.0:
193 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
194 | engines: {node: '>=8'}
195 | dev: true
196 |
197 | /bn.js@4.12.0:
198 | resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
199 |
200 | /bn.js@5.2.1:
201 | resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
202 |
203 | /brace-expansion@1.1.11:
204 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
205 | dependencies:
206 | balanced-match: 1.0.2
207 | concat-map: 0.0.1
208 |
209 | /brace-expansion@2.0.1:
210 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
211 | dependencies:
212 | balanced-match: 1.0.2
213 | dev: true
214 |
215 | /braces@3.0.2:
216 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
217 | engines: {node: '>=8'}
218 | dependencies:
219 | fill-range: 7.0.1
220 | dev: true
221 |
222 | /brfs@1.6.1:
223 | resolution: {integrity: sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==}
224 | hasBin: true
225 | dependencies:
226 | quote-stream: 1.0.2
227 | resolve: 1.22.8
228 | static-module: 2.2.5
229 | through2: 2.0.5
230 | dev: true
231 |
232 | /brorand@1.1.0:
233 | resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
234 |
235 | /browser-pack@6.1.0:
236 | resolution: {integrity: sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==}
237 | hasBin: true
238 | dependencies:
239 | JSONStream: 1.3.5
240 | combine-source-map: 0.8.0
241 | defined: 1.0.1
242 | safe-buffer: 5.2.1
243 | through2: 2.0.5
244 | umd: 3.0.3
245 |
246 | /browser-resolve@2.0.0:
247 | resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==}
248 | dependencies:
249 | resolve: 1.22.8
250 |
251 | /browserify-aes@1.2.0:
252 | resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
253 | dependencies:
254 | buffer-xor: 1.0.3
255 | cipher-base: 1.0.4
256 | create-hash: 1.2.0
257 | evp_bytestokey: 1.0.3
258 | inherits: 2.0.4
259 | safe-buffer: 5.2.1
260 |
261 | /browserify-cipher@1.0.1:
262 | resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
263 | dependencies:
264 | browserify-aes: 1.2.0
265 | browserify-des: 1.0.2
266 | evp_bytestokey: 1.0.3
267 |
268 | /browserify-des@1.0.2:
269 | resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
270 | dependencies:
271 | cipher-base: 1.0.4
272 | des.js: 1.1.0
273 | inherits: 2.0.4
274 | safe-buffer: 5.2.1
275 |
276 | /browserify-rsa@4.1.0:
277 | resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==}
278 | dependencies:
279 | bn.js: 5.2.1
280 | randombytes: 2.1.0
281 |
282 | /browserify-sign@4.2.3:
283 | resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==}
284 | engines: {node: '>= 0.12'}
285 | dependencies:
286 | bn.js: 5.2.1
287 | browserify-rsa: 4.1.0
288 | create-hash: 1.2.0
289 | create-hmac: 1.1.7
290 | elliptic: 6.5.5
291 | hash-base: 3.0.4
292 | inherits: 2.0.4
293 | parse-asn1: 5.1.7
294 | readable-stream: 2.3.8
295 | safe-buffer: 5.2.1
296 |
297 | /browserify-zlib@0.2.0:
298 | resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
299 | dependencies:
300 | pako: 1.0.11
301 |
302 | /browserify@17.0.0:
303 | resolution: {integrity: sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==}
304 | engines: {node: '>= 0.8'}
305 | hasBin: true
306 | dependencies:
307 | JSONStream: 1.3.5
308 | assert: 1.5.1
309 | browser-pack: 6.1.0
310 | browser-resolve: 2.0.0
311 | browserify-zlib: 0.2.0
312 | buffer: 5.2.1
313 | cached-path-relative: 1.1.0
314 | concat-stream: 1.6.2
315 | console-browserify: 1.2.0
316 | constants-browserify: 1.0.0
317 | crypto-browserify: 3.12.0
318 | defined: 1.0.1
319 | deps-sort: 2.0.1
320 | domain-browser: 1.2.0
321 | duplexer2: 0.1.4
322 | events: 3.3.0
323 | glob: 7.2.3
324 | has: 1.0.4
325 | htmlescape: 1.1.1
326 | https-browserify: 1.0.0
327 | inherits: 2.0.4
328 | insert-module-globals: 7.2.1
329 | labeled-stream-splicer: 2.0.2
330 | mkdirp-classic: 0.5.3
331 | module-deps: 6.2.3
332 | os-browserify: 0.3.0
333 | parents: 1.0.1
334 | path-browserify: 1.0.1
335 | process: 0.11.10
336 | punycode: 1.4.1
337 | querystring-es3: 0.2.1
338 | read-only-stream: 2.0.0
339 | readable-stream: 2.3.8
340 | resolve: 1.22.8
341 | shasum-object: 1.0.0
342 | shell-quote: 1.8.1
343 | stream-browserify: 3.0.0
344 | stream-http: 3.2.0
345 | string_decoder: 1.3.0
346 | subarg: 1.0.0
347 | syntax-error: 1.4.0
348 | through2: 2.0.5
349 | timers-browserify: 1.4.2
350 | tty-browserify: 0.0.1
351 | url: 0.11.3
352 | util: 0.12.5
353 | vm-browserify: 1.1.2
354 | xtend: 4.0.2
355 |
356 | /buffer-equal@0.0.1:
357 | resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==}
358 | engines: {node: '>=0.4.0'}
359 | dev: true
360 |
361 | /buffer-from@1.1.2:
362 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
363 |
364 | /buffer-xor@1.0.3:
365 | resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
366 |
367 | /buffer@5.2.1:
368 | resolution: {integrity: sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==}
369 | dependencies:
370 | base64-js: 1.5.1
371 | ieee754: 1.2.1
372 |
373 | /builtin-status-codes@3.0.0:
374 | resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
375 |
376 | /cached-path-relative@1.1.0:
377 | resolution: {integrity: sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==}
378 |
379 | /call-bind@1.0.7:
380 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
381 | engines: {node: '>= 0.4'}
382 | dependencies:
383 | es-define-property: 1.0.0
384 | es-errors: 1.3.0
385 | function-bind: 1.1.2
386 | get-intrinsic: 1.2.4
387 | set-function-length: 1.2.2
388 |
389 | /camelcase-css@2.0.1:
390 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
391 | engines: {node: '>= 6'}
392 | dev: true
393 |
394 | /chokidar@3.6.0:
395 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
396 | engines: {node: '>= 8.10.0'}
397 | dependencies:
398 | anymatch: 3.1.3
399 | braces: 3.0.2
400 | glob-parent: 5.1.2
401 | is-binary-path: 2.1.0
402 | is-glob: 4.0.3
403 | normalize-path: 3.0.0
404 | readdirp: 3.6.0
405 | optionalDependencies:
406 | fsevents: 2.3.3
407 | dev: true
408 |
409 | /cipher-base@1.0.4:
410 | resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
411 | dependencies:
412 | inherits: 2.0.4
413 | safe-buffer: 5.2.1
414 |
415 | /color-convert@2.0.1:
416 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
417 | engines: {node: '>=7.0.0'}
418 | dependencies:
419 | color-name: 1.1.4
420 | dev: true
421 |
422 | /color-name@1.1.4:
423 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
424 | dev: true
425 |
426 | /combine-source-map@0.8.0:
427 | resolution: {integrity: sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==}
428 | dependencies:
429 | convert-source-map: 1.1.3
430 | inline-source-map: 0.6.3
431 | lodash.memoize: 3.0.4
432 | source-map: 0.5.7
433 |
434 | /commander@4.1.1:
435 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
436 | engines: {node: '>= 6'}
437 | dev: true
438 |
439 | /concat-map@0.0.1:
440 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
441 |
442 | /concat-stream@1.6.2:
443 | resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
444 | engines: {'0': node >= 0.8}
445 | dependencies:
446 | buffer-from: 1.1.2
447 | inherits: 2.0.4
448 | readable-stream: 2.3.8
449 | typedarray: 0.0.6
450 |
451 | /config.layout@0.1.2:
452 | resolution: {integrity: sha512-urXkJgq6AJu7RACZl9jxH8DGGEbcT7+IGTi9yXGcQSlrg0GwhfmrkU1TOkb0PBfq4VCv8f9QJSAByEsHCgcqXg==}
453 | dev: true
454 |
455 | /config.pixel@2.0.0(ngraph.pixel@2.4.1):
456 | resolution: {integrity: sha512-doE1RnfvKJdOnvp+bnHMB6/U3kKH2skQjz4XCJa7EmPzVN+2vqMEqjdGVg+nuTuy5iflZLNHQjXJqs+au9vo9g==}
457 | peerDependencies:
458 | ngraph.pixel: 2.x
459 | dependencies:
460 | config.layout: 0.1.2
461 | config.view: 2.0.0(ngraph.pixel@2.4.1)
462 | exdat: 0.6.2
463 | ngraph.pixel: 2.4.1
464 | dev: true
465 |
466 | /config.view@2.0.0(ngraph.pixel@2.4.1):
467 | resolution: {integrity: sha512-SNEMjfSmCygVjlTjMKwfstG/gOHjKi8lDxVOQ8OfJKexgMv2soZsYY7f995TL1VmevXKMiR240motq+bZdrdXw==}
468 | peerDependencies:
469 | ngraph.pixel: 2.x
470 | dependencies:
471 | ngraph.pixel: 2.4.1
472 | dev: true
473 |
474 | /console-browserify@1.2.0:
475 | resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
476 |
477 | /constants-browserify@1.0.0:
478 | resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
479 |
480 | /convert-source-map@1.1.3:
481 | resolution: {integrity: sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==}
482 |
483 | /convert-source-map@1.9.0:
484 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
485 | dev: true
486 |
487 | /core-util-is@1.0.3:
488 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
489 |
490 | /create-ecdh@4.0.4:
491 | resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
492 | dependencies:
493 | bn.js: 4.12.0
494 | elliptic: 6.5.5
495 |
496 | /create-hash@1.2.0:
497 | resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
498 | dependencies:
499 | cipher-base: 1.0.4
500 | inherits: 2.0.4
501 | md5.js: 1.3.5
502 | ripemd160: 2.0.2
503 | sha.js: 2.4.11
504 |
505 | /create-hmac@1.1.7:
506 | resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
507 | dependencies:
508 | cipher-base: 1.0.4
509 | create-hash: 1.2.0
510 | inherits: 2.0.4
511 | ripemd160: 2.0.2
512 | safe-buffer: 5.2.1
513 | sha.js: 2.4.11
514 |
515 | /cross-spawn@7.0.3:
516 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
517 | engines: {node: '>= 8'}
518 | dependencies:
519 | path-key: 3.1.1
520 | shebang-command: 2.0.0
521 | which: 2.0.2
522 | dev: true
523 |
524 | /crypto-browserify@3.12.0:
525 | resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==}
526 | dependencies:
527 | browserify-cipher: 1.0.1
528 | browserify-sign: 4.2.3
529 | create-ecdh: 4.0.4
530 | create-hash: 1.2.0
531 | create-hmac: 1.1.7
532 | diffie-hellman: 5.0.3
533 | inherits: 2.0.4
534 | pbkdf2: 3.1.2
535 | public-encrypt: 4.0.3
536 | randombytes: 2.1.0
537 | randomfill: 1.0.4
538 |
539 | /cssesc@3.0.0:
540 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
541 | engines: {node: '>=4'}
542 | hasBin: true
543 | dev: true
544 |
545 | /dash-ast@1.0.0:
546 | resolution: {integrity: sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==}
547 |
548 | /deep-is@0.1.4:
549 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
550 | dev: true
551 |
552 | /define-data-property@1.1.4:
553 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
554 | engines: {node: '>= 0.4'}
555 | dependencies:
556 | es-define-property: 1.0.0
557 | es-errors: 1.3.0
558 | gopd: 1.0.1
559 |
560 | /define-properties@1.2.1:
561 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
562 | engines: {node: '>= 0.4'}
563 | dependencies:
564 | define-data-property: 1.1.4
565 | has-property-descriptors: 1.0.2
566 | object-keys: 1.1.1
567 |
568 | /defined@1.0.1:
569 | resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
570 |
571 | /deps-sort@2.0.1:
572 | resolution: {integrity: sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==}
573 | hasBin: true
574 | dependencies:
575 | JSONStream: 1.3.5
576 | shasum-object: 1.0.0
577 | subarg: 1.0.0
578 | through2: 2.0.5
579 |
580 | /des.js@1.1.0:
581 | resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
582 | dependencies:
583 | inherits: 2.0.4
584 | minimalistic-assert: 1.0.1
585 |
586 | /detective@5.2.1:
587 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
588 | engines: {node: '>=0.8.0'}
589 | hasBin: true
590 | dependencies:
591 | acorn-node: 1.8.2
592 | defined: 1.0.1
593 | minimist: 1.2.8
594 |
595 | /didyoumean@1.2.2:
596 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
597 | dev: true
598 |
599 | /diffie-hellman@5.0.3:
600 | resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
601 | dependencies:
602 | bn.js: 4.12.0
603 | miller-rabin: 4.0.1
604 | randombytes: 2.1.0
605 |
606 | /dlv@1.1.3:
607 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
608 | dev: true
609 |
610 | /domain-browser@1.2.0:
611 | resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==}
612 | engines: {node: '>=0.4', npm: '>=1.2'}
613 |
614 | /duplexer2@0.1.4:
615 | resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
616 | dependencies:
617 | readable-stream: 2.3.8
618 |
619 | /eastasianwidth@0.2.0:
620 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
621 | dev: true
622 |
623 | /element-class@0.2.2:
624 | resolution: {integrity: sha512-e4tkRAFtQkGiZB8fzxAFdjEbx5zajMb1GpiRwKs3lhOLxQcvdOIG7XlERT1sTX3/ulIUGZrgL02YZ0cRNC5OLQ==}
625 | dev: true
626 |
627 | /elliptic@6.5.5:
628 | resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==}
629 | dependencies:
630 | bn.js: 4.12.0
631 | brorand: 1.1.0
632 | hash.js: 1.1.7
633 | hmac-drbg: 1.0.1
634 | inherits: 2.0.4
635 | minimalistic-assert: 1.0.1
636 | minimalistic-crypto-utils: 1.0.1
637 |
638 | /emoji-regex@8.0.0:
639 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
640 | dev: true
641 |
642 | /emoji-regex@9.2.2:
643 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
644 | dev: true
645 |
646 | /es-define-property@1.0.0:
647 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
648 | engines: {node: '>= 0.4'}
649 | dependencies:
650 | get-intrinsic: 1.2.4
651 |
652 | /es-errors@1.3.0:
653 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
654 | engines: {node: '>= 0.4'}
655 |
656 | /escodegen@1.9.1:
657 | resolution: {integrity: sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==}
658 | engines: {node: '>=4.0'}
659 | hasBin: true
660 | dependencies:
661 | esprima: 3.1.3
662 | estraverse: 4.3.0
663 | esutils: 2.0.3
664 | optionator: 0.8.3
665 | optionalDependencies:
666 | source-map: 0.6.1
667 | dev: true
668 |
669 | /escodegen@2.1.0:
670 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
671 | engines: {node: '>=6.0'}
672 | hasBin: true
673 | dependencies:
674 | esprima: 4.0.1
675 | estraverse: 5.3.0
676 | esutils: 2.0.3
677 | optionalDependencies:
678 | source-map: 0.6.1
679 | dev: true
680 |
681 | /esprima@3.1.3:
682 | resolution: {integrity: sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==}
683 | engines: {node: '>=4'}
684 | hasBin: true
685 | dev: true
686 |
687 | /esprima@4.0.1:
688 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
689 | engines: {node: '>=4'}
690 | hasBin: true
691 | dev: true
692 |
693 | /estraverse@4.3.0:
694 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
695 | engines: {node: '>=4.0'}
696 | dev: true
697 |
698 | /estraverse@5.3.0:
699 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
700 | engines: {node: '>=4.0'}
701 | dev: true
702 |
703 | /esutils@2.0.3:
704 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
705 | engines: {node: '>=0.10.0'}
706 | dev: true
707 |
708 | /events@3.3.0:
709 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
710 | engines: {node: '>=0.8.x'}
711 |
712 | /evp_bytestokey@1.0.3:
713 | resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
714 | dependencies:
715 | md5.js: 1.3.5
716 | safe-buffer: 5.2.1
717 |
718 | /exdat@0.6.2:
719 | resolution: {integrity: sha512-sAmx6qczb5cJug9hcZXiaJUv8Ikhh3klPK60xIDow+IU9vynb1OX2DPrfA+F0XD9HX3T18gwWarpdIc3Ua1o7Q==}
720 | dependencies:
721 | brfs: 1.6.1
722 | dev: true
723 |
724 | /falafel@2.2.5:
725 | resolution: {integrity: sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==}
726 | engines: {node: '>=0.4.0'}
727 | dependencies:
728 | acorn: 7.4.1
729 | isarray: 2.0.5
730 | dev: true
731 |
732 | /fast-glob@3.3.2:
733 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
734 | engines: {node: '>=8.6.0'}
735 | dependencies:
736 | '@nodelib/fs.stat': 2.0.5
737 | '@nodelib/fs.walk': 1.2.8
738 | glob-parent: 5.1.2
739 | merge2: 1.4.1
740 | micromatch: 4.0.5
741 | dev: true
742 |
743 | /fast-levenshtein@2.0.6:
744 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
745 | dev: true
746 |
747 | /fast-safe-stringify@2.1.1:
748 | resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
749 |
750 | /fastq@1.17.1:
751 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
752 | dependencies:
753 | reusify: 1.0.4
754 | dev: true
755 |
756 | /fill-range@7.0.1:
757 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
758 | engines: {node: '>=8'}
759 | dependencies:
760 | to-regex-range: 5.0.1
761 | dev: true
762 |
763 | /for-each@0.3.3:
764 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
765 | dependencies:
766 | is-callable: 1.2.7
767 |
768 | /foreground-child@3.1.1:
769 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
770 | engines: {node: '>=14'}
771 | dependencies:
772 | cross-spawn: 7.0.3
773 | signal-exit: 4.1.0
774 | dev: true
775 |
776 | /fs.realpath@1.0.0:
777 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
778 |
779 | /fsevents@2.3.3:
780 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
781 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
782 | os: [darwin]
783 | requiresBuild: true
784 | dev: true
785 | optional: true
786 |
787 | /function-bind@1.1.2:
788 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
789 |
790 | /get-assigned-identifiers@1.2.0:
791 | resolution: {integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==}
792 |
793 | /get-intrinsic@1.2.4:
794 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
795 | engines: {node: '>= 0.4'}
796 | dependencies:
797 | es-errors: 1.3.0
798 | function-bind: 1.1.2
799 | has-proto: 1.0.3
800 | has-symbols: 1.0.3
801 | hasown: 2.0.2
802 |
803 | /glob-parent@5.1.2:
804 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
805 | engines: {node: '>= 6'}
806 | dependencies:
807 | is-glob: 4.0.3
808 | dev: true
809 |
810 | /glob-parent@6.0.2:
811 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
812 | engines: {node: '>=10.13.0'}
813 | dependencies:
814 | is-glob: 4.0.3
815 | dev: true
816 |
817 | /glob@10.3.12:
818 | resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==}
819 | engines: {node: '>=16 || 14 >=14.17'}
820 | hasBin: true
821 | dependencies:
822 | foreground-child: 3.1.1
823 | jackspeak: 2.3.6
824 | minimatch: 9.0.4
825 | minipass: 7.0.4
826 | path-scurry: 1.10.2
827 | dev: true
828 |
829 | /glob@7.2.3:
830 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
831 | dependencies:
832 | fs.realpath: 1.0.0
833 | inflight: 1.0.6
834 | inherits: 2.0.4
835 | minimatch: 3.1.2
836 | once: 1.4.0
837 | path-is-absolute: 1.0.1
838 |
839 | /gopd@1.0.1:
840 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
841 | dependencies:
842 | get-intrinsic: 1.2.4
843 |
844 | /has-property-descriptors@1.0.2:
845 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
846 | dependencies:
847 | es-define-property: 1.0.0
848 |
849 | /has-proto@1.0.3:
850 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
851 | engines: {node: '>= 0.4'}
852 |
853 | /has-symbols@1.0.3:
854 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
855 | engines: {node: '>= 0.4'}
856 |
857 | /has-tostringtag@1.0.2:
858 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
859 | engines: {node: '>= 0.4'}
860 | dependencies:
861 | has-symbols: 1.0.3
862 |
863 | /has@1.0.4:
864 | resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
865 | engines: {node: '>= 0.4.0'}
866 |
867 | /hash-base@3.0.4:
868 | resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==}
869 | engines: {node: '>=4'}
870 | dependencies:
871 | inherits: 2.0.4
872 | safe-buffer: 5.2.1
873 |
874 | /hash-base@3.1.0:
875 | resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
876 | engines: {node: '>=4'}
877 | dependencies:
878 | inherits: 2.0.4
879 | readable-stream: 3.6.2
880 | safe-buffer: 5.2.1
881 |
882 | /hash.js@1.1.7:
883 | resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
884 | dependencies:
885 | inherits: 2.0.4
886 | minimalistic-assert: 1.0.1
887 |
888 | /hasown@2.0.2:
889 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
890 | engines: {node: '>= 0.4'}
891 | dependencies:
892 | function-bind: 1.1.2
893 |
894 | /hmac-drbg@1.0.1:
895 | resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
896 | dependencies:
897 | hash.js: 1.1.7
898 | minimalistic-assert: 1.0.1
899 | minimalistic-crypto-utils: 1.0.1
900 |
901 | /htmlescape@1.1.1:
902 | resolution: {integrity: sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==}
903 | engines: {node: '>=0.10'}
904 |
905 | /https-browserify@1.0.0:
906 | resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
907 |
908 | /ieee754@1.2.1:
909 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
910 |
911 | /inflight@1.0.6:
912 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
913 | dependencies:
914 | once: 1.4.0
915 | wrappy: 1.0.2
916 |
917 | /inherits@2.0.3:
918 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
919 |
920 | /inherits@2.0.4:
921 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
922 |
923 | /inline-source-map@0.6.3:
924 | resolution: {integrity: sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==}
925 | dependencies:
926 | source-map: 0.5.7
927 |
928 | /insert-css@0.2.0:
929 | resolution: {integrity: sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==}
930 | dev: true
931 |
932 | /insert-module-globals@7.2.1:
933 | resolution: {integrity: sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==}
934 | hasBin: true
935 | dependencies:
936 | JSONStream: 1.3.5
937 | acorn-node: 1.8.2
938 | combine-source-map: 0.8.0
939 | concat-stream: 1.6.2
940 | is-buffer: 1.1.6
941 | path-is-absolute: 1.0.1
942 | process: 0.11.10
943 | through2: 2.0.5
944 | undeclared-identifiers: 1.1.3
945 | xtend: 4.0.2
946 |
947 | /is-arguments@1.1.1:
948 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
949 | engines: {node: '>= 0.4'}
950 | dependencies:
951 | call-bind: 1.0.7
952 | has-tostringtag: 1.0.2
953 |
954 | /is-binary-path@2.1.0:
955 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
956 | engines: {node: '>=8'}
957 | dependencies:
958 | binary-extensions: 2.3.0
959 | dev: true
960 |
961 | /is-buffer@1.1.6:
962 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
963 |
964 | /is-callable@1.2.7:
965 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
966 | engines: {node: '>= 0.4'}
967 |
968 | /is-core-module@2.13.1:
969 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
970 | dependencies:
971 | hasown: 2.0.2
972 |
973 | /is-extglob@2.1.1:
974 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
975 | engines: {node: '>=0.10.0'}
976 | dev: true
977 |
978 | /is-fullwidth-code-point@3.0.0:
979 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
980 | engines: {node: '>=8'}
981 | dev: true
982 |
983 | /is-generator-function@1.0.10:
984 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
985 | engines: {node: '>= 0.4'}
986 | dependencies:
987 | has-tostringtag: 1.0.2
988 |
989 | /is-glob@4.0.3:
990 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
991 | engines: {node: '>=0.10.0'}
992 | dependencies:
993 | is-extglob: 2.1.1
994 | dev: true
995 |
996 | /is-number@7.0.0:
997 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
998 | engines: {node: '>=0.12.0'}
999 | dev: true
1000 |
1001 | /is-typed-array@1.1.13:
1002 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
1003 | engines: {node: '>= 0.4'}
1004 | dependencies:
1005 | which-typed-array: 1.1.15
1006 |
1007 | /isarray@1.0.0:
1008 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
1009 |
1010 | /isarray@2.0.5:
1011 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
1012 | dev: true
1013 |
1014 | /isexe@2.0.0:
1015 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1016 | dev: true
1017 |
1018 | /jackspeak@2.3.6:
1019 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
1020 | engines: {node: '>=14'}
1021 | dependencies:
1022 | '@isaacs/cliui': 8.0.2
1023 | optionalDependencies:
1024 | '@pkgjs/parseargs': 0.11.0
1025 | dev: true
1026 |
1027 | /jiti@1.21.0:
1028 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
1029 | hasBin: true
1030 | dev: true
1031 |
1032 | /jsonparse@1.3.1:
1033 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
1034 | engines: {'0': node >= 0.2.0}
1035 |
1036 | /labeled-stream-splicer@2.0.2:
1037 | resolution: {integrity: sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==}
1038 | dependencies:
1039 | inherits: 2.0.4
1040 | stream-splicer: 2.0.1
1041 |
1042 | /levn@0.3.0:
1043 | resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
1044 | engines: {node: '>= 0.8.0'}
1045 | dependencies:
1046 | prelude-ls: 1.1.2
1047 | type-check: 0.3.2
1048 | dev: true
1049 |
1050 | /lilconfig@2.1.0:
1051 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
1052 | engines: {node: '>=10'}
1053 | dev: true
1054 |
1055 | /lilconfig@3.1.1:
1056 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==}
1057 | engines: {node: '>=14'}
1058 | dev: true
1059 |
1060 | /lines-and-columns@1.2.4:
1061 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1062 | dev: true
1063 |
1064 | /lodash.memoize@3.0.4:
1065 | resolution: {integrity: sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==}
1066 |
1067 | /lru-cache@10.2.0:
1068 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
1069 | engines: {node: 14 || >=16.14}
1070 | dev: true
1071 |
1072 | /magic-string@0.22.5:
1073 | resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==}
1074 | dependencies:
1075 | vlq: 0.2.3
1076 | dev: true
1077 |
1078 | /md5.js@1.3.5:
1079 | resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
1080 | dependencies:
1081 | hash-base: 3.1.0
1082 | inherits: 2.0.4
1083 | safe-buffer: 5.2.1
1084 |
1085 | /merge-source-map@1.0.4:
1086 | resolution: {integrity: sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==}
1087 | dependencies:
1088 | source-map: 0.5.7
1089 | dev: true
1090 |
1091 | /merge2@1.4.1:
1092 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1093 | engines: {node: '>= 8'}
1094 | dev: true
1095 |
1096 | /micromatch@4.0.5:
1097 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1098 | engines: {node: '>=8.6'}
1099 | dependencies:
1100 | braces: 3.0.2
1101 | picomatch: 2.3.1
1102 | dev: true
1103 |
1104 | /miller-rabin@4.0.1:
1105 | resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
1106 | hasBin: true
1107 | dependencies:
1108 | bn.js: 4.12.0
1109 | brorand: 1.1.0
1110 |
1111 | /minimalistic-assert@1.0.1:
1112 | resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
1113 |
1114 | /minimalistic-crypto-utils@1.0.1:
1115 | resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
1116 |
1117 | /minimatch@3.1.2:
1118 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1119 | dependencies:
1120 | brace-expansion: 1.1.11
1121 |
1122 | /minimatch@9.0.4:
1123 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
1124 | engines: {node: '>=16 || 14 >=14.17'}
1125 | dependencies:
1126 | brace-expansion: 2.0.1
1127 | dev: true
1128 |
1129 | /minimist@1.2.8:
1130 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
1131 |
1132 | /minipass@7.0.4:
1133 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
1134 | engines: {node: '>=16 || 14 >=14.17'}
1135 | dev: true
1136 |
1137 | /mkdirp-classic@0.5.3:
1138 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
1139 |
1140 | /module-deps@6.2.3:
1141 | resolution: {integrity: sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==}
1142 | engines: {node: '>= 0.8.0'}
1143 | hasBin: true
1144 | dependencies:
1145 | JSONStream: 1.3.5
1146 | browser-resolve: 2.0.0
1147 | cached-path-relative: 1.1.0
1148 | concat-stream: 1.6.2
1149 | defined: 1.0.1
1150 | detective: 5.2.1
1151 | duplexer2: 0.1.4
1152 | inherits: 2.0.4
1153 | parents: 1.0.1
1154 | readable-stream: 2.3.8
1155 | resolve: 1.22.8
1156 | stream-combiner2: 1.1.1
1157 | subarg: 1.0.0
1158 | through2: 2.0.5
1159 | xtend: 4.0.2
1160 |
1161 | /mz@2.7.0:
1162 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1163 | dependencies:
1164 | any-promise: 1.3.0
1165 | object-assign: 4.1.1
1166 | thenify-all: 1.6.0
1167 | dev: true
1168 |
1169 | /nanoid@3.3.7:
1170 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
1171 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1172 | hasBin: true
1173 | dev: true
1174 |
1175 | /ngraph.events@0.0.3:
1176 | resolution: {integrity: sha512-UrewofHOFk/05otBm9GD4DA3PTEY/yaElhCclmGC4IcmAYaSDRrC3lENQxJ00AzeBnz1GY2xH7Ct7AfIdhsdWA==}
1177 | dev: true
1178 |
1179 | /ngraph.expose@0.0.0:
1180 | resolution: {integrity: sha512-Hr88MuhgoSLVGf2aaaXcKl22Rn95duWsjRcoeJMP9PtFmYHGFw/3ctDqBf5phnIyktm0P/Quxs5EGg6xgJcZAQ==}
1181 | dev: true
1182 |
1183 | /ngraph.forcelayout3d@0.0.15:
1184 | resolution: {integrity: sha512-d6cYhknnK5OhfpmZL89nySje8QzqESTXPc/yz7Clz2wuSGSn8k+ufm+w/78q53kkQzkyNgJqM7aU4g5e+RuERQ==}
1185 | dependencies:
1186 | ngraph.expose: 0.0.0
1187 | ngraph.forcelayout: 0.0.22
1188 | ngraph.merge: 0.0.1
1189 | ngraph.physics.primitives: 0.0.7
1190 | ngraph.quadtreebh3d: 0.0.3
1191 | ngraph.random: 0.0.1
1192 | dev: true
1193 |
1194 | /ngraph.forcelayout@0.0.22:
1195 | resolution: {integrity: sha512-eGjonxfqLa9e4BfFGmgWeVLLHkolUzOgKtFsQMgwpCpGtXUQwfO+iz5kRn8scRgyh0iaPNPrPLtKepA2Ojpe5Q==}
1196 | dependencies:
1197 | ngraph.events: 0.0.3
1198 | ngraph.physics.simulator: 0.0.12
1199 | dev: true
1200 |
1201 | /ngraph.generators@0.0.18:
1202 | resolution: {integrity: sha512-N+LXllDpeDkKV4e/x3gnw3moXfRWu72ZCo2DxY4bL5ZdrIZP91ryIu3A1Bg8HG0TDpX19TIju6YoCUNEwReNNw==}
1203 | dependencies:
1204 | ngraph.graph: 0.0.14
1205 | ngraph.random: 0.0.1
1206 | dev: true
1207 |
1208 | /ngraph.graph@0.0.14:
1209 | resolution: {integrity: sha512-ERTLng4KrsGbR7iLZFvg5H+zJ7V+SY8RDqZKYCnOZib5W8M5LCvcil9/8eiJcTRUIPPXW3j8hqPCdLnBvgsn/A==}
1210 | dependencies:
1211 | ngraph.events: 0.0.3
1212 | dev: true
1213 |
1214 | /ngraph.merge@0.0.1:
1215 | resolution: {integrity: sha512-iXchI5xMjYzA96mee//O7I7gtd4cCakWaSTu11aMTxRDbvBK2qpDDytYg58jO3usAUkjFxBdy1gxYppKmBDuRQ==}
1216 | dev: true
1217 |
1218 | /ngraph.physics.primitives@0.0.7:
1219 | resolution: {integrity: sha512-7jPm14fYcuJ9kytOVNOKxFy6r/Uu9Dnj++uT3iR9XkBcsBahn2xcYJkV6vF1bIb1fQ5XrDCRjRIOcMwEum6jwQ==}
1220 | dev: true
1221 |
1222 | /ngraph.physics.simulator@0.0.12:
1223 | resolution: {integrity: sha512-c5THBS9fbzfUsFP39lKrWAt4UdNUqdKtahRE+SmB1uuv2B9aglyd0yAOtNTumrzGIG7vNy8isAw0Qd4Qztg7BQ==}
1224 | dependencies:
1225 | ngraph.events: 0.0.3
1226 | ngraph.expose: 0.0.0
1227 | ngraph.merge: 0.0.1
1228 | ngraph.physics.primitives: 0.0.7
1229 | ngraph.quadtreebh: 0.0.3
1230 | ngraph.random: 0.0.1
1231 | dev: true
1232 |
1233 | /ngraph.pixel@2.4.1:
1234 | resolution: {integrity: sha512-H4hqyEVMhGZ6hGL30pXKZ+RpZw8NQaLa4hGGj3UutokUp3yfvTLrToOq+/W09jK/Sn6DzimYPuLAn+OuIfx4Zw==}
1235 | dependencies:
1236 | element-class: 0.2.2
1237 | insert-css: 0.2.0
1238 | ngraph.events: 0.0.3
1239 | pixel.layout: 0.1.2
1240 | three: 0.73.2
1241 | three.fly: 0.1.6
1242 | dev: true
1243 |
1244 | /ngraph.quadtreebh3d@0.0.3:
1245 | resolution: {integrity: sha512-DIRiviYWity+/yiZpRRs95V7gShtXnxDifQbdLffAi4PdNWnprFarcXuk+q/YbTakH4cWcOXZo7mQyUTO9odZg==}
1246 | dependencies:
1247 | ngraph.random: 0.0.1
1248 | dev: true
1249 |
1250 | /ngraph.quadtreebh@0.0.3:
1251 | resolution: {integrity: sha512-vnmXcwnaourj6L4ssCwtHV5ObybvuyPkPVEFZI7nW5T6Tmt+t2dFA3ljym6MlSEcrayOgD7S2Ac+2YDN1DRZ3w==}
1252 | dependencies:
1253 | ngraph.random: 0.0.1
1254 | dev: true
1255 |
1256 | /ngraph.random@0.0.1:
1257 | resolution: {integrity: sha512-QPKU7ChXF/VrvMQxVo9aWcvXCXp98VfL4nKUteTW/olDqeUqQ61t7m+jvFb8Dj7kKvlKlnsbDA1aWLJGmm17XA==}
1258 | dev: true
1259 |
1260 | /normalize-path@3.0.0:
1261 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1262 | engines: {node: '>=0.10.0'}
1263 | dev: true
1264 |
1265 | /object-assign@4.1.1:
1266 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1267 | engines: {node: '>=0.10.0'}
1268 | dev: true
1269 |
1270 | /object-hash@3.0.0:
1271 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1272 | engines: {node: '>= 6'}
1273 | dev: true
1274 |
1275 | /object-inspect@1.13.1:
1276 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
1277 |
1278 | /object-inspect@1.4.1:
1279 | resolution: {integrity: sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==}
1280 | dev: true
1281 |
1282 | /object-keys@1.1.1:
1283 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
1284 | engines: {node: '>= 0.4'}
1285 |
1286 | /object.assign@4.1.5:
1287 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
1288 | engines: {node: '>= 0.4'}
1289 | dependencies:
1290 | call-bind: 1.0.7
1291 | define-properties: 1.2.1
1292 | has-symbols: 1.0.3
1293 | object-keys: 1.1.1
1294 |
1295 | /once@1.4.0:
1296 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1297 | dependencies:
1298 | wrappy: 1.0.2
1299 |
1300 | /optionator@0.8.3:
1301 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
1302 | engines: {node: '>= 0.8.0'}
1303 | dependencies:
1304 | deep-is: 0.1.4
1305 | fast-levenshtein: 2.0.6
1306 | levn: 0.3.0
1307 | prelude-ls: 1.1.2
1308 | type-check: 0.3.2
1309 | word-wrap: 1.2.5
1310 | dev: true
1311 |
1312 | /os-browserify@0.3.0:
1313 | resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
1314 |
1315 | /outpipe@1.1.1:
1316 | resolution: {integrity: sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA==}
1317 | dependencies:
1318 | shell-quote: 1.8.1
1319 | dev: true
1320 |
1321 | /pako@1.0.11:
1322 | resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
1323 |
1324 | /parents@1.0.1:
1325 | resolution: {integrity: sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==}
1326 | dependencies:
1327 | path-platform: 0.11.15
1328 |
1329 | /parse-asn1@5.1.7:
1330 | resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==}
1331 | engines: {node: '>= 0.10'}
1332 | dependencies:
1333 | asn1.js: 4.10.1
1334 | browserify-aes: 1.2.0
1335 | evp_bytestokey: 1.0.3
1336 | hash-base: 3.0.4
1337 | pbkdf2: 3.1.2
1338 | safe-buffer: 5.2.1
1339 |
1340 | /path-browserify@1.0.1:
1341 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
1342 |
1343 | /path-is-absolute@1.0.1:
1344 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1345 | engines: {node: '>=0.10.0'}
1346 |
1347 | /path-key@3.1.1:
1348 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1349 | engines: {node: '>=8'}
1350 | dev: true
1351 |
1352 | /path-parse@1.0.7:
1353 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1354 |
1355 | /path-platform@0.11.15:
1356 | resolution: {integrity: sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==}
1357 | engines: {node: '>= 0.8.0'}
1358 |
1359 | /path-scurry@1.10.2:
1360 | resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==}
1361 | engines: {node: '>=16 || 14 >=14.17'}
1362 | dependencies:
1363 | lru-cache: 10.2.0
1364 | minipass: 7.0.4
1365 | dev: true
1366 |
1367 | /pbkdf2@3.1.2:
1368 | resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
1369 | engines: {node: '>=0.12'}
1370 | dependencies:
1371 | create-hash: 1.2.0
1372 | create-hmac: 1.1.7
1373 | ripemd160: 2.0.2
1374 | safe-buffer: 5.2.1
1375 | sha.js: 2.4.11
1376 |
1377 | /picocolors@1.0.0:
1378 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1379 | dev: true
1380 |
1381 | /picomatch@2.3.1:
1382 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1383 | engines: {node: '>=8.6'}
1384 | dev: true
1385 |
1386 | /pify@2.3.0:
1387 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1388 | engines: {node: '>=0.10.0'}
1389 | dev: true
1390 |
1391 | /pirates@4.0.6:
1392 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
1393 | engines: {node: '>= 6'}
1394 | dev: true
1395 |
1396 | /pixel.layout@0.1.2:
1397 | resolution: {integrity: sha512-GwEZPvzOgZ3adzeGmuWGebB0t7PklsGQF9zYYOzL2W6bPbG6dwDgY7A7yLTO6OLenl2ohxdbdYyqEkDmRuRXfw==}
1398 | dependencies:
1399 | ngraph.events: 0.0.3
1400 | ngraph.forcelayout3d: 0.0.15
1401 | dev: true
1402 |
1403 | /possible-typed-array-names@1.0.0:
1404 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
1405 | engines: {node: '>= 0.4'}
1406 |
1407 | /postcss-import@15.1.0(postcss@8.4.38):
1408 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
1409 | engines: {node: '>=14.0.0'}
1410 | peerDependencies:
1411 | postcss: ^8.0.0
1412 | dependencies:
1413 | postcss: 8.4.38
1414 | postcss-value-parser: 4.2.0
1415 | read-cache: 1.0.0
1416 | resolve: 1.22.8
1417 | dev: true
1418 |
1419 | /postcss-js@4.0.1(postcss@8.4.38):
1420 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
1421 | engines: {node: ^12 || ^14 || >= 16}
1422 | peerDependencies:
1423 | postcss: ^8.4.21
1424 | dependencies:
1425 | camelcase-css: 2.0.1
1426 | postcss: 8.4.38
1427 | dev: true
1428 |
1429 | /postcss-load-config@4.0.2(postcss@8.4.38):
1430 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
1431 | engines: {node: '>= 14'}
1432 | peerDependencies:
1433 | postcss: '>=8.0.9'
1434 | ts-node: '>=9.0.0'
1435 | peerDependenciesMeta:
1436 | postcss:
1437 | optional: true
1438 | ts-node:
1439 | optional: true
1440 | dependencies:
1441 | lilconfig: 3.1.1
1442 | postcss: 8.4.38
1443 | yaml: 2.4.1
1444 | dev: true
1445 |
1446 | /postcss-nested@6.0.1(postcss@8.4.38):
1447 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
1448 | engines: {node: '>=12.0'}
1449 | peerDependencies:
1450 | postcss: ^8.2.14
1451 | dependencies:
1452 | postcss: 8.4.38
1453 | postcss-selector-parser: 6.0.16
1454 | dev: true
1455 |
1456 | /postcss-selector-parser@6.0.16:
1457 | resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==}
1458 | engines: {node: '>=4'}
1459 | dependencies:
1460 | cssesc: 3.0.0
1461 | util-deprecate: 1.0.2
1462 | dev: true
1463 |
1464 | /postcss-value-parser@4.2.0:
1465 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1466 | dev: true
1467 |
1468 | /postcss@8.4.38:
1469 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
1470 | engines: {node: ^10 || ^12 || >=14}
1471 | dependencies:
1472 | nanoid: 3.3.7
1473 | picocolors: 1.0.0
1474 | source-map-js: 1.2.0
1475 | dev: true
1476 |
1477 | /prelude-ls@1.1.2:
1478 | resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
1479 | engines: {node: '>= 0.8.0'}
1480 | dev: true
1481 |
1482 | /process-nextick-args@2.0.1:
1483 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
1484 |
1485 | /process@0.11.10:
1486 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
1487 | engines: {node: '>= 0.6.0'}
1488 |
1489 | /public-encrypt@4.0.3:
1490 | resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
1491 | dependencies:
1492 | bn.js: 4.12.0
1493 | browserify-rsa: 4.1.0
1494 | create-hash: 1.2.0
1495 | parse-asn1: 5.1.7
1496 | randombytes: 2.1.0
1497 | safe-buffer: 5.2.1
1498 |
1499 | /punycode@1.4.1:
1500 | resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
1501 |
1502 | /qs@6.12.0:
1503 | resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==}
1504 | engines: {node: '>=0.6'}
1505 | dependencies:
1506 | side-channel: 1.0.6
1507 |
1508 | /query-string@1.0.1:
1509 | resolution: {integrity: sha512-uXqAMcbt2Z3n/TGfXjwI8DofeZEiNyeD86AEvIm2f/fCcFexxve9ZktMKkr3L7+pK+iSjE6M2/DfHiREVwHkvQ==}
1510 | engines: {node: '>=0.10.0'}
1511 | dev: true
1512 |
1513 | /querystring-es3@0.2.1:
1514 | resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
1515 | engines: {node: '>=0.4.x'}
1516 |
1517 | /queue-microtask@1.2.3:
1518 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1519 | dev: true
1520 |
1521 | /quote-stream@1.0.2:
1522 | resolution: {integrity: sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==}
1523 | hasBin: true
1524 | dependencies:
1525 | buffer-equal: 0.0.1
1526 | minimist: 1.2.8
1527 | through2: 2.0.5
1528 | dev: true
1529 |
1530 | /randombytes@2.1.0:
1531 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
1532 | dependencies:
1533 | safe-buffer: 5.2.1
1534 |
1535 | /randomfill@1.0.4:
1536 | resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
1537 | dependencies:
1538 | randombytes: 2.1.0
1539 | safe-buffer: 5.2.1
1540 |
1541 | /read-cache@1.0.0:
1542 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1543 | dependencies:
1544 | pify: 2.3.0
1545 | dev: true
1546 |
1547 | /read-only-stream@2.0.0:
1548 | resolution: {integrity: sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==}
1549 | dependencies:
1550 | readable-stream: 2.3.8
1551 |
1552 | /readable-stream@2.3.8:
1553 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
1554 | dependencies:
1555 | core-util-is: 1.0.3
1556 | inherits: 2.0.4
1557 | isarray: 1.0.0
1558 | process-nextick-args: 2.0.1
1559 | safe-buffer: 5.1.2
1560 | string_decoder: 1.1.1
1561 | util-deprecate: 1.0.2
1562 |
1563 | /readable-stream@3.6.2:
1564 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
1565 | engines: {node: '>= 6'}
1566 | dependencies:
1567 | inherits: 2.0.4
1568 | string_decoder: 1.3.0
1569 | util-deprecate: 1.0.2
1570 |
1571 | /readdirp@3.6.0:
1572 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1573 | engines: {node: '>=8.10.0'}
1574 | dependencies:
1575 | picomatch: 2.3.1
1576 | dev: true
1577 |
1578 | /resolve@1.22.8:
1579 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
1580 | hasBin: true
1581 | dependencies:
1582 | is-core-module: 2.13.1
1583 | path-parse: 1.0.7
1584 | supports-preserve-symlinks-flag: 1.0.0
1585 |
1586 | /reusify@1.0.4:
1587 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1588 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1589 | dev: true
1590 |
1591 | /ripemd160@2.0.2:
1592 | resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
1593 | dependencies:
1594 | hash-base: 3.1.0
1595 | inherits: 2.0.4
1596 |
1597 | /run-parallel@1.2.0:
1598 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1599 | dependencies:
1600 | queue-microtask: 1.2.3
1601 | dev: true
1602 |
1603 | /safe-buffer@5.1.2:
1604 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
1605 |
1606 | /safe-buffer@5.2.1:
1607 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
1608 |
1609 | /set-function-length@1.2.2:
1610 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
1611 | engines: {node: '>= 0.4'}
1612 | dependencies:
1613 | define-data-property: 1.1.4
1614 | es-errors: 1.3.0
1615 | function-bind: 1.1.2
1616 | get-intrinsic: 1.2.4
1617 | gopd: 1.0.1
1618 | has-property-descriptors: 1.0.2
1619 |
1620 | /sha.js@2.4.11:
1621 | resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
1622 | hasBin: true
1623 | dependencies:
1624 | inherits: 2.0.4
1625 | safe-buffer: 5.2.1
1626 |
1627 | /shallow-copy@0.0.1:
1628 | resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==}
1629 | dev: true
1630 |
1631 | /shasum-object@1.0.0:
1632 | resolution: {integrity: sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==}
1633 | dependencies:
1634 | fast-safe-stringify: 2.1.1
1635 |
1636 | /shebang-command@2.0.0:
1637 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1638 | engines: {node: '>=8'}
1639 | dependencies:
1640 | shebang-regex: 3.0.0
1641 | dev: true
1642 |
1643 | /shebang-regex@3.0.0:
1644 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1645 | engines: {node: '>=8'}
1646 | dev: true
1647 |
1648 | /shell-quote@1.8.1:
1649 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
1650 |
1651 | /side-channel@1.0.6:
1652 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
1653 | engines: {node: '>= 0.4'}
1654 | dependencies:
1655 | call-bind: 1.0.7
1656 | es-errors: 1.3.0
1657 | get-intrinsic: 1.2.4
1658 | object-inspect: 1.13.1
1659 |
1660 | /signal-exit@4.1.0:
1661 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
1662 | engines: {node: '>=14'}
1663 | dev: true
1664 |
1665 | /simple-concat@1.0.1:
1666 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
1667 |
1668 | /source-map-js@1.2.0:
1669 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
1670 | engines: {node: '>=0.10.0'}
1671 | dev: true
1672 |
1673 | /source-map@0.5.7:
1674 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
1675 | engines: {node: '>=0.10.0'}
1676 |
1677 | /source-map@0.6.1:
1678 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
1679 | engines: {node: '>=0.10.0'}
1680 | requiresBuild: true
1681 | dev: true
1682 | optional: true
1683 |
1684 | /static-eval@2.1.1:
1685 | resolution: {integrity: sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==}
1686 | dependencies:
1687 | escodegen: 2.1.0
1688 | dev: true
1689 |
1690 | /static-module@2.2.5:
1691 | resolution: {integrity: sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==}
1692 | dependencies:
1693 | concat-stream: 1.6.2
1694 | convert-source-map: 1.9.0
1695 | duplexer2: 0.1.4
1696 | escodegen: 1.9.1
1697 | falafel: 2.2.5
1698 | has: 1.0.4
1699 | magic-string: 0.22.5
1700 | merge-source-map: 1.0.4
1701 | object-inspect: 1.4.1
1702 | quote-stream: 1.0.2
1703 | readable-stream: 2.3.8
1704 | shallow-copy: 0.0.1
1705 | static-eval: 2.1.1
1706 | through2: 2.0.5
1707 | dev: true
1708 |
1709 | /stream-browserify@3.0.0:
1710 | resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
1711 | dependencies:
1712 | inherits: 2.0.4
1713 | readable-stream: 3.6.2
1714 |
1715 | /stream-combiner2@1.1.1:
1716 | resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==}
1717 | dependencies:
1718 | duplexer2: 0.1.4
1719 | readable-stream: 2.3.8
1720 |
1721 | /stream-http@3.2.0:
1722 | resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==}
1723 | dependencies:
1724 | builtin-status-codes: 3.0.0
1725 | inherits: 2.0.4
1726 | readable-stream: 3.6.2
1727 | xtend: 4.0.2
1728 |
1729 | /stream-splicer@2.0.1:
1730 | resolution: {integrity: sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==}
1731 | dependencies:
1732 | inherits: 2.0.4
1733 | readable-stream: 2.3.8
1734 |
1735 | /string-width@4.2.3:
1736 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
1737 | engines: {node: '>=8'}
1738 | dependencies:
1739 | emoji-regex: 8.0.0
1740 | is-fullwidth-code-point: 3.0.0
1741 | strip-ansi: 6.0.1
1742 | dev: true
1743 |
1744 | /string-width@5.1.2:
1745 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
1746 | engines: {node: '>=12'}
1747 | dependencies:
1748 | eastasianwidth: 0.2.0
1749 | emoji-regex: 9.2.2
1750 | strip-ansi: 7.1.0
1751 | dev: true
1752 |
1753 | /string_decoder@1.1.1:
1754 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
1755 | dependencies:
1756 | safe-buffer: 5.1.2
1757 |
1758 | /string_decoder@1.3.0:
1759 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
1760 | dependencies:
1761 | safe-buffer: 5.2.1
1762 |
1763 | /strip-ansi@6.0.1:
1764 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1765 | engines: {node: '>=8'}
1766 | dependencies:
1767 | ansi-regex: 5.0.1
1768 | dev: true
1769 |
1770 | /strip-ansi@7.1.0:
1771 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
1772 | engines: {node: '>=12'}
1773 | dependencies:
1774 | ansi-regex: 6.0.1
1775 | dev: true
1776 |
1777 | /subarg@1.0.0:
1778 | resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==}
1779 | dependencies:
1780 | minimist: 1.2.8
1781 |
1782 | /sucrase@3.35.0:
1783 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
1784 | engines: {node: '>=16 || 14 >=14.17'}
1785 | hasBin: true
1786 | dependencies:
1787 | '@jridgewell/gen-mapping': 0.3.5
1788 | commander: 4.1.1
1789 | glob: 10.3.12
1790 | lines-and-columns: 1.2.4
1791 | mz: 2.7.0
1792 | pirates: 4.0.6
1793 | ts-interface-checker: 0.1.13
1794 | dev: true
1795 |
1796 | /supports-preserve-symlinks-flag@1.0.0:
1797 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1798 | engines: {node: '>= 0.4'}
1799 |
1800 | /syntax-error@1.4.0:
1801 | resolution: {integrity: sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==}
1802 | dependencies:
1803 | acorn-node: 1.8.2
1804 |
1805 | /tailwindcss@3.4.3:
1806 | resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==}
1807 | engines: {node: '>=14.0.0'}
1808 | hasBin: true
1809 | dependencies:
1810 | '@alloc/quick-lru': 5.2.0
1811 | arg: 5.0.2
1812 | chokidar: 3.6.0
1813 | didyoumean: 1.2.2
1814 | dlv: 1.1.3
1815 | fast-glob: 3.3.2
1816 | glob-parent: 6.0.2
1817 | is-glob: 4.0.3
1818 | jiti: 1.21.0
1819 | lilconfig: 2.1.0
1820 | micromatch: 4.0.5
1821 | normalize-path: 3.0.0
1822 | object-hash: 3.0.0
1823 | picocolors: 1.0.0
1824 | postcss: 8.4.38
1825 | postcss-import: 15.1.0(postcss@8.4.38)
1826 | postcss-js: 4.0.1(postcss@8.4.38)
1827 | postcss-load-config: 4.0.2(postcss@8.4.38)
1828 | postcss-nested: 6.0.1(postcss@8.4.38)
1829 | postcss-selector-parser: 6.0.16
1830 | resolve: 1.22.8
1831 | sucrase: 3.35.0
1832 | transitivePeerDependencies:
1833 | - ts-node
1834 | dev: true
1835 |
1836 | /thenify-all@1.6.0:
1837 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
1838 | engines: {node: '>=0.8'}
1839 | dependencies:
1840 | thenify: 3.3.1
1841 | dev: true
1842 |
1843 | /thenify@3.3.1:
1844 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
1845 | dependencies:
1846 | any-promise: 1.3.0
1847 | dev: true
1848 |
1849 | /three.fly@0.1.6:
1850 | resolution: {integrity: sha512-iduRTbHyb2WVas4FOyXj8W/wtjfyu0DtFeSMIL7akm3Bfa8+QubDdlsDFTf+382ATzSbA3gKZGo091ZonBt87w==}
1851 | dependencies:
1852 | ngraph.events: 0.0.3
1853 | dev: true
1854 |
1855 | /three@0.73.2:
1856 | resolution: {integrity: sha512-TC2H54TAnLwLwuMz5mUNN60BuK5MvLI1OgF2X1PdxnVehgZ7p9sNbaHpJEj3hi2T8WadlIUE8d/96oe3XlpPAw==}
1857 | dev: true
1858 |
1859 | /through2@2.0.5:
1860 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
1861 | dependencies:
1862 | readable-stream: 2.3.8
1863 | xtend: 4.0.2
1864 |
1865 | /through2@4.0.2:
1866 | resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
1867 | dependencies:
1868 | readable-stream: 3.6.2
1869 | dev: true
1870 |
1871 | /through@2.3.8:
1872 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
1873 |
1874 | /timers-browserify@1.4.2:
1875 | resolution: {integrity: sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==}
1876 | engines: {node: '>=0.6.0'}
1877 | dependencies:
1878 | process: 0.11.10
1879 |
1880 | /to-regex-range@5.0.1:
1881 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1882 | engines: {node: '>=8.0'}
1883 | dependencies:
1884 | is-number: 7.0.0
1885 | dev: true
1886 |
1887 | /ts-interface-checker@0.1.13:
1888 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
1889 | dev: true
1890 |
1891 | /tty-browserify@0.0.1:
1892 | resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==}
1893 |
1894 | /type-check@0.3.2:
1895 | resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
1896 | engines: {node: '>= 0.8.0'}
1897 | dependencies:
1898 | prelude-ls: 1.1.2
1899 | dev: true
1900 |
1901 | /typedarray@0.0.6:
1902 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
1903 |
1904 | /umd@3.0.3:
1905 | resolution: {integrity: sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==}
1906 | hasBin: true
1907 |
1908 | /undeclared-identifiers@1.1.3:
1909 | resolution: {integrity: sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==}
1910 | hasBin: true
1911 | dependencies:
1912 | acorn-node: 1.8.2
1913 | dash-ast: 1.0.0
1914 | get-assigned-identifiers: 1.2.0
1915 | simple-concat: 1.0.1
1916 | xtend: 4.0.2
1917 |
1918 | /url@0.11.3:
1919 | resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==}
1920 | dependencies:
1921 | punycode: 1.4.1
1922 | qs: 6.12.0
1923 |
1924 | /util-deprecate@1.0.2:
1925 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1926 |
1927 | /util@0.10.4:
1928 | resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==}
1929 | dependencies:
1930 | inherits: 2.0.3
1931 |
1932 | /util@0.12.5:
1933 | resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
1934 | dependencies:
1935 | inherits: 2.0.4
1936 | is-arguments: 1.1.1
1937 | is-generator-function: 1.0.10
1938 | is-typed-array: 1.1.13
1939 | which-typed-array: 1.1.15
1940 |
1941 | /vlq@0.2.3:
1942 | resolution: {integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==}
1943 | dev: true
1944 |
1945 | /vm-browserify@1.1.2:
1946 | resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
1947 |
1948 | /watchify@4.0.0:
1949 | resolution: {integrity: sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==}
1950 | engines: {node: '>= 8.10.0'}
1951 | hasBin: true
1952 | dependencies:
1953 | anymatch: 3.1.3
1954 | browserify: 17.0.0
1955 | chokidar: 3.6.0
1956 | defined: 1.0.1
1957 | outpipe: 1.1.1
1958 | through2: 4.0.2
1959 | xtend: 4.0.2
1960 | dev: true
1961 |
1962 | /which-typed-array@1.1.15:
1963 | resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
1964 | engines: {node: '>= 0.4'}
1965 | dependencies:
1966 | available-typed-arrays: 1.0.7
1967 | call-bind: 1.0.7
1968 | for-each: 0.3.3
1969 | gopd: 1.0.1
1970 | has-tostringtag: 1.0.2
1971 |
1972 | /which@2.0.2:
1973 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1974 | engines: {node: '>= 8'}
1975 | hasBin: true
1976 | dependencies:
1977 | isexe: 2.0.0
1978 | dev: true
1979 |
1980 | /word-wrap@1.2.5:
1981 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1982 | engines: {node: '>=0.10.0'}
1983 | dev: true
1984 |
1985 | /wrap-ansi@7.0.0:
1986 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
1987 | engines: {node: '>=10'}
1988 | dependencies:
1989 | ansi-styles: 4.3.0
1990 | string-width: 4.2.3
1991 | strip-ansi: 6.0.1
1992 | dev: true
1993 |
1994 | /wrap-ansi@8.1.0:
1995 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
1996 | engines: {node: '>=12'}
1997 | dependencies:
1998 | ansi-styles: 6.2.1
1999 | string-width: 5.1.2
2000 | strip-ansi: 7.1.0
2001 | dev: true
2002 |
2003 | /wrappy@1.0.2:
2004 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
2005 |
2006 | /xtend@4.0.2:
2007 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
2008 | engines: {node: '>=0.4'}
2009 |
2010 | /yaml@2.4.1:
2011 | resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==}
2012 | engines: {node: '>= 14'}
2013 | hasBin: true
2014 | dev: true
2015 |
--------------------------------------------------------------------------------
/graph/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["./**/*.{html,js}"],
4 | theme: {
5 | extend: {
6 | fontFamily: {
7 | "tiempos-headline": ["'Tiempos Headline'", "serif"],
8 | "space-mono": ["'Space Mono'", "monospace"],
9 | "untitled-sans": ["'Untitled Sans'", "sans-serif"],
10 | },
11 | colors: {
12 | "socratica-cream": "#FBF8EF",
13 | "socratica-black": "#121212",
14 | "socratica-grey": "#A09D98",
15 | },
16 | },
17 | },
18 | plugins: [],
19 | };
20 |
--------------------------------------------------------------------------------
/images/graph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/images/graph.png
--------------------------------------------------------------------------------
/images/match.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/images/match.png
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | import chromadb
2 |
3 |
4 | def main():
5 | chroma_client = chromadb.PersistentClient(path="chromadb")
6 | time_prompt_collection = chroma_client.get_or_create_collection(
7 | name="time_prompt_embeddings")
8 |
9 | problem_prompt_collection = chroma_client.get_or_create_collection(
10 | name="problem_prompt_embeddings")
11 |
12 | query = "I can't stop thinking about how we all are just conditioned to follow the textbook from school so everyone just accepts there is a 'right way' to go about life. We need to have stronger opinions on a different future where people are more inclined to follow things that are out of the ordinary"
13 |
14 | results = problem_prompt_collection.query(
15 | query_texts=[
16 | query
17 | ],
18 | n_results=5,
19 | include=["documents", "distances", "metadatas"]
20 | )
21 |
22 | print(f"Queried top results for '{query}'\n")
23 |
24 | for i in range(len(results["ids"][0])):
25 | print(f"ID: {results['ids'][0][i]}")
26 | print(f"Name: {results['metadatas'][0][i]['name']}")
27 | print(f"Program: {results['metadatas'][0][i]['program']}")
28 | print(f"Response: {results['documents'][0][i]}")
29 | print(f"Distance: {results['distances'][0][i]}")
30 | # print(f"Metadata: {results['metadatas'][0][i]}")
31 | print()
32 |
33 |
34 | if __name__ == '__main__':
35 | main()
36 |
--------------------------------------------------------------------------------
/match/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/match/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
--------------------------------------------------------------------------------
/match/README.md:
--------------------------------------------------------------------------------
1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2 |
3 | ## Getting Started
4 |
5 | First, run the development server:
6 |
7 | ```bash
8 | npm run dev
9 | # or
10 | yarn dev
11 | # or
12 | pnpm dev
13 | # or
14 | bun dev
15 | ```
16 |
17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18 |
19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20 |
21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
22 |
23 | ## Learn More
24 |
25 | To learn more about Next.js, take a look at the following resources:
26 |
27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29 |
30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
31 |
32 | ## Deploy on Vercel
33 |
34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35 |
36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
37 |
--------------------------------------------------------------------------------
/match/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "default",
4 | "rsc": true,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.ts",
8 | "css": "src/app/globals.css",
9 | "baseColor": "stone",
10 | "cssVariables": false,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils"
16 | }
17 | }
--------------------------------------------------------------------------------
/match/next.config.mjs:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {};
3 |
4 | export default nextConfig;
5 |
--------------------------------------------------------------------------------
/match/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-graph",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "@radix-ui/react-dialog": "^1.0.5",
13 | "class-variance-authority": "^0.7.0",
14 | "clsx": "^2.1.0",
15 | "fuse.js": "^7.0.0",
16 | "lucide-react": "^0.364.0",
17 | "next": "14.1.4",
18 | "react": "^18",
19 | "react-dom": "^18",
20 | "react-force-graph": "^1.44.3",
21 | "react-hook-form": "^7.51.2",
22 | "tailwind-merge": "^2.2.2",
23 | "tailwindcss-animate": "^1.0.7",
24 | "three": "^0.162.0"
25 | },
26 | "devDependencies": {
27 | "@types/node": "^20",
28 | "@types/react": "^18",
29 | "@types/react-dom": "^18",
30 | "@types/three": "^0.162.0",
31 | "autoprefixer": "^10.0.1",
32 | "eslint": "^8",
33 | "eslint-config-next": "14.1.4",
34 | "postcss": "^8",
35 | "tailwindcss": "^3.3.0",
36 | "typescript": "^5"
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/match/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/match/public/fonts/Space_Mono/OFL.txt:
--------------------------------------------------------------------------------
1 | Copyright 2016 Google Inc. All Rights Reserved.
2 |
3 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
4 | This license is copied below, and is also available with a FAQ at:
5 | https://openfontlicense.org
6 |
7 |
8 | -----------------------------------------------------------
9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10 | -----------------------------------------------------------
11 |
12 | PREAMBLE
13 | The goals of the Open Font License (OFL) are to stimulate worldwide
14 | development of collaborative font projects, to support the font creation
15 | efforts of academic and linguistic communities, and to provide a free and
16 | open framework in which fonts may be shared and improved in partnership
17 | with others.
18 |
19 | The OFL allows the licensed fonts to be used, studied, modified and
20 | redistributed freely as long as they are not sold by themselves. The
21 | fonts, including any derivative works, can be bundled, embedded,
22 | redistributed and/or sold with any software provided that any reserved
23 | names are not used by derivative works. The fonts and derivatives,
24 | however, cannot be released under any other type of license. The
25 | requirement for fonts to remain under this license does not apply
26 | to any document created using the fonts or their derivatives.
27 |
28 | DEFINITIONS
29 | "Font Software" refers to the set of files released by the Copyright
30 | Holder(s) under this license and clearly marked as such. This may
31 | include source files, build scripts and documentation.
32 |
33 | "Reserved Font Name" refers to any names specified as such after the
34 | copyright statement(s).
35 |
36 | "Original Version" refers to the collection of Font Software components as
37 | distributed by the Copyright Holder(s).
38 |
39 | "Modified Version" refers to any derivative made by adding to, deleting,
40 | or substituting -- in part or in whole -- any of the components of the
41 | Original Version, by changing formats or by porting the Font Software to a
42 | new environment.
43 |
44 | "Author" refers to any designer, engineer, programmer, technical
45 | writer or other person who contributed to the Font Software.
46 |
47 | PERMISSION & CONDITIONS
48 | Permission is hereby granted, free of charge, to any person obtaining
49 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
50 | redistribute, and sell modified and unmodified copies of the Font
51 | Software, subject to the following conditions:
52 |
53 | 1) Neither the Font Software nor any of its individual components,
54 | in Original or Modified Versions, may be sold by itself.
55 |
56 | 2) Original or Modified Versions of the Font Software may be bundled,
57 | redistributed and/or sold with any software, provided that each copy
58 | contains the above copyright notice and this license. These can be
59 | included either as stand-alone text files, human-readable headers or
60 | in the appropriate machine-readable metadata fields within text or
61 | binary files as long as those fields can be easily viewed by the user.
62 |
63 | 3) No Modified Version of the Font Software may use the Reserved Font
64 | Name(s) unless explicit written permission is granted by the corresponding
65 | Copyright Holder. This restriction only applies to the primary font name as
66 | presented to the users.
67 |
68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69 | Software shall not be used to promote, endorse or advertise any
70 | Modified Version, except to acknowledge the contribution(s) of the
71 | Copyright Holder(s) and the Author(s) or with their explicit written
72 | permission.
73 |
74 | 5) The Font Software, modified or unmodified, in part or in whole,
75 | must be distributed entirely under this license, and must not be
76 | distributed under any other license. The requirement for fonts to
77 | remain under this license does not apply to any document created
78 | using the Font Software.
79 |
80 | TERMINATION
81 | This license becomes null and void if any of the above conditions are
82 | not met.
83 |
84 | DISCLAIMER
85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93 | OTHER DEALINGS IN THE FONT SOFTWARE.
94 |
--------------------------------------------------------------------------------
/match/public/fonts/Space_Mono/SpaceMono-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-Bold.ttf
--------------------------------------------------------------------------------
/match/public/fonts/Space_Mono/SpaceMono-BoldItalic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-BoldItalic.ttf
--------------------------------------------------------------------------------
/match/public/fonts/Space_Mono/SpaceMono-Italic.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-Italic.ttf
--------------------------------------------------------------------------------
/match/public/fonts/Space_Mono/SpaceMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Space_Mono/SpaceMono-Regular.ttf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Black.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-BlackItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Bold.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-Light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Light.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Medium.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Regular.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-RegularItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf
--------------------------------------------------------------------------------
/match/public/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-Black.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Black.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-BlackItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-BlackItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-Bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Bold.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-BoldItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-BoldItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-Light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Light.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-LightItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-LightItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-Medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Medium.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-MediumItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-MediumItalic.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-Regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-Regular.otf
--------------------------------------------------------------------------------
/match/public/fonts/Untitled Sans/UntitledSans-RegularItalic.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/public/fonts/Untitled Sans/UntitledSans-RegularItalic.otf
--------------------------------------------------------------------------------
/match/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/match/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/match/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Socratica-Org/matchmaking/8182915d00a326ad89318ffec62c4c50bc4d92f1/match/src/app/favicon.ico
--------------------------------------------------------------------------------
/match/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | // Add Tiempos Headline font in otf, from light to black
6 | @font-face {
7 | font-family: "Tiempos Headline";
8 | font-style: normal;
9 | font-weight: 300;
10 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Light.otf")
11 | format("opentype");
12 | }
13 |
14 | @font-face {
15 | font-family: "Tiempos Headline";
16 | font-style: normal;
17 | font-weight: 400;
18 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Regular.otf")
19 | format("opentype");
20 | }
21 |
22 | @font-face {
23 | font-family: "Tiempos Headline";
24 | font-style: normal;
25 | font-weight: 500;
26 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Medium.otf")
27 | format("opentype");
28 | }
29 |
30 | @font-face {
31 | font-family: "Tiempos Headline";
32 | font-style: normal;
33 | font-weight: 600;
34 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Semibold.otf")
35 | format("opentype");
36 | }
37 |
38 | @font-face {
39 | font-family: "Tiempos Headline";
40 | font-style: normal;
41 | font-weight: 700;
42 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Bold.otf")
43 | format("opentype");
44 | }
45 |
46 | // Add italic versions of Tiempos Headline font
47 | @font-face {
48 | font-family: "Tiempos Headline";
49 | font-style: italic;
50 | font-weight: 300;
51 | src: url("/fonts/Tiempos Headline/TiemposHeadline-LightItalic.otf")
52 | format("opentype");
53 | }
54 |
55 | @font-face {
56 | font-family: "Tiempos Headline";
57 | font-style: italic;
58 | font-weight: 400;
59 | src: url("/fonts/Tiempos Headline/TiemposHeadline-Italic.otf")
60 | format("opentype");
61 | }
62 |
63 | @font-face {
64 | font-family: "Tiempos Headline";
65 | font-style: italic;
66 | font-weight: 500;
67 | src: url("/fonts/Tiempos Headline/TiemposHeadline-MediumItalic.otf")
68 | format("opentype");
69 | }
70 |
71 | @font-face {
72 | font-family: "Tiempos Headline";
73 | font-style: italic;
74 | font-weight: 600;
75 | src: url("/fonts/Tiempos Headline/TiemposHeadline-SemiboldItalic.otf")
76 | format("opentype");
77 | }
78 |
79 | @font-face {
80 | font-family: "Tiempos Headline";
81 | font-style: italic;
82 | font-weight: 700;
83 | src: url("/fonts/Tiempos Headline/TiemposHeadline-BoldItalic.otf")
84 | format("opentype");
85 | }
86 |
87 | // SpaceMono
88 |
89 | @font-face {
90 | font-family: "Space Mono";
91 | font-style: normal;
92 | font-weight: 400;
93 | src: url("/fonts/Space_Mono/SpaceMono-Regular.ttf") format("truetype");
94 | }
95 |
96 | @font-face {
97 | font-family: "Space Mono";
98 | font-style: normal;
99 | font-weight: 700;
100 | src: url("/fonts/Space_Mono/SpaceMono-Bold.ttf") format("truetype");
101 | }
102 |
103 | @font-face {
104 | font-family: "Space Mono";
105 | font-style: italic;
106 | font-weight: 400;
107 | src: url("/fonts/Space_Mono/SpaceMono-Italic.ttf") format("truetype");
108 | }
109 |
110 | @font-face {
111 | font-family: "Space Mono";
112 | font-style: italic;
113 | font-weight: 700;
114 | src: url("/fonts/Space_Mono/SpaceMono-BoldItalic.ttf") format("truetype");
115 | }
116 |
117 | // Untitled Sans
118 |
119 | @font-face {
120 | font-family: "Untitled Sans";
121 | font-style: normal;
122 | font-weight: 300;
123 | src: url("/fonts/Untitled Sans/UntitledSans-Light.otf") format("opentype");
124 | }
125 |
126 | @font-face {
127 | font-family: "Untitled Sans";
128 | font-style: normal;
129 | font-weight: 400;
130 | src: url("/fonts/Untitled Sans/UntitledSans-Regular.otf") format("opentype");
131 | }
132 |
133 | @font-face {
134 | font-family: "Untitled Sans";
135 | font-style: normal;
136 | font-weight: 500;
137 | src: url("/fonts/Untitled Sans/UntitledSans-Medium.otf") format("opentype");
138 | }
139 |
140 | @font-face {
141 | font-family: "Untitled Sans";
142 | font-style: normal;
143 | font-weight: 700;
144 | src: url("/fonts/Untitled Sans/UntitledSans-Bold.otf") format("opentype");
145 | }
146 |
--------------------------------------------------------------------------------
/match/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { Inter } from "next/font/google";
3 | import "./globals.css";
4 |
5 | const inter = Inter({ subsets: ["latin"] });
6 |
7 | export const metadata: Metadata = {
8 | title: "W24 Symposium Matchmaking",
9 | };
10 |
11 | export default function RootLayout({
12 | children,
13 | }: Readonly<{
14 | children: React.ReactNode;
15 | }>) {
16 | return (
17 |
18 | {children}
19 |
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/match/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import { Search } from "@/components/Search";
2 |
3 | export default function Home() {
4 | return (
5 |
6 |
7 | Socratica W24 Symposium Search
8 |
9 |
Waterloo, ON, Canada
10 |
11 |
12 |
13 |
14 | );
15 | }
16 |
--------------------------------------------------------------------------------
/match/src/components/Search.tsx:
--------------------------------------------------------------------------------
1 | "use client";
2 |
3 | import {
4 | DialogContent,
5 | DialogHeader,
6 | DialogTitle,
7 | } from "@/components/ui/dialog";
8 | import { titleCase } from "@/lib/utils";
9 | import Fuse from "fuse.js";
10 |
11 | // change this to summarizedGraphData if AI summarization is enabled
12 | import graphData from "../../../graphData.json";
13 | import { Dialog, DialogTrigger } from "@radix-ui/react-dialog";
14 | import { useEffect, useState } from "react";
15 | import { Input } from "./ui/input";
16 |
17 | interface Node {
18 | id: string;
19 | data: {
20 | name: string;
21 | major: string;
22 | response: string;
23 | topMatch: string;
24 | originalResponse: string;
25 | };
26 | }
27 |
28 | interface CustomNode extends Node {
29 | links: { source: string; target: string }[];
30 | }
31 |
32 | // Create hashmap of id -> node and attach links to each nod
33 | const nodeMap = new Map();
34 | graphData.nodes.forEach((node) => {
35 | return nodeMap.set(node.id, {
36 | ...node,
37 | data: {
38 | ...node.data,
39 | originalResponse: "",
40 | },
41 | links: [],
42 | });
43 | });
44 |
45 | graphData.links.forEach((link) => {
46 | const sourceNode = nodeMap.get(link.source);
47 | const targetNode = nodeMap.get(link.target);
48 |
49 | if (sourceNode) {
50 | sourceNode.links.push(link);
51 | }
52 |
53 | if (targetNode) {
54 | targetNode.links.push(link);
55 | }
56 | });
57 |
58 | // For all empty links in the nodemap add their best match
59 | nodeMap.forEach((node) => {
60 | if (node.links.length === 0) {
61 | const bestMatch = nodeMap.get(node.data.topMatch);
62 | if (bestMatch) {
63 | nodeMap.set(node.id, {
64 | ...node,
65 | links: [
66 | {
67 | source: node.id,
68 | target: bestMatch.id,
69 | },
70 | ],
71 | });
72 | }
73 | }
74 | });
75 |
76 | export const Search = () => {
77 | const [searchTerm, setSearchTerm] = useState("");
78 | const [searchResults, setSearchResults] = useState([]);
79 |
80 | const handleSearch = (event: React.ChangeEvent) => {
81 | setSearchTerm(event.target.value);
82 | };
83 |
84 | const fuseOptions = {
85 | keys: ["data.name", "data.response"],
86 | includeScore: true,
87 | isCaseSensitive: false,
88 | findAllMatches: true,
89 | threshold: 0.4, // adjust this to be more lenient with search
90 | };
91 |
92 | const fuse = new Fuse(graphData.nodes, fuseOptions);
93 |
94 | useEffect(() => {
95 | const results = fuse.search(searchTerm).map((result) => ({
96 | ...result.item,
97 | data: {
98 | ...result.item.data,
99 | originalResponse: "",
100 | },
101 | }));
102 |
103 | setSearchResults(results);
104 | }, [searchTerm]);
105 |
106 | return (
107 |
108 |
113 |
114 | {searchResults.map((item) => {
115 | const currentNode = nodeMap.get(item.id);
116 | const neighbors = currentNode?.links.map((link) => {
117 | const neighborNode = nodeMap.get(
118 | link.source === item.id ? link.target : link.source
119 | );
120 |
121 | return neighborNode;
122 | });
123 |
124 | const name = titleCase(item.data.name);
125 | const dedupNeighbors = Array.from(new Set(neighbors));
126 |
127 | const major =
128 | item.data.major === "N/A" ? "" : titleCase(item.data.major);
129 |
130 | return (
131 |
132 |
133 |
134 | {name}
135 |
136 |
137 | {major}
138 |
139 | {item.data.response}
140 |
141 |
142 |
143 | Potential Connections
144 |
145 |
146 |
147 | {dedupNeighbors?.map((neighbor) => {
148 | return (
149 |
153 |
154 | {neighbor?.data.name}
155 |
156 |
157 | {neighbor?.data.major}
158 |
159 |
160 | {neighbor?.data.response}
161 |
162 |
163 | );
164 | })}
165 |
166 |
167 | {/*
168 | Save changes
169 | */}
170 |
171 |
172 | );
173 | })}
174 |
175 |
176 | );
177 | };
178 |
--------------------------------------------------------------------------------
/match/src/components/ui/dialog.tsx:
--------------------------------------------------------------------------------
1 | "use client"
2 |
3 | import * as React from "react"
4 | import * as DialogPrimitive from "@radix-ui/react-dialog"
5 | import { X } from "lucide-react"
6 |
7 | import { cn } from "@/lib/utils"
8 |
9 | const Dialog = DialogPrimitive.Root
10 |
11 | const DialogTrigger = DialogPrimitive.Trigger
12 |
13 | const DialogPortal = DialogPrimitive.Portal
14 |
15 | const DialogClose = DialogPrimitive.Close
16 |
17 | const DialogOverlay = React.forwardRef<
18 | React.ElementRef,
19 | React.ComponentPropsWithoutRef
20 | >(({ className, ...props }, ref) => (
21 |
29 | ))
30 | DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
31 |
32 | const DialogContent = React.forwardRef<
33 | React.ElementRef,
34 | React.ComponentPropsWithoutRef
35 | >(({ className, children, ...props }, ref) => (
36 |
37 |
38 |
46 | {children}
47 |
48 |
49 | Close
50 |
51 |
52 |
53 | ))
54 | DialogContent.displayName = DialogPrimitive.Content.displayName
55 |
56 | const DialogHeader = ({
57 | className,
58 | ...props
59 | }: React.HTMLAttributes) => (
60 |
67 | )
68 | DialogHeader.displayName = "DialogHeader"
69 |
70 | const DialogFooter = ({
71 | className,
72 | ...props
73 | }: React.HTMLAttributes) => (
74 |
81 | )
82 | DialogFooter.displayName = "DialogFooter"
83 |
84 | const DialogTitle = React.forwardRef<
85 | React.ElementRef,
86 | React.ComponentPropsWithoutRef
87 | >(({ className, ...props }, ref) => (
88 |
96 | ))
97 | DialogTitle.displayName = DialogPrimitive.Title.displayName
98 |
99 | const DialogDescription = React.forwardRef<
100 | React.ElementRef,
101 | React.ComponentPropsWithoutRef
102 | >(({ className, ...props }, ref) => (
103 |
108 | ))
109 | DialogDescription.displayName = DialogPrimitive.Description.displayName
110 |
111 | export {
112 | Dialog,
113 | DialogPortal,
114 | DialogOverlay,
115 | DialogClose,
116 | DialogTrigger,
117 | DialogContent,
118 | DialogHeader,
119 | DialogFooter,
120 | DialogTitle,
121 | DialogDescription,
122 | }
123 |
--------------------------------------------------------------------------------
/match/src/components/ui/input.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | export interface InputProps
6 | extends React.InputHTMLAttributes {}
7 |
8 | const Input = React.forwardRef(
9 | ({ className, type, ...props }, ref) => {
10 | return (
11 |
20 | )
21 | }
22 | )
23 | Input.displayName = "Input"
24 |
25 | export { Input }
26 |
--------------------------------------------------------------------------------
/match/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx";
2 | import { twMerge } from "tailwind-merge";
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs));
6 | }
7 |
8 | export const titleCase = (str: string) => {
9 | // use regex to match all words and capitalize the first letter of each word
10 | return str.replace(
11 | /\w\S*/g,
12 | (txt) => txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase()
13 | );
14 | };
15 |
--------------------------------------------------------------------------------
/match/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from "tailwindcss";
2 |
3 | const config = {
4 | darkMode: ["class"],
5 | content: [
6 | "./pages/**/*.{ts,tsx}",
7 | "./components/**/*.{ts,tsx}",
8 | "./app/**/*.{ts,tsx}",
9 | "./src/**/*.{ts,tsx}",
10 | ],
11 | prefix: "",
12 | theme: {
13 | container: {
14 | center: true,
15 | padding: "2rem",
16 | screens: {
17 | "2xl": "1400px",
18 | },
19 | },
20 | extend: {
21 | keyframes: {
22 | "accordion-down": {
23 | from: { height: "0" },
24 | to: { height: "var(--radix-accordion-content-height)" },
25 | },
26 | "accordion-up": {
27 | from: { height: "var(--radix-accordion-content-height)" },
28 | to: { height: "0" },
29 | },
30 | },
31 | animation: {
32 | "accordion-down": "accordion-down 0.2s ease-out",
33 | "accordion-up": "accordion-up 0.2s ease-out",
34 | },
35 | fontFamily: {
36 | "tiempos-headline": ["'Tiempos Headline'", "serif"],
37 | "space-mono": ["'Space Mono'", "monospace"],
38 | "untitled-sans": ["'Untitled Sans'", "sans-serif"],
39 | },
40 | colors: {
41 | "socratica-cream": "#FBF8EF",
42 | "socratica-black": "#121212",
43 | "socratica-grey": "#A09D98",
44 | },
45 | },
46 | },
47 | plugins: [require("tailwindcss-animate")],
48 | } satisfies Config;
49 |
50 | export default config;
51 |
--------------------------------------------------------------------------------
/match/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "lib": ["dom", "dom.iterable", "esnext"],
4 | "allowJs": true,
5 | "skipLibCheck": true,
6 | "strict": true,
7 | "noEmit": true,
8 | "esModuleInterop": true,
9 | "module": "esnext",
10 | "moduleResolution": "bundler",
11 | "resolveJsonModule": true,
12 | "isolatedModules": true,
13 | "jsx": "preserve",
14 | "incremental": true,
15 | "plugins": [
16 | {
17 | "name": "next"
18 | }
19 | ],
20 | "paths": {
21 | "@/*": ["./src/*"]
22 | }
23 | },
24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
25 | "exclude": ["node_modules"]
26 | }
27 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | annotated-types==0.6.0
2 | anyio==4.3.0
3 | asgiref==3.8.1
4 | backoff==2.2.1
5 | bcrypt==4.1.2
6 | build==1.1.1
7 | cachetools==5.3.3
8 | certifi==2024.2.2
9 | charset-normalizer==3.3.2
10 | chroma-hnswlib==0.7.3
11 | chromadb==0.4.24
12 | click==8.1.7
13 | coloredlogs==15.0.1
14 | Deprecated==1.2.14
15 | distro==1.9.0
16 | fastapi==0.110.0
17 | filelock==3.13.1
18 | flatbuffers==24.3.7
19 | fsspec==2024.3.1
20 | google-auth==2.29.0
21 | googleapis-common-protos==1.63.0
22 | grpcio==1.62.1
23 | h11==0.14.0
24 | httpcore==1.0.5
25 | httptools==0.6.1
26 | httpx==0.27.0
27 | huggingface-hub==0.21.4
28 | humanfriendly==10.0
29 | idna==3.6
30 | importlib-metadata==6.11.0
31 | importlib_resources==6.4.0
32 | kubernetes==29.0.0
33 | mmh3==4.1.0
34 | monotonic==1.6
35 | mpmath==1.3.0
36 | numpy==1.26.4
37 | oauthlib==3.2.2
38 | onnxruntime==1.17.1
39 | openai==1.14.3
40 | opentelemetry-api==1.23.0
41 | opentelemetry-exporter-otlp-proto-common==1.23.0
42 | opentelemetry-exporter-otlp-proto-grpc==1.23.0
43 | opentelemetry-instrumentation==0.44b0
44 | opentelemetry-instrumentation-asgi==0.44b0
45 | opentelemetry-instrumentation-fastapi==0.44b0
46 | opentelemetry-proto==1.23.0
47 | opentelemetry-sdk==1.23.0
48 | opentelemetry-semantic-conventions==0.44b0
49 | opentelemetry-util-http==0.44b0
50 | orjson==3.9.15
51 | overrides==7.7.0
52 | packaging==24.0
53 | pandas==2.2.1
54 | posthog==3.5.0
55 | protobuf==4.25.3
56 | pulsar-client==3.4.0
57 | pyasn1==0.5.1
58 | pyasn1-modules==0.3.0
59 | pydantic==2.6.4
60 | pydantic_core==2.16.3
61 | PyPika==0.48.9
62 | pyproject_hooks==1.0.0
63 | python-dateutil==2.9.0.post0
64 | python-dotenv==1.0.1
65 | pytz==2024.1
66 | PyYAML==6.0.1
67 | requests==2.31.0
68 | requests-oauthlib==2.0.0
69 | rsa==4.9
70 | six==1.16.0
71 | sniffio==1.3.1
72 | starlette==0.36.3
73 | sympy==1.12
74 | tenacity==8.2.3
75 | tokenizers==0.15.2
76 | tqdm==4.66.2
77 | typer==0.9.4
78 | typing_extensions==4.10.0
79 | tzdata==2024.1
80 | urllib3==2.2.1
81 | uvicorn==0.29.0
82 | uvloop==0.19.0
83 | watchfiles==0.21.0
84 | websocket-client==1.7.0
85 | websockets==12.0
86 | wrapt==1.16.0
87 | zipp==3.18.1
88 |
--------------------------------------------------------------------------------
/summarize.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | # Load from .env
4 | from dotenv import load_dotenv
5 | from openai import OpenAI
6 |
7 | load_dotenv()
8 |
9 | if "OPENAI_API_KEY" not in os.environ:
10 | raise Exception("API key not found")
11 |
12 |
13 | client = OpenAI(
14 | api_key=os.environ["OPENAI_API_KEY"]
15 | )
16 |
17 | example_messages = [
18 | {
19 | "role": "system",
20 | "content": "You are an assistant who is to take participant responses answering the question: \"If you had no other obligations, what would you spend your time trying/creating\" and summarize them in a concise, 1-2 sentence abstract.\n\nYou should give your response beginning with the word \"Would\", similar to the following forms:\n\n1) Would create ______\n2) Would make ______"
21 | },
22 | {
23 | "role": "user",
24 | "content": "Summarize response: \"Learning and working with embedded projects interfacing with AI\"\n"
25 | },
26 | {
27 | "role": "assistant",
28 | "content": "Would learn and work on embedded projects interfacing with AI"
29 | },
30 | {
31 | "role": "user",
32 | "content": "Summarize: \"I have been meaning to connect with community organizations/ngos I'm tied to, about campaigns promoting longevity of girls in sports and programs that promoting healthy coaching approaches for girls in high performance training. This is an important cause for me since most girls abandon their sport after adolescence, there are big systematic differences and disparity in opportunities to pursue professional careers - and i just want girls to feel fulfilled through sport. Also I've recently been into metal crafts and jewelry making by repurposing scraps and unconventional pieces to make something wearable. I also enjoy making embroidery and hand textiles projects. So many half-started crafts projects I could mention.\""
33 | },
34 | {
35 | "role": "assistant",
36 | "content": "Would connect with community organizations promoting girls in sports and jewelry making by repurposing scraps"
37 | },
38 | {
39 | "role": "user",
40 | "content": "Summarize: \"Music\"\n"
41 | },
42 | {
43 | "role": "assistant",
44 | "content": "Would work on music"
45 | },
46 | {
47 | "role": "user",
48 | "content": "Summarize: \"Building schools or skateparks in Nigeria and neighboring countries. And sending millions to Congo and Palestine\"\n"
49 | },
50 | {
51 | "role": "assistant",
52 | "content": "Would build schools or skateparks in Nigeria and send millions to Congo and Palestine"
53 | },
54 | {
55 | "role": "user",
56 | "content": "Summarize: \"I would love to dive into learning robotics. I have ideas about how robots can be applied and commercialized but I have no experience with that type of hardware yet.\""
57 | },
58 | {
59 | "role": "assistant",
60 | "content": "Would dive into learning robotics, with my ideas on how robots can be applied and commercialized"
61 | },
62 | {
63 | "role": "user",
64 | "content": "Summarize: \"Healthcare/biotech community, music label, content house\""
65 | },
66 | {
67 | "role": "assistant",
68 | "content": "Would create a healthcare/biotech community, a music label, and a content house."
69 | },
70 | {
71 | "role": "user",
72 | "content": "Summarize: \"Visiting small towns in rural Canada to learn more about how they see the future, which problems are on their mind, etc.\""
73 | },
74 | {
75 | "role": "assistant",
76 | "content": "Would visit small towns in rural Canada to learn more about how they see their future and their problems"
77 | },
78 | {
79 | "role": "user",
80 | "content": "Summarize: \"I'd want to work on something to help people live up to their true potential, to make the best of the time we have. I want to help people be more fulfilled and happier in their day-to-day lives.\""
81 | },
82 | {
83 | "role": "assistant",
84 | "content": "Would work on a project to help people live up to their true potential for a more fulfilled and happier life."
85 | },
86 | {
87 | "role": "user",
88 | "content": "Summarize: \"With no obligations, would: I have been tackling the problem of finding better matches for peer-tutor pairs. For all large-scale tutoring platforms such as Chegg, Khan Academy, etc, there are no features that recommend tutors to users based on their individual needs. On the other hand, in-person tutoring institutions including Kumon, private tutors, and services offered by schools create pairings based on heuristics; not considering a student's unique learning profile. If I had no other obligations (school, clubs, etc), I would go head-on into discussing these issues with current individuals in the tutoring scene. I have already been developing a platform to algorithmically find the most compatible matches for students and tutors, however progress is not steady as there are other obligations that cause priorities to change.\""
89 | },
90 | {
91 | "role": "assistant",
92 | "content": "Would engage fully in developing a platform that algorithmically finds the most compatible matches for students and tutors in large-scale tutoring platforms."
93 | },
94 | {
95 | "role": "user",
96 | "content": "Summarize: \"With no obligations, would: Travel around the world, take pictures and videos, play and record and publish music\""
97 | },
98 | {
99 | "role": "assistant",
100 | "content": "Would travel around the world, take pictures and videos, and publish music"
101 | },
102 | {
103 | "role": "user",
104 | "content": "Summarize: \"Working on ai personal assistant google chrome extension. Looking for interesting projects to join in as a SWE\""
105 | },
106 | {
107 | "role": "assistant",
108 | "content": ""
109 | },
110 | {
111 | "role": "assistant",
112 | "content": "Would work on an AI personal assistant Google Chrome extension and seek interesting projects to join as a Software Engineer."
113 | },
114 | {
115 | "role": "user",
116 | "content": "Summarize: \"With no obligations, would: I would love to work with scientists and engineers on exciting scientific problem spaces (quantum computing, AI, etc) to introduce new advancements in these areas. For example, experimenting with new methodologies and technology to study black holes and the universe better is fascinating to me.\""
117 | },
118 | {
119 | "role": "assistant",
120 | "content": "Would work with scientists and engineers on advancements on scientific problem spaces like quantum computing, AI, and astronomical studies."
121 | },
122 | {
123 | "role": "user",
124 | "content": "Summarize: \"With no obligations, would: I will work on different projects on different technologies like blockchain, machine learning and mobile development. Creating such applications will strengthen my hold on the basics and expose me to practical examples.\""
125 | },
126 | {
127 | "role": "assistant",
128 | "content": "Would work on various projects involving technologies such as blockchain, machine learning, and mobile development to strengthen basic skills and gain practical experience."
129 | },
130 | {
131 | "role": "user",
132 | "content": "Summarize: \"With no obligations, would: i'd spend time researching whatever topics I feel like in STEM, humanities, social sciences, and i'd also make bad art: music, film, drawings\""
133 | },
134 | {
135 | "role": "assistant",
136 | "content": "Would spend time researching topics across STEM, humanities, social sciences, and create experimental music, film, and drawings."
137 | },
138 | {
139 | "role": "user",
140 | "content": "Summarize: \"With no obligations, would: A tech venture idea that can make a social impact\""
141 | },
142 | {
143 | "role": "assistant",
144 | "content": "Would create a tech venture that can make a social impact."
145 | }
146 | ]
147 |
148 |
149 | def generate_summary(response: str) -> str:
150 | last_prompt = f"Summarize: \"{response}\"\n"
151 |
152 | # Create a NEW array with the examples messages and the last prompt
153 | new_example_messages = example_messages + \
154 | [{"role": "user", "content": last_prompt}]
155 |
156 | chat_response = client.chat.completions.create(
157 | model="gpt-4",
158 | messages=new_example_messages,
159 | temperature=1,
160 | max_tokens=40,
161 | top_p=1,
162 | frequency_penalty=0,
163 | presence_penalty=0
164 | )
165 |
166 | return chat_response.choices[0].message.content
167 |
168 |
169 | if __name__ == "__main__":
170 | res = generate_summary(
171 | "A game")
172 | print(res)
173 |
--------------------------------------------------------------------------------
/summarize_graph_data.py:
--------------------------------------------------------------------------------
1 | # Read from graphData.json
2 |
3 | import json
4 |
5 | from summarize import generate_summary
6 |
7 | def main():
8 | # Get cached from attendees.json
9 | with open("attendees.json", "r") as f:
10 | attendees = json.load(f)
11 | # parse as dict
12 | attendees = dict(attendees)
13 |
14 | with open("graphData.json", "r") as f:
15 | graph_data = json.load(f)
16 | nodes = graph_data["nodes"]
17 | links = graph_data["links"]
18 |
19 | # Process the new nodes by changing the response using summarize.py
20 | for i, node in enumerate(nodes):
21 | # get node id
22 | node_name = node["data"]["name"]
23 | node_id = node["id"]
24 |
25 | print(
26 | f"({i+1}/{len(nodes)}) Processing node: {node_name}")
27 | response = node["data"]["response"]
28 |
29 | # If response already exists in attendees.json skip don't recompute
30 | if node_id in attendees:
31 | print(
32 | f"Node {node_id}: {node_name} already exists in attendees.json")
33 | new_response = attendees[node_id]
34 | else:
35 | new_response = generate_summary(response)
36 |
37 | node["data"]["response"] = new_response
38 | node["data"]["originalResponse"] = response
39 |
40 | # Write the new graph data to a new file
41 | with open("summarizedGraphData.json", "w") as f:
42 | json.dump({"nodes": nodes, "links": links}, f)
43 |
44 |
45 | if __name__ == '__main__':
46 | main()
47 |
--------------------------------------------------------------------------------
/utils.py:
--------------------------------------------------------------------------------
1 | def chunk_array(arr, chunk_size):
2 | # Use list comprehension to create subarrays of size 'chunk_size'
3 | return [arr[i:i + chunk_size] for i in range(0, len(arr), chunk_size)]
4 |
--------------------------------------------------------------------------------