darabos commited on
Commit
5f4d741
·
2 Parent(s): 34808b7 c138071

Merge remote-tracking branch 'origin/main' into darabos-crdt-updated

Browse files
requirements.txt CHANGED
@@ -2,6 +2,7 @@ fastapi
2
  matplotlib
3
  networkx
4
  numpy
 
5
  pandas
6
  scipy
7
  uvicorn[standard]
 
2
  matplotlib
3
  networkx
4
  numpy
5
+ orjson
6
  pandas
7
  scipy
8
  uvicorn[standard]
server/executors/one_by_one.py CHANGED
@@ -1,8 +1,8 @@
1
  from .. import ops
2
  from .. import workspace
3
- import fastapi
4
- import json
5
  import pandas as pd
 
6
  import traceback
7
  import inspect
8
  import typing
@@ -37,7 +37,7 @@ def register(env: str, cache: bool = True):
37
  ops.EXECUTORS[env] = lambda ws: execute(ws, ops.CATALOGS[env], cache=cache)
38
 
39
  def get_stages(ws, catalog):
40
- '''Inputs on top are batch inputs. We decompose the graph into a DAG of components along these edges.'''
41
  nodes = {n.id: n for n in ws.nodes}
42
  batch_inputs = {}
43
  inputs = {}
@@ -46,7 +46,7 @@ def get_stages(ws, catalog):
46
  node = nodes[edge.target]
47
  op = catalog[node.data.title]
48
  i = op.inputs[edge.targetHandle]
49
- if i.position == 'top':
50
  batch_inputs.setdefault(edge.target, []).append(edge.source)
51
  stages = []
52
  for bt, bss in batch_inputs.items():
@@ -63,6 +63,15 @@ def get_stages(ws, catalog):
63
  stages.append(set(nodes))
64
  return stages
65
 
 
 
 
 
 
 
 
 
 
66
  EXECUTOR_OUTPUT_CACHE = {}
67
 
68
  def execute(ws, catalog, cache=None):
@@ -77,7 +86,7 @@ def execute(ws, catalog, cache=None):
77
  node.data.error = None
78
  op = catalog[node.data.title]
79
  # Start tasks for nodes that have no non-batch inputs.
80
- if all([i.position == 'top' for i in op.inputs.values()]):
81
  tasks[node.id] = [NO_INPUT]
82
  batch_inputs = {}
83
  # Run the rest until we run out of tasks.
@@ -99,12 +108,12 @@ def execute(ws, catalog, cache=None):
99
  for task in ts:
100
  try:
101
  inputs = [
102
- batch_inputs[(n, i.name)] if i.position == 'top' else task
103
  for i in op.inputs.values()]
104
- if cache:
105
- key = json.dumps(fastapi.encoders.jsonable_encoder((inputs, params)))
106
  if key not in cache:
107
- cache[key] = op.func(*inputs, **params)
108
  result = cache[key]
109
  else:
110
  result = op(*inputs, **params)
@@ -126,8 +135,9 @@ def execute(ws, catalog, cache=None):
126
  t = nodes[edge.target]
127
  op = catalog[t.data.title]
128
  i = op.inputs[edge.targetHandle]
129
- if i.position == 'top':
130
  batch_inputs.setdefault((edge.target, edge.targetHandle), []).extend(results)
131
  else:
132
  tasks.setdefault(edge.target, []).extend(results)
133
  tasks = next_stage
 
 
1
  from .. import ops
2
  from .. import workspace
3
+ import orjson
 
4
  import pandas as pd
5
+ import pydantic
6
  import traceback
7
  import inspect
8
  import typing
 
37
  ops.EXECUTORS[env] = lambda ws: execute(ws, ops.CATALOGS[env], cache=cache)
38
 
39
  def get_stages(ws, catalog):
40
+ '''Inputs on top/bottom are batch inputs. We decompose the graph into a DAG of components along these edges.'''
41
  nodes = {n.id: n for n in ws.nodes}
42
  batch_inputs = {}
43
  inputs = {}
 
46
  node = nodes[edge.target]
47
  op = catalog[node.data.title]
48
  i = op.inputs[edge.targetHandle]
49
+ if i.position in 'top or bottom':
50
  batch_inputs.setdefault(edge.target, []).append(edge.source)
51
  stages = []
52
  for bt, bss in batch_inputs.items():
 
63
  stages.append(set(nodes))
64
  return stages
65
 
66
+
67
+ def _default_serializer(obj):
68
+ if isinstance(obj, pydantic.BaseModel):
69
+ return obj.dict()
70
+ return {"__nonserializable__": id(obj)}
71
+
72
+ def make_cache_key(obj):
73
+ return orjson.dumps(obj, default=_default_serializer)
74
+
75
  EXECUTOR_OUTPUT_CACHE = {}
76
 
77
  def execute(ws, catalog, cache=None):
 
86
  node.data.error = None
87
  op = catalog[node.data.title]
88
  # Start tasks for nodes that have no non-batch inputs.
89
+ if all([i.position in 'top or bottom' for i in op.inputs.values()]):
90
  tasks[node.id] = [NO_INPUT]
91
  batch_inputs = {}
92
  # Run the rest until we run out of tasks.
 
108
  for task in ts:
109
  try:
