@serfab/cadre-host 0.8.1 → 0.10.0

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 (198) hide show
  1. package/dist/auth/index.d.ts +2 -0
  2. package/dist/auth/index.js +1 -0
  3. package/dist/auth/index.js.map +1 -1
  4. package/dist/auth/self-label.d.ts +36 -0
  5. package/dist/auth/self-label.js +57 -0
  6. package/dist/auth/self-label.js.map +1 -0
  7. package/dist/auth/trust-circle.d.ts +36 -9
  8. package/dist/auth/trust-circle.js +40 -20
  9. package/dist/auth/trust-circle.js.map +1 -1
  10. package/dist/auth/types.d.ts +2 -2
  11. package/dist/bin/host.js +291 -54
  12. package/dist/bin/host.js.map +1 -1
  13. package/dist/donation/__tests__/fake-orchestrator.d.ts +103 -0
  14. package/dist/donation/__tests__/fake-orchestrator.js +180 -0
  15. package/dist/donation/__tests__/fake-orchestrator.js.map +1 -0
  16. package/dist/donation/donation-service.d.ts +361 -0
  17. package/dist/donation/donation-service.js +763 -0
  18. package/dist/donation/donation-service.js.map +1 -0
  19. package/dist/donation/donation-store.d.ts +49 -0
  20. package/dist/donation/donation-store.js +148 -0
  21. package/dist/donation/donation-store.js.map +1 -0
  22. package/dist/donation/donation-supervisor.d.ts +167 -0
  23. package/dist/donation/donation-supervisor.js +341 -0
  24. package/dist/donation/donation-supervisor.js.map +1 -0
  25. package/dist/donation/grant-service.d.ts +71 -0
  26. package/dist/donation/grant-service.js +163 -0
  27. package/dist/donation/grant-service.js.map +1 -0
  28. package/dist/donation/grant-store.d.ts +38 -0
  29. package/dist/donation/grant-store.js +135 -0
  30. package/dist/donation/grant-store.js.map +1 -0
  31. package/dist/donation/index.d.ts +20 -0
  32. package/dist/donation/index.js +17 -0
  33. package/dist/donation/index.js.map +1 -0
  34. package/dist/donation/types.d.ts +201 -0
  35. package/dist/donation/types.js +40 -0
  36. package/dist/donation/types.js.map +1 -0
  37. package/dist/index.d.ts +9 -5
  38. package/dist/index.js +7 -3
  39. package/dist/index.js.map +1 -1
  40. package/dist/installer/config.d.ts +26 -0
  41. package/dist/installer/config.js +13 -0
  42. package/dist/installer/config.js.map +1 -1
  43. package/dist/installer/index.d.ts +2 -0
  44. package/dist/installer/index.js +3 -0
  45. package/dist/installer/index.js.map +1 -1
  46. package/dist/installer/wizard.d.ts +4 -0
  47. package/dist/installer/wizard.js +5 -1
  48. package/dist/installer/wizard.js.map +1 -1
  49. package/dist/nat/nat-service.d.ts +5 -5
  50. package/dist/nat/nat-service.js +9 -9
  51. package/dist/nat/nat-service.js.map +1 -1
  52. package/dist/nat/types.d.ts +1 -1
  53. package/dist/orchestrator/host-process-orchestrator.d.ts +144 -32
  54. package/dist/orchestrator/host-process-orchestrator.js +397 -128
  55. package/dist/orchestrator/host-process-orchestrator.js.map +1 -1
  56. package/dist/orchestrator/index.d.ts +3 -3
  57. package/dist/orchestrator/index.js +1 -1
  58. package/dist/orchestrator/index.js.map +1 -1
  59. package/dist/orchestrator/node-identity.d.ts +26 -0
  60. package/dist/orchestrator/node-identity.js +36 -0
  61. package/dist/orchestrator/node-identity.js.map +1 -0
  62. package/dist/orchestrator/port-allocator.d.ts +14 -0
  63. package/dist/orchestrator/port-allocator.js +45 -0
  64. package/dist/orchestrator/port-allocator.js.map +1 -1
  65. package/dist/orchestrator/state-store.d.ts +5 -5
  66. package/dist/orchestrator/state-store.js +2 -2
  67. package/dist/orchestrator/state-store.js.map +1 -1
  68. package/dist/orchestrator/types.d.ts +8 -8
  69. package/dist/owner/index.d.ts +11 -0
  70. package/dist/owner/index.js +11 -0
  71. package/dist/owner/index.js.map +1 -0
  72. package/dist/owner/owner-node-client.d.ts +110 -0
  73. package/dist/{authority/authority-node-client.js → owner/owner-node-client.js} +58 -17
  74. package/dist/owner/owner-node-client.js.map +1 -0
  75. package/dist/server/error-handler.d.ts +22 -1
  76. package/dist/server/error-handler.js +64 -1
  77. package/dist/server/error-handler.js.map +1 -1
  78. package/dist/server/events/types.d.ts +3 -0
  79. package/dist/server/index.d.ts +33 -2
  80. package/dist/server/index.js +43 -16
  81. package/dist/server/index.js.map +1 -1
  82. package/dist/server/routes/grants-admin.d.ts +17 -0
  83. package/dist/server/routes/grants-admin.js +32 -0
  84. package/dist/server/routes/grants-admin.js.map +1 -0
  85. package/dist/server/routes/grants.d.ts +28 -0
  86. package/dist/server/routes/grants.js +182 -0
  87. package/dist/server/routes/grants.js.map +1 -0
  88. package/dist/server/routes/nodes.d.ts +5 -4
  89. package/dist/server/routes/nodes.js +19 -18
  90. package/dist/server/routes/nodes.js.map +1 -1
  91. package/dist/server/routes/settings.d.ts +6 -1
  92. package/dist/server/routes/settings.js +5 -2
  93. package/dist/server/routes/settings.js.map +1 -1
  94. package/dist/server/routes/status.d.ts +8 -4
  95. package/dist/server/routes/status.js +9 -4
  96. package/dist/server/routes/status.js.map +1 -1
  97. package/dist/server/routes/strands.d.ts +20 -0
  98. package/dist/server/routes/strands.js +38 -0
  99. package/dist/server/routes/strands.js.map +1 -0
  100. package/dist/strands/index.d.ts +7 -0
  101. package/dist/strands/index.js +6 -0
  102. package/dist/strands/index.js.map +1 -0
  103. package/dist/strands/strand-service.d.ts +50 -0
  104. package/dist/strands/strand-service.js +103 -0
  105. package/dist/strands/strand-service.js.map +1 -0
  106. package/dist/strands/types.d.ts +93 -0
  107. package/dist/strands/types.js +23 -0
  108. package/dist/strands/types.js.map +1 -0
  109. package/dist/ui/assets/index-BVoqLjyX.css +1 -0
  110. package/dist/ui/assets/index-C-iks41M.js +17 -0
  111. package/dist/ui/assets/index-C-iks41M.js.map +1 -0
  112. package/dist/ui/index.html +2 -2
  113. package/dist/update/release-key.d.ts +1 -1
  114. package/dist/update/release-key.js +8 -6
  115. package/dist/update/release-key.js.map +1 -1
  116. package/package.json +5 -5
  117. package/src/__tests__/build-targets.test.ts +26 -0
  118. package/src/__tests__/global-setup.ts +51 -0
  119. package/src/__tests__/{host-authority.smoke.test.ts → host-owner.smoke.test.ts} +7 -7
  120. package/src/__tests__/orchestrator-env-scrub.test.ts +140 -0
  121. package/src/__tests__/orchestrator-node-identity.test.ts +204 -0
  122. package/src/__tests__/{orchestrator-authority.test.ts → orchestrator-owner.test.ts} +33 -33
  123. package/src/__tests__/orchestrator-pin-keys.test.ts +153 -0
  124. package/src/__tests__/orchestrator-push.test.ts +10 -10
  125. package/src/__tests__/orchestrator.test.ts +387 -6
  126. package/src/auth/__tests__/self-label.test.ts +85 -0
  127. package/src/auth/__tests__/trust-circle-integration.test.ts +152 -147
  128. package/src/auth/__tests__/trust-circle.test.ts +55 -11
  129. package/src/auth/index.ts +2 -0
  130. package/src/auth/self-label.ts +74 -0
  131. package/src/auth/trust-circle.ts +54 -22
  132. package/src/auth/types.ts +2 -2
  133. package/src/bin/host.ts +1299 -1038
  134. package/src/donation/__tests__/donation-service.test.ts +1068 -0
  135. package/src/donation/__tests__/donation-supervisor.test.ts +510 -0
  136. package/src/donation/__tests__/fake-orchestrator.test.ts +168 -0
  137. package/src/donation/__tests__/fake-orchestrator.ts +225 -0
  138. package/src/donation/__tests__/grant-service.test.ts +213 -0
  139. package/src/donation/__tests__/grant-store.test.ts +113 -0
  140. package/src/donation/donation-service.ts +962 -0
  141. package/src/donation/donation-store.ts +171 -0
  142. package/src/donation/donation-supervisor.ts +388 -0
  143. package/src/donation/grant-service.ts +200 -0
  144. package/src/donation/grant-store.ts +152 -0
  145. package/src/donation/index.ts +64 -0
  146. package/src/donation/types.ts +243 -0
  147. package/src/index.ts +51 -5
  148. package/src/installer/__tests__/config.test.ts +27 -1
  149. package/src/installer/__tests__/installer.smoke.test.ts +31 -1
  150. package/src/installer/__tests__/wizard.test.ts +5 -1
  151. package/src/installer/config.ts +34 -0
  152. package/src/installer/index.ts +5 -0
  153. package/src/installer/wizard.ts +12 -1
  154. package/src/nat/__tests__/nat-service.test.ts +5 -5
  155. package/src/nat/nat-service.ts +10 -10
  156. package/src/nat/types.ts +1 -1
  157. package/src/orchestrator/__tests__/node-identity.test.ts +62 -0
  158. package/src/orchestrator/host-process-orchestrator.ts +401 -134
  159. package/src/orchestrator/index.ts +3 -3
  160. package/src/orchestrator/node-identity.ts +40 -0
  161. package/src/orchestrator/port-allocator.ts +48 -0
  162. package/src/orchestrator/state-store.ts +7 -7
  163. package/src/orchestrator/types.ts +8 -8
  164. package/src/{authority/__tests__/authority-node-client.test.ts → owner/__tests__/owner-node-client.test.ts} +45 -17
  165. package/src/owner/index.ts +12 -0
  166. package/src/{authority/authority-node-client.ts → owner/owner-node-client.ts} +83 -23
  167. package/src/server/__tests__/error-handler.test.ts +22 -0
  168. package/src/server/__tests__/grants-admin-route.test.ts +73 -0
  169. package/src/server/__tests__/grants-route.test.ts +263 -0
  170. package/src/server/__tests__/nodes-route.test.ts +25 -25
  171. package/src/server/__tests__/server.smoke.test.ts +75 -0
  172. package/src/server/__tests__/settings-route.test.ts +17 -0
  173. package/src/server/__tests__/status-route.test.ts +21 -0
  174. package/src/server/__tests__/strands-route.test.ts +233 -0
  175. package/src/server/error-handler.ts +67 -1
  176. package/src/server/events/types.ts +1 -0
  177. package/src/server/index.ts +75 -17
  178. package/src/server/routes/grants-admin.ts +41 -0
  179. package/src/server/routes/grants.ts +210 -0
  180. package/src/server/routes/nodes.ts +19 -18
  181. package/src/server/routes/settings.ts +11 -3
  182. package/src/server/routes/status.ts +18 -8
  183. package/src/server/routes/strands.ts +54 -0
  184. package/src/strands/__tests__/strand-service.test.ts +165 -0
  185. package/src/strands/index.ts +14 -0
  186. package/src/strands/strand-service.ts +135 -0
  187. package/src/strands/types.ts +102 -0
  188. package/src/update/__tests__/release-key.test.ts +16 -3
  189. package/src/update/release-key.ts +8 -6
  190. package/dist/authority/authority-node-client.d.ts +0 -77
  191. package/dist/authority/authority-node-client.js.map +0 -1
  192. package/dist/authority/index.d.ts +0 -11
  193. package/dist/authority/index.js +0 -11
  194. package/dist/authority/index.js.map +0 -1
  195. package/dist/ui/assets/index-BlMXQPSw.js +0 -14
  196. package/dist/ui/assets/index-BlMXQPSw.js.map +0 -1
  197. package/dist/ui/assets/index-BwU5mJGF.css +0 -1
  198. package/src/authority/index.ts +0 -12
