azathoth-ui 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. azathoth_ui/__init__.py +11 -0
  2. azathoth_ui/__main__.py +6 -0
  3. azathoth_ui/app.py +279 -0
  4. azathoth_ui/assets/icon.svg +4 -0
  5. azathoth_ui/assets/logo.svg +4 -0
  6. azathoth_ui/assets/page.css +172 -0
  7. azathoth_ui/browsing.py +371 -0
  8. azathoth_ui/catalog.py +410 -0
  9. azathoth_ui/cli.py +172 -0
  10. azathoth_ui/commands.py +41 -0
  11. azathoth_ui/live.py +699 -0
  12. azathoth_ui/pages.py +140 -0
  13. azathoth_ui/paths.py +80 -0
  14. azathoth_ui/py.typed +0 -0
  15. azathoth_ui/remotes.py +364 -0
  16. azathoth_ui/security.py +281 -0
  17. azathoth_ui/static/assets/fraunces-latin-ext-full-normal-YHFkNujK.woff2 +0 -0
  18. azathoth_ui/static/assets/fraunces-latin-full-normal-CFFu7zhK.woff2 +0 -0
  19. azathoth_ui/static/assets/fraunces-vietnamese-full-normal-7BpKI3vF.woff2 +0 -0
  20. azathoth_ui/static/assets/hanken-grotesk-cyrillic-ext-wght-normal-D_UHSL_T.woff2 +0 -0
  21. azathoth_ui/static/assets/hanken-grotesk-latin-ext-wght-normal-Dg-wlmqe.woff2 +0 -0
  22. azathoth_ui/static/assets/hanken-grotesk-latin-wght-normal-CaVRRdDk.woff2 +0 -0
  23. azathoth_ui/static/assets/hanken-grotesk-vietnamese-wght-normal-CHiFlh_0.woff2 +0 -0
  24. azathoth_ui/static/assets/index-B5c912CI.js +23 -0
  25. azathoth_ui/static/assets/index-D4ZZE9VD.css +1 -0
  26. azathoth_ui/static/icon.svg +4 -0
  27. azathoth_ui/static/index.html +16 -0
  28. azathoth_ui-1.4.0.dist-info/METADATA +131 -0
  29. azathoth_ui-1.4.0.dist-info/RECORD +33 -0
  30. azathoth_ui-1.4.0.dist-info/WHEEL +5 -0
  31. azathoth_ui-1.4.0.dist-info/entry_points.txt +2 -0
  32. azathoth_ui-1.4.0.dist-info/licenses/LICENSE +21 -0
  33. azathoth_ui-1.4.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,11 @@