110
  inputs = [
111
+ batch_inputs[(n, i.name)] if i.position in 'top or bottom' else task
112
  for i in op.inputs.values()]
113
+ if cache is not None:
114
+ key = make_cache_key((inputs, params))
115
  if key not in cache:
116
+ cache[key] = op(*inputs, **params)
117
  result = cache[key]
118
  else:
119
  result = op(*inputs, **params)
 
135
  t = nodes[edge.target]
136
  op = catalog[t.data.title]
137
  i = op.inputs[edge.targetHandle]
138
+ if i.position in 'top or bottom':
139
  batch_inputs.setdefault((edge.target, edge.targetHandle), []).extend(results)
140
  else:
141
  tasks.setdefault(edge.target, []).extend(results)
142
  tasks = next_stage
143
+ return contexts
server/main.py CHANGED
@@ -1,5 +1,6 @@
1
  import dataclasses
2
  import fastapi
 
3
  import pathlib
4
  import pkgutil
5
  from . import crdt
@@ -7,10 +8,12 @@ from . import ops
7
  from . import workspace
8
 
9
  here = pathlib.Path(__file__).parent
 
10
  for _, name, _ in pkgutil.iter_modules([str(here)]):
11
  if name.endswith('_ops') and not name.startswith('test_'):
12
  print(f'Importing {name}')
13
- __import__(f'server.{name}')
 
14
 
15
  app = fastapi.FastAPI(lifespan=crdt.lifespan)
16
  app.include_router(crdt.router)
@@ -68,3 +71,9 @@ def make_dir(req: dict):
68
  assert not path.exists()
69
  path.mkdir()
70
  return list_dir(path.parent)
 
 
 
 
 
 
 
1
  import dataclasses
2
  import fastapi
3
+ import importlib
4
  import pathlib
5
  import pkgutil
6
  from . import crdt
 
8
  from . import workspace
9
 
10
  here = pathlib.Path(__file__).parent
11
+ lynxkite_modules = {}
12
  for _, name, _ in pkgutil.iter_modules([str(here)]):
13
  if name.endswith('_ops') and not name.startswith('test_'):
14
  print(f'Importing {name}')
15
+ name = f'server.{name}'
16
+ lynxkite_modules[name] = importlib.import_module(name)
17
 
18
  app = fastapi.FastAPI(lifespan=crdt.lifespan)
19
  app.include_router(crdt.router)
 
71
  assert not path.exists()
72
  path.mkdir()
73
  return list_dir(path.parent)
74
+
75
+ @app.post("/api/service")
76
+ async def service(req: dict):
77
+ '''Executors can provide extra HTTP APIs through the /api/service endpoint.'''
78
+ module = lynxkite_modules[req['module']]
79
+ return await module.api_service(req)
server/ops.py CHANGED
@@ -61,7 +61,7 @@ class Parameter(BaseConfig):
61
  if default is inspect._empty:
62
  default = None
63
  if type is None or type is inspect._empty:
64
- type = typeof(default) if default else None
65
  return Parameter(name=name, default=default, type=type)
66
 
67
  class Input(BaseConfig):
 
61
  if default is inspect._empty:
62
  default = None
63
  if type is None or type is inspect._empty:
64
+ type = typeof(default) if default is not None else None
65
  return Parameter(name=name, default=default, type=type)
66
 
67
  class Input(BaseConfig):
web/package-lock.json CHANGED
@@ -25,6 +25,7 @@
25
  "sass": "1.79.5",
26
  "svelte": "4.2.19",
27
  "svelte-check": "4.0.5",
 
28
  "tslib": "2.7.0",
29
  "typescript": "5.6.3",
30
  "unplugin-icons": "0.19.3",
@@ -66,70 +67,6 @@
66
  "url": "https://github.com/sponsors/antfu"
67
  }
68
  },
69
- "node_modules/@esbuild/aix-ppc64": {
70
- "version": "0.21.5",
71
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
72
- "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
73
- "cpu": [
74
- "ppc64"
75
- ],
76
- "dev": true,
77
- "optional": true,
78
- "os": [
79
- "aix"
80
- ],
81
- "engines": {
82
- "node": ">=12"
83
- }
84
- },
85
- "node_modules/@esbuild/android-arm": {
86
- "version": "0.21.5",
87
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
88
- "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
89
- "cpu": [
90
- "arm"
91
- ],
92
- "dev": true,
93
- "optional": true,
94
- "os": [
95
- "android"
96
- ],
97
- "engines": {
98
- "node": ">=12"
99
- }
100
- },
101
- "node_modules/@esbuild/android-arm64": {
102
- "version": "0.21.5",
103
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
104
- "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
105
- "cpu": [
106
- "arm64"
107
- ],
108
- "dev": true,
109
- "optional": true,
110
- "os": [
111
- "android"
112
- ],
113
- "engines": {
114
- "node": ">=12"
115
- }
116
- },
117
- "node_modules/@esbuild/android-x64": {
118
- "version": "0.21.5",
119
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
120
- "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
121
- "cpu": [
122
- "x64"
123
- ],
124
- "dev": true,
125
- "optional": true,
126
- "os": [
127
- "android"
128
- ],
129
- "engines": {
130
- "node": ">=12"
131
- }
132
- },
133
  "node_modules/@esbuild/darwin-arm64": {
134
  "version": "0.21.5",
135
  "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
@@ -146,294 +83,6 @@
146
  "node": ">=12"
147
  }