@@ -0,0 +1,103 @@
1
+ import debug from 'debug';
2
+ import { OwnerNodeUnavailableError } from '../owner/owner-node-client.js';
3
+ import { StrandError } from './types.js';
4
+ const log = debug('cadre:host:strands');
5
+ /**
6
+ * StrandService — validation and error translation over the owner node's strand
7
+ * admin routes.
8
+ *
9
+ * It owns no state and makes no policy. In particular it does NOT decide whether a
10
+ * closed strand needs confirmation: it never reads the row, so it could only guess.
11
+ * The node enforces that rule and answers `confirmation_required`; this layer
12
+ * forwards the caller's flag verbatim and surfaces the refusal as a distinct code
13
+ * so the UI can raise the right dialog.
14
+ */
15
+ export class StrandService {
16
+ constructor(opts) {
17
+ this.cadreNode = opts.cadreNode;
18
+ }
19
+ /** This party's strands, plus the node's current control-connection count. */
20
+ async list() {
21
+ return await this.cadreNode.listStrands().catch((err) => toDomainError(err));
22
+ }
23
+ /**
24
+ * Remove this party's participation in one strand.
25
+ *
26
+ * `confirm` is forwarded exactly as given — never defaulted to true, never
27
+ * re-sent as true after a refusal. A closed strand's row carries this party's
28
+ * membership key for that network and is stored nowhere else, so an automatic
29
+ * retry would destroy it on the caller's behalf.
30
+ */
31
+ async remove(rawId, opts) {
32
+ const strandId = validateStrandId(rawId);
33
+ log('remove %s (confirm=%s)', strandId, opts.confirm);
34
+ return await this.cadreNode
35
+ .removeStrand(strandId, { confirm: opts.confirm })
36
+ .catch((err) => toDomainError(err));
37
+ }
38
+ }
39
+ /**
40
+ * Trim and reject an id this surface cannot act on. Blank is the only such id.
41
+ *
42
+ * A `/` is deliberately NOT refused. `/api/strands/:id` is one path segment, but a
43
+ * caller that percent-encodes the id reaches this layer with the `/` restored
44
+ * (Fastify decodes `params`), `OwnerNodeClient` re-encodes it, and the admin channel
45
+ * splits on the still-encoded `%2F` and decodes it back — so the whole chain carries
46
+ * it. Refusing here would break the only form that works, while doing nothing about
47
+ * an UNencoded `/`, which never reaches this handler at all (the router 404s it).
48
+ */
49
+ function validateStrandId(rawId) {
50
+ const strandId = typeof rawId === 'string' ? rawId.trim() : '';
51
+ if (!strandId) {
52
+ throw new StrandError('invalid_id', 'A strand id is required');
53
+ }
54
+ return strandId;
55
+ }
56
+ /**
57
+ * Translate an owner-node failure into the strand error vocabulary.
58
+ *
59
+ * `OwnerNodeUnavailableError` is thrown for *every* non-ok admin response, not only
60
+ * for a node that is down — so read `nodeCode` first and fall back to
61
+ * `node_unavailable` only when nothing better fits. Reporting a 428 as "your node is
62
+ * down" would be actively misleading.
63
+ *
64
+ * Declared to return `never` so callers can `.catch((err) => toDomainError(err))`.
65
+ *
66
+ * NOTE: the trust-circle and NAT services translate the SAME error blanket-style —
67
+ * every `OwnerNodeUnavailableError` becomes `node_unavailable` — because neither has
68
+ * a code worth distinguishing yet. If a second surface ever needs a code-aware
69
+ * mapping, hoist this switch into a shared owner-error translator instead of growing
70
+ * a third copy.
71
+ */
72
+ function toDomainError(err) {
73
+ if (!(err instanceof OwnerNodeUnavailableError)) {
74
+ throw err instanceof Error ? err : new Error(String(err));
75
+ }
76
+ switch (err.nodeCode) {
77
+ case 'confirmation_required':
78
+ throw new StrandError('confirmation_required', err.message);
79
+ case 'bad_request':
80
+ throw new StrandError('invalid_id', err.message);
81
+ case undefined:
82
+ case 'not_ready':
83
+ case 'not_authorized':
84
+ throw new StrandError('node_unavailable', `Owner node unavailable: ${err.message}`);
85
+ default:
86
+ throw new StrandError('internal', err.message);
87
+ }
88
+ }
89
+ /**
90
+ * Wrap a StrandService into the typed handler shape the local UI server mounts.
91
+ * Errors propagate as StrandError; `server/error-handler.ts` maps `.code` → status.
92
+ */
93
+ export function createStrandHandlers(service) {
94
+ return {
95
+ async listStrands() {
96
+ return await service.list();
97
+ },
98
+ async removeStrand(strandId, opts) {
99
+ return await service.remove(strandId, { confirm: opts.confirm === true });
100
+ },
101
+ };
102
+ }
103
+ //# sourceMappingURL=strand-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strand-service.js","sourceRoot":"","sources":["../../src/strands/strand-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAO1E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,GAAG,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAmBxC;;;;;;;;;GASG;AACH,MAAM,OAAO,aAAa;IAGxB,YAAY,IAA0B;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,IAAI;QACR,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAA0B;QACpD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,GAAG,CAAC,wBAAwB,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,MAAM,IAAI,CAAC,SAAS;aACxB,YAAY,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;aACjD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,CAAC,CAAC,GAAG,YAAY,yBAAyB,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,uBAAuB;YAC1B,MAAM,IAAI,WAAW,CAAC,uBAAuB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9D,KAAK,aAAa;YAChB,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,KAAK,SAAS,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,gBAAgB;YACnB,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF;YACE,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAsB;IACzD,OAAO;QACL,KAAK,CAAC,WAAW;YACf,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI;YAC/B,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Strand-management types for cadre-host.
3
+ *
4
+ * A *strand* is a shared data network this party participates in. Membership is
5
+ * canonical in the cadre control network's `Strand` table, reached over the owner
6
+ * node's loopback admin channel (`GET /admin/strands`,
7
+ * `DELETE /admin/strands/:id?confirm=1`).
8
+ *
9
+ * Unlike the trust circle — which layers host-local labels and pending invites on
10
+ * top of the node's state — this layer holds **no host-local state at all**. There
11
+ * is no `strands.json`. It exists for id validation, for translating the admin
12
+ * channel's error codes into a stable vocabulary the management API can map to HTTP
13
+ * statuses, and for nothing else. Keep it small.
14
+ */
15
+ /** One strand this party belongs to, as projected by the admin channel. */
16
+ export interface StrandSummary {
17
+ /** The `Strand` row id — what a removal takes. */
18
+ id: string;
19
+ /** `'o'` = open, `'c'` = closed (the row carries this party's membership key). */
20
+ type: 'o' | 'c';
21
+ /** Whether the owner node currently has a running instance for the id. */
22
+ running: boolean;
23
+ /**
24
+ * The instance's status when running, else `null`. Deliberately `string` rather
25
+ * than cadre-core's `StrandStatus`: this is a wire projection the manager only
26
+ * forwards, and widening it keeps cadre-host from tracking a cadre-core union it
27
+ * never inspects.
28
+ */
29
+ status: string | null;
30
+ }
31
+ /** The result of listing this party's strands. */
32
+ export interface StrandListSnapshot {
33
+ strands: StrandSummary[];
34
+ /**
35
+ * Open control-network connections on the owner node; 0 ⇒ writes commit
36
+ * local-only. A snapshot at read time, not a subscription — treat it as advisory.
37
+ */
38
+ controlConnections: number;
39
+ }
40
+ /** The result of removing this party's participation in one strand. */
41
+ export interface StrandRemovalResult {
42
+ /** The trimmed id the call was about. */
43
+ strandId: string;
44
+ /** Whether a row existed before the write. */
45
+ published: boolean;
46
+ /** The found row's type; `null` when no row was found. */
47
+ type: 'o' | 'c' | null;
48
+ /**
49
+ * Whether THIS call issued the delete — not that the row was observed to vanish.
50
+ * The node's read and write are not atomic, so a concurrent removal landing in
51
+ * between makes this a no-op that still reports `true`.
52
+ */
53
+ removed: boolean;
54
+ /**
55
+ * The node saw 0 control connections at the end of the call. Sampled on EVERY
56
+ * call, including one that found no row and wrote nothing — read it as "this
57
+ * machine currently sees no siblings", and only as "your delete may not have
58
+ * travelled" when `removed` is also true.
59
+ */
60
+ alone: boolean;
61
+ }
62
+ /** Error codes thrown by StrandService. */
63
+ export type StrandErrorCode =
64
+ /** The id was blank or whitespace-only, here or at the node. */
65
+ 'invalid_id'
66
+ /** The node refused a closed-strand removal that carried no confirmation. */
67
+ | 'confirmation_required'
68
+ /** The owner node's admin channel is unreachable / not ready. */
69
+ | 'node_unavailable'
70
+ /** The node answered with a code this layer has no better word for. */
71
+ | 'internal';
72
+ /** Typed error carrying a stable `code` for HTTP mapping. */
73
+ export declare class StrandError extends Error {
74
+ readonly code: StrandErrorCode;
75
+ constructor(code: StrandErrorCode, message: string);
76
+ }
77
+ /**
78
+ * Typed handlers exposed to the local UI server for Fastify wiring.
79
+ *
80
+ * Handlers either return typed results or throw a `StrandError` whose `.code`
81
+ * `server/error-handler.ts` maps to an HTTP status:
82
+ *
83
+ * - `invalid_id` → 400
84
+ * - `confirmation_required` → 428
85
+ * - `node_unavailable` → 503
86
+ * - `internal` → 500
87
+ */
88
+ export interface StrandHandlers {
89
+ listStrands(): Promise<StrandListSnapshot>;
90
+ removeStrand(strandId: string, opts: {
91
+ confirm: boolean;
92
+ }): Promise<StrandRemovalResult>;
93
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Strand-management types for cadre-host.
3
+ *
4
+ * A *strand* is a shared data network this party participates in. Membership is
5
+ * canonical in the cadre control network's `Strand` table, reached over the owner
6
+ * node's loopback admin channel (`GET /admin/strands`,
7
+ * `DELETE /admin/strands/:id?confirm=1`).
8
+ *
9
+ * Unlike the trust circle — which layers host-local labels and pending invites on
10
+ * top of the node's state — this layer holds **no host-local state at all**. There
11
+ * is no `strands.json`. It exists for id validation, for translating the admin
12
+ * channel's error codes into a stable vocabulary the management API can map to HTTP
13
+ * statuses, and for nothing else. Keep it small.
14
+ */
15
+ /** Typed error carrying a stable `code` for HTTP mapping. */
16
+ export class StrandError extends Error {
17
+ constructor(code, message) {
18
+ super(message);
19
+ this.name = 'StrandError';
20
+ this.code = code;
21
+ }
22
+ }
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/strands/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA+DH,6DAA6D;AAC7D,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGpC,YAAY,IAAqB,EAAE,OAAe;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ .dot.svelte-1qa2kn2{display:inline-flex;align-items:center;gap:.5rem;font-weight:500}.bulb.svelte-1qa2kn2{display:inline-block;border-radius:999px;flex:0 0 auto;background:var(--color-text-soft);box-shadow:0 0 0 3px #0000000f}.dot-ok.svelte-1qa2kn2 .bulb:where(.svelte-1qa2kn2){background:var(--color-success);box-shadow:0 0 0 3px var(--color-success-bg)}.dot-warn.svelte-1qa2kn2 .bulb:where(.svelte-1qa2kn2){background:var(--color-warn);box-shadow:0 0 0 3px var(--color-warn-bg)}.dot-err.svelte-1qa2kn2 .bulb:where(.svelte-1qa2kn2){background:var(--color-danger);box-shadow:0 0 0 3px var(--color-danger-bg)}.dot-muted.svelte-1qa2kn2 .bulb:where(.svelte-1qa2kn2){background:var(--color-text-soft)}.dot-ok.svelte-1qa2kn2{color:var(--color-success)}.dot-warn.svelte-1qa2kn2{color:var(--color-warn)}.dot-err.svelte-1qa2kn2{color:var(--color-danger)}.row.svelte-lwwmgz{display:inline-flex;gap:.4rem;flex-wrap:wrap}.banner.svelte-15mtls8{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-radius:var(--radius);background:var(--color-info-bg);color:var(--color-info);border:1px solid var(--color-info)}.summary.svelte-15mtls8{grid-template-columns:repeat(auto-fit,minmax(15rem,1fr))}.kv.svelte-15mtls8{margin:var(--space-3) 0 0 0;display:grid;grid-template-columns:max-content 1fr;gap:var(--space-1) var(--space-3);font-size:.9rem}.kv.svelte-15mtls8>div:where(.svelte-15mtls8){display:contents}.kv.svelte-15mtls8 dt:where(.svelte-15mtls8){color:var(--color-text-muted)}.kv.svelte-15mtls8 dd:where(.svelte-15mtls8){margin:0}.big.svelte-15mtls8{font-size:1.75rem;font-weight:600;margin:var(--space-2) 0}.big.svelte-15mtls8 .muted:where(.svelte-15mtls8){font-size:.95rem;font-weight:400}.link.svelte-15mtls8{display:inline-block;margin-top:var(--space-2);font-weight:500}.backdrop.svelte-80vbit{position:fixed;inset:0;background:#0f111673;z-index:1000}.dialog.svelte-80vbit{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);padding:var(--space-5);min-width:min(24rem,calc(100vw - 2rem));max-width:min(32rem,calc(100vw - 2rem));overflow-wrap:anywhere;z-index:1010}.note.svelte-80vbit{background:var(--color-warn-bg);color:var(--color-warn);border-radius:var(--radius);padding:var(--space-2) var(--space-3);font-size:.9rem}.gate.svelte-80vbit{margin-top:var(--space-3);overflow-wrap:anywhere}.actions.svelte-80vbit{display:flex;justify-content:flex-end;gap:.5rem;margin-top:var(--space-4)}.qr.svelte-1uqetyj{background:#fff;border-radius:var(--radius);padding:.5rem;display:inline-block;line-height:0}.qr.svelte-1uqetyj svg{width:100%;height:100%;display:block}.placeholder.svelte-1uqetyj{background:var(--color-surface-alt)}.backdrop.svelte-1d46kin{position:fixed;inset:0;background:#0f111673;z-index:1000}.dialog.svelte-1d46kin{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);padding:var(--space-5);width:min(28rem,calc(100vw - 2rem));max-height:calc(100vh - 2rem);overflow:auto;z-index:1010}.actions.svelte-1d46kin{display:flex;justify-content:flex-end;gap:.5rem;margin-top:var(--space-4)}.qr-wrap.svelte-1d46kin{display:flex;justify-content:center;margin:var(--space-3) 0}.token.svelte-1d46kin{display:flex;flex-direction:column;gap:.5rem}.token.svelte-1d46kin textarea:where(.svelte-1d46kin){font-family:var(--font-mono);font-size:.78rem;word-break:break-all;resize:vertical}.token.svelte-1d46kin button:where(.svelte-1d46kin){align-self:flex-end;display:inline-flex;align-items:center;gap:.375rem}.small.svelte-1d46kin{font-size:.85rem}.page-header.svelte-3alf51{display:flex;align-items:flex-end;justify-content:space-between;flex-wrap:wrap;gap:var(--space-3)}.list.svelte-3alf51{list-style:none;padding:0;margin:var(--space-3) 0 0 0;display:flex;flex-direction:column;gap:.5rem}.list.svelte-3alf51 li:where(.svelte-3alf51){display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius);background:var(--color-surface-alt)}.member-main.svelte-3alf51{display:flex;flex-direction:column;gap:.125rem;min-width:0}.member-label.svelte-3alf51{font-weight:500}.small.svelte-3alf51{font-size:.85rem}.grid.two.svelte-hh3bto{grid-template-columns:repeat(auto-fit,minmax(20rem,1fr))}.kv.svelte-hh3bto{margin:var(--space-3) 0;display:grid;grid-template-columns:max-content 1fr;gap:var(--space-1) var(--space-3);font-size:.9rem}.kv.svelte-hh3bto>div:where(.svelte-hh3bto){display:contents}.kv.svelte-hh3bto dt:where(.svelte-hh3bto){color:var(--color-text-muted)}.kv.svelte-hh3bto dd:where(.svelte-hh3bto){margin:0}.row.inline.svelte-hh3bto{gap:.5rem}.row.inline.svelte-hh3bto input[type=checkbox]:where(.svelte-hh3bto){width:auto}.warning.svelte-hh3bto{background:var(--color-warn-bg);border-color:var(--color-warn)}.warning.svelte-hh3bto ul:where(.svelte-hh3bto){margin:0;padding-left:1.25rem}.actions.svelte-hh3bto{display:flex;justify-content:flex-end;gap:.5rem}.small.svelte-hh3bto{font-size:.85rem}table.svelte-7tcksg{width:100%;border-collapse:collapse;font-size:.92rem}th.svelte-7tcksg,td.svelte-7tcksg{padding:.5rem .75rem;text-align:left;border-bottom:1px solid var(--color-border)}th.svelte-7tcksg{font-weight:600;font-size:.78rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);border-bottom-color:var(--color-border-strong)}tr.svelte-7tcksg:last-child td:where(.svelte-7tcksg){border-bottom:none}.log-card.svelte-15ufwrh{display:flex;flex-direction:column;gap:var(--space-3)}.header.svelte-15ufwrh{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}.logs.svelte-15ufwrh{max-height:24rem;font-size:.78rem;line-height:1.45;white-space:pre}.small.svelte-15ufwrh{font-size:.85rem}button.svelte-15ufwrh{display:inline-flex;align-items:center;gap:.375rem}.back.svelte-1eq4g96{font-size:.92rem}.page-header.svelte-1eq4g96{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:var(--space-3)}.kv.svelte-1eq4g96{margin:var(--space-3) 0;display:grid;grid-template-columns:max-content 1fr;gap:var(--space-1) var(--space-3);font-size:.92rem}.kv.svelte-1eq4g96>div:where(.svelte-1eq4g96){display:contents}.kv.svelte-1eq4g96 dt:where(.svelte-1eq4g96){color:var(--color-text-muted)}.kv.svelte-1eq4g96 dd:where(.svelte-1eq4g96){margin:0}.actions.svelte-1eq4g96{display:flex;gap:.5rem;flex-wrap:wrap}.row.inline.svelte-1cl3wo6{gap:.5rem}.row.inline.svelte-1cl3wo6 input[type=checkbox]:where(.svelte-1cl3wo6){width:auto}.banner.svelte-1cl3wo6{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3);border-radius:var(--radius);background:var(--color-info-bg);color:var(--color-info);border:1px solid var(--color-info);flex-wrap:wrap}.kv.svelte-1cl3wo6{margin:var(--space-3) 0;display:grid;grid-template-columns:max-content 1fr;gap:var(--space-1) var(--space-3);font-size:.92rem}.kv.svelte-1cl3wo6>div:where(.svelte-1cl3wo6){display:contents}.kv.svelte-1cl3wo6 dt:where(.svelte-1cl3wo6){color:var(--color-text-muted)}.kv.svelte-1cl3wo6 dd:where(.svelte-1cl3wo6){margin:0}.copy-row.svelte-1cl3wo6{display:flex;align-items:center;gap:.375rem}.actions.svelte-1cl3wo6{display:flex;justify-content:flex-end}.small.svelte-1cl3wo6{font-size:.85rem}.error.svelte-1cl3wo6{color:var(--color-danger)}.list.svelte-ngb3vw{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.5rem}.list.svelte-ngb3vw li:where(.svelte-ngb3vw){display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius);background:var(--color-surface-alt)}.strand-main.svelte-ngb3vw{display:flex;flex-direction:column;gap:.25rem;min-width:0}.strand-id.svelte-ngb3vw{overflow-wrap:anywhere;user-select:text}.error.svelte-ngb3vw{color:var(--color-danger)}.meta.svelte-ngb3vw{gap:.5rem}.small.svelte-ngb3vw{font-size:.85rem}.warning.svelte-ngb3vw{background:var(--color-warn-bg);border-color:var(--color-warn)}.warning.svelte-ngb3vw code:where(.svelte-ngb3vw){overflow-wrap:anywhere}.actions.svelte-ngb3vw{display:flex;justify-content:flex-end;gap:.5rem}.toast-stack.svelte-g7yjw8{position:fixed;right:1rem;bottom:1rem;display:flex;flex-direction:column;gap:.5rem;max-width:min(30rem,calc(100vw - 2rem));z-index:1100}.toast.svelte-g7yjw8{background:var(--color-surface);color:var(--color-text);border:1px solid var(--color-border-strong);border-radius:var(--radius);padding:.625rem .75rem;display:flex;align-items:center;gap:.5rem;box-shadow:var(--shadow);font-size:.92rem}.toast-error.svelte-g7yjw8{border-color:var(--color-danger);background:var(--color-danger-bg);color:var(--color-danger)}.toast-success.svelte-g7yjw8{border-color:var(--color-success);background:var(--color-success-bg);color:var(--color-success)}.text.svelte-g7yjw8{flex:1 1 auto}button.svelte-g7yjw8{font-size:1.1rem;line-height:1;padding:.125rem .5rem;color:currentColor}.topbar.svelte-1r8vfx3{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);padding:var(--space-3) var(--space-5);background:var(--color-surface);border-bottom:1px solid var(--color-border);backdrop-filter:saturate(180%) blur(8px)}.brand.svelte-1r8vfx3{display:flex;align-items:center;gap:.6rem;font-weight:600}.logo.svelte-1r8vfx3{color:var(--color-accent);font-size:1.1rem}nav.svelte-1r8vfx3{display:flex;gap:.125rem}nav.svelte-1r8vfx3 a:where(.svelte-1r8vfx3){font-size:.92rem;color:var(--color-text-muted);padding:.375rem .75rem;border-radius:var(--radius);text-decoration:none}nav.svelte-1r8vfx3 a:where(.svelte-1r8vfx3):hover{background:var(--color-surface-alt);color:var(--color-text)}nav.svelte-1r8vfx3 a.active:where(.svelte-1r8vfx3){color:var(--color-accent-on);background:var(--color-accent)}main.svelte-1r8vfx3{flex:1 1 auto;width:min(64rem,100%);margin:0 auto;padding:var(--space-5)}@media(max-width:640px){.topbar.svelte-1r8vfx3{flex-direction:column;align-items:flex-start;gap:var(--space-2);padding:var(--space-2) var(--space-3)}nav.svelte-1r8vfx3{width:100%;overflow-x:auto}main.svelte-1r8vfx3{padding:var(--space-3)}}:root{color-scheme:light dark;--font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono: ui-monospace, "SF Mono", "Cascadia Code", "Roboto Mono", Menlo, monospace;--radius-sm: .25rem;--radius: .5rem;--radius-lg: .75rem;--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.5rem;--space-6: 2rem;--space-7: 3rem;--color-bg: #f7f8fa;--color-surface: #ffffff;--color-surface-alt: #f0f2f6;--color-border: #d9dde3;--color-border-strong: #b8bec7;--color-text: #1d1f24;--color-text-muted: #5b626d;--color-text-soft: #8a8f99;--color-accent: #1d4ed8;--color-accent-strong: #1e3a8a;--color-accent-on: #ffffff;--color-accent-soft: #e0e7ff;--color-success: #15803d;--color-success-bg: #dcfce7;--color-warn: #b45309;--color-warn-bg: #fef3c7;--color-danger: #b91c1c;--color-danger-bg: #fee2e2;--color-info: #1d4ed8;--color-info-bg: #dbeafe;--shadow-sm: 0 1px 2px rgba(15, 23, 42, .05);--shadow: 0 4px 12px rgba(15, 23, 42, .08);--shadow-lg: 0 12px 32px rgba(15, 23, 42, .16)}@media(prefers-color-scheme:dark){:root{--color-bg: #0f1116;--color-surface: #181b22;--color-surface-alt: #20242d;--color-border: #2c313c;--color-border-strong: #3b424f;--color-text: #e8eaf0;--color-text-muted: #a4abb8;--color-text-soft: #777e8b;--color-accent: #93c5fd;--color-accent-strong: #bfdbfe;--color-accent-on: #0f1116;--color-accent-soft: #1e293b;--color-success: #4ade80;--color-success-bg: #14532d;--color-warn: #fbbf24;--color-warn-bg: #78350f;--color-danger: #f87171;--color-danger-bg: #7f1d1d;--color-info: #93c5fd;--color-info-bg: #1e3a8a;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .4);--shadow: 0 4px 12px rgba(0, 0, 0, .45);--shadow-lg: 0 12px 32px rgba(0, 0, 0, .6)}}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;padding:0;background:var(--color-bg);color:var(--color-text);font-family:var(--font-sans);font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased;min-height:100vh}#app{min-height:100vh;display:flex;flex-direction:column}h1,h2,h3,h4,h5,h6{margin:0 0 var(--space-2) 0;font-weight:600;line-height:1.25;letter-spacing:-.01em}h1{font-size:1.5rem}h2{font-size:1.25rem}h3{font-size:1.05rem}p{margin:0 0 var(--space-3) 0}a{color:var(--color-accent);text-decoration:none}a:hover{text-decoration:underline}button{font:inherit;cursor:pointer;border:1px solid var(--color-border-strong);background:var(--color-surface);color:var(--color-text);padding:var(--space-2) var(--space-3);border-radius:var(--radius);transition:background-color .12s ease,border-color .12s ease}button:hover:not(:disabled){background:var(--color-surface-alt);border-color:var(--color-text-muted)}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}button:disabled{opacity:.55;cursor:not-allowed}button.primary{background:var(--color-accent);border-color:var(--color-accent);color:var(--color-accent-on)}button.primary:hover:not(:disabled){background:var(--color-accent-strong);border-color:var(--color-accent-strong)}button.danger{background:var(--color-danger);border-color:var(--color-danger);color:#fff}button.ghost{background:transparent;border-color:transparent;color:var(--color-text-muted);padding:var(--space-1) var(--space-2)}button.ghost:hover:not(:disabled){color:var(--color-text);background:var(--color-surface-alt)}input[type=text],input[type=url],input[type=number],input[type=password],select,textarea{font:inherit;color:var(--color-text);background:var(--color-surface);border:1px solid var(--color-border-strong);border-radius:var(--radius);padding:var(--space-2) var(--space-3);width:100%}label{display:block;font-size:.85rem;color:var(--color-text-muted);font-weight:500;margin-bottom:var(--space-1)}code,pre{font-family:var(--font-mono);font-size:.85rem}pre{background:var(--color-surface-alt);padding:var(--space-3);border-radius:var(--radius);overflow:auto;margin:0}hr{border:none;border-top:1px solid var(--color-border);margin:var(--space-5) 0}.card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-5);box-shadow:var(--shadow-sm)}.muted{color:var(--color-text-muted)}.row{display:flex;gap:var(--space-3);align-items:center;flex-wrap:wrap}.stack{display:flex;flex-direction:column;gap:var(--space-3)}.grid{display:grid;gap:var(--space-4)}.badge{display:inline-flex;align-items:center;gap:var(--space-1);font-size:.78rem;font-weight:600;letter-spacing:.02em;text-transform:uppercase;padding:.125rem .5rem;border-radius:999px;background:var(--color-surface-alt);color:var(--color-text-muted)}.badge.ok{background:var(--color-success-bg);color:var(--color-success)}.badge.warn{background:var(--color-warn-bg);color:var(--color-warn)}.badge.err{background:var(--color-danger-bg);color:var(--color-danger)}.badge.info{background:var(--color-info-bg);color:var(--color-info)}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@@ -0,0 +1,17 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const i of a)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function r(a){const i={};return a.integrity&&(i.integrity=a.integrity),a.referrerPolicy&&(i.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?i.credentials="include":a.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(a){if(a.ep)return;a.ep=!0;const i=r(a);fetch(a.href,i)}})();const es=!1;var In=Array.isArray,ts=Array.prototype.indexOf,jt=Array.prototype.includes,Ir=Array.from,rs=Object.defineProperty,nr=Object.getOwnPropertyDescriptor,qa=Object.getOwnPropertyDescriptors,ns=Object.prototype,as=Array.prototype,xn=Object.getPrototypeOf,Kn=Object.isExtensible;const is=()=>{};function ss(e){return e()}function ln(e){for(var t=0;t<e.length;t++)e[t]()}function Ua(){var e,t,r=new Promise((n,a)=>{e=n,t=a});return{promise:r,resolve:e,reject:t}}const Ee=2,Vt=4,ur=8,Fa=1<<24,Ge=16,Ve=32,_t=64,cn=128,Be=512,_e=1024,ye=2048,Qe=4096,ke=8192,De=16384,Lt=32768,Yn=1<<25,Ht=65536,un=1<<17,os=1<<18,Qt=1<<19,Oa=1<<20,Ke=1<<25,Rt=65536,br=1<<21,or=1<<22,ht=1<<23,At=Symbol("$state"),ls=Symbol(""),at=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"},cs=!!globalThis.document?.contentType&&globalThis.document.contentType.includes("xml");function $a(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function us(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function ds(e,t,r){throw new Error("https://svelte.dev/e/each_key_duplicate")}function fs(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function vs(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function hs(e){throw new Error("https://svelte.dev/e/effect_orphan")}function ps(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function gs(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function _s(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function ms(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function ys(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const bs=1,ws=2,za=4,Es=8,ks=16,Cs=1,Ss=2,me=Symbol(),ja="http://www.w3.org/1999/xhtml",Ts="http://www.w3.org/2000/svg",As="http://www.w3.org/1998/Math/MathML";function Is(){console.warn("https://svelte.dev/e/derived_inert")}function xs(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Ms(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function Va(e){return e===this.v}function Rs(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Ha(e){return!Rs(e,this.v)}let dr=!1,Ns=!1;function Ps(){dr=!0}let de=null;function Kt(e){de=e}function Ie(e,t=!1,r){de={p:de,i:!1,c:null,e:null,s:e,x:null,r:Y,l:dr&&!t?{s:null,u:null,$:[]}:null}}function xe(e){var t=de,r=t.e;if(r!==null){t.e=null;for(var n of r)ui(n)}return t.i=!0,de=t.p,{}}function fr(){return!dr||de!==null&&de.l===null}let Ct=[];function Ka(){var e=Ct;Ct=[],ln(e)}function pt(e){if(Ct.length===0&&!ar){var t=Ct;queueMicrotask(()=>{t===Ct&&Ka()})}Ct.push(e)}function Ls(){for(;Ct.length>0;)Ka()}function Ya(e){var t=Y;if(t===null)return G.f|=ht,e;if((t.f&Lt)===0&&(t.f&Vt)===0)throw e;vt(e,t)}function vt(e,t){for(;t!==null;){if((t.f&cn)!==0){if((t.f&Lt)===0)throw e;try{t.b.error(e);return}catch(r){e=r}}t=t.parent}throw e}const Bs=-7169;function ve(e,t){e.f=e.f&Bs|t}function Mn(e){(e.f&Be)!==0||e.deps===null?ve(e,_e):ve(e,Qe)}function Ja(e){if(e!==null)for(const t of e)(t.f&Ee)===0||(t.f&Rt)===0||(t.f^=Rt,Ja(t.deps))}function Ga(e,t,r){(e.f&ye)!==0?t.add(e):(e.f&Qe)!==0&&r.add(e),Ja(e.deps),ve(e,_e)}const kt=new Set;let z=null,$e=null,dn=null,ar=!1,Lr=!1,Ot=null,mr=null;var Jn=0;let Ds=1;class mt{id=Ds++;current=new Map;previous=new Map;#r=new Set;#l=new Set;#e=new Set;#a=new Map;#n=new Map;#i=null;#t=[];#s=[];#c=new Set;#u=new Set;#o=new Map;#f=new Set;is_fork=!1;#h=!1;#v=new Set;#d(){return this.is_fork||this.#n.size>0}#_(){for(const n of this.#v)for(const a of n.#n.keys()){for(var t=!1,r=a;r.parent!==null;){if(this.#o.has(r)){t=!0;break}r=r.parent}if(!t)return!0}return!1}skip_effect(t){this.#o.has(t)||this.#o.set(t,{d:[],m:[]}),this.#f.delete(t)}unskip_effect(t,r=n=>this.schedule(n)){var n=this.#o.get(t);if(n){this.#o.delete(t);for(var a of n.d)ve(a,ye),r(a);for(a of n.m)ve(a,Qe),r(a)}this.#f.add(t)}#p(){if(Jn++>1e3&&(kt.delete(this),Us()),!this.#d()){for(const l of this.#c)this.#u.delete(l),ve(l,ye),this.schedule(l);for(const l of this.#u)ve(l,Qe),this.schedule(l)}const t=this.#t;this.#t=[],this.apply();var r=Ot=[],n=[],a=mr=[];for(const l of t)try{this.#m(l,r,n)}catch(o){throw Xa(l),o}if(z=null,a.length>0){var i=mt.ensure();for(const l of a)i.schedule(l)}if(Ot=null,mr=null,this.#d()||this.#_()){this.#g(n),this.#g(r);for(const[l,o]of this.#o)Wa(l,o)}else{this.#a.size===0&&kt.delete(this),this.#c.clear(),this.#u.clear();for(const l of this.#r)l(this);this.#r.clear(),Gn(n),Gn(r),this.#i?.resolve()}var s=z;if(this.#t.length>0){const l=s??=this;l.#t.push(...this.#t.filter(o=>!l.#t.includes(o)))}s!==null&&(kt.add(s),s.#p())}#m(t,r,n){t.f^=_e;for(var a=t.first;a!==null;){var i=a.f,s=(i&(Ve|_t))!==0,l=s&&(i&_e)!==0,o=l||(i&ke)!==0||this.#o.has(a);if(!o&&a.fn!==null){s?a.f^=_e:(i&Vt)!==0?r.push(a):hr(a)&&((i&Ge)!==0&&this.#u.add(a),Jt(a));var c=a.first;if(c!==null){a=c;continue}}for(;a!==null;){var u=a.next;if(u!==null){a=u;break}a=a.parent}}}#g(t){for(var r=0;r<t.length;r+=1)Ga(t[r],this.#c,this.#u)}capture(t,r,n=!1){t.v!==me&&!this.previous.has(t)&&this.previous.set(t,t.v),(t.f&ht)===0&&(this.current.set(t,[r,n]),$e?.set(t,r)),this.is_fork||(t.v=r)}activate(){z=this}deactivate(){z=null,$e=null}flush(){try{Lr=!0,z=this,this.#p()}finally{Jn=0,dn=null,Ot=null,mr=null,Lr=!1,z=null,$e=null,It.clear()}}discard(){for(const t of this.#l)t(this);this.#l.clear(),this.#e.clear(),kt.delete(this)}register_created_effect(t){this.#s.push(t)}#y(){for(const u of kt){var t=u.id<this.id,r=[];for(const[h,[v,_]]of this.current){if(u.current.has(h)){var n=u.current.get(h)[0];if(t&&v!==n)u.current.set(h,[v,_]);else continue}r.push(h)}var a=[...u.current.keys()].filter(h=>!this.current.has(h));if(a.length===0)t&&u.discard();else if(r.length>0){if(t)for(const h of this.#f)u.unskip_effect(h,v=>{(v.f&(Ge|or))!==0?u.schedule(v):u.#g([v])});u.activate();var i=new Set,s=new Map;for(var l of r)Qa(l,a,i,s);s=new Map;var o=[...u.current.keys()].filter(h=>this.current.has(h)?this.current.get(h)[0]!==h:!0);for(const h of this.#s)(h.f&(De|ke|un))===0&&Rn(h,o,s)&&((h.f&(or|Ge))!==0?(ve(h,ye),u.schedule(h)):u.#c.add(h));if(u.#t.length>0){u.apply();for(var c of u.#t)u.#m(c,[],[]);u.#t=[]}u.deactivate()}}for(const u of kt)u.#v.has(this)&&(u.#v.delete(this),u.#v.size===0&&!u.#d()&&(u.activate(),u.#p()))}increment(t,r){let n=this.#a.get(r)??0;if(this.#a.set(r,n+1),t){let a=this.#n.get(r)??0;this.#n.set(r,a+1)}}decrement(t,r,n){let a=this.#a.get(r)??0;if(a===1?this.#a.delete(r):this.#a.set(r,a-1),t){let i=this.#n.get(r)??0;i===1?this.#n.delete(r):this.#n.set(r,i-1)}this.#h||n||(this.#h=!0,pt(()=>{this.#h=!1,this.flush()}))}transfer_effects(t,r){for(const n of t)this.#c.add(n);for(const n of r)this.#u.add(n);t.clear(),r.clear()}oncommit(t){this.#r.add(t)}ondiscard(t){this.#l.add(t)}on_fork_commit(t){this.#e.add(t)}run_fork_commit_callbacks(){for(const t of this.#e)t(this);this.#e.clear()}settled(){return(this.#i??=Ua()).promise}static ensure(){if(z===null){const t=z=new mt;Lr||(kt.add(z),ar||pt(()=>{z===t&&t.flush()}))}return z}apply(){{$e=null;return}}schedule(t){if(dn=t,t.b?.is_pending&&(t.f&(Vt|ur|Fa))!==0&&(t.f&Lt)===0){t.b.defer_effect(t);return}for(var r=t;r.parent!==null;){r=r.parent;var n=r.f;if(Ot!==null&&r===Y&&(G===null||(G.f&Ee)===0))return;if((n&(_t|Ve))!==0){if((n&_e)===0)return;r.f^=_e}}this.#t.push(r)}}function qs(e){var t=ar;ar=!0;try{for(var r;;){if(Ls(),z===null)return r;z.flush()}}finally{ar=t}}function Us(){try{ps()}catch(e){vt(e,dn)}}let nt=null;function Gn(e){var t=e.length;if(t!==0){for(var r=0;r<t;){var n=e[r++];if((n.f&(De|ke))===0&&hr(n)&&(nt=new Set,Jt(n),n.deps===null&&n.first===null&&n.nodes===null&&n.teardown===null&&n.ac===null&&vi(n),nt?.size>0)){It.clear();for(const a of nt){if((a.f&(De|ke))!==0)continue;const i=[a];let s=a.parent;for(;s!==null;)nt.has(s)&&(nt.delete(s),i.push(s)),s=s.parent;for(let l=i.length-1;l>=0;l--){const o=i[l];(o.f&(De|ke))===0&&Jt(o)}}nt.clear()}}nt=null}}function Qa(e,t,r,n){if(!r.has(e)&&(r.add(e),e.reactions!==null))for(const a of e.reactions){const i=a.f;(i&Ee)!==0?Qa(a,t,r,n):(i&(or|Ge))!==0&&(i&ye)===0&&Rn(a,t,n)&&(ve(a,ye),Nn(a))}}function Rn(e,t,r){const n=r.get(e);if(n!==void 0)return n;if(e.deps!==null)for(const a of e.deps){if(jt.call(t,a))return!0;if((a.f&Ee)!==0&&Rn(a,t,r))return r.set(a,!0),!0}return r.set(e,!1),!1}function Nn(e){z.schedule(e)}function Wa(e,t){if(!((e.f&Ve)!==0&&(e.f&_e)!==0)){(e.f&ye)!==0?t.d.push(e):(e.f&Qe)!==0&&t.m.push(e),ve(e,_e);for(var r=e.first;r!==null;)Wa(r,t),r=r.next}}function Xa(e){ve(e,_e);for(var t=e.first;t!==null;)Xa(t),t=t.next}function Fs(e){let t=0,r=Nt(0),n;return()=>{Bn()&&(f(r),qn(()=>(t===0&&(n=Wt(()=>e(()=>ir(r)))),t+=1,()=>{pt(()=>{t-=1,t===0&&(n?.(),n=void 0,ir(r))})})))}}var Os=Ht|Qt;function $s(e,t,r,n){new zs(e,t,r,n)}class zs{parent;is_pending=!1;transform_error;#r;#l=null;#e;#a;#n;#i=null;#t=null;#s=null;#c=null;#u=0;#o=0;#f=!1;#h=new Set;#v=new Set;#d=null;#_=Fs(()=>(this.#d=Nt(this.#u),()=>{this.#d=null}));constructor(t,r,n,a){this.#r=t,this.#e=r,this.#a=i=>{var s=Y;s.b=this,s.f|=cn,n(i)},this.parent=Y.b,this.transform_error=a??this.parent?.transform_error??(i=>i),this.#n=Un(()=>{this.#y()},Os)}#p(){try{this.#i=Le(()=>this.#a(this.#r))}catch(t){this.error(t)}}#m(t){const r=this.#e.failed;r&&(this.#s=Le(()=>{r(this.#r,()=>t,()=>()=>{})}))}#g(){const t=this.#e.pending;t&&(this.is_pending=!0,this.#t=Le(()=>t(this.#r)),pt(()=>{var r=this.#c=document.createDocumentFragment(),n=it();r.append(n),this.#i=this.#w(()=>Le(()=>this.#a(n))),this.#o===0&&(this.#r.before(r),this.#c=null,xt(this.#t,()=>{this.#t=null}),this.#b(z))}))}#y(){try{if(this.is_pending=this.has_pending_snippet(),this.#o=0,this.#u=0,this.#i=Le(()=>{this.#a(this.#r)}),this.#o>0){var t=this.#c=document.createDocumentFragment();$n(this.#i,t);const r=this.#e.pending;this.#t=Le(()=>r(this.#r))}else this.#b(z)}catch(r){this.error(r)}}#b(t){this.is_pending=!1,t.transfer_effects(this.#h,this.#v)}defer_effect(t){Ga(t,this.#h,this.#v)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#e.pending}#w(t){var r=Y,n=G,a=de;We(this.#n),Ue(this.#n),Kt(this.#n.ctx);try{return mt.ensure(),t()}catch(i){return Ya(i),null}finally{We(r),Ue(n),Kt(a)}}#E(t,r){if(!this.has_pending_snippet()){this.parent&&this.parent.#E(t,r);return}this.#o+=t,this.#o===0&&(this.#b(r),this.#t&&xt(this.#t,()=>{this.#t=null}),this.#c&&(this.#r.before(this.#c),this.#c=null))}update_pending_count(t,r){this.#E(t,r),this.#u+=t,!(!this.#d||this.#f)&&(this.#f=!0,pt(()=>{this.#f=!1,this.#d&&Yt(this.#d,this.#u)}))}get_effect_pending(){return this.#_(),f(this.#d)}error(t){if(!this.#e.onerror&&!this.#e.failed)throw t;z?.is_fork?(this.#i&&z.skip_effect(this.#i),this.#t&&z.skip_effect(this.#t),this.#s&&z.skip_effect(this.#s),z.on_fork_commit(()=>{this.#k(t)})):this.#k(t)}#k(t){this.#i&&(Ae(this.#i),this.#i=null),this.#t&&(Ae(this.#t),this.#t=null),this.#s&&(Ae(this.#s),this.#s=null);var r=this.#e.onerror;let n=this.#e.failed;var a=!1,i=!1;const s=()=>{if(a){Ms();return}a=!0,i&&ys(),this.#s!==null&&xt(this.#s,()=>{this.#s=null}),this.#w(()=>{this.#y()})},l=o=>{try{i=!0,r?.(o,s),i=!1}catch(c){vt(c,this.#n&&this.#n.parent)}n&&(this.#s=this.#w(()=>{try{return Le(()=>{var c=Y;c.b=this,c.f|=cn,n(this.#r,()=>o,()=>s)})}catch(c){return vt(c,this.#n.parent),null}}))};pt(()=>{var o;try{o=this.transform_error(t)}catch(c){vt(c,this.#n&&this.#n.parent);return}o!==null&&typeof o=="object"&&typeof o.then=="function"?o.then(l,c=>vt(c,this.#n&&this.#n.parent)):l(o)})}}function js(e,t,r,n){const a=fr()?xr:Er;var i=e.filter(v=>!v.settled);if(r.length===0&&i.length===0){n(t.map(a));return}var s=Y,l=Vs(),o=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(v=>v.promise)):null;function c(v){l();try{n(v)}catch(_){(s.f&De)===0&&vt(_,s)}wr()}if(r.length===0){o.then(()=>c(t.map(a)));return}var u=Za();function h(){Promise.all(r.map(v=>Hs(v))).then(v=>c([...t.map(a),...v])).catch(v=>vt(v,s)).finally(()=>u())}o?o.then(()=>{l(),h(),wr()}):h()}function Vs(){var e=Y,t=G,r=de,n=z;return function(i=!0){We(e),Ue(t),Kt(r),i&&(e.f&De)===0&&(n?.activate(),n?.apply())}}function wr(e=!0){We(null),Ue(null),Kt(null),e&&z?.deactivate()}function Za(){var e=Y,t=e.b,r=z,n=t.is_rendered();return t.update_pending_count(1,r),r.increment(n,e),(a=!1)=>{t.update_pending_count(-1,r),r.decrement(n,e,a)}}function xr(e){var t=Ee|ye;return Y!==null&&(Y.f|=Qt),{ctx:de,deps:null,effects:null,equals:Va,f:t,fn:e,reactions:null,rv:0,v:me,wv:0,parent:Y,ac:null}}function Hs(e,t,r){let n=Y;n===null&&us();var a=void 0,i=Nt(me),s=!G,l=new Map;return ao(()=>{var o=Y,c=Ua();a=c.promise;try{Promise.resolve(e()).then(c.resolve,c.reject).finally(wr)}catch(_){c.reject(_),wr()}var u=z;if(s){if((o.f&Lt)!==0)var h=Za();if(n.b.is_rendered())l.get(u)?.reject(at),l.delete(u);else{for(const _ of l.values())_.reject(at);l.clear()}l.set(u,c)}const v=(_,k=void 0)=>{if(h){var S=k===at;h(S)}if(!(k===at||(o.f&De)!==0)){if(u.activate(),k)i.f|=ht,Yt(i,k);else{(i.f&ht)!==0&&(i.f^=ht),Yt(i,_);for(const[w,m]of l){if(l.delete(w),w===u)break;m.reject(at)}}u.deactivate()}};c.promise.then(v,_=>v(null,_||"unknown"))}),Dn(()=>{for(const o of l.values())o.reject(at)}),new Promise(o=>{function c(u){function h(){u===a?o(i):c(a)}u.then(h,h)}c(a)})}function ne(e){const t=xr(e);return gi(t),t}function Er(e){const t=xr(e);return t.equals=Ha,t}function Ks(e){var t=e.effects;if(t!==null){e.effects=null;for(var r=0;r<t.length;r+=1)Ae(t[r])}}function Pn(e){var t,r=Y,n=e.parent;if(!bt&&n!==null&&(n.f&(De|ke))!==0)return Is(),e.v;We(n);try{e.f&=~Rt,Ks(e),t=bi(e)}finally{We(r)}return t}function ei(e){var t=Pn(e);if(!e.equals(t)&&(e.wv=mi(),(!z?.is_fork||e.deps===null)&&(z!==null?z.capture(e,t,!0):e.v=t,e.deps===null))){ve(e,_e);return}bt||($e!==null?(Bn()||z?.is_fork)&&$e.set(e,t):Mn(e))}function Ys(e){if(e.effects!==null)for(const t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac?.abort(at),t.teardown=is,t.ac=null,lr(t,0),Fn(t))}function ti(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&Jt(t)}let fn=new Set;const It=new Map;let ri=!1;function Nt(e,t){var r={f:0,v:e,reactions:null,equals:Va,rv:0,wv:0};return r}function j(e,t){const r=Nt(e);return gi(r),r}function Js(e,t=!1,r=!0){const n=Nt(e);return t||(n.equals=Ha),dr&&r&&de!==null&&de.l!==null&&(de.l.s??=[]).push(n),n}function B(e,t,r=!1){G!==null&&(!ze||(G.f&un)!==0)&&fr()&&(G.f&(Ee|Ge|or|un))!==0&&(qe===null||!jt.call(qe,e))&&ms();let n=r?Ye(t):t;return Yt(e,n,mr)}function Yt(e,t,r=null){if(!e.equals(t)){It.set(e,bt?t:e.v);var n=mt.ensure();if(n.capture(e,t),(e.f&Ee)!==0){const a=e;(e.f&ye)!==0&&Pn(a),$e===null&&Mn(a)}e.wv=mi(),ni(e,ye,r),fr()&&Y!==null&&(Y.f&_e)!==0&&(Y.f&(Ve|_t))===0&&(Pe===null?so([e]):Pe.push(e)),!n.is_fork&&fn.size>0&&!ri&&Gs()}return t}function Gs(){ri=!1;for(const e of fn)(e.f&_e)!==0&&ve(e,Qe),hr(e)&&Jt(e);fn.clear()}function ir(e){B(e,e.v+1)}function ni(e,t,r){var n=e.reactions;if(n!==null)for(var a=fr(),i=n.length,s=0;s<i;s++){var l=n[s],o=l.f;if(!(!a&&l===Y)){var c=(o&ye)===0;if(c&&ve(l,t),(o&Ee)!==0){var u=l;$e?.delete(u),(o&Rt)===0&&(o&Be&&(Y===null||(Y.f&br)===0)&&(l.f|=Rt),ni(u,Qe,r))}else if(c){var h=l;(o&Ge)!==0&&nt!==null&&nt.add(h),r!==null?r.push(h):Nn(h)}}}}function Ye(e){if(typeof e!="object"||e===null||At in e)return e;const t=xn(e);if(t!==ns&&t!==as)return e;var r=new Map,n=In(e),a=j(0),i=Mt,s=l=>{if(Mt===i)return l();var o=G,c=Mt;Ue(null),ea(i);var u=l();return Ue(o),ea(c),u};return n&&r.set("length",j(e.length)),new Proxy(e,{defineProperty(l,o,c){(!("value"in c)||c.configurable===!1||c.enumerable===!1||c.writable===!1)&&gs();var u=r.get(o);return u===void 0?s(()=>{var h=j(c.value);return r.set(o,h),h}):B(u,c.value,!0),!0},deleteProperty(l,o){var c=r.get(o);if(c===void 0){if(o in l){const u=s(()=>j(me));r.set(o,u),ir(a)}}else B(c,me),ir(a);return!0},get(l,o,c){if(o===At)return e;var u=r.get(o),h=o in l;if(u===void 0&&(!h||nr(l,o)?.writable)&&(u=s(()=>{var _=Ye(h?l[o]:me),k=j(_);return k}),r.set(o,u)),u!==void 0){var v=f(u);return v===me?void 0:v}return Reflect.get(l,o,c)},getOwnPropertyDescriptor(l,o){var c=Reflect.getOwnPropertyDescriptor(l,o);if(c&&"value"in c){var u=r.get(o);u&&(c.value=f(u))}else if(c===void 0){var h=r.get(o),v=h?.v;if(h!==void 0&&v!==me)return{enumerable:!0,configurable:!0,value:v,writable:!0}}return c},has(l,o){if(o===At)return!0;var c=r.get(o),u=c!==void 0&&c.v!==me||Reflect.has(l,o);if(c!==void 0||Y!==null&&(!u||nr(l,o)?.writable)){c===void 0&&(c=s(()=>{var v=u?Ye(l[o]):me,_=j(v);return _}),r.set(o,c));var h=f(c);if(h===me)return!1}return u},set(l,o,c,u){var h=r.get(o),v=o in l;if(n&&o==="length")for(var _=c;_<h.v;_+=1){var k=r.get(_+"");k!==void 0?B(k,me):_ in l&&(k=s(()=>j(me)),r.set(_+"",k))}if(h===void 0)(!v||nr(l,o)?.writable)&&(h=s(()=>j(void 0)),B(h,Ye(c)),r.set(o,h));else{v=h.v!==me;var S=s(()=>Ye(c));B(h,S)}var w=Reflect.getOwnPropertyDescriptor(l,o);if(w?.set&&w.set.call(u,c),!v){if(n&&typeof o=="string"){var m=r.get("length"),I=Number(o);Number.isInteger(I)&&I>=m.v&&B(m,I+1)}ir(a)}return!0},ownKeys(l){f(a);var o=Reflect.ownKeys(l).filter(h=>{var v=r.get(h);return v===void 0||v.v!==me});for(var[c,u]of r)u.v!==me&&!(c in l)&&o.push(c);return o},setPrototypeOf(){_s()}})}function Qn(e){try{if(e!==null&&typeof e=="object"&&At in e)return e[At]}catch{}return e}function Qs(e,t){return Object.is(Qn(e),Qn(t))}var Wn,ai,ii,si;function Ws(){if(Wn===void 0){Wn=window,ai=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,r=Text.prototype;ii=nr(t,"firstChild").get,si=nr(t,"nextSibling").get,Kn(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),Kn(r)&&(r.__t=void 0)}}function it(e=""){return document.createTextNode(e)}function Je(e){return ii.call(e)}function vr(e){return si.call(e)}function d(e,t){return Je(e)}function be(e,t=!1){{var r=Je(e);return r instanceof Comment&&r.data===""?vr(r):r}}function p(e,t=1,r=!1){let n=e;for(;t--;)n=vr(n);return n}function Xs(e){e.textContent=""}function oi(){return!1}function li(e,t,r){return document.createElementNS(t??ja,e,void 0)}let Xn=!1;function Zs(){Xn||(Xn=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(const t of e.target.elements)t.__on_r?.()})},{capture:!0}))}function Mr(e){var t=G,r=Y;Ue(null),We(null);try{return e()}finally{Ue(t),We(r)}}function Ln(e,t,r,n=r){e.addEventListener(t,()=>Mr(r));const a=e.__on_r;a?e.__on_r=()=>{a(),n(!0)}:e.__on_r=()=>n(!0),Zs()}function ci(e){Y===null&&(G===null&&hs(),vs()),bt&&fs()}function eo(e,t){var r=t.last;r===null?t.last=t.first=e:(r.next=e,e.prev=r,t.last=e)}function Xe(e,t){var r=Y;r!==null&&(r.f&ke)!==0&&(e|=ke);var n={ctx:de,deps:null,nodes:null,f:e|ye|Be,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};z?.register_created_effect(n);var a=n;if((e&Vt)!==0)Ot!==null?Ot.push(n):mt.ensure().schedule(n);else if(t!==null){try{Jt(n)}catch(s){throw Ae(n),s}a.deps===null&&a.teardown===null&&a.nodes===null&&a.first===a.last&&(a.f&Qt)===0&&(a=a.first,(e&Ge)!==0&&(e&Ht)!==0&&a!==null&&(a.f|=Ht))}if(a!==null&&(a.parent=r,r!==null&&eo(a,r),G!==null&&(G.f&Ee)!==0&&(e&_t)===0)){var i=G;(i.effects??=[]).push(a)}return n}function Bn(){return G!==null&&!ze}function Dn(e){const t=Xe(ur,null);return ve(t,_e),t.teardown=e,t}function yt(e){ci();var t=Y.f,r=!G&&(t&Ve)!==0&&(t&Lt)===0;if(r){var n=de;(n.e??=[]).push(e)}else return ui(e)}function ui(e){return Xe(Vt|Oa,e)}function to(e){return ci(),Xe(ur|Oa,e)}function ro(e){mt.ensure();const t=Xe(_t|Qt,e);return(r={})=>new Promise(n=>{r.outro?xt(t,()=>{Ae(t),n(void 0)}):(Ae(t),n(void 0))})}function no(e){return Xe(Vt,e)}function ao(e){return Xe(or|Qt,e)}function qn(e,t=0){return Xe(ur|t,e)}function F(e,t=[],r=[],n=[]){js(n,t,r,a=>{Xe(ur,()=>e(...a.map(f)))})}function Un(e,t=0){var r=Xe(Ge|t,e);return r}function Le(e){return Xe(Ve|Qt,e)}function di(e){var t=e.teardown;if(t!==null){const r=bt,n=G;Zn(!0),Ue(null);try{t.call(null)}finally{Zn(r),Ue(n)}}}function Fn(e,t=!1){var r=e.first;for(e.first=e.last=null;r!==null;){const a=r.ac;a!==null&&Mr(()=>{a.abort(at)});var n=r.next;(r.f&_t)!==0?r.parent=null:Ae(r,t),r=n}}function io(e){for(var t=e.first;t!==null;){var r=t.next;(t.f&Ve)===0&&Ae(t),t=r}}function Ae(e,t=!0){var r=!1;(t||(e.f&os)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(fi(e.nodes.start,e.nodes.end),r=!0),ve(e,Yn),Fn(e,t&&!r),lr(e,0);var n=e.nodes&&e.nodes.t;if(n!==null)for(const i of n)i.stop();di(e),e.f^=Yn,e.f|=De;var a=e.parent;a!==null&&a.first!==null&&vi(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function fi(e,t){for(;e!==null;){var r=e===t?null:vr(e);e.remove(),e=r}}function vi(e){var t=e.parent,r=e.prev,n=e.next;r!==null&&(r.next=n),n!==null&&(n.prev=r),t!==null&&(t.first===e&&(t.first=n),t.last===e&&(t.last=r))}function xt(e,t,r=!0){var n=[];hi(e,n,!0);var a=()=>{r&&Ae(e),t&&t()},i=n.length;if(i>0){var s=()=>--i||a();for(var l of n)l.out(s)}else a()}function hi(e,t,r){if((e.f&ke)===0){e.f^=ke;var n=e.nodes&&e.nodes.t;if(n!==null)for(const l of n)(l.is_global||r)&&t.push(l);for(var a=e.first;a!==null;){var i=a.next;if((a.f&_t)===0){var s=(a.f&Ht)!==0||(a.f&Ve)!==0&&(e.f&Ge)!==0;hi(a,t,s?r:!1)}a=i}}}function On(e){pi(e,!0)}function pi(e,t){if((e.f&ke)!==0){e.f^=ke,(e.f&_e)===0&&(ve(e,ye),mt.ensure().schedule(e));for(var r=e.first;r!==null;){var n=r.next,a=(r.f&Ht)!==0||(r.f&Ve)!==0;pi(r,a?t:!1),r=n}var i=e.nodes&&e.nodes.t;if(i!==null)for(const s of i)(s.is_global||t)&&s.in()}}function $n(e,t){if(e.nodes)for(var r=e.nodes.start,n=e.nodes.end;r!==null;){var a=r===n?null:vr(r);t.append(r),r=a}}let yr=!1,bt=!1;function Zn(e){bt=e}let G=null,ze=!1;function Ue(e){G=e}let Y=null;function We(e){Y=e}let qe=null;function gi(e){G!==null&&(qe===null?qe=[e]:qe.push(e))}let Se=null,Me=0,Pe=null;function so(e){Pe=e}let _i=1,St=0,Mt=St;function ea(e){Mt=e}function mi(){return++_i}function hr(e){var t=e.f;if((t&ye)!==0)return!0;if(t&Ee&&(e.f&=~Rt),(t&Qe)!==0){for(var r=e.deps,n=r.length,a=0;a<n;a++){var i=r[a];if(hr(i)&&ei(i),i.wv>e.wv)return!0}(t&Be)!==0&&$e===null&&ve(e,_e)}return!1}function yi(e,t,r=!0){var n=e.reactions;if(n!==null&&!(qe!==null&&jt.call(qe,e)))for(var a=0;a<n.length;a++){var i=n[a];(i.f&Ee)!==0?yi(i,t,!1):t===i&&(r?ve(i,ye):(i.f&_e)!==0&&ve(i,Qe),Nn(i))}}function bi(e){var t=Se,r=Me,n=Pe,a=G,i=qe,s=de,l=ze,o=Mt,c=e.f;Se=null,Me=0,Pe=null,G=(c&(Ve|_t))===0?e:null,qe=null,Kt(e.ctx),ze=!1,Mt=++St,e.ac!==null&&(Mr(()=>{e.ac.abort(at)}),e.ac=null);try{e.f|=br;var u=e.fn,h=u();e.f|=Lt;var v=e.deps,_=z?.is_fork;if(Se!==null){var k;if(_||lr(e,Me),v!==null&&Me>0)for(v.length=Me+Se.length,k=0;k<Se.length;k++)v[Me+k]=Se[k];else e.deps=v=Se;if(Bn()&&(e.f&Be)!==0)for(k=Me;k<v.length;k++)(v[k].reactions??=[]).push(e)}else!_&&v!==null&&Me<v.length&&(lr(e,Me),v.length=Me);if(fr()&&Pe!==null&&!ze&&v!==null&&(e.f&(Ee|Qe|ye))===0)for(k=0;k<Pe.length;k++)yi(Pe[k],e);if(a!==null&&a!==e){if(St++,a.deps!==null)for(let S=0;S<r;S+=1)a.deps[S].rv=St;if(t!==null)for(const S of t)S.rv=St;Pe!==null&&(n===null?n=Pe:n.push(...Pe))}return(e.f&ht)!==0&&(e.f^=ht),h}catch(S){return Ya(S)}finally{e.f^=br,Se=t,Me=r,Pe=n,G=a,qe=i,Kt(s),ze=l,Mt=o}}function oo(e,t){let r=t.reactions;if(r!==null){var n=ts.call(r,e);if(n!==-1){var a=r.length-1;a===0?r=t.reactions=null:(r[n]=r[a],r.pop())}}if(r===null&&(t.f&Ee)!==0&&(Se===null||!jt.call(Se,t))){var i=t;(i.f&Be)!==0&&(i.f^=Be,i.f&=~Rt),i.v!==me&&Mn(i),Ys(i),lr(i,0)}}function lr(e,t){var r=e.deps;if(r!==null)for(var n=t;n<r.length;n++)oo(e,r[n])}function Jt(e){var t=e.f;if((t&De)===0){ve(e,_e);var r=Y,n=yr;Y=e,yr=!0;try{(t&(Ge|Fa))!==0?io(e):Fn(e),di(e);var a=bi(e);e.teardown=typeof a=="function"?a:null,e.wv=_i;var i;es&&Ns&&(e.f&ye)!==0&&e.deps}finally{yr=n,Y=r}}}async function lo(){await Promise.resolve(),qs()}function f(e){var t=e.f,r=(t&Ee)!==0;if(G!==null&&!ze){var n=Y!==null&&(Y.f&De)!==0;if(!n&&(qe===null||!jt.call(qe,e))){var a=G.deps;if((G.f&br)!==0)e.rv<St&&(e.rv=St,Se===null&&a!==null&&a[Me]===e?Me++:Se===null?Se=[e]:Se.push(e));else{(G.deps??=[]).push(e);var i=e.reactions;i===null?e.reactions=[G]:jt.call(i,G)||i.push(G)}}}if(bt&&It.has(e))return It.get(e);if(r){var s=e;if(bt){var l=s.v;return((s.f&_e)===0&&s.reactions!==null||Ei(s))&&(l=Pn(s)),It.set(s,l),l}var o=(s.f&Be)===0&&!ze&&G!==null&&(yr||(G.f&Be)!==0),c=(s.f&Lt)===0;hr(s)&&(o&&(s.f|=Be),ei(s)),o&&!c&&(ti(s),wi(s))}if($e?.has(e))return $e.get(e);if((e.f&ht)!==0)throw e.v;return e.v}function wi(e){if(e.f|=Be,e.deps!==null)for(const t of e.deps)(t.reactions??=[]).push(e),(t.f&Ee)!==0&&(t.f&Be)===0&&(ti(t),wi(t))}function Ei(e){if(e.v===me)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(It.has(t)||(t.f&Ee)!==0&&Ei(t))return!0;return!1}function Wt(e){var t=ze;try{return ze=!0,e()}finally{ze=t}}function co(e){if(!(typeof e!="object"||!e||e instanceof EventTarget)){if(At in e)vn(e);else if(!Array.isArray(e))for(let t in e){const r=e[t];typeof r=="object"&&r&&At in r&&vn(r)}}}function vn(e,t=new Set){if(typeof e=="object"&&e!==null&&!(e instanceof EventTarget)&&!t.has(e)){t.add(e),e instanceof Date&&e.getTime();for(let n in e)try{vn(e[n],t)}catch{}const r=xn(e);if(r!==Object.prototype&&r!==Array.prototype&&r!==Map.prototype&&r!==Set.prototype&&r!==Date.prototype){const n=qa(r);for(let a in n){const i=n[a].get;if(i)try{i.call(e)}catch{}}}}}const uo=["touchstart","touchmove"];function fo(e){return uo.includes(e)}const tr=Symbol("events"),ki=new Set,hn=new Set;function vo(e,t,r,n={}){function a(i){if(n.capture||pn.call(t,i),!i.cancelBubble)return Mr(()=>r?.call(this,i))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?pt(()=>{t.addEventListener(e,a,n)}):t.addEventListener(e,a,n),a}function kr(e,t,r,n,a){var i={capture:n,passive:a},s=vo(e,t,r,i);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&Dn(()=>{t.removeEventListener(e,s,i)})}function se(e,t,r){(t[tr]??={})[e]=r}function ot(e){for(var t=0;t<e.length;t++)ki.add(e[t]);for(var r of hn)r(e)}let ta=null;function pn(e){var t=this,r=t.ownerDocument,n=e.type,a=e.composedPath?.()||[],i=a[0]||e.target;ta=e;var s=0,l=ta===e&&e[tr];if(l){var o=a.indexOf(l);if(o!==-1&&(t===document||t===window)){e[tr]=t;return}var c=a.indexOf(t);if(c===-1)return;o<=c&&(s=o)}if(i=a[s]||e.target,i!==t){rs(e,"currentTarget",{configurable:!0,get(){return i||r}});var u=G,h=Y;Ue(null),We(null);try{for(var v,_=[];i!==null;){var k=i.assignedSlot||i.parentNode||i.host||null;try{var S=i[tr]?.[n];S!=null&&(!i.disabled||e.target===i)&&S.call(i,e)}catch(w){v?_.push(w):v=w}if(e.cancelBubble||k===t||k===null)break;i=k}if(v){for(let w of _)queueMicrotask(()=>{throw w});throw v}}finally{e[tr]=t,delete e.currentTarget,Ue(u),We(h)}}}const ho=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function po(e){return ho?.createHTML(e)??e}function Ci(e){var t=li("template");return t.innerHTML=po(e.replaceAll("<!>","<!---->")),t.content}function Pt(e,t){var r=Y;r.nodes===null&&(r.nodes={start:e,end:t,a:null,t:null})}function D(e,t){var r=(t&Cs)!==0,n=(t&Ss)!==0,a,i=!e.startsWith("<!>");return()=>{a===void 0&&(a=Ci(i?e:"<!>"+e),r||(a=Je(a)));var s=n||ai?document.importNode(a,!0):a.cloneNode(!0);if(r){var l=Je(s),o=s.lastChild;Pt(l,o)}else Pt(s,s);return s}}function go(e,t,r="svg"){var n=!e.startsWith("<!>"),a=`<${r}>${n?e:"<!>"+e}</${r}>`,i;return()=>{if(!i){var s=Ci(a),l=Je(s);i=Je(l)}var o=i.cloneNode(!0);return Pt(o,o),o}}function Si(e,t){return go(e,t,"svg")}function _o(e=""){{var t=it(e+"");return Pt(t,t),t}}function pr(){var e=document.createDocumentFragment(),t=document.createComment(""),r=it();return e.append(t,r),Pt(t,r),e}function L(e,t){e!==null&&e.before(t)}function P(e,t){var r=t==null?"":typeof t=="object"?`${t}`:t;r!==(e.__t??=e.nodeValue)&&(e.__t=r,e.nodeValue=`${r}`)}function mo(e,t){return yo(e,t)}const gr=new Map;function yo(e,{target:t,anchor:r,props:n={},events:a,context:i,intro:s=!0,transformError:l}){Ws();var o=void 0,c=ro(()=>{var u=r??t.appendChild(it());$s(u,{pending:()=>{}},_=>{Ie({});var k=de;i&&(k.c=i),a&&(n.$$events=a),o=e(_,n)||{},xe()},l);var h=new Set,v=_=>{for(var k=0;k<_.length;k++){var S=_[k];if(!h.has(S)){h.add(S);var w=fo(S);for(const A of[t,document]){var m=gr.get(A);m===void 0&&(m=new Map,gr.set(A,m));var I=m.get(S);I===void 0?(A.addEventListener(S,pn,{passive:w}),m.set(S,1)):m.set(S,I+1)}}}};return v(Ir(ki)),hn.add(v),()=>{for(var _ of h)for(const w of[t,document]){var k=gr.get(w),S=k.get(_);--S==0?(w.removeEventListener(_,pn),k.delete(_),k.size===0&&gr.delete(w)):k.set(_,S)}hn.delete(v),u!==r&&u.parentNode?.removeChild(u)}});return bo.set(o,c),o}let bo=new WeakMap;class wo{anchor;#r=new Map;#l=new Map;#e=new Map;#a=new Set;#n=!0;constructor(t,r=!0){this.anchor=t,this.#n=r}#i=t=>{if(this.#r.has(t)){var r=this.#r.get(t),n=this.#l.get(r);if(n)On(n),this.#a.delete(r);else{var a=this.#e.get(r);a&&(this.#l.set(r,a.effect),this.#e.delete(r),a.fragment.lastChild.remove(),this.anchor.before(a.fragment),n=a.effect)}for(const[i,s]of this.#r){if(this.#r.delete(i),i===t)break;const l=this.#e.get(s);l&&(Ae(l.effect),this.#e.delete(s))}for(const[i,s]of this.#l){if(i===r||this.#a.has(i))continue;const l=()=>{if(Array.from(this.#r.values()).includes(i)){var c=document.createDocumentFragment();$n(s,c),c.append(it()),this.#e.set(i,{effect:s,fragment:c})}else Ae(s);this.#a.delete(i),this.#l.delete(i)};this.#n||!n?(this.#a.add(i),xt(s,l,!1)):l()}}};#t=t=>{this.#r.delete(t);const r=Array.from(this.#r.values());for(const[n,a]of this.#e)r.includes(n)||(Ae(a.effect),this.#e.delete(n))};ensure(t,r){var n=z,a=oi();if(r&&!this.#l.has(t)&&!this.#e.has(t))if(a){var i=document.createDocumentFragment(),s=it();i.append(s),this.#e.set(t,{effect:Le(()=>r(s)),fragment:i})}else this.#l.set(t,Le(()=>r(this.anchor)));if(this.#r.set(n,t),a){for(const[l,o]of this.#l)l===t?n.unskip_effect(o):n.skip_effect(o);for(const[l,o]of this.#e)l===t?n.unskip_effect(o.effect):n.skip_effect(o.effect);n.oncommit(this.#i),n.ondiscard(this.#t)}else this.#i(n)}}function J(e,t,r=!1){var n=new wo(e),a=r?Ht:0;function i(s,l){n.ensure(s,l)}Un(()=>{var s=!1;t((l,o=0)=>{s=!0,i(o,l)}),s||i(-1,null)},a)}function Eo(e,t,r){for(var n=[],a=t.length,i,s=t.length,l=0;l<a;l++){let h=t[l];xt(h,()=>{if(i){if(i.pending.delete(h),i.done.add(h),i.pending.size===0){var v=e.outrogroups;gn(e,Ir(i.done)),v.delete(i),v.size===0&&(e.outrogroups=null)}}else s-=1},!1)}if(s===0){var o=n.length===0&&r!==null;if(o){var c=r,u=c.parentNode;Xs(u),u.append(c),e.items.clear()}gn(e,t,!o)}else i={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(i)}function gn(e,t,r=!0){var n;if(e.pending.size>0){n=new Set;for(const s of e.pending.values())for(const l of s)n.add(e.items.get(l).e)}for(var a=0;a<t.length;a++){var i=t[a];if(n?.has(i)){i.f|=Ke;const s=document.createDocumentFragment();$n(i,s)}else Ae(t[a],r)}}var ra;function st(e,t,r,n,a,i=null){var s=e,l=new Map,o=(t&za)!==0;if(o){var c=e;s=c.appendChild(it())}var u=null,h=Er(()=>{var A=r();return In(A)?A:A==null?[]:Ir(A)}),v,_=new Map,k=!0;function S(A){(I.effect.f&De)===0&&(I.pending.delete(A),I.fallback=u,ko(I,v,s,t,n),u!==null&&(v.length===0?(u.f&Ke)===0?On(u):(u.f^=Ke,rr(u,null,s)):xt(u,()=>{u=null})))}function w(A){I.pending.delete(A)}var m=Un(()=>{v=f(h);for(var A=v.length,R=new Set,U=z,y=oi(),x=0;x<A;x+=1){var N=v[x],b=n(N,x),T=k?null:l.get(b);T?(T.v&&Yt(T.v,N),T.i&&Yt(T.i,x),y&&U.unskip_effect(T.e)):(T=Co(l,k?s:ra??=it(),N,b,x,a,t,r),k||(T.e.f|=Ke),l.set(b,T)),R.add(b)}if(A===0&&i&&!u&&(k?u=Le(()=>i(s)):(u=Le(()=>i(ra??=it())),u.f|=Ke)),A>R.size&&ds(),!k)if(_.set(U,R),y){for(const[E,g]of l)R.has(E)||U.skip_effect(g.e);U.oncommit(S),U.ondiscard(w)}else S(U);f(h)}),I={effect:m,items:l,pending:_,outrogroups:null,fallback:u};k=!1}function Zt(e){for(;e!==null&&(e.f&Ve)===0;)e=e.next;return e}function ko(e,t,r,n,a){var i=(n&Es)!==0,s=t.length,l=e.items,o=Zt(e.effect.first),c,u=null,h,v=[],_=[],k,S,w,m;if(i)for(m=0;m<s;m+=1)k=t[m],S=a(k,m),w=l.get(S).e,(w.f&Ke)===0&&(w.nodes?.a?.measure(),(h??=new Set).add(w));for(m=0;m<s;m+=1){if(k=t[m],S=a(k,m),w=l.get(S).e,e.outrogroups!==null)for(const T of e.outrogroups)T.pending.delete(w),T.done.delete(w);if((w.f&ke)!==0&&(On(w),i&&(w.nodes?.a?.unfix(),(h??=new Set).delete(w))),(w.f&Ke)!==0)if(w.f^=Ke,w===o)rr(w,null,r);else{var I=u?u.next:o;w===e.effect.last&&(e.effect.last=w.prev),w.prev&&(w.prev.next=w.next),w.next&&(w.next.prev=w.prev),dt(e,u,w),dt(e,w,I),rr(w,I,r),u=w,v=[],_=[],o=Zt(u.next);continue}if(w!==o){if(c!==void 0&&c.has(w)){if(v.length<_.length){var A=_[0],R;u=A.prev;var U=v[0],y=v[v.length-1];for(R=0;R<v.length;R+=1)rr(v[R],A,r);for(R=0;R<_.length;R+=1)c.delete(_[R]);dt(e,U.prev,y.next),dt(e,u,U),dt(e,y,A),o=A,u=y,m-=1,v=[],_=[]}else c.delete(w),rr(w,o,r),dt(e,w.prev,w.next),dt(e,w,u===null?e.effect.first:u.next),dt(e,u,w),u=w;continue}for(v=[],_=[];o!==null&&o!==w;)(c??=new Set).add(o),_.push(o),o=Zt(o.next);if(o===null)continue}(w.f&Ke)===0&&v.push(w),u=w,o=Zt(w.next)}if(e.outrogroups!==null){for(const T of e.outrogroups)T.pending.size===0&&(gn(e,Ir(T.done)),e.outrogroups?.delete(T));e.outrogroups.size===0&&(e.outrogroups=null)}if(o!==null||c!==void 0){var x=[];if(c!==void 0)for(w of c)(w.f&ke)===0&&x.push(w);for(;o!==null;)(o.f&ke)===0&&o!==e.fallback&&x.push(o),o=Zt(o.next);var N=x.length;if(N>0){var b=(n&za)!==0&&s===0?r:null;if(i){for(m=0;m<N;m+=1)x[m].nodes?.a?.measure();for(m=0;m<N;m+=1)x[m].nodes?.a?.fix()}Eo(e,x,b)}}i&&pt(()=>{if(h!==void 0)for(w of h)w.nodes?.a?.apply()})}function Co(e,t,r,n,a,i,s,l){var o=(s&bs)!==0?(s&ks)===0?Js(r,!1,!1):Nt(r):null,c=(s&ws)!==0?Nt(a):null;return{v:o,i:c,e:Le(()=>(i(t,o??r,c??a,l),()=>{e.delete(n)}))}}function rr(e,t,r){if(e.nodes)for(var n=e.nodes.start,a=e.nodes.end,i=t&&(t.f&Ke)===0?t.nodes.start:r;n!==null;){var s=vr(n);if(i.before(n),n===a)return;n=s}}function dt(e,t,r){t===null?e.effect.first=r:t.next=r,r===null?e.effect.last=t:r.prev=t}function So(e,t,r=!1,n=!1,a=!1,i=!1){var s=e,l="";if(r)var o=e;F(()=>{var c=Y;if(l!==(l=t()??"")){if(r){c.nodes=null,o.innerHTML=l,l!==""&&Pt(Je(o),o.lastChild);return}if(c.nodes!==null&&(fi(c.nodes.start,c.nodes.end),c.nodes=null),l!==""){var u=n?Ts:a?As:void 0,h=li(n?"svg":a?"math":"template",u);h.innerHTML=l;var v=n||a?h:h.content;if(Pt(Je(v),v.lastChild),n||a)for(;Je(v);)s.before(Je(v));else s.before(v)}}})}function Ti(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(r=Ti(e[t]))&&(n&&(n+=" "),n+=r)}else for(r in e)e[r]&&(n&&(n+=" "),n+=r);return n}function To(){for(var e,t,r=0,n="",a=arguments.length;r<a;r++)(e=arguments[r])&&(t=Ti(e))&&(n&&(n+=" "),n+=t);return n}function Ao(e){return typeof e=="object"?To(e):e??""}const na=[...`
2
+ \r\f \v\uFEFF`];function Io(e,t,r){var n=e==null?"":""+e;if(t&&(n=n?n+" "+t:t),r){for(var a of Object.keys(r))if(r[a])n=n?n+" "+a:a;else if(n.length)for(var i=a.length,s=0;(s=n.indexOf(a,s))>=0;){var l=s+i;(s===0||na.includes(n[s-1]))&&(l===n.length||na.includes(n[l]))?n=(s===0?"":n.substring(0,s))+n.substring(l+1):s=l}}return n===""?null:n}function xo(e,t){return e==null?null:String(e)}function wt(e,t,r,n,a,i){var s=e.__className;if(s!==r||s===void 0){var l=Io(r,n,i);l==null?e.removeAttribute("class"):e.className=l,e.__className=r}else if(i&&a!==i)for(var o in i){var c=!!i[o];(a==null||c!==!!a[o])&&e.classList.toggle(o,c)}return i}function _n(e,t,r,n){var a=e.__style;if(a!==t){var i=xo(t);i==null?e.removeAttribute("style"):e.style.cssText=i,e.__style=t}return n}function Ai(e,t,r=!1){if(e.multiple){if(t==null)return;if(!In(t))return xs();for(var n of e.options)n.selected=t.includes(sr(n));return}for(n of e.options){var a=sr(n);if(Qs(a,t)){n.selected=!0;return}}(!r||t!==void 0)&&(e.selectedIndex=-1)}function Mo(e){var t=new MutationObserver(()=>{Ai(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Dn(()=>{t.disconnect()})}function Ii(e,t,r=t){var n=new WeakSet,a=!0;Ln(e,"change",i=>{var s=i?"[selected]":":checked",l;if(e.multiple)l=[].map.call(e.querySelectorAll(s),sr);else{var o=e.querySelector(s)??e.querySelector("option:not([disabled])");l=o&&sr(o)}r(l),e.__value=l,z!==null&&n.add(z)}),no(()=>{var i=t();if(e===document.activeElement){var s=z;if(n.has(s))return}if(Ai(e,i,a),a&&i===void 0){var l=e.querySelector(":checked");l!==null&&(i=sr(l),r(i))}e.__value=i,a=!1}),Mo(e)}function sr(e){return"__value"in e?e.__value:e.value}const Ro=Symbol("is custom element"),No=Symbol("is html"),Po=cs?"progress":"PROGRESS";function xi(e,t){var r=Mi(e);r.value===(r.value=t??void 0)||e.value===t&&(t!==0||e.nodeName!==Po)||(e.value=t??"")}function he(e,t,r,n){var a=Mi(e);a[t]!==(a[t]=r)&&(t==="loading"&&(e[ls]=r),r==null?e.removeAttribute(t):typeof r!="string"&&Lo(e).includes(t)?e[t]=r:e.setAttribute(t,r))}function Mi(e){return e.__attributes??={[Ro]:e.nodeName.includes("-"),[No]:e.namespaceURI===ja}}var aa=new Map;function Lo(e){var t=e.getAttribute("is")||e.nodeName,r=aa.get(t);if(r)return r;aa.set(t,r=[]);for(var n,a=e,i=Element.prototype;i!==a;){n=qa(a);for(var s in n)n[s].set&&r.push(s);a=xn(a)}return r}function cr(e,t,r=t){var n=new WeakSet;Ln(e,"input",async a=>{var i=a?e.defaultValue:e.value;if(i=Br(e)?Dr(i):i,r(i),z!==null&&n.add(z),await lo(),i!==(i=t())){var s=e.selectionStart,l=e.selectionEnd,o=e.value.length;if(e.value=i??"",l!==null){var c=e.value.length;s===l&&l===o&&c>o?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=s,e.selectionEnd=Math.min(l,c))}}}),Wt(t)==null&&e.value&&(r(Br(e)?Dr(e.value):e.value),z!==null&&n.add(z)),qn(()=>{var a=t();if(e===document.activeElement){var i=z;if(n.has(i))return}Br(e)&&a===Dr(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function mn(e,t,r=t){Ln(e,"change",n=>{var a=n?e.defaultChecked:e.checked;r(a)}),Wt(t)==null&&r(e.checked),qn(()=>{var n=t();e.checked=!!n})}function Br(e){var t=e.type;return t==="number"||t==="range"}function Dr(e){return e===""?null:+e}function zn(e=!1){const t=de,r=t.l.u;if(!r)return;let n=()=>co(t.s);if(e){let a=0,i={};const s=xr(()=>{let l=!1;const o=t.s;for(const c in o)o[c]!==i[c]&&(i[c]=o[c],l=!0);return l&&a++,a});n=()=>f(s)}r.b.length&&to(()=>{ia(t,n),ln(r.b)}),yt(()=>{const a=Wt(()=>r.m.map(ss));return()=>{for(const i of a)typeof i=="function"&&i()}}),r.a.length&&yt(()=>{ia(t,n),ln(r.a)})}function ia(e,t){if(e.l.s)for(const r of e.l.s)f(r);t()}function gt(e,t,r,n){var a=n,i=!0,s=()=>(i&&(i=!1,a=n),a),l;l=e[t],l===void 0&&n!==void 0&&(l=s());var o;return o=()=>{var c=e[t];return c===void 0?s():(i=!0,c)},o}function lt(e){de===null&&$a(),dr&&de.l!==null?Do(de).m.push(e):yt(()=>{const t=Wt(e);if(typeof t=="function")return t})}function Bo(e){de===null&&$a(),lt(()=>()=>Wt(e))}function Do(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}const qo="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(qo);Ps();class Te extends Error{code;status;constructor(t,r,n=0){super(r),this.name="ApiError",this.code=t,this.status=n}}async function Re(e,t={}){let r;try{r=await fetch(e,{...t,headers:{accept:"application/json",...t.body!==void 0&&t.body!==null?{"content-type":"application/json"}:{},...t.headers??{}}})}catch(s){throw new Te("network",s.message||"Network request failed",0)}const i=(r.headers.get("content-type")??"").includes("application/json")?await r.json().catch(()=>null):null;if(!r.ok){const s=i;throw s&&s.ok===!1&&s.error?new Te(s.error.code,s.error.message,r.status):new Te(`http_${r.status}`,r.statusText||"Request failed",r.status)}if(i&&typeof i=="object"){const s=i;if(s.ok===!1&&s.error)throw new Te(s.error.code,s.error.message,r.status);if(s.ok===!0&&"data"in s)return s.data}return i}function Rr(e,t){const r=t===void 0?{method:"POST"}:{method:"POST",body:JSON.stringify(t)};return Re(e,r)}function yn(e,t){const r=t===void 0?{method:"PUT"}:{method:"PUT",body:JSON.stringify(t)};return Re(e,r)}function bn(e){return Re(e,{method:"DELETE"})}const W=Ye({status:"loading",service:null,nodes:[],nodeStats:{},trustCircle:{members:[],pending:[]},strands:{list:[],controlConnections:0,loaded:!1,error:null},connectivity:null,update:null,settings:null,toasts:[]});function ct(){return W}const sa=6e3;let Uo=0;function ee(e,t){const r=`t${++Uo}`,n={id:r,kind:e,text:t,expiresAt:Date.now()+sa};W.toasts.push(n),setTimeout(()=>Ri(r),sa)}function Ri(e){W.toasts=W.toasts.filter(t=>t.id!==e)}function Bt(e,t){const r=t instanceof Te?t.code:"error",n=t instanceof Error?t.message:String(t);console.error(`[cadre-host-ui] ${e}:`,t),ee("error",`${e}: ${n} (${r})`)}function Fo(e,t,r){if(!e)return"loading";const n=e.directReachability,a=t.some(i=>i.status!=="running");return n==="unreachable"||n==="cgnat"||a||r?.lastError?"warn":"ok"}function Gt(){W.status=Fo(W.connectivity,W.nodes,W.update)}async function Ni(){try{const e=await Re("/api/status");W.service=e.service,W.connectivity=e.connectivity,W.nodes.length===0&&(W.nodes=e.nodes.map(t=>({id:t.id,dockerId:"",partyId:t.partyId,profile:t.profile,status:t.status,spawnedAt:"",workdir:"",ports:{health:0,metrics:0,p2p:0}}))),Gt()}catch(e){Bt("status",e),W.status="error"}}async function Pi(){try{const e=await Re("/api/nodes");W.nodes=e.nodes,Gt()}catch(e){Bt("nodes",e)}}async function qr(e){try{const t=await Re(`/api/nodes/${encodeURIComponent(e)}`);return W.nodes=W.nodes.map(r=>r.id===e?t.node:r),W.nodeStats={...W.nodeStats,[e]:t.stats},t}catch(t){return Bt(`node ${e}`,t),null}}async function zt(){try{const e=await Re("/auth/trust-circle");W.trustCircle=e}catch(e){Bt("trust-circle",e)}}async function wn(){try{const e=await Re("/api/strands");W.strands={list:e.strands,controlConnections:e.controlConnections,loaded:!0,error:null}}catch(e){Bt("strands",e),W.strands={...W.strands,error:e instanceof Error?e.message:String(e)}}}async function $t(){try{const e=await Re("/nat/status");W.connectivity=e,Gt()}catch(e){Bt("connectivity",e)}}async function Cr(){try{const e=await Re("/update");W.update=e,Gt()}catch{W.update=null}}async function En(){try{const e=await Re("/api/settings");W.settings=e}catch(e){Bt("settings",e)}}function Oo(e){let t;try{t=JSON.parse(e.data)}catch{return}switch(e.type){case"node-state-changed":{const r=t.nodeId,n=t.status;r&&n&&(W.nodes=W.nodes.map(a=>a.id===r?{...a,status:n}:a),Gt());break}case"trust-circle-changed":zt();break;case"strands-changed":wn();break;case"connectivity-changed":$t();break;case"update-available":{const r=t.version,n=t.releaseNotesUrl;r&&(W.update={...W.update??{version:1},available:{version:r,publishedAt:W.update?.available?.publishedAt??new Date().toISOString(),...n?{releaseNotesUrl:n}:{}}},Gt());break}}}const kn={name:"home",params:{}};function Li(e){const t=e.startsWith("#")?e.slice(1):e,r=t.startsWith("/")?t.slice(1):t;if(!r)return kn;const n=r.split("/").filter(Boolean);switch(n[0]){case"trust-circle":return{name:"trust-circle",params:{}};case"connectivity":return{name:"connectivity",params:{}};case"nodes":return n.length>=2&&n[1]?{name:"node-detail",params:{id:decodeURIComponent(n[1])}}:{name:"nodes",params:{}};case"settings":return{name:"settings",params:{}};case"strands":return{name:"strands",params:{}};default:return kn}}function Tt(e,t={}){switch(e){case"home":return"#/";case"trust-circle":return"#/trust-circle";case"connectivity":return"#/connectivity";case"nodes":return"#/nodes";case"node-detail":return`#/nodes/${encodeURIComponent(t.id??"")}`;case"settings":return"#/settings";case"strands":return"#/strands"}}const Bi=Ye({route:typeof window>"u"?kn:Li(window.location.hash)});let Sr=!1;function Cn(){Bi.route=Li(window.location.hash)}function $o(){return Bi}function zo(){Sr||typeof window>"u"||(Sr=!0,window.addEventListener("hashchange",Cn),Cn())}function jo(){!Sr||typeof window>"u"||(Sr=!1,window.removeEventListener("hashchange",Cn))}const Vo=["node-state-changed","trust-circle-changed","strands-changed","connectivity-changed","update-available"],Ho=[2e3,4e3,8e3,16e3,3e4];function Ko(e,t={}){const r=t.url??"/api/events",n=t.eventSourceCtor??(typeof EventSource<"u"?EventSource:void 0);if(!n)return{close(){}};const a=n,i=t.backoffSchedule??Ho;let s=!1,l=0,o,c;function u(v){const _=Math.min(v,i.length-1);return i[_]??i[i.length-1]}function h(){if(s)return;c=new a(r);const v=c;v.onopen=()=>{s||(l=0,t.onOpen?.())};for(const _ of Vo)v.addEventListener(_,k=>{e({type:_,data:k.data??""})});v.onerror=()=>{if(s)return;try{v.close()}catch{}const _=u(l);t.onError?.(l,_),l+=1,o=setTimeout(h,_)}}return h(),{close(){if(s=!0,o&&clearTimeout(o),c)try{c.close()}catch{}}}}const Di=1e3,Sn=60*Di,Tn=60*Sn,oa=24*Tn;function je(e,t=Date.now()){if(!e)return"—";const r=Date.parse(e);if(!Number.isFinite(r))return"—";const n=t-r;return n<0?"just now":n<Sn?`${Math.floor(n/Di)}s ago`:n<Tn?`${Math.floor(n/Sn)}m ago`:n<oa?`${Math.floor(n/Tn)}h ago`:`${Math.floor(n/oa)}d ago`}function Yo(e){if(e==null||!Number.isFinite(e))return"—";if(e<1024)return`${e} B`;const t=["KB","MB","GB","TB"];let r=e/1024,n=0;for(;r>=1024&&n<t.length-1;)r/=1024,n+=1;return`${r.toFixed(r<10?2:1)} ${t[n]}`}function Jo(e){if(e==null||!Number.isFinite(e)||e<0)return"—";const t=Math.floor(e/86400),r=Math.floor(e%86400/3600),n=Math.floor(e%3600/60);return t>0?`${t}d ${r}h`:r>0?`${r}h ${n}m`:`${n}m`}function Tr(e){return e?e.length<=12?e:`${e.slice(0,6)}…${e.slice(-4)}`:"—"}var Go=D('<span role="status"><span class="bulb svelte-1qa2kn2" aria-hidden="true"></span> <span> </span></span>');function qi(e,t){const r=gt(t,"size",3,14),n=ne(()=>{switch(t.status){case"ok":return"ok";case"warn":return"warn";case"error":return"err";default:return"muted"}}),a=ne(()=>t.label??i(t.status));function i(u){switch(u){case"ok":return"Healthy";case"warn":return"Attention needed";case"error":return"Error";default:return"Loading…"}}var s=Go(),l=d(s),o=p(l,2),c=d(o);F(()=>{wt(s,1,`dot dot-${f(n)??""}`,"svelte-1qa2kn2"),_n(l,`width: ${r()??""}px; height: ${r()??""}px;`),P(c,f(a))}),L(e,s)}var Qo=D('<span class="row svelte-lwwmgz"><span> </span> <span class="badge"> </span></span>');function Ui(e,t){const r=ne(()=>{switch(t.reachability){case"reachable":return"Reachable";case"unreachable":return"Unreachable";case"cgnat":return"Behind CGNAT";default:return"Unknown"}}),n=ne(()=>{switch(t.reachability){case"reachable":return"ok";case"unreachable":return"err";case"cgnat":return"warn";default:return"info"}}),a=ne(()=>{switch(t.portMode){case"auto-upnp":return"UPnP";case"auto-natpmp":return"NAT-PMP";case"manual":return"Manual";case"failed":return"Failed";case"disabled":return"Disabled";default:return t.portMode}});var i=Qo(),s=d(i),l=d(s),o=p(s,2),c=d(o);F(()=>{wt(s,1,`badge ${f(n)??""}`,"svelte-lwwmgz"),P(l,f(r)),P(c,f(a))}),L(e,i)}var Wo=D('<div class="banner info svelte-15mtls8"><div><strong>Update available</strong> <span class="muted"> </span></div> <a class="link svelte-15mtls8">View update</a></div>'),Xo=D('<a class="link svelte-15mtls8">Resolve →</a>'),Zo=D('<!> <dl class="kv svelte-15mtls8"><div class="svelte-15mtls8"><dt class="svelte-15mtls8">External IP</dt><dd class="svelte-15mtls8"> </dd></div> <div class="svelte-15mtls8"><dt class="svelte-15mtls8">External port</dt><dd class="svelte-15mtls8"> </dd></div> <div class="svelte-15mtls8"><dt class="svelte-15mtls8">Last tested</dt><dd class="svelte-15mtls8"> </dd></div></dl> <!>',1),el=D('<p class="muted">Loading connectivity…</p>'),tl=D('<p class="muted"> </p>'),rl=D('<section class="stack"><!> <div class="grid summary svelte-15mtls8"><div class="card"><h3>Overall</h3> <!> <dl class="kv svelte-15mtls8"><div class="svelte-15mtls8"><dt class="svelte-15mtls8">Service</dt><dd class="svelte-15mtls8"> </dd></div> <div class="svelte-15mtls8"><dt class="svelte-15mtls8">Version</dt><dd class="svelte-15mtls8"> </dd></div> <div class="svelte-15mtls8"><dt class="svelte-15mtls8">Uptime</dt><dd class="svelte-15mtls8"> </dd></div></dl></div> <div class="card"><h3>Connectivity</h3> <!></div> <div class="card"><h3>Trust circle</h3> <p class="big svelte-15mtls8"> <span class="muted svelte-15mtls8">members</span></p> <!> <a class="link svelte-15mtls8">Manage →</a></div> <div class="card"><h3>Nodes</h3> <p class="big svelte-15mtls8"> <span class="muted svelte-15mtls8"> </span></p> <a class="link svelte-15mtls8">Details →</a></div></div></section>');function nl(e,t){Ie(t,!0);const r=ct();lt(()=>{Ni(),Cr()});const n=ne(()=>r.update?.available?.version??null),a=ne(()=>r.trustCircle.members.length),i=ne(()=>r.trustCircle.pending.length),s=ne(()=>r.nodes.filter($=>$.status==="running").length);var l=rl(),o=d(l);{var c=$=>{var ue=Wo(),re=d(ue),ge=p(d(re),2),oe=d(ge),X=p(re,2);F(le=>{P(oe,`— version ${f(n)??""}`),he(X,"href",le)},[()=>Tt("settings")]),L($,ue)};J(o,$=>{f(n)&&$(c)})}var u=p(o,2),h=d(u),v=p(d(h),2);qi(v,{get status(){return r.status}});var _=p(v,2),k=d(_),S=p(d(k)),w=d(S),m=p(k,2),I=p(d(m)),A=d(I),R=p(m,2),U=p(d(R)),y=d(U),x=p(h,2),N=p(d(x),2);{var b=$=>{var ue=Zo(),re=be(ue);Ui(re,{get reachability(){return r.connectivity.directReachability},get portMode(){return r.connectivity.portMode}});var ge=p(re,2),oe=d(ge),X=p(d(oe)),le=d(X),Ne=p(oe,2),Ze=p(d(Ne)),ut=d(Ze),Fe=p(Ne,2),Et=p(d(Fe)),Oe=d(Et),q=p(ge,2);{var Z=ce=>{var pe=Xo();F(fe=>he(pe,"href",fe),[()=>Tt("connectivity")]),L(ce,pe)};J(q,ce=>{r.connectivity.directReachability!=="reachable"&&ce(Z)})}F(ce=>{P(le,r.connectivity.externalIp??"—"),P(ut,r.connectivity.externalPort),P(Oe,ce)},[()=>je(r.connectivity.lastTestedAt)]),L($,ue)},T=$=>{var ue=el();L($,ue)};J(N,$=>{r.connectivity?$(b):$(T,-1)})}var E=p(x,2),g=p(d(E),2),C=d(g),M=p(g,2);{var O=$=>{var ue=tl(),re=d(ue);F(()=>P(re,`${f(i)??""} pending invite${f(i)===1?"":"s"}`)),L($,ue)};J(M,$=>{f(i)>0&&$(O)})}var H=p(M,2),V=p(E,2),K=p(d(V),2),Q=d(K),te=p(Q),ae=d(te),ie=p(K,2);F(($,ue,re)=>{P(w,r.service?.name??"cadre-host"),P(A,r.service?.version??"—"),P(y,$),P(C,f(a)),he(H,"href",ue),P(Q,f(s)),P(ae,`/ ${r.nodes.length??""} running`),he(ie,"href",re)},[()=>Jo(r.service?.uptimeSeconds),()=>Tt("trust-circle"),()=>Tt("nodes")]),L(e,l),xe()}function al(e,t){const r=e.trim();return r?t.trim()===r:!1}var il=D('<p class="note svelte-80vbit"> </p>'),sl=D('<div class="gate svelte-80vbit"><label for="confirm-typed">Type <code> </code> to confirm:</label> <input id="confirm-typed" type="text" autocomplete="off" autocapitalize="off" spellcheck="false"/></div>'),ol=D('<div class="backdrop svelte-80vbit" role="presentation"></div> <div class="dialog svelte-80vbit" role="dialog" aria-modal="true" aria-labelledby="confirm-title" tabindex="-1"><h3 id="confirm-title"> </h3> <p class="muted"> </p> <!> <!> <div class="actions svelte-80vbit"><button> </button> <button> </button></div></div>',1);function Ar(e,t){Ie(t,!0);const r=gt(t,"confirmLabel",3,"Confirm"),n=gt(t,"cancelLabel",3,"Cancel"),a=gt(t,"danger",3,!1);let i=j(!1),s=j("");const l=ne(()=>typeof t.requireText=="string"&&t.requireText.trim()!==""),o=ne(()=>f(l)&&al(t.requireText??"",f(s))),c=ne(()=>!f(i)&&(!f(l)||f(o)));yt(()=>{t.open,t.requireText,B(s,"")});async function u(){if(f(c)){B(i,!0);try{await t.onConfirm()}finally{B(i,!1)}}}function h(w){w.key==="Escape"&&t.onCancel()}function v(w){w.key==="Enter"&&(w.preventDefault(),f(c)&&u())}var _=pr(),k=be(_);{var S=w=>{var m=ol(),I=be(m),A=p(I,2),R=d(A),U=d(R),y=p(R,2),x=d(y),N=p(y,2);{var b=V=>{var K=il(),Q=d(K);F(()=>P(Q,`⚠ ${t.note??""}`)),L(V,K)};J(N,V=>{t.note&&V(b)})}var T=p(N,2);{var E=V=>{var K=sl(),Q=d(K),te=p(d(Q)),ae=d(te),ie=p(Q,2);F(()=>{P(ae,t.requireText),ie.disabled=f(i)}),se("keydown",ie,v),cr(ie,()=>f(s),$=>B(s,$)),L(V,K)};J(T,V=>{f(l)&&V(E)})}var g=p(T,2),C=d(g),M=d(C),O=p(C,2),H=d(O);F(()=>{P(U,t.title),P(x,t.message),C.disabled=f(i),P(M,n()),wt(O,1,Ao(a()?"danger":"primary")),O.disabled=!f(c),P(H,f(i)?"Working…":r())}),se("click",I,function(...V){t.onCancel?.apply(this,V)}),se("keydown",A,h),se("click",C,function(...V){t.onCancel?.apply(this,V)}),se("click",O,u),L(w,m)};J(k,w=>{t.open&&w(S)})}L(e,_),xe()}ot(["click","keydown"]);function ll(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ft={},Ur,la;function cl(){return la||(la=1,Ur=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),Ur}var Fr={},ft={},ca;function Dt(){if(ca)return ft;ca=1;let e;const t=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return ft.getSymbolSize=function(n){if(!n)throw new Error('"version" cannot be null or undefined');if(n<1||n>40)throw new Error('"version" should be in range from 1 to 40');return n*4+17},ft.getSymbolTotalCodewords=function(n){return t[n]},ft.getBCHDigit=function(r){let n=0;for(;r!==0;)n++,r>>>=1;return n},ft.setToSJISFunction=function(n){if(typeof n!="function")throw new Error('"toSJISFunc" is not a valid function.');e=n},ft.isKanjiModeEnabled=function(){return typeof e<"u"},ft.toSJIS=function(n){return e(n)},ft}var Or={},ua;function jn(){return ua||(ua=1,(function(e){e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(r){if(typeof r!="string")throw new Error("Param is not a string");switch(r.toLowerCase()){case"l":case"low":return e.L;case"m":case"medium":return e.M;case"q":case"quartile":return e.Q;case"h":case"high":return e.H;default:throw new Error("Unknown EC Level: "+r)}}e.isValid=function(n){return n&&typeof n.bit<"u"&&n.bit>=0&&n.bit<4},e.from=function(n,a){if(e.isValid(n))return n;try{return t(n)}catch{return a}}})(Or)),Or}var $r,da;function ul(){if(da)return $r;da=1;function e(){this.buffer=[],this.length=0}return e.prototype={get:function(t){const r=Math.floor(t/8);return(this.buffer[r]>>>7-t%8&1)===1},put:function(t,r){for(let n=0;n<r;n++)this.putBit((t>>>r-n-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(t){const r=Math.floor(this.length/8);this.buffer.length<=r&&this.buffer.push(0),t&&(this.buffer[r]|=128>>>this.length%8),this.length++}},$r=e,$r}var zr,fa;function dl(){if(fa)return zr;fa=1;function e(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}return e.prototype.set=function(t,r,n,a){const i=t*this.size+r;this.data[i]=n,a&&(this.reservedBit[i]=!0)},e.prototype.get=function(t,r){return this.data[t*this.size+r]},e.prototype.xor=function(t,r,n){this.data[t*this.size+r]^=n},e.prototype.isReserved=function(t,r){return this.reservedBit[t*this.size+r]},zr=e,zr}var jr={},va;function fl(){return va||(va=1,(function(e){const t=Dt().getSymbolSize;e.getRowColCoords=function(n){if(n===1)return[];const a=Math.floor(n/7)+2,i=t(n),s=i===145?26:Math.ceil((i-13)/(2*a-2))*2,l=[i-7];for(let o=1;o<a-1;o++)l[o]=l[o-1]-s;return l.push(6),l.reverse()},e.getPositions=function(n){const a=[],i=e.getRowColCoords(n),s=i.length;for(let l=0;l<s;l++)for(let o=0;o<s;o++)l===0&&o===0||l===0&&o===s-1||l===s-1&&o===0||a.push([i[l],i[o]]);return a}})(jr)),jr}var Vr={},ha;function vl(){if(ha)return Vr;ha=1;const e=Dt().getSymbolSize,t=7;return Vr.getPositions=function(n){const a=e(n);return[[0,0],[a-t,0],[0,a-t]]},Vr}var Hr={},pa;function hl(){return pa||(pa=1,(function(e){e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(a){return a!=null&&a!==""&&!isNaN(a)&&a>=0&&a<=7},e.from=function(a){return e.isValid(a)?parseInt(a,10):void 0},e.getPenaltyN1=function(a){const i=a.size;let s=0,l=0,o=0,c=null,u=null;for(let h=0;h<i;h++){l=o=0,c=u=null;for(let v=0;v<i;v++){let _=a.get(h,v);_===c?l++:(l>=5&&(s+=t.N1+(l-5)),c=_,l=1),_=a.get(v,h),_===u?o++:(o>=5&&(s+=t.N1+(o-5)),u=_,o=1)}l>=5&&(s+=t.N1+(l-5)),o>=5&&(s+=t.N1+(o-5))}return s},e.getPenaltyN2=function(a){const i=a.size;let s=0;for(let l=0;l<i-1;l++)for(let o=0;o<i-1;o++){const c=a.get(l,o)+a.get(l,o+1)+a.get(l+1,o)+a.get(l+1,o+1);(c===4||c===0)&&s++}return s*t.N2},e.getPenaltyN3=function(a){const i=a.size;let s=0,l=0,o=0;for(let c=0;c<i;c++){l=o=0;for(let u=0;u<i;u++)l=l<<1&2047|a.get(c,u),u>=10&&(l===1488||l===93)&&s++,o=o<<1&2047|a.get(u,c),u>=10&&(o===1488||o===93)&&s++}return s*t.N3},e.getPenaltyN4=function(a){let i=0;const s=a.data.length;for(let o=0;o<s;o++)i+=a.data[o];return Math.abs(Math.ceil(i*100/s/5)-10)*t.N4};function r(n,a,i){switch(n){case e.Patterns.PATTERN000:return(a+i)%2===0;case e.Patterns.PATTERN001:return a%2===0;case e.Patterns.PATTERN010:return i%3===0;case e.Patterns.PATTERN011:return(a+i)%3===0;case e.Patterns.PATTERN100:return(Math.floor(a/2)+Math.floor(i/3))%2===0;case e.Patterns.PATTERN101:return a*i%2+a*i%3===0;case e.Patterns.PATTERN110:return(a*i%2+a*i%3)%2===0;case e.Patterns.PATTERN111:return(a*i%3+(a+i)%2)%2===0;default:throw new Error("bad maskPattern:"+n)}}e.applyMask=function(a,i){const s=i.size;for(let l=0;l<s;l++)for(let o=0;o<s;o++)i.isReserved(o,l)||i.xor(o,l,r(a,o,l))},e.getBestMask=function(a,i){const s=Object.keys(e.Patterns).length;let l=0,o=1/0;for(let c=0;c<s;c++){i(c),e.applyMask(c,a);const u=e.getPenaltyN1(a)+e.getPenaltyN2(a)+e.getPenaltyN3(a)+e.getPenaltyN4(a);e.applyMask(c,a),u<o&&(o=u,l=c)}return l}})(Hr)),Hr}var _r={},ga;function Fi(){if(ga)return _r;ga=1;const e=jn(),t=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],r=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];return _r.getBlocksCount=function(a,i){switch(i){case e.L:return t[(a-1)*4+0];case e.M:return t[(a-1)*4+1];case e.Q:return t[(a-1)*4+2];case e.H:return t[(a-1)*4+3];default:return}},_r.getTotalCodewordsCount=function(a,i){switch(i){case e.L:return r[(a-1)*4+0];case e.M:return r[(a-1)*4+1];case e.Q:return r[(a-1)*4+2];case e.H:return r[(a-1)*4+3];default:return}},_r}var Kr={},er={},_a;function pl(){if(_a)return er;_a=1;const e=new Uint8Array(512),t=new Uint8Array(256);return(function(){let n=1;for(let a=0;a<255;a++)e[a]=n,t[n]=a,n<<=1,n&256&&(n^=285);for(let a=255;a<512;a++)e[a]=e[a-255]})(),er.log=function(n){if(n<1)throw new Error("log("+n+")");return t[n]},er.exp=function(n){return e[n]},er.mul=function(n,a){return n===0||a===0?0:e[t[n]+t[a]]},er}var ma;function gl(){return ma||(ma=1,(function(e){const t=pl();e.mul=function(n,a){const i=new Uint8Array(n.length+a.length-1);for(let s=0;s<n.length;s++)for(let l=0;l<a.length;l++)i[s+l]^=t.mul(n[s],a[l]);return i},e.mod=function(n,a){let i=new Uint8Array(n);for(;i.length-a.length>=0;){const s=i[0];for(let o=0;o<a.length;o++)i[o]^=t.mul(a[o],s);let l=0;for(;l<i.length&&i[l]===0;)l++;i=i.slice(l)}return i},e.generateECPolynomial=function(n){let a=new Uint8Array([1]);for(let i=0;i<n;i++)a=e.mul(a,new Uint8Array([1,t.exp(i)]));return a}})(Kr)),Kr}var Yr,ya;function _l(){if(ya)return Yr;ya=1;const e=gl();function t(r){this.genPoly=void 0,this.degree=r,this.degree&&this.initialize(this.degree)}return t.prototype.initialize=function(n){this.degree=n,this.genPoly=e.generateECPolynomial(this.degree)},t.prototype.encode=function(n){if(!this.genPoly)throw new Error("Encoder not initialized");const a=new Uint8Array(n.length+this.degree);a.set(n);const i=e.mod(a,this.genPoly),s=this.degree-i.length;if(s>0){const l=new Uint8Array(this.degree);return l.set(i,s),l}return i},Yr=t,Yr}var Jr={},Gr={},Qr={},ba;function Oi(){return ba||(ba=1,Qr.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40}),Qr}var He={},wa;function $i(){if(wa)return He;wa=1;const e="[0-9]+",t="[A-Z $%*+\\-./:]+";let r="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";r=r.replace(/u/g,"\\u");const n="(?:(?![A-Z0-9 $%*+\\-./:]|"+r+`)(?:.|[\r
3
+ ]))+`;He.KANJI=new RegExp(r,"g"),He.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),He.BYTE=new RegExp(n,"g"),He.NUMERIC=new RegExp(e,"g"),He.ALPHANUMERIC=new RegExp(t,"g");const a=new RegExp("^"+r+"$"),i=new RegExp("^"+e+"$"),s=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return He.testKanji=function(o){return a.test(o)},He.testNumeric=function(o){return i.test(o)},He.testAlphanumeric=function(o){return s.test(o)},He}var Ea;function qt(){return Ea||(Ea=1,(function(e){const t=Oi(),r=$i();e.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},e.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},e.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(i,s){if(!i.ccBits)throw new Error("Invalid mode: "+i);if(!t.isValid(s))throw new Error("Invalid version: "+s);return s>=1&&s<10?i.ccBits[0]:s<27?i.ccBits[1]:i.ccBits[2]},e.getBestModeForData=function(i){return r.testNumeric(i)?e.NUMERIC:r.testAlphanumeric(i)?e.ALPHANUMERIC:r.testKanji(i)?e.KANJI:e.BYTE},e.toString=function(i){if(i&&i.id)return i.id;throw new Error("Invalid mode")},e.isValid=function(i){return i&&i.bit&&i.ccBits};function n(a){if(typeof a!="string")throw new Error("Param is not a string");switch(a.toLowerCase()){case"numeric":return e.NUMERIC;case"alphanumeric":return e.ALPHANUMERIC;case"kanji":return e.KANJI;case"byte":return e.BYTE;default:throw new Error("Unknown mode: "+a)}}e.from=function(i,s){if(e.isValid(i))return i;try{return n(i)}catch{return s}}})(Gr)),Gr}var ka;function ml(){return ka||(ka=1,(function(e){const t=Dt(),r=Fi(),n=jn(),a=qt(),i=Oi(),s=7973,l=t.getBCHDigit(s);function o(v,_,k){for(let S=1;S<=40;S++)if(_<=e.getCapacity(S,k,v))return S}function c(v,_){return a.getCharCountIndicator(v,_)+4}function u(v,_){let k=0;return v.forEach(function(S){const w=c(S.mode,_);k+=w+S.getBitsLength()}),k}function h(v,_){for(let k=1;k<=40;k++)if(u(v,k)<=e.getCapacity(k,_,a.MIXED))return k}e.from=function(_,k){return i.isValid(_)?parseInt(_,10):k},e.getCapacity=function(_,k,S){if(!i.isValid(_))throw new Error("Invalid QR Code version");typeof S>"u"&&(S=a.BYTE);const w=t.getSymbolTotalCodewords(_),m=r.getTotalCodewordsCount(_,k),I=(w-m)*8;if(S===a.MIXED)return I;const A=I-c(S,_);switch(S){case a.NUMERIC:return Math.floor(A/10*3);case a.ALPHANUMERIC:return Math.floor(A/11*2);case a.KANJI:return Math.floor(A/13);case a.BYTE:default:return Math.floor(A/8)}},e.getBestVersionForData=function(_,k){let S;const w=n.from(k,n.M);if(Array.isArray(_)){if(_.length>1)return h(_,w);if(_.length===0)return 1;S=_[0]}else S=_;return o(S.mode,S.getLength(),w)},e.getEncodedBits=function(_){if(!i.isValid(_)||_<7)throw new Error("Invalid QR Code version");let k=_<<12;for(;t.getBCHDigit(k)-l>=0;)k^=s<<t.getBCHDigit(k)-l;return _<<12|k}})(Jr)),Jr}var Wr={},Ca;function yl(){if(Ca)return Wr;Ca=1;const e=Dt(),t=1335,r=21522,n=e.getBCHDigit(t);return Wr.getEncodedBits=function(i,s){const l=i.bit<<3|s;let o=l<<10;for(;e.getBCHDigit(o)-n>=0;)o^=t<<e.getBCHDigit(o)-n;return(l<<10|o)^r},Wr}var Xr={},Zr,Sa;function bl(){if(Sa)return Zr;Sa=1;const e=qt();function t(r){this.mode=e.NUMERIC,this.data=r.toString()}return t.getBitsLength=function(n){return 10*Math.floor(n/3)+(n%3?n%3*3+1:0)},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(n){let a,i,s;for(a=0;a+3<=this.data.length;a+=3)i=this.data.substr(a,3),s=parseInt(i,10),n.put(s,10);const l=this.data.length-a;l>0&&(i=this.data.substr(a),s=parseInt(i,10),n.put(s,l*3+1))},Zr=t,Zr}var en,Ta;function wl(){if(Ta)return en;Ta=1;const e=qt(),t=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function r(n){this.mode=e.ALPHANUMERIC,this.data=n}return r.getBitsLength=function(a){return 11*Math.floor(a/2)+6*(a%2)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(a){let i;for(i=0;i+2<=this.data.length;i+=2){let s=t.indexOf(this.data[i])*45;s+=t.indexOf(this.data[i+1]),a.put(s,11)}this.data.length%2&&a.put(t.indexOf(this.data[i]),6)},en=r,en}var tn,Aa;function El(){if(Aa)return tn;Aa=1;const e=qt();function t(r){this.mode=e.BYTE,typeof r=="string"?this.data=new TextEncoder().encode(r):this.data=new Uint8Array(r)}return t.getBitsLength=function(n){return n*8},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(r){for(let n=0,a=this.data.length;n<a;n++)r.put(this.data[n],8)},tn=t,tn}var rn,Ia;function kl(){if(Ia)return rn;Ia=1;const e=qt(),t=Dt();function r(n){this.mode=e.KANJI,this.data=n}return r.getBitsLength=function(a){return a*13},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(n){let a;for(a=0;a<this.data.length;a++){let i=t.toSJIS(this.data[a]);if(i>=33088&&i<=40956)i-=33088;else if(i>=57408&&i<=60351)i-=49472;else throw new Error("Invalid SJIS character: "+this.data[a]+`
4
+ Make sure your charset is UTF-8`);i=(i>>>8&255)*192+(i&255),n.put(i,13)}},rn=r,rn}var nn={exports:{}},xa;function Cl(){return xa||(xa=1,(function(e){var t={single_source_shortest_paths:function(r,n,a){var i={},s={};s[n]=0;var l=t.PriorityQueue.make();l.push(n,0);for(var o,c,u,h,v,_,k,S,w;!l.empty();){o=l.pop(),c=o.value,h=o.cost,v=r[c]||{};for(u in v)v.hasOwnProperty(u)&&(_=v[u],k=h+_,S=s[u],w=typeof s[u]>"u",(w||S>k)&&(s[u]=k,l.push(u,k),i[u]=c))}if(typeof a<"u"&&typeof s[a]>"u"){var m=["Could not find a path from ",n," to ",a,"."].join("");throw new Error(m)}return i},extract_shortest_path_from_predecessor_list:function(r,n){for(var a=[],i=n;i;)a.push(i),r[i],i=r[i];return a.reverse(),a},find_path:function(r,n,a){var i=t.single_source_shortest_paths(r,n,a);return t.extract_shortest_path_from_predecessor_list(i,a)},PriorityQueue:{make:function(r){var n=t.PriorityQueue,a={},i;r=r||{};for(i in n)n.hasOwnProperty(i)&&(a[i]=n[i]);return a.queue=[],a.sorter=r.sorter||n.default_sorter,a},default_sorter:function(r,n){return r.cost-n.cost},push:function(r,n){var a={value:r,cost:n};this.queue.push(a),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};e.exports=t})(nn)),nn.exports}var Ma;function Sl(){return Ma||(Ma=1,(function(e){const t=qt(),r=bl(),n=wl(),a=El(),i=kl(),s=$i(),l=Dt(),o=Cl();function c(m){return unescape(encodeURIComponent(m)).length}function u(m,I,A){const R=[];let U;for(;(U=m.exec(A))!==null;)R.push({data:U[0],index:U.index,mode:I,length:U[0].length});return R}function h(m){const I=u(s.NUMERIC,t.NUMERIC,m),A=u(s.ALPHANUMERIC,t.ALPHANUMERIC,m);let R,U;return l.isKanjiModeEnabled()?(R=u(s.BYTE,t.BYTE,m),U=u(s.KANJI,t.KANJI,m)):(R=u(s.BYTE_KANJI,t.BYTE,m),U=[]),I.concat(A,R,U).sort(function(x,N){return x.index-N.index}).map(function(x){return{data:x.data,mode:x.mode,length:x.length}})}function v(m,I){switch(I){case t.NUMERIC:return r.getBitsLength(m);case t.ALPHANUMERIC:return n.getBitsLength(m);case t.KANJI:return i.getBitsLength(m);case t.BYTE:return a.getBitsLength(m)}}function _(m){return m.reduce(function(I,A){const R=I.length-1>=0?I[I.length-1]:null;return R&&R.mode===A.mode?(I[I.length-1].data+=A.data,I):(I.push(A),I)},[])}function k(m){const I=[];for(let A=0;A<m.length;A++){const R=m[A];switch(R.mode){case t.NUMERIC:I.push([R,{data:R.data,mode:t.ALPHANUMERIC,length:R.length},{data:R.data,mode:t.BYTE,length:R.length}]);break;case t.ALPHANUMERIC:I.push([R,{data:R.data,mode:t.BYTE,length:R.length}]);break;case t.KANJI:I.push([R,{data:R.data,mode:t.BYTE,length:c(R.data)}]);break;case t.BYTE:I.push([{data:R.data,mode:t.BYTE,length:c(R.data)}])}}return I}function S(m,I){const A={},R={start:{}};let U=["start"];for(let y=0;y<m.length;y++){const x=m[y],N=[];for(let b=0;b<x.length;b++){const T=x[b],E=""+y+b;N.push(E),A[E]={node:T,lastCount:0},R[E]={};for(let g=0;g<U.length;g++){const C=U[g];A[C]&&A[C].node.mode===T.mode?(R[C][E]=v(A[C].lastCount+T.length,T.mode)-v(A[C].lastCount,T.mode),A[C].lastCount+=T.length):(A[C]&&(A[C].lastCount=T.length),R[C][E]=v(T.length,T.mode)+4+t.getCharCountIndicator(T.mode,I))}}U=N}for(let y=0;y<U.length;y++)R[U[y]].end=0;return{map:R,table:A}}function w(m,I){let A;const R=t.getBestModeForData(m);if(A=t.from(I,R),A!==t.BYTE&&A.bit<R.bit)throw new Error('"'+m+'" cannot be encoded with mode '+t.toString(A)+`.
5
+ Suggested mode is: `+t.toString(R));switch(A===t.KANJI&&!l.isKanjiModeEnabled()&&(A=t.BYTE),A){case t.NUMERIC:return new r(m);case t.ALPHANUMERIC:return new n(m);case t.KANJI:return new i(m);case t.BYTE:return new a(m)}}e.fromArray=function(I){return I.reduce(function(A,R){return typeof R=="string"?A.push(w(R,null)):R.data&&A.push(w(R.data,R.mode)),A},[])},e.fromString=function(I,A){const R=h(I,l.isKanjiModeEnabled()),U=k(R),y=S(U,A),x=o.find_path(y.map,"start","end"),N=[];for(let b=1;b<x.length-1;b++)N.push(y.table[x[b]].node);return e.fromArray(_(N))},e.rawSplit=function(I){return e.fromArray(h(I,l.isKanjiModeEnabled()))}})(Xr)),Xr}var Ra;function Tl(){if(Ra)return Fr;Ra=1;const e=Dt(),t=jn(),r=ul(),n=dl(),a=fl(),i=vl(),s=hl(),l=Fi(),o=_l(),c=ml(),u=yl(),h=qt(),v=Sl();function _(y,x){const N=y.size,b=i.getPositions(x);for(let T=0;T<b.length;T++){const E=b[T][0],g=b[T][1];for(let C=-1;C<=7;C++)if(!(E+C<=-1||N<=E+C))for(let M=-1;M<=7;M++)g+M<=-1||N<=g+M||(C>=0&&C<=6&&(M===0||M===6)||M>=0&&M<=6&&(C===0||C===6)||C>=2&&C<=4&&M>=2&&M<=4?y.set(E+C,g+M,!0,!0):y.set(E+C,g+M,!1,!0))}}function k(y){const x=y.size;for(let N=8;N<x-8;N++){const b=N%2===0;y.set(N,6,b,!0),y.set(6,N,b,!0)}}function S(y,x){const N=a.getPositions(x);for(let b=0;b<N.length;b++){const T=N[b][0],E=N[b][1];for(let g=-2;g<=2;g++)for(let C=-2;C<=2;C++)g===-2||g===2||C===-2||C===2||g===0&&C===0?y.set(T+g,E+C,!0,!0):y.set(T+g,E+C,!1,!0)}}function w(y,x){const N=y.size,b=c.getEncodedBits(x);let T,E,g;for(let C=0;C<18;C++)T=Math.floor(C/3),E=C%3+N-8-3,g=(b>>C&1)===1,y.set(T,E,g,!0),y.set(E,T,g,!0)}function m(y,x,N){const b=y.size,T=u.getEncodedBits(x,N);let E,g;for(E=0;E<15;E++)g=(T>>E&1)===1,E<6?y.set(E,8,g,!0):E<8?y.set(E+1,8,g,!0):y.set(b-15+E,8,g,!0),E<8?y.set(8,b-E-1,g,!0):E<9?y.set(8,15-E-1+1,g,!0):y.set(8,15-E-1,g,!0);y.set(b-8,8,1,!0)}function I(y,x){const N=y.size;let b=-1,T=N-1,E=7,g=0;for(let C=N-1;C>0;C-=2)for(C===6&&C--;;){for(let M=0;M<2;M++)if(!y.isReserved(T,C-M)){let O=!1;g<x.length&&(O=(x[g]>>>E&1)===1),y.set(T,C-M,O),E--,E===-1&&(g++,E=7)}if(T+=b,T<0||N<=T){T-=b,b=-b;break}}}function A(y,x,N){const b=new r;N.forEach(function(M){b.put(M.mode.bit,4),b.put(M.getLength(),h.getCharCountIndicator(M.mode,y)),M.write(b)});const T=e.getSymbolTotalCodewords(y),E=l.getTotalCodewordsCount(y,x),g=(T-E)*8;for(b.getLengthInBits()+4<=g&&b.put(0,4);b.getLengthInBits()%8!==0;)b.putBit(0);const C=(g-b.getLengthInBits())/8;for(let M=0;M<C;M++)b.put(M%2?17:236,8);return R(b,y,x)}function R(y,x,N){const b=e.getSymbolTotalCodewords(x),T=l.getTotalCodewordsCount(x,N),E=b-T,g=l.getBlocksCount(x,N),C=b%g,M=g-C,O=Math.floor(b/g),H=Math.floor(E/g),V=H+1,K=O-H,Q=new o(K);let te=0;const ae=new Array(g),ie=new Array(g);let $=0;const ue=new Uint8Array(y.buffer);for(let le=0;le<g;le++){const Ne=le<M?H:V;ae[le]=ue.slice(te,te+Ne),ie[le]=Q.encode(ae[le]),te+=Ne,$=Math.max($,Ne)}const re=new Uint8Array(b);let ge=0,oe,X;for(oe=0;oe<$;oe++)for(X=0;X<g;X++)oe<ae[X].length&&(re[ge++]=ae[X][oe]);for(oe=0;oe<K;oe++)for(X=0;X<g;X++)re[ge++]=ie[X][oe];return re}function U(y,x,N,b){let T;if(Array.isArray(y))T=v.fromArray(y);else if(typeof y=="string"){let O=x;if(!O){const H=v.rawSplit(y);O=c.getBestVersionForData(H,N)}T=v.fromString(y,O||40)}else throw new Error("Invalid data");const E=c.getBestVersionForData(T,N);if(!E)throw new Error("The amount of data is too big to be stored in a QR Code");if(!x)x=E;else if(x<E)throw new Error(`
6
+ The chosen QR Code version cannot contain this amount of data.
7
+ Minimum version required to store current data is: `+E+`.
8
+ `);const g=A(x,N,T),C=e.getSymbolSize(x),M=new n(C);return _(M,x),k(M),S(M,x),m(M,N,0),x>=7&&w(M,x),I(M,g),isNaN(b)&&(b=s.getBestMask(M,m.bind(null,M,N))),s.applyMask(b,M),m(M,N,b),{modules:M,version:x,errorCorrectionLevel:N,maskPattern:b,segments:T}}return Fr.create=function(x,N){if(typeof x>"u"||x==="")throw new Error("No input text");let b=t.M,T,E;return typeof N<"u"&&(b=t.from(N.errorCorrectionLevel,t.M),T=c.from(N.version),E=s.from(N.maskPattern),N.toSJISFunc&&e.setToSJISFunction(N.toSJISFunc)),U(x,T,b,E)},Fr}var an={},sn={},Na;function zi(){return Na||(Na=1,(function(e){function t(r){if(typeof r=="number"&&(r=r.toString()),typeof r!="string")throw new Error("Color should be defined as hex string");let n=r.slice().replace("#","").split("");if(n.length<3||n.length===5||n.length>8)throw new Error("Invalid hex color: "+r);(n.length===3||n.length===4)&&(n=Array.prototype.concat.apply([],n.map(function(i){return[i,i]}))),n.length===6&&n.push("F","F");const a=parseInt(n.join(""),16);return{r:a>>24&255,g:a>>16&255,b:a>>8&255,a:a&255,hex:"#"+n.slice(0,6).join("")}}e.getOptions=function(n){n||(n={}),n.color||(n.color={});const a=typeof n.margin>"u"||n.margin===null||n.margin<0?4:n.margin,i=n.width&&n.width>=21?n.width:void 0,s=n.scale||4;return{width:i,scale:i?4:s,margin:a,color:{dark:t(n.color.dark||"#000000ff"),light:t(n.color.light||"#ffffffff")},type:n.type,rendererOpts:n.rendererOpts||{}}},e.getScale=function(n,a){return a.width&&a.width>=n+a.margin*2?a.width/(n+a.margin*2):a.scale},e.getImageWidth=function(n,a){const i=e.getScale(n,a);return Math.floor((n+a.margin*2)*i)},e.qrToImageData=function(n,a,i){const s=a.modules.size,l=a.modules.data,o=e.getScale(s,i),c=Math.floor((s+i.margin*2)*o),u=i.margin*o,h=[i.color.light,i.color.dark];for(let v=0;v<c;v++)for(let _=0;_<c;_++){let k=(v*c+_)*4,S=i.color.light;if(v>=u&&_>=u&&v<c-u&&_<c-u){const w=Math.floor((v-u)/o),m=Math.floor((_-u)/o);S=h[l[w*s+m]?1:0]}n[k++]=S.r,n[k++]=S.g,n[k++]=S.b,n[k]=S.a}}})(sn)),sn}var Pa;function Al(){return Pa||(Pa=1,(function(e){const t=zi();function r(a,i,s){a.clearRect(0,0,i.width,i.height),i.style||(i.style={}),i.height=s,i.width=s,i.style.height=s+"px",i.style.width=s+"px"}function n(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}e.render=function(i,s,l){let o=l,c=s;typeof o>"u"&&(!s||!s.getContext)&&(o=s,s=void 0),s||(c=n()),o=t.getOptions(o);const u=t.getImageWidth(i.modules.size,o),h=c.getContext("2d"),v=h.createImageData(u,u);return t.qrToImageData(v.data,i,o),r(h,c,u),h.putImageData(v,0,0),c},e.renderToDataURL=function(i,s,l){let o=l;typeof o>"u"&&(!s||!s.getContext)&&(o=s,s=void 0),o||(o={});const c=e.render(i,s,o),u=o.type||"image/png",h=o.rendererOpts||{};return c.toDataURL(u,h.quality)}})(an)),an}var on={},La;function Il(){if(La)return on;La=1;const e=zi();function t(a,i){const s=a.a/255,l=i+'="'+a.hex+'"';return s<1?l+" "+i+'-opacity="'+s.toFixed(2).slice(1)+'"':l}function r(a,i,s){let l=a+i;return typeof s<"u"&&(l+=" "+s),l}function n(a,i,s){let l="",o=0,c=!1,u=0;for(let h=0;h<a.length;h++){const v=Math.floor(h%i),_=Math.floor(h/i);!v&&!c&&(c=!0),a[h]?(u++,h>0&&v>0&&a[h-1]||(l+=c?r("M",v+s,.5+_+s):r("m",o,0),o=0,c=!1),v+1<i&&a[h+1]||(l+=r("h",u),u=0)):o++}return l}return on.render=function(i,s,l){const o=e.getOptions(s),c=i.modules.size,u=i.modules.data,h=c+o.margin*2,v=o.color.light.a?"<path "+t(o.color.light,"fill")+' d="M0 0h'+h+"v"+h+'H0z"/>':"",_="<path "+t(o.color.dark,"stroke")+' d="'+n(u,c,o.margin)+'"/>',k='viewBox="0 0 '+h+" "+h+'"',w='<svg xmlns="http://www.w3.org/2000/svg" '+(o.width?'width="'+o.width+'" height="'+o.width+'" ':"")+k+' shape-rendering="crispEdges">'+v+_+`</svg>
9
+ `;return typeof l=="function"&&l(null,w),w},on}var Ba;function xl(){if(Ba)return Ft;Ba=1;const e=cl(),t=Tl(),r=Al(),n=Il();function a(i,s,l,o,c){const u=[].slice.call(arguments,1),h=u.length,v=typeof u[h-1]=="function";if(!v&&!e())throw new Error("Callback required as last argument");if(v){if(h<2)throw new Error("Too few arguments provided");h===2?(c=l,l=s,s=o=void 0):h===3&&(s.getContext&&typeof c>"u"?(c=o,o=void 0):(c=o,o=l,l=s,s=void 0))}else{if(h<1)throw new Error("Too few arguments provided");return h===1?(l=s,s=o=void 0):h===2&&!s.getContext&&(o=l,l=s,s=void 0),new Promise(function(_,k){try{const S=t.create(l,o);_(i(S,s,o))}catch(S){k(S)}})}try{const _=t.create(l,o);c(null,i(_,s,o))}catch(_){c(_)}}return Ft.create=t.create,Ft.toCanvas=a.bind(null,r.render),Ft.toDataURL=a.bind(null,r.renderToDataURL),Ft.toString=a.bind(null,function(i,s,l){return n.render(i,l)}),Ft}var Ml=xl();const Rl=ll(Ml);var Nl=D('<p class="muted"> </p>'),Pl=D('<div class="qr svelte-1uqetyj"></div>'),Ll=D('<div class="qr placeholder svelte-1uqetyj"></div>');function Bl(e,t){Ie(t,!0);const r=gt(t,"size",3,192);let n=j(""),a=j(null);yt(()=>{const u=t.value;if(!u){B(n,""),B(a,null);return}Rl.toString(u,{type:"svg",errorCorrectionLevel:"M",margin:1,width:r(),color:{dark:"#1d1f24",light:"#ffffff"}}).then(h=>{B(n,h,!0),B(a,null)}).catch(h=>{console.error("QR generation failed",h),B(a,h.message,!0)})});var i=pr(),s=be(i);{var l=u=>{var h=Nl(),v=d(h);F(()=>P(v,`QR unavailable: ${f(a)??""}`)),L(u,h)},o=u=>{var h=Pl();So(h,()=>f(n),!0),F(()=>_n(h,`width: ${r()??""}px; height: ${r()??""}px;`)),L(u,h)},c=u=>{var h=Ll();F(()=>_n(h,`width: ${r()??""}px; height: ${r()??""}px;`)),L(u,h)};J(s,u=>{f(a)?u(l):f(n)?u(o,1):u(c,-1)})}L(e,i),xe()}var Dl=Si('<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="5" width="9" height="9" rx="1.5"></rect><path d="M11 3.5V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h.5"></path></svg>');function An(e,t){const r=gt(t,"size",3,16);var n=Dl();F(()=>{he(n,"width",r()),he(n,"height",r())}),L(e,n)}var ql=D("<option> </option>"),Ul=D(`<form class="stack"><div><label for="invite-label">Label</label> <input id="invite-label" type="text" placeholder="e.g. Mom's phone" required="" autocomplete="off"/></div> <div><label for="invite-ttl">Expires after</label> <select id="invite-ttl"></select></div> <div class="actions svelte-1d46kin"><button type="button">Cancel</button> <button type="submit" class="primary"> </button></div></form>`),Fl=D('<p class="muted small svelte-1d46kin"> </p>'),Ol=D('<p class="muted">Share this invite with the new device. It can be scanned as a QR or pasted as text.</p> <div class="qr-wrap svelte-1d46kin"><!></div> <div class="token svelte-1d46kin"><textarea readonly="" rows="3" class="svelte-1d46kin"></textarea> <button class="ghost svelte-1d46kin" type="button" aria-label="Copy invite"><!> Copy</button></div> <!> <div class="actions svelte-1d46kin"><button type="button">Create another</button> <button type="button" class="primary">Done</button></div>',1),$l=D('<div class="backdrop svelte-1d46kin" role="presentation"></div> <div class="dialog svelte-1d46kin" role="dialog" aria-modal="true" aria-labelledby="invite-title" tabindex="-1"><h3 id="invite-title">Invite a friend</h3> <!></div>',1);function zl(e,t){Ie(t,!0);const r=[{label:"15 minutes",value:900*1e3},{label:"1 hour",value:3600*1e3},{label:"24 hours",value:1440*60*1e3},{label:"7 days",value:10080*60*1e3},{label:"No expiry",value:0}];let n=j(""),a=j(1440*60*1e3),i=j(!1),s=j(null);function l(){B(n,""),B(a,1440*60*1e3),B(i,!1),B(s,null)}function o(){l(),t.onClose()}async function c(S){S.preventDefault();const w=f(n).trim();if(!w){ee("error","Label is required");return}B(i,!0);try{const m={label:w};f(a)>0&&(m.ttlMs=f(a));const I=await Rr("/auth/invites",m);B(s,I,!0),ee("success","Invite created"),zt()}catch(m){const I=m instanceof Te?m.code:"error",A=m instanceof Error?m.message:String(m);ee("error",`Invite failed: ${A} (${I})`)}finally{B(i,!1)}}async function u(S){try{await navigator.clipboard.writeText(S),ee("success","Copied to clipboard")}catch(w){ee("error",`Copy failed: ${w.message}`)}}function h(S){S.key==="Escape"&&o()}var v=pr(),_=be(v);{var k=S=>{var w=$l(),m=be(w),I=p(m,2),A=p(d(I),2);{var R=y=>{var x=Ul(),N=d(x),b=p(d(N),2),T=p(N,2),E=p(d(T),2);st(E,21,()=>r,H=>H.value,(H,V)=>{var K=ql(),Q=d(K),te={};F(()=>{P(Q,f(V).label),te!==(te=f(V).value)&&(K.value=(K.__value=f(V).value)??"")}),L(H,K)});var g=p(T,2),C=d(g),M=p(C,2),O=d(M);F(()=>{C.disabled=f(i),M.disabled=f(i),P(O,f(i)?"Creating…":"Create invite")}),kr("submit",x,c),cr(b,()=>f(n),H=>B(n,H)),Ii(E,()=>f(a),H=>B(a,H)),se("click",C,o),L(y,x)},U=y=>{var x=Ol(),N=p(be(x),2),b=d(N);Bl(b,{get value(){return f(s).encodedInvite},size:224});var T=p(N,2),E=d(T),g=p(E,2),C=d(g);An(C,{});var M=p(T,2);{var O=Q=>{var te=Fl(),ae=d(te);F(ie=>P(ae,`Expires ${ie??""}`),[()=>new Date(f(s).expiresAt).toLocaleString()]),L(Q,te)};J(M,Q=>{f(s).expiresAt&&Q(O)})}var H=p(M,2),V=d(H),K=p(V,2);F(()=>xi(E,f(s).encodedInvite)),se("click",g,()=>u(f(s).encodedInvite)),se("click",V,()=>B(s,null)),se("click",K,o),L(y,x)};J(A,y=>{f(s)?y(U,-1):y(R)})}se("click",m,o),se("keydown",I,h),L(S,w)};J(_,S=>{t.open&&S(k)})}L(e,v),xe()}ot(["click","keydown"]);var jl=D('<p class="muted">No members yet. Use “Invite a friend” to add one.</p>'),Vl=D('<span class="badge info">This device</span>'),Hl=D('<button class="danger">Remove</button>'),Kl=D('<li class="svelte-3alf51"><div class="member-main svelte-3alf51"><div><span class="member-label svelte-3alf51"> </span> <!></div> <div class="muted small svelte-3alf51"><code> </code> </div></div> <!></li>'),Yl=D('<ul class="list svelte-3alf51"></ul>'),Jl=D('<p class="muted">No outstanding invites.</p>'),Gl=D('<li class="svelte-3alf51"><div class="member-main svelte-3alf51"><div><span class="member-label svelte-3alf51"> </span></div> <div class="muted small svelte-3alf51"> <!></div></div> <button>Revoke</button></li>'),Ql=D('<ul class="list svelte-3alf51"></ul>'),Wl=D('<section class="stack"><header class="page-header svelte-3alf51"><div><h2>Trust Circle</h2> <p class="muted">Devices authorised to participate in your cadre.</p></div> <button class="primary">Invite a friend</button></header> <div class="card"><h3> </h3> <!></div> <div class="card"><h3> </h3> <!></div></section> <!> <!> <!>',1);function Xl(e,t){Ie(t,!0);const r=ct();let n=j(!1),a=j(null),i=j(null);lt(()=>{zt()});async function s(){const E=f(a);if(E)try{await bn(`/auth/members/${encodeURIComponent(E.peerId)}`),ee("success",`Removed ${E.label||Tr(E.peerId)}`),await zt()}catch(g){const C=g instanceof Te?g.code:"error",M=g instanceof Error?g.message:String(g);ee("error",`Remove failed: ${M} (${C})`)}finally{B(a,null)}}async function l(){const E=f(i);if(E)try{await bn(`/auth/invites/${encodeURIComponent(E.token)}`),ee("success",`Revoked invite for ${E.label}`),await zt()}catch(g){const C=g instanceof Te?g.code:"error",M=g instanceof Error?g.message:String(g);ee("error",`Revoke failed: ${M} (${C})`)}finally{B(i,null)}}var o=Wl(),c=be(o),u=d(c),h=p(d(u),2),v=p(u,2),_=d(v),k=d(_),S=p(_,2);{var w=E=>{var g=jl();L(E,g)},m=E=>{var g=Yl();st(g,21,()=>r.trustCircle.members,C=>C.peerId,(C,M)=>{var O=Kl(),H=d(O),V=d(H),K=d(V),Q=d(K),te=p(K,2);{var ae=X=>{var le=Vl();L(X,le)};J(te,X=>{f(M).self&&X(ae)})}var ie=p(V,2),$=d(ie),ue=d($),re=p($),ge=p(H,2);{var oe=X=>{var le=Hl();F(()=>he(le,"aria-label",`Remove ${f(M).label||f(M).peerId}`)),se("click",le,()=>B(a,f(M),!0)),L(X,le)};J(ge,X=>{f(M).self||X(oe)})}F((X,le)=>{P(Q,f(M).label||"Unnamed"),he($,"title",f(M).peerId),P(ue,X),P(re,` · added ${le??""}`)},[()=>Tr(f(M).peerId),()=>je(f(M).addedAt)]),L(C,O)}),L(E,g)};J(S,E=>{r.trustCircle.members.length===0?E(w):E(m,-1)})}var I=p(v,2),A=d(I),R=d(A),U=p(A,2);{var y=E=>{var g=Jl();L(E,g)},x=E=>{var g=Ql();st(g,21,()=>r.trustCircle.pending,C=>C.token,(C,M)=>{var O=Gl(),H=d(O),V=d(H),K=d(V),Q=d(K),te=p(V,2),ae=d(te),ie=p(ae);{var $=re=>{var ge=_o();F(oe=>P(ge,`· expires ${oe??""}`),[()=>je(f(M).expiresAt)]),L(re,ge)};J(ie,re=>{f(M).expiresAt&&re($)})}var ue=p(H,2);F(re=>{P(Q,f(M).label),P(ae,`issued ${re??""} `)},[()=>je(f(M).createdAt)]),se("click",ue,()=>B(i,f(M),!0)),L(C,O)}),L(E,g)};J(U,E=>{r.trustCircle.pending.length===0?E(y):E(x,-1)})}var N=p(c,2);zl(N,{get open(){return f(n)},onClose:()=>B(n,!1)});var b=p(N,2);{let E=ne(()=>f(a)!==null),g=ne(()=>`Remove ${f(a)?.label||"this device"} from your trust circle? This cannot be undone — they will lose access to your cadre.`);Ar(b,{get open(){return f(E)},title:"Remove member",get message(){return f(g)},confirmLabel:"Remove",danger:!0,onConfirm:s,onCancel:()=>B(a,null)})}var T=p(b,2);{let E=ne(()=>f(i)!==null),g=ne(()=>`Revoke the invite for ${f(i)?.label??"this invite"}? It will no longer be redeemable.`);Ar(T,{get open(){return f(E)},title:"Revoke invite",get message(){return f(g)},confirmLabel:"Revoke",danger:!0,onConfirm:l,onCancel:()=>B(i,null)})}F(()=>{P(k,`Members (${r.trustCircle.members.length??""})`),P(R,`Pending invites (${r.trustCircle.pending.length??""})`)}),se("click",h,()=>B(n,!0)),L(e,o),xe()}ot(["click"]);var Zl=D('<!> <dl class="kv svelte-hh3bto"><div class="svelte-hh3bto"><dt class="svelte-hh3bto">External IP</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">Router IP</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">External port</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">Internal port</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">Last tested</dt><dd class="svelte-hh3bto"> </dd></div> <div class="svelte-hh3bto"><dt class="svelte-hh3bto">External IP detected</dt><dd class="svelte-hh3bto"> </dd></div></dl> <button> </button>',1),ec=D('<p class="muted">Loading…</p>'),tc=D(`<p>Your ISP is using Carrier-Grade NAT (CGNAT). You'll need to either:</p> <ul class="svelte-hh3bto"><li>Ask your ISP for a public IP.</li> <li>Use a relay / tunnel (e.g. Cloudflare Tunnel, Tailscale Funnel).</li></ul>`,1),rc=D(`<p>Your cadre isn't reachable from the open internet. The most likely causes:</p> <ul class="svelte-hh3bto"><li> </li> <li> </li></ul>`,1),nc=D('<div class="card warning svelte-hh3bto"><h3>Manual fix</h3> <!> <p class="muted small svelte-hh3bto">See <a href="https://github.com/gotchoices/sereus/blob/master/docs/cadre-host.md" target="_blank" rel="noreferrer">docs/cadre-host.md</a> for vendor-specific router instructions.</p></div>'),ac=D("<option> </option>"),ic=D('<span class="muted small svelte-hh3bto">(stored in OS keychain)</span>'),sc=D('<div><label> <!></label> <input autocomplete="off"/></div>'),oc=D('<p class="muted small svelte-hh3bto"> </p>'),lc=D(`<section class="stack"><header><h2>Connectivity</h2> <p class="muted">How the outside world reaches your cadre.</p></header> <div class="grid two svelte-hh3bto"><div class="card status-card"><h3>Current status</h3> <!></div> <!></div> <form class="card stack"><h3>Port forwarding</h3> <label class="row inline svelte-hh3bto"><input type="checkbox" class="svelte-hh3bto"/> <span>Attempt UPnP / NAT-PMP automatically</span></label> <div><label for="external-port">External port</label> <input id="external-port" type="number" min="1" max="65535"/></div> <div class="actions svelte-hh3bto"><button type="submit" class="primary"> </button></div></form> <form class="card stack"><h3>Dynamic DNS</h3> <p class="muted">Publish a stable hostname so your friends don't need to track your IP.</p> <div><label for="ddns-provider">Provider</label> <select id="ddns-provider"><option>— none —</option><!></select></div> <div><label for="ddns-hostname">Hostname</label> <input id="ddns-hostname" type="text" placeholder="e.g. yourname.duckdns.org" autocomplete="off"/></div> <!> <label class="row inline svelte-hh3bto"><input type="checkbox" class="svelte-hh3bto"/> <span>I manage this DDNS record outside cadre-host (don't auto-update)</span></label> <div class="actions svelte-hh3bto"><button type="submit" class="primary"> </button></div> <!></form></section>`);function cc(e,t){Ie(t,!0);const r=ct();let n=j(Ye([])),a=j(""),i=j(""),s=j(!1),l=j(Ye({})),o=j(!0),c=j(4001),u=j(!1),h=j(!1),v=j(!1);const _=ne(()=>f(n).find(q=>q.id===f(a))??null),k=ne(()=>!!r.connectivity&&(r.connectivity.directReachability==="unreachable"||r.connectivity.portMode==="failed")),S=ne(()=>r.connectivity?.cgnatDetected===!0);lt(()=>{$t(),w()}),yt(()=>{const q=r.connectivity;q&&(f(a)===""&&q.ddns.providerId&&B(a,q.ddns.providerId,!0),f(i)===""&&q.ddns.hostname&&B(i,q.ddns.hostname,!0),B(s,q.ddns.externallyManaged,!0),B(c,q.externalPort,!0))});async function w(){try{const q=await Re("/nat/providers");B(n,q,!0)}catch(q){ee("error",`Could not load DDNS providers: ${q.message}`)}}async function m(){B(u,!0);try{await Rr("/nat/test"),ee("success","Reachability test complete"),await $t()}catch(q){ee("error",`Test failed: ${q.message}`)}finally{B(u,!1)}}async function I(q){q.preventDefault(),B(h,!0);try{await yn("/nat/ddns",{providerId:f(a),hostname:f(i),config:{...f(l)},externallyManaged:f(s)}),ee("success","DDNS settings saved"),B(l,{},!0),await $t()}catch(Z){const ce=Z instanceof Te?Z.code:"error";ee("error",`Save failed: ${Z.message} (${ce})`)}finally{B(h,!1)}}async function A(q){q.preventDefault(),B(v,!0);try{await yn("/nat/settings",{upnpEnabled:f(o),externalPort:f(c)}),ee("success","Port settings saved"),await $t()}catch(Z){ee("error",`Save failed: ${Z.message}`)}finally{B(v,!1)}}var R=lc(),U=p(d(R),2),y=d(U),x=p(d(y),2);{var N=q=>{var Z=Zl(),ce=be(Z);Ui(ce,{get reachability(){return r.connectivity.directReachability},get portMode(){return r.connectivity.portMode}});var pe=p(ce,2),fe=d(pe),we=p(d(fe)),Ce=d(we),et=p(fe,2),Ut=p(d(et)),Xt=d(Ut),tt=p(et,2),rt=p(d(tt)),Nr=d(rt),Vn=p(tt,2),Vi=p(d(Vn)),Hi=d(Vi),Hn=p(Vn,2),Ki=p(d(Hn)),Yi=d(Ki),Ji=p(Hn,2),Gi=p(d(Ji)),Qi=d(Gi),Pr=p(pe,2),Wi=d(Pr);F((Xi,Zi)=>{P(Ce,r.connectivity.externalIp??"—"),P(Xt,r.connectivity.routerExternalIp??"—"),P(Nr,r.connectivity.externalPort),P(Hi,r.connectivity.internalPort),P(Yi,Xi),P(Qi,Zi),Pr.disabled=f(u),P(Wi,f(u)?"Testing…":"Test reachability")},[()=>je(r.connectivity.lastTestedAt),()=>je(r.connectivity.externalIpDetectedAt)]),se("click",Pr,m),L(q,Z)},b=q=>{var Z=ec();L(q,Z)};J(x,q=>{r.connectivity?q(N):q(b,-1)})}var T=p(y,2);{var E=q=>{var Z=nc(),ce=p(d(Z),2);{var pe=we=>{var Ce=tc();L(we,Ce)},fe=we=>{var Ce=rc(),et=p(be(Ce),2),Ut=d(et),Xt=d(Ut),tt=p(Ut,2),rt=d(tt);F(()=>{P(Xt,`Your router doesn't allow UPnP / NAT-PMP — open it and enable the feature, or set up a manual port-forward for port ${r.connectivity?.externalPort??""}.`),P(rt,`A firewall on this machine is blocking inbound TCP on port ${r.connectivity?.internalPort??""}.`)}),L(we,Ce)};J(ce,we=>{f(S)?we(pe):we(fe,-1)})}L(q,Z)};J(T,q=>{(f(k)||f(S))&&q(E)})}var g=p(U,2),C=p(d(g),2),M=d(C),O=p(C,2),H=p(d(O),2),V=p(O,2),K=d(V),Q=d(K),te=p(g,2),ae=p(d(te),4),ie=p(d(ae),2),$=d(ie);$.value=$.__value="";var ue=p($);st(ue,17,()=>f(n),q=>q.id,(q,Z)=>{var ce=ac(),pe=d(ce),fe={};F(()=>{P(pe,f(Z).displayName),fe!==(fe=f(Z).id)&&(ce.value=(ce.__value=f(Z).id)??"")}),L(q,ce)});var re=p(ae,2),ge=p(d(re),2),oe=p(re,2);{var X=q=>{var Z=pr(),ce=be(Z);st(ce,17,()=>f(_).configFields,pe=>pe.key,(pe,fe)=>{var we=sc(),Ce=d(we),et=d(Ce),Ut=p(et);{var Xt=rt=>{var Nr=ic();L(rt,Nr)};J(Ut,rt=>{f(fe).secret&&rt(Xt)})}var tt=p(Ce,2);F(()=>{he(Ce,"for",`ddns-${f(fe).key}`),P(et,`${f(fe).label??""} `),he(tt,"id",`ddns-${f(fe).key}`),he(tt,"type",f(fe).secret?"password":"text"),xi(tt,f(l)[f(fe).key]??"")}),se("input",tt,rt=>B(l,{...f(l),[f(fe).key]:rt.currentTarget.value},!0)),L(pe,we)}),L(q,Z)};J(oe,q=>{f(_)&&q(X)})}var le=p(oe,2),Ne=d(le),Ze=p(le,2),ut=d(Ze),Fe=d(ut),Et=p(Ze,2);{var Oe=q=>{var Z=oc(),ce=d(Z);F(pe=>P(ce,`Last DDNS update ${pe??""}
10
+ ${r.connectivity.ddns.lastUpdateOk===!0?"· ok":r.connectivity.ddns.lastUpdateOk===!1?`· failed: ${r.connectivity.ddns.lastError??"error"}`:""}`),[()=>je(r.connectivity.ddns.lastUpdateAt)]),L(q,Z)};J(Et,q=>{r.connectivity?.ddns.lastUpdateAt&&q(Oe)})}F(()=>{K.disabled=f(v),P(Q,f(v)?"Saving…":"Save port settings"),ut.disabled=f(h)||f(a)==="",P(Fe,f(h)?"Saving…":"Save DDNS settings")}),kr("submit",g,A),mn(M,()=>f(o),q=>B(o,q)),cr(H,()=>f(c),q=>B(c,q)),kr("submit",te,I),Ii(ie,()=>f(a),q=>B(a,q)),cr(ge,()=>f(i),q=>B(i,q)),mn(Ne,()=>f(s),q=>B(s,q)),L(e,R),xe()}ot(["click","input"]);var uc=D(`<p class="muted">No managed nodes yet. cadre-host v1 doesn't auto-spawn nodes — they
11
+ come up once you complete an invite redemption.</p>`),dc=D('<tr class="svelte-7tcksg"><td class="svelte-7tcksg"><code> </code></td><td class="svelte-7tcksg"> </td><td class="svelte-7tcksg"><span> </span></td><td class="svelte-7tcksg"><code> </code></td><td class="muted svelte-7tcksg"> </td><td class="svelte-7tcksg"><a>Details →</a></td></tr>'),fc=D('<table class="svelte-7tcksg"><thead><tr><th scope="col" class="svelte-7tcksg">ID</th><th scope="col" class="svelte-7tcksg">Profile</th><th scope="col" class="svelte-7tcksg">Status</th><th scope="col" class="svelte-7tcksg">Party</th><th scope="col" class="svelte-7tcksg">Spawned</th><th scope="col" class="svelte-7tcksg"></th></tr></thead><tbody></tbody></table>'),vc=D('<section class="stack"><header><h2>Nodes</h2> <p class="muted">Cadre nodes managed by this host.</p></header> <div class="card"><!></div></section>');function hc(e,t){Ie(t,!1);const r=ct();lt(()=>{Pi()}),zn();var n=vc(),a=p(d(n),2),i=d(a);{var s=o=>{var c=uc();L(o,c)},l=o=>{var c=fc(),u=p(d(c));st(u,5,()=>r.nodes,h=>h.id,(h,v)=>{var _=dc(),k=d(_),S=d(k),w=d(S),m=p(k),I=d(m),A=p(m),R=d(A),U=d(R),y=p(A),x=d(y),N=d(x),b=p(y),T=d(b),E=p(b),g=d(E);F((C,M,O)=>{P(w,f(v).id),P(I,f(v).profile),wt(R,1,`badge ${f(v).status==="running"?"ok":"err"}`),P(U,f(v).status),he(x,"title",f(v).partyId),P(N,C),P(T,M),he(g,"href",O)},[()=>Tr(f(v).partyId),()=>je(f(v).spawnedAt),()=>Tt("node-detail",{id:f(v).id})]),L(h,_)}),L(o,c)};J(i,o=>{r.nodes.length===0?o(s):o(l,-1)})}L(e,n),xe()}var pc=Si('<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13.5 8a5.5 5.5 0 1 1-1.6-3.9"></path><path d="M14 2v3h-3"></path></svg>');function gc(e,t){const r=gt(t,"size",3,16);var n=pc();F(()=>{he(n,"width",r()),he(n,"height",r())}),L(e,n)}var _c=D('<span class="muted small svelte-15ufwrh"> </span>'),mc=D('<p class="muted"> </p>'),yc=D('<pre class="logs svelte-15ufwrh"> </pre>'),bc=D('<div class="card log-card svelte-15ufwrh"><div class="header svelte-15ufwrh"><h3>Recent logs</h3> <div class="row"><!> <button class="ghost svelte-15ufwrh" aria-label="Refresh logs"><!> Refresh</button></div></div> <!></div>');function wc(e,t){Ie(t,!0);const r=gt(t,"lines",3,200);let n=j(Ye([])),a=j(!1),i=j(null);async function s(){if(t.nodeId){B(a,!0);try{const m=await Re(`/api/nodes/${encodeURIComponent(t.nodeId)}/logs?lines=${r()}`);B(n,m.lines,!0),B(i,new Date,!0)}catch(m){ee("error",`Logs unavailable: ${m.message}`)}finally{B(a,!1)}}}yt(()=>{s()});var l=bc(),o=d(l),c=p(d(o),2),u=d(c);{var h=m=>{var I=_c(),A=d(I);F(R=>P(A,`as of ${R??""}`),[()=>f(i).toLocaleTimeString()]),L(m,I)};J(u,m=>{f(i)&&m(h)})}var v=p(u,2),_=d(v);gc(_,{});var k=p(o,2);{var S=m=>{var I=mc(),A=d(I);F(()=>P(A,f(a)?"Loading…":"No log lines yet.")),L(m,I)},w=m=>{var I=yc(),A=d(I);F(R=>P(A,R),[()=>f(n).join(`
12
+ `)]),L(m,I)};J(k,m=>{f(n).length===0?m(S):m(w,-1)})}F(()=>v.disabled=f(a)),se("click",v,s),L(e,l),xe()}ot(["click"]);var Ec=D('<div class="card"><p class="muted"> </p></div>'),kc=D('<div class="card"><div class="page-header svelte-1eq4g96"><div><h2><code> </code></h2> <p class="muted"> <code> </code></p></div> <span> </span></div> <dl class="kv svelte-1eq4g96"><div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Workdir</dt><dd class="svelte-1eq4g96"><code> </code></dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Spawned</dt><dd class="svelte-1eq4g96"> </dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Ports</dt><dd class="svelte-1eq4g96"> </dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">CPU</dt><dd class="svelte-1eq4g96"> </dd></div> <div class="svelte-1eq4g96"><dt class="svelte-1eq4g96">Memory (RSS)</dt><dd class="svelte-1eq4g96"> </dd></div></dl> <div class="actions svelte-1eq4g96"><button> </button> <button> </button> <button class="danger">Stop</button></div></div> <!>',1),Cc=D('<section class="stack"><header class="row"><a class="back svelte-1eq4g96">← Back to nodes</a></header> <!></section> <!>',1);function Sc(e,t){Ie(t,!0);const r=ct();let n=j(!1),a=j(null),i;const s=ne(()=>r.nodes.find(m=>m.id===t.id)??null),l=ne(()=>r.nodeStats[t.id]??null);lt(()=>{qr(t.id),i=setInterval(()=>void qr(t.id),5e3)}),Bo(()=>{i&&clearInterval(i)});async function o(m){B(a,m,!0);try{await Rr(`/api/nodes/${encodeURIComponent(t.id)}/${m}`),ee("success",`${m} requested`),await qr(t.id)}catch(I){const A=I instanceof Te?I.code:"error",R=I instanceof Error?I.message:String(I);ee("error",`${m} failed: ${R} (${A})`)}finally{B(a,null)}}var c=Cc(),u=be(c),h=d(u),v=d(h),_=p(h,2);{var k=m=>{var I=Ec(),A=d(I),R=d(A);F(()=>P(R,`Loading node ${t.id??""}…`)),L(m,I)},S=m=>{var I=kc(),A=be(I),R=d(A),U=d(R),y=d(U),x=d(y),N=d(x),b=p(y,2),T=d(b),E=p(T),g=d(E),C=p(U,2),M=d(C),O=p(R,2),H=d(O),V=p(d(H)),K=d(V),Q=d(K),te=p(H,2),ae=p(d(te)),ie=d(ae),$=p(te,2),ue=p(d($)),re=d(ue),ge=p($,2),oe=p(d(ge)),X=d(oe),le=p(ge,2),Ne=p(d(le)),Ze=d(Ne),ut=p(O,2),Fe=d(ut),Et=d(Fe),Oe=p(Fe,2),q=d(Oe),Z=p(Oe,2),ce=p(A,2);wc(ce,{get nodeId(){return f(s).id}}),F((pe,fe,we,Ce)=>{P(N,f(s).id),P(T,`${f(s).profile??""} · party `),he(E,"title",f(s).partyId),P(g,pe),wt(C,1,`badge ${f(s).status==="running"?"ok":"err"}`,"svelte-1eq4g96"),P(M,f(s).status),P(Q,f(s).workdir||"—"),P(ie,fe),P(re,`health ${f(s).ports.health??""} · metrics ${f(s).ports.metrics??""} · p2p ${f(s).ports.p2p??""}`),P(X,we),P(Ze,Ce),Fe.disabled=f(a)!==null||f(s).status==="running",P(Et,f(a)==="start"?"Starting…":"Start"),Oe.disabled=f(a)!==null||f(s).status==="running",P(q,f(a)==="restart"?"Restarting…":"Restart"),Z.disabled=f(a)!==null||f(s).status!=="running"},[()=>Tr(f(s).partyId),()=>je(f(s).spawnedAt),()=>f(l)?f(l).cpu.toFixed(1)+"%":"—",()=>Yo(f(l)?.rssBytes)]),se("click",Fe,()=>o("start")),se("click",Oe,()=>o("restart")),se("click",Z,()=>B(n,!0)),L(m,I)};J(_,m=>{f(s)?m(S,-1):m(k)})}var w=p(u,2);{let m=ne(()=>`Stop node ${t.id}? In-flight requests will be terminated.`);Ar(w,{get open(){return f(n)},title:"Stop node",get message(){return f(m)},confirmLabel:"Stop",danger:!0,onConfirm:async()=>{B(n,!1),await o("stop")},onCancel:()=>B(n,!1)})}F(m=>he(v,"href",m),[()=>Tt("nodes")]),L(e,c),xe()}ot(["click"]);var Tc=D('<a target="_blank" rel="noreferrer">Release notes</a>'),Ac=D('<div class="banner info svelte-1cl3wo6"><div><strong>Update available</strong> <span class="muted"> </span> <!></div> <button type="button" class="primary"> </button></div>'),Ic=D('<p class="muted small svelte-1cl3wo6"> </p>'),xc=D('<p class="error small svelte-1cl3wo6"> </p>'),Mc=D('<dl class="kv svelte-1cl3wo6"><div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Install ID</dt><dd class="svelte-1cl3wo6"><code> </code></dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Installed at</dt><dd class="svelte-1cl3wo6"> </dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Installer version</dt><dd class="svelte-1cl3wo6"> </dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">UI port</dt><dd class="svelte-1cl3wo6"> </dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">libp2p port</dt><dd class="svelte-1cl3wo6"> </dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Data dir</dt> <dd class="copy-row svelte-1cl3wo6"><code> </code> <button type="button" class="ghost" aria-label="Copy data dir"><!></button></dd></div> <div class="svelte-1cl3wo6"><dt class="svelte-1cl3wo6">Identity</dt> <dd class="copy-row svelte-1cl3wo6"><code> </code> <button type="button" class="ghost" aria-label="Copy identity path"><!></button></dd></div></dl> <p class="muted small svelte-1cl3wo6">UI port, libp2p port, and data dir are set at install time and can only be changed by editing <code>host.config.json</code> and restarting the service.</p>',1),Rc=D('<p class="muted">Loading…</p>'),Nc=D(`<section class="stack"><header><h2>Settings</h2> <p class="muted">Update preferences and install metadata.</p></header> <form class="card stack"><h3>Updates</h3> <label class="row inline svelte-1cl3wo6"><input type="checkbox" class="svelte-1cl3wo6"/> <span>Apply updates automatically when available</span></label> <div><label for="manifest-url">Manifest URL (optional override)</label> <input id="manifest-url" type="url" placeholder="https://example.org/latest.json" autocomplete="off"/></div> <!> <!> <div class="actions svelte-1cl3wo6"><button type="submit" class="primary"> </button></div></form> <div class="card"><h3>Install</h3> <!></div> <div class="card"><h3>Uninstall</h3> <p class="muted">Stop the cadre-host service, then remove the data directory above and the
13
+ installed package:</p> <pre>npm uninstall -g @serfab/cadre-host</pre> <p class="muted small svelte-1cl3wo6">See the README under <a href="https://github.com/gotchoices/sereus/blob/master/packages/cadre-host/README.md" target="_blank" rel="noreferrer">Uninstall</a> for OS-specific service teardown.</p></div></section>`);function Pc(e,t){Ie(t,!0);const r=ct();let n=j(!1),a=j(""),i=j(!1),s=j(!1);lt(()=>{En(),Cr()}),yt(()=>{const g=r.settings;g&&(B(n,g.updates.autoApply,!0),B(a,g.updates.manifestUrl??"",!0))});async function l(g){g.preventDefault(),B(i,!0);try{const C={updates:{autoApply:f(n)}};f(a).trim()&&(C.updates.manifestUrl=f(a).trim()),await yn("/api/settings",C),ee("success","Update preferences saved"),await En()}catch(C){const M=C instanceof Te?C.code:"error";ee("error",`Save failed: ${C.message} (${M})`)}finally{B(i,!1)}}async function o(){B(s,!0);try{const g=await Rr("/update/apply");ee("success",`Applied ${g.fromVersion} → ${g.toVersion}`+(g.restarted?" (service restarting)":"")),await Cr()}catch(g){const C=g instanceof Te?g.code:"error";ee("error",`Apply failed: ${g.message} (${C})`)}finally{B(s,!1)}}async function c(g){try{await navigator.clipboard.writeText(g),ee("success","Copied")}catch(C){ee("error",`Copy failed: ${C.message}`)}}var u=Nc(),h=p(d(u),2),v=p(d(h),2),_=d(v),k=p(v,2),S=p(d(k),2),w=p(k,2);{var m=g=>{var C=Ac(),M=d(C),O=p(d(M),2),H=d(O),V=p(O,2);{var K=ae=>{var ie=Tc();F(()=>he(ie,"href",r.update.available.releaseNotesUrl)),L(ae,ie)};J(V,ae=>{r.update.available.releaseNotesUrl&&ae(K)})}var Q=p(M,2),te=d(Q);F(()=>{P(H,`→ version ${r.update.available.version??""}`),Q.disabled=f(s),P(te,f(s)?"Applying…":"Apply now")}),se("click",Q,o),L(g,C)},I=g=>{var C=Ic(),M=d(C);F(O=>P(M,`No update available. Last checked ${O??""}.`),[()=>je(r.update.lastChecked)]),L(g,C)};J(w,g=>{r.update?.available?.version?g(m):r.update?.lastChecked&&g(I,1)})}var A=p(w,2);{var R=g=>{var C=xc(),M=d(C);F(()=>P(M,`Last error: ${r.update.lastError.message??""} (${r.update.lastError.code??""})`)),L(g,C)};J(A,g=>{r.update?.lastError&&g(R)})}var U=p(A,2),y=d(U),x=d(y),N=p(h,2),b=p(d(N),2);{var T=g=>{var C=Mc(),M=be(C),O=d(M),H=p(d(O)),V=d(H),K=d(V),Q=p(O,2),te=p(d(Q)),ae=d(te),ie=p(Q,2),$=p(d(ie)),ue=d($),re=p(ie,2),ge=p(d(re)),oe=d(ge),X=p(re,2),le=p(d(X)),Ne=d(le),Ze=p(X,2),ut=p(d(Ze),2),Fe=d(ut),Et=d(Fe),Oe=p(Fe,2),q=d(Oe);An(q,{});var Z=p(Ze,2),ce=p(d(Z),2),pe=d(ce),fe=d(pe),we=p(pe,2),Ce=d(we);An(Ce,{}),F(et=>{P(K,r.settings.installId),P(ae,et),P(ue,r.settings.installerVersion??"—"),P(oe,r.settings.uiPort),P(Ne,r.settings.libp2pPort),P(Et,r.settings.dataDir),P(fe,r.settings.identityPath)},[()=>je(r.settings.installedAt)]),se("click",Oe,()=>c(r.settings.dataDir)),se("click",we,()=>c(r.settings.identityPath)),L(g,C)},E=g=>{var C=Rc();L(g,C)};J(b,g=>{r.settings?g(T):g(E,-1)})}F(()=>{y.disabled=f(i),P(x,f(i)?"Saving…":"Save update preferences")}),kr("submit",h,l),mn(_,()=>f(n),g=>B(n,g)),cr(S,()=>f(a),g=>B(a,g)),L(e,u),xe()}ot(["click"]);function Da(e){return e==="c"}function Lc(e){const t=e.strandId;return e.published?e.removed&&e.alone?{kind:"banner",strandId:t}:{kind:"toast",tone:"success",text:`Left ${t}`}:{kind:"toast",tone:"info",text:`${t} was already removed`}}var Bc=D(`<div class="card warning svelte-ngb3vw" role="status"><p>You left <code class="svelte-ngb3vw"> </code> while this machine had no connection to your
14
+ other cadre nodes. The removal is recorded here, but your other nodes may keep
15
+ running it until they reconnect and sync.</p> <div class="actions svelte-ngb3vw"><button>Dismiss</button></div></div>`),Dc=D('<p class="error svelte-ngb3vw"> </p>'),qc=D('<p class="muted">Loading…</p>'),Uc=D('<p class="muted">This party doesn’t take part in any shared networks yet.</p>'),Fc=D('<li class="svelte-ngb3vw"><div class="strand-main svelte-ngb3vw"><code class="strand-id svelte-ngb3vw"> </code> <div class="row meta svelte-ngb3vw"><span> </span> <span class="muted small svelte-ngb3vw"> </span></div></div> <button class="danger">Leave</button></li>'),Oc=D('<ul class="list svelte-ngb3vw"></ul>'),$c=D(`<section class="stack"><header><h2>Strands</h2> <p class="muted">Shared networks this party takes part in. Leaving one takes your whole party out of
16
+ it. The other parties in that network are unaffected and keep running it.</p></header> <!> <div class="card"><!> <!></div></section> <!>`,1);function zc(e,t){Ie(t,!0);function r(b){return`Every cadre node in your party will stop taking part in ${b}. The other parties in that network are unaffected — this only removes yours. You can re-join later by publishing the strand again.`}function n(b){return`This is irreversible. ${b} is a closed network, and your party’s membership key for it is stored only in the row you are about to delete. Once it is gone your party can never admit another member to that network, and re-publishing the strand would create a different key that its existing members will not accept. Every cadre node in your party will stop taking part in it. The other parties in that network are unaffected.`}const a="This machine currently has no connection to your other cadre nodes. If you leave now, they may keep running this network until they sync.",i=ct();let s=j(null),l=j(null);const o=ne(()=>Da(f(s)?.type??"o")),c=ne(()=>i.strands.loaded?i.strands.list.length===0?"empty":"list":i.strands.error?"none":"loading");lt(()=>{wn()});function u(b){return b.running?b.status?`running · ${b.status}`:"running":"not running"}async function h(){const b=f(s);if(!b)return;const T=Da(b.type)?"?confirm=1":"";try{const E=await bn(`/api/strands/${encodeURIComponent(b.id)}${T}`);v(Lc(E)),await wn()}catch(E){const g=E instanceof Error?E.message:String(E);if(E instanceof Te&&E.status===428)ee("error",g);else{const C=E instanceof Te?E.code:"error";ee("error",`Leave failed: ${g} (${C})`)}}finally{B(s,null)}}function v(b){b.kind==="banner"?B(l,b.strandId,!0):ee(b.tone,b.text)}var _=$c(),k=be(_),S=p(d(k),2);{var w=b=>{var T=Bc(),E=d(T),g=p(d(E)),C=d(g),M=p(E,2),O=d(M);F(()=>P(C,f(l))),se("click",O,()=>B(l,null)),L(b,T)};J(S,b=>{f(l)&&b(w)})}var m=p(S,2),I=d(m);{var A=b=>{var T=Dc(),E=d(T);F(()=>P(E,`Couldn’t load strands: ${i.strands.error??""}`)),L(b,T)};J(I,b=>{i.strands.error&&b(A)})}var R=p(I,2);{var U=b=>{var T=qc();L(b,T)},y=b=>{var T=Uc();L(b,T)},x=b=>{var T=Oc();st(T,21,()=>i.strands.list,E=>E.id,(E,g)=>{var C=Fc(),M=d(C),O=d(M),H=d(O),V=p(O,2),K=d(V),Q=d(K),te=p(K,2),ae=d(te),ie=p(M,2);F($=>{P(H,f(g).id),wt(K,1,`badge ${f(g).type==="c"?"warn":"info"}`),P(Q,f(g).type==="c"?"Closed":"Open"),P(ae,$),he(ie,"aria-label",`Leave ${f(g).id}`)},[()=>u(f(g))]),se("click",ie,()=>B(s,f(g),!0)),L(E,C)}),L(b,T)};J(R,b=>{f(c)==="loading"?b(U):f(c)==="empty"?b(y,1):f(c)==="list"&&b(x,2)})}var N=p(k,2);{let b=ne(()=>f(s)!==null),T=ne(()=>f(o)?"Leave this closed network?":"Leave this shared network?"),E=ne(()=>f(o)?n(f(s)?.id??""):r(f(s)?.id??"")),g=ne(()=>i.strands.loaded&&i.strands.controlConnections===0?a:void 0),C=ne(()=>f(o)?f(s)?.id??"":void 0);Ar(N,{get open(){return f(b)},get title(){return f(T)},get message(){return f(E)},get note(){return f(g)},get requireText(){return f(C)},confirmLabel:"Leave",danger:!0,onConfirm:h,onCancel:()=>B(s,null)})}L(e,_),xe()}ot(["click"]);var jc=D('<div role="status"><span class="text svelte-g7yjw8"> </span> <button class="ghost svelte-g7yjw8" aria-label="Dismiss">×</button></div>'),Vc=D('<div class="toast-stack svelte-g7yjw8" aria-live="polite" aria-relevant="additions"></div>');function Hc(e,t){Ie(t,!1);const r=ct();zn();var n=pr(),a=be(n);{var i=s=>{var l=Vc();st(l,5,()=>r.toasts,o=>o.id,(o,c)=>{var u=jc(),h=d(u),v=d(h),_=p(h,2);F(()=>{wt(u,1,`toast toast-${f(c).kind??""}`,"svelte-g7yjw8"),P(v,f(c).text)}),se("click",_,()=>Ri(f(c).id)),L(o,u)}),L(s,l)};J(a,s=>{r.toasts.length>0&&s(i)})}L(e,n),xe()}ot(["click"]);var Kc=D("<a> </a>"),Yc=D('<a class="visually-hidden" href="#main">Skip to content</a> <header class="topbar svelte-1r8vfx3"><div class="brand svelte-1r8vfx3"><span class="logo svelte-1r8vfx3" aria-hidden="true">●</span> <span>cadre-host</span> <!></div> <nav aria-label="Primary" class="svelte-1r8vfx3"></nav></header> <main id="main" class="svelte-1r8vfx3"><!></main> <!>',1);function Jc(e,t){Ie(t,!1);const r=$o(),n=ct();function a(y){switch(y){case"ok":return"OK";case"warn":return"Attention";case"error":return"Error";default:return"…"}}const i=[{name:"home",label:"Home"},{name:"trust-circle",label:"Trust Circle"},{name:"connectivity",label:"Connectivity"},{name:"nodes",label:"Nodes"},{name:"settings",label:"Settings"},{name:"strands",label:"Strands"}];function s(y){return y==="nodes"?r.route.name==="nodes"||r.route.name==="node-detail":r.route.name===y}lt(()=>{zo(),Ni(),Pi(),zt(),$t(),Cr(),En();let y=!0;const x=Ko(N=>Oo(N),{onError(N,b){y&&(y=!1,ee("error",`Lost realtime updates; retrying in ${Math.round(b/1e3)}s`))},onOpen(){y=!0}});return()=>{x.close(),jo()}}),zn();var l=Yc(),o=p(be(l),2),c=d(o),u=p(d(c),4);{let y=Er(()=>a(n.status));qi(u,{get status(){return n.status},get label(){return f(y)},size:10})}var h=p(c,2);st(h,5,()=>i,y=>y.name,(y,x)=>{var N=Kc();let b;var T=d(N);F((E,g,C)=>{he(N,"href",E),he(N,"aria-current",g),b=wt(N,1,"svelte-1r8vfx3",null,b,C),P(T,f(x).label)},[()=>Tt(f(x).name),()=>s(f(x).name)?"page":void 0,()=>({active:s(f(x).name)})]),L(y,N)});var v=p(o,2),_=d(v);{var k=y=>{Xl(y,{})},S=y=>{cc(y,{})},w=y=>{hc(y,{})},m=y=>{{let x=Er(()=>r.route.params.id??"");Sc(y,{get id(){return f(x)}})}},I=y=>{Pc(y,{})},A=y=>{zc(y,{})},R=y=>{nl(y,{})};J(_,y=>{r.route.name==="trust-circle"?y(k):r.route.name==="connectivity"?y(S,1):r.route.name==="nodes"?y(w,2):r.route.name==="node-detail"?y(m,3):r.route.name==="settings"?y(I,4):r.route.name==="strands"?y(A,5):y(R,-1)})}var U=p(v,2);Hc(U,{}),L(e,l),xe()}const ji=document.getElementById("app");if(!ji)throw new Error("Missing #app mount target");mo(Jc,{target:ji});
17
+ //# sourceMappingURL=index-C-iks41M.js.map