1
+ """Azathoth's local editor: a web app served on this computer, for this computer.
2
+
3
+ The editor drives an Azathoth instance of its own through the public service
4
+ API, `azathoth.api`, and never through anything else.
5
+ """
6
+
7
+ __version__ = "1.4.0"
8
+
9
+ __all__ = [
10
+ "__version__",
11
+ ]
@@ -0,0 +1,6 @@
1
+ """`python -m azathoth_ui`: the `azathoth-ui` command."""
2
+
3
+ from azathoth_ui.cli import main
4
+
5
+ if __name__ == "__main__":
6
+ raise SystemExit(main())
azathoth_ui/app.py ADDED
@@ -0,0 +1,279 @@
1
+ """The editor's server: its JSON API and the web app, behind the guard of ADR 0001.
2
+
3
+ The API (ADR 0003) answers from one open Azathoth instance, through
4
+ `azathoth.api` only. An `ApiError` answers with its stable code and exact
5
+ message, and a status that says which kind of failure it is. Everything under
6
+ `/` that is not the API is the built web app: a file it built, or, for any
7
+ other address without a file extension, its page, which routes itself. An
8
+ installation without a web app answers every page with one that says how to
9
+ build it.
10
+ """
11
+
12
+ from collections.abc import Callable, Mapping
13
+ from pathlib import Path, PurePosixPath
14
+ from typing import Any, Final
15
+
16
+ from azathoth import api
17
+ from starlette.applications import Starlette
18
+ from starlette.exceptions import HTTPException
19
+ from starlette.requests import Request
20
+ from starlette.responses import HTMLResponse, JSONResponse, PlainTextResponse, Response
21
+ from starlette.routing import BaseRoute, Mount, Route
22
+ from starlette.staticfiles import StaticFiles
23
+ from starlette.types import Scope
24
+
25
+ from azathoth_ui import __version__
26
+ from azathoth_ui.browsing import browsing_routes
27
+ from azathoth_ui.catalog import (
28
+ Catalog,
29
+ ModelSource,
30
+ PortfolioSource,
31
+ catalog_routes,
32
+ model_in_use,
33
+ )
34
+ from azathoth_ui.commands import Shell, command_prefix, local_shell
35
+ from azathoth_ui.live import LiveRuns, live_routes
36
+ from azathoth_ui.pages import ASSETS_PATH, not_built_page
37
+ from azathoth_ui.remotes import remote_routes
38
+ from azathoth_ui.security import API_PREFIX, LocalOnly
39
+
40
+ PACKAGE_DIRECTORY: Final = Path(__file__).parent
41
+
42
+ ASSETS_DIRECTORY: Final = PACKAGE_DIRECTORY / "assets"
43
+ """The server's own pages' stylesheet and icon."""
44
+
45
+ STATIC_DIRECTORY: Final = PACKAGE_DIRECTORY / "static"
46
+ """Where the web app is built into the package."""
47
+
48
+ ERROR_STATUSES: Final[tuple[tuple[type[api.ApiError], int], ...]] = (
49
+ (api.InvalidArgumentError, 422),
50
+ (api.NotFoundError, 404),
51
+ (api.ConflictError, 409),
52
+ (api.RunCancelledError, 409),
53
+ (api.RunNotStartedError, 409),
54
+ (api.ProviderUnavailableError, 502),
55
+ (api.RemoteUnreachableError, 502),
56
+ (api.RemoteProtocolError, 502),
57
+ (api.RemoteRefusedError, 403),
58
+ (api.InstanceClosedError, 503),
59
+ (api.InstanceUnavailableError, 503),
60
+ )
61
+ """The status of each kind of error a caller can act on; any other is the server's own, 500."""
62
+
63
+ HTTP_ERROR_CODES: Final = {404: "not_found", 405: "method_not_allowed"}
64
+ """The codes of the API's own HTTP errors."""
65
+
66
+
67
+ def error_status(
68
+ error: api.ApiError,
69
+ ) -> int:
70
+ """Return the HTTP status one service API error answers with."""
71
+
72
+ for kind, status in ERROR_STATUSES:
73
+ if isinstance(error, kind):
74
+ return status
75
+
76
+ return 500
77
+
78
+
79
+ def error_response(
80
+ status: int,
81
+ code: str,
82
+ message: str,
83
+ ) -> JSONResponse:
84
+ """Return the API's answer to one error."""
85
+
86
+ return JSONResponse({"error": {"code": code, "message": message}}, status_code=status)
87
+
88
+
89
+ def api_error(
90
+ request: Request,
91
+ error: Exception,
92
+ ) -> Response:
93
+ """Answer a service API error with its code, message and status."""
94
+
95
+ assert isinstance(error, api.ApiError)
96
+
97
+ return error_response(error_status(error), error.code, str(error))
98
+
99
+
100
+ def http_error(
101
+ request: Request,
102
+ error: Exception,
103
+ ) -> Response:
104
+ """Answer an HTTP error in JSON under the API, and in plain text anywhere else."""
105
+
106
+ assert isinstance(error, HTTPException)
107
+
108
+ if request.url.path.startswith(API_PREFIX):
109
+ code = HTTP_ERROR_CODES.get(error.status_code, "error")
110
+
111
+ return error_response(error.status_code, code, error.detail)
112
+
113
+ return PlainTextResponse(error.detail, status_code=error.status_code, headers=error.headers)
114
+
115
+
116
+ def describe_instance(
117
+ request: Request,
118
+ ) -> Response:
119
+ """`GET /api/instance`: describe the instance the editor serves."""
120
+
121
+ instance: api.Azathoth = request.app.state.instance
122
+
123
+ return JSONResponse(instance.describe().model_dump(mode="json"))
124
+
125
+
126
+ def describe_editor(
127
+ request: Request,
128
+ ) -> Response:
129
+ """`GET /api/editor`: the editor's version, how its commands name its database, its providers.
130
+
131
+ The providers are named, never their keys.
132
+ """
133
+
134
+ instance: api.Azathoth = request.app.state.instance
135
+ shell: Shell = request.app.state.shell
136
+ providers: tuple[str, ...] = request.app.state.providers
137
+ database = instance.describe().database
138
+
139
+ return JSONResponse(
140
+ {
141
+ "version": __version__,
142
+ "shell": shell,
143
+ "command_prefix": command_prefix(database, shell),
144
+ "providers": list(providers),
145
+ }
146
+ )
147
+
148
+
149
+ def no_endpoint(
150
+ request: Request,
151
+ ) -> Response:
152
+ """Refuse any API path the server does not serve."""
153
+
154
+ raise HTTPException(404, f"No API endpoint at {request.url.path}.")
155
+
156
+
157
+ def not_built(
158
+ request: Request,
159
+ ) -> Response:
160
+ """Any page in an installation without a web app: say how to build one."""
161
+
162
+ instance: api.Azathoth = request.app.state.instance
163
+
164
+ return HTMLResponse(not_built_page(instance.describe()))
165
+
166
+
167
+ def built_file(
168
+ path: str,
169
+ ) -> bool:
170
+ """Return whether one path, relative to the build, names a file the build would make.
171
+
172
+ Starlette hands `StaticFiles` the path in the platform's own form, with
173
+ backslashes on Windows, so either separator splits it.
174
+ """
175
+
176
+ parts = PurePosixPath(path.replace("\\", "/")).parts
177
+
178
+ return parts[:1] == ("assets",) or (len(parts) == 1 and "." in parts[0])
179
+
180
+
181
+ class WebApp(StaticFiles):
182
+ """The built web app: its files, and its page for every address it routes itself.
183
+
184
+ The build puts its files under `/assets/`, and a few, such as the icon,
185
+ at the top. Any other address, such as `/workflows/<id>` or
186
+ `/tools/<id>/versions/1.0.0`, is one of the web app's own pages, so it gets
187
+ `index.html`. A missing file, such as `/assets/gone.js`, is still 404.
188
+ """
189
+
190
+ async def get_response(
191
+ self,
192
+ path: str,
193
+ scope: Scope,
194
+ ) -> Response:
195
+ """Return the file at one path, or the web app's page for an address of its own."""
196
+
197
+ try:
198
+ return await super().get_response(path, scope)
199
+ except HTTPException as error:
200
+ if error.status_code != 404 or built_file(path):
201
+ raise
202
+
203
+ return await super().get_response("index.html", scope)
204
+
205
+
206
+ def build_app(
207
+ instance: api.Azathoth,
208
+ *,
209
+ token: str,
210
+ port: int,
211
+ static_dir: Path | None = None,
212
+ shell: Shell | None = None,
213
+ providers: tuple[str, ...] = (),
214
+ models: ModelSource | None = None,
215
+ portfolio: PortfolioSource | None = None,
216
+ live: LiveRuns | None = None,
217
+ environ: Mapping[str, str] | None = None,
218
+ remote_http: Callable[[], Any] | None = None,
219
+ ) -> LocalOnly:
220
+ """Return the editor's server for one open instance, one launch key and one port.
221
+
222
+ `static_dir` is the built web app, the package's own by default. When it
223
+ holds no `index.html`, every page says how to build one. `shell` is the
224
+ shell the editor writes commands for, this computer's by default.
225
+ `providers` names the providers the instance was opened with. `models`
226
+ and `portfolio` are where models are listed and authorized, the
227
+ instance's own by default. `live` keeps the runs started from the
228
+ editor, a new keeper by default. `environ` is where remotes' tokens are
229
+ read from, the server's own environment by default. `remote_http` makes
230
+ the HTTP client remotes are reached over, httpx's by default, as tests
231
+ replace it.
232
+ """
233
+
234
+ web = STATIC_DIRECTORY if static_dir is None else static_dir
235
+ routes: list[BaseRoute] = [
236
+ Route("/api/instance", describe_instance, methods=["GET"]),
237
+ Route("/api/editor", describe_editor, methods=["GET"]),
238
+ *browsing_routes(),
239
+ *catalog_routes(),
240
+ *live_routes(),
241
+ *remote_routes(),
242
+ Route("/api/{rest:path}", no_endpoint),
243
+ Mount(ASSETS_PATH.rstrip("/"), StaticFiles(directory=ASSETS_DIRECTORY)),
244
+ ]
245
+
246
+ if (web / "index.html").is_file():
247
+ routes.append(Mount("/", WebApp(directory=web, html=True)))
248
+ else:
249
+ routes.append(Route("/{path:path}", not_built, methods=["GET"]))
250
+
251
+ app = Starlette(
252
+ routes=routes,
253
+ exception_handlers={
254
+ api.ModelInUseError: model_in_use,
255
+ api.ApiError: api_error,
256
+ HTTPException: http_error,
257
+ },
258
+ )
259
+ app.state.instance = instance
260
+ app.state.shell = local_shell() if shell is None else shell
261
+ app.state.providers = providers
262
+ app.state.catalog = Catalog(instance.models if models is None else models)
263
+ app.state.portfolio = instance.portfolio if portfolio is None else portfolio
264
+ app.state.live = LiveRuns() if live is None else live
265
+ app.state.environ = environ
266
+ app.state.remote_http = remote_http
267
+
268
+ return LocalOnly(app, token=token, port=port)
269
+
270
+
271
+ __all__ = [
272
+ "ASSETS_DIRECTORY",
273
+ "ERROR_STATUSES",
274
+ "HTTP_ERROR_CODES",
275
+ "STATIC_DIRECTORY",
276
+ "WebApp",
277
+ "build_app",
278
+ "error_status",
279
+ ]
@@ -0,0 +1,4 @@
1
+ <!-- Eldritch, Inc. -->
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 407.758 407.678">
3
+ <path transform="translate(-114.737 -108.016)" fill="#4a56a6" d="m 363.78983,514.22644 c -13.90077,-3.92087 -30.42211,-17.1351 -41.12073,-32.88953 -3.09616,-4.5593 -9.37095,-16.17527 -13.94397,-25.81326 -9.69994,-20.44337 -13.51048,-25.43562 -22.67063,-29.70114 -16.25202,-7.56793 -32.75506,-0.52234 -34.84311,14.87544 -0.57382,4.2315 -0.4188,4.83092 0.76775,2.9687 0.81771,-1.28335 3.26234,-3.25156 5.43251,-4.3738 4.61564,-2.38684 8.07638,-1.18615 12.9687,4.49943 3.00891,3.49679 3.07216,3.50773 5.05945,0.8744 1.1422,-1.51351 1.68747,-3.96397 1.26093,-5.66667 -0.68817,-2.74709 -0.28867,-3 4.73904,-3 12.51903,0 21.1047,9.58813 19.47378,21.74754 -1.87766,13.99901 -20.7535,25.51215 -37.66855,22.97558 -14.02151,-2.10266 -29.64722,-13.99865 -35.66956,-27.15556 -4.28975,-9.37175 -4.01796,-23.82503 0.63512,-33.77474 6.94955,-14.86022 21.25086,-24.62135 38.14909,-26.03804 10.23128,-0.85775 10.85583,-1.81261 5.257,-8.03729 -2.24259,-2.49328 -3.55898,-2.82496 -8.51553,-2.14559 -7.97922,1.09368 -12.43445,-2.82287 -12.43445,-10.931 0,-7.22411 -3.47664,-10.60514 -10.48013,-10.1919 -7.20694,0.42524 -10.15419,-3.13225 -9.08109,-10.96138 0.78606,-5.73491 0.63763,-6.04174 -5.48209,-11.33232 -13.17277,-11.38806 -12.4017,-10.32065 -11.50522,-15.9269 0.93685,-5.85877 -1.19575,-11.02444 -6.65812,-16.12749 -4.27579,-3.99453 -4.57901,-10.31871 -0.72939,-15.21272 l 2.73063,-3.47143 -2.72488,-2.33311 c -4.25063,-3.63951 -4.74543,-9.74665 -1.38698,-17.11891 3.83505,-8.41845 5.68528,-21.72107 4.64364,-33.38638 -0.62697,-7.02144 -2.09193,-11.94667 -5.7505,-19.33333 l -4.9092,-9.9117 -20,-0.81054 c -21.84128,-0.88515 -28.21027,-2.52955 -40.60624,-10.48401 -14.99842,-9.62447 -22.84269,-22.41774 -23.79111,-38.80107 -0.52403,-9.05228 -0.16804,-11.2222 2.96862,-18.09505 13.0391,-28.57043 51.29541,-38.75941 94.49555,-25.16745 3.81325,1.19975 13.53318,5.71914 21.59985,10.04308 8.06666,4.32394 22.76666,11.92388 32.66666,16.88876 27.66558,13.87438 37.14934,24.92141 33.38767,38.89119 -1.34861,5.00836 -1.15783,5.4646 7.9452,19 5.12985,7.62763 11.32111,16.21305 13.75836,19.07871 l 4.43135,5.21029 2.97826,-4.81892 c 4.76285,-7.70645 16.03297,-16.98202 26.8325,-22.08377 9.43047,-4.45499 10.79735,-4.72737 24,-4.78243 12.67918,-0.0529 14.78588,0.3041 22.32997,3.78366 9.56861,4.41333 17.86756,12.65314 22.07061,21.91332 2.1426,4.72059 2.82364,8.83676 2.80499,16.9533 -0.0341,14.8297 -4.9298,25.28103 -17.93402,38.28524 -6.57229,6.5723 -8.91125,9.72766 -7.74503,10.44842 3.58086,2.21309 18.80407,3.88061 35.42719,3.88061 16.91936,0 17.42424,-0.0832 18.20591,-3 1.93423,-7.21755 0.75466,-13.17745 -4.65201,-23.50488 -5.15419,-9.84514 -5.39421,-10.78866 -3.89796,-15.32234 1.61881,-4.90504 5.73719,-8.83945 9.25278,-8.83945 1.39879,0 1.10807,0.88102 -1.04805,3.1761 -4.38947,4.67238 -3.92991,9.94798 1.65472,18.9958 4.06564,6.58685 4.85943,9.08034 4.83495,15.18773 -0.0374,9.34569 -3.35454,16.59171 -10.57623,23.10326 -8.71556,7.85852 -13.20829,9.21692 -30.06115,9.08915 -16.63087,-0.12609 -30.15054,-3.08046 -45.33334,-9.90642 -16.71216,-7.51354 -27.91821,-16.21386 -51.13234,-39.69891 -19.21551,-19.43978 -23.42723,-23.03267 -31.3197,-26.71796 -8.29607,-3.87375 -10.52136,-4.30209 -24.66667,-4.748 l -15.54796,-0.49013 9.33334,2.43631 c 5.13333,1.33998 11.94044,3.71523 15.12691,5.27834 8.10517,3.97598 22.60901,13.92885 23.50489,16.12962 0.53558,1.31566 -0.26448,1.17218 -2.82731,-0.50705 -8.06366,-5.28352 -12.11943,-7.23371 -18.1889,-8.74602 -8.49998,-2.11792 -9.24941,-0.90136 -1.31198,2.12976 9.51744,3.63451 21.54124,11.05217 28.98394,17.88062 4.95386,4.54503 6.03718,5.15127 4.30259,2.4078 -1.27505,-2.01667 -1.9989,-3.66667 -1.60855,-3.66667 0.39035,0 2.53815,2.97157 4.77289,6.60349 3.18847,5.18192 5.62559,7.31878 11.32101,9.92623 5.80976,2.6598 7.25784,3.95277 7.25784,6.4804 0,4.9437 6.78322,10.51363 13.76171,11.30021 5.02511,0.5664 6.5634,1.48616 9.76801,5.84035 5.09309,6.92013 13.63432,11.09709 20.45994,10.00563 4.40599,-0.70455 5.28837,-0.43105 6.01711,1.86502 1.52285,4.79805 8.83577,6.59391 27.78139,6.82235 19.80191,0.23876 24.78704,-0.99274 36.5119,-9.01973 7.84802,-5.37286 13.85281,-13.5818 17.11134,-23.39229 2.2333,-6.72384 2.1972,-15.39177 -0.1967,-47.22632 -0.84965,-11.29888 0.62672,-16.32108 7.07329,-24.06139 8.2279,-9.87912 26.43283,-9.35278 31.74394,0.91778 2.9618,5.7275 0.9953,7.5367 -2.51471,2.31355 -6.02352,-8.96343 -17.42944,-7.61683 -24.51268,2.89399 -3.87926,5.75643 -3.90957,13.60182 -0.13505,34.95994 2.52426,14.28355 2.6822,17.4416 1.31279,26.25 -0.85618,5.50717 -1.09745,10.4298 -0.53615,10.93918 0.5613,0.50938 3.42054,1.68053 6.35388,2.60257 28.49168,8.95579 44.82906,33.41151 37.35421,55.91618 -4.56774,13.75218 -15.23357,21.67924 -29.34801,21.81202 -21.02823,0.19783 -32.70678,-20.36287 -18.22296,-32.08249 5.73524,-4.64068 16.51174,0.24844 18.36815,8.33333 l 0.91846,4 -3.71675,-3.66666 c -6.93666,-6.84321 -15.3989,-3.41933 -13.37479,5.41153 1.06395,4.64183 6.20611,8.35478 12.7946,9.23849 9.7929,1.3135 18.51845,-7.49821 18.55299,-18.73618 0.0164,-5.33785 -5.56889,-15.00491 -11.05354,-19.13155 -6.18615,-4.65443 -19.93602,-9.78229 -26.2303,-9.78229 -2.22314,0 -4.04206,-0.46072 -4.04206,-1.02382 0,-1.06764 6.46464,-10.97618 7.16119,-10.97618 0.21912,0 4.23454,1.25934 8.92316,2.79853 21.70748,7.1262 31.61316,15.46702 36.77694,30.96703 l 1.85488,5.56777 -0.75142,-5.94336 c -2.18329,-17.26876 -15.10898,-30.96964 -36.40844,-38.59199 -4.64403,-1.66194 -8.62028,-2.82137 -8.83611,-2.57652 -0.21583,0.24486 -1.6046,2.8452 -3.08616,5.77854 -10.97253,21.72449 -39.44465,35.55265 -68.18181,33.1141 l -8.78557,-0.74552 5.33334,4.48238 c 9.15855,7.69726 13.93365,13.51807 18.30466,22.31326 3.61665,7.27728 4.29244,10.24508 4.70597,20.66667 0.56458,14.22845 1.62772,16.91365 8.49615,21.45896 9.92131,6.56562 23.24202,2.92123 28.30266,-7.74327 5.74421,-12.10503 0.12782,-27.38471 -10.10978,-27.50418 -3.35397,-0.0391 -3.53357,0.22085 -2.33333,3.37773 1.71819,4.51917 1.70197,4.57987 -1.22368,4.57987 -5.80503,0 -4.06985,-9.7268 2.16677,-12.14618 5.71057,-2.2153 13.75926,2.56837 17.76923,10.56101 9.99681,19.92558 -5.63384,45.58517 -27.7684,45.58517 -7.38539,0 -15.15826,-2.54416 -19.34286,-6.33117 -1.56044,-1.41218 -2.80027,-1.7308 -3.38213,-0.86916 -8.30801,12.30281 -17.65067,17.867 -29.99995,17.867 -13.92828,0 -24.42247,-7.99609 -29.53065,-22.50097 -5.48415,-15.57246 0.94009,-32.078 14.98859,-38.50962 6.22625,-2.85047 8.46226,-3.21194 15.38969,-2.48788 l 8.10504,0.84714 -4.34932,-4.48735 c -4.75862,-4.90966 -11.64531,-7.53802 -19.67669,-7.50979 -8.8296,0.031 -10.44554,1.01335 -12.8627,7.81903 -4.60056,12.95315 -13.83405,22.29098 -26.50585,26.80534 -4.14176,1.47551 -7.02453,3.27585 -6.86047,4.28448 0.15563,0.95679 1.24768,5.03962 2.42679,9.07295 1.56388,5.3495 1.93919,10.26878 1.38738,18.18434 -0.66608,9.55469 -0.3417,11.94401 2.71526,20.00001 2.57534,6.78678 3.5211,11.90304 3.66299,19.81565 0.10789,6.01594 0.88984,11.53868 1.79345,12.66667 0.88119,1.1 4.22091,5.41285 7.4216,9.58412 8.37606,10.91601 17.5805,18.06325 26.97624,20.94701 8.25863,2.53475 9.50794,2.59596 18.89607,0.92585 19.55501,-3.47877 32.92392,-27.30012 23.4424,-41.77076 -2.14261,-3.27003 -0.94499,-3.91227 2.44374,-1.31049 3.72432,2.85945 5.21779,7.2496 5.21779,15.33803 0,13.76523 -9.33787,27.24934 -23.78036,34.33945 -8.93151,4.38465 -22.68358,5.58892 -32.42982,2.83988 z M 250.66667,470.66668 c 0,-0.73333 -0.63541,-1.33333 -1.41202,-1.33333 -0.77661,0 -1.0412,0.6 -0.58798,1.33333 0.45323,0.73333 1.08864,1.33333 1.41203,1.33333 0.32338,0 0.58797,-0.6 0.58797,-1.33333 z m 30.38646,-3.85812 c 9.9447,-5.07557 12.91991,-12.89714 7.84947,-20.6356 -3.34903,-5.11127 -7.96991,-4.64062 -11.39259,1.16039 -1.55842,2.64133 -3.81674,4.66666 -5.20348,4.66666 -1.34754,0 -4.48548,-2.1 -6.97319,-4.66666 -5.3021,-5.47038 -6.15023,-5.61668 -10.2474,-1.76758 -3.54265,3.32815 -3.86781,6.38802 -1.22244,11.5036 5.48996,10.61641 17.23086,14.82194 27.18963,9.73919 z m -43.91775,-9.14188 c -6.75918,-13.84723 -4.87686,-31.07406 4.55439,-41.68149 11.37974,-12.79892 28.16398,-17.53444 44.05971,-12.43105 18.97925,6.09337 31.33555,21.63671 39.57238,49.77921 3.72163,12.71558 5.34482,14.48976 5.34482,5.842 0,-18.14731 -14.33788,-44.33382 -29.84509,-54.50867 -6.0638,-3.97868 -8.1708,-6.68988 -3.93619,-5.0649 1.49185,0.57247 1.90289,0.34036 1.25465,-0.70852 -1.22442,-1.98115 -6.14004,-2.04835 -6.14004,-0.0839 0,0.86579 -0.96464,1.09727 -2.33333,0.55992 -6.9548,-2.73047 -18.15877,-3.61937 -26.05037,-2.06679 -20.62956,4.05861 -33.7721,17.72089 -35.27655,36.67157 -0.78357,9.87032 1.02959,16.94353 6.43544,25.10487 5.68052,8.57602 6.88414,7.85582 2.36018,-1.41222 z m 152.21877,-40.15079 c 16.42407,-8.7819 11.11333,-36.05392 -7.46957,-38.3582 -16.47272,-2.04261 -25.40011,20.18981 -13.534,33.70456 6.64895,7.57273 12.93814,8.96619 21.00357,4.65364 z m -74.02081,-40.18255 c 0.50901,-0.82359 -1.88214,-1.34543 -6.25464,-1.36498 -13.67121,-0.0611 -27.45258,-7.87211 -46.91044,-26.58786 -12.80255,-12.31427 -20.50496,-22.621 -25.72352,-34.42111 -4.72778,-10.69033 -5.49487,-26.69508 -1.96315,-40.95938 3.18103,-12.84792 0.37213,-10.57552 -3.85844,3.12147 -5.31527,17.20884 -2.3887,35.8883 8.19527,52.30804 11.84925,18.38266 38.44663,41.86572 53.18159,46.95451 6.79421,2.34641 22.08539,2.96853 23.33333,0.94931 z m -15.33333,-8.79211 c 0,-0.43566 -8.35638,-9.28566 -18.56973,-19.66666 -29.88005,-30.37054 -29.9671,-30.53996 -30.0434,-58.47346 -0.0653,-23.91699 -1.4583,-26.91392 -6.95707,-14.96796 -2.87459,6.24499 -3.75022,10.42277 -4.17936,19.94033 -0.50361,11.16928 -0.24962,12.6869 3.51156,20.982 6.46696,14.26258 18.2798,28.11962 36.238,42.50896 8.87264,7.10937 20,12.49323 20,9.67679 z m 15.73288,-1.0812 c 1.98025,-1.03032 5.05504,-3.43032 6.83287,-5.33333 l 3.23242,-3.46002 -2.96428,-3.15534 c -2.01019,-2.13975 -5.04075,-3.40126 -9.41569,-3.9194 -9.10656,-1.07854 -16.08487,-4.23629 -16.08487,-7.27854 0,-1.75473 -2.12638,-3.37069 -7.2055,-5.47587 -7.96916,-3.30303 -16.7945,-11.00161 -16.7945,-14.65029 0,-4.09457 -5.0248,-8.18723 -10.05194,-8.18723 -2.5381,0 -4.61077,0.45 -4.60594,1 0.0212,2.40821 6.00393,9.33902 25.99122,30.10979 22.39811,23.27609 23.7459,24.15898 31.06621,20.35023 z M 354.08793,359.83 c 5.63874,-10.90413 -0.27539,-25.87884 -13.01506,-32.9544 -17.95972,-9.97475 -22.92867,-13.067 -28.07257,-17.46999 -5.87722,-5.03068 -21.36473,-27.73724 -20.202,-29.61857 1.30958,-2.11895 2.71257,-1.11039 4.93319,3.5463 1.22396,2.56667 3.06008,4.66667 4.08028,4.66667 1.0202,0 3.87991,0.40059 6.35491,0.89019 l 4.5,0.8902 -6.40507,-6.51598 c -4.2365,-4.30985 -7.5972,-6.56815 -9.92612,-6.6701 -3.88674,-0.17015 -4.17607,-0.5705 -8.39216,-11.6122 -1.61383,-4.22651 -4.6469,-9.12568 -6.74017,-10.88705 -3.79201,-3.19076 -11.37216,-5.70383 -12.82432,-4.25167 -2.37618,2.37618 18.72985,46.1181 26.40662,54.72729 7.30698,8.19451 17.65566,14.95591 30.5779,19.97834 17.79191,6.91512 23.16176,11.86303 26.55232,24.46599 1.50017,5.57625 0.96138,8.03023 -3.72915,16.98499 -0.38413,0.73333 0.35633,0.47703 1.64545,-0.56956 1.28912,-1.04658 3.2043,-3.56679 4.25595,-5.60045 z m -6.81506,-13.7691 c -3.43774,-7.2445 -10.00299,-12.08566 -21.64989,-15.96443 -18.47103,-6.15142 -31.99376,-15.85613 -40.46132,-29.03744 -2.21681,-3.45088 -7.21392,-13.65088 -11.10468,-22.66667 -10.8875,-25.22881 -12.74854,-29.05902 -14.11936,-29.05902 -1.80056,0 -1.88251,-0.31107 4.70745,17.86881 8.90382,24.56315 14.89426,35.66559 25.01507,46.36189 8.25223,8.72147 17.81865,13.89703 40.33987,21.82438 7.44873,2.62191 16.09756,10.64537 17.59014,16.31825 0.67093,2.55 1.09733,2.94963 1.4363,1.34612 0.26515,-1.25431 -0.52396,-4.40065 -1.75358,-6.99189 z m 14.61032,-17.87186 c 0.38897,-0.62937 -4.6659,-4.35191 -11.23304,-8.27232 -6.56713,-3.9204 -13.49707,-8.46574 -15.39985,-10.10075 -7.89095,-6.78049 -14.35892,-11.81231 -15.11295,-11.75728 -2.44445,0.17839 -8.13734,3.94665 -8.13734,5.38628 0,1.87625 14.39029,11.75411 24.66667,16.93181 3.66666,1.84744 8.10847,4.61843 9.87068,6.15777 3.28822,2.87235 13.88693,4.01504 15.34583,1.65449 z m 75.18631,-28.90087 c 3.78776,-1.12484 8.54666,-3.50588 10.57534,-5.29119 l 3.68851,-3.24603 -16.26771,-0.0421 c -22.49317,-0.0583 -37.2692,-3.19953 -53.7323,-11.42309 -18.51653,-9.24927 -37.20813,-26.21563 -54.73723,-49.68496 -2.02688,-2.71375 -5.3032,-6.73409 -7.28071,-8.93409 -1.97751,-2.2 -7.42402,-9.47371 -12.10335,-16.16381 -5.65084,-8.07905 -9.87179,-12.72875 -12.56938,-13.84613 -4.76869,-1.97526 -6.85956,-0.91354 -2.64398,1.34257 3.52286,1.88538 7.08873,9.9079 5.97026,13.43191 -1.07736,3.39445 -4.12355,3.24049 -14.70763,-0.74335 -4.83976,-1.82168 -12.80346,-3.99063 -17.69711,-4.81988 -9.87876,-1.674 -16.11696,-4.86531 -20.08322,-10.27409 -2.06049,-2.80988 -2.99041,-3.24385 -4.26276,-1.98932 -2.49666,2.4617 1.33677,11.09802 6.45799,14.54921 2.41225,1.62562 7.5778,3.25058 11.95265,3.76003 24.10567,2.80709 34.95068,9.74733 63.13429,40.40265 31.01996,33.74043 45.68745,43.89993 75.27632,52.14052 11.64945,3.24441 29.61547,3.62701 39.03002,0.83119 z m -51.97938,-32.95483 c 8.00301,-3.96918 18.37209,-14.19338 21.59415,-21.29242 5.30537,-11.68913 2.45016,-25.1543 -6.60438,-31.14632 -9.33882,-6.18013 -25.89111,-6.4394 -37.36615,-0.58527 -6.91265,3.52657 -18.83882,14.72672 -21.96255,20.62555 l -2.58216,4.87612 8.70172,8.70172 8.70171,8.70172 4.79993,-2.00554 c 6.76455,-2.82641 16.54679,-12.24725 18.33115,-17.65392 3.14796,-9.53842 -2.89938,-18.7163 -10.15422,-15.41077 -4.04659,1.84375 -4.54931,1.87517 -4.54931,0.28437 0,-2.62196 4.37658,-5.42857 8.46523,-5.42857 12.32467,0 17.83856,14.44376 10.94346,28.66666 -3.83996,7.92091 -6.35257,10.97636 -13.18699,16.03594 l -5.11162,3.78419 3.11162,2.39362 c 4.19939,3.23038 9.60548,3.05505 16.86841,-0.54708 z m 28.4664,-22.66667 c 3.9327,-7.56964 4.29555,-24.61765 0.67868,-31.88668 -3.19628,-6.42372 -10.28766,-11.17304 -20.63452,-13.81959 -16.36791,-4.18662 -35.70599,1.99811 -49.72105,15.90184 -7.44667,7.38753 -13.13535,15.99315 -11.59221,17.53629 0.46042,0.46041 4.70546,-3.10813 9.43342,-7.93009 6.33395,-6.45988 11.33431,-10.06749 18.99995,-13.70788 9.27808,-4.40615 11.56895,-4.94625 21.17476,-4.99221 9.49158,-0.0454 11.62521,0.41849 17.96074,3.90516 4.09745,2.25498 8.59074,6.07397 10.44742,8.87959 5.49512,8.30369 5.42169,15.38579 -0.30532,29.44691 -1.87641,4.60702 0.67429,2.21747 3.55813,-3.33334 z M 267.79787,192.15315 c 3.26852,-2.07135 0.96077,-5.91568 -5.47899,-9.1271 -6.78875,-3.38545 -8.98554,-3.11328 -8.98554,1.11325 0,6.01081 9.40391,11.2209 14.46453,8.01385 z m 18.86881,-8.55412 c 0,-0.95388 -2.7,-3.04608 -6,-4.64934 -3.30001,-1.60327 -6.00001,-3.40196 -6.00001,-3.9971 0,-2.23425 -10.97193,-12.3879 -16.37935,-15.15779 -9.71088,-4.97428 -23.19,-7.75902 -36.95398,-7.63456 l -12.66667,0.11454 12.66667,1.77289 c 22.37248,3.13135 34.56922,8.75265 49.58007,22.85073 6.16041,5.78582 10.0445,8.43494 12.36715,8.43494 1.89044,0 3.38612,-0.76606 3.38612,-1.73431 z m -9.33334,-16.44165 c 0,-2.25543 -6.11973,-10.28583 -11.26757,-14.78546 -18.57379,-16.235 -47.25332,-25.55956 -78.91847,-25.65873 -17.18944,-0.0538 -33.55641,2.69388 -44.27069,7.43224 -6.98096,3.08731 -13.54327,7.85236 -13.54327,9.83408 0,0.4664 5.00227,-0.82514 11.11615,-2.87008 25.45899,-8.51541 66.39771,-7.94487 94.88385,1.32235 12.90875,4.19952 33.17567,16.12112 37.50548,22.06183 2.36423,3.24383 4.49452,4.50639 4.49452,2.66377 z"/>
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <!-- Eldritch, Inc. -->
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 407.758 407.678">
3
+ <path transform="translate(-114.737 -108.016)" fill="currentColor" d="m 363.78983,514.22644 c -13.90077,-3.92087 -30.42211,-17.1351 -41.12073,-32.88953 -3.09616,-4.5593 -9.37095,-16.17527 -13.94397,-25.81326 -9.69994,-20.44337 -13.51048,-25.43562 -22.67063,-29.70114 -16.25202,-7.56793 -32.75506,-0.52234 -34.84311,14.87544 -0.57382,4.2315 -0.4188,4.83092 0.76775,2.9687 0.81771,-1.28335 3.26234,-3.25156 5.43251,-4.3738 4.61564,-2.38684 8.07638,-1.18615 12.9687,4.49943 3.00891,3.49679 3.07216,3.50773 5.05945,0.8744 1.1422,-1.51351 1.68747,-3.96397 1.26093,-5.66667 -0.68817,-2.74709 -0.28867,-3 4.73904,-3 12.51903,0 21.1047,9.58813 19.47378,21.74754 -1.87766,13.99901 -20.7535,25.51215 -37.66855,22.97558 -14.02151,-2.10266 -29.64722,-13.99865 -35.66956,-27.15556 -4.28975,-9.37175 -4.01796,-23.82503 0.63512,-33.77474 6.94955,-14.86022 21.25086,-24.62135 38.14909,-26.03804 10.23128,-0.85775 10.85583,-1.81261 5.257,-8.03729 -2.24259,-2.49328 -3.55898,-2.82496 -8.51553,-2.14559 -7.97922,1.09368 -12.43445,-2.82287 -12.43445,-10.931 0,-7.22411 -3.47664,-10.60514 -10.48013,-10.1919 -7.20694,0.42524 -10.15419,-3.13225 -9.08109,-10.96138 0.78606,-5.73491 0.63763,-6.04174 -5.48209,-11.33232 -13.17277,-11.38806 -12.4017,-10.32065 -11.50522,-15.9269 0.93685,-5.85877 -1.19575,-11.02444 -6.65812,-16.12749 -4.27579,-3.99453 -4.57901,-10.31871 -0.72939,-15.21272 l 2.73063,-3.47143 -2.72488,-2.33311 c -4.25063,-3.63951 -4.74543,-9.74665 -1.38698,-17.11891 3.83505,-8.41845 5.68528,-21.72107 4.64364,-33.38638 -0.62697,-7.02144 -2.09193,-11.94667 -5.7505,-19.33333 l -4.9092,-9.9117 -20,-0.81054 c -21.84128,-0.88515 -28.21027,-2.52955 -40.60624,-10.48401 -14.99842,-9.62447 -22.84269,-22.41774 -23.79111,-38.80107 -0.52403,-9.05228 -0.16804,-11.2222 2.96862,-18.09505 13.0391,-28.57043 51.29541,-38.75941 94.49555,-25.16745 3.81325,1.19975 13.53318,5.71914 21.59985,10.04308 8.06666,4.32394 22.76666,11.92388 32.66666,16.88876 27.66558,13.87438 37.14934,24.92141 33.38767,38.89119 -1.34861,5.00836 -1.15783,5.4646 7.9452,19 5.12985,7.62763 11.32111,16.21305 13.75836,19.07871 l 4.43135,5.21029 2.97826,-4.81892 c 4.76285,-7.70645 16.03297,-16.98202 26.8325,-22.08377 9.43047,-4.45499 10.79735,-4.72737 24,-4.78243 12.67918,-0.0529 14.78588,0.3041 22.32997,3.78366 9.56861,4.41333 17.86756,12.65314 22.07061,21.91332 2.1426,4.72059 2.82364,8.83676 2.80499,16.9533 -0.0341,14.8297 -4.9298,25.28103 -17.93402,38.28524 -6.57229,6.5723 -8.91125,9.72766 -7.74503,10.44842 3.58086,2.21309 18.80407,3.88061 35.42719,3.88061 16.91936,0 17.42424,-0.0832 18.20591,-3 1.93423,-7.21755 0.75466,-13.17745 -4.65201,-23.50488 -5.15419,-9.84514 -5.39421,-10.78866 -3.89796,-15.32234 1.61881,-4.90504 5.73719,-8.83945 9.25278,-8.83945 1.39879,0 1.10807,0.88102 -1.04805,3.1761 -4.38947,4.67238 -3.92991,9.94798 1.65472,18.9958 4.06564,6.58685 4.85943,9.08034 4.83495,15.18773 -0.0374,9.34569 -3.35454,16.59171 -10.57623,23.10326 -8.71556,7.85852 -13.20829,9.21692 -30.06115,9.08915 -16.63087,-0.12609 -30.15054,-3.08046 -45.33334,-9.90642 -16.71216,-7.51354 -27.91821,-16.21386 -51.13234,-39.69891 -19.21551,-19.43978 -23.42723,-23.03267 -31.3197,-26.71796 -8.29607,-3.87375 -10.52136,-4.30209 -24.66667,-4.748 l -15.54796,-0.49013 9.33334,2.43631 c 5.13333,1.33998 11.94044,3.71523 15.12691,5.27834 8.10517,3.97598 22.60901,13.92885 23.50489,16.12962 0.53558,1.31566 -0.26448,1.17218 -2.82731,-0.50705 -8.06366,-5.28352 -12.11943,-7.23371 -18.1889,-8.74602 -8.49998,-2.11792 -9.24941,-0.90136 -1.31198,2.12976 9.51744,3.63451 21.54124,11.05217 28.98394,17.88062 4.95386,4.54503 6.03718,5.15127 4.30259,2.4078 -1.27505,-2.01667 -1.9989,-3.66667 -1.60855,-3.66667 0.39035,0 2.53815,2.97157 4.77289,6.60349 3.18847,5.18192 5.62559,7.31878 11.32101,9.92623 5.80976,2.6598 7.25784,3.95277 7.25784,6.4804 0,4.9437 6.78322,10.51363 13.76171,11.30021 5.02511,0.5664 6.5634,1.48616 9.76801,5.84035 5.09309,6.92013 13.63432,11.09709 20.45994,10.00563 4.40599,-0.70455 5.28837,-0.43105 6.01711,1.86502 1.52285,4.79805 8.83577,6.59391 27.78139,6.82235 19.80191,0.23876 24.78704,-0.99274 36.5119,-9.01973 7.84802,-5.37286 13.85281,-13.5818 17.11134,-23.39229 2.2333,-6.72384 2.1972,-15.39177 -0.1967,-47.22632 -0.84965,-11.29888 0.62672,-16.32108 7.07329,-24.06139 8.2279,-9.87912 26.43283,-9.35278 31.74394,0.91778 2.9618,5.7275 0.9953,7.5367 -2.51471,2.31355 -6.02352,-8.96343 -17.42944,-7.61683 -24.51268,2.89399 -3.87926,5.75643 -3.90957,13.60182 -0.13505,34.95994 2.52426,14.28355 2.6822,17.4416 1.31279,26.25 -0.85618,5.50717 -1.09745,10.4298 -0.53615,10.93918 0.5613,0.50938 3.42054,1.68053 6.35388,2.60257 28.49168,8.95579 44.82906,33.41151 37.35421,55.91618 -4.56774,13.75218 -15.23357,21.67924 -29.34801,21.81202 -21.02823,0.19783 -32.70678,-20.36287 -18.22296,-32.08249 5.73524,-4.64068 16.51174,0.24844 18.36815,8.33333 l 0.91846,4 -3.71675,-3.66666 c -6.93666,-6.84321 -15.3989,-3.41933 -13.37479,5.41153 1.06395,4.64183 6.20611,8.35478 12.7946,9.23849 9.7929,1.3135 18.51845,-7.49821 18.55299,-18.73618 0.0164,-5.33785 -5.56889,-15.00491 -11.05354,-19.13155 -6.18615,-4.65443 -19.93602,-9.78229 -26.2303,-9.78229 -2.22314,0 -4.04206,-0.46072 -4.04206,-1.02382 0,-1.06764 6.46464,-10.97618 7.16119,-10.97618 0.21912,0 4.23454,1.25934 8.92316,2.79853 21.70748,7.1262 31.61316,15.46702 36.77694,30.96703 l 1.85488,5.56777 -0.75142,-5.94336 c -2.18329,-17.26876 -15.10898,-30.96964 -36.40844,-38.59199 -4.64403,-1.66194 -8.62028,-2.82137 -8.83611,-2.57652 -0.21583,0.24486 -1.6046,2.8452 -3.08616,5.77854 -10.97253,21.72449 -39.44465,35.55265 -68.18181,33.1141 l -8.78557,-0.74552 5.33334,4.48238 c 9.15855,7.69726 13.93365,13.51807 18.30466,22.31326 3.61665,7.27728 4.29244,10.24508 4.70597,20.66667 0.56458,14.22845 1.62772,16.91365 8.49615,21.45896 9.92131,6.56562 23.24202,2.92123 28.30266,-7.74327 5.74421,-12.10503 0.12782,-27.38471 -10.10978,-27.50418 -3.35397,-0.0391 -3.53357,0.22085 -2.33333,3.37773 1.71819,4.51917 1.70197,4.57987 -1.22368,4.57987 -5.80503,0 -4.06985,-9.7268 2.16677,-12.14618 5.71057,-2.2153 13.75926,2.56837 17.76923,10.56101 9.99681,19.92558 -5.63384,45.58517 -27.7684,45.58517 -7.38539,0 -15.15826,-2.54416 -19.34286,-6.33117 -1.56044,-1.41218 -2.80027,-1.7308 -3.38213,-0.86916 -8.30801,12.30281 -17.65067,17.867 -29.99995,17.867 -13.92828,0 -24.42247,-7.99609 -29.53065,-22.50097 -5.48415,-15.57246 0.94009,-32.078 14.98859,-38.50962 6.22625,-2.85047 8.46226,-3.21194 15.38969,-2.48788 l 8.10504,0.84714 -4.34932,-4.48735 c -4.75862,-4.90966 -11.64531,-7.53802 -19.67669,-7.50979 -8.8296,0.031 -10.44554,1.01335 -12.8627,7.81903 -4.60056,12.95315 -13.83405,22.29098 -26.50585,26.80534 -4.14176,1.47551 -7.02453,3.27585 -6.86047,4.28448 0.15563,0.95679 1.24768,5.03962 2.42679,9.07295 1.56388,5.3495 1.93919,10.26878 1.38738,18.18434 -0.66608,9.55469 -0.3417,11.94401 2.71526,20.00001 2.57534,6.78678 3.5211,11.90304 3.66299,19.81565 0.10789,6.01594 0.88984,11.53868 1.79345,12.66667 0.88119,1.1 4.22091,5.41285 7.4216,9.58412 8.37606,10.91601 17.5805,18.06325 26.97624,20.94701 8.25863,2.53475 9.50794,2.59596 18.89607,0.92585 19.55501,-3.47877 32.92392,-27.30012 23.4424,-41.77076 -2.14261,-3.27003 -0.94499,-3.91227 2.44374,-1.31049 3.72432,2.85945 5.21779,7.2496 5.21779,15.33803 0,13.76523 -9.33787,27.24934 -23.78036,34.33945 -8.93151,4.38465 -22.68358,5.58892 -32.42982,2.83988 z M 250.66667,470.66668 c 0,-0.73333 -0.63541,-1.33333 -1.41202,-1.33333 -0.77661,0 -1.0412,0.6 -0.58798,1.33333 0.45323,0.73333 1.08864,1.33333 1.41203,1.33333 0.32338,0 0.58797,-0.6 0.58797,-1.33333 z m 30.38646,-3.85812 c 9.9447,-5.07557 12.91991,-12.89714 7.84947,-20.6356 -3.34903,-5.11127 -7.96991,-4.64062 -11.39259,1.16039 -1.55842,2.64133 -3.81674,4.66666 -5.20348,4.66666 -1.34754,0 -4.48548,-2.1 -6.97319,-4.66666 -5.3021,-5.47038 -6.15023,-5.61668 -10.2474,-1.76758 -3.54265,3.32815 -3.86781,6.38802 -1.22244,11.5036 5.48996,10.61641 17.23086,14.82194 27.18963,9.73919 z m -43.91775,-9.14188 c -6.75918,-13.84723 -4.87686,-31.07406 4.55439,-41.68149 11.37974,-12.79892 28.16398,-17.53444 44.05971,-12.43105 18.97925,6.09337 31.33555,21.63671 39.57238,49.77921 3.72163,12.71558 5.34482,14.48976 5.34482,5.842 0,-18.14731 -14.33788,-44.33382 -29.84509,-54.50867 -6.0638,-3.97868 -8.1708,-6.68988 -3.93619,-5.0649 1.49185,0.57247 1.90289,0.34036 1.25465,-0.70852 -1.22442,-1.98115 -6.14004,-2.04835 -6.14004,-0.0839 0,0.86579 -0.96464,1.09727 -2.33333,0.55992 -6.9548,-2.73047 -18.15877,-3.61937 -26.05037,-2.06679 -20.62956,4.05861 -33.7721,17.72089 -35.27655,36.67157 -0.78357,9.87032 1.02959,16.94353 6.43544,25.10487 5.68052,8.57602 6.88414,7.85582 2.36018,-1.41222 z m 152.21877,-40.15079 c 16.42407,-8.7819 11.11333,-36.05392 -7.46957,-38.3582 -16.47272,-2.04261 -25.40011,20.18981 -13.534,33.70456 6.64895,7.57273 12.93814,8.96619 21.00357,4.65364 z m -74.02081,-40.18255 c 0.50901,-0.82359 -1.88214,-1.34543 -6.25464,-1.36498 -13.67121,-0.0611 -27.45258,-7.87211 -46.91044,-26.58786 -12.80255,-12.31427 -20.50496,-22.621 -25.72352,-34.42111 -4.72778,-10.69033 -5.49487,-26.69508 -1.96315,-40.95938 3.18103,-12.84792 0.37213,-10.57552 -3.85844,3.12147 -5.31527,17.20884 -2.3887,35.8883 8.19527,52.30804 11.84925,18.38266 38.44663,41.86572 53.18159,46.95451 6.79421,2.34641 22.08539,2.96853 23.33333,0.94931 z m -15.33333,-8.79211 c 0,-0.43566 -8.35638,-9.28566 -18.56973,-19.66666 -29.88005,-30.37054 -29.9671,-30.53996 -30.0434,-58.47346 -0.0653,-23.91699 -1.4583,-26.91392 -6.95707,-14.96796 -2.87459,6.24499 -3.75022,10.42277 -4.17936,19.94033 -0.50361,11.16928 -0.24962,12.6869 3.51156,20.982 6.46696,14.26258 18.2798,28.11962 36.238,42.50896 8.87264,7.10937 20,12.49323 20,9.67679 z m 15.73288,-1.0812 c 1.98025,-1.03032 5.05504,-3.43032 6.83287,-5.33333 l 3.23242,-3.46002 -2.96428,-3.15534 c -2.01019,-2.13975 -5.04075,-3.40126 -9.41569,-3.9194 -9.10656,-1.07854 -16.08487,-4.23629 -16.08487,-7.27854 0,-1.75473 -2.12638,-3.37069 -7.2055,-5.47587 -7.96916,-3.30303 -16.7945,-11.00161 -16.7945,-14.65029 0,-4.09457 -5.0248,-8.18723 -10.05194,-8.18723 -2.5381,0 -4.61077,0.45 -4.60594,1 0.0212,2.40821 6.00393,9.33902 25.99122,30.10979 22.39811,23.27609 23.7459,24.15898 31.06621,20.35023 z M 354.08793,359.83 c 5.63874,-10.90413 -0.27539,-25.87884 -13.01506,-32.9544 -17.95972,-9.97475 -22.92867,-13.067 -28.07257,-17.46999 -5.87722,-5.03068 -21.36473,-27.73724 -20.202,-29.61857 1.30958,-2.11895 2.71257,-1.11039 4.93319,3.5463 1.22396,2.56667 3.06008,4.66667 4.08028,4.66667 1.0202,0 3.87991,0.40059 6.35491,0.89019 l 4.5,0.8902 -6.40507,-6.51598 c -4.2365,-4.30985 -7.5972,-6.56815 -9.92612,-6.6701 -3.88674,-0.17015 -4.17607,-0.5705 -8.39216,-11.6122 -1.61383,-4.22651 -4.6469,-9.12568 -6.74017,-10.88705 -3.79201,-3.19076 -11.37216,-5.70383 -12.82432,-4.25167 -2.37618,2.37618 18.72985,46.1181 26.40662,54.72729 7.30698,8.19451 17.65566,14.95591 30.5779,19.97834 17.79191,6.91512 23.16176,11.86303 26.55232,24.46599 1.50017,5.57625 0.96138,8.03023 -3.72915,16.98499 -0.38413,0.73333 0.35633,0.47703 1.64545,-0.56956 1.28912,-1.04658 3.2043,-3.56679 4.25595,-5.60045 z m -6.81506,-13.7691 c -3.43774,-7.2445 -10.00299,-12.08566 -21.64989,-15.96443 -18.47103,-6.15142 -31.99376,-15.85613 -40.46132,-29.03744 -2.21681,-3.45088 -7.21392,-13.65088 -11.10468,-22.66667 -10.8875,-25.22881 -12.74854,-29.05902 -14.11936,-29.05902 -1.80056,0 -1.88251,-0.31107 4.70745,17.86881 8.90382,24.56315 14.89426,35.66559 25.01507,46.36189 8.25223,8.72147 17.81865,13.89703 40.33987,21.82438 7.44873,2.62191 16.09756,10.64537 17.59014,16.31825 0.67093,2.55 1.09733,2.94963 1.4363,1.34612 0.26515,-1.25431 -0.52396,-4.40065 -1.75358,-6.99189 z m 14.61032,-17.87186 c 0.38897,-0.62937 -4.6659,-4.35191 -11.23304,-8.27232 -6.56713,-3.9204 -13.49707,-8.46574 -15.39985,-10.10075 -7.89095,-6.78049 -14.35892,-11.81231 -15.11295,-11.75728 -2.44445,0.17839 -8.13734,3.94665 -8.13734,5.38628 0,1.87625 14.39029,11.75411 24.66667,16.93181 3.66666,1.84744 8.10847,4.61843 9.87068,6.15777 3.28822,2.87235 13.88693,4.01504 15.34583,1.65449 z m 75.18631,-28.90087 c 3.78776,-1.12484 8.54666,-3.50588 10.57534,-5.29119 l 3.68851,-3.24603 -16.26771,-0.0421 c -22.49317,-0.0583 -37.2692,-3.19953 -53.7323,-11.42309 -18.51653,-9.24927 -37.20813,-26.21563 -54.73723,-49.68496 -2.02688,-2.71375 -5.3032,-6.73409 -7.28071,-8.93409 -1.97751,-2.2 -7.42402,-9.47371 -12.10335,-16.16381 -5.65084,-8.07905 -9.87179,-12.72875 -12.56938,-13.84613 -4.76869,-1.97526 -6.85956,-0.91354 -2.64398,1.34257 3.52286,1.88538 7.08873,9.9079 5.97026,13.43191 -1.07736,3.39445 -4.12355,3.24049 -14.70763,-0.74335 -4.83976,-1.82168 -12.80346,-3.99063 -17.69711,-4.81988 -9.87876,-1.674 -16.11696,-4.86531 -20.08322,-10.27409 -2.06049,-2.80988 -2.99041,-3.24385 -4.26276,-1.98932 -2.49666,2.4617 1.33677,11.09802 6.45799,14.54921 2.41225,1.62562 7.5778,3.25058 11.95265,3.76003 24.10567,2.80709 34.95068,9.74733 63.13429,40.40265 31.01996,33.74043 45.68745,43.89993 75.27632,52.14052 11.64945,3.24441 29.61547,3.62701 39.03002,0.83119 z m -51.97938,-32.95483 c 8.00301,-3.96918 18.37209,-14.19338 21.59415,-21.29242 5.30537,-11.68913 2.45016,-25.1543 -6.60438,-31.14632 -9.33882,-6.18013 -25.89111,-6.4394 -37.36615,-0.58527 -6.91265,3.52657 -18.83882,14.72672 -21.96255,20.62555 l -2.58216,4.87612 8.70172,8.70172 8.70171,8.70172 4.79993,-2.00554 c 6.76455,-2.82641 16.54679,-12.24725 18.33115,-17.65392 3.14796,-9.53842 -2.89938,-18.7163 -10.15422,-15.41077 -4.04659,1.84375 -4.54931,1.87517 -4.54931,0.28437 0,-2.62196 4.37658,-5.42857 8.46523,-5.42857 12.32467,0 17.83856,14.44376 10.94346,28.66666 -3.83996,7.92091 -6.35257,10.97636 -13.18699,16.03594 l -5.11162,3.78419 3.11162,2.39362 c 4.19939,3.23038 9.60548,3.05505 16.86841,-0.54708 z m 28.4664,-22.66667 c 3.9327,-7.56964 4.29555,-24.61765 0.67868,-31.88668 -3.19628,-6.42372 -10.28766,-11.17304 -20.63452,-13.81959 -16.36791,-4.18662 -35.70599,1.99811 -49.72105,15.90184 -7.44667,7.38753 -13.13535,15.99315 -11.59221,17.53629 0.46042,0.46041 4.70546,-3.10813 9.43342,-7.93009 6.33395,-6.45988 11.33431,-10.06749 18.99995,-13.70788 9.27808,-4.40615 11.56895,-4.94625 21.17476,-4.99221 9.49158,-0.0454 11.62521,0.41849 17.96074,3.90516 4.09745,2.25498 8.59074,6.07397 10.44742,8.87959 5.49512,8.30369 5.42169,15.38579 -0.30532,29.44691 -1.87641,4.60702 0.67429,2.21747 3.55813,-3.33334 z M 267.79787,192.15315 c 3.26852,-2.07135 0.96077,-5.91568 -5.47899,-9.1271 -6.78875,-3.38545 -8.98554,-3.11328 -8.98554,1.11325 0,6.01081 9.40391,11.2209 14.46453,8.01385 z m 18.86881,-8.55412 c 0,-0.95388 -2.7,-3.04608 -6,-4.64934 -3.30001,-1.60327 -6.00001,-3.40196 -6.00001,-3.9971 0,-2.23425 -10.97193,-12.3879 -16.37935,-15.15779 -9.71088,-4.97428 -23.19,-7.75902 -36.95398,-7.63456 l -12.66667,0.11454 12.66667,1.77289 c 22.37248,3.13135 34.56922,8.75265 49.58007,22.85073 6.16041,5.78582 10.0445,8.43494 12.36715,8.43494 1.89044,0 3.38612,-0.76606 3.38612,-1.73431 z m -9.33334,-16.44165 c 0,-2.25543 -6.11973,-10.28583 -11.26757,-14.78546 -18.57379,-16.235 -47.25332,-25.55956 -78.91847,-25.65873 -17.18944,-0.0538 -33.55641,2.69388 -44.27069,7.43224 -6.98096,3.08731 -13.54327,7.85236 -13.54327,9.83408 0,0.4664 5.00227,-0.82514 11.11615,-2.87008 25.45899,-8.51541 66.39771,-7.94487 94.88385,1.32235 12.90875,4.19952 33.17567,16.12112 37.50548,22.06183 2.36423,3.24383 4.49452,4.50639 4.49452,2.66377 z"/>
4
+ </svg>
@@ -0,0 +1,172 @@
1
+ /*
2
+ * The server's own pages: the one that asks for the launch key, and the one
3
+ * shown when no web app is built. The web app brings its own styles.
4
+ */
5
+
6
+ :root {
7
+ color-scheme: light dark;
8
+ --paper: #eef0f5;
9
+ --ink: #1b2043;
10
+ --muted: #555c7b;
11
+ --line: #c9cddb;
12
+ --tide: #1d776d;
13
+ --orbit: #1b2043;
14
+ --serif: "Iowan Old Style", "Palatino Linotype", Palatino, "Book Antiqua", Georgia, serif;
15
+ --sans: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
16
+ --mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
17
+ }
18
+
19
+ @media (prefers-color-scheme: dark) {
20
+ :root {
21
+ --paper: #121731;
22
+ --ink: #e5e7f1;
23
+ --muted: #9aa0bd;
24
+ --line: #2c335a;
25
+ --tide: #72d1c2;
26
+ --orbit: #aeb6e0;
27
+ }
28
+ }
29
+
30
+ *,
31
+ *::before,
32
+ *::after {
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ html {
37
+ background: var(--paper);
38
+ }
39
+
40
+ body {
41
+ margin: 0;
42
+ min-height: 100vh;
43
+ min-height: 100dvh;
44
+ overflow-x: hidden;
45
+ background: var(--paper);
46
+ color: var(--ink);
47
+ font: 400 1rem/1.6 var(--sans);
48
+ -webkit-font-smoothing: antialiased;
49
+ }
50
+
51
+ .orbits {
52
+ position: fixed;
53
+ right: -20vmax;
54
+ bottom: -24vmax;
55
+ width: 80vmax;
56
+ height: 80vmax;
57
+ color: var(--orbit);
58
+ opacity: 0.14;
59
+ pointer-events: none;
60
+ transform-origin: 50% 50%;
61
+ animation: drift 300s linear infinite;
62
+ }
63
+
64
+ .orbits .piper {
65
+ fill: var(--tide);
66
+ }
67
+
68
+ .nucleus {
69
+ fill: currentColor;
70
+ }
71
+
72
+ @keyframes drift {
73
+ to {
74
+ transform: rotate(360deg);
75
+ }
76
+ }
77
+
78
+ @media (prefers-reduced-motion: reduce) {
79
+ .orbits {
80
+ animation: none;
81
+ }
82
+ }
83
+
84
+ main {
85
+ position: relative;
86
+ max-width: 38rem;
87
+ margin-left: clamp(0rem, 9vw, 8rem);
88
+ padding: clamp(3rem, 14vh, 9rem) 1.5rem 4rem;
89
+ }
90
+
91
+ @media (max-width: 40rem) {
92
+ main {
93
+ margin-left: 0;
94
+ }
95
+ }
96
+
97
+ .mark {
98
+ display: flex;
99
+ align-items: center;
100
+ gap: 0.6rem;
101
+ margin: 0 0 3.5rem;
102
+ font-family: var(--serif);
103
+ font-size: 1.1rem;
104
+ letter-spacing: 0.02em;
105
+ }
106
+
107
+ .mark svg {
108
+ width: 1.9rem;
109
+ height: 1.9rem;
110
+ color: var(--ink);
111
+ }
112
+
113
+ h1 {
114
+ margin: 0 0 1.1rem;
115
+ font-family: var(--serif);
116
+ font-size: clamp(1.9rem, 4.6vw, 2.7rem);
117
+ font-weight: 500;
118
+ line-height: 1.15;
119
+ letter-spacing: -0.01em;
120
+ text-wrap: balance;
121
+ }
122
+
123
+ p {
124
+ max-width: 34em;
125
+ margin: 0 0 1rem;
126
+ color: var(--muted);
127
+ }
128
+
129
+ code {
130
+ font-family: var(--mono);
131
+ font-size: 0.9em;
132
+ color: var(--ink);
133
+ }
134
+
135
+ .command {
136
+ display: block;
137
+ margin: 1.6rem 0;
138
+ padding: 0.85rem 1.1rem;
139
+ border-left: 2px solid var(--tide);
140
+ background: color-mix(in srgb, var(--ink) 5%, transparent);
141
+ overflow-x: auto;
142
+ white-space: pre;
143
+ }
144
+
145
+ .facts {
146
+ display: grid;
147
+ grid-template-columns: max-content minmax(0, 1fr);
148
+ gap: 0.4rem 1.5rem;
149
+ margin: 2.5rem 0 0;
150
+ padding-top: 1.25rem;
151
+ border-top: 1px solid var(--line);
152
+ font-size: 0.9rem;
153
+ }
154
+
155
+ .facts dt {
156
+ color: var(--muted);
157
+ }
158
+
159
+ .facts dd {
160
+ margin: 0;
161
+ overflow-wrap: anywhere;
162
+ }
163
+
164
+ a {
165
+ color: var(--tide);
166
+ text-underline-offset: 0.2em;
167
+ }
168
+
169
+ a:focus-visible {
170
+ outline: 2px solid var(--tide);
171
+ outline-offset: 3px;
172
+ }