148
  },
149
- "node_modules/@esbuild/darwin-x64": {
150
- "version": "0.21.5",
151
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
152
- "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
153
- "cpu": [
154
- "x64"
155
- ],
156
- "dev": true,
157
- "optional": true,
158
- "os": [
159
- "darwin"
160
- ],
161
- "engines": {
162
- "node": ">=12"
163
- }
164
- },
165
- "node_modules/@esbuild/freebsd-arm64": {
166
- "version": "0.21.5",
167
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
168
- "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
169
- "cpu": [
170
- "arm64"
171
- ],
172
- "dev": true,
173
- "optional": true,
174
- "os": [
175
- "freebsd"
176
- ],
177
- "engines": {
178
- "node": ">=12"
179
- }
180
- },
181
- "node_modules/@esbuild/freebsd-x64": {
182
- "version": "0.21.5",
183
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
184
- "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
185
- "cpu": [
186
- "x64"
187
- ],
188
- "dev": true,
189
- "optional": true,
190
- "os": [
191
- "freebsd"
192
- ],
193
- "engines": {
194
- "node": ">=12"
195
- }
196
- },
197
- "node_modules/@esbuild/linux-arm": {
198
- "version": "0.21.5",
199
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
200
- "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
201
- "cpu": [
202
- "arm"
203
- ],
204
- "dev": true,
205
- "optional": true,
206
- "os": [
207
- "linux"
208
- ],
209
- "engines": {
210
- "node": ">=12"
211
- }
212
- },
213
- "node_modules/@esbuild/linux-arm64": {
214
- "version": "0.21.5",
215
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
216
- "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
217
- "cpu": [
218
- "arm64"
219
- ],
220
- "dev": true,
221
- "optional": true,
222
- "os": [
223
- "linux"
224
- ],
225
- "engines": {
226
- "node": ">=12"
227
- }
228
- },
229
- "node_modules/@esbuild/linux-ia32": {
230
- "version": "0.21.5",
231
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
232
- "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
233
- "cpu": [
234
- "ia32"
235
- ],
236
- "dev": true,
237
- "optional": true,
238
- "os": [
239
- "linux"
240
- ],
241
- "engines": {
242
- "node": ">=12"
243
- }
244
- },
245
- "node_modules/@esbuild/linux-loong64": {
246
- "version": "0.21.5",
247
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
248
- "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
249
- "cpu": [
250
- "loong64"
251
- ],
252
- "dev": true,
253
- "optional": true,
254
- "os": [
255
- "linux"
256
- ],
257
- "engines": {
258
- "node": ">=12"
259
- }
260
- },
261
- "node_modules/@esbuild/linux-mips64el": {
262
- "version": "0.21.5",
263
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
264
- "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
265
- "cpu": [
266
- "mips64el"
267
- ],
268
- "dev": true,
269
- "optional": true,
270
- "os": [
271
- "linux"
272
- ],
273
- "engines": {
274
- "node": ">=12"
275
- }
276
- },
277
- "node_modules/@esbuild/linux-ppc64": {
278
- "version": "0.21.5",
279
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
280
- "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
281
- "cpu": [
282
- "ppc64"
283
- ],
284
- "dev": true,
285
- "optional": true,
286
- "os": [
287
- "linux"
288
- ],
289
- "engines": {
290
- "node": ">=12"
291
- }
292
- },
293
- "node_modules/@esbuild/linux-riscv64": {
294
- "version": "0.21.5",
295
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
296
- "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
297
- "cpu": [
298
- "riscv64"
299
- ],
300
- "dev": true,
301
- "optional": true,
302
- "os": [
303
- "linux"
304
- ],
305
- "engines": {
306
- "node": ">=12"
307
- }
308
- },
309
- "node_modules/@esbuild/linux-s390x": {
310
- "version": "0.21.5",
311
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
312
- "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
313
- "cpu": [
314
- "s390x"
315
- ],
316
- "dev": true,
317
- "optional": true,
318
- "os": [
319
- "linux"
320
- ],
321
- "engines": {
322
- "node": ">=12"
323
- }
324
- },
325
- "node_modules/@esbuild/linux-x64": {
326
- "version": "0.21.5",
327
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
328
- "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
329
- "cpu": [
330
- "x64"
331
- ],
332
- "dev": true,
333
- "optional": true,
334
- "os": [
335
- "linux"
336
- ],
337
- "engines": {
338
- "node": ">=12"
339
- }
340
- },
341
- "node_modules/@esbuild/netbsd-x64": {
342
- "version": "0.21.5",
343
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
344
- "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
345
- "cpu": [
346
- "x64"
347
- ],
348
- "dev": true,
349
- "optional": true,
350
- "os": [
351
- "netbsd"
352
- ],
353
- "engines": {
354
- "node": ">=12"
355
- }
356
- },
357
- "node_modules/@esbuild/openbsd-x64": {
358
- "version": "0.21.5",
359
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
360
- "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
361
- "cpu": [
362
- "x64"
363
- ],
364
- "dev": true,
365
- "optional": true,
366
- "os": [
367
- "openbsd"
368
- ],
369
- "engines": {
370
- "node": ">=12"
371
- }
372
- },
373
- "node_modules/@esbuild/sunos-x64": {
374
- "version": "0.21.5",
375
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
376
- "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
377
- "cpu": [
378
- "x64"
379
- ],
380
- "dev": true,
381
- "optional": true,
382
- "os": [
383
- "sunos"
384
- ],
385
- "engines": {
386
- "node": ">=12"
387
- }
388
- },
389
- "node_modules/@esbuild/win32-arm64": {
390
- "version": "0.21.5",
391
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
392
- "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
393
- "cpu": [
394
- "arm64"
395
- ],
396
- "dev": true,
397
- "optional": true,
398
- "os": [
399
- "win32"
400
- ],
401
- "engines": {
402
- "node": ">=12"
403
- }
404
- },
405
- "node_modules/@esbuild/win32-ia32": {
406
- "version": "0.21.5",
407
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
408
- "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
409
- "cpu": [
410
- "ia32"
411
- ],
412
- "dev": true,
413
- "optional": true,
414
- "os": [
415
- "win32"
416
- ],
417
- "engines": {
418
- "node": ">=12"
419
- }
420
- },
421
- "node_modules/@esbuild/win32-x64": {
422
- "version": "0.21.5",
423
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
424
- "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
425
- "cpu": [
426
- "x64"
427
- ],
428
- "dev": true,
429
- "optional": true,
430
- "os": [
431
- "win32"
432
- ],
433
- "engines": {
434
- "node": ">=12"
435
- }
436
- },
437
  "node_modules/@iconify-json/tabler": {
438
  "version": "1.2.5",
439
  "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.5.tgz",
@@ -468,307 +117,87 @@
468
  "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
469
  "dependencies": {
470
  "@jridgewell/set-array": "^1.2.1",
471
- "@jridgewell/sourcemap-codec": "^1.4.10",
472
- "@jridgewell/trace-mapping": "^0.3.24"
473
- },
474
- "engines": {
475
- "node": ">=6.0.0"
476
- }
477
- },
478
- "node_modules/@jridgewell/resolve-uri": {
479
- "version": "3.1.2",
480
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
481
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
482
- "engines": {
483
- "node": ">=6.0.0"
484
- }
485
- },
486
- "node_modules/@jridgewell/set-array": {
487
- "version": "1.2.1",
488
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
489
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
490
- "engines": {
491
- "node": ">=6.0.0"
492
- }
493
- },
494
- "node_modules/@jridgewell/sourcemap-codec": {
495
- "version": "1.5.0",
496
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
497
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
498
- },
499
- "node_modules/@jridgewell/trace-mapping": {
500
- "version": "0.3.25",
501
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
502
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
503
- "dependencies": {
504
- "@jridgewell/resolve-uri": "^3.1.0",
505
- "@jridgewell/sourcemap-codec": "^1.4.14"
506
- }
507
- },
508
- "node_modules/@parcel/watcher": {
509
- "version": "2.4.1",
510
- "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
511
- "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
512
- "dev": true,
513
- "dependencies": {
514
- "detect-libc": "^1.0.3",
515
- "is-glob": "^4.0.3",
516
- "micromatch": "^4.0.5",
517
- "node-addon-api": "^7.0.0"
518
- },
519
- "engines": {
520
- "node": ">= 10.0.0"
521
- },
522
- "funding": {
523
- "type": "opencollective",
524
- "url": "https://opencollective.com/parcel"
525
- },
526
- "optionalDependencies": {
527
- "@parcel/watcher-android-arm64": "2.4.1",
528
- "@parcel/watcher-darwin-arm64": "2.4.1",
529
- "@parcel/watcher-darwin-x64": "2.4.1",
530
- "@parcel/watcher-freebsd-x64": "2.4.1",
531
- "@parcel/watcher-linux-arm-glibc": "2.4.1",
532
- "@parcel/watcher-linux-arm64-glibc": "2.4.1",
533
- "@parcel/watcher-linux-arm64-musl": "2.4.1",
534
- "@parcel/watcher-linux-x64-glibc": "2.4.1",
535
- "@parcel/watcher-linux-x64-musl": "2.4.1",
536
- "@parcel/watcher-win32-arm64": "2.4.1",
537
- "@parcel/watcher-win32-ia32": "2.4.1",
538
- "@parcel/watcher-win32-x64": "2.4.1"
539
- }
540
- },
541
- "node_modules/@parcel/watcher-android-arm64": {
542
- "version": "2.4.1",
543
- "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
544
- "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
545
- "cpu": [
546
- "arm64"
547
- ],
548
- "dev": true,
549
- "optional": true,
550
- "os": [
551
- "android"
552
- ],
553
- "engines": {
554
- "node": ">= 10.0.0"
555
- },
556
- "funding": {
557
- "type": "opencollective",
558
- "url": "https://opencollective.com/parcel"
559
- }
560
- },
561
- "node_modules/@parcel/watcher-darwin-arm64": {
562
- "version": "2.4.1",
563
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
564
- "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
565
- "cpu": [
566
- "arm64"
567
- ],
568
- "dev": true,
569
- "optional": true,
570
- "os": [
571
- "darwin"
572
- ],
573
- "engines": {
574
- "node": ">= 10.0.0"
575
- },
576
- "funding": {
577
- "type": "opencollective",
578
- "url": "https://opencollective.com/parcel"
579
- }
580
- },
581
- "node_modules/@parcel/watcher-darwin-x64": {
582
- "version": "2.4.1",
583
- "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
584
- "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
585
- "cpu": [
586
- "x64"
587
- ],
588
- "dev": true,
589
- "optional": true,
590
- "os": [
591
- "darwin"
592
- ],
593
- "engines": {
594
- "node": ">= 10.0.0"
595
- },
596
- "funding": {
597
- "type": "opencollective",
598
- "url": "https://opencollective.com/parcel"
599
- }
600
- },
601
- "node_modules/@parcel/watcher-freebsd-x64": {
602
- "version": "2.4.1",
603
- "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
604
- "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
605
- "cpu": [
606
- "x64"
607
- ],
608
- "dev": true,
609
- "optional": true,
610
- "os": [
611
- "freebsd"
612
- ],
613
- "engines": {
614
- "node": ">= 10.0.0"
615
- },
616
- "funding": {
617
- "type": "opencollective",
618
- "url": "https://opencollective.com/parcel"
619
- }
620
- },
621
- "node_modules/@parcel/watcher-linux-arm-glibc": {
622
- "version": "2.4.1",
623
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
624
- "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
625
- "cpu": [
626
- "arm"
627
- ],
628
- "dev": true,
629
- "optional": true,
630
- "os": [
631
- "linux"
632
- ],
633
- "engines": {
634
- "node": ">= 10.0.0"
635
- },
636
- "funding": {
637
- "type": "opencollective",
638
- "url": "https://opencollective.com/parcel"
639
- }
640
- },
641
- "node_modules/@parcel/watcher-linux-arm64-glibc": {
642
- "version": "2.4.1",
643
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
644
- "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
645
- "cpu": [
646
- "arm64"
647
- ],
648
- "dev": true,
649
- "optional": true,
650
- "os": [
651
- "linux"
652
- ],
653
- "engines": {
654
- "node": ">= 10.0.0"
655
  },
656
- "funding": {
657
- "type": "opencollective",
658
- "url": "https://opencollective.com/parcel"
659
- }
660
- },
661
- "node_modules/@parcel/watcher-linux-arm64-musl": {
662
- "version": "2.4.1",
663
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
664
- "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
665
- "cpu": [
666
- "arm64"
667
- ],
668
- "dev": true,
669
- "optional": true,
670
- "os": [
671
- "linux"
672
- ],
673
  "engines": {
674
- "node": ">= 10.0.0"
675
- },
676
- "funding": {
677
- "type": "opencollective",
678
- "url": "https://opencollective.com/parcel"
679
  }
680
  },
