diff --git a/.gitignore b/.gitignore
index b930cf1..8b59381 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,8 @@ src/permissions.ts
# typescript
*.tsbuildinfo
next-env.d.ts
+
+# Renogare font, until further licensing agreement
+public/fonts/Renogare/Renogare*
+# Celeste assets (ripped)
+public/assets/celeste/
\ No newline at end of file
diff --git a/openapi.yaml b/openapi.yaml
new file mode 100644
index 0000000..dbaff88
--- /dev/null
+++ b/openapi.yaml
@@ -0,0 +1,107 @@
+---
+openapi: 3.1.0
+tags:
+ - name: clan
+ description: "Clan operations"
+ - name: character
+ description: "Character operations"
+ - name: view
+ description: "Passive operations"
+ - name: create
+ description: "Constructive operations"
+ - name: edit
+ description: "Additive operations"
+ - name: delete
+ description: "Destructive operations"
+ - name: bulk
+ description: "Bulk operations"
+info:
+ title: TrollCall API
+ version: 2.0.0
+ contact:
+ name: MeowcaTheoRange
+ url: https://me.trollcall.xyz/
+ description: Blah blah blah.
+servers:
+ - url: https://trollcall.xyz/api
+ description: API server
+paths:
+ "/clan":
+ post:
+ tags:
+ - clan
+ - create
+ description: Create a Clan.
+ operationId: createClan
+ responses:
+ "200":
+ description: Clan created successfully
+ "400":
+ description: ValidationError
+ "409":
+ description: Clan with name already exists
+ "503":
+ description: Database unavaliable
+ "/clan/...":
+ get:
+ tags:
+ - clan
+ - view
+ - bulk
+ description: View all Clans.
+ operationId: getManyClans
+ responses:
+ "200":
+ description: Array of Clans
+ "404":
+ description: Clans/page specified does not exist
+ "/clan/.../{page}":
+ parameters:
+ - name: page
+ in: path
+ required: true
+ description: Page offset
+ schema:
+ type: number
+ get:
+ tags:
+ - clan
+ - view
+ - bulk
+ description: View all Clans at page offset.
+ operationId: getManyClansWithPage
+ responses:
+ "200":
+ description: Array of Clans
+ "404":
+ description: Clans/page specified does not exist
+ "/clan/{clan}":
+ parameters:
+ - name: clan
+ in: path
+ description: Name of clan to view
+ required: true
+ schema:
+ type: string
+ get:
+ tags:
+ - clan
+ - view
+ description: View specified Clan.
+ operationId: getClan
+ responses:
+ "200":
+ description: Clan
+ "404":
+ description: Clan specified does not exist
+ put:
+ tags:
+ - clan
+ - edit
+ description: Edit specified Clan.
+ operationId: editClan
+ responses:
+ "200":
+ description: Clan
+ "404":
+ description: Clan specified does not exist
diff --git a/package-lock.json b/package-lock.json
index 479a758..1eda30e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
"body-parser": "^1.20.2",
"cookie": "^0.5.0",
"cookie-parser": "^1.4.6",
+ "cookies-next": "^3.0.0",
"crypto-js": "^4.1.1",
"dotenv": "^16.3.0",
"express": "^4.18.2",
@@ -755,6 +756,34 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
+ "node_modules/cookies-next": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cookies-next/-/cookies-next-3.0.0.tgz",
+ "integrity": "sha512-VaSrsjQJ8yHnGAGulV9zJxBr7hrKJ/O2mo87evsGIMF7XvJI3AJNguevotx0Gek1MMMBkZvZNWu2JueSNoSKEQ==",
+ "dependencies": {
+ "@types/cookie": "^0.4.1",
+ "@types/node": "^16.10.2",
+ "cookie": "^0.4.0"
+ }
+ },
+ "node_modules/cookies-next/node_modules/@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+ },
+ "node_modules/cookies-next/node_modules/@types/node": {
+ "version": "16.18.46",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.46.tgz",
+ "integrity": "sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg=="
+ },
+ "node_modules/cookies-next/node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/crypto-js": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
diff --git a/package.json b/package.json
index 310732c..8c5673c 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
"body-parser": "^1.20.2",
"cookie": "^0.5.0",
"cookie-parser": "^1.4.6",
+ "cookies-next": "^3.0.0",
"crypto-js": "^4.1.1",
"dotenv": "^16.3.0",
"express": "^4.18.2",
diff --git a/public/assets/404/smash.webp b/public/assets/404/smash.webp
new file mode 100644
index 0000000..001ed32
Binary files /dev/null and b/public/assets/404/smash.webp differ
diff --git a/public/assets/404/stairs.webp b/public/assets/404/stairs.webp
new file mode 100644
index 0000000..3607dae
Binary files /dev/null and b/public/assets/404/stairs.webp differ
diff --git a/public/assets/aspect/Blood.svg b/public/assets/aspect/Blood.svg
new file mode 100644
index 0000000..97caea7
--- /dev/null
+++ b/public/assets/aspect/Blood.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Breath.svg b/public/assets/aspect/Breath.svg
new file mode 100644
index 0000000..fb7177c
--- /dev/null
+++ b/public/assets/aspect/Breath.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Doom.svg b/public/assets/aspect/Doom.svg
new file mode 100644
index 0000000..8756106
--- /dev/null
+++ b/public/assets/aspect/Doom.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Heart.svg b/public/assets/aspect/Heart.svg
new file mode 100644
index 0000000..a18728b
--- /dev/null
+++ b/public/assets/aspect/Heart.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Hope.svg b/public/assets/aspect/Hope.svg
new file mode 100644
index 0000000..a6997ed
--- /dev/null
+++ b/public/assets/aspect/Hope.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Life.svg b/public/assets/aspect/Life.svg
new file mode 100644
index 0000000..8c1949a
--- /dev/null
+++ b/public/assets/aspect/Life.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Light.svg b/public/assets/aspect/Light.svg
new file mode 100644
index 0000000..4481bf5
--- /dev/null
+++ b/public/assets/aspect/Light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Mind.svg b/public/assets/aspect/Mind.svg
new file mode 100644
index 0000000..e08f4f8
--- /dev/null
+++ b/public/assets/aspect/Mind.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Rage.svg b/public/assets/aspect/Rage.svg
new file mode 100644
index 0000000..8f82d25
--- /dev/null
+++ b/public/assets/aspect/Rage.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Space.svg b/public/assets/aspect/Space.svg
new file mode 100644
index 0000000..46448ff
--- /dev/null
+++ b/public/assets/aspect/Space.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Time.svg b/public/assets/aspect/Time.svg
new file mode 100644
index 0000000..40adc37
--- /dev/null
+++ b/public/assets/aspect/Time.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/aspect/Void.svg b/public/assets/aspect/Void.svg
new file mode 100644
index 0000000..370e5b5
--- /dev/null
+++ b/public/assets/aspect/Void.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/assets/fonts/FlowCircular-Regular.ttf b/public/assets/fonts/FlowCircular-Regular.ttf
new file mode 100644
index 0000000..7e0cc8a
Binary files /dev/null and b/public/assets/fonts/FlowCircular-Regular.ttf differ
diff --git a/public/assets/fonts/Material.woff2 b/public/assets/fonts/Material.woff2
new file mode 100644
index 0000000..6c77ce8
Binary files /dev/null and b/public/assets/fonts/Material.woff2 differ
diff --git a/public/assets/fonts/SpaceGrotesk.ttf b/public/assets/fonts/SpaceGrotesk.ttf
new file mode 100644
index 0000000..b54a196
Binary files /dev/null and b/public/assets/fonts/SpaceGrotesk.ttf differ
diff --git a/public/assets/fonts/TrollCallDisplay-Regular.otf b/public/assets/fonts/TrollCallDisplay-Regular.otf
new file mode 100644
index 0000000..8574cbd
Binary files /dev/null and b/public/assets/fonts/TrollCallDisplay-Regular.otf differ
diff --git a/public/assets/fonts/TrollCallDisplay-Regular.woff b/public/assets/fonts/TrollCallDisplay-Regular.woff
new file mode 100644
index 0000000..eb7bf28
Binary files /dev/null and b/public/assets/fonts/TrollCallDisplay-Regular.woff differ
diff --git a/public/assets/fonts/TrollCallDisplay-Regular.woff2 b/public/assets/fonts/TrollCallDisplay-Regular.woff2
new file mode 100644
index 0000000..66b5950
Binary files /dev/null and b/public/assets/fonts/TrollCallDisplay-Regular.woff2 differ
diff --git a/public/assets/hiveswap/aspects.png b/public/assets/hiveswap/aspects.png
new file mode 100644
index 0000000..9afeac7
Binary files /dev/null and b/public/assets/hiveswap/aspects.png differ
diff --git a/public/assets/hiveswap/signs.png b/public/assets/hiveswap/signs.png
new file mode 100644
index 0000000..5101716
Binary files /dev/null and b/public/assets/hiveswap/signs.png differ
diff --git a/public/assets/hiveswap/sway.png b/public/assets/hiveswap/sway.png
new file mode 100644
index 0000000..bc2eccb
Binary files /dev/null and b/public/assets/hiveswap/sway.png differ
diff --git a/public/assets/pattern/pattern.png b/public/assets/pattern/pattern.png
new file mode 100644
index 0000000..94b344d
Binary files /dev/null and b/public/assets/pattern/pattern.png differ
diff --git a/public/assets/pattern/pattern_inv.png b/public/assets/pattern/pattern_inv.png
new file mode 100644
index 0000000..3dddfdb
Binary files /dev/null and b/public/assets/pattern/pattern_inv.png differ
diff --git a/public/assets/signs/Blue/Scorcen.svg b/public/assets/signs/Blue/Scorcen.svg
new file mode 100644
index 0000000..e8e6773
--- /dev/null
+++ b/public/assets/signs/Blue/Scorcen.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorcen
+
+
+
+
+
+ image/svg+xml
+
+ Scorcen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorcer.svg b/public/assets/signs/Blue/Scorcer.svg
new file mode 100644
index 0000000..1d31e9c
--- /dev/null
+++ b/public/assets/signs/Blue/Scorcer.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorcer
+
+
+
+
+
+ image/svg+xml
+
+ Scorcer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorga.svg b/public/assets/signs/Blue/Scorga.svg
new file mode 100644
index 0000000..cce7fc9
--- /dev/null
+++ b/public/assets/signs/Blue/Scorga.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scorga
+
+
+
+
+
+ image/svg+xml
+
+ Scorga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorgo.svg b/public/assets/signs/Blue/Scorgo.svg
new file mode 100644
index 0000000..e7b1857
--- /dev/null
+++ b/public/assets/signs/Blue/Scorgo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorgo
+
+
+
+
+
+ image/svg+xml
+
+ Scorgo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scoriborn.svg b/public/assets/signs/Blue/Scoriborn.svg
new file mode 100644
index 0000000..606c59c
--- /dev/null
+++ b/public/assets/signs/Blue/Scoriborn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scoriborn
+
+
+
+
+
+ image/svg+xml
+
+ Scoriborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scoricorn.svg b/public/assets/signs/Blue/Scoricorn.svg
new file mode 100644
index 0000000..5a552c2
--- /dev/null
+++ b/public/assets/signs/Blue/Scoricorn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scoricorn
+
+
+
+
+
+ image/svg+xml
+
+ Scoricorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scories.svg b/public/assets/signs/Blue/Scories.svg
new file mode 100644
index 0000000..b32a9c1
--- /dev/null
+++ b/public/assets/signs/Blue/Scories.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scories
+
+
+
+
+
+ image/svg+xml
+
+ Scories
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorist.svg b/public/assets/signs/Blue/Scorist.svg
new file mode 100644
index 0000000..aa25a79
--- /dev/null
+++ b/public/assets/signs/Blue/Scorist.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scorist
+
+
+
+
+
+ image/svg+xml
+
+ Scorist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorittanius.svg b/public/assets/signs/Blue/Scorittanius.svg
new file mode 100644
index 0000000..672d1c0
--- /dev/null
+++ b/public/assets/signs/Blue/Scorittanius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scorittanius
+
+
+
+
+
+ image/svg+xml
+
+ Scorittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorittarius.svg b/public/assets/signs/Blue/Scorittarius.svg
new file mode 100644
index 0000000..b4a7334
--- /dev/null
+++ b/public/assets/signs/Blue/Scorittarius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorittarius
+
+
+
+
+
+ image/svg+xml
+
+ Scorittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorlo.svg b/public/assets/signs/Blue/Scorlo.svg
new file mode 100644
index 0000000..3838b63
--- /dev/null
+++ b/public/assets/signs/Blue/Scorlo.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scorlo
+
+
+
+
+
+ image/svg+xml
+
+ Scorlo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scormini.svg b/public/assets/signs/Blue/Scormini.svg
new file mode 100644
index 0000000..5295663
--- /dev/null
+++ b/public/assets/signs/Blue/Scormini.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scormini
+
+
+
+
+
+ image/svg+xml
+
+ Scormini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scormino.svg b/public/assets/signs/Blue/Scormino.svg
new file mode 100644
index 0000000..153761c
--- /dev/null
+++ b/public/assets/signs/Blue/Scormino.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scormino
+
+
+
+
+
+ image/svg+xml
+
+ Scormino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scornius.svg b/public/assets/signs/Blue/Scornius.svg
new file mode 100644
index 0000000..e6969e1
--- /dev/null
+++ b/public/assets/signs/Blue/Scornius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scornius
+
+
+
+
+
+ image/svg+xml
+
+ Scornius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scoro.svg b/public/assets/signs/Blue/Scoro.svg
new file mode 100644
index 0000000..9f94980
--- /dev/null
+++ b/public/assets/signs/Blue/Scoro.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scoro
+
+
+
+
+
+ image/svg+xml
+
+ Scoro
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorpia.svg b/public/assets/signs/Blue/Scorpia.svg
new file mode 100644
index 0000000..16775c9
--- /dev/null
+++ b/public/assets/signs/Blue/Scorpia.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorpia
+
+
+
+
+
+ image/svg+xml
+
+ Scorpia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorpio.svg b/public/assets/signs/Blue/Scorpio.svg
new file mode 100644
index 0000000..7753ed1
--- /dev/null
+++ b/public/assets/signs/Blue/Scorpio.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scorpio
+
+
+
+
+
+ image/svg+xml
+
+ Scorpio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorra.svg b/public/assets/signs/Blue/Scorra.svg
new file mode 100644
index 0000000..812220f
--- /dev/null
+++ b/public/assets/signs/Blue/Scorra.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorra
+
+
+
+
+
+ image/svg+xml
+
+ Scorra
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorrius.svg b/public/assets/signs/Blue/Scorrius.svg
new file mode 100644
index 0000000..825d544
--- /dev/null
+++ b/public/assets/signs/Blue/Scorrius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorrius
+
+
+
+
+
+ image/svg+xml
+
+ Scorrius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorsces.svg b/public/assets/signs/Blue/Scorsces.svg
new file mode 100644
index 0000000..cd36add
--- /dev/null
+++ b/public/assets/signs/Blue/Scorsces.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scorsces
+
+
+
+
+
+ image/svg+xml
+
+ Scorsces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorsci.svg b/public/assets/signs/Blue/Scorsci.svg
new file mode 100644
index 0000000..09a605f
--- /dev/null
+++ b/public/assets/signs/Blue/Scorsci.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorsci
+
+
+
+
+
+ image/svg+xml
+
+ Scorsci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorun.svg b/public/assets/signs/Blue/Scorun.svg
new file mode 100644
index 0000000..f1e29cf
--- /dev/null
+++ b/public/assets/signs/Blue/Scorun.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorun
+
+
+
+
+
+ image/svg+xml
+
+ Scorun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorus.svg b/public/assets/signs/Blue/Scorus.svg
new file mode 100644
index 0000000..95d3ee0
--- /dev/null
+++ b/public/assets/signs/Blue/Scorus.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Scorus
+
+
+
+
+
+ image/svg+xml
+
+ Scorus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Blue/Scorza.svg b/public/assets/signs/Blue/Scorza.svg
new file mode 100644
index 0000000..2160d2d
--- /dev/null
+++ b/public/assets/signs/Blue/Scorza.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Scorza
+
+
+
+
+
+ image/svg+xml
+
+ Scorza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Tarusci.svg b/public/assets/signs/Bronze/Tarusci.svg
new file mode 100644
index 0000000..4e5f08b
--- /dev/null
+++ b/public/assets/signs/Bronze/Tarusci.svg
@@ -0,0 +1,64 @@
+
+
+
+
+ Taursci
+
+
+
+
+
+ image/svg+xml
+
+ Taursci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurcen.svg b/public/assets/signs/Bronze/Taurcen.svg
new file mode 100644
index 0000000..c87d258
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurcen.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurcen
+
+
+
+
+
+ image/svg+xml
+
+ Taurcen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurcer.svg b/public/assets/signs/Bronze/Taurcer.svg
new file mode 100644
index 0000000..ea6c2d0
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurcer.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurga.svg b/public/assets/signs/Bronze/Taurga.svg
new file mode 100644
index 0000000..bb46703
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurga.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurga
+
+
+
+
+
+ image/svg+xml
+
+ Taurga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurgo.svg b/public/assets/signs/Bronze/Taurgo.svg
new file mode 100644
index 0000000..0ed473b
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurgo.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Tauriborn.svg b/public/assets/signs/Bronze/Tauriborn.svg
new file mode 100644
index 0000000..77b5698
--- /dev/null
+++ b/public/assets/signs/Bronze/Tauriborn.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Tauriborn
+
+
+
+
+
+ image/svg+xml
+
+ Tauriborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Tauricorn.svg b/public/assets/signs/Bronze/Tauricorn.svg
new file mode 100644
index 0000000..8d1ca57
--- /dev/null
+++ b/public/assets/signs/Bronze/Tauricorn.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Tauricorn
+
+
+
+
+
+ image/svg+xml
+
+ Tauricorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Tauries.svg b/public/assets/signs/Bronze/Tauries.svg
new file mode 100644
index 0000000..b52309a
--- /dev/null
+++ b/public/assets/signs/Bronze/Tauries.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Tauries
+
+
+
+
+
+ image/svg+xml
+
+ Tauries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurist.svg b/public/assets/signs/Bronze/Taurist.svg
new file mode 100644
index 0000000..973791b
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurist.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurist
+
+
+
+
+
+ image/svg+xml
+
+ Taurist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurittanius.svg b/public/assets/signs/Bronze/Taurittanius.svg
new file mode 100644
index 0000000..764c81d
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurittanius.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurlo.svg b/public/assets/signs/Bronze/Taurlo.svg
new file mode 100644
index 0000000..e94bd27
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurlo.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurlo
+
+
+
+
+
+ image/svg+xml
+
+ Taurlo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurmini.svg b/public/assets/signs/Bronze/Taurmini.svg
new file mode 100644
index 0000000..b453e26
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurmini.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurmini
+
+
+
+
+
+ image/svg+xml
+
+ Taurmini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurmino.svg b/public/assets/signs/Bronze/Taurmino.svg
new file mode 100644
index 0000000..5fcae5e
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurmino.svg
@@ -0,0 +1,64 @@
+
+
+
+
+ Taurmino
+
+
+
+
+
+ image/svg+xml
+
+ Taurmino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurnius.svg b/public/assets/signs/Bronze/Taurnius.svg
new file mode 100644
index 0000000..f485328
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurnius.svg
@@ -0,0 +1,64 @@
+
+
+
+
+ Taurnius
+
+
+
+
+
+ image/svg+xml
+
+ Taurnius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Tauro.svg b/public/assets/signs/Bronze/Tauro.svg
new file mode 100644
index 0000000..14621b3
--- /dev/null
+++ b/public/assets/signs/Bronze/Tauro.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Tauro
+
+
+
+
+
+ image/svg+xml
+
+ Tauro
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurpia.svg b/public/assets/signs/Bronze/Taurpia.svg
new file mode 100644
index 0000000..523772b
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurpia.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurpia
+
+
+
+
+
+ image/svg+xml
+
+ Taurpia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurpio.svg b/public/assets/signs/Bronze/Taurpio.svg
new file mode 100644
index 0000000..528b5ee
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurpio.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurpio
+
+
+
+
+
+ image/svg+xml
+
+ Taurpio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurra.svg b/public/assets/signs/Bronze/Taurra.svg
new file mode 100644
index 0000000..d4fe188
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurra.svg
@@ -0,0 +1,68 @@
+
+
+
+
+ Taurra
+
+
+
+
+
+ image/svg+xml
+
+ Taurra
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurritarius.svg b/public/assets/signs/Bronze/Taurritarius.svg
new file mode 100644
index 0000000..0c845fa
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurritarius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurrius.svg b/public/assets/signs/Bronze/Taurrius.svg
new file mode 100644
index 0000000..20cb2ed
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurrius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurrius
+
+
+
+
+
+ image/svg+xml
+
+ Taurrius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taursces.svg b/public/assets/signs/Bronze/Taursces.svg
new file mode 100644
index 0000000..e54763e
--- /dev/null
+++ b/public/assets/signs/Bronze/Taursces.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taursces
+
+
+
+
+
+ image/svg+xml
+
+ Taursces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurun.svg b/public/assets/signs/Bronze/Taurun.svg
new file mode 100644
index 0000000..6dec25a
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurun.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Taurun
+
+
+
+
+
+ image/svg+xml
+
+ Taurun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurus.svg b/public/assets/signs/Bronze/Taurus.svg
new file mode 100644
index 0000000..8229914
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurus.svg
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Bronze/Taurza.svg b/public/assets/signs/Bronze/Taurza.svg
new file mode 100644
index 0000000..a5415f4
--- /dev/null
+++ b/public/assets/signs/Bronze/Taurza.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Taurza
+
+
+
+
+
+ image/svg+xml
+
+ Taurza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Piborn.svg b/public/assets/signs/Fuchsia/Piborn.svg
new file mode 100644
index 0000000..bcaa19b
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Piborn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Piborn
+
+
+
+
+
+ image/svg+xml
+
+ Piborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Picen.svg b/public/assets/signs/Fuchsia/Picen.svg
new file mode 100644
index 0000000..b128ac7
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Picen.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Picen
+
+
+
+
+
+ image/svg+xml
+
+ Picen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Picer.svg b/public/assets/signs/Fuchsia/Picer.svg
new file mode 100644
index 0000000..308dff0
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Picer.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Picer
+
+
+
+
+
+ image/svg+xml
+
+ Picer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Picorn.svg b/public/assets/signs/Fuchsia/Picorn.svg
new file mode 100644
index 0000000..326b155
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Picorn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Picorn
+
+
+
+
+
+ image/svg+xml
+
+ Picorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Piga.svg b/public/assets/signs/Fuchsia/Piga.svg
new file mode 100644
index 0000000..304f77f
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Piga.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Piga
+
+
+
+
+
+ image/svg+xml
+
+ Piga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pigo.svg b/public/assets/signs/Fuchsia/Pigo.svg
new file mode 100644
index 0000000..c4c896d
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pigo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pigo
+
+
+
+
+
+ image/svg+xml
+
+ Pigo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pilo.svg b/public/assets/signs/Fuchsia/Pilo.svg
new file mode 100644
index 0000000..28abc09
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pilo.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Pilo
+
+
+
+
+
+ image/svg+xml
+
+ Pilo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pimini.svg b/public/assets/signs/Fuchsia/Pimini.svg
new file mode 100644
index 0000000..09e6d8e
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pimini.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pimini
+
+
+
+
+
+ image/svg+xml
+
+ Pimini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pimino.svg b/public/assets/signs/Fuchsia/Pimino.svg
new file mode 100644
index 0000000..94daccd
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pimino.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Pimino
+
+
+
+
+
+ image/svg+xml
+
+ Pimino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pinius.svg b/public/assets/signs/Fuchsia/Pinius.svg
new file mode 100644
index 0000000..997825a
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pinius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pinius
+
+
+
+
+
+ image/svg+xml
+
+ Pinius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pio.svg b/public/assets/signs/Fuchsia/Pio.svg
new file mode 100644
index 0000000..b798746
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pio.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pio
+
+
+
+
+
+ image/svg+xml
+
+ Pio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pipia.svg b/public/assets/signs/Fuchsia/Pipia.svg
new file mode 100644
index 0000000..07846a3
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pipia.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pipia
+
+
+
+
+
+ image/svg+xml
+
+ Pipia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pipio.svg b/public/assets/signs/Fuchsia/Pipio.svg
new file mode 100644
index 0000000..cc80ec6
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pipio.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pipio
+
+
+
+
+
+ image/svg+xml
+
+ Pipio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pira.svg b/public/assets/signs/Fuchsia/Pira.svg
new file mode 100644
index 0000000..e885d06
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pira.svg
@@ -0,0 +1,69 @@
+
+
+
+
+ Pira
+
+
+
+
+
+ image/svg+xml
+
+ Pira
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Piries.svg b/public/assets/signs/Fuchsia/Piries.svg
new file mode 100644
index 0000000..68ac18b
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Piries.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Piries
+
+
+
+
+
+ image/svg+xml
+
+ Piries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pirist.svg b/public/assets/signs/Fuchsia/Pirist.svg
new file mode 100644
index 0000000..da44d3a
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pirist.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pirist
+
+
+
+
+
+ image/svg+xml
+
+ Pirist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pirius.svg b/public/assets/signs/Fuchsia/Pirius.svg
new file mode 100644
index 0000000..6ffa3b5
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pirius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pirius
+
+
+
+
+
+ image/svg+xml
+
+ Pirius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pisces.svg b/public/assets/signs/Fuchsia/Pisces.svg
new file mode 100644
index 0000000..acc1338
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pisces.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pisces
+
+
+
+
+
+ image/svg+xml
+
+ Pisces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pisci.svg b/public/assets/signs/Fuchsia/Pisci.svg
new file mode 100644
index 0000000..d47bdee
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pisci.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pisci
+
+
+
+
+
+ image/svg+xml
+
+ Pisci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pittanius.svg b/public/assets/signs/Fuchsia/Pittanius.svg
new file mode 100644
index 0000000..1bb6b5e
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pittanius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pittanius
+
+
+
+
+
+ image/svg+xml
+
+ Pittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pittarius.svg b/public/assets/signs/Fuchsia/Pittarius.svg
new file mode 100644
index 0000000..6b0fcef
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pittarius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pittarius
+
+
+
+
+
+ image/svg+xml
+
+ Pittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Piun.svg b/public/assets/signs/Fuchsia/Piun.svg
new file mode 100644
index 0000000..8011328
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Piun.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Piun
+
+
+
+
+
+ image/svg+xml
+
+ Piun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Pius.svg b/public/assets/signs/Fuchsia/Pius.svg
new file mode 100644
index 0000000..a703fd5
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Pius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Pius
+
+
+
+
+
+ image/svg+xml
+
+ Pius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Fuchsia/Piza.svg b/public/assets/signs/Fuchsia/Piza.svg
new file mode 100644
index 0000000..ce90179
--- /dev/null
+++ b/public/assets/signs/Fuchsia/Piza.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Piza
+
+
+
+
+
+ image/svg+xml
+
+ Piza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemcen.svg b/public/assets/signs/Gold/Gemcen.svg
new file mode 100644
index 0000000..da00ba7
--- /dev/null
+++ b/public/assets/signs/Gold/Gemcen.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemcen
+
+
+
+
+
+ image/svg+xml
+
+ Gemcen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemcer.svg b/public/assets/signs/Gold/Gemcer.svg
new file mode 100644
index 0000000..1794b07
--- /dev/null
+++ b/public/assets/signs/Gold/Gemcer.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Gemcer
+
+
+
+
+
+ image/svg+xml
+
+ Gemcer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemga.svg b/public/assets/signs/Gold/Gemga.svg
new file mode 100644
index 0000000..ba659ac
--- /dev/null
+++ b/public/assets/signs/Gold/Gemga.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemga
+
+
+
+
+
+ image/svg+xml
+
+ Gemga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemgo.svg b/public/assets/signs/Gold/Gemgo.svg
new file mode 100644
index 0000000..6613d31
--- /dev/null
+++ b/public/assets/signs/Gold/Gemgo.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemgo
+
+
+
+
+
+ image/svg+xml
+
+ Gemgo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemiborn.svg b/public/assets/signs/Gold/Gemiborn.svg
new file mode 100644
index 0000000..4a1602d
--- /dev/null
+++ b/public/assets/signs/Gold/Gemiborn.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemiborn
+
+
+
+
+
+ image/svg+xml
+
+ Gemiborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemicorn.svg b/public/assets/signs/Gold/Gemicorn.svg
new file mode 100644
index 0000000..3362679
--- /dev/null
+++ b/public/assets/signs/Gold/Gemicorn.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemicorn
+
+
+
+
+
+ image/svg+xml
+
+ Gemicorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemini.svg b/public/assets/signs/Gold/Gemini.svg
new file mode 100644
index 0000000..35eb718
--- /dev/null
+++ b/public/assets/signs/Gold/Gemini.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemini
+
+
+
+
+
+ image/svg+xml
+
+ Gemini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemino.svg b/public/assets/signs/Gold/Gemino.svg
new file mode 100644
index 0000000..202179c
--- /dev/null
+++ b/public/assets/signs/Gold/Gemino.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Gemino
+
+
+
+
+
+ image/svg+xml
+
+ Gemino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemittanius.svg b/public/assets/signs/Gold/Gemittanius.svg
new file mode 100644
index 0000000..283ff73
--- /dev/null
+++ b/public/assets/signs/Gold/Gemittanius.svg
@@ -0,0 +1,64 @@
+
+
+
+
+ Gemittanius
+
+
+
+
+
+ image/svg+xml
+
+ Gemittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemittarius.svg b/public/assets/signs/Gold/Gemittarius.svg
new file mode 100644
index 0000000..57de6b4
--- /dev/null
+++ b/public/assets/signs/Gold/Gemittarius.svg
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemlo.svg b/public/assets/signs/Gold/Gemlo.svg
new file mode 100644
index 0000000..a554b01
--- /dev/null
+++ b/public/assets/signs/Gold/Gemlo.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemnius.svg b/public/assets/signs/Gold/Gemnius.svg
new file mode 100644
index 0000000..0204ee6
--- /dev/null
+++ b/public/assets/signs/Gold/Gemnius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemnius
+
+
+
+
+
+ image/svg+xml
+
+ Gemnius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemo.svg b/public/assets/signs/Gold/Gemo.svg
new file mode 100644
index 0000000..28ce145
--- /dev/null
+++ b/public/assets/signs/Gold/Gemo.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemo
+
+
+
+
+
+ image/svg+xml
+
+ Gemo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gempia.svg b/public/assets/signs/Gold/Gempia.svg
new file mode 100644
index 0000000..68fc681
--- /dev/null
+++ b/public/assets/signs/Gold/Gempia.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gempia
+
+
+
+
+
+ image/svg+xml
+
+ Gempia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gempio.svg b/public/assets/signs/Gold/Gempio.svg
new file mode 100644
index 0000000..7ba6f11
--- /dev/null
+++ b/public/assets/signs/Gold/Gempio.svg
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemra.svg b/public/assets/signs/Gold/Gemra.svg
new file mode 100644
index 0000000..da65abf
--- /dev/null
+++ b/public/assets/signs/Gold/Gemra.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemra
+
+
+
+
+
+ image/svg+xml
+
+ Gemra
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemries.svg b/public/assets/signs/Gold/Gemries.svg
new file mode 100644
index 0000000..ff81eec
--- /dev/null
+++ b/public/assets/signs/Gold/Gemries.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Gemries
+
+
+
+
+
+ image/svg+xml
+
+ Gemries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemrist.svg b/public/assets/signs/Gold/Gemrist.svg
new file mode 100644
index 0000000..e61a3eb
--- /dev/null
+++ b/public/assets/signs/Gold/Gemrist.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemrist
+
+
+
+
+
+ image/svg+xml
+
+ Gemrist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemrius.svg b/public/assets/signs/Gold/Gemrius.svg
new file mode 100644
index 0000000..995ed16
--- /dev/null
+++ b/public/assets/signs/Gold/Gemrius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemrius
+
+
+
+
+
+ image/svg+xml
+
+ Gemrius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemsces.svg b/public/assets/signs/Gold/Gemsces.svg
new file mode 100644
index 0000000..baeb277
--- /dev/null
+++ b/public/assets/signs/Gold/Gemsces.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Gemsces
+
+
+
+
+
+ image/svg+xml
+
+ Gemsces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemsci.svg b/public/assets/signs/Gold/Gemsci.svg
new file mode 100644
index 0000000..ecaffef
--- /dev/null
+++ b/public/assets/signs/Gold/Gemsci.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemsci
+
+
+
+
+
+ image/svg+xml
+
+ Gemsci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemun.svg b/public/assets/signs/Gold/Gemun.svg
new file mode 100644
index 0000000..cce2455
--- /dev/null
+++ b/public/assets/signs/Gold/Gemun.svg
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemus.svg b/public/assets/signs/Gold/Gemus.svg
new file mode 100644
index 0000000..85b7776
--- /dev/null
+++ b/public/assets/signs/Gold/Gemus.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemus
+
+
+
+
+
+ image/svg+xml
+
+ Gemus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Gold/Gemza.svg b/public/assets/signs/Gold/Gemza.svg
new file mode 100644
index 0000000..cd6751d
--- /dev/null
+++ b/public/assets/signs/Gold/Gemza.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Gemza
+
+
+
+
+
+ image/svg+xml
+
+ Gemza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagiborn.svg b/public/assets/signs/Indigo/Sagiborn.svg
new file mode 100644
index 0000000..04c05d5
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagiborn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagiborn
+
+
+
+
+
+ image/svg+xml
+
+ Sagiborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagicen.svg b/public/assets/signs/Indigo/Sagicen.svg
new file mode 100644
index 0000000..811bbad
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagicen.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagicen
+
+
+
+
+
+ image/svg+xml
+
+ Sagicen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagicer.svg b/public/assets/signs/Indigo/Sagicer.svg
new file mode 100644
index 0000000..ac2545c
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagicer.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagicer
+
+
+
+
+
+ image/svg+xml
+
+ Sagicer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagicorn.svg b/public/assets/signs/Indigo/Sagicorn.svg
new file mode 100644
index 0000000..13b0ce6
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagicorn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagicorn
+
+
+
+
+
+ image/svg+xml
+
+ Sagicorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagiga.svg b/public/assets/signs/Indigo/Sagiga.svg
new file mode 100644
index 0000000..52062a9
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagiga.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagiga
+
+
+
+
+
+ image/svg+xml
+
+ Sagiga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagigo.svg b/public/assets/signs/Indigo/Sagigo.svg
new file mode 100644
index 0000000..396f98f
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagigo.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagigo
+
+
+
+
+
+ image/svg+xml
+
+ Sagigo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagilo.svg b/public/assets/signs/Indigo/Sagilo.svg
new file mode 100644
index 0000000..b8b690c
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagilo.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagilo
+
+
+
+
+
+ image/svg+xml
+
+ Sagilo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagimini.svg b/public/assets/signs/Indigo/Sagimini.svg
new file mode 100644
index 0000000..143c613
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagimini.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagimini
+
+
+
+
+
+ image/svg+xml
+
+ Sagimini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagimino.svg b/public/assets/signs/Indigo/Sagimino.svg
new file mode 100644
index 0000000..decd46e
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagimino.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagimino
+
+
+
+
+
+ image/svg+xml
+
+ Sagimino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Saginius.svg b/public/assets/signs/Indigo/Saginius.svg
new file mode 100644
index 0000000..1fdde73
--- /dev/null
+++ b/public/assets/signs/Indigo/Saginius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Saginius
+
+
+
+
+
+ image/svg+xml
+
+ Saginius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagio.svg b/public/assets/signs/Indigo/Sagio.svg
new file mode 100644
index 0000000..f41a144
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagio.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagio
+
+
+
+
+
+ image/svg+xml
+
+ Sagio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagipia.svg b/public/assets/signs/Indigo/Sagipia.svg
new file mode 100644
index 0000000..94438f4
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagipia.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagipia
+
+
+
+
+
+ image/svg+xml
+
+ Sagipia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagipio.svg b/public/assets/signs/Indigo/Sagipio.svg
new file mode 100644
index 0000000..ccdafa4
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagipio.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagipio
+
+
+
+
+
+ image/svg+xml
+
+ Sagipio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagira.svg b/public/assets/signs/Indigo/Sagira.svg
new file mode 100644
index 0000000..ddfaf8d
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagira.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagira
+
+
+
+
+
+ image/svg+xml
+
+ Sagira
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagiries.svg b/public/assets/signs/Indigo/Sagiries.svg
new file mode 100644
index 0000000..7ced6c4
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagiries.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagiries
+
+
+
+
+
+ image/svg+xml
+
+ Sagiries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagirist.svg b/public/assets/signs/Indigo/Sagirist.svg
new file mode 100644
index 0000000..46589d9
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagirist.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagirist
+
+
+
+
+
+ image/svg+xml
+
+ Sagirist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagirius.svg b/public/assets/signs/Indigo/Sagirius.svg
new file mode 100644
index 0000000..f8ab60f
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagirius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagirius
+
+
+
+
+
+ image/svg+xml
+
+ Sagirius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagisces.svg b/public/assets/signs/Indigo/Sagisces.svg
new file mode 100644
index 0000000..1cbb2a1
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagisces.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagisces
+
+
+
+
+
+ image/svg+xml
+
+ Sagisces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagisci.svg b/public/assets/signs/Indigo/Sagisci.svg
new file mode 100644
index 0000000..8e96cf6
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagisci.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagisci
+
+
+
+
+
+ image/svg+xml
+
+ Sagisci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagittanius.svg b/public/assets/signs/Indigo/Sagittanius.svg
new file mode 100644
index 0000000..24b2fc8
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagittanius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagittanius
+
+
+
+
+
+ image/svg+xml
+
+ Sagittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagittarius.svg b/public/assets/signs/Indigo/Sagittarius.svg
new file mode 100644
index 0000000..536fae2
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagittarius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagittarius
+
+
+
+
+
+ image/svg+xml
+
+ Sagittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagiun.svg b/public/assets/signs/Indigo/Sagiun.svg
new file mode 100644
index 0000000..f77f6ae
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagiun.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagiun
+
+
+
+
+
+ image/svg+xml
+
+ Sagiun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagius.svg b/public/assets/signs/Indigo/Sagius.svg
new file mode 100644
index 0000000..c4f1514
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Sagius
+
+
+
+
+
+ image/svg+xml
+
+ Sagius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Indigo/Sagiza.svg b/public/assets/signs/Indigo/Sagiza.svg
new file mode 100644
index 0000000..bb70211
--- /dev/null
+++ b/public/assets/signs/Indigo/Sagiza.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Sagiza
+
+
+
+
+
+ image/svg+xml
+
+ Sagiza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Vircen.svg b/public/assets/signs/Jade/Vircen.svg
new file mode 100644
index 0000000..7bf02eb
--- /dev/null
+++ b/public/assets/signs/Jade/Vircen.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Vircen
+
+
+
+
+
+ image/svg+xml
+
+ Vircen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Vircer.svg b/public/assets/signs/Jade/Vircer.svg
new file mode 100644
index 0000000..f9e349f
--- /dev/null
+++ b/public/assets/signs/Jade/Vircer.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Vircer
+
+
+
+
+
+ image/svg+xml
+
+ Vircer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virga.svg b/public/assets/signs/Jade/Virga.svg
new file mode 100644
index 0000000..b696659
--- /dev/null
+++ b/public/assets/signs/Jade/Virga.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virga
+
+
+
+
+
+ image/svg+xml
+
+ Virga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virgo.svg b/public/assets/signs/Jade/Virgo.svg
new file mode 100644
index 0000000..e0b0b4d
--- /dev/null
+++ b/public/assets/signs/Jade/Virgo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virgo
+
+
+
+
+
+ image/svg+xml
+
+ Virgo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Viriborn.svg b/public/assets/signs/Jade/Viriborn.svg
new file mode 100644
index 0000000..723bf47
--- /dev/null
+++ b/public/assets/signs/Jade/Viriborn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Viriborn
+
+
+
+
+
+ image/svg+xml
+
+ Viriborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Viricorn.svg b/public/assets/signs/Jade/Viricorn.svg
new file mode 100644
index 0000000..22abe9c
--- /dev/null
+++ b/public/assets/signs/Jade/Viricorn.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Viricorn
+
+
+
+
+
+ image/svg+xml
+
+ Viricorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Viries.svg b/public/assets/signs/Jade/Viries.svg
new file mode 100644
index 0000000..a8e6347
--- /dev/null
+++ b/public/assets/signs/Jade/Viries.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Viries
+
+
+
+
+
+ image/svg+xml
+
+ Viries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virist.svg b/public/assets/signs/Jade/Virist.svg
new file mode 100644
index 0000000..8d561c9
--- /dev/null
+++ b/public/assets/signs/Jade/Virist.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virist
+
+
+
+
+
+ image/svg+xml
+
+ Virist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virittanius.svg b/public/assets/signs/Jade/Virittanius.svg
new file mode 100644
index 0000000..36316f9
--- /dev/null
+++ b/public/assets/signs/Jade/Virittanius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Virittanius
+
+
+
+
+
+ image/svg+xml
+
+ Virittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virittarius.svg b/public/assets/signs/Jade/Virittarius.svg
new file mode 100644
index 0000000..1e0b162
--- /dev/null
+++ b/public/assets/signs/Jade/Virittarius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Virittarius
+
+
+
+
+
+ image/svg+xml
+
+ Virittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virlo.svg b/public/assets/signs/Jade/Virlo.svg
new file mode 100644
index 0000000..5a16ea0
--- /dev/null
+++ b/public/assets/signs/Jade/Virlo.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Virlo
+
+
+
+
+
+ image/svg+xml
+
+ Virlo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virmini.svg b/public/assets/signs/Jade/Virmini.svg
new file mode 100644
index 0000000..49d8b1d
--- /dev/null
+++ b/public/assets/signs/Jade/Virmini.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virmini
+
+
+
+
+
+ image/svg+xml
+
+ Virmini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virmino.svg b/public/assets/signs/Jade/Virmino.svg
new file mode 100644
index 0000000..88e28ec
--- /dev/null
+++ b/public/assets/signs/Jade/Virmino.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Virmino
+
+
+
+
+
+ image/svg+xml
+
+ Virmino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virnius.svg b/public/assets/signs/Jade/Virnius.svg
new file mode 100644
index 0000000..c0f2eca
--- /dev/null
+++ b/public/assets/signs/Jade/Virnius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virnius
+
+
+
+
+
+ image/svg+xml
+
+ Virnius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Viro.svg b/public/assets/signs/Jade/Viro.svg
new file mode 100644
index 0000000..67bc3ae
--- /dev/null
+++ b/public/assets/signs/Jade/Viro.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Viro
+
+
+
+
+
+ image/svg+xml
+
+ Viro
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virpia.svg b/public/assets/signs/Jade/Virpia.svg
new file mode 100644
index 0000000..8b52f27
--- /dev/null
+++ b/public/assets/signs/Jade/Virpia.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Virpia
+
+
+
+
+
+ image/svg+xml
+
+ Virpia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virpio.svg b/public/assets/signs/Jade/Virpio.svg
new file mode 100644
index 0000000..ebfff37
--- /dev/null
+++ b/public/assets/signs/Jade/Virpio.svg
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virra.svg b/public/assets/signs/Jade/Virra.svg
new file mode 100644
index 0000000..934579a
--- /dev/null
+++ b/public/assets/signs/Jade/Virra.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Virra
+
+
+
+
+
+ image/svg+xml
+
+ Virra
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virrius.svg b/public/assets/signs/Jade/Virrius.svg
new file mode 100644
index 0000000..08cad9e
--- /dev/null
+++ b/public/assets/signs/Jade/Virrius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virrius
+
+
+
+
+
+ image/svg+xml
+
+ Virrius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virsces.svg b/public/assets/signs/Jade/Virsces.svg
new file mode 100644
index 0000000..d86a228
--- /dev/null
+++ b/public/assets/signs/Jade/Virsces.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virsces
+
+
+
+
+
+ image/svg+xml
+
+ Virsces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virsci.svg b/public/assets/signs/Jade/Virsci.svg
new file mode 100644
index 0000000..de5c310
--- /dev/null
+++ b/public/assets/signs/Jade/Virsci.svg
@@ -0,0 +1,69 @@
+
+
+
+
+ Virsci
+
+
+
+
+
+ image/svg+xml
+
+ Virsci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virun.svg b/public/assets/signs/Jade/Virun.svg
new file mode 100644
index 0000000..0e67626
--- /dev/null
+++ b/public/assets/signs/Jade/Virun.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virun
+
+
+
+
+
+ image/svg+xml
+
+ Virun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virus.svg b/public/assets/signs/Jade/Virus.svg
new file mode 100644
index 0000000..3407914
--- /dev/null
+++ b/public/assets/signs/Jade/Virus.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virus
+
+
+
+
+
+ image/svg+xml
+
+ Virus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Jade/Virza.svg b/public/assets/signs/Jade/Virza.svg
new file mode 100644
index 0000000..57c223b
--- /dev/null
+++ b/public/assets/signs/Jade/Virza.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Virza
+
+
+
+
+
+ image/svg+xml
+
+ Virza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Camini.svg b/public/assets/signs/Lime/Camini.svg
new file mode 100644
index 0000000..d3929d7
--- /dev/null
+++ b/public/assets/signs/Lime/Camini.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Camini
+
+
+
+
+
+ image/svg+xml
+
+ Camini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Camino.svg b/public/assets/signs/Lime/Camino.svg
new file mode 100644
index 0000000..7f995a8
--- /dev/null
+++ b/public/assets/signs/Lime/Camino.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Camino
+
+
+
+
+
+ image/svg+xml
+
+ Camino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Cancen.svg b/public/assets/signs/Lime/Cancen.svg
new file mode 100644
index 0000000..1e22cc7
--- /dev/null
+++ b/public/assets/signs/Lime/Cancen.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Cancen
+
+
+
+
+
+ image/svg+xml
+
+ Cancen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Cancer.svg b/public/assets/signs/Lime/Cancer.svg
new file mode 100644
index 0000000..639c44e
--- /dev/null
+++ b/public/assets/signs/Lime/Cancer.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Cancer
+
+
+
+
+
+ image/svg+xml
+
+ Cancer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canga.svg b/public/assets/signs/Lime/Canga.svg
new file mode 100644
index 0000000..bcad8d0
--- /dev/null
+++ b/public/assets/signs/Lime/Canga.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Canga
+
+
+
+
+
+ image/svg+xml
+
+ Canga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Cango.svg b/public/assets/signs/Lime/Cango.svg
new file mode 100644
index 0000000..7a472a6
--- /dev/null
+++ b/public/assets/signs/Lime/Cango.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Cango
+
+
+
+
+
+ image/svg+xml
+
+ Cango
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Caniborn.svg b/public/assets/signs/Lime/Caniborn.svg
new file mode 100644
index 0000000..e4928e3
--- /dev/null
+++ b/public/assets/signs/Lime/Caniborn.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Caniborn
+
+
+
+
+
+ image/svg+xml
+
+ Caniborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canicorn.svg b/public/assets/signs/Lime/Canicorn.svg
new file mode 100644
index 0000000..5121c51
--- /dev/null
+++ b/public/assets/signs/Lime/Canicorn.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canicorn
+
+
+
+
+
+ image/svg+xml
+
+ Canicorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canittanius.svg b/public/assets/signs/Lime/Canittanius.svg
new file mode 100644
index 0000000..407c4d3
--- /dev/null
+++ b/public/assets/signs/Lime/Canittanius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canittanius
+
+
+
+
+
+ image/svg+xml
+
+ Canittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canittarius.svg b/public/assets/signs/Lime/Canittarius.svg
new file mode 100644
index 0000000..d8a22b2
--- /dev/null
+++ b/public/assets/signs/Lime/Canittarius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canittarius
+
+
+
+
+
+ image/svg+xml
+
+ Canittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canlo.svg b/public/assets/signs/Lime/Canlo.svg
new file mode 100644
index 0000000..43a86f5
--- /dev/null
+++ b/public/assets/signs/Lime/Canlo.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Canlo
+
+
+
+
+
+ image/svg+xml
+
+ Canlo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Cannus.svg b/public/assets/signs/Lime/Cannus.svg
new file mode 100644
index 0000000..de65c32
--- /dev/null
+++ b/public/assets/signs/Lime/Cannus.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Cannus
+
+
+
+
+
+ image/svg+xml
+
+ Cannus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Cano.svg b/public/assets/signs/Lime/Cano.svg
new file mode 100644
index 0000000..525e496
--- /dev/null
+++ b/public/assets/signs/Lime/Cano.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Cano
+
+
+
+
+
+ image/svg+xml
+
+ Cano
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canpia.svg b/public/assets/signs/Lime/Canpia.svg
new file mode 100644
index 0000000..4951384
--- /dev/null
+++ b/public/assets/signs/Lime/Canpia.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Canpia
+
+
+
+
+
+ image/svg+xml
+
+ Canpia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canpio.svg b/public/assets/signs/Lime/Canpio.svg
new file mode 100644
index 0000000..09512db
--- /dev/null
+++ b/public/assets/signs/Lime/Canpio.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canpio
+
+
+
+
+
+ image/svg+xml
+
+ Canpio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canra.svg b/public/assets/signs/Lime/Canra.svg
new file mode 100644
index 0000000..83e5c39
--- /dev/null
+++ b/public/assets/signs/Lime/Canra.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canra
+
+
+
+
+
+ image/svg+xml
+
+ Canra
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canries.svg b/public/assets/signs/Lime/Canries.svg
new file mode 100644
index 0000000..99f7acb
--- /dev/null
+++ b/public/assets/signs/Lime/Canries.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Canries
+
+
+
+
+
+ image/svg+xml
+
+ Canries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canrist.svg b/public/assets/signs/Lime/Canrist.svg
new file mode 100644
index 0000000..b0fdad7
--- /dev/null
+++ b/public/assets/signs/Lime/Canrist.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canrist
+
+
+
+
+
+ image/svg+xml
+
+ Canrist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canrius.svg b/public/assets/signs/Lime/Canrius.svg
new file mode 100644
index 0000000..efbefa7
--- /dev/null
+++ b/public/assets/signs/Lime/Canrius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canrius
+
+
+
+
+
+ image/svg+xml
+
+ Canrius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Cansces.svg b/public/assets/signs/Lime/Cansces.svg
new file mode 100644
index 0000000..a48bf9c
--- /dev/null
+++ b/public/assets/signs/Lime/Cansces.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Cansces
+
+
+
+
+
+ image/svg+xml
+
+ Cansces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Cansci.svg b/public/assets/signs/Lime/Cansci.svg
new file mode 100644
index 0000000..2b44ca3
--- /dev/null
+++ b/public/assets/signs/Lime/Cansci.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Cansci
+
+
+
+
+
+ image/svg+xml
+
+ Cansci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canun.svg b/public/assets/signs/Lime/Canun.svg
new file mode 100644
index 0000000..d24e64c
--- /dev/null
+++ b/public/assets/signs/Lime/Canun.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canun
+
+
+
+
+
+ image/svg+xml
+
+ Canun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canus.svg b/public/assets/signs/Lime/Canus.svg
new file mode 100644
index 0000000..7d8e57c
--- /dev/null
+++ b/public/assets/signs/Lime/Canus.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Canus
+
+
+
+
+
+ image/svg+xml
+
+ Canus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Lime/Canza.svg b/public/assets/signs/Lime/Canza.svg
new file mode 100644
index 0000000..06e3829
--- /dev/null
+++ b/public/assets/signs/Lime/Canza.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Canza
+
+
+
+
+
+ image/svg+xml
+
+ Canza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lecen.svg b/public/assets/signs/Olive/Lecen.svg
new file mode 100644
index 0000000..4a5e4e0
--- /dev/null
+++ b/public/assets/signs/Olive/Lecen.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Lecen
+
+
+
+
+
+ image/svg+xml
+
+ Lecen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lecer.svg b/public/assets/signs/Olive/Lecer.svg
new file mode 100644
index 0000000..26d5910
--- /dev/null
+++ b/public/assets/signs/Olive/Lecer.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Lecer
+
+
+
+
+
+ image/svg+xml
+
+ Lecer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lega.svg b/public/assets/signs/Olive/Lega.svg
new file mode 100644
index 0000000..1cb2308
--- /dev/null
+++ b/public/assets/signs/Olive/Lega.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Lega
+
+
+
+
+
+ image/svg+xml
+
+ Lega
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lego.svg b/public/assets/signs/Olive/Lego.svg
new file mode 100644
index 0000000..ad8177c
--- /dev/null
+++ b/public/assets/signs/Olive/Lego.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Lego
+
+
+
+
+
+ image/svg+xml
+
+ Lego
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leiborn.svg b/public/assets/signs/Olive/Leiborn.svg
new file mode 100644
index 0000000..1591cb3
--- /dev/null
+++ b/public/assets/signs/Olive/Leiborn.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Leiborn
+
+
+
+
+
+ image/svg+xml
+
+ Leiborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leicorn.svg b/public/assets/signs/Olive/Leicorn.svg
new file mode 100644
index 0000000..ec80e3b
--- /dev/null
+++ b/public/assets/signs/Olive/Leicorn.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Leicorn
+
+
+
+
+
+ image/svg+xml
+
+ Leicorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leittanius.svg b/public/assets/signs/Olive/Leittanius.svg
new file mode 100644
index 0000000..ef2ab91
--- /dev/null
+++ b/public/assets/signs/Olive/Leittanius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Leittanius
+
+
+
+
+
+ image/svg+xml
+
+ Leittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leittarius.svg b/public/assets/signs/Olive/Leittarius.svg
new file mode 100644
index 0000000..5f86047
--- /dev/null
+++ b/public/assets/signs/Olive/Leittarius.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Leittarius
+
+
+
+
+
+ image/svg+xml
+
+ Leittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lelo.svg b/public/assets/signs/Olive/Lelo.svg
new file mode 100644
index 0000000..ce560f0
--- /dev/null
+++ b/public/assets/signs/Olive/Lelo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Lelo
+
+
+
+
+
+ image/svg+xml
+
+ Lelo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lemini.svg b/public/assets/signs/Olive/Lemini.svg
new file mode 100644
index 0000000..5e83589
--- /dev/null
+++ b/public/assets/signs/Olive/Lemini.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Lemini
+
+
+
+
+
+ image/svg+xml
+
+ Lemini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lemino.svg b/public/assets/signs/Olive/Lemino.svg
new file mode 100644
index 0000000..22b617a
--- /dev/null
+++ b/public/assets/signs/Olive/Lemino.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Lemino
+
+
+
+
+
+ image/svg+xml
+
+ Lemino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lenius.svg b/public/assets/signs/Olive/Lenius.svg
new file mode 100644
index 0000000..6a8bcb9
--- /dev/null
+++ b/public/assets/signs/Olive/Lenius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Lenius
+
+
+
+
+
+ image/svg+xml
+
+ Lenius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leo.svg b/public/assets/signs/Olive/Leo.svg
new file mode 100644
index 0000000..fffe80b
--- /dev/null
+++ b/public/assets/signs/Olive/Leo.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Leo
+
+
+
+
+
+ image/svg+xml
+
+ Leo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lepia.svg b/public/assets/signs/Olive/Lepia.svg
new file mode 100644
index 0000000..9005ae9
--- /dev/null
+++ b/public/assets/signs/Olive/Lepia.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Lepia
+
+
+
+
+
+ image/svg+xml
+
+ Lepia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lepio.svg b/public/assets/signs/Olive/Lepio.svg
new file mode 100644
index 0000000..1103ad0
--- /dev/null
+++ b/public/assets/signs/Olive/Lepio.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Lepio
+
+
+
+
+
+ image/svg+xml
+
+ Lepio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lera.svg b/public/assets/signs/Olive/Lera.svg
new file mode 100644
index 0000000..4d27080
--- /dev/null
+++ b/public/assets/signs/Olive/Lera.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Lera
+
+
+
+
+
+ image/svg+xml
+
+ Lera
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leries.svg b/public/assets/signs/Olive/Leries.svg
new file mode 100644
index 0000000..5755708
--- /dev/null
+++ b/public/assets/signs/Olive/Leries.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Leries
+
+
+
+
+
+ image/svg+xml
+
+ Leries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lerist.svg b/public/assets/signs/Olive/Lerist.svg
new file mode 100644
index 0000000..326439b
--- /dev/null
+++ b/public/assets/signs/Olive/Lerist.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Lerist
+
+
+
+
+
+ image/svg+xml
+
+ Lerist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lerius.svg b/public/assets/signs/Olive/Lerius.svg
new file mode 100644
index 0000000..7b44ac0
--- /dev/null
+++ b/public/assets/signs/Olive/Lerius.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Lerius
+
+
+
+
+
+ image/svg+xml
+
+ Lerius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lesces.svg b/public/assets/signs/Olive/Lesces.svg
new file mode 100644
index 0000000..c8b7319
--- /dev/null
+++ b/public/assets/signs/Olive/Lesces.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Lesces
+
+
+
+
+
+ image/svg+xml
+
+ Lesces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Lesci.svg b/public/assets/signs/Olive/Lesci.svg
new file mode 100644
index 0000000..ad56f12
--- /dev/null
+++ b/public/assets/signs/Olive/Lesci.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Lesci
+
+
+
+
+
+ image/svg+xml
+
+ Lesci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leun.svg b/public/assets/signs/Olive/Leun.svg
new file mode 100644
index 0000000..d986a0e
--- /dev/null
+++ b/public/assets/signs/Olive/Leun.svg
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leus.svg b/public/assets/signs/Olive/Leus.svg
new file mode 100644
index 0000000..f45aac4
--- /dev/null
+++ b/public/assets/signs/Olive/Leus.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Leus
+
+
+
+
+
+ image/svg+xml
+
+ Leus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Olive/Leza.svg b/public/assets/signs/Olive/Leza.svg
new file mode 100644
index 0000000..3c2f7ed
--- /dev/null
+++ b/public/assets/signs/Olive/Leza.svg
@@ -0,0 +1,63 @@
+
+
+
+
+ Leza
+
+
+
+
+
+ image/svg+xml
+
+ Leza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capriborn.svg b/public/assets/signs/Purple/Capriborn.svg
new file mode 100644
index 0000000..d06c8a1
--- /dev/null
+++ b/public/assets/signs/Purple/Capriborn.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Capriborn
+
+
+
+
+
+ image/svg+xml
+
+ Capriborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capricen.svg b/public/assets/signs/Purple/Capricen.svg
new file mode 100644
index 0000000..54d8137
--- /dev/null
+++ b/public/assets/signs/Purple/Capricen.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Capricen
+
+
+
+
+
+ image/svg+xml
+
+ Capricen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capricer.svg b/public/assets/signs/Purple/Capricer.svg
new file mode 100644
index 0000000..ce73504
--- /dev/null
+++ b/public/assets/signs/Purple/Capricer.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Capricer
+
+
+
+
+
+ image/svg+xml
+
+ Capricer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capricorn.svg b/public/assets/signs/Purple/Capricorn.svg
new file mode 100644
index 0000000..8fe7d70
--- /dev/null
+++ b/public/assets/signs/Purple/Capricorn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Capricorn
+
+
+
+
+
+ image/svg+xml
+
+ Capricorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capries.svg b/public/assets/signs/Purple/Capries.svg
new file mode 100644
index 0000000..d0ca5ad
--- /dev/null
+++ b/public/assets/signs/Purple/Capries.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Capries
+
+
+
+
+
+ image/svg+xml
+
+ Capries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capriga.svg b/public/assets/signs/Purple/Capriga.svg
new file mode 100644
index 0000000..f807715
--- /dev/null
+++ b/public/assets/signs/Purple/Capriga.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Capriga
+
+
+
+
+
+ image/svg+xml
+
+ Capriga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprigo.svg b/public/assets/signs/Purple/Caprigo.svg
new file mode 100644
index 0000000..f52d4c1
--- /dev/null
+++ b/public/assets/signs/Purple/Caprigo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Caprigo
+
+
+
+
+
+ image/svg+xml
+
+ Caprigo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprilo.svg b/public/assets/signs/Purple/Caprilo.svg
new file mode 100644
index 0000000..3d12573
--- /dev/null
+++ b/public/assets/signs/Purple/Caprilo.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Caprilo
+
+
+
+
+
+ image/svg+xml
+
+ Caprilo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprimini.svg b/public/assets/signs/Purple/Caprimini.svg
new file mode 100644
index 0000000..0ba69d2
--- /dev/null
+++ b/public/assets/signs/Purple/Caprimini.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Caprimini
+
+
+
+
+
+ image/svg+xml
+
+ Caprimini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprimino.svg b/public/assets/signs/Purple/Caprimino.svg
new file mode 100644
index 0000000..919a163
--- /dev/null
+++ b/public/assets/signs/Purple/Caprimino.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Caprimino
+
+
+
+
+
+ image/svg+xml
+
+ Caprimino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprinius.svg b/public/assets/signs/Purple/Caprinius.svg
new file mode 100644
index 0000000..cac5915
--- /dev/null
+++ b/public/assets/signs/Purple/Caprinius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Caprinius
+
+
+
+
+
+ image/svg+xml
+
+ Caprinius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprio.svg b/public/assets/signs/Purple/Caprio.svg
new file mode 100644
index 0000000..1e27bb2
--- /dev/null
+++ b/public/assets/signs/Purple/Caprio.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Caprio
+
+
+
+
+
+ image/svg+xml
+
+ Caprio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capripia.svg b/public/assets/signs/Purple/Capripia.svg
new file mode 100644
index 0000000..4584b38
--- /dev/null
+++ b/public/assets/signs/Purple/Capripia.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Capripia
+
+
+
+
+
+ image/svg+xml
+
+ Capripia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capripio.svg b/public/assets/signs/Purple/Capripio.svg
new file mode 100644
index 0000000..536d4b7
--- /dev/null
+++ b/public/assets/signs/Purple/Capripio.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Capripio
+
+
+
+
+
+ image/svg+xml
+
+ Capripio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprira.svg b/public/assets/signs/Purple/Caprira.svg
new file mode 100644
index 0000000..95b1b72
--- /dev/null
+++ b/public/assets/signs/Purple/Caprira.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Caprira
+
+
+
+
+
+ image/svg+xml
+
+ Caprira
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capririus.svg b/public/assets/signs/Purple/Capririus.svg
new file mode 100644
index 0000000..82e0bcb
--- /dev/null
+++ b/public/assets/signs/Purple/Capririus.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Capririus
+
+
+
+
+
+ image/svg+xml
+
+ Capririus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprisces.svg b/public/assets/signs/Purple/Caprisces.svg
new file mode 100644
index 0000000..332d474
--- /dev/null
+++ b/public/assets/signs/Purple/Caprisces.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Caprisces
+
+
+
+
+
+ image/svg+xml
+
+ Caprisces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprisci.svg b/public/assets/signs/Purple/Caprisci.svg
new file mode 100644
index 0000000..6732797
--- /dev/null
+++ b/public/assets/signs/Purple/Caprisci.svg
@@ -0,0 +1,68 @@
+
+
+
+
+ Caprisci
+
+
+
+
+
+ image/svg+xml
+
+ Caprisci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprist.svg b/public/assets/signs/Purple/Caprist.svg
new file mode 100644
index 0000000..788e0f2
--- /dev/null
+++ b/public/assets/signs/Purple/Caprist.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Caprist
+
+
+
+
+
+ image/svg+xml
+
+ Caprist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprittanius.svg b/public/assets/signs/Purple/Caprittanius.svg
new file mode 100644
index 0000000..f5e2224
--- /dev/null
+++ b/public/assets/signs/Purple/Caprittanius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Caprittanius
+
+
+
+
+
+ image/svg+xml
+
+ Caprittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprittarius.svg b/public/assets/signs/Purple/Caprittarius.svg
new file mode 100644
index 0000000..921be92
--- /dev/null
+++ b/public/assets/signs/Purple/Caprittarius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Caprittarius
+
+
+
+
+
+ image/svg+xml
+
+ Caprittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capriun.svg b/public/assets/signs/Purple/Capriun.svg
new file mode 100644
index 0000000..ba0ed10
--- /dev/null
+++ b/public/assets/signs/Purple/Capriun.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Capriun
+
+
+
+
+
+ image/svg+xml
+
+ Capriun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Caprius.svg b/public/assets/signs/Purple/Caprius.svg
new file mode 100644
index 0000000..985e644
--- /dev/null
+++ b/public/assets/signs/Purple/Caprius.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Caprius
+
+
+
+
+
+ image/svg+xml
+
+ Caprius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Purple/Capriza.svg b/public/assets/signs/Purple/Capriza.svg
new file mode 100644
index 0000000..32ad58e
--- /dev/null
+++ b/public/assets/signs/Purple/Capriza.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Capriza
+
+
+
+
+
+ image/svg+xml
+
+ Capriza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/README.md b/public/assets/signs/README.md
new file mode 100644
index 0000000..62fb4a2
--- /dev/null
+++ b/public/assets/signs/README.md
@@ -0,0 +1,11 @@
+# ExtendedSigns
+
+_Extended Zodiac_ SVGs provided by DeviantArt user [Ylimegirl](https://www.deviantart.com/ylimegirl/gallery).
+
+https://www.deviantart.com/ylimegirl/art/Extended-Zodiac-Vectors-All-signs-721467417
+
+> 288 vectors in two weeks! About 20.6 signs a day. Someone better use these. Happy Christmas, Hannukah, Kwanzaa, New Years Day, Festivus, 12th Perigree's Eve, etc etc.
+>
+> These are free for you to use for whatever you wish, credit and/or large amounts of money are appreciated but not necessary.
+
+The Extended Zodiac and _Homestuck_ © What Pumpkin Games Inc., Homestuck, and VIZ Media.
diff --git a/public/assets/signs/Rust/Arcen.svg b/public/assets/signs/Rust/Arcen.svg
new file mode 100644
index 0000000..6e248ee
--- /dev/null
+++ b/public/assets/signs/Rust/Arcen.svg
@@ -0,0 +1,70 @@
+
+
+
+
+ Arcen
+
+
+
+
+
+ image/svg+xml
+
+ Arcen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arcer.svg b/public/assets/signs/Rust/Arcer.svg
new file mode 100644
index 0000000..968366f
--- /dev/null
+++ b/public/assets/signs/Rust/Arcer.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arcer
+
+
+
+
+
+ image/svg+xml
+
+ Arcer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arga.svg b/public/assets/signs/Rust/Arga.svg
new file mode 100644
index 0000000..66d7550
--- /dev/null
+++ b/public/assets/signs/Rust/Arga.svg
@@ -0,0 +1,70 @@
+
+
+
+
+ Arga
+
+
+
+
+
+ image/svg+xml
+
+ Arga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Argo.svg b/public/assets/signs/Rust/Argo.svg
new file mode 100644
index 0000000..ccac8d5
--- /dev/null
+++ b/public/assets/signs/Rust/Argo.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Argo
+
+
+
+
+
+ image/svg+xml
+
+ Argo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Ariborn.svg b/public/assets/signs/Rust/Ariborn.svg
new file mode 100644
index 0000000..2e0222b
--- /dev/null
+++ b/public/assets/signs/Rust/Ariborn.svg
@@ -0,0 +1,70 @@
+
+
+
+
+ Ariborn
+
+
+
+
+
+ image/svg+xml
+
+ Ariborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Aricorn.svg b/public/assets/signs/Rust/Aricorn.svg
new file mode 100644
index 0000000..4afb02b
--- /dev/null
+++ b/public/assets/signs/Rust/Aricorn.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Aricorn
+
+
+
+
+
+ image/svg+xml
+
+ Aricorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Aries.svg b/public/assets/signs/Rust/Aries.svg
new file mode 100644
index 0000000..4ea85c3
--- /dev/null
+++ b/public/assets/signs/Rust/Aries.svg
@@ -0,0 +1,72 @@
+
+
+
+
+ Aries
+
+
+
+
+
+ image/svg+xml
+
+ Aries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arist.svg b/public/assets/signs/Rust/Arist.svg
new file mode 100644
index 0000000..2d45efe
--- /dev/null
+++ b/public/assets/signs/Rust/Arist.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arist
+
+
+
+
+
+ image/svg+xml
+
+ Arist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arittanius.svg b/public/assets/signs/Rust/Arittanius.svg
new file mode 100644
index 0000000..cd7283b
--- /dev/null
+++ b/public/assets/signs/Rust/Arittanius.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arittanius
+
+
+
+
+
+ image/svg+xml
+
+ Arittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arlo.svg b/public/assets/signs/Rust/Arlo.svg
new file mode 100644
index 0000000..dced82c
--- /dev/null
+++ b/public/assets/signs/Rust/Arlo.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arlo
+
+
+
+
+
+ image/svg+xml
+
+ Arlo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Armini.svg b/public/assets/signs/Rust/Armini.svg
new file mode 100644
index 0000000..9142050
--- /dev/null
+++ b/public/assets/signs/Rust/Armini.svg
@@ -0,0 +1,60 @@
+
+
+
+
+ Armini
+
+
+
+
+
+ image/svg+xml
+
+ Armini
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Armino.svg b/public/assets/signs/Rust/Armino.svg
new file mode 100644
index 0000000..f575e25
--- /dev/null
+++ b/public/assets/signs/Rust/Armino.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Armino
+
+
+
+
+
+ image/svg+xml
+
+ Armino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arnius.svg b/public/assets/signs/Rust/Arnius.svg
new file mode 100644
index 0000000..26526b9
--- /dev/null
+++ b/public/assets/signs/Rust/Arnius.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arnius
+
+
+
+
+
+ image/svg+xml
+
+ Arnius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Aro.svg b/public/assets/signs/Rust/Aro.svg
new file mode 100644
index 0000000..c458f7d
--- /dev/null
+++ b/public/assets/signs/Rust/Aro.svg
@@ -0,0 +1,70 @@
+
+
+
+
+ Aro
+
+
+
+
+
+ image/svg+xml
+
+ Aro
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arpia.svg b/public/assets/signs/Rust/Arpia.svg
new file mode 100644
index 0000000..d92293e
--- /dev/null
+++ b/public/assets/signs/Rust/Arpia.svg
@@ -0,0 +1,69 @@
+
+
+
+
+ Arpia
+
+
+
+
+
+ image/svg+xml
+
+ Arpia
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arpio.svg b/public/assets/signs/Rust/Arpio.svg
new file mode 100644
index 0000000..6870693
--- /dev/null
+++ b/public/assets/signs/Rust/Arpio.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arpio
+
+
+
+
+
+ image/svg+xml
+
+ Arpio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arra.svg b/public/assets/signs/Rust/Arra.svg
new file mode 100644
index 0000000..ec4557f
--- /dev/null
+++ b/public/assets/signs/Rust/Arra.svg
@@ -0,0 +1,62 @@
+
+
+
+
+ Arra
+
+
+
+
+
+ image/svg+xml
+
+ Arra
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arritarius.svg b/public/assets/signs/Rust/Arritarius.svg
new file mode 100644
index 0000000..1c1597f
--- /dev/null
+++ b/public/assets/signs/Rust/Arritarius.svg
@@ -0,0 +1,70 @@
+
+
+
+
+ Arritarius
+
+
+
+
+
+ image/svg+xml
+
+ Arritarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arrius.svg b/public/assets/signs/Rust/Arrius.svg
new file mode 100644
index 0000000..bb942ac
--- /dev/null
+++ b/public/assets/signs/Rust/Arrius.svg
@@ -0,0 +1,78 @@
+
+
+
+
+ Arrius
+
+
+
+
+
+
+
+ image/svg+xml
+
+ Arrius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arsces.svg b/public/assets/signs/Rust/Arsces.svg
new file mode 100644
index 0000000..32c8099
--- /dev/null
+++ b/public/assets/signs/Rust/Arsces.svg
@@ -0,0 +1,70 @@
+
+
+
+
+ Arsces
+
+
+
+
+
+ image/svg+xml
+
+ Arsces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arsci.svg b/public/assets/signs/Rust/Arsci.svg
new file mode 100644
index 0000000..7ba7f8e
--- /dev/null
+++ b/public/assets/signs/Rust/Arsci.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arsci
+
+
+
+
+
+ image/svg+xml
+
+ Arsci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arun.svg b/public/assets/signs/Rust/Arun.svg
new file mode 100644
index 0000000..5a99fe6
--- /dev/null
+++ b/public/assets/signs/Rust/Arun.svg
@@ -0,0 +1,60 @@
+
+
+
+
+ Arun
+
+
+
+
+
+ image/svg+xml
+
+ Arun
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arus.svg b/public/assets/signs/Rust/Arus.svg
new file mode 100644
index 0000000..45be72b
--- /dev/null
+++ b/public/assets/signs/Rust/Arus.svg
@@ -0,0 +1,61 @@
+
+
+
+
+ Arus
+
+
+
+
+
+ image/svg+xml
+
+ Arus
+
+
+
+
+
+
diff --git a/public/assets/signs/Rust/Arza.svg b/public/assets/signs/Rust/Arza.svg
new file mode 100644
index 0000000..abcdf95
--- /dev/null
+++ b/public/assets/signs/Rust/Arza.svg
@@ -0,0 +1,70 @@
+
+
+
+
+ Arza
+
+
+
+
+
+ image/svg+xml
+
+ Arza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libiborn.svg b/public/assets/signs/Teal/Libiborn.svg
new file mode 100644
index 0000000..70fa594
--- /dev/null
+++ b/public/assets/signs/Teal/Libiborn.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Libiborn
+
+
+
+
+
+ image/svg+xml
+
+ Libiborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libicorn.svg b/public/assets/signs/Teal/Libicorn.svg
new file mode 100644
index 0000000..7a07c72
--- /dev/null
+++ b/public/assets/signs/Teal/Libicorn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libicorn
+
+
+
+
+
+ image/svg+xml
+
+ Libicorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libittanius.svg b/public/assets/signs/Teal/Libittanius.svg
new file mode 100644
index 0000000..aa0dc5a
--- /dev/null
+++ b/public/assets/signs/Teal/Libittanius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libittanius
+
+
+
+
+
+ image/svg+xml
+
+ Libittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libittarius.svg b/public/assets/signs/Teal/Libittarius.svg
new file mode 100644
index 0000000..7b4551b
--- /dev/null
+++ b/public/assets/signs/Teal/Libittarius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libittarius
+
+
+
+
+
+ image/svg+xml
+
+ Libittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Liblo.svg b/public/assets/signs/Teal/Liblo.svg
new file mode 100644
index 0000000..02c8936
--- /dev/null
+++ b/public/assets/signs/Teal/Liblo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Liblo
+
+
+
+
+
+ image/svg+xml
+
+ Liblo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libnius.svg b/public/assets/signs/Teal/Libnius.svg
new file mode 100644
index 0000000..9e90242
--- /dev/null
+++ b/public/assets/signs/Teal/Libnius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libnius
+
+
+
+
+
+ image/svg+xml
+
+ Libnius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libo.svg b/public/assets/signs/Teal/Libo.svg
new file mode 100644
index 0000000..9f274f2
--- /dev/null
+++ b/public/assets/signs/Teal/Libo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libo
+
+
+
+
+
+ image/svg+xml
+
+ Libo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libra.svg b/public/assets/signs/Teal/Libra.svg
new file mode 100644
index 0000000..6511611
--- /dev/null
+++ b/public/assets/signs/Teal/Libra.svg
@@ -0,0 +1,68 @@
+
+
+
+
+ Libra
+
+
+
+
+
+ image/svg+xml
+
+ Libra
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libries.svg b/public/assets/signs/Teal/Libries.svg
new file mode 100644
index 0000000..e126fa1
--- /dev/null
+++ b/public/assets/signs/Teal/Libries.svg
@@ -0,0 +1,68 @@
+
+
+
+
+ Libries
+
+
+
+
+
+ image/svg+xml
+
+ Libries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Librist.svg b/public/assets/signs/Teal/Librist.svg
new file mode 100644
index 0000000..af8ddca
--- /dev/null
+++ b/public/assets/signs/Teal/Librist.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Librist
+
+
+
+
+
+ image/svg+xml
+
+ Librist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Librius.svg b/public/assets/signs/Teal/Librius.svg
new file mode 100644
index 0000000..cb9c4ac
--- /dev/null
+++ b/public/assets/signs/Teal/Librius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Librius
+
+
+
+
+
+ image/svg+xml
+
+ Librius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libsces.svg b/public/assets/signs/Teal/Libsces.svg
new file mode 100644
index 0000000..b74b74c
--- /dev/null
+++ b/public/assets/signs/Teal/Libsces.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libsces
+
+
+
+
+
+ image/svg+xml
+
+ Libsces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libsci.svg b/public/assets/signs/Teal/Libsci.svg
new file mode 100644
index 0000000..96f7f75
--- /dev/null
+++ b/public/assets/signs/Teal/Libsci.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libsci
+
+
+
+
+
+ image/svg+xml
+
+ Libsci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libun.svg b/public/assets/signs/Teal/Libun.svg
new file mode 100644
index 0000000..9783941
--- /dev/null
+++ b/public/assets/signs/Teal/Libun.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libun
+
+
+
+
+
+ image/svg+xml
+
+ Libun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libus.svg b/public/assets/signs/Teal/Libus.svg
new file mode 100644
index 0000000..2d38cbc
--- /dev/null
+++ b/public/assets/signs/Teal/Libus.svg
@@ -0,0 +1,68 @@
+
+
+
+
+ Libus
+
+
+
+
+
+ image/svg+xml
+
+ Libus
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Libza.svg b/public/assets/signs/Teal/Libza.svg
new file mode 100644
index 0000000..87d3c48
--- /dev/null
+++ b/public/assets/signs/Teal/Libza.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Libza
+
+
+
+
+
+ image/svg+xml
+
+ Libza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Licen.svg b/public/assets/signs/Teal/Licen.svg
new file mode 100644
index 0000000..a3df498
--- /dev/null
+++ b/public/assets/signs/Teal/Licen.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Licen
+
+
+
+
+
+ image/svg+xml
+
+ Licen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Licer.svg b/public/assets/signs/Teal/Licer.svg
new file mode 100644
index 0000000..5e23893
--- /dev/null
+++ b/public/assets/signs/Teal/Licer.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Licer
+
+
+
+
+
+ image/svg+xml
+
+ Licer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Liga.svg b/public/assets/signs/Teal/Liga.svg
new file mode 100644
index 0000000..8896e1d
--- /dev/null
+++ b/public/assets/signs/Teal/Liga.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Liga
+
+
+
+
+
+ image/svg+xml
+
+ Liga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Ligo.svg b/public/assets/signs/Teal/Ligo.svg
new file mode 100644
index 0000000..b71c110
--- /dev/null
+++ b/public/assets/signs/Teal/Ligo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Ligo
+
+
+
+
+
+ image/svg+xml
+
+ Ligo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Limini.svg b/public/assets/signs/Teal/Limini.svg
new file mode 100644
index 0000000..815665c
--- /dev/null
+++ b/public/assets/signs/Teal/Limini.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Limini
+
+
+
+
+
+ image/svg+xml
+
+ Limini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Limino.svg b/public/assets/signs/Teal/Limino.svg
new file mode 100644
index 0000000..caceb33
--- /dev/null
+++ b/public/assets/signs/Teal/Limino.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Limino
+
+
+
+
+
+ image/svg+xml
+
+ Limino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Lipia.svg b/public/assets/signs/Teal/Lipia.svg
new file mode 100644
index 0000000..c0d8845
--- /dev/null
+++ b/public/assets/signs/Teal/Lipia.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Lipia
+
+
+
+
+
+ image/svg+xml
+
+ Lipia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Teal/Lipio.svg b/public/assets/signs/Teal/Lipio.svg
new file mode 100644
index 0000000..e1fe3a5
--- /dev/null
+++ b/public/assets/signs/Teal/Lipio.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Lipio
+
+
+
+
+
+ image/svg+xml
+
+ Lipio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquacen.svg b/public/assets/signs/Violet/Aquacen.svg
new file mode 100644
index 0000000..e9dcae6
--- /dev/null
+++ b/public/assets/signs/Violet/Aquacen.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquacen
+
+
+
+
+
+ image/svg+xml
+
+ Aquacen
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquacer.svg b/public/assets/signs/Violet/Aquacer.svg
new file mode 100644
index 0000000..a3d2a3e
--- /dev/null
+++ b/public/assets/signs/Violet/Aquacer.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquacer
+
+
+
+
+
+ image/svg+xml
+
+ Aquacer
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquaga.svg b/public/assets/signs/Violet/Aquaga.svg
new file mode 100644
index 0000000..f33beda
--- /dev/null
+++ b/public/assets/signs/Violet/Aquaga.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquaga
+
+
+
+
+
+ image/svg+xml
+
+ Aquaga
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquago.svg b/public/assets/signs/Violet/Aquago.svg
new file mode 100644
index 0000000..5070aa0
--- /dev/null
+++ b/public/assets/signs/Violet/Aquago.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Aquago
+
+
+
+
+
+ image/svg+xml
+
+ Aquago
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aqualo.svg b/public/assets/signs/Violet/Aqualo.svg
new file mode 100644
index 0000000..41862df
--- /dev/null
+++ b/public/assets/signs/Violet/Aqualo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aqualo
+
+
+
+
+
+ image/svg+xml
+
+ Aqualo
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquamini.svg b/public/assets/signs/Violet/Aquamini.svg
new file mode 100644
index 0000000..532baa9
--- /dev/null
+++ b/public/assets/signs/Violet/Aquamini.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Aquamini
+
+
+
+
+
+ image/svg+xml
+
+ Aquamini
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquamino.svg b/public/assets/signs/Violet/Aquamino.svg
new file mode 100644
index 0000000..21faae1
--- /dev/null
+++ b/public/assets/signs/Violet/Aquamino.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquamino
+
+
+
+
+
+ image/svg+xml
+
+ Aquamino
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquanius.svg b/public/assets/signs/Violet/Aquanius.svg
new file mode 100644
index 0000000..f098811
--- /dev/null
+++ b/public/assets/signs/Violet/Aquanius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquanius
+
+
+
+
+
+ image/svg+xml
+
+ Aquanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquapia.svg b/public/assets/signs/Violet/Aquapia.svg
new file mode 100644
index 0000000..192293f
--- /dev/null
+++ b/public/assets/signs/Violet/Aquapia.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquapia
+
+
+
+
+
+ image/svg+xml
+
+ Aquapia
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquapio.svg b/public/assets/signs/Violet/Aquapio.svg
new file mode 100644
index 0000000..2ccd60a
--- /dev/null
+++ b/public/assets/signs/Violet/Aquapio.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquapio
+
+
+
+
+
+ image/svg+xml
+
+ Aquapio
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquara.svg b/public/assets/signs/Violet/Aquara.svg
new file mode 100644
index 0000000..6e0809b
--- /dev/null
+++ b/public/assets/signs/Violet/Aquara.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquara
+
+
+
+
+
+ image/svg+xml
+
+ Aquara
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquaries.svg b/public/assets/signs/Violet/Aquaries.svg
new file mode 100644
index 0000000..50a235e
--- /dev/null
+++ b/public/assets/signs/Violet/Aquaries.svg
@@ -0,0 +1,67 @@
+
+
+
+
+ Aquaries
+
+
+
+
+
+ image/svg+xml
+
+ Aquaries
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquarist.svg b/public/assets/signs/Violet/Aquarist.svg
new file mode 100644
index 0000000..5135114
--- /dev/null
+++ b/public/assets/signs/Violet/Aquarist.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquarist
+
+
+
+
+
+ image/svg+xml
+
+ Aquarist
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquarius.svg b/public/assets/signs/Violet/Aquarius.svg
new file mode 100644
index 0000000..8a791c0
--- /dev/null
+++ b/public/assets/signs/Violet/Aquarius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquarius
+
+
+
+
+
+ image/svg+xml
+
+ Aquarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquasces.svg b/public/assets/signs/Violet/Aquasces.svg
new file mode 100644
index 0000000..8e91aab
--- /dev/null
+++ b/public/assets/signs/Violet/Aquasces.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquasces
+
+
+
+
+
+ image/svg+xml
+
+ Aquasces
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquasci.svg b/public/assets/signs/Violet/Aquasci.svg
new file mode 100644
index 0000000..ab13c0d
--- /dev/null
+++ b/public/assets/signs/Violet/Aquasci.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquasci
+
+
+
+
+
+ image/svg+xml
+
+ Aquasci
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquaza.svg b/public/assets/signs/Violet/Aquaza.svg
new file mode 100644
index 0000000..6a6268d
--- /dev/null
+++ b/public/assets/signs/Violet/Aquaza.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquaza
+
+
+
+
+
+ image/svg+xml
+
+ Aquaza
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquiborn.svg b/public/assets/signs/Violet/Aquiborn.svg
new file mode 100644
index 0000000..8b4ff2a
--- /dev/null
+++ b/public/assets/signs/Violet/Aquiborn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquiborn
+
+
+
+
+
+ image/svg+xml
+
+ Aquiborn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquicorn.svg b/public/assets/signs/Violet/Aquicorn.svg
new file mode 100644
index 0000000..5c0588d
--- /dev/null
+++ b/public/assets/signs/Violet/Aquicorn.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquicorn
+
+
+
+
+
+ image/svg+xml
+
+ Aquicorn
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquittanius.svg b/public/assets/signs/Violet/Aquittanius.svg
new file mode 100644
index 0000000..1c0fbfc
--- /dev/null
+++ b/public/assets/signs/Violet/Aquittanius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquittanius
+
+
+
+
+
+ image/svg+xml
+
+ Aquittanius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquittarius.svg b/public/assets/signs/Violet/Aquittarius.svg
new file mode 100644
index 0000000..c656fd8
--- /dev/null
+++ b/public/assets/signs/Violet/Aquittarius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquittarius
+
+
+
+
+
+ image/svg+xml
+
+ Aquittarius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquiun.svg b/public/assets/signs/Violet/Aquiun.svg
new file mode 100644
index 0000000..90c6a69
--- /dev/null
+++ b/public/assets/signs/Violet/Aquiun.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquiun
+
+
+
+
+
+ image/svg+xml
+
+ Aquiun
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquius.svg b/public/assets/signs/Violet/Aquius.svg
new file mode 100644
index 0000000..e7f7ebd
--- /dev/null
+++ b/public/assets/signs/Violet/Aquius.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquius
+
+
+
+
+
+ image/svg+xml
+
+ Aquius
+
+
+
+
+
+
+
diff --git a/public/assets/signs/Violet/Aquo.svg b/public/assets/signs/Violet/Aquo.svg
new file mode 100644
index 0000000..0ca6a1f
--- /dev/null
+++ b/public/assets/signs/Violet/Aquo.svg
@@ -0,0 +1,66 @@
+
+
+
+
+ Aquo
+
+
+
+
+
+ image/svg+xml
+
+ Aquo
+
+
+
+
+
+
+
diff --git a/public/assets/sway/Derse.png b/public/assets/sway/Derse.png
new file mode 100644
index 0000000..50c2fcc
Binary files /dev/null and b/public/assets/sway/Derse.png differ
diff --git a/public/assets/sway/Prospit.png b/public/assets/sway/Prospit.png
new file mode 100644
index 0000000..320ade6
Binary files /dev/null and b/public/assets/sway/Prospit.png differ
diff --git a/public/fonts/FlowCircular/FlowCircular.ttf b/public/fonts/FlowCircular/FlowCircular.ttf
new file mode 100644
index 0000000..2704f18
Binary files /dev/null and b/public/fonts/FlowCircular/FlowCircular.ttf differ
diff --git a/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.codepoints b/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.codepoints
new file mode 100644
index 0000000..2da45cc
--- /dev/null
+++ b/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.codepoints
@@ -0,0 +1,3275 @@
+10k e951
+10mp e952
+11mp e953
+123 eb8d
+12mp e954
+13mp e955
+14mp e956
+15mp e957
+16mp e958
+17mp e959
+18_up_rating f8fd
+18mp e95a
+19mp e95b
+1k e95c
+1k_plus e95d
+1x_mobiledata efcd
+1x_mobiledata_badge f7f1
+20mp e95e
+21mp e95f
+22mp e960
+23mp e961
+24mp e962
+2d ef37
+2k e963
+2k_plus e964
+2mp e965
+30fps efce
+30fps_select efcf
+360 e577
+3d_rotation e84d
+3g_mobiledata efd0
+3g_mobiledata_badge f7f0
+3k e966
+3k_plus e967
+3mp e968
+3p efd1
+4g_mobiledata efd2
+4g_mobiledata_badge f7ef
+4g_plus_mobiledata efd3
+4k e072
+4k_plus e969
+4mp e96a
+50mp f6f3
+5g ef38
+5g_mobiledata_badge f7ee
+5k e96b
+5k_plus e96c
+5mp e96d
+60fps efd4
+60fps_select efd5
+6_ft_apart f21e
+6k e96e
+6k_plus e96f
+6mp e970
+7k e971
+7k_plus e972
+7mp e973
+8k e974
+8k_plus e975
+8mp e976
+9k e977
+9k_plus e978
+9mp e979
+abc eb94
+ac_unit eb3b
+access_alarm e855
+access_alarms e855
+access_time efd6
+access_time_filled efd6
+accessibility e84e
+accessibility_new e92c
+accessible e914
+accessible_forward e934
+account_balance e84f
+account_balance_wallet e850
+account_box e851
+account_circle efd7
+account_circle_filled efd7
+account_circle_off f7b3
+account_tree e97a
+activity_zone e1e6
+acute e4cb
+ad e65a
+ad_group e65b
+ad_group_off eae5
+ad_off f7b2
+ad_units ef39
+adb e60e
+add e145
+add_a_photo e439
+add_ad e72a
+add_alarm e856
+add_alert e003
+add_box e146
+add_business e729
+add_call f0b7
+add_card eb86
+add_chart ef3c
+add_circle e3ba
+add_circle_outline e3ba
+add_comment e266
+add_home f8eb
+add_home_work f8ed
+add_ic_call f0b7
+add_link e178
+add_location e567
+add_location_alt ef3a
+add_moderator e97d
+add_notes e091
+add_photo_alternate e43e
+add_reaction e1d3
+add_road ef3b
+add_shopping_cart e854
+add_task f23a
+add_to_drive e65c
+add_to_home_screen e1fe
+add_to_photos e39d
+add_to_queue e05c
+addchart ef3c
+adf_scanner eada
+adjust e39e
+admin_meds e48d
+admin_panel_settings ef3d
+ads_click e762
+agender f888
+agriculture ea79
+air efd8
+air_freshener e2ca
+air_purifier_gen e829
+airline_seat_flat e630
+airline_seat_flat_angled e631
+airline_seat_individual_suite e632
+airline_seat_legroom_extra e633
+airline_seat_legroom_normal e634
+airline_seat_legroom_reduced e635
+airline_seat_recline_extra e636
+airline_seat_recline_normal e637
+airline_stops e7d0
+airlines e7ca
+airplane_ticket efd9
+airplanemode_active e53d
+airplanemode_inactive e194
+airplay e055
+airport_shuttle eb3c
+airware f154
+airwave f154
+alarm e855
+alarm_add e856
+alarm_off e857
+alarm_on e858
+alarm_smart_wake f6b0
+album e019
+align_center e356
+align_end f797
+align_flex_center f796
+align_flex_end f795
+align_flex_start f794
+align_horizontal_center e00f
+align_horizontal_left e00d
+align_horizontal_right e010
+align_items_stretch f793
+align_justify_center f792
+align_justify_flex_end f791
+align_justify_flex_start f790
+align_justify_space_around f78f
+align_justify_space_between f78e
+align_justify_space_even f78d
+align_justify_stretch f78c
+align_self_stretch f78b
+align_space_around f78a
+align_space_between f789
+align_space_even f788
+align_start f787
+align_stretch f786
+align_vertical_bottom e015
+align_vertical_center e011
+align_vertical_top e00c
+all_inbox e97f
+all_inclusive eb3d
+all_match e093
+all_out e90b
+allergies e094
+allergy e64e
+alt_route f184
+alternate_email e0e6
+altitude f873
+ambient_screen f6c4
+ambulance f803
+amend f802
+amp_stories ea13
+analytics ef3e
+anchor f1cd
+android e859
+animation e71c
+announcement e87f
+aod efda
+aod_tablet f89f
+aod_watch f6ac
+apartment ea40
+api f1b7
+apk_document f88e
+apk_install f88f
+app_badging f72f
+app_blocking ef3f
+app_promo e981
+app_registration ef40
+app_settings_alt ef41
+app_shortcut eae4
+approval e982
+approval_delegation f84a
+apps e5c3
+apps_outage e7cc
+ar_on_you ef7c
+architecture ea3b
+archive e149
+area_chart e770
+arming_countdown e78a
+arrow_and_edge f5d7
+arrow_back e5c4
+arrow_back_ios e5e0
+arrow_back_ios_new e2ea
+arrow_circle_down f181
+arrow_circle_left eaa7
+arrow_circle_right eaaa
+arrow_circle_up f182
+arrow_downward e5db
+arrow_downward_alt e984
+arrow_drop_down e5c5
+arrow_drop_down_circle e5c6
+arrow_drop_up e5c7
+arrow_forward e5c8
+arrow_forward_ios e5e1
+arrow_insert f837
+arrow_left e5de
+arrow_left_alt ef7d
+arrow_or_edge f5d6
+arrow_outward f8ce
+arrow_range f69b
+arrow_right e5df
+arrow_right_alt e941
+arrow_selector_tool f82f
+arrow_split e985
+arrow_top_left f72e
+arrow_top_right f72d
+arrow_upward e5d8
+arrow_upward_alt e986
+arrows_more_down f8ab
+arrows_more_up f8ac
+arrows_outward f72c
+art_track e060
+article ef42
+article_shortcut f587
+aspect_ratio e85b
+assessment e85c
+assignment e85d
+assignment_add f848
+assignment_ind e85e
+assignment_late e85f
+assignment_return e860
+assignment_returned e861
+assignment_turned_in e862
+assist_walker f8d5
+assistant e39f
+assistant_direction e988
+assistant_navigation e989
+assistant_on_hub f6c1
+assistant_photo ea1a
+assured_workload eb6f
+astrophotography_auto f1d9
+astrophotography_off f1da
+atm e573
+atr ebc7
+attach_email ea5e
+attach_file e226
+attach_file_add f841
+attach_money e227
+attachment e2bc
+attractions ea52
+attribution efdb
+audio_description f58c
+audio_file eb82
+audio_video_receiver f5d3
+audiotrack e405
+auto_activity_zone f8ad
+auto_awesome e65f
+auto_awesome_mosaic e660
+auto_awesome_motion e661
+auto_delete ea4c
+auto_detect_voice f83e
+auto_fix e663
+auto_fix_high e663
+auto_fix_normal e664
+auto_fix_off e665
+auto_graph e4fb
+auto_label f6be
+auto_meeting_room f6bf
+auto_mode ec20
+auto_read_pause f219
+auto_read_play f216
+auto_schedule e214
+auto_stories e666
+auto_timer ef7f
+auto_videocam f6c0
+autofps_select efdc
+autopause f6b6
+autopay f84b
+autoplay f6b5
+autorenew e863
+autostop f682
+av_timer e01b
+avg_pace f6bb
+avg_time f813
+award_star f612
+azm f6ec
+baby_changing_station f19b
+back_hand e764
+back_to_tab f72b
+background_dot_large f79e
+background_grid_small f79d
+background_replace f20a
+backlight_high f7ed
+backlight_low f7ec
+backpack f19c
+backspace e14a
+backup e864
+backup_table ef43
+badge ea67
+badge_critical_battery f156
+bakery_dining ea53
+balance eaf6
+balcony e58f
+ballot e172
+bar_chart e26b
+bar_chart_4_bars f681
+barcode e70b
+barcode_reader f85c
+barcode_scanner e70c
+barefoot f871
+batch_prediction f0f5
+bath_outdoor f6fb
+bath_private f6fa
+bath_public_large f6f9
+bathroom efdd
+bathtub ea41
+battery_0_bar ebdc
+battery_1_bar ebd9
+battery_20 f0a1
+battery_2_bar ebe0
+battery_30 f0a1
+battery_3_bar ebdd
+battery_4_bar ebe2
+battery_50 f0a1
+battery_5_bar ebd4
+battery_60 f0a1
+battery_6_bar ebd2
+battery_80 f0a1
+battery_90 f0a1
+battery_alert e19c
+battery_change f7eb
+battery_charging_20 f0a2
+battery_charging_30 f0a3
+battery_charging_50 f0a4
+battery_charging_60 f0a5
+battery_charging_80 f0a6
+battery_charging_90 f0a7
+battery_charging_full e1a3
+battery_error f7ea
+battery_full f0a1
+battery_full_alt f13b
+battery_horiz_000 f8ae
+battery_horiz_050 f8af
+battery_horiz_075 f8b0
+battery_low f155
+battery_plus f7e9
+battery_profile e206
+battery_saver efde
+battery_share f67e
+battery_status_good f67d
+battery_std f0a1
+battery_unknown e1a6
+battery_vert_005 f8b1
+battery_vert_020 f8b2
+battery_vert_050 f8b3
+battery_very_low f156
+beach_access eb3e
+bed efdf
+bedroom_baby efe0
+bedroom_child efe1
+bedroom_parent efe2
+bedtime ef44
+bedtime_off eb76
+beenhere e52d
+bento f1f4
+bia f6eb
+bid_landscape e667
+bid_landscape_disabled ef81
+bike_scooter ef45
+biotech ea3a
+blanket e828
+blender efe3
+blind f8d6
+blinds e286
+blinds_closed ec1f
+block f326
+blood_pressure e097
+bloodtype efe4
+bluetooth e1a7
+bluetooth_audio e1aa
+bluetooth_connected e1a8
+bluetooth_disabled e1a9
+bluetooth_drive efe5
+bluetooth_searching e1aa
+blur_circular e3a2
+blur_linear e3a3
+blur_medium e84c
+blur_off e3a4
+blur_on e3a5
+blur_short e8cf
+body_fat e098
+body_system e099
+bolt ea0b
+book e865
+book_online f217
+bookmark e8e7
+bookmark_add e598
+bookmark_added e599
+bookmark_border e8e7
+bookmark_manager f7b1
+bookmark_remove e59a
+bookmarks e98b
+border_all e228
+border_bottom e229
+border_clear e22a
+border_color e22b
+border_horizontal e22c
+border_inner e22d
+border_left e22e
+border_outer e22f
+border_right e230
+border_style e231
+border_top e232
+border_vertical e233
+bottom_app_bar e730
+bottom_drawer e72d
+bottom_navigation e98c
+bottom_panel_close f72a
+bottom_panel_open f729
+bottom_right_click f684
+bottom_sheets e98d
+box f5a4
+box_add f5a5
+box_edit f5a6
+boy eb67
+brand_awareness e98e
+branding_watermark e06b
+breakfast_dining ea54
+breaking_news ea08
+breaking_news_alt_1 f0ba
+breastfeeding f856
+brightness_1 e3fa
+brightness_2 f036
+brightness_3 e3a8
+brightness_4 e3a9
+brightness_5 e3aa
+brightness_6 e3ab
+brightness_7 e3ac
+brightness_alert f5cf
+brightness_auto e1ab
+brightness_empty f7e8
+brightness_high e1ac
+brightness_low e1ad
+brightness_medium e1ae
+bring_your_own_ip e016
+broadcast_on_home f8f8
+broadcast_on_personal f8f9
+broken_image e3ad
+browse eb13
+browse_activity f8a5
+browse_gallery ebd1
+browser_not_supported ef47
+browser_updated e7cf
+brunch_dining ea73
+brush e3ae
+bubble ef83
+bubble_chart e6dd
+bubbles f64e
+bug_report e868
+build f8cd
+build_circle ef48
+bungalow e591
+burst_mode e43c
+bus_alert e98f
+business e7ee
+business_center eb3f
+business_chip f84c
+business_messages ef84
+buttons_alt e72f
+cabin e589
+cable efe6
+cached e86a
+cake e7e9
+cake_add f85b
+calculate ea5f
+calendar_add_on ef85
+calendar_apps_script f0bb
+calendar_month ebcc
+calendar_today e935
+calendar_view_day e936
+calendar_view_month efe7
+calendar_view_week efe8
+call f0d4
+call_end f0bc
+call_end_alt f0bc
+call_log e08e
+call_made e0b2
+call_merge e0b3
+call_missed e0b4
+call_missed_outgoing e0e4
+call_quality f652
+call_received e0b5
+call_split e0b6
+call_to_action e06c
+camera e3af
+camera_alt e412
+camera_enhance e8fc
+camera_front e3b1
+camera_indoor efe9
+camera_outdoor efea
+camera_rear e3b2
+camera_roll e3b3
+camera_video f7a6
+cameraswitch efeb
+campaign ef49
+camping f8a2
+cancel e888
+cancel_presentation e0e9
+cancel_schedule_send ea39
+candle f588
+candlestick_chart ead4
+captive_portal f728
+capture f727
+car_crash ebf2
+car_rental ea55
+car_repair ea56
+card_giftcard e8f6
+card_membership e8f7
+card_travel e8f8
+cardiology e09c
+cards e991
+carpenter f1f8
+cases e992
+casino eb40
+cast e307
+cast_connected e308
+cast_for_education efec
+cast_pause f5f0
+cast_warning f5ef
+castle eab1
+category e574
+celebration ea65
+cell_merge f82e
+cell_tower ebba
+cell_wifi e0ec
+center_focus_strong e3b4
+center_focus_weak e3b5
+chair efed
+chair_alt efee
+chalet e585
+change_circle e2e7
+change_history e86b
+charger e2ae
+charging_station f19d
+chart_data e473
+chat e0c9
+chat_add_on f0f3
+chat_apps_script f0bd
+chat_bubble e0cb
+chat_bubble_outline e0cb
+chat_error f7ac
+chat_paste_go f6bd
+check e5ca
+check_box e834
+check_box_outline_blank e835
+check_circle e86c
+check_circle_filled e86c
+check_circle_outline e86c
+check_in_out f6f6
+check_indeterminate_small f88a
+check_small f88b
+checklist e6b1
+checklist_rtl e6b3
+checkroom f19e
+cheer f6a8
+chess f5e7
+chevron_left e5cb
+chevron_right e5cc
+child_care eb41
+child_friendly eb42
+chip_extraction f821
+chips e993
+chrome_reader_mode e86d
+chromecast_2 f17b
+chromecast_device e83c
+chronic ebb2
+church eaae
+cinematic_blur f853
+circle ef4a
+circle_notifications e994
+circles e7ea
+circles_ext e7ec
+clarify f0bf
+class e865
+clean_hands f21f
+cleaning_bucket f8b4
+cleaning_services f0ff
+clear e5cd
+clear_all e0b8
+clear_day f157
+clear_night f159
+climate_mini_split f8b5
+clinical_notes e09e
+clock_loader_10 f726
+clock_loader_20 f725
+clock_loader_40 f724
+clock_loader_60 f723
+clock_loader_80 f722
+clock_loader_90 f721
+close e5cd
+close_fullscreen f1cf
+closed_caption e996
+closed_caption_disabled f1dc
+closed_caption_off e996
+cloud f15c
+cloud_circle e2be
+cloud_done e2bf
+cloud_download e2c0
+cloud_off e2c1
+cloud_queue f15c
+cloud_sync eb5a
+cloud_upload e2c3
+cloudy f15c
+cloudy_filled f15c
+cloudy_snowing e810
+co2 e7b0
+co_present eaf0
+code e86f
+code_blocks f84d
+code_off e4f3
+coffee efef
+coffee_maker eff0
+cognition e09f
+collapse_all e944
+collections e3d3
+collections_bookmark e431
+color_lens e40a
+colorize e3b8
+colors e997
+comic_bubble f5dd
+comment e24c
+comment_bank ea4e
+comments_disabled e7a2
+commit eaf5
+communication e27c
+communities e7ed
+communities_filled e7ed
+commute e940
+compare e3b9
+compare_arrows e915
+compass_calibration e57c
+component_exchange f1e7
+compost e761
+compress e94d
+computer e31e
+conditions e0a0
+confirmation_number e638
+congenital e0a1
+connect_without_contact f223
+connected_tv e998
+connecting_airports e7c9
+construction ea3c
+contact_emergency f8d1
+contact_mail e0d0
+contact_page f22e
+contact_phone f0c0
+contact_phone_filled f0c0
+contact_support e94c
+contactless ea71
+contactless_off f858
+contacts e0ba
+content_copy e14d
+content_cut e14e
+content_paste e14f
+content_paste_go ea8e
+content_paste_off e4f8
+content_paste_search ea9b
+contract f5a0
+contract_delete f5a2
+contract_edit f5a1
+contrast eb37
+contrast_rtl_off ec72
+control_camera e074
+control_point e3ba
+control_point_duplicate e3bb
+controller_gen e83d
+conversion_path f0c1
+conversion_path_off f7b4
+conveyor_belt f867
+cookie eaac
+cookie_off f79a
+cooking e2b6
+cool_to_dry e276
+copy_all e2ec
+copyright e90c
+coronavirus f221
+corporate_fare f1d0
+cottage e587
+counter_0 f785
+counter_1 f784
+counter_2 f783
+counter_3 f782
+counter_4 f781
+counter_5 f780
+counter_6 f77f
+counter_7 f77e
+counter_8 f77d
+counter_9 f77c
+countertops f1f7
+create f345
+create_new_folder e2cc
+credit_card e8a1
+credit_card_off e4f4
+credit_score eff1
+crib e588
+crisis_alert ebe9
+crop e3be
+crop_16_9 e3bc
+crop_3_2 e3bd
+crop_5_4 e3bf
+crop_7_5 e3c0
+crop_din e3c6
+crop_free e3c2
+crop_landscape e3c3
+crop_original e3f4
+crop_portrait e3c5
+crop_rotate e437
+crop_square e3c6
+crossword f5e5
+crowdsource eb18
+cruelty_free e799
+css eb93
+csv e6cf
+currency_bitcoin ebc5
+currency_exchange eb70
+currency_franc eafa
+currency_lira eaef
+currency_pound eaf1
+currency_ruble eaec
+currency_rupee eaf7
+currency_yen eafb
+currency_yuan eaf9
+curtains ec1e
+curtains_closed ec1d
+custom_typography e732
+cut f08b
+cycle f854
+cyclone ebd5
+dangerous e99a
+dark_mode e51c
+dashboard e871
+dashboard_customize e99b
+data_alert f7f6
+data_array ead1
+data_check f7f2
+data_exploration e76f
+data_info_alert f7f5
+data_loss_prevention e2dc
+data_object ead3
+data_saver_off eff2
+data_saver_on eff3
+data_table e99c
+data_thresholding eb9f
+data_usage eff2
+database f20e
+dataset f8ee
+dataset_linked f8ef
+date_range e916
+deblur eb77
+deceased e0a5
+decimal_decrease f82d
+decimal_increase f82c
+deck ea42
+dehaze e3c7
+delete e872
+delete_forever e92b
+delete_outline e872
+delete_sweep e16c
+demography e489
+density_large eba9
+density_medium eb9e
+density_small eba8
+dentistry e0a6
+departure_board e576
+deployed_code f720
+deployed_code_alert f5f2
+deployed_code_history f5f3
+deployed_code_update f5f4
+dermatology e0a7
+description e873
+deselect ebb6
+design_services f10a
+desk f8f4
+deskphone f7fa
+desktop_access_disabled e99d
+desktop_mac e30b
+desktop_windows e30c
+destruction f585
+details e3c8
+detection_and_zone e29f
+detector e282
+detector_alarm e1f7
+detector_battery e204
+detector_co e2af
+detector_offline e223
+detector_smoke e285
+detector_status e1e8
+developer_board e30d
+developer_board_off e4ff
+developer_guide e99e
+developer_mode e1b0
+developer_mode_tv e874
+device_hub e335
+device_reset e8b3
+device_thermostat e1ff
+device_unknown e339
+devices e326
+devices_fold ebde
+devices_off f7a5
+devices_other e337
+devices_wearables f6ab
+dew_point f879
+diagnosis e0a8
+dialer_sip e0bb
+dialogs e99f
+dialpad e0bc
+diamond ead5
+difference eb7d
+digital_out_of_home f1de
+dining eff4
+dinner_dining ea57
+directions e52e
+directions_alt f880
+directions_alt_off f881
+directions_bike e52f
+directions_boat eff5
+directions_boat_filled eff5
+directions_bus eff6
+directions_bus_filled eff6
+directions_car eff7
+directions_car_filled eff7
+directions_off f10f
+directions_railway eff8
+directions_railway_filled eff8
+directions_run e566
+directions_subway effa
+directions_subway_filled effa
+directions_transit effa
+directions_transit_filled effa
+directions_walk e536
+directory_sync e394
+dirty_lens ef4b
+disabled_by_default f230
+disabled_visible e76e
+disc_full e610
+discover_tune e018
+dishwasher_gen e832
+display_external_input f7e7
+display_settings eb97
+distance f6ea
+diversity_1 f8d7
+diversity_2 f8d8
+diversity_3 f8d9
+diversity_4 f857
+dns e875
+do_disturb f326
+do_disturb_alt f08d
+do_disturb_off f329
+do_disturb_on f08f
+do_not_disturb f08d
+do_not_disturb_alt f326
+do_not_disturb_off f329
+do_not_disturb_on f08f
+do_not_disturb_on_total_silence effb
+do_not_step f19f
+do_not_touch f1b0
+dock e30e
+dock_to_bottom f7e6
+dock_to_left f7e5
+dock_to_right f7e4
+docs_add_on f0c2
+docs_apps_script f0c3
+document_scanner e5fa
+domain e7ee
+domain_add eb62
+domain_disabled e0ef
+domain_verification ef4c
+domain_verification_off f7b0
+domino_mask f5e4
+done e876
+done_all e877
+done_outline e92f
+donut_large e917
+donut_small e918
+door_back effc
+door_front effd
+door_open e77c
+door_sensor e28a
+door_sliding effe
+doorbell efff
+doorbell_3p e1e7
+doorbell_chime e1f3
+double_arrow ea50
+downhill_skiing e509
+download f090
+download_done f091
+download_for_offline f000
+downloading f001
+draft e66d
+draft_orders e7b3
+drafts e151
+drag_click f71f
+drag_handle e25d
+drag_indicator e945
+drag_pan f71e
+draw e746
+draw_abstract f7f8
+draw_collage f7f7
+dresser e210
+drive_eta eff7
+drive_file_move e9a1
+drive_file_move_outline e9a1
+drive_file_move_rtl e9a1
+drive_file_rename_outline e9a2
+drive_folder_upload e9a3
+drive_fusiontable e667
+dropdown e9a4
+dry f1b3
+dry_cleaning ea58
+dual_screen f6cf
+duo e9a5
+dvr e1b2
+dynamic_feed ea14
+dynamic_form f1bf
+e911_avatar f11a
+e911_emergency f119
+e_mobiledata f002
+e_mobiledata_badge f7e3
+earbuds f003
+earbuds_battery f004
+early_on e2ba
+earthquake f64f
+east f1df
+ecg f80f
+ecg_heart f6e9
+eco ea35
+eda f6e8
+edgesensor_high f005
+edgesensor_low f006
+edit f345
+edit_attributes e578
+edit_calendar e742
+edit_document f88c
+edit_location e568
+edit_location_alt e1c5
+edit_note e745
+edit_notifications e525
+edit_off e950
+edit_road ef4d
+edit_square f88d
+egg eacc
+egg_alt eac8
+eject e8fb
+elderly f21a
+elderly_woman eb69
+electric_bike eb1b
+electric_bolt ec1c
+electric_car eb1c
+electric_meter ec1b
+electric_moped eb1d
+electric_rickshaw eb1e
+electric_scooter eb1f
+electrical_services f102
+elevation f6e7
+elevator f1a0
+email e159
+emergency e1eb
+emergency_heat f15d
+emergency_home e82a
+emergency_recording ebf4
+emergency_share ebf6
+emergency_share_off f59e
+emoji_emotions ea22
+emoji_events ea23
+emoji_flags ea1a
+emoji_food_beverage ea1b
+emoji_nature ea1c
+emoji_objects ea24
+emoji_people ea1d
+emoji_symbols ea1e
+emoji_transportation ea1f
+emoticon e5f3
+empty_dashboard f844
+enable f188
+encrypted e593
+endocrinology e0a9
+energy_program_saving f15f
+energy_program_time_used f161
+energy_savings_leaf ec1a
+engineering ea3d
+enhanced_encryption e63f
+ent e0aa
+equal f77b
+equalizer e01d
+error f8b6
+error_circle_rounded f8b6
+error_med e49b
+error_outline f8b6
+escalator f1a1
+escalator_warning f1ac
+euro ea15
+euro_symbol e926
+ev_charger e56d
+ev_mobiledata_badge f7e2
+ev_shadow ef8f
+ev_shadow_add f580
+ev_shadow_minus f57f
+ev_station e56d
+event e878
+event_available e614
+event_busy e615
+event_list f683
+event_note e616
+event_repeat eb7b
+event_seat e903
+event_upcoming f238
+exclamation f22f
+exercise f6e6
+exit_to_app e879
+expand e94f
+expand_all e946
+expand_circle_down e7cd
+expand_circle_right f591
+expand_circle_up f5d2
+expand_content f830
+expand_less e5ce
+expand_more e5cf
+explicit e01e
+explore e87a
+explore_off e9a8
+explosion f685
+export_notes e0ac
+exposure e3f6
+exposure_neg_1 e3cb
+exposure_neg_2 e3cc
+exposure_plus_1 e800
+exposure_plus_2 e3ce
+exposure_zero e3cf
+extension e87b
+extension_off e4f5
+eyeglasses f6ee
+face f008
+face_2 f8da
+face_3 f8db
+face_4 f8dc
+face_5 f8dd
+face_6 f8de
+face_retouching_natural ef4e
+face_retouching_off f007
+face_unlock f008
+fact_check f0c5
+factory ebbc
+falling f60d
+familiar_face_and_zone e21c
+family_history e0ad
+family_link eb19
+family_restroom f1a2
+fast_forward e01f
+fast_rewind e020
+fastfood e57a
+faucet e278
+favorite e87e
+favorite_border e87e
+fax ead8
+feature_search e9a9
+featured_play_list e06d
+featured_video e06e
+feed f009
+feedback e87f
+female e590
+femur f891
+femur_alt f892
+fence f1f6
+fertile f6e5
+festival ea68
+fiber_dvr e05d
+fiber_manual_record e061
+fiber_new e05e
+fiber_pin e06a
+fiber_smart_record e062
+file_copy e173
+file_download f090
+file_download_done f091
+file_download_off e4fe
+file_open eaf3
+file_present ea0e
+file_upload f09b
+file_upload_off f886
+filter e3d3
+filter_1 e3d0
+filter_2 e3d1
+filter_3 e3d2
+filter_4 e3d4
+filter_5 e3d5
+filter_6 e3d6
+filter_7 e3d7
+filter_8 e3d8
+filter_9 e3d9
+filter_9_plus e3da
+filter_alt ef4f
+filter_alt_off eb32
+filter_b_and_w e3db
+filter_center_focus e3dc
+filter_drama e3dd
+filter_frames e3de
+filter_hdr e3df
+filter_list e152
+filter_list_alt e94e
+filter_list_off eb57
+filter_none e3e0
+filter_tilt_shift e3e2
+filter_vintage e3e3
+finance e6bf
+finance_chip f84e
+find_in_page e880
+find_replace e881
+fingerprint e90d
+fire_extinguisher f1d8
+fire_hydrant f1a3
+fire_truck f8f2
+fireplace ea43
+first_page e5dc
+fit_page f77a
+fit_screen ea10
+fit_width f779
+fitness_center eb43
+flag ea1a
+flag_circle eaf8
+flag_filled ea1a
+flaky ef50
+flare e3e4
+flash_auto e3e5
+flash_off e3e6
+flash_on e3e7
+flashlight_off f00a
+flashlight_on f00b
+flatware f00c
+flex_direction f778
+flex_no_wrap f777
+flex_wrap f776
+flight e539
+flight_class e7cb
+flight_land e904
+flight_takeoff e905
+flightsmode e6ca
+flip e3e8
+flip_camera_android ea37
+flip_camera_ios ea38
+flip_to_back e882
+flip_to_front e883
+flood ebe6
+floor f6e4
+floor_lamp e21e
+flourescent f00d
+flowsheet e0ae
+fluid e483
+fluid_balance f80d
+fluid_med f80c
+fluorescent f00d
+flutter f1dd
+flutter_dash e00b
+fmd_bad f00e
+fmd_good f1db
+foggy e818
+folded_hands f5ed
+folder e2c7
+folder_copy ebbd
+folder_data f586
+folder_delete eb34
+folder_managed f775
+folder_off eb83
+folder_open e2c8
+folder_shared e2c9
+folder_special e617
+folder_supervised f774
+folder_zip eb2c
+follow_the_signs f222
+font_download e167
+font_download_off e4f9
+food_bank f1f2
+foot_bones f893
+footprint f87d
+forest ea99
+fork_left eba0
+fork_right ebac
+forklift f868
+format_align_center e234
+format_align_justify e235
+format_align_left e236
+format_align_right e237
+format_bold e238
+format_clear e239
+format_color_fill e23a
+format_color_reset e23b
+format_color_text e23c
+format_h1 f85d
+format_h2 f85e
+format_h3 f85f
+format_h4 f860
+format_h5 f861
+format_h6 f862
+format_image_left f863
+format_image_right f864
+format_indent_decrease e23d
+format_indent_increase e23e
+format_ink_highlighter f82b
+format_italic e23f
+format_letter_spacing f773
+format_letter_spacing_2 f618
+format_letter_spacing_standard f617
+format_letter_spacing_wide f616
+format_letter_spacing_wider f615
+format_line_spacing e240
+format_list_bulleted e241
+format_list_bulleted_add f849
+format_list_numbered e242
+format_list_numbered_rtl e267
+format_overline eb65
+format_paint e243
+format_paragraph f865
+format_quote e244
+format_shapes e25e
+format_size e245
+format_strikethrough e246
+format_text_clip f82a
+format_text_overflow f829
+format_text_wrap f828
+format_textdirection_l_to_r e247
+format_textdirection_r_to_l e248
+format_underlined e249
+format_underlined_squiggle f885
+forms_add_on f0c7
+forms_apps_script f0c8
+fort eaad
+forum e8af
+forward f57a
+forward_10 e056
+forward_30 e057
+forward_5 e058
+forward_circle f6f5
+forward_media f6f4
+forward_to_inbox f187
+foundation f200
+frame_inspect f772
+frame_person f8a6
+frame_person_off f7d1
+frame_reload f771
+frame_source f770
+free_breakfast eb44
+free_cancellation e748
+front_hand e769
+front_loader f869
+full_coverage eb12
+full_hd f58b
+full_stacked_bar_chart f212
+fullscreen e5d0
+fullscreen_exit e5d1
+function f866
+functions e24a
+g_mobiledata f010
+g_mobiledata_badge f7e1
+g_translate e927
+gallery_thumbnail f86f
+gamepad e30f
+games e30f
+garage f011
+garage_home e82d
+garden_cart f8a9
+gas_meter ec19
+gastroenterology e0f1
+gate e277
+gavel e90e
+generating_tokens e749
+genetics e0f3
+genres e022
+gesture e155
+gesture_select f657
+get_app f090
+gif e908
+gif_box e7a3
+girl eb68
+gite e58b
+glass_cup f6e3
+globe_asia f799
+globe_uk f798
+glucose e4a0
+glyphs f8a3
+go_to_line f71d
+golf_course eb45
+google_plus_reshare f57a
+google_tv_remote f5db
+google_wifi f579
+gpp_bad f012
+gpp_good f013
+gpp_maybe f014
+gps_fixed e55c
+gps_not_fixed e1b7
+gps_off e1b6
+grade e885
+gradient e3e9
+grading ea4f
+grain e3ea
+graphic_eq e1b8
+grass f205
+grid_3x3 f015
+grid_3x3_off f67c
+grid_4x4 f016
+grid_goldenratio f017
+grid_guides f76f
+grid_off e3eb
+grid_on e3ec
+grid_view e9b0
+group ea21
+group_add e7f0
+group_off e747
+group_remove e7ad
+group_work e886
+grouped_bar_chart f211
+groups f233
+groups_2 f8df
+groups_3 f8e0
+gynecology e0f4
+h_mobiledata f018
+h_mobiledata_badge f7e0
+h_plus_mobiledata f019
+h_plus_mobiledata_badge f7df
+hail e9b1
+hallway e6f8
+hand_bones f894
+hand_gesture ef9c
+handshake ebcb
+handyman f10b
+hangout_video e0c1
+hangout_video_off e0c2
+hard_drive f80e
+hard_drive_2 f7a4
+hardware ea59
+hd e052
+hdr_auto f01a
+hdr_auto_select f01b
+hdr_enhanced_select ef51
+hdr_off e3ed
+hdr_off_select f01c
+hdr_on e3ee
+hdr_on_select f01d
+hdr_plus f01e
+hdr_strong e3f1
+hdr_weak e3f2
+headphones f01f
+headphones_battery f020
+headset f01f
+headset_mic e311
+headset_off e33a
+healing e3f3
+health_and_safety e1d5
+health_metrics f6e2
+heap_snapshot_large f76e
+heap_snapshot_multiple f76d
+heap_snapshot_thumbnail f76c
+hearing e023
+hearing_disabled f104
+heart_broken eac2
+heart_check f60a
+heart_minus f883
+heart_plus f884
+heat_pump ec18
+heat_pump_balance e27e
+height ea16
+helicopter f60c
+help e8fd
+help_center f1c0
+help_clinic f810
+help_outline e8fd
+hematology e0f6
+hevc f021
+hexagon eb39
+hide ef9e
+hide_image f022
+hide_source f023
+high_density f79c
+high_quality e024
+highlight e25f
+highlight_off e888
+highlighter_size_1 f76b
+highlighter_size_2 f76a
+highlighter_size_3 f769
+highlighter_size_4 f768
+highlighter_size_5 f767
+hiking e50a
+history e8b3
+history_edu ea3e
+history_toggle_off f17d
+hive eaa6
+hls eb8a
+hls_off eb8c
+holiday_village e58a
+home e88a
+home_app_logo e295
+home_filled e88a
+home_health e4b9
+home_iot_device e283
+home_max f024
+home_max_dots e849
+home_mini f025
+home_pin f14d
+home_repair_service f100
+home_speaker f11c
+home_storage f86c
+home_work f030
+horizontal_distribute e014
+horizontal_rule f108
+horizontal_split e947
+hot_tub eb46
+hotel e549
+hotel_class e743
+hourglass_bottom ea5c
+hourglass_disabled ef53
+hourglass_empty e88b
+hourglass_full e88c
+hourglass_top ea5b
+house ea44
+house_siding f202
+house_with_shield e786
+houseboat e584
+how_to_reg e174
+how_to_vote e175
+hr_resting f6ba
+html eb7e
+http e902
+https e88d
+hub e9f4
+humerus f895
+humerus_alt f896
+humidity_high f163
+humidity_low f164
+humidity_mid f165
+humidity_percentage f87e
+hvac f10e
+ice_skating e50b
+icecream ea69
+ifl e025
+iframe f71b
+iframe_off f71c
+image e3f4
+image_aspect_ratio e3f5
+image_not_supported f116
+image_search e43f
+imagesearch_roller e9b4
+imagesmode efa2
+immunology e0fb
+import_contacts e0e0
+import_export e8d5
+important_devices e912
+in_home_mode e833
+inactive_order e0fc
+inbox e156
+inbox_customize f859
+incomplete_circle e79b
+indeterminate_check_box e909
+info e88e
+info_i f59b
+infrared f87c
+ink_eraser e6d0
+ink_eraser_off e7e3
+ink_highlighter e6d1
+ink_marker e6d2
+ink_pen e6d3
+inpatient e0fe
+input e890
+input_circle f71a
+insert_chart e85c
+insert_chart_filled e85c
+insert_chart_outlined e85c
+insert_comment e24c
+insert_drive_file e66d
+insert_emoticon ea22
+insert_invitation e878
+insert_link e250
+insert_page_break eaca
+insert_photo e3f4
+insert_text f827
+insights f092
+install_desktop eb71
+install_mobile eb72
+instant_mix e026
+integration_instructions ef54
+interactive_space f7ff
+interests e7c8
+interpreter_mode e83b
+inventory e179
+inventory_2 e1a1
+invert_colors e891
+invert_colors_off e0c4
+ios_share e6b8
+iron e583
+iso e3f6
+jamboard_kiosk e9b5
+javascript eb7c
+join f84f
+join_full eaeb
+join_inner eaf4
+join_left eaf2
+join_right eaea
+joystick f5ee
+jump_to_element f719
+kayaking e50c
+kebab_dining e842
+kettle e2b9
+key e73c
+key_off eb84
+key_visualizer f199
+keyboard e312
+keyboard_alt f028
+keyboard_arrow_down e313
+keyboard_arrow_left e314
+keyboard_arrow_right e315
+keyboard_arrow_up e316
+keyboard_backspace e317
+keyboard_capslock e318
+keyboard_capslock_badge f7de
+keyboard_command_key eae7
+keyboard_control_key eae6
+keyboard_double_arrow_down ead0
+keyboard_double_arrow_left eac3
+keyboard_double_arrow_right eac9
+keyboard_double_arrow_up eacf
+keyboard_external_input f7dd
+keyboard_full f7dc
+keyboard_hide e31a
+keyboard_keys f67b
+keyboard_off f67a
+keyboard_onscreen f7db
+keyboard_option_key eae8
+keyboard_previous_language f7da
+keyboard_return e31b
+keyboard_tab e31c
+keyboard_tab_rtl ec73
+keyboard_voice e31d
+king_bed ea45
+kitchen eb47
+kitesurfing e50d
+lab_panel e103
+lab_profile e104
+lab_research f80b
+label e893
+label_important e948
+label_important_outline e948
+label_off e9b6
+label_outline e893
+labs e105
+lan eb2f
+landscape e564
+landslide ebd7
+language e894
+language_chinese_array f766
+language_chinese_cangjie f765
+language_chinese_dayi f764
+language_chinese_pinyin f763
+language_chinese_quick f762
+language_chinese_wubi f761
+language_french f760
+language_gb_english f75f
+language_international f75e
+language_korean_latin f75d
+language_pinyin f75c
+language_spanish f5e9
+language_us f759
+language_us_colemak f75b
+language_us_dvorak f75a
+laps f6b9
+laptop e31e
+laptop_chromebook e31f
+laptop_mac e320
+laptop_windows e321
+lasso_select eb03
+last_page e5dd
+launch e89e
+laundry e2a8
+layers e53b
+layers_clear e53c
+lda e106
+leaderboard f20c
+leak_add e3f8
+leak_remove e3f9
+left_click f718
+left_panel_close f717
+left_panel_open f716
+legend_toggle f11b
+lens e3fa
+lens_blur f029
+letter_switch f758
+library_add e03c
+library_add_check e9b7
+library_books e02f
+library_music e030
+lift_to_talk efa3
+light f02a
+light_group e28b
+light_mode e518
+lightbulb e90f
+lightbulb_circle ebfe
+lightbulb_outline e90f
+line_axis ea9a
+line_curve f757
+line_end f826
+line_end_arrow f81d
+line_end_arrow_notch f81c
+line_end_circle f81b
+line_end_diamond f81a
+line_end_square f819
+line_start f825
+line_start_arrow f818
+line_start_arrow_notch f817
+line_start_circle f816
+line_start_diamond f815
+line_start_square f814
+line_style e919
+line_weight e91a
+linear_scale e260
+link e250
+link_off e16f
+linked_camera e438
+liquor ea60
+list e896
+list_alt e0ee
+list_alt_add f756
+lists e9b9
+live_help e0c6
+live_tv e63b
+living f02b
+local_activity e553
+local_airport e53d
+local_atm e53e
+local_bar e540
+local_cafe eb44
+local_car_wash e542
+local_convenience_store e543
+local_dining e561
+local_drink e544
+local_fire_department f33b
+local_florist e545
+local_gas_station e546
+local_grocery_store e8cc
+local_hospital e548
+local_hotel e549
+local_laundry_service e54a
+local_library e54b
+local_mall e54c
+local_movies e8da
+local_offer f05b
+local_parking e54f
+local_pharmacy e550
+local_phone f0d4
+local_pizza e552
+local_play e553
+local_police ef56
+local_post_office e554
+local_printshop e8ad
+local_see e557
+local_shipping e558
+local_taxi e559
+location_automation f14f
+location_away f150
+location_chip f850
+location_city e7f1
+location_disabled e1b6
+location_home f152
+location_off e0c7
+location_on f1db
+location_pin f1db
+location_searching e1b7
+locator_tag f8c1
+lock e88d
+lock_clock ef57
+lock_open e898
+lock_open_right f656
+lock_outline e88d
+lock_person f8f3
+lock_reset eade
+login ea77
+logo_dev ead6
+logout e9ba
+looks e3fc
+looks_3 e3fb
+looks_4 e3fd
+looks_5 e3fe
+looks_6 e3ff
+looks_one e400
+looks_two e401
+loop e863
+loupe e402
+low_density f79b
+low_priority e16d
+loyalty e89a
+lte_mobiledata f02c
+lte_mobiledata_badge f7d9
+lte_plus_mobiledata f02d
+lte_plus_mobiledata_badge f7d8
+luggage f235
+lunch_dining ea61
+lyrics ec0b
+macro_auto f6f2
+macro_off f8d2
+magic_button f136
+magic_exchange f7f4
+magic_tether f7d7
+magnification_large f83d
+magnification_small f83c
+magnify_docked f7d6
+magnify_fullscreen f7d5
+mail e159
+mail_lock ec0a
+mail_outline e159
+male e58e
+man e4eb
+man_2 f8e1
+man_3 f8e2
+man_4 f8e3
+manage_accounts f02e
+manage_history ebe7
+manage_search f02f
+manga f5e3
+map e55b
+maps_home_work f030
+maps_ugc ef58
+margin e9bb
+mark_as_unread e9bc
+mark_chat_read f18b
+mark_chat_unread f189
+mark_email_read f18c
+mark_email_unread f18a
+mark_unread_chat_alt eb9d
+markunread e159
+markunread_mailbox e89b
+masked_transitions e72e
+masks f218
+match_case f6f1
+match_word f6f0
+matter e907
+maximize e930
+measuring_tape f6af
+media_bluetooth_off f031
+media_bluetooth_on f032
+media_link f83f
+mediation efa7
+medical_information ebed
+medical_mask f80a
+medical_services f109
+medication f033
+medication_liquid ea87
+meeting_room eb4f
+memory e322
+memory_alt f7a3
+menstrual_health f6e1
+menu e5d2
+menu_book ea19
+menu_open e9bd
+merge eb98
+merge_type e252
+message e0c9
+metabolism e10b
+mfg_nest_yale_lock f11d
+mic e31d
+mic_double f5d1
+mic_external_off ef59
+mic_external_on ef5a
+mic_none e31d
+mic_off e02b
+microbiology e10c
+microwave f204
+microwave_gen e847
+military_tech ea3f
+mimo e9be
+mimo_disconnect e9bf
+mindfulness f6e0
+minimize e931
+minor_crash ebf1
+missed_video_call f0ce
+missed_video_call_filled f0ce
+mist e188
+mixture_med e4c8
+mms e618
+mobile_friendly e200
+mobile_off e201
+mobile_screen_share e0e7
+mobiledata_off f034
+mode f345
+mode_comment e253
+mode_cool f166
+mode_cool_off f167
+mode_edit f345
+mode_edit_outline f345
+mode_fan f168
+mode_fan_off ec17
+mode_heat f16a
+mode_heat_cool f16b
+mode_heat_off f16d
+mode_night f036
+mode_of_travel e7ce
+mode_off_on f16f
+mode_standby f037
+model_training f0cf
+monetization_on e263
+money e57d
+money_off f038
+money_off_csred f038
+monitor ef5b
+monitor_heart eaa2
+monitor_weight f039
+monitor_weight_gain f6df
+monitor_weight_loss f6de
+monitoring f190
+monochrome_photos e403
+mood ea22
+mood_bad e7f3
+mop e28d
+more e619
+more_down f196
+more_horiz e5d3
+more_time ea5d
+more_up f197
+more_vert e5d4
+mosque eab2
+motion_blur f0d0
+motion_mode f842
+motion_photos_auto f03a
+motion_photos_off e9c0
+motion_photos_on e9c1
+motion_photos_pause f349
+motion_photos_paused f349
+motion_sensor_active e792
+motion_sensor_alert e784
+motion_sensor_idle e783
+motion_sensor_urgent e78e
+motorcycle e91b
+mountain_flag f5e2
+mouse e323
+move e740
+move_down eb61
+move_group f715
+move_item f1ff
+move_location e741
+move_selection_down f714
+move_selection_left f713
+move_selection_right f712
+move_selection_up f711
+move_to_inbox e168
+move_up eb64
+moved_location e594
+movie e404
+movie_creation e404
+movie_edit f840
+movie_filter e43a
+movie_info e02d
+moving e501
+moving_beds e73d
+moving_ministry e73e
+mp e9c3
+multicooker e293
+multiline_chart e6df
+multiple_stop f1b9
+museum ea36
+music_note e405
+music_off e440
+music_video e063
+my_location e55c
+mystery f5e1
+nat ef5c
+nature e406
+nature_people e407
+navigate_before e408
+navigate_next e409
+navigation e55d
+near_me e569
+near_me_disabled f1ef
+nearby e6b7
+nearby_error f03b
+nearby_off f03c
+nephrology e10d
+nest_audio ebbf
+nest_cam_floodlight f8b7
+nest_cam_indoor f11e
+nest_cam_iq f11f
+nest_cam_iq_outdoor f120
+nest_cam_magnet_mount f8b8
+nest_cam_outdoor f121
+nest_cam_stand f8b9
+nest_cam_wall_mount f8ba
+nest_cam_wired_stand ec16
+nest_clock_farsight_analog f8bb
+nest_clock_farsight_digital f8bc
+nest_connect f122
+nest_detect f123
+nest_display f124
+nest_display_max f125
+nest_doorbell_visitor f8bd
+nest_eco_leaf f8be
+nest_farsight_weather f8bf
+nest_found_savings f8c0
+nest_gale_wifi f579
+nest_heat_link_e f126
+nest_heat_link_gen_3 f127
+nest_hello_doorbell e82c
+nest_locator_tag f8c1
+nest_mini e789
+nest_multi_room f8c2
+nest_protect e68e
+nest_remote f5db
+nest_remote_comfort_sensor f12a
+nest_secure_alarm f12b
+nest_sunblock f8c3
+nest_tag f8c1
+nest_thermostat e68f
+nest_thermostat_e_eu f12d
+nest_thermostat_gen_3 f12e
+nest_thermostat_sensor f12f
+nest_thermostat_sensor_eu f130
+nest_thermostat_zirconium_eu f131
+nest_true_radiant f8c4
+nest_wake_on_approach f8c5
+nest_wake_on_press f8c6
+nest_wifi_gale f132
+nest_wifi_mistral f133
+nest_wifi_point f134
+nest_wifi_point_vento f134
+nest_wifi_router f133
+network_cell e1b9
+network_check e640
+network_intelligence_history f5f6
+network_intelligence_update f5f5
+network_locked e61a
+network_manage f7ab
+network_ping ebca
+network_wifi e1ba
+network_wifi_1_bar ebe4
+network_wifi_1_bar_locked f58f
+network_wifi_2_bar ebd6
+network_wifi_2_bar_locked f58e
+network_wifi_3_bar ebe1
+network_wifi_3_bar_locked f58d
+neurology e10e
+new_label e609
+new_releases ef76
+new_window f710
+news e032
+newsmode efad
+newspaper eb81
+next_plan ef5d
+next_week e16a
+nfc e1bb
+night_shelter f1f1
+night_sight_auto f1d7
+night_sight_auto_off f1f9
+night_sight_max f6c3
+nightlife ea62
+nightlight f03d
+nightlight_round f03d
+nights_stay ea46
+no_accounts f03e
+no_adult_content f8fe
+no_backpack f237
+no_crash ebf0
+no_drinks f1a5
+no_encryption f03f
+no_encryption_gmailerrorred f03f
+no_flash f1a6
+no_food f1a7
+no_luggage f23b
+no_meals f1d6
+no_meeting_room eb4e
+no_photography f1a8
+no_sim e1ce
+no_sound e710
+no_stroller f1af
+no_transfer f1d5
+noise_aware ebec
+noise_control_off ebf3
+noise_control_on f8a8
+nordic_walking e50e
+north f1e0
+north_east f1e1
+north_west f1e2
+not_accessible f0fe
+not_interested f326
+not_listed_location e575
+not_started f0d1
+note e66d
+note_add e89c
+note_alt f040
+notes e26c
+notification_add e399
+notification_important e004
+notification_multiple e6c2
+notifications e7f5
+notifications_active e7f7
+notifications_none e7f5
+notifications_off e7f6
+notifications_paused e7f8
+numbers eac7
+nutrition e110
+ods e6e8
+odt e6e9
+offline_bolt e932
+offline_pin e90a
+offline_share e9c5
+oil_barrel ec15
+on_device_training ebfd
+oncology e114
+ondemand_video e63b
+online_prediction f0eb
+onsen f6f8
+opacity e91c
+open_in_browser e89d
+open_in_full f1ce
+open_in_new e89e
+open_in_new_down f70f
+open_in_new_off e4f6
+open_in_phone e702
+open_jam efae
+open_with e89f
+ophthalmology e115
+oral_disease e116
+order_approve f812
+order_play f811
+orthopedics f897
+other_admission e47b
+other_houses e58c
+outbound e1ca
+outbox ef5f
+outbox_alt eb17
+outdoor_garden e205
+outdoor_grill ea47
+outgoing_mail f0d2
+outlet f1d4
+outlined_flag ea1a
+outpatient e118
+outpatient_med e119
+output ebbe
+output_circle f70e
+oven_gen e843
+overview e4a7
+overview_key f7d4
+oxygen_saturation e4de
+pace f6b8
+pacemaker e656
+package e48f
+padding e9c8
+page_control e731
+page_info f614
+pages e7f9
+pageview e8a0
+paid f041
+palette e40a
+pallet f86a
+pan_tool e925
+pan_tool_alt ebb9
+pan_zoom f655
+panorama e40b
+panorama_fish_eye e40c
+panorama_horizontal e40d
+panorama_photosphere e9c9
+panorama_vertical e40e
+panorama_wide_angle e40f
+paragliding e50f
+park ea63
+partly_cloudy_day f172
+partly_cloudy_night f174
+partner_exchange f7f9
+partner_reports efaf
+party_mode e7fa
+password f042
+patient_list e653
+pattern f043
+pause e034
+pause_circle e1a2
+pause_circle_filled e1a2
+pause_circle_outline e1a2
+pause_presentation e0ea
+payment e8a1
+payments ef63
+pedal_bike eb29
+pediatrics e11d
+pen_size_1 f755
+pen_size_2 f754
+pen_size_3 f753
+pen_size_4 f752
+pen_size_5 f751
+pending ef64
+pending_actions f1bb
+pentagon eb50
+people ea21
+people_alt ea21
+people_outline ea21
+percent eb58
+performance_max e51a
+pergola e203
+perm_camera_mic e8a2
+perm_contact_calendar e8a3
+perm_data_setting e8a4
+perm_device_information e8a5
+perm_identity f0d3
+perm_media e8a7
+perm_phone_msg e8a8
+perm_scan_wifi e8a9
+person f0d3
+person_2 f8e4
+person_3 f8e5
+person_4 f8e6
+person_add ea4d
+person_add_alt ea4d
+person_add_disabled e9cb
+person_apron f5a3
+person_book f5e8
+person_celebrate f7fe
+person_filled f0d3
+person_off e510
+person_outline f0d3
+person_pin e55a
+person_pin_circle e56a
+person_play f7fd
+person_raised_hand f59a
+person_remove ef66
+person_search f106
+personal_injury e6da
+personal_video e333
+pest_control f0fa
+pest_control_rodent f0fd
+pet_supplies efb1
+pets e91d
+phishing ead7
+phone f0d4
+phone_alt f0d4
+phone_android e324
+phone_bluetooth_speaker e61b
+phone_callback e649
+phone_disabled e9cc
+phone_enabled e9cd
+phone_forwarded e61c
+phone_in_talk e61d
+phone_iphone e325
+phone_locked e61e
+phone_missed e61f
+phone_paused e620
+phonelink e326
+phonelink_erase e0db
+phonelink_lock e0dc
+phonelink_off e327
+phonelink_ring e0dd
+phonelink_ring_off f7aa
+phonelink_setup ef41
+photo e432
+photo_album e411
+photo_camera e412
+photo_camera_back ef68
+photo_camera_front ef69
+photo_filter e43b
+photo_frame f0d9
+photo_library e413
+photo_prints efb2
+photo_size_select_actual e432
+photo_size_select_large e433
+photo_size_select_small e434
+php eb8f
+physical_therapy e11e
+piano e521
+piano_off e520
+picture_as_pdf e415
+picture_in_picture e8aa
+picture_in_picture_alt e911
+pie_chart f044
+pie_chart_filled f044
+pie_chart_outline f044
+pie_chart_outlined f044
+pill e11f
+pill_off f809
+pin f045
+pin_drop e55e
+pin_end e767
+pin_invoke e763
+pinch eb38
+pinch_zoom_in f1fa
+pinch_zoom_out f1fb
+pip f64d
+pip_exit f70d
+pivot_table_chart e9ce
+place f1db
+place_item f1f0
+plagiarism ea5a
+planner_banner_ad_pt e692
+play_arrow e037
+play_circle e1c4
+play_disabled ef6a
+play_for_work e906
+play_lesson f047
+play_music e022
+play_pause f137
+play_shapes f7fc
+playing_cards f5dc
+playlist_add e03b
+playlist_add_check e065
+playlist_add_check_circle e7e6
+playlist_add_circle e7e5
+playlist_play e05f
+playlist_remove eb80
+plumbing f107
+plus_one e800
+podcasts f048
+podiatry e120
+podium f7fb
+point_of_sale f17e
+point_scan f70c
+policy ea17
+poll e85c
+polyline ebbb
+polymer e8ab
+pool eb48
+portable_wifi_off f087
+portrait e851
+position_bottom_left f70b
+position_bottom_right f70a
+position_top_right f709
+post e705
+post_add ea20
+potted_plant f8aa
+power e63c
+power_input e336
+power_off e646
+power_rounded f8c7
+power_settings_new e8ac
+prayer_times f838
+precision_manufacturing f049
+pregnancy f5f1
+pregnant_woman f5f1
+preliminary e7d8
+prescriptions e121
+present_to_all e0df
+preview f1c5
+preview_off f7af
+price_change f04a
+price_check f04b
+print e8ad
+print_add f7a2
+print_connect f7a1
+print_disabled e9cf
+print_error f7a0
+print_lock f651
+priority e19f
+priority_high e645
+privacy f148
+privacy_tip f0dc
+private_connectivity e744
+problem e122
+procedure e651
+process_chart f855
+production_quantity_limits e1d1
+productivity e296
+progress_activity e9d0
+propane ec14
+propane_tank ec13
+psychiatry e123
+psychology ea4a
+psychology_alt f8ea
+public e80b
+public_off f1ca
+publish e255
+published_with_changes f232
+pulmonology e124
+punch_clock eaa8
+push_pin f10d
+qr_code ef6b
+qr_code_2 e00a
+qr_code_2_add f658
+qr_code_scanner f206
+query_builder efd6
+query_stats e4fc
+question_answer e8af
+question_exchange f7f3
+question_mark eb8b
+queue e03c
+queue_music e03d
+queue_play_next e066
+quick_phrases e7d1
+quick_reference e46e
+quick_reference_all f801
+quickreply ef6c
+quiet_time e1f9
+quiet_time_active e291
+quiz f04c
+r_mobiledata f04d
+radar f04e
+radio e03e
+radio_button_checked e837
+radio_button_unchecked e836
+radiology e125
+railway_alert e9d1
+rainy f176
+rainy_heavy f61f
+rainy_light f61e
+rainy_snow f61d
+ramen_dining ea64
+ramp_left eb9c
+ramp_right eb96
+range_hood e1ea
+rate_review e560
+raw_off f04f
+raw_on f050
+read_more ef6d
+readiness_score f6dd
+real_estate_agent e73a
+rear_camera f6c2
+rebase f845
+rebase_edit f846
+receipt e8b0
+receipt_long ef6e
+recent_actors e03f
+recent_patient f808
+recommend e9d2
+record_voice_over e91f
+rectangle eb54
+recycling e760
+redeem e8f6
+redo e15a
+reduce_capacity f21c
+refresh e5d5
+regular_expression f750
+relax f6dc
+release_alert f654
+remember_me f051
+reminder e695
+reminders_alt e695
+remote_gen e83e
+remove e15b
+remove_circle f08f
+remove_circle_outline f08f
+remove_done e9d3
+remove_from_queue e067
+remove_moderator e9d4
+remove_red_eye e8f4
+remove_road ebfc
+remove_selection e9d5
+remove_shopping_cart e928
+reopen_window f708
+reorder e8fe
+repartition f8e8
+repeat e040
+repeat_on e9d6
+repeat_one e041
+repeat_one_on e9d7
+replay e042
+replay_10 e059
+replay_30 e05a
+replay_5 e05b
+replay_circle_filled e9d8
+reply e15e
+reply_all e15f
+report f052
+report_gmailerrorred f052
+report_off e170
+report_problem f083
+request_page f22c
+request_quote f1b6
+reset_image f824
+reset_tv e9d9
+resize f707
+respiratory_rate e127
+restart_alt f053
+restaurant e56c
+restaurant_menu e561
+restore e8b3
+restore_from_trash e938
+restore_page e929
+resume f7d0
+reviews f054
+rewarded_ads efb6
+rheumatology e128
+rib_cage f898
+rice_bowl f1f5
+right_click f706
+right_panel_close f705
+right_panel_open f704
+ring_volume f0dd
+ring_volume_filled f0dd
+ripples e9db
+robot f882
+robot_2 f5d0
+rocket eba5
+rocket_launch eb9b
+roller_shades ec12
+roller_shades_closed ec11
+roller_skating ebcd
+roofing f201
+room f1db
+room_preferences f1b8
+room_service eb49
+rotate_90_degrees_ccw e418
+rotate_90_degrees_cw eaab
+rotate_left e419
+rotate_right e41a
+roundabout_left eb99
+roundabout_right eba3
+rounded_corner e920
+route eacd
+router e328
+routine e20c
+rowing e921
+rss_feed e0e5
+rsvp f055
+rtt e9ad
+rule f1c2
+rule_folder f1c9
+rule_settings f64c
+run_circle ef6f
+running_with_errors e51d
+rv_hookup e642
+safety_check ebef
+safety_check_off f59d
+safety_divider e1cc
+sailing e502
+salinity f876
+sanitizer f21d
+satellite e562
+satellite_alt eb3a
+sauna f6f7
+save e161
+save_alt f090
+save_as eb60
+saved_search ea11
+savings e2eb
+scale eb5f
+scan f74e
+scan_delete f74f
+scanner e329
+scatter_plot e268
+scene e2a7
+schedule efd6
+schedule_send ea0a
+schema e4fd
+school e80c
+science ea4b
+score e269
+scoreboard ebd0
+screen_lock_landscape e1be
+screen_lock_portrait e1bf
+screen_lock_rotation e1c0
+screen_record f679
+screen_rotation e1c1
+screen_rotation_alt ebee
+screen_rotation_up f678
+screen_search_desktop ef70
+screen_share e0e2
+screenshot f056
+screenshot_frame f677
+screenshot_keyboard f7d3
+screenshot_monitor ec08
+screenshot_region f7d2
+screenshot_tablet f697
+scrollable_header e9dc
+scuba_diving ebce
+sd e9dd
+sd_card e623
+sd_card_alert f057
+sd_storage e623
+search e8b6
+search_check f800
+search_off ea76
+security e32a
+security_update f072
+security_update_good f073
+security_update_warning f074
+segment e94b
+select f74d
+select_all e162
+select_check_box f1fe
+select_to_speak f7cf
+select_window e6fa
+select_window_off e506
+self_care f86d
+self_improvement ea78
+sell f05b
+send e163
+send_and_archive ea0c
+send_money e8b7
+send_time_extension eadb
+send_to_mobile f05c
+sensor_door f1b5
+sensor_occupied ec10
+sensor_window f1b4
+sensors e51e
+sensors_off e51f
+sentiment_calm f6a7
+sentiment_content f6a6
+sentiment_dissatisfied e811
+sentiment_excited f6a5
+sentiment_extremely_dissatisfied f194
+sentiment_frustrated f6a4
+sentiment_neutral e812
+sentiment_sad f6a3
+sentiment_satisfied e813
+sentiment_satisfied_alt e813
+sentiment_stressed f6a2
+sentiment_very_dissatisfied e814
+sentiment_very_satisfied e815
+sentiment_worried f6a1
+set_meal f1ea
+settings e8b8
+settings_accessibility f05d
+settings_account_box f835
+settings_alert f143
+settings_applications e8b9
+settings_b_roll f625
+settings_backup_restore e8ba
+settings_bluetooth e8bb
+settings_brightness e8bd
+settings_cell e8bc
+settings_cinematic_blur f624
+settings_ethernet e8be
+settings_input_antenna e8bf
+settings_input_component e8c0
+settings_input_composite e8c0
+settings_input_hdmi e8c2
+settings_input_svideo e8c3
+settings_motion_mode f833
+settings_night_sight f832
+settings_overscan e8c4
+settings_panorama f831
+settings_phone e8c5
+settings_photo_camera f834
+settings_power e8c6
+settings_remote e8c7
+settings_slow_motion f623
+settings_suggest f05e
+settings_system_daydream e1c3
+settings_timelapse f622
+settings_video_camera f621
+settings_voice e8c8
+settop_component e2ac
+severe_cold ebd3
+shadow e9df
+shadow_add f584
+shadow_minus f583
+shape_line f8d3
+shapes e602
+share e80d
+share_location f05f
+share_off f6cb
+share_reviews f8a4
+share_windows f613
+sheets_rtl f823
+shelf_auto_hide f703
+shelf_position f702
+shelves f86e
+shield e9e0
+shield_lock f686
+shield_locked f592
+shield_moon eaa9
+shield_person f650
+shield_with_heart e78f
+shield_with_house e78d
+shift e5f2
+shift_lock f7ae
+shop e8c9
+shop_2 e8ca
+shop_two e8ca
+shopping_bag f1cc
+shopping_basket e8cb
+shopping_cart e8cc
+shopping_cart_checkout eb88
+short_stay e4d0
+short_text e261
+shortcut f57a
+show_chart e6e1
+shower f061
+shuffle e043
+shuffle_on e9e1
+shutter_speed e43d
+shutter_speed_add f57e
+shutter_speed_minus f57d
+sick f220
+side_navigation e9e2
+sign_language ebe5
+signal_cellular_0_bar f0a8
+signal_cellular_1_bar f0a9
+signal_cellular_2_bar f0aa
+signal_cellular_3_bar f0ab
+signal_cellular_4_bar e1c8
+signal_cellular_add f7a9
+signal_cellular_alt e202
+signal_cellular_alt_1_bar ebdf
+signal_cellular_alt_2_bar ebe3
+signal_cellular_connected_no_internet_0_bar f0ac
+signal_cellular_connected_no_internet_4_bar e1cd
+signal_cellular_no_sim e1ce
+signal_cellular_nodata f062
+signal_cellular_null e1cf
+signal_cellular_off e1d0
+signal_cellular_pause f5a7
+signal_disconnected f239
+signal_wifi_0_bar f0b0
+signal_wifi_4_bar f065
+signal_wifi_4_bar_lock e1e1
+signal_wifi_bad f064
+signal_wifi_connected_no_internet_4 f064
+signal_wifi_off e1da
+signal_wifi_statusbar_4_bar f065
+signal_wifi_statusbar_not_connected f0ef
+signal_wifi_statusbar_null f067
+signature f74c
+signpost eb91
+sim_card e32b
+sim_card_alert f057
+sim_card_download f068
+single_bed ea48
+sip f069
+skateboarding e511
+skeleton f899
+skip_next e044
+skip_previous e045
+skull f89a
+sledding e512
+sleep e213
+sleep_score f6b7
+slide_library f822
+sliders e9e3
+slideshow e41b
+slow_motion_video e068
+smart_button f1c1
+smart_display f06a
+smart_outlet e844
+smart_screen f06b
+smart_toy f06c
+smartphone e32c
+smb_share f74b
+smoke_free eb4a
+smoking_rooms eb4b
+sms e625
+sms_failed e87f
+snippet_folder f1c7
+snooze e046
+snowboarding e513
+snowing e80f
+snowing_heavy f61c
+snowmobile e503
+snowshoeing e514
+soap f1b2
+social_distance e1cb
+social_leaderboard f6a0
+solar_power ec0f
+sort e164
+sort_by_alpha e053
+sos ebf7
+sound_detection_dog_barking f149
+sound_detection_glass_break f14a
+sound_detection_loud_sound f14b
+sound_sampler f6b4
+soup_kitchen e7d3
+source f1c8
+source_notes e12d
+south f1e3
+south_america e7e4
+south_east f1e4
+south_west f1e5
+spa eb4c
+space_bar e256
+space_dashboard e66b
+spatial_audio ebeb
+spatial_audio_off ebe8
+spatial_tracking ebea
+speaker e32d
+speaker_group e32e
+speaker_notes e8cd
+speaker_notes_off e92a
+speaker_phone e0d2
+special_character f74a
+specific_gravity f872
+speech_to_text f8a7
+speed e9e4
+spellcheck e8ce
+splitscreen f06d
+splitscreen_bottom f676
+splitscreen_left f675
+splitscreen_right f674
+splitscreen_top f673
+spo2 f6db
+spoke e9a7
+sports ea30
+sports_bar f1f3
+sports_baseball ea51
+sports_basketball ea26
+sports_cricket ea27
+sports_esports ea28
+sports_football ea29
+sports_golf ea2a
+sports_gymnastics ebc4
+sports_handball ea33
+sports_hockey ea2b
+sports_kabaddi ea34
+sports_martial_arts eae9
+sports_mma ea2c
+sports_motorsports ea2d
+sports_rugby ea2e
+sports_score f06e
+sports_soccer ea2f
+sports_tennis ea32
+sports_volleyball ea31
+sprinkler e29a
+sprint f81f
+square eb36
+square_foot ea49
+ssid_chart eb66
+stack f609
+stack_off f608
+stack_star f607
+stacked_bar_chart e9e6
+stacked_email e6c7
+stacked_inbox e6c9
+stacked_line_chart f22b
+stadia_controller f135
+stadium eb90
+stairs f1a9
+star e838
+star_border e885
+star_border_purple500 e885
+star_half e839
+star_outline e885
+star_purple500 e838
+star_rate f0ec
+star_rate_half ec45
+stars e8d0
+start e089
+stat_1 e698
+stat_2 e699
+stat_3 e69a
+stat_minus_1 e69b
+stat_minus_2 e69c
+stat_minus_3 e69d
+stay_current_landscape e0d3
+stay_current_portrait e0d4
+stay_primary_landscape e0d5
+stay_primary_portrait e0d6
+step f6fe
+step_into f701
+step_out f700
+step_over f6ff
+steppers e9e7
+steps f6da
+stethoscope f805
+stethoscope_arrow f807
+stethoscope_check f806
+sticky_note e9e8
+sticky_note_2 f1fc
+stop e047
+stop_circle ef71
+stop_screen_share e0e3
+storage e1db
+store e8d1
+store_mall_directory e8d1
+storefront ea12
+storm f070
+straight eb95
+straighten e41c
+strategy f5df
+stream e9e9
+stream_apps f79f
+streetview e56e
+stress_management f6d9
+strikethrough_s e257
+stroke_full f749
+stroke_partial f748
+stroller f1ae
+style e41d
+styler e273
+stylus f604
+stylus_laser_pointer f747
+stylus_note f603
+subdirectory_arrow_left e5d9
+subdirectory_arrow_right e5da
+subheader e9ea
+subject e8d2
+subscript f111
+subscriptions e064
+subtitles e048
+subtitles_off ef72
+subway e56f
+summarize f071
+sunny e81a
+sunny_snowing e819
+superscript f112
+supervised_user_circle e939
+supervised_user_circle_off f60e
+supervisor_account e8d3
+support ef73
+support_agent f0e2
+surfing e515
+surgical e131
+surround_sound e049
+swap_calls e0d7
+swap_driving_apps_wheel e69f
+swap_horiz e8d4
+swap_horizontal_circle e933
+swap_vert e8d5
+swap_vertical_circle e8d6
+sweep e6ac
+swipe e9ec
+swipe_down eb53
+swipe_down_alt eb30
+swipe_left eb59
+swipe_left_alt eb33
+swipe_right eb52
+swipe_right_alt eb56
+swipe_up eb2e
+swipe_up_alt eb35
+swipe_vertical eb51
+switch e1f4
+switch_access f6fd
+switch_access_shortcut e7e1
+switch_access_shortcut_add e7e2
+switch_account e9ed
+switch_camera e41e
+switch_left f1d1
+switch_right f1d2
+switch_video e41f
+switches e733
+sword_rose f5de
+swords f889
+symptoms e132
+synagogue eab0
+sync e627
+sync_alt ea18
+sync_disabled e628
+sync_lock eaee
+sync_problem e629
+sync_saved_locally f820
+syringe e133
+system_security_update f072
+system_security_update_good f073
+system_security_update_warning f074
+system_update f072
+system_update_alt e8d7
+tab e8d8
+tab_close f745
+tab_close_right f746
+tab_duplicate f744
+tab_group f743
+tab_move f742
+tab_new_right f741
+tab_recent f740
+tab_unselected e8d9
+table f191
+table_bar ead2
+table_chart e265
+table_chart_view f6ef
+table_lamp e1f2
+table_restaurant eac6
+table_rows f101
+table_rows_narrow f73f
+table_view f1be
+tablet e32f
+tablet_android e330
+tablet_mac e331
+tabs e9ee
+tag e9ef
+tag_faces ea22
+takeout_dining ea74
+tamper_detection_off e82e
+tamper_detection_on f8c8
+tap_and_play e62b
+tapas f1e9
+target e719
+task f075
+task_alt e2e6
+taunt f69f
+taxi_alert ef74
+team_dashboard e013
+temp_preferences_custom f8c9
+temp_preferences_eco f8ca
+temple_buddhist eab3
+temple_hindu eaaf
+tenancy f0e3
+terminal eb8e
+terrain e564
+text_ad e728
+text_decrease eadd
+text_fields e262
+text_format e165
+text_increase eae2
+text_rotate_up e93a
+text_rotate_vertical e93b
+text_rotation_angledown e93c
+text_rotation_angleup e93d
+text_rotation_down e93e
+text_rotation_none e93f
+text_select_end f73e
+text_select_jump_to_beginning f73d
+text_select_jump_to_end f73c
+text_select_move_back_character f73b
+text_select_move_back_word f73a
+text_select_move_down f739
+text_select_move_forward_character f738
+text_select_move_forward_word f737
+text_select_move_up f736
+text_select_start f735
+text_snippet f1c6
+text_to_speech f1bc
+textsms e625
+texture e421
+texture_add f57c
+texture_minus f57b
+theater_comedy ea66
+theaters e8da
+thermometer e846
+thermometer_add f582
+thermometer_gain f6d8
+thermometer_loss f6d7
+thermometer_minus f581
+thermostat f076
+thermostat_auto f077
+thermostat_carbon f178
+thumb_down f578
+thumb_down_alt f578
+thumb_down_filled f578
+thumb_down_off f578
+thumb_down_off_alt f578
+thumb_up f577
+thumb_up_alt f577
+thumb_up_filled f577
+thumb_up_off f577
+thumb_up_off_alt f577
+thumbnail_bar f734
+thumbs_up_down e8dd
+thunderstorm ebdb
+tibia f89b
+tibia_alt f89c
+time_auto f0e4
+time_to_leave eff7
+timelapse e422
+timeline e922
+timer e425
+timer_10 e423
+timer_10_alt_1 efbf
+timer_10_select f07a
+timer_3 e424
+timer_3_alt_1 efc0
+timer_3_select f07b
+timer_off e426
+tips_and_updates e79a
+tire_repair ebc8
+title e264
+toast efc1
+toc e8de
+today e8df
+toggle_off e9f5
+toggle_on e9f6
+token ea25
+toll e8e0
+tonality e427
+toolbar e9f7
+tools_flat_head f8cb
+tools_installation_kit e2ab
+tools_ladder e2cb
+tools_level e77b
+tools_phillips f8cc
+tools_pliers_wire_stripper e2aa
+tools_power_drill e1e9
+tools_wrench f8cd
+tooltip e9f8
+top_panel_close f733
+top_panel_open f732
+topic f1c8
+tornado e199
+total_dissolved_solids f877
+touch_app e913
+touchpad_mouse f687
+tour ef75
+toys e332
+toys_fan f887
+track_changes e8e1
+traffic e565
+trail_length eb5e
+trail_length_medium eb63
+trail_length_short eb6d
+train e570
+tram e571
+transcribe f8ec
+transfer_within_a_station e572
+transform e428
+transgender e58d
+transit_enterexit e579
+translate e8e2
+transportation e21d
+travel e6ca
+travel_explore e2db
+trending_down e8e3
+trending_flat e8e4
+trending_up e8e5
+trip_origin e57b
+trolley f86b
+trophy ea23
+troubleshoot e1d2
+try f054
+tsunami ebd8
+tsv e6d6
+tty f1aa
+tune e429
+tungsten f00d
+turn_left eba6
+turn_right ebab
+turn_sharp_left eba7
+turn_sharp_right ebaa
+turn_slight_left eba4
+turn_slight_right eb9a
+turned_in e8e7
+turned_in_not e8e7
+tv e333
+tv_gen e830
+tv_guide e1dc
+tv_off e647
+tv_options_edit_channels e1dd
+tv_remote f5d9
+tv_signin e71b
+tv_with_assistant e785
+two_wheeler e9f9
+type_specimen f8f0
+u_turn_left eba1
+u_turn_right eba2
+ulna_radius f89d
+ulna_radius_alt f89e
+umbrella f1ad
+unarchive e169
+undo e166
+unfold_less e5d6
+unfold_less_double f8cf
+unfold_more e5d7
+unfold_more_double f8d0
+ungroup f731
+universal_currency_alt e734
+unknown_2 e6a2
+unknown_5 e6a5
+unknown_document f804
+unknown_med eabd
+unpublished f236
+unsubscribe e0eb
+upcoming f07e
+update e923
+update_disabled e075
+upgrade f0fb
+upload f09b
+upload_file e9fc
+urology e137
+usb e1e0
+usb_off e4fa
+vaccines e138
+valve e224
+vape_free ebc6
+vaping_rooms ebcf
+variables f851
+ventilator e139
+verified ef76
+verified_user f013
+vertical_align_bottom e258
+vertical_align_center e259
+vertical_align_top e25a
+vertical_distribute e076
+vertical_shades ec0e
+vertical_shades_closed ec0d
+vertical_split e949
+vibration e62d
+video_call e070
+video_camera_back f07f
+video_camera_front f080
+video_camera_front_off f83b
+video_chat f8a0
+video_file eb87
+video_label e071
+video_library e04a
+video_search efc6
+video_settings ea75
+video_stable f081
+videocam e04b
+videocam_off e04c
+videogame_asset e338
+videogame_asset_off e500
+view_agenda e8e9
+view_array e8ea
+view_carousel e8eb
+view_column e8ec
+view_column_2 f847
+view_comfy e42a
+view_comfy_alt eb73
+view_compact e42b
+view_compact_alt eb74
+view_cozy eb75
+view_day e8ed
+view_headline e8ee
+view_in_ar efc9
+view_in_ar_new efc9
+view_in_ar_off f61b
+view_kanban eb7f
+view_list e8ef
+view_module e8f0
+view_quilt e8f1
+view_sidebar f114
+view_stream e8f2
+view_timeline eb85
+view_week e8f3
+vignette e435
+villa e586
+visibility e8f4
+visibility_lock f653
+visibility_off e8f5
+vital_signs e650
+vitals e13b
+voice_chat e62e
+voice_over_off e94a
+voice_selection f58a
+voicemail e0d9
+volcano ebda
+volume_down e04d
+volume_down_alt e79c
+volume_mute e04e
+volume_off e04f
+volume_up e050
+volunteer_activism ea70
+voting_chip f852
+vpn_key e0da
+vpn_key_alert f6cc
+vpn_key_off eb7a
+vpn_lock e62f
+vr180_create2d efca
+vrpano f082
+wall_art efcb
+wall_lamp e2b4
+wallet f8ff
+wallpaper e1bc
+wallpaper_slideshow f672
+ward e13c
+warehouse ebb8
+warning f083
+warning_amber f083
+warning_off f7ad
+wash f1b1
+watch e334
+watch_button_press f6aa
+watch_later efd6
+watch_off eae3
+watch_screentime f6ae
+watch_wake f6a9
+water f084
+water_bottle f69d
+water_bottle_large f69e
+water_damage f203
+water_do f870
+water_drop e798
+water_ec f875
+water_full f6d6
+water_heater e284
+water_lock f6ad
+water_loss f6d5
+water_lux f874
+water_medium f6d4
+water_orp f878
+water_ph f87a
+water_pump f5d8
+water_voc f87b
+waterfall_chart ea00
+waves e176
+waving_hand e766
+wb_auto e42c
+wb_cloudy f15c
+wb_incandescent f07d
+wb_iridescent f00d
+wb_shade ea01
+wb_sunny e430
+wb_twilight e1c6
+wc e63d
+weather_hail f67f
+weather_mix f60b
+weather_snowy e2cd
+web e051
+web_asset e069
+web_asset_off ef47
+web_stories e595
+webhook eb92
+weekend e16b
+weight e13d
+west f1e6
+whatshot e80e
+wheelchair_pickup f1ab
+where_to_vote e177
+widgets e1bd
+width f730
+width_full f8f5
+width_normal f8f6
+width_wide f8f7
+wifi e63e
+wifi_1_bar e4ca
+wifi_2_bar e4d9
+wifi_add f7a8
+wifi_calling ef77
+wifi_calling_1 f0e7
+wifi_calling_2 f0e7
+wifi_calling_3 f0e7
+wifi_channel eb6a
+wifi_find eb31
+wifi_home f671
+wifi_lock e1e1
+wifi_notification f670
+wifi_off e648
+wifi_password eb6b
+wifi_protected_setup f0fc
+wifi_proxy f7a7
+wifi_tethering e1e2
+wifi_tethering_error ead9
+wifi_tethering_off f087
+wind_power ec0c
+window f088
+window_closed e77e
+window_open e78c
+window_sensor e2bb
+wine_bar f1e8
+woman e13e
+woman_2 f8e7
+work e943
+work_alert f5f7
+work_history ec09
+work_off e942
+work_outline e943
+work_update f5f8
+workflow e985
+workspace_premium e7af
+workspaces e1a0
+workspaces_outline e1a0
+wounds_injuries e13f
+wrap_text e25b
+wrist f69c
+wrong_location ef78
+wysiwyg f1c3
+yard f089
+your_trips eb2b
+youtube_activity f85a
+youtube_searched_for e8fa
+zone_person_alert e781
+zone_person_idle e77a
+zone_person_urgent e788
+zoom_in e8ff
+zoom_in_map eb2d
+zoom_out e900
+zoom_out_map e56b
diff --git a/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.ttf b/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.ttf
new file mode 100644
index 0000000..257b9c3
Binary files /dev/null and b/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.ttf differ
diff --git a/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.woff2 b/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.woff2
new file mode 100644
index 0000000..41eb33c
Binary files /dev/null and b/public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.woff2 differ
diff --git a/public/fonts/Poppins/Poppins.ttf b/public/fonts/Poppins/Poppins.ttf
new file mode 100644
index 0000000..74c726e
Binary files /dev/null and b/public/fonts/Poppins/Poppins.ttf differ
diff --git a/public/fonts/SpaceGrotesk/SpaceGrotesk.ttf b/public/fonts/SpaceGrotesk/SpaceGrotesk.ttf
new file mode 100644
index 0000000..cf0b503
Binary files /dev/null and b/public/fonts/SpaceGrotesk/SpaceGrotesk.ttf differ
diff --git a/public/fonts/SpaceMono/SpaceMono.ttf b/public/fonts/SpaceMono/SpaceMono.ttf
new file mode 100644
index 0000000..04e56b9
Binary files /dev/null and b/public/fonts/SpaceMono/SpaceMono.ttf differ
diff --git a/public/fonts/TrollCallDisplay/TrollCallDisplay.otf b/public/fonts/TrollCallDisplay/TrollCallDisplay.otf
new file mode 100644
index 0000000..8574cbd
Binary files /dev/null and b/public/fonts/TrollCallDisplay/TrollCallDisplay.otf differ
diff --git a/public/fonts/TrollCallDisplay/TrollCallDisplay.woff b/public/fonts/TrollCallDisplay/TrollCallDisplay.woff
new file mode 100644
index 0000000..eb7bf28
Binary files /dev/null and b/public/fonts/TrollCallDisplay/TrollCallDisplay.woff differ
diff --git a/public/fonts/TrollCallDisplay/TrollCallDisplay.woff2 b/public/fonts/TrollCallDisplay/TrollCallDisplay.woff2
new file mode 100644
index 0000000..66b5950
Binary files /dev/null and b/public/fonts/TrollCallDisplay/TrollCallDisplay.woff2 differ
diff --git a/src/components/Box/Box.module.css b/src/components/Box/Box.module.css
new file mode 100644
index 0000000..6109351
--- /dev/null
+++ b/src/components/Box/Box.module.css
@@ -0,0 +1,33 @@
+.Box {
+ background-color: var(--pri-bg);
+ color: var(--pri-fg);
+ border: 1px solid currentColor;
+ border-radius: 2px;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ padding: 8px;
+ width: max-content;
+ max-width: 100%;
+}
+
+.Box.secondary {
+ background-color: var(--sec-bg);
+ color: var(--sec-fg);
+}
+
+.Box.fw {
+ width: 100%;
+}
+
+.Box .innerContent {
+ padding: 4px 4px;
+ padding-top: 8px;
+ display: inline-flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.Box .innerContentNoTitle {
+ padding: 0;
+}
diff --git a/src/components/Box/Box.tsx b/src/components/Box/Box.tsx
new file mode 100644
index 0000000..7c3c318
--- /dev/null
+++ b/src/components/Box/Box.tsx
@@ -0,0 +1,71 @@
+import globals from "@/styles/global.module.css";
+import Conditional, { ConditionalParent } from "@/utility/react/Conditional";
+import { ThemeModeContext } from "@/utility/react/Themer";
+import Link from "next/link";
+import { useContext } from "react";
+import styles from "./Box.module.css";
+import { BoxConfig } from "./types";
+
+export default function Box({
+ children,
+ properties
+}: {
+ children: React.ReactNode;
+ properties?: BoxConfig;
+}) {
+ const inverted = useContext(ThemeModeContext);
+ const style = (
+ properties?.theme
+ ? inverted
+ ? {
+ "--pri-bg": "#" + properties?.theme?.lighten(70).toHex(),
+ "--pri-fg": "#" + properties?.theme?.darken(70).toHex()
+ }
+ : {
+ "--pri-bg": "#" + properties?.theme?.darken(70).toHex(),
+ "--pri-fg": "#" + properties?.theme?.lighten(70).toHex()
+ }
+ : {}
+ ) as React.CSSProperties;
+ return (
+
+
+
+ (
+
+ {children}
+
+ )}
+ >
+ {properties?.title?.text}
+
+
+
+
+ {children}
+
+
+ );
+}
diff --git a/src/components/Box/types.tsx b/src/components/Box/types.tsx
new file mode 100644
index 0000000..79b6cd5
--- /dev/null
+++ b/src/components/Box/types.tsx
@@ -0,0 +1,12 @@
+import { Color3 } from "@/types/assist/color";
+
+export type BoxConfig = {
+ title?: {
+ text: string;
+ link?: string;
+ small?: boolean;
+ };
+ theme?: Color3;
+ nfw?: boolean;
+ class?: string;
+};
diff --git a/src/components/CelesteBox/CelesteBox.module.css b/src/components/CelesteBox/CelesteBox.module.css
new file mode 100644
index 0000000..edf7868
--- /dev/null
+++ b/src/components/CelesteBox/CelesteBox.module.css
@@ -0,0 +1,76 @@
+.CelesteBoxScrim {
+ position: fixed;
+ top: -100vh;
+ left: 0;
+ background-color: #0000;
+ width: 100vw;
+ height: 100vh;
+ backdrop-filter: blur(0px);
+ pointer-events: none;
+ z-index: 8;
+ transition: backdrop-filter 0.5s, background-color 0.5s, top 0.5s step-end;
+}
+
+.CelesteBoxScrim.open {
+ top: 0;
+ background-color: #0008;
+ backdrop-filter: blur(10px);
+ pointer-events: all;
+ transition: backdrop-filter 0.5s, background-color 0.5s;
+}
+
+.CelesteBox {
+ position: fixed;
+ top: -224px;
+ left: 0;
+ margin: 24px;
+ height: 176px;
+ width: calc(100vw - 48px);
+ background-color: black;
+ z-index: 8;
+ transform: scaleY(0);
+ transition: transform 0.25s cubic-bezier(0.25, 0, 1, 0.5),
+ top 0.25s step-end;
+
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ padding: 24px;
+ box-sizing: border-box;
+ gap: 24px;
+}
+
+.CelesteBox.open {
+ top: 56px;
+ transform: scaleY(1);
+ transition: transform 0.25s cubic-bezier(0, 0.25, 0.5, 1);
+}
+
+.CelesteBox .TextHolder {
+ visibility: hidden;
+}
+
+.CelesteBox.open .TextHolder {
+ visibility: visible;
+ transition: visibility 0.25s step-end;
+}
+
+.PortraitHolder {
+ width: 128px;
+ height: 128px;
+}
+
+.TextHolder {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ font-family: "Renogare", "Poppins";
+ color: white;
+ font-size: 28px;
+ line-height: 35px;
+ user-select: none;
+}
diff --git a/src/components/CelesteBox/CelesteBox.tsx b/src/components/CelesteBox/CelesteBox.tsx
new file mode 100644
index 0000000..72cc34d
--- /dev/null
+++ b/src/components/CelesteBox/CelesteBox.tsx
@@ -0,0 +1,58 @@
+// import globals from "@/styles/global.module.css";
+import { useRef, useState } from "react";
+import styles from "./CelesteBox.module.css";
+import TextHandler from "./TextHandler/TextHandler";
+import { DialogList } from "./types";
+
+export default function CelesteBox({ dialogList }: { dialogList: DialogList }) {
+ const [open, setOpen] = useState(false);
+ const [currentDialog, setCurrentDialog] = useState(dialogList.list[0]);
+ const [textboxDone, setTextboxDone] = useState(false);
+ const [wantTextboxDone, setWantTextboxDone] = useState(false);
+ const currentIndex = useRef(0);
+ function openDialog() {
+ console.log("Opening", currentIndex);
+ setOpen(true);
+ currentIndex.current = 0;
+ console.log("Opened", currentIndex);
+ setCurrentDialog(dialogList.list[currentIndex.current]);
+ }
+ function nextDialog() {
+ if (textboxDone) {
+ console.log("Next", currentIndex, currentIndex.current);
+ currentIndex.current += 1;
+ console.log("Next-ed", currentIndex);
+ if (currentIndex.current >= dialogList.list.length) {
+ setOpen(false);
+ return;
+ }
+ setCurrentDialog(dialogList.list[currentIndex.current]);
+ } else {
+ setWantTextboxDone(true);
+ }
+ }
+ return [
+ openDialog,
+
+ ] as [() => void, React.ReactNode];
+}
diff --git a/src/components/CelesteBox/TextHandler/TextHandler.module.css b/src/components/CelesteBox/TextHandler/TextHandler.module.css
new file mode 100644
index 0000000..2f5d85f
--- /dev/null
+++ b/src/components/CelesteBox/TextHandler/TextHandler.module.css
@@ -0,0 +1,35 @@
+@keyframes wavy {
+ 0% {
+ top: -2px;
+ }
+ 50% {
+ top: 2px;
+ }
+ 100% {
+ top: -2px;
+ }
+}
+
+.TextHandler {
+ /* display: inline; */
+ max-width: 80%;
+ white-space: pre-line;
+}
+
+.TextHandler .letter {
+ position: relative;
+ opacity: 0;
+ top: -10px;
+ transition: all 0.2s;
+}
+
+.TextHandler .letter.visible {
+ top: 0px;
+ opacity: 1;
+}
+
+.TextHandler .wavy .letter {
+ animation-duration: 0.75s;
+ animation-timing-function: cubic-bezier(0.5, 0.25, 0.5, 0.75);
+ animation-iteration-count: infinite;
+}
diff --git a/src/components/CelesteBox/TextHandler/TextHandler.tsx b/src/components/CelesteBox/TextHandler/TextHandler.tsx
new file mode 100644
index 0000000..9c269f0
--- /dev/null
+++ b/src/components/CelesteBox/TextHandler/TextHandler.tsx
@@ -0,0 +1,195 @@
+import { useEffect, useRef, useState } from "react";
+import { DialogIndex, ElementArray, wait } from "../types";
+import styles from "./TextHandler.module.css";
+
+export default function TextHandler({
+ dialogIndex,
+ dialogIsOpen,
+ textboxDoneStuff: [textboxDone, setTextboxDone],
+ wantTextboxDoneStuff: [wantTextboxDone, setWantTextboxDone]
+}: {
+ dialogIndex: DialogIndex;
+ dialogIsOpen: boolean;
+ textboxDoneStuff: [boolean, (textboxDone: boolean) => void];
+ wantTextboxDoneStuff: [boolean, (wantTextboxDone: boolean) => void];
+}) {
+ const textSpan = useRef(null);
+ const [content, setContent] = useState(Runner(dialogIndex.dialog));
+ const animationFrame = useRef(0);
+ let clickSound: AudioBuffer;
+ let inSound: AudioBuffer;
+ let outSound: AudioBuffer;
+ let context: AudioContext;
+ let gain: GainNode;
+ let contextGot = false;
+ async function getContext() {
+ context = new AudioContext();
+ gain = context.createGain();
+ gain.gain.value = 0.2;
+ gain.connect(context.destination);
+ await fetch("assets/celeste/click.wav")
+ .then(response => response.arrayBuffer())
+ .then(arrayBuffer => context.decodeAudioData(arrayBuffer))
+ .then((audioBuffer: AudioBuffer) => (clickSound = audioBuffer));
+ await fetch("assets/celeste/in.wav")
+ .then(response => response.arrayBuffer())
+ .then(arrayBuffer => context.decodeAudioData(arrayBuffer))
+ .then((audioBuffer: AudioBuffer) => (inSound = audioBuffer));
+ await fetch("assets/celeste/out.wav")
+ .then(response => response.arrayBuffer())
+ .then(arrayBuffer => context.decodeAudioData(arrayBuffer))
+ .then((audioBuffer: AudioBuffer) => (outSound = audioBuffer));
+ }
+ useEffect(generateContent, [dialogIndex, dialogIsOpen]);
+ function generateContent() {
+ console.log("generating");
+ if (!dialogIsOpen) return;
+ if (textSpan.current == null) return;
+ cancelAnimationFrame(animationFrame.current);
+ setContent(Runner(dialogIndex.dialog));
+ }
+ (async () => {
+ await getContext();
+ contextGot = true;
+ })();
+ useEffect(formatContent, [content]);
+ function formatContent() {
+ console.log("formatting", content);
+ if (textSpan.current == null) return;
+ cancelAnimationFrame(animationFrame.current);
+ const innerSpan = textSpan.current
+ .children[0] as HTMLSpanElement | null;
+ if (innerSpan == null) return;
+ textSpan.current.style.width = "100%";
+ textSpan.current.style.width = innerSpan.offsetWidth + 2 + "px";
+
+ // Wave stuff
+ const allWavy = textSpan.current.querySelectorAll("* .wavy");
+ allWavy.forEach(wavyElement => {
+ const children = wavyElement.querySelectorAll("span.letter");
+ let index = 1;
+ for (let child of children) {
+ const currentLetter = child as HTMLSpanElement;
+ currentLetter.style.animationName = styles.wavy;
+ currentLetter.style.animationDelay =
+ (0.5 / children.length) * index + "s";
+ index++;
+ }
+ });
+ writeContent();
+ }
+ useEffect(() => {
+ if (textSpan.current == null) return;
+ const allLetters = textSpan.current.querySelectorAll("span.letter");
+ if (wantTextboxDone) {
+ for (let i = 0; i < allLetters.length; i++) {
+ const currentLetter = allLetters[i] as HTMLSpanElement;
+ currentLetter.classList.add(styles.visible);
+ }
+ cancelAnimationFrame(animationFrame.current);
+ setTextboxDone(true);
+ setWantTextboxDone(false);
+ return;
+ }
+ }, [wantTextboxDone]);
+ function writeContent() {
+ if (textSpan.current == null) return;
+ if (!dialogIsOpen) return;
+ cancelAnimationFrame(animationFrame.current);
+ setTextboxDone(false);
+ const allLetters = textSpan.current.querySelectorAll("span.letter");
+ for (let i = 0; i < allLetters.length; i++) {
+ const currentLetter = allLetters[i] as HTMLSpanElement;
+ currentLetter.classList.remove(styles.visible);
+ }
+ var letterProgress = 0;
+ async function showLetters() {
+ if (letterProgress >= allLetters.length) {
+ setTextboxDone(true);
+ cancelAnimationFrame(animationFrame.current);
+ return;
+ }
+ const currentLetter = allLetters[letterProgress] as HTMLSpanElement;
+ currentLetter.classList.add(styles.visible);
+ letterProgress++;
+ let waitLength = 0;
+ let makeSound = true;
+ switch (currentLetter.innerHTML) {
+ case " ":
+ makeSound = false;
+ waitLength = 0.01;
+ break;
+ case ".":
+ waitLength = 0.5;
+ break;
+ case ",":
+ waitLength = 0.125;
+ break;
+ case "!":
+ waitLength = 0.5;
+ break;
+ case "?":
+ waitLength = 0.5;
+ break;
+ default:
+ waitLength = 0.025;
+ }
+ // if (makeSound && contextGot) {
+ // let source = context.createBufferSource();
+ // source.buffer = clickSound;
+ // source.connect(gain);
+ // source.start();
+ // }
+ await wait(waitLength).then(() => {
+ animationFrame.current = requestAnimationFrame(showLetters);
+ });
+ }
+ wait(0.25).then(
+ () => (animationFrame.current = requestAnimationFrame(showLetters))
+ );
+ }
+ return (
+
+ {content}
+
+ );
+}
+
+function Runner(text: ElementArray) {
+ if (typeof text === "string") return StringRunner(text);
+ else if (Array.isArray(text)) return {text.map(Runner)} ;
+ else if (typeof text === "object") {
+ return (
+
+ {Runner(text.text)}
+
+ );
+ }
+}
+
+function StringRunner(string: string) {
+ return (
+ <>
+ {string.split("").map((letter, i) => (
+
+ {letter}
+
+ ))}
+ >
+ );
+}
diff --git a/src/components/CelesteBox/types.tsx b/src/components/CelesteBox/types.tsx
new file mode 100644
index 0000000..fa35b16
--- /dev/null
+++ b/src/components/CelesteBox/types.tsx
@@ -0,0 +1,23 @@
+export type DialogList = {
+ name: string;
+ list: DialogIndex[];
+};
+
+export type DialogIndex = {
+ character: string;
+ dialog: ElementArray;
+};
+
+type DialogElement = {
+ effects?: { className?: string; style?: React.CSSProperties };
+ text: ElementArray;
+};
+
+export type ElementArray = string | DialogElement | EAA;
+type EAA = ElementArray[];
+
+export const clamp = (n: number, mi: number, ma: number) =>
+ Math.max(mi, Math.min(n, ma));
+
+export const wait = (time: number): Promise =>
+ new Promise(res => setTimeout(() => res(), time * 1000));
diff --git a/src/components/Nav/Nav.module.css b/src/components/Nav/Nav.module.css
new file mode 100644
index 0000000..7a65cf5
--- /dev/null
+++ b/src/components/Nav/Nav.module.css
@@ -0,0 +1,61 @@
+.Nav {
+ background-color: var(--pri-bg);
+ color: var(--pri-fg);
+
+ position: sticky;
+ top: 8px;
+ left: 8px;
+ z-index: 9;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ width: calc(100vw - 16px);
+ height: 48px;
+ border: 1px solid currentColor;
+ border-radius: 2px;
+ box-sizing: border-box;
+ padding: 8px 12px;
+}
+
+.Nav .left {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ text-align: center;
+ width: 100%;
+ gap: 16px;
+}
+
+.Nav .right {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-end;
+ text-align: center;
+ width: 100%;
+ gap: 16px;
+}
+
+.Nav .titlePath {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: flex-start;
+ text-align: left;
+ gap: 4px;
+}
+
+.Nav .path {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ text-align: left;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ gap: 6px;
+ max-width: 100px;
+}
diff --git a/src/components/Nav/Nav.tsx b/src/components/Nav/Nav.tsx
new file mode 100644
index 0000000..a2db16b
--- /dev/null
+++ b/src/components/Nav/Nav.tsx
@@ -0,0 +1,45 @@
+import globals from "@/styles/global.module.css";
+import { AnyObject } from "@/types/generics";
+import Link from "next/link";
+import styles from "./Nav.module.css";
+
+export default function Nav(elementProps: AnyObject) {
+ return (
+
+
+
+
+
+ TrollCall
+
+
+
+
+
+ add
+
+
+
+
+ HS
+
+
+
+
+ groups
+
+
+
+
+
+ );
+}
diff --git a/src/components/cards/ClanCard/ClanCard.module.css b/src/components/cards/ClanCard/ClanCard.module.css
new file mode 100644
index 0000000..8815473
--- /dev/null
+++ b/src/components/cards/ClanCard/ClanCard.module.css
@@ -0,0 +1,58 @@
+.ClanCard {
+ min-width: 600px;
+ width: 100%;
+}
+
+.ClanCard.Skeleton {
+ opacity: 0.25;
+ user-select: none;
+}
+
+.ClanCard .headerImage {
+ margin: 0 -8px;
+ margin-top: -8px;
+ width: auto;
+ height: 100px;
+ background-color: var(--pri-fg);
+ border: none;
+}
+
+.ClanCard .headerImage img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.ClanCard .horizontal {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ gap: 16px;
+ padding: 8px;
+ box-sizing: border-box;
+}
+
+.ClanCard .horizontal .horizontalLeft {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ aspect-ratio: 1 / 1;
+ object-fit: cover;
+ border-radius: 48px;
+ overflow: hidden;
+ width: 96px;
+ height: auto;
+ background-color: var(--pri-fg);
+}
+
+.ClanCard .horizontal .horizontalLeft img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.ClanCard .horizontal .horizontalRight {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
diff --git a/src/components/cards/ClanCard/ClanCard.tsx b/src/components/cards/ClanCard/ClanCard.tsx
new file mode 100644
index 0000000..def522e
--- /dev/null
+++ b/src/components/cards/ClanCard/ClanCard.tsx
@@ -0,0 +1,81 @@
+/* eslint-disable @next/next/no-img-element */
+import Box from "@/components/Box/Box";
+import globals from "@/styles/global.module.css";
+import { Color3 } from "@/types/assist/color";
+import { ClientClan } from "@/types/clan";
+import { PronounGrouper } from "@/utility/language";
+import Conditional from "@/utility/react/Conditional";
+import Link from "next/link";
+import styles from "./ClanCard.module.css";
+
+export default function ClanCard({ clan }: { clan: ClientClan }) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {clan.displayName ?? clan.name}
+
+
+
+ group
+
+ {clan.members
+ .map(
+ member =>
+ `${member.name} (${PronounGrouper(
+ member.pronouns
+ )})`
+ )
+ .join(", ")}
+
+
+
+
+ link
+
+
+ {clan.url}
+
+
+
+
+
+ description
+ {clan.description}
+
+
+
+
+ );
+}
diff --git a/src/components/cards/ClanCard/ClanSkeleton.tsx b/src/components/cards/ClanCard/ClanSkeleton.tsx
new file mode 100644
index 0000000..8cf6092
--- /dev/null
+++ b/src/components/cards/ClanCard/ClanSkeleton.tsx
@@ -0,0 +1,45 @@
+import globals from "@/styles/global_skeleton.module.css";
+/* eslint-disable @next/next/no-img-element */
+import Box from "@/components/Box/Box";
+import styles from "./ClanCard.module.css";
+
+export default function ClanSkeleton() {
+ return (
+
+
+
+
+
+
+ fjfjfjf fjf fjfjfjfjfjfj fj fj fjfjfj
+
+
+ group
+
+ jjffjf j f fjfjfjfjjjjff jffff
+
+
+
+ link
+
+ https://fjfjfjfjfjfjfjfjfjfjf.fjf/fjfjfjfj
+
+
+
+ description
+
+ ffffffffffffffffffjjjfjf fj j jjffjf
+ jfjfjfjfjfjjfffjffjjjjfjfjffjfjj ffjfjf fj j fj
+ fjfjjfjfj jjffjjjfjfjfjfjfjjfj fj fj jf jf jf jf
+ fjjfjffjfjfj fjffjf fjfj
+
+
+
+
+
+ );
+}
diff --git a/src/components/cards/SignCard/SignCard.module.css b/src/components/cards/SignCard/SignCard.module.css
new file mode 100644
index 0000000..54bf4fb
--- /dev/null
+++ b/src/components/cards/SignCard/SignCard.module.css
@@ -0,0 +1,33 @@
+.SignCard {
+ display: grid !important;
+ grid-template-columns: auto auto;
+ gap: 8px !important;
+ /* padding: 2px !important; */
+}
+
+.SignCard.Skeleton {
+ user-select: none;
+}
+
+.SignCard .gridItem {
+ width: auto;
+ height: auto;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ gap: 4px;
+}
+
+.SignCard .secondary {
+ padding: 4px;
+}
+.SignCard .topImage {
+ height: 52px;
+ width: auto;
+ filter: drop-shadow(1px 1px 0 currentcolor)
+ drop-shadow(-1px -1px 0 currentcolor)
+ drop-shadow(1px -1px 0 currentcolor)
+ drop-shadow(-1px 1px 0 currentcolor);
+}
diff --git a/src/components/cards/SignCard/SignCard.tsx b/src/components/cards/SignCard/SignCard.tsx
new file mode 100644
index 0000000..df97154
--- /dev/null
+++ b/src/components/cards/SignCard/SignCard.tsx
@@ -0,0 +1,42 @@
+/* eslint-disable @next/next/no-img-element */
+import Box from "@/components/Box/Box";
+import globals from "@/styles/global.module.css";
+import { Color3 } from "@/types/assist/color";
+import { TrueSignType } from "@/types/assist/extended_zodiac";
+import Link from "next/link";
+import styles from "./SignCard.module.css";
+
+export default function SignCard({ sign }: { sign: TrueSignType }) {
+ return (
+
+
+
+
+
+
+
+ {sign.name}
+
+
+
+ {sign.sway.name}
+ +
+ {sign.aspect.name}
+
+
+
+ );
+}
diff --git a/src/components/cards/SignCard/SignSkeleton.tsx b/src/components/cards/SignCard/SignSkeleton.tsx
new file mode 100644
index 0000000..19a5814
--- /dev/null
+++ b/src/components/cards/SignCard/SignSkeleton.tsx
@@ -0,0 +1,31 @@
+/* eslint-disable @next/next/no-img-element */
+import Box from "@/components/Box/Box";
+import globals from "@/styles/global_skeleton.module.css";
+import styles from "./SignCard.module.css";
+
+export default function SignSkeleton() {
+ return (
+
+
+
+
+
+
jjjjfjfjffjfjjffj
+
+ jjjfjfj
+ +
+ jjjfjfj
+
+
+
+ );
+}
diff --git a/src/components/cards/TrollCard/TrollCard.module.css b/src/components/cards/TrollCard/TrollCard.module.css
new file mode 100644
index 0000000..d816f3f
--- /dev/null
+++ b/src/components/cards/TrollCard/TrollCard.module.css
@@ -0,0 +1,74 @@
+.TrollCard {
+ min-width: 600px;
+ width: 100%;
+}
+
+.TrollCard.Skeleton {
+ opacity: 0.25;
+ user-select: none;
+}
+
+.TrollCard .top {
+ display: grid;
+ grid-template-columns: max-content auto;
+ gap: 8px;
+}
+
+.TrollCard .top .gridItem {
+ width: auto;
+ height: auto;
+ display: flex;
+ flex-direction: column;
+}
+
+.TrollCard .top .primary {
+ align-items: center;
+ justify-content: center;
+}
+
+.TrollCard .top .secondary {
+ gap: 4px;
+ padding: 4px;
+}
+
+.TrollCard .top .topImage {
+ width: 150px;
+ height: 200px;
+ object-fit: contain;
+}
+
+.TrollCard .bottom {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.TrollCard .stack {
+ --offset-value: 32px;
+ position: relative;
+ padding-bottom: var(--offset-value);
+ padding-right: var(--offset-value);
+ width: max-content;
+}
+
+.TrollCard .stack.noFalseSign {
+ padding: 0;
+}
+
+.TrollCard .stack > div:nth-child(1) {
+ position: relative;
+ z-index: 2;
+ /* width: max-content; */
+}
+
+.TrollCard .stack > div:nth-child(2) {
+ position: absolute;
+ /* width: max-content; */
+ top: var(--offset-value);
+ left: var(--offset-value);
+ z-index: 1;
+}
+
+.TrollCard .stack > div:nth-child(2):hover {
+ z-index: 3;
+}
diff --git a/src/components/cards/TrollCard/TrollCard.tsx b/src/components/cards/TrollCard/TrollCard.tsx
new file mode 100644
index 0000000..1802f1f
--- /dev/null
+++ b/src/components/cards/TrollCard/TrollCard.tsx
@@ -0,0 +1,140 @@
+/* eslint-disable @next/next/no-img-element */
+import Box from "@/components/Box/Box";
+import globals from "@/styles/global.module.css";
+import { Color3 } from "@/types/assist/color";
+import { TrueSignType } from "@/types/assist/extended_zodiac";
+import { ClientTroll } from "@/types/troll";
+import { pickRandom } from "@/utility/array";
+import { AgeConverter, PronounGrouper } from "@/utility/language";
+import { parseQuirk } from "@/utility/quirk";
+import Conditional from "@/utility/react/Conditional";
+import Link from "next/link";
+import { useEffect, useState } from "react";
+import SignCard from "../SignCard/SignCard";
+import styles from "./TrollCard.module.css";
+
+export default function TrollCard({ troll }: { troll: ClientTroll }) {
+ const [randomLove, setRandomLove] = useState("");
+ const [randomHate, setRandomHate] = useState("");
+ const [randomQuote, setRandomQuote] = useState("");
+ const trollColor =
+ troll.pageColor ??
+ troll.textColor ??
+ troll.falseSign?.color.color ??
+ troll.trueSign?.color.color;
+ useEffect(() => {
+ if (troll.preferences.love != null && troll.preferences.love.length > 0)
+ setRandomLove(pickRandom(troll.preferences.love));
+ if (troll.preferences.hate != null && troll.preferences.hate.length > 0)
+ setRandomHate(pickRandom(troll.preferences.hate));
+ if (troll.quotes != null && troll.quotes.length > 0)
+ setRandomQuote(pickRandom(troll.quotes));
+ }, []);
+ return (
+
+
+
0}>
+
+
+
+
+
+
+
+ {troll.name.join(" ")}
+
+
+
+ ({troll.pronunciation.join(" ")})
+
+
+ Also known as {troll.username} online.
+
+
+
+
+ {AgeConverter(troll.age, true)}
+
+ -
+ {troll.gender}
+ -
+
+ {PronounGrouper(troll.pronouns)}
+
+
+
+
+
+ {troll.facts?.map((fact, index) => (
+
+ {fact}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ thumb_up
+ {randomLove}
+
+
+
+
+ thumb_down
+ {randomHate}
+
+
+
+
+ format_quote
+
+ {parseQuirk(randomQuote, troll.quirks["default"])}
+
+
+
+
+
+ );
+}
diff --git a/src/components/cards/TrollCard/TrollSkeleton.tsx b/src/components/cards/TrollCard/TrollSkeleton.tsx
new file mode 100644
index 0000000..8ba2df3
--- /dev/null
+++ b/src/components/cards/TrollCard/TrollSkeleton.tsx
@@ -0,0 +1,71 @@
+/* eslint-disable @next/next/no-img-element */
+import Box from "@/components/Box/Box";
+import globals from "@/styles/global_skeleton.module.css";
+import SignSkeleton from "../SignCard/SignSkeleton";
+import styles from "./TrollCard.module.css";
+
+export default function TrollSkeleton() {
+ return (
+
+
+
+
+
+
+
ffjfjf fjfjjj
+
(fjjjf-jjfj fjjfjf-fjffj)
+
+ Also known as ffjfjjfjjfjfjjjjjfjjf online.
+
+
+
+ fj
+ -
+ ffjfj
+ -
+ fj/fjj/fjjjf
+
+
+
+ fjjfjjfjffj
+ fjjjjfjffjjfffjfj
+
+ fjjjjffjjjfjjjfjjffjfjfj
+
+
+
+
+
+
+
+
+
+
+ thumb_up
+
+ ffjj fjf jjffffjfjfj fjfjjfjfjjj
+
+
+
+ thumb_down
+
+ ffjjj fjjfjjf jf jj jjfjjjffj j fff
+
+
+
+ format_quote
+
+ jjj fjjf jfjjjf f j ffff j f jjfj jf fj fjjjfj jfj
+
+
+
+
+ );
+}
diff --git a/src/lib/trollcall/api/clan.ts b/src/lib/trollcall/api/clan.ts
index 6cb22ab..d90b206 100644
--- a/src/lib/trollcall/api/clan.ts
+++ b/src/lib/trollcall/api/clan.ts
@@ -12,10 +12,9 @@ export async function ClanGET(
existingClan?: ServerClan
): Promise {
const clan =
- existingClan ??
- (await getSingleClan({
- name: query?.clan
- }));
+ existingClan != null || query == null
+ ? existingClan
+ : await getSingleClan(query);
if (clan == null) return null;
const serverClan = await ServerClanToClientClan(clan);
serverClan.flairs = cutArray(
diff --git a/src/pages/404.tsx b/src/pages/404.tsx
new file mode 100644
index 0000000..a857646
--- /dev/null
+++ b/src/pages/404.tsx
@@ -0,0 +1,30 @@
+import Box from "@/components/Box/Box";
+import globals from "@/styles/global.module.css";
+import "@/styles/index.module.css";
+import { ThemerGetSet } from "@/types/generics";
+
+export default function Error({
+ themerVars: [theme, setTheme]
+}: {
+ themerVars: ThemerGetSet;
+}) {
+ return (
+ <>
+
+
+ Your resource could not be found.
+
+
+ "IT KEEPS HAPPENING"
+
+
+
+ >
+ );
+}
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 1fa2d52..93336df 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,6 +1,129 @@
+import Box from "@/components/Box/Box";
+import Nav from "@/components/Nav/Nav";
+import "@/styles/_app.css";
+import "@/styles/global.module.css";
+import globals from "@/styles/global.module.css";
+import { Color3 } from "@/types/assist/color";
+import Themer, { ThemeModeContext } from "@/utility/react/Themer";
import type { AppProps } from "next/app";
-import React from "react";
+import Link from "next/link";
+import { useState } from "react";
export default function App({ Component, pageProps }: AppProps) {
- return ;
+ const [theme, setTheme] = useState([
+ new Color3(0.9, 0.9, 0.8),
+ new Color3(0.7, 0.7, 0.6),
+ false
+ ] as [Color3, Color3, boolean?]);
+ return (
+
+
+
+
+
+
+
+
+
+
+ Open-source licenses & credits
+
+
+
+
+ TrollCall rev. 4 created by MeowcaTheoRange.
+
+
+ trollcall.xyz domain owned by Redact.
+
+
+ The TrollCall name is derived from the original
+ Hiveswap Troll Call. The name may be used in an
+ entity context or a project context.
+
+
+ The textboxes found in the [INSERT PAGE HERE] are
+ inspired by those from the game Celeste .
+
+
+
+
+ TrollCall Display
+ {" "}
+ font by MeowcaTheoRange.
+
+
+
+ Space Grotesk
+ {" "}
+ font by Florian Karsten.
+
+
+
+ Space Mono
+ {" "}
+ font by Colophon Foundry.
+
+
+
+ Poppins
+ {" "}
+ font by Indian Type Foundry.
+
+
+
+ Flow Circular
+ {" "}
+ font by Dan Ross.
+
+
+
+ Renogare
+ {" "}
+ font by Deepak Dogra.
+
+
+
+ Homestuck and HIVESWAP © Homestuck Inc.
+
+
+
+
+
+ );
}
diff --git a/src/pages/_error.tsx b/src/pages/_error.tsx
deleted file mode 100644
index 55b1990..0000000
--- a/src/pages/_error.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function ErrorPage() {
- return "404";
-}
diff --git a/src/pages/api/clan/.../[[...page]]/index.ts b/src/pages/api/clan/.../[[...page]]/index.ts
index dab6802..dec9307 100644
--- a/src/pages/api/clan/.../[[...page]]/index.ts
+++ b/src/pages/api/clan/.../[[...page]]/index.ts
@@ -1,5 +1,7 @@
+import { ClanGET } from "@/lib/trollcall/api/clan";
import { getManyPagedClans } from "@/lib/trollcall/clan";
import { ServerClanToClientClan } from "@/lib/trollcall/convert/clan";
+import { ClientClan } from "@/types/clan";
import { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
@@ -11,7 +13,11 @@ export default async function handler(
if (method === "GET") {
const clans = await getManyPagedClans(
{},
- ServerClanToClientClan,
+ async (clan: any) => {
+ let thisClan = await ServerClanToClientClan(clan);
+ thisClan = (await ClanGET(null, clan)) as ClientClan;
+ return thisClan;
+ },
5,
page
);
diff --git a/src/pages/api/troll/.../[[...page]]/index.ts b/src/pages/api/troll/.../[[...page]]/index.ts
index 7335c0b..049d2a3 100644
--- a/src/pages/api/troll/.../[[...page]]/index.ts
+++ b/src/pages/api/troll/.../[[...page]]/index.ts
@@ -1,5 +1,7 @@
+import { ClanGET } from "@/lib/trollcall/api/clan";
import { ServerTrollToClientTroll } from "@/lib/trollcall/convert/troll";
import { getManyPagedTrolls } from "@/lib/trollcall/troll";
+import { ClientClan } from "@/types/clan";
import { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
@@ -11,11 +13,17 @@ export default async function handler(
if (method === "GET") {
const trolls = await getManyPagedTrolls(
{},
- ServerTrollToClientTroll,
+ async (troll: any) => {
+ const thisTroll = await ServerTrollToClientTroll(troll);
+ thisTroll.owner = (await ClanGET({
+ _id: troll.owner
+ })) as ClientClan;
+
+ return thisTroll;
+ },
5,
page
);
- console.log(trolls);
if (trolls == null) return res.status(404).end();
res.json(trolls);
} else return res.status(405).end();
diff --git a/src/pages/api/troll/[clan]/.../[[...page]]/index.ts b/src/pages/api/troll/[clan]/.../[[...page]]/index.ts
index 9b0445c..360f0a9 100644
--- a/src/pages/api/troll/[clan]/.../[[...page]]/index.ts
+++ b/src/pages/api/troll/[clan]/.../[[...page]]/index.ts
@@ -1,6 +1,8 @@
+import { ClanGET } from "@/lib/trollcall/api/clan";
import { getSingleClan } from "@/lib/trollcall/clan";
import { ServerTrollToClientTroll } from "@/lib/trollcall/convert/troll";
import { getManyPagedTrolls } from "@/lib/trollcall/troll";
+import { ClientClan } from "@/types/clan";
import { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
@@ -18,7 +20,14 @@ export default async function handler(
{
"owner": clan._id
},
- ServerTrollToClientTroll,
+ async (troll: any) => {
+ const thisTroll = await ServerTrollToClientTroll(troll);
+ thisTroll.owner = (await ClanGET({
+ _id: troll.owner
+ })) as ClientClan;
+
+ return thisTroll;
+ },
5,
page
);
diff --git a/src/pages/help/opensource/index.tsx b/src/pages/help/opensource/index.tsx
new file mode 100644
index 0000000..cf86200
--- /dev/null
+++ b/src/pages/help/opensource/index.tsx
@@ -0,0 +1,372 @@
+import Box from "@/components/Box/Box";
+import globals from "@/styles/global.module.css";
+import "@/styles/index.module.css";
+import { ThemerGetSet } from "@/types/generics";
+import Link from "next/link";
+
+export default function Index({
+ themerVars: [theme, setTheme]
+}: {
+ themerVars: ThemerGetSet;
+}) {
+ return (
+ <>
+
+
+ TrollCall is software licensed under the{" "}
+
+ GNU General Public License
+
+ . You can find the source code on Github in the{" "}
+
+ MeowcaTheoRange/TrollCallAPIs
+ {" "}
+ repository.
+
+
+
+
+ You may find the following packages are required when using
+ the source code:
+
+
+
+
+ @types/cookie
+
+
+
+
+ @types/express
+
+
+
+
+ @types/lodash
+
+
+
+
+ @types/node
+
+
+
+
+ concurrently
+
+
+
+
+ nodemon
+
+
+
+
+ tsc-alias
+
+
+
+
+ typescript
+
+
+ {/* End dev dependencies */}
+
+
+ @types/cookie-parser
+
+
+
+
+ @types/crypto-js
+
+
+
+
+ @types/react
+
+
+
+
+ body-parser
+
+
+
+
+ cookie
+
+
+
+
+ cookie-parser
+
+
+
+
+ cookies-next
+
+
+
+
+ crypto-js
+
+
+
+
+ dotenv
+
+
+
+
+ express
+
+
+
+
+ lodash
+
+
+
+
+ mongodb
+
+
+
+
+ nanoid
+
+
+
+
+ next
+
+
+
+
+ react
+
+
+
+
+ react-dom
+
+
+
+
+ tsconfig-paths
+
+
+
+
+ yup
+
+
+
+
+
+
+ TrollCall rev. 4 created by MeowcaTheoRange.
+
+
+ trollcall.xyz domain owned by Redact.
+
+
+ The TrollCall name is derived from the original Hiveswap
+ Troll Call. The name may be used in an entity context or a
+ project context.
+
+
+ The textboxes found in the [INSERT PAGE HERE] are inspired
+ by those from the game Celeste .
+
+
+
+
+ TrollCall Display
+ {" "}
+ font by MeowcaTheoRange.
+
+
+
+ Space Grotesk
+ {" "}
+ font by Florian Karsten.
+
+
+
+ Space Mono
+ {" "}
+ font by Colophon Foundry.
+
+
+
+ Poppins
+ {" "}
+ font by Indian Type Foundry.
+
+
+
+ Flow Circular
+ {" "}
+ font by Dan Ross.
+
+
+
+ Renogare
+ {" "}
+ font by Deepak Dogra.
+
+
+
+ Homestuck and HIVESWAP © Homestuck Inc.
+
+
+ >
+ );
+}
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index c0f2413..65d6e8a 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -1,3 +1,100 @@
-export default function Home() {
- return "Welcome home!";
+import Box from "@/components/Box/Box";
+import ClanCard from "@/components/cards/ClanCard/ClanCard";
+import ClanSkeleton from "@/components/cards/ClanCard/ClanSkeleton";
+import TrollCard from "@/components/cards/TrollCard/TrollCard";
+import TrollSkeleton from "@/components/cards/TrollCard/TrollSkeleton";
+import globals from "@/styles/global.module.css";
+import "@/styles/index.module.css";
+import { ClientClan } from "@/types/clan";
+import { ThemerGetSet } from "@/types/generics";
+import { ClientTroll } from "@/types/troll";
+import { getCookies } from "cookies-next";
+import { useEffect, useState } from "react";
+
+getCookies();
+
+export default function Index({
+ themerVars: [theme, setTheme]
+}: {
+ themerVars: ThemerGetSet;
+}) {
+ const [fetchedTrolls, setFetchedTrolls] = useState(
+ null
+ );
+ const [fetchedClans, setFetchedClans] = useState(null);
+ useEffect(() => {
+ async function getTroll() {
+ const res = await fetch("/api/troll/...");
+ const json = await res.json();
+ setFetchedTrolls(json);
+ }
+ getTroll();
+ async function getClan() {
+ const res = await fetch("/api/clan/...");
+ const json = await res.json();
+ setFetchedClans(json);
+ }
+ getClan();
+ }, []);
+ return (
+ <>
+
+ Welcome to TrollCall!
+
+
+ {/*
+ This is a series of cards that represent the most important
+ aspects of TrollCall.
+ */}
+ {fetchedTrolls == null ? (
+ <>
+
+
+
+ >
+ ) : (
+ fetchedTrolls.map((troll: ClientTroll, idx) => (
+
+ ))
+ )}
+
+
+ {/*
+ This is a series of cards that represent the most important
+ aspects of TrollCall.
+ */}
+ {fetchedClans == null ? (
+ <>
+
+
+
+ >
+ ) : (
+ fetchedClans.map((clan: ClientClan, idx) => (
+
+ ))
+ )}
+
+ >
+ );
}
diff --git a/src/pages/test/index.tsx b/src/pages/test/index.tsx
new file mode 100644
index 0000000..a2c6de3
--- /dev/null
+++ b/src/pages/test/index.tsx
@@ -0,0 +1,345 @@
+import Box from "@/components/Box/Box";
+import CelesteBox from "@/components/CelesteBox/CelesteBox";
+import ClanCard from "@/components/cards/ClanCard/ClanCard";
+import ClanSkeleton from "@/components/cards/ClanCard/ClanSkeleton";
+import SignCard from "@/components/cards/SignCard/SignCard";
+import SignSkeleton from "@/components/cards/SignCard/SignSkeleton";
+import TrollCard from "@/components/cards/TrollCard/TrollCard";
+import TrollSkeleton from "@/components/cards/TrollCard/TrollSkeleton";
+import globals from "@/styles/global.module.css";
+import "@/styles/index.module.css";
+import { Color3 } from "@/types/assist/color";
+import { ThemerGetSet } from "@/types/generics";
+import { ClientTroll } from "@/types/troll";
+import { getCookies } from "cookies-next";
+import { useEffect, useState } from "react";
+
+getCookies();
+
+export default function Index({
+ themerVars: [theme, setTheme]
+}: {
+ themerVars: ThemerGetSet;
+}) {
+ const [fetchedTroll, setFetchedTroll] = useState(null);
+ useEffect(() => {
+ async function getTroll() {
+ const res = await fetch("/api/troll/meowcatheorange/traobi");
+ const json = await res.json();
+ setFetchedTroll(json);
+ }
+ getTroll();
+ }, []);
+
+ const [openCB, CelesteBoxInstance] = CelesteBox({
+ dialogList: {
+ name: "CelesteBoxTest",
+ list: [
+ {
+ character: "madeline_lol",
+ dialog: [
+ "Hello, ",
+ {
+ effects: { style: { color: "#8000FF" } },
+ text: "world! "
+ },
+ {
+ effects: {
+ style: { color: "#FFFF00" }
+ },
+ text: [
+ "This is a ",
+ {
+ effects: {
+ className: "wavy"
+ },
+ text: "test"
+ },
+ ".\n"
+ ]
+ },
+ "I am very proud of myself for making this!"
+ ]
+ }
+ ]
+ }
+ });
+ return (
+ <>
+
+
+ Welcome to the TrollCall test page! Here you will find some
+ fun stuff that you can mess around with.
+
+
+
+
+ This is a series of cards that represent the most important
+ aspects of TrollCall.
+
+ {fetchedTroll == null ? (
+
+ ) : (
+
+ )}
+ {fetchedTroll == null ? (
+
+ ) : (
+
+ )}
+ {fetchedTroll == null ? (
+
+ ) : fetchedTroll.trueSign != null ? (
+
+ ) : (
+ <>>
+ )}
+
+
+ Troll Skeleton
+
+ Clan Skeleton
+
+ Sign Skeleton
+
+
+
+ openCB()}
+ >
+ Open the Box
+
+ {CelesteBoxInstance}
+
+
+
+
+ setTheme([
+ new Color3(1, 0, 0),
+ new Color3(0.5, 0, 0),
+ theme[2]
+ ])
+ }
+ >
+ Red theme
+
+
+ setTheme([
+ new Color3(1, 0.5, 0),
+ new Color3(0.5, 0.25, 0),
+ theme[2]
+ ])
+ }
+ >
+ Orange theme
+
+
+ setTheme([
+ new Color3(1, 1, 0),
+ new Color3(0.5, 0.5, 0),
+ theme[2]
+ ])
+ }
+ >
+ Yellow theme
+
+
+ setTheme([
+ new Color3(0.5, 1, 0),
+ new Color3(0.25, 0.5, 0),
+ theme[2]
+ ])
+ }
+ >
+ Lime theme
+
+
+ setTheme([
+ new Color3(0, 1, 0),
+ new Color3(0, 0.5, 0),
+ theme[2]
+ ])
+ }
+ >
+ Green theme
+
+
+ setTheme([
+ new Color3(0, 1, 0.5),
+ new Color3(0, 0.5, 0.25),
+ theme[2]
+ ])
+ }
+ >
+ Jade theme
+
+
+ setTheme([
+ new Color3(0, 1, 1),
+ new Color3(0, 0.5, 0.5),
+ theme[2]
+ ])
+ }
+ >
+ Teal theme
+
+
+ setTheme([
+ new Color3(0, 0.5, 1),
+ new Color3(0, 0.25, 0.5),
+ theme[2]
+ ])
+ }
+ >
+ Indigo theme
+
+
+ setTheme([
+ new Color3(0, 0, 1),
+ new Color3(0, 0, 0.5),
+ theme[2]
+ ])
+ }
+ >
+ Blue theme
+
+
+ setTheme([
+ new Color3(0.5, 0, 1),
+ new Color3(0.25, 0, 0.5),
+ theme[2]
+ ])
+ }
+ >
+ Purple theme
+
+
+ setTheme([
+ new Color3(1, 0, 1),
+ new Color3(0.5, 0, 0.5),
+ theme[2]
+ ])
+ }
+ >
+ Pink theme
+
+
+ setTheme([
+ new Color3(1, 0, 0.5),
+ new Color3(0.5, 0, 0.25),
+ theme[2]
+ ])
+ }
+ >
+ Fuchsia theme
+
+
+
+
+ setTheme([
+ new Color3(0.9, 0.9, 0.8),
+ new Color3(0.7, 0.7, 0.6),
+ theme[2]
+ ])
+ }
+ >
+ Default theme
+
+
+ setTheme([
+ new Color3(0.5, 0.5, 0.4),
+ new Color3(0.1, 0.1, 0),
+ theme[2]
+ ])
+ }
+ >
+ HC theme
+
+
+
+
+ setTheme([theme[0], theme[1], !theme[2]])
+ }
+ >
+ Invert current theme
+
+
+
+
+ Blah blah blah
+ Blah blah blah
+ Blah blah blah
+ Blah blah blah
+ Blah blah blah
+ Blah blah blah
+
+ >
+ );
+}
diff --git a/src/styles/_app.css b/src/styles/_app.css
new file mode 100644
index 0000000..c5062e2
--- /dev/null
+++ b/src/styles/_app.css
@@ -0,0 +1,57 @@
+body,
+div#__next,
+main.App {
+ margin: 0;
+ min-height: 100vh;
+ width: 100vw;
+ box-sizing: border-box;
+
+ /* Default text styling */
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Space Grotesk";
+}
+
+main.App {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ padding: 8px;
+ background-color: var(--sec-bg);
+ color: var(--sec-fg);
+ background-image: url("/assets/pattern/pattern.png");
+ background-blend-mode: hard-light;
+}
+
+main.App.inverted {
+ background-image: url("/assets/pattern/pattern_inv.png");
+}
+
+main.App div.mainContent {
+ display: flex;
+ box-sizing: border-box;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ padding: 8px 0;
+ gap: 8px;
+ width: 100%;
+ max-width: 768px;
+ /* height: 100vh; */
+}
+
+/* Change behaviour of some elements */
+
+p,
+ul,
+ol {
+ margin: 0;
+ padding: 0;
+ display: block;
+}
+
+ul,
+ol {
+ list-style-position: inside;
+}
diff --git a/src/styles/fonts.css b/src/styles/fonts.css
new file mode 100644
index 0000000..dbc8f08
--- /dev/null
+++ b/src/styles/fonts.css
@@ -0,0 +1,50 @@
+@font-face {
+ font-family: "TrollCall Display";
+ src: url("../../public/fonts/TrollCallDisplay/TrollCallDisplay.woff")
+ format("woff"),
+ url("../../public/fonts/TrollCallDisplay/TrollCallDisplay.woff2")
+ format("woff2"),
+ url("../../public/fonts/TrollCallDisplay/TrollCallDisplay.otf")
+ format("opentype");
+}
+
+/* ANY usage of the Renogare font should also specify a fallback! Try the Poppins font found below. */
+@font-face {
+ font-family: "Renogare";
+ src: url("../../public/fonts/Renogare/Renogare.woff") format("woff"),
+ url("../../public/fonts/Renogare/Renogare.woff2") format("woff2"),
+ url("../../public/fonts/Renogare/Renogare.otf") format("opentype");
+}
+
+@font-face {
+ font-family: "Poppins";
+ src: url("../../public/fonts/Poppins/Poppins.ttf") format("truetype");
+}
+
+@font-face {
+ font-family: "Flow Circular";
+ src: url("../../public/fonts/FlowCircular/FlowCircular.ttf")
+ format("truetype");
+}
+
+@font-face {
+ font-family: "Material Symbols Outlined";
+ font-style: normal;
+ src: url("../../public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.woff2")
+ format("woff2"),
+ url("../../public/fonts/MaterialSymbolsOutlined/MaterialSymbolsOutlined.ttf")
+ format("truetype");
+}
+
+@font-face {
+ font-family: "Space Grotesk";
+ font-style: normal;
+ src: url("../../public/fonts/SpaceGrotesk/SpaceGrotesk.ttf")
+ format("truetype");
+}
+
+@font-face {
+ font-family: "Space Mono";
+ font-style: normal;
+ src: url("../../public/fonts/SpaceMono/SpaceMono.ttf") format("truetype");
+}
diff --git a/src/styles/global.module.css b/src/styles/global.module.css
new file mode 100644
index 0000000..f34e84e
--- /dev/null
+++ b/src/styles/global.module.css
@@ -0,0 +1,143 @@
+@import url(./fonts.css);
+
+.title {
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "TrollCall Display";
+ text-transform: uppercase;
+}
+
+.titleSmall {
+ font-size: 14px;
+ line-height: 18px;
+ font-family: "TrollCall Display";
+ text-transform: uppercase;
+}
+
+.text {
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Space Grotesk";
+}
+
+.blockText {
+ display: block;
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Space Grotesk";
+}
+
+.small {
+ font-size: 12px;
+ line-height: 14px;
+ font-family: "Space Grotesk";
+}
+
+.mono {
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Space Mono";
+}
+
+.icon {
+ font-size: 24px;
+ line-height: 24px;
+ font-family: "Material Symbols Outlined";
+ font-variation-settings: "FILL" 1, "opsz" 24, "GRAD" 0, "wght" 400;
+ user-select: none;
+}
+
+.iconSmall {
+ font-size: 16px;
+ line-height: 16px;
+ font-family: "Material Symbols Outlined";
+ font-variation-settings: "FILL" 1, "opsz" 24, "GRAD" 0, "wght" 400;
+ user-select: none;
+}
+
+.iconlike {
+ font-size: 20px;
+ line-height: 20px;
+ font-family: "Space Mono";
+ user-select: none;
+}
+
+.link {
+ text-decoration: none;
+ color: inherit;
+ text-shadow: 0 0 2px currentColor;
+ cursor: pointer;
+ transition: text-shadow 0.125s;
+}
+
+.link:hover {
+ text-decoration: underline;
+ text-shadow: 0 0 8px currentColor;
+}
+
+.button {
+ color: inherit;
+ box-shadow: 0 0 2px currentColor;
+ background-color: transparent;
+ border: 1px solid currentColor;
+
+ padding: 4px 8px;
+ border-radius: 2px;
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Space Grotesk";
+ cursor: pointer;
+
+ transition: box-shadow 0.125s;
+}
+
+.button:hover {
+ box-shadow: 0 0 8px currentColor;
+}
+
+.buttonLink {
+ color: inherit;
+ background-color: transparent;
+ border: none;
+ text-decoration: none;
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Space Grotesk";
+ padding: 0;
+ margin: 0;
+ display: inline;
+ text-align: left;
+ cursor: pointer;
+
+ text-shadow: 0 0 2px currentColor;
+ transition: text-shadow 0.125s;
+}
+
+.buttonLink:hover {
+ text-decoration: underline;
+ text-shadow: 0 0 8px currentColor;
+}
+
+.buttonRow,
+.horizontalList {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 8px;
+}
+.horizontalListLeft {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ gap: 8px;
+}
+
+.iconText {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ gap: 8px;
+}
diff --git a/src/styles/global_skeleton.module.css b/src/styles/global_skeleton.module.css
new file mode 100644
index 0000000..019b2fb
--- /dev/null
+++ b/src/styles/global_skeleton.module.css
@@ -0,0 +1,143 @@
+@import url(./fonts.css);
+
+.title {
+ font-size: 24px;
+ line-height: 20px;
+ font-family: "Flow Circular";
+ text-transform: uppercase;
+}
+
+.titleSmall {
+ font-size: 20px;
+ line-height: 16px;
+ font-family: "Flow Circular";
+ text-transform: uppercase;
+}
+
+.text {
+ font-size: 16px;
+ line-height: 18px;
+ font-family: "Flow Circular";
+}
+
+.blockText {
+ display: block;
+ font-size: 16px;
+ line-height: 18px;
+ font-family: "Flow Circular";
+}
+
+.small {
+ font-size: 12px;
+ line-height: 14px;
+ font-family: "Flow Circular";
+}
+
+.mono {
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Flow Circular";
+}
+
+.icon {
+ font-size: 24px;
+ line-height: 24px;
+ font-family: "Material Symbols Outlined";
+ font-variation-settings: "FILL" 1, "opsz" 24, "GRAD" 0, "wght" 400;
+ user-select: none;
+}
+
+.iconSmall {
+ font-size: 16px;
+ line-height: 16px;
+ font-family: "Material Symbols Outlined";
+ font-variation-settings: "FILL" 1, "opsz" 24, "GRAD" 0, "wght" 400;
+ user-select: none;
+}
+
+.iconlike {
+ font-size: 20px;
+ line-height: 20px;
+ font-family: "Flow Circular";
+ user-select: none;
+}
+
+.link {
+ text-decoration: none;
+ color: inherit;
+ text-shadow: 0 0 2px currentColor;
+ cursor: pointer;
+ transition: text-shadow 0.125s;
+}
+
+.link:hover {
+ text-decoration: underline;
+ text-shadow: 0 0 8px currentColor;
+}
+
+.button {
+ color: inherit;
+ box-shadow: 0 0 2px currentColor;
+ background-color: transparent;
+ border: 1px solid currentColor;
+
+ padding: 4px 8px;
+ border-radius: 2px;
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Flow Circular";
+ cursor: pointer;
+
+ transition: box-shadow 0.125s;
+}
+
+.button:hover {
+ box-shadow: 0 0 8px currentColor;
+}
+
+.buttonLink {
+ color: inherit;
+ background-color: transparent;
+ border: none;
+ text-decoration: none;
+ font-size: 16px;
+ line-height: 20px;
+ font-family: "Flow Circular";
+ padding: 0;
+ margin: 0;
+ display: inline;
+ text-align: left;
+ cursor: pointer;
+
+ text-shadow: 0 0 2px currentColor;
+ transition: text-shadow 0.125s;
+}
+
+.buttonLink:hover {
+ text-decoration: underline;
+ text-shadow: 0 0 8px currentColor;
+}
+
+.buttonRow,
+.horizontalList {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 8px;
+}
+.horizontalListLeft {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ gap: 8px;
+}
+
+.iconText {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-start;
+ gap: 8px;
+}
diff --git a/src/styles/index.module.css b/src/styles/index.module.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/types/assist/language.ts b/src/types/assist/language.ts
deleted file mode 100644
index d06f4aa..0000000
--- a/src/types/assist/language.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-export function AdaptivePossessive(owner: string, possession: string) {
- return owner + (owner.endsWith("s") ? "'" : "'s") + " " + possession;
-}
-
-export function PronounGrouper(
- pronouns: [string, string, string],
- sep?: string,
- amount?: number
-) {
- return pronouns.slice(0, amount ?? 2).join(sep ?? "/");
-}
-
-export function HeightConverter(inches: number) {
- var feetandinches = Math.floor(inches / 12) + "'" + (inches % 12) + '"';
- var meters = Math.floor((inches / 39.37) * 100) / 100 + "m";
- return feetandinches + " (" + meters + ")";
-}
-
-export function AgeConverter(sweeps: number, years?: boolean) {
- return years
- ? `${Math.round(sweeps * 2.1667 * 10) / 10} years`
- : `${sweeps} sweeps`;
-}
-
-export function Pluralize(stringe: string) {
- if (stringe.match(/(?:s|ch|sh|x|z|[^aeiou]o)$/)) return stringe + "es";
- else if (stringe.match(/[aeiou](?:y|o)$/)) return stringe + "s";
- else if (stringe.match(/[^aeiou]y$/)) return stringe.slice(0, -1) + "ies";
- else if (stringe.match(/(?:f|fe)$/)) return stringe.slice(0, -1) + "ves";
- else return stringe + "s";
-}
-
-export function ArraySample(array: any[]) {
- return array[Math.floor(Math.random() * array.length)];
-}
-
-export function ProperNounCase(string: string) {
- return string
- .split(" ")
- .map(x => x.charAt(0).toUpperCase() + x.slice(1).toLowerCase())
- .join(" ");
-}
-
-export function PesterchumNameFormatter(string: string) {
- return (
- string +
- " [" +
- string
- .replace(/^(([a-z])[a-z]+)(([A-Z])[a-z]+)$/, "$2$4")
- .toUpperCase() +
- "]"
- );
-}
diff --git a/src/types/client/dialoglog.ts b/src/types/client/dialoglog.ts
deleted file mode 100644
index 6c2e550..0000000
--- a/src/types/client/dialoglog.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import * as yup from "yup";
-
-export const SubmitDialogSchema = yup.object({
- owners: yup.array().of(yup.string().required()).required().min(1),
- name: yup.string().required().min(3).max(100),
- description: yup.string().max(10000).ensure(),
- characters: yup
- .array()
- .of(
- yup
- .object({
- troll: yup.string().required(),
- time: yup.string().ensure()
- })
- .required()
- )
- .required(),
- log: yup
- .array()
- .of(
- yup
- .object({
- character: yup.number().notRequired().min(0),
- quirk: yup.string().default("default"),
- text: yup.string().required().max(2000)
- })
- .required()
- )
- .required()
-});
-
-export type SubmitDialog = yup.InferType;
-
-export const PartialDialogSchema = yup.object({
- owners: yup.array().of(yup.string()).min(1),
- name: yup.string().min(3).max(100),
- description: yup.string().max(10000),
- characters: yup.array().of(
- yup.object({
- troll: yup.string(),
- time: yup.string()
- })
- ),
- log: yup.array().of(
- yup.object({
- character: yup.number().min(0),
- quirk: yup.string().default("default"),
- text: yup.string().max(2000)
- })
- )
-});
-
-export type PartialDialog = yup.InferType;
diff --git a/src/types/client/troll.ts b/src/types/client/troll.ts
index c648a1c..afc27fd 100644
--- a/src/types/client/troll.ts
+++ b/src/types/client/troll.ts
@@ -75,7 +75,7 @@ export const SubmitTrollSchema = yup
gender: yup
.string()
.required()
- .matches(/^[A-z-_]+$/, "Letters only")
+ .matches(/^[A-z- ]+$/, "Letters only")
.min(3)
.max(30),
@@ -132,13 +132,15 @@ export const SubmitTrollSchema = yup
age: yup.number().required().positive(), // Sweeps
images: yup.array().of(yup.string().required().url()).required(),
// Meta stuff
- policies: yup.object({
- fanart: PolicySchema.required(),
- fanartOthers: PolicySchema.required(),
- kinning: PolicySchema.required(),
- shipping: PolicySchema.required(),
- fanfiction: PolicySchema.required()
- })
+ policies: yup
+ .object({
+ fanart: PolicySchema.notRequired(),
+ fanartOthers: PolicySchema.notRequired(),
+ kinning: PolicySchema.notRequired(),
+ shipping: PolicySchema.notRequired(),
+ fanfiction: PolicySchema.notRequired()
+ })
+ .notRequired()
})
.required();
diff --git a/src/types/dialoglog.ts b/src/types/dialoglog.ts
deleted file mode 100644
index b0839a3..0000000
--- a/src/types/dialoglog.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { WithId } from "@/lib/db/crud";
-import * as yup from "yup";
-import { ObjectIdSchema } from "./assist/mongo";
-import { ClientClanSchema } from "./clan";
-import { SubmitDialogSchema } from "./client/dialoglog";
-import { ClientTroll, ClientTrollSchema } from "./troll";
-
-export const ServerDialogSchema = SubmitDialogSchema.shape({
- owners: yup.array().of(ObjectIdSchema.required()).required().min(1),
- characters: yup
- .array()
- .of(
- yup
- .object({
- troll: ObjectIdSchema.required(),
- time: yup.string().ensure()
- })
- .required()
- )
- .required()
-});
-
-export type ServerDialog = WithId>;
-
-export const ClientDialogSchema = SubmitDialogSchema.shape({
- owners: yup.array().of(ClientClanSchema.required()).required().min(1),
- characters: yup
- .array()
- .of(
- yup
- .object({
- troll: ClientTrollSchema.required(),
- time: yup.string().ensure()
- })
- .required()
- )
- .required()
-});
-
-export interface ClientDialog extends yup.InferType {
- characters: {
- troll: ClientTroll;
- time: string;
- }[];
-} // [SEARCH: HACK] a hack. thanks, jquense
diff --git a/src/types/generics.ts b/src/types/generics.ts
new file mode 100644
index 0000000..7d39b8f
--- /dev/null
+++ b/src/types/generics.ts
@@ -0,0 +1,12 @@
+import { Color3 } from "./assist/color";
+
+export type AnyObject = { [key: string]: any };
+
+export type AnyObjectAnd = T & { [key: string]: any };
+
+// Color
+
+export type ThemerGetSet = [
+ [Color3, Color3, boolean?],
+ (x: [Color3, Color3, boolean?]) => void
+];
diff --git a/src/utility/array.ts b/src/utility/array.ts
new file mode 100644
index 0000000..105ba9b
--- /dev/null
+++ b/src/utility/array.ts
@@ -0,0 +1,2 @@
+export const pickRandom = (arr: any[]) =>
+ arr[Math.round(Math.random() * (arr.length - 1))];
diff --git a/src/utility/fonts.ts b/src/utility/fonts.ts
new file mode 100644
index 0000000..38b96c1
--- /dev/null
+++ b/src/utility/fonts.ts
@@ -0,0 +1,11 @@
+import { Space_Grotesk, Space_Mono } from "next/font/google";
+
+export const spaceGrotesk = Space_Grotesk({
+ subsets: ["latin"],
+ display: "swap",
+});
+export const spaceMono = Space_Mono({
+ subsets: ["latin"],
+ weight: ["400"],
+ display: "swap",
+});
diff --git a/src/utility/language.ts b/src/utility/language.ts
new file mode 100644
index 0000000..0cc2681
--- /dev/null
+++ b/src/utility/language.ts
@@ -0,0 +1,53 @@
+export function AdaptivePossessive(owner: string, possession: string) {
+ return owner + (owner.endsWith("s") ? "'" : "'s") + " " + possession;
+}
+
+export function PronounGrouper(
+ pronouns: [string, string, string][],
+ sep?: string,
+ amount?: number
+) {
+ if (pronouns.length > 1)
+ return pronouns.map((pronounSet) => pronounSet[0]).join("/");
+ else return pronouns[0].slice(0, amount ?? 2).join(sep ?? "/");
+}
+
+export function HeightConverter(inches: number) {
+ var feetandinches = Math.floor(inches / 12) + "'" + (inches % 12) + '"';
+ var meters = Math.floor((inches / 39.37) * 100) / 100 + "m";
+ return feetandinches + " (" + meters + ")";
+}
+
+export function AgeConverter(age: number, years?: boolean) {
+ return years
+ ? `${Math.round((age / 2.1667) * 10) / 10} sweeps`
+ : `${Math.round(age * 2.1667 * 10) / 10} years`;
+}
+
+export function Pluralize(stringe: string) {
+ if (stringe.match(/(?:s|ch|sh|x|z|[^aeiou]o)$/)) return stringe + "es";
+ else if (stringe.match(/[aeiou](?:y|o)$/)) return stringe + "s";
+ else if (stringe.match(/[^aeiou]y$/)) return stringe.slice(0, -1) + "ies";
+ else if (stringe.match(/(?:f|fe)$/)) return stringe.slice(0, -1) + "ves";
+ else return stringe + "s";
+}
+
+export function ArraySample(array: any[]) {
+ return array[Math.floor(Math.random() * array.length)];
+}
+
+export function ProperNounCase(string: string) {
+ return string
+ .split(" ")
+ .map((x) => x.charAt(0).toUpperCase() + x.slice(1).toLowerCase())
+ .join(" ");
+}
+
+export function PesterchumNameFormatter(string: string) {
+ return (
+ string +
+ " [" +
+ string.replace(/^(([a-z])[a-z]+)(([A-Z])[a-z]+)$/, "$2$4").toUpperCase() +
+ "]"
+ );
+}
diff --git a/src/utility/number.ts b/src/utility/number.ts
new file mode 100644
index 0000000..f77b6aa
--- /dev/null
+++ b/src/utility/number.ts
@@ -0,0 +1,2 @@
+export const clamp = (n: number, mi: number, ma: number) =>
+ Math.max(mi, Math.min(n, ma));
diff --git a/src/utility/quirk.ts b/src/utility/quirk.ts
new file mode 100644
index 0000000..e602d11
--- /dev/null
+++ b/src/utility/quirk.ts
@@ -0,0 +1,119 @@
+import { Quirk } from "@/types/quirks";
+import { ArraySample } from "./language";
+
+export function parseQuirk(string: string, quirk: Quirk) {
+ var mutatingString = string;
+ quirk.quirk.forEach((quirkFunction) => {
+ var conditionRegex;
+ if (quirkFunction.condition) {
+ try {
+ conditionRegex = new RegExp(quirkFunction.condition, "g");
+ } catch (e) {
+ conditionRegex = null;
+ return;
+ }
+ }
+ var replaceValue = ArraySample(quirkFunction.replace);
+ if (conditionRegex && !mutatingString.match(conditionRegex)) return;
+ switch (quirkFunction.type) {
+ case "prefix": {
+ mutatingString = replaceValue + mutatingString;
+ break;
+ }
+ case "suffix": {
+ mutatingString = mutatingString + replaceValue;
+ break;
+ }
+ case "simple": {
+ if (quirkFunction.find == undefined) break;
+ mutatingString = mutatingString.replaceAll(
+ quirkFunction.find,
+ replaceValue
+ );
+ break;
+ }
+ case "regex": {
+ if (quirkFunction.find == undefined) break;
+ var testRegex;
+ try {
+ testRegex = new RegExp(quirkFunction.find, "g");
+ } catch (e) {
+ break;
+ }
+ mutatingString = mutatingString.replace(testRegex, replaceValue);
+ break;
+ }
+ case "case": {
+ mutatingString =
+ replaceValue === "lower"
+ ? mutatingString.toLowerCase()
+ : mutatingString.toUpperCase();
+ break;
+ }
+ case "case_simple": {
+ if (quirkFunction.find == undefined) break;
+ mutatingString = mutatingString.replaceAll(quirkFunction.find, (m) =>
+ replaceValue === "lower" ? m.toLowerCase() : m.toUpperCase()
+ );
+ break;
+ }
+ case "case_pos": {
+ // morbidJester
+ if (quirkFunction.find == undefined) break;
+ const [ca, sp, cs, ow] = quirkFunction.find.split(", ");
+ if (ca == null || sp == null) break;
+ var characterAmount: number = +ca;
+ var startPos: string = sp;
+ var characterSep: number = +(cs ?? 0);
+ var oneword: boolean = ow === "true";
+ var brokenSentence = oneword
+ ? [mutatingString]
+ : mutatingString.split(" ");
+ mutatingString = brokenSentence
+ .map((word) => {
+ var leftNC, rightNC;
+ let newStr = word
+ .replace(
+ /^([^a-zA-Z]*)(.*?)([^a-zA-Z]*)$/g,
+ (match, left, center, right, _, __) => {
+ leftNC = left;
+ rightNC = right;
+ return center;
+ }
+ )
+ .split("");
+ for (
+ let i = 0;
+ i < characterAmount * (characterSep + 1);
+ i += characterSep + 1
+ ) {
+ if (i >= newStr.length) break;
+ var trueIndex = startPos === "end" ? newStr.length - (i + 1) : i;
+ newStr[trueIndex] =
+ replaceValue === "lower"
+ ? newStr[trueIndex].toLowerCase()
+ : newStr[trueIndex].toUpperCase();
+ }
+ return leftNC + newStr.join("") + rightNC;
+ })
+ .join(" ");
+
+ break;
+ }
+ case "case_regex": {
+ if (quirkFunction.find == undefined) break;
+ var testRegex;
+ try {
+ testRegex = new RegExp(quirkFunction.find, "g");
+ } catch (e) {
+ break;
+ }
+ mutatingString = mutatingString.replace(testRegex, (m) =>
+ replaceValue === "lower" ? m.toLowerCase() : m.toUpperCase()
+ );
+ break;
+ }
+ }
+ });
+ return mutatingString;
+}
diff --git a/src/utility/react/Conditional.tsx b/src/utility/react/Conditional.tsx
new file mode 100644
index 0000000..2646a0e
--- /dev/null
+++ b/src/utility/react/Conditional.tsx
@@ -0,0 +1,23 @@
+import { ReactNode } from "react";
+
+export default function Conditional({
+ condition,
+ children,
+}: {
+ condition: boolean;
+ children: ReactNode;
+}) {
+ return condition ? children : <>>;
+}
+
+export function ConditionalParent({
+ condition,
+ parent,
+ children,
+}: {
+ condition: boolean;
+ children: ReactNode;
+ parent: (children: ReactNode) => ReactNode;
+}) {
+ return condition ? parent(children) : children;
+}
diff --git a/src/utility/react/Themer.tsx b/src/utility/react/Themer.tsx
new file mode 100644
index 0000000..a197d90
--- /dev/null
+++ b/src/utility/react/Themer.tsx
@@ -0,0 +1,38 @@
+import { Color3 } from "@/types/assist/color";
+import { createContext } from "react";
+
+export default function Themer({
+ pri,
+ sec,
+ inverted,
+}: {
+ pri: Color3;
+ sec: Color3;
+ inverted?: boolean;
+}) {
+ return inverted ? (
+
+ ) : (
+
+ );
+}
+
+export const ThemeModeContext = createContext(false as boolean | undefined);
diff --git a/src/utility/text.ts b/src/utility/text.ts
new file mode 100644
index 0000000..1c5a18c
--- /dev/null
+++ b/src/utility/text.ts
@@ -0,0 +1,2 @@
+export const truncate = (str: string, len: number) =>
+ str.length <= len ? str : str.slice(0, len) + "...";
diff --git a/tsconfig.json b/tsconfig.json
index f082d2e..b976dbc 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "target": "es5",
+ "target": "es2015",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
@@ -8,9 +8,8 @@
"forceConsistentCasingInFileNames": true,
"noEmit": true,
"esModuleInterop": true,
- "noErrorTruncation": true,
"module": "esnext",
- "moduleResolution": "node",
+ "moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
@@ -19,6 +18,6 @@
"@/*": ["./src/*"]
}
},
- "include": ["src/**/*.d.ts", "src/**/*.ts"],
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}