681
- "node_modules/@parcel/watcher-linux-x64-glibc": {
682
- "version": "2.4.1",
683
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
684
- "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
685
- "cpu": [
686
- "x64"
687
- ],
688
- "dev": true,
689
- "optional": true,
690
- "os": [
691
- "linux"
692
- ],
693
  "engines": {
694
- "node": ">= 10.0.0"
695
- },
696
- "funding": {
697
- "type": "opencollective",
698
- "url": "https://opencollective.com/parcel"
699
  }
700
  },
701
- "node_modules/@parcel/watcher-linux-x64-musl": {
702
- "version": "2.4.1",
703
- "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
704
- "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
705
- "cpu": [
706
- "x64"
707
- ],
708
- "dev": true,
709
- "optional": true,
710
- "os": [
711
- "linux"
712
- ],
713
  "engines": {
714
- "node": ">= 10.0.0"
715
- },
716
- "funding": {
717
- "type": "opencollective",
718
- "url": "https://opencollective.com/parcel"
719
  }
720
  },
721
- "node_modules/@parcel/watcher-win32-arm64": {
722
- "version": "2.4.1",
723
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
724
- "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
725
- "cpu": [
726
- "arm64"
727
- ],
728
- "dev": true,
729
- "optional": true,
730
- "os": [
731
- "win32"
732
- ],
733
- "engines": {
734
- "node": ">= 10.0.0"
735
- },
736
- "funding": {
737
- "type": "opencollective",
738
- "url": "https://opencollective.com/parcel"
739
  }
740
  },
741
- "node_modules/@parcel/watcher-win32-ia32": {
742
  "version": "2.4.1",
743
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
744
- "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
745
- "cpu": [
746
- "ia32"
747
- ],
748
  "dev": true,
749
- "optional": true,
750
- "os": [
751
- "win32"
752
- ],
 
 
753
  "engines": {
754
  "node": ">= 10.0.0"
755
  },
756
  "funding": {
757
  "type": "opencollective",
758
  "url": "https://opencollective.com/parcel"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
759
  }
760
  },
761
- "node_modules/@parcel/watcher-win32-x64": {
762
  "version": "2.4.1",
763
- "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
764
- "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
765
  "cpu": [
766
- "x64"
767
  ],
768
  "dev": true,
769
  "optional": true,
770
  "os": [
771
- "win32"
772
  ],
773
  "engines": {
774
  "node": ">= 10.0.0"
@@ -793,32 +222,6 @@
793
  "integrity": "sha512-KnINM/Sng25QAv6sHkJO9q/XyslLegCF5jTsTSVu+AouY3uZDVf4Am99xNCqsfqFZFvnTBBDvCsHNdvTVGvPEA==",
794
  "dev": true
795
  },
796
- "node_modules/@rollup/rollup-android-arm-eabi": {
797
- "version": "4.24.0",
798
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
799
- "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
800
- "cpu": [
801
- "arm"
802
- ],
803
- "dev": true,
804
- "optional": true,
805
- "os": [
806
- "android"
807
- ]
808
- },
809
- "node_modules/@rollup/rollup-android-arm64": {
810
- "version": "4.24.0",
811
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
812
- "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
813
- "cpu": [
814
- "arm64"
815
- ],
816
- "dev": true,
817
- "optional": true,
818
- "os": [
819
- "android"
820
- ]
821
- },
822
  "node_modules/@rollup/rollup-darwin-arm64": {
823
  "version": "4.24.0",
824
  "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
@@ -832,175 +235,6 @@
832
  "darwin"
833
  ]
834
  },
835
- "node_modules/@rollup/rollup-darwin-x64": {
836
- "version": "4.24.0",
837
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
838
- "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
839
- "cpu": [
840
- "x64"
841
- ],
842
- "dev": true,
843
- "optional": true,
844
- "os": [
845
- "darwin"
846
- ]
847
- },
848
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
849
- "version": "4.24.0",
850
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
851
- "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
852
- "cpu": [
853
- "arm"
854
- ],
855
- "dev": true,
856
- "optional": true,
857
- "os": [
858
- "linux"
859
- ]
860
- },
861
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
862
- "version": "4.24.0",
863
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
864
- "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
865
- "cpu": [
866
- "arm"
867
- ],
868
- "dev": true,
869
- "optional": true,
870
- "os": [
871
- "linux"
872
- ]
873
- },
874
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
875
- "version": "4.24.0",
876
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
877
- "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
878
- "cpu": [
879
- "arm64"
880
- ],
881
- "dev": true,
882
- "optional": true,
883
- "os": [
884
- "linux"
885
- ]
886
- },
887
- "node_modules/@rollup/rollup-linux-arm64-musl": {
888
- "version": "4.24.0",
889
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
890
- "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
891
- "cpu": [
892
- "arm64"
893
- ],
894
- "dev": true,
895
- "optional": true,
896
- "os": [
897
- "linux"
898
- ]
899
- },
900
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
901
- "version": "4.24.0",
902
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
903
- "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
904
- "cpu": [
905
- "ppc64"
906
- ],
907
- "dev": true,
908
- "optional": true,
909
- "os": [
910
- "linux"
911
- ]
912
- },
913
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
914
- "version": "4.24.0",
915
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
916
- "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
917
- "cpu": [
918
- "riscv64"
919
- ],
920
- "dev": true,
921
- "optional": true,
922
- "os": [
923
- "linux"
924
- ]
925
- },
926
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
927
- "version": "4.24.0",
928
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
929
- "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
930
- "cpu": [
931
- "s390x"
932
- ],
933
- "dev": true,
934
- "optional": true,
935
- "os": [
936
- "linux"
937
- ]
938
- },
939
- "node_modules/@rollup/rollup-linux-x64-gnu": {
940
- "version": "4.24.0",
941
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
942
- "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
943
- "cpu": [
944
- "x64"
945
- ],
946
- "dev": true,
947
- "optional": true,
948
- "os": [
949
- "linux"
950
- ]
951
- },
952
- "node_modules/@rollup/rollup-linux-x64-musl": {
953
- "version": "4.24.0",
954
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
955
- "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
956
- "cpu": [
957
- "x64"
958
- ],
959
- "dev": true,
960
- "optional": true,
961
- "os": [
962
- "linux"
963
- ]
964
- },
965
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
966
- "version": "4.24.0",
967
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
968
- "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
969
- "cpu": [
970
- "arm64"
971
- ],
972
- "dev": true,
973
- "optional": true,
974
- "os": [
975
- "win32"
976
- ]
977
- },
978
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
979
- "version": "4.24.0",
980
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
981
- "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
982
- "cpu": [
983
- "ia32"
984
- ],
985
- "dev": true,
986
- "optional": true,
987
- "os": [
988
- "win32"
989
- ]
990
- },
991
- "node_modules/@rollup/rollup-win32-x64-msvc": {
992
- "version": "4.24.0",
993
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
994
- "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
995
- "cpu": [
996
- "x64"
997
- ],
998
- "dev": true,
999
- "optional": true,
1000
- "os": [
1001
- "win32"
1002
- ]
1003
- },
1004
  "node_modules/@svelte-put/shortcut": {
1005
  "version": "3.1.1",
1006
  "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-3.1.1.tgz",
@@ -1148,6 +382,12 @@
1148
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
1149
  "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
1150
  },
 
 
 
 
 
 
1151
  "node_modules/@xyflow/svelte": {
1152
  "version": "0.1.21",
1153
  "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-0.1.21.tgz",
@@ -1933,6 +1173,18 @@
1933
  "@jridgewell/sourcemap-codec": "^1.5.0"
1934
  }
1935
  },
 
 
 
 
 
 
 
 
 
 
 
 
1936
  "node_modules/mdn-data": {
1937
  "version": "2.0.30",
1938
  "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
@@ -2335,6 +1587,19 @@
2335
  "svelte": "^3.19.0 || ^4.0.0"
2336
  }
2337
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2338
  "node_modules/tinyexec": {
2339
  "version": "0.3.0",
2340
  "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz",
 
25
  "sass": "1.79.5",
26
  "svelte": "4.2.19",
27
  "svelte-check": "4.0.5",
28
+ "svelte-markdown": "^0.4.1",
29
  "tslib": "2.7.0",
30
  "typescript": "5.6.3",
31
  "unplugin-icons": "0.19.3",
 
67
  "url": "https://github.com/sponsors/antfu"
68
  }
69
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  "node_modules/@esbuild/darwin-arm64": {
71
  "version": "0.21.5",
72
  "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
 
83
  "node": ">=12"
84
  }
85
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  "node_modules/@iconify-json/tabler": {
87
  "version": "1.2.5",
88
  "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.5.tgz",
 
117
  "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
118
  "dependencies": {
119
  "@jridgewell/set-array": "^1.2.1",
120
+ "@jridgewell/sourcemap-codec": "^1.4.10",
121
+ "@jridgewell/trace-mapping": "^0.3.24"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  "engines": {
124
+ "node": ">=6.0.0"
 
 
 
 
125
  }
126
  },
127
+ "node_modules/@jridgewell/resolve-uri": {
128
+ "version": "3.1.2",
129
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
130
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
 
 
 
 
 
 
 
 
131
  "engines": {
132
+ "node": ">=6.0.0"
 
 
 
 
133
  }
134
  },
135
+ "node_modules/@jridgewell/set-array": {
136
+ "version": "1.2.1",
137
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
138
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
 
 
 
 
 
 
 
 
139
  "engines": {
140
+ "node": ">=6.0.0"
 
 
 
 
141
  }
142
  },
143
+ "node_modules/@jridgewell/sourcemap-codec": {
144
+ "version": "1.5.0",
145
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
146
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
147
+ },
148
+ "node_modules/@jridgewell/trace-mapping": {
149
+ "version": "0.3.25",
150
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
151
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
152
+ "dependencies": {
153
+ "@jridgewell/resolve-uri": "^3.1.0",
154
+ "@jridgewell/sourcemap-codec": "^1.4.14"
 
 
 
 
 
 
155
  }
156
  },
157
+ "node_modules/@parcel/watcher": {
158
  "version": "2.4.1",
159
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
160
+ "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
 
 
 
161
  "dev": true,
162
+ "dependencies": {
163
+ "detect-libc": "^1.0.3",
164
+ "is-glob": "^4.0.3",
165
+ "micromatch": "^4.0.5",
166
+ "node-addon-api": "^7.0.0"
167
+ },
168
  "engines": {
169
  "node": ">= 10.0.0"
170
  },
171
  "funding": {
172
  "type": "opencollective",
173
  "url": "https://opencollective.com/parcel"
174
+ },
175
+ "optionalDependencies": {
176
+ "@parcel/watcher-android-arm64": "2.4.1",
177
+ "@parcel/watcher-darwin-arm64": "2.4.1",
178
+ "@parcel/watcher-darwin-x64": "2.4.1",
179
+ "@parcel/watcher-freebsd-x64": "2.4.1",
180
+ "@parcel/watcher-linux-arm-glibc": "2.4.1",
181
+ "@parcel/watcher-linux-arm64-glibc": "2.4.1",
182
+ "@parcel/watcher-linux-arm64-musl": "2.4.1",
183
+ "@parcel/watcher-linux-x64-glibc": "2.4.1",
184
+ "@parcel/watcher-linux-x64-musl": "2.4.1",
185
+ "@parcel/watcher-win32-arm64": "2.4.1",
186
+ "@parcel/watcher-win32-ia32": "2.4.1",
187
+ "@parcel/watcher-win32-x64": "2.4.1"
188
  }
189
  },
190
+ "node_modules/@parcel/watcher-darwin-arm64": {
191
  "version": "2.4.1",
192
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
193
+ "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
194
  "cpu": [
195
+ "arm64"
196
  ],
197
  "dev": true,
198
  "optional": true,
199
  "os": [
200
+ "darwin"
201
  ],
202
  "engines": {
203
  "node": ">= 10.0.0"
 
222
  "integrity": "sha512-KnINM/Sng25QAv6sHkJO9q/XyslLegCF5jTsTSVu+AouY3uZDVf4Am99xNCqsfqFZFvnTBBDvCsHNdvTVGvPEA==",
223
  "dev": true
224
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  "node_modules/@rollup/rollup-darwin-arm64": {
226
  "version": "4.24.0",
227
  "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
 
235
  "darwin"
236
  ]
237
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
238
  "node_modules/@svelte-put/shortcut": {
239
  "version": "3.1.1",
240
  "resolved": "https://registry.npmjs.org/@svelte-put/shortcut/-/shortcut-3.1.1.tgz",
 
382
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
383
  "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
384
  },
385
+ "node_modules/@types/marked": {
386
+ "version": "5.0.2",
387
+ "resolved": "https://registry.npmjs.org/@types/marked/-/marked-5.0.2.tgz",
388
+ "integrity": "sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg==",
389
+ "dev": true
390
+ },
391
  "node_modules/@xyflow/svelte": {
392
  "version": "0.1.21",
393
  "resolved": "https://registry.npmjs.org/@xyflow/svelte/-/svelte-0.1.21.tgz",
 
1173
  "@jridgewell/sourcemap-codec": "^1.5.0"
1174
  }
1175
  },
1176
+ "node_modules/marked": {
1177
+ "version": "5.1.2",
1178
+ "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz",
1179
+ "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==",
1180
+ "dev": true,
1181
+ "bin": {
1182
+ "marked": "bin/marked.js"
1183
+ },
1184
+ "engines": {
1185
+ "node": ">= 16"
1186
+ }
1187
+ },
1188
  "node_modules/mdn-data": {
1189
  "version": "2.0.30",
1190
  "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
 
1587
  "svelte": "^3.19.0 || ^4.0.0"
1588
  }
1589
  },
1590
+ "node_modules/svelte-markdown": {
1591
+ "version": "0.4.1",
1592
+ "resolved": "https://registry.npmjs.org/svelte-markdown/-/svelte-markdown-0.4.1.tgz",
1593
+ "integrity": "sha512-pOlLY6EruKJaWI9my/2bKX8PdTeP5CM0s4VMmwmC2prlOkjAf+AOmTM4wW/l19Y6WZ87YmP8+ZCJCCwBChWjYw==",
1594
+ "dev": true,
1595
+ "dependencies": {
1596
+ "@types/marked": "^5.0.1",
1597
+ "marked": "^5.1.2"
1598
+ },
1599
+ "peerDependencies": {
1600
+ "svelte": "^4.0.0"
1601
+ }
1602
+ },
1603
  "node_modules/tinyexec": {
1604
  "version": "0.3.0",
1605
  "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz",
web/package.json CHANGED
@@ -17,6 +17,7 @@
17
  "sass": "1.79.5",
18
  "svelte": "4.2.19",
19
  "svelte-check": "4.0.5",
 
20
  "tslib": "2.7.0",
21
  "typescript": "5.6.3",
22
  "unplugin-icons": "0.19.3",
 
17
  "sass": "1.79.5",
18
  "svelte": "4.2.19",
19
  "svelte-check": "4.0.5",
20
+ "svelte-markdown": "^0.4.1",
21
  "tslib": "2.7.0",
22
  "typescript": "5.6.3",
23
  "unplugin-icons": "0.19.3",
web/src/NodeParameter.svelte CHANGED
@@ -3,21 +3,24 @@
3
  export let value;
4
  export let meta;
5
  export let onChange;
 
6
  </script>
7
 
8
  <label class="param">
9
- <span class="param-name">{name.replace(/_/g, ' ')}</span>
10
  {#if meta?.type?.format === 'collapsed'}
 
11
  <button class="collapsed-param form-control form-control-sm">
12
 
13
  </button>
14
  {:else if meta?.type?.format === 'textarea'}
 
15
  <textarea class="form-control form-control-sm"
16
- rows="6"
17
- value={value}
18
- on:change={(evt) => onChange(evt.currentTarget.value)}
19
- />
20
  {:else if meta?.type?.enum}
 
21
  <select class="form-select form-select-sm"
22
  value={value || meta.type.enum[0]}
23
  on:change={(evt) => onChange(evt.currentTarget.value)}
@@ -26,11 +29,21 @@
26
  <option value={option}>{option}</option>
27
  {/each}
28
  </select>
 
 
 
 
 
 
 
 
 
29
  {:else}
 
30
  <input class="form-control form-control-sm"
31
- value={value}
32
- on:change={(evt) => onChange(evt.currentTarget.value)}
33
- />
34
  {/if}
35
  </label>
36
 
 
3
  export let value;
4
  export let meta;
5
  export let onChange;
6
+ const BOOLEAN = "<class 'bool'>";
7
  </script>
8
 
9
  <label class="param">
 
10
  {#if meta?.type?.format === 'collapsed'}
11
+ <span class="param-name">{name.replace(/_/g, ' ')}</span>
12
  <button class="collapsed-param form-control form-control-sm">
13
 
14
  </button>
15
  {:else if meta?.type?.format === 'textarea'}
16
+ <span class="param-name">{name.replace(/_/g, ' ')}</span>
17
  <textarea class="form-control form-control-sm"
18
+ rows="6"
19
+ value={value}
20
+ on:change={(evt) => onChange(evt.currentTarget.value)}
21
+ />
22
  {:else if meta?.type?.enum}
23
+ <span class="param-name">{name.replace(/_/g, ' ')}</span>
24
  <select class="form-select form-select-sm"
25
  value={value || meta.type.enum[0]}
26
  on:change={(evt) => onChange(evt.currentTarget.value)}
 
29
  <option value={option}>{option}</option>
30
  {/each}
31
  </select>
32
+ {:else if meta?.type?.type === BOOLEAN}
33
+ <label class="form-check-label">
34
+ <input class="form-check-input"
35
+ type="checkbox"
36
+ checked={value}
37
+ on:change={(evt) => onChange(evt.currentTarget.checked)}
38
+ />
39
+ {name.replace(/_/g, ' ')}
40
+ </label>
41
  {:else}
42
+ <span class="param-name">{name.replace(/_/g, ' ')}</span>
43
  <input class="form-control form-control-sm"
44
+ value={value}
45
+ on:change={(evt) => onChange(evt.currentTarget.value)}
46
+ />
47
  {/if}
48
  </label>
49