@pixerate/editor 0.24.0 → 0.26.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 (162) hide show
  1. package/README.md +101 -1
  2. package/THIRD_PARTY_NOTICES.md +40 -0
  3. package/dist/agent/index.cjs +175 -11
  4. package/dist/agent/index.cjs.map +1 -1
  5. package/dist/agent/index.d.cts +18 -4
  6. package/dist/agent/index.d.ts +18 -4
  7. package/dist/agent/index.js +168 -4
  8. package/dist/agent/index.js.map +1 -1
  9. package/dist/{arrangeShortcuts-B8O3f8-P.d.cts → arrange-BICutYPk.d.cts} +243 -29
  10. package/dist/{arrangeShortcuts-sLlD2rSX.d.ts → arrange-BICutYPk.d.ts} +243 -29
  11. package/dist/builtins-CdPcLwwF.d.cts +176 -0
  12. package/dist/builtins-Chj6zv_O.d.ts +176 -0
  13. package/dist/canvas/index.cjs +8588 -1857
  14. package/dist/canvas/index.cjs.map +1 -1
  15. package/dist/canvas/index.d.cts +1847 -9
  16. package/dist/canvas/index.d.ts +1847 -9
  17. package/dist/canvas/index.js +8577 -1846
  18. package/dist/canvas/index.js.map +1 -1
  19. package/dist/chunk-3CC7OPUQ.cjs +831 -0
  20. package/dist/chunk-3CC7OPUQ.cjs.map +1 -0
  21. package/dist/chunk-4BVP64JJ.cjs +1406 -0
  22. package/dist/chunk-4BVP64JJ.cjs.map +1 -0
  23. package/dist/chunk-BVP3TSLH.cjs +69 -0
  24. package/dist/chunk-BVP3TSLH.cjs.map +1 -0
  25. package/dist/{chunk-OLZJXL4R.cjs → chunk-CS6NZWWA.cjs} +59 -25
  26. package/dist/chunk-CS6NZWWA.cjs.map +1 -0
  27. package/dist/{chunk-MCSJFWAO.cjs → chunk-EWCOFSCQ.cjs} +685 -100
  28. package/dist/chunk-EWCOFSCQ.cjs.map +1 -0
  29. package/dist/chunk-HDYMLS3X.cjs +409 -0
  30. package/dist/chunk-HDYMLS3X.cjs.map +1 -0
  31. package/dist/chunk-HRMEDT2L.js +1406 -0
  32. package/dist/chunk-HRMEDT2L.js.map +1 -0
  33. package/dist/{chunk-D27YFC46.cjs → chunk-IFHKKVXH.cjs} +382 -63
  34. package/dist/chunk-IFHKKVXH.cjs.map +1 -0
  35. package/dist/{chunk-PGNZKFQS.js → chunk-JOIREKL7.js} +137 -58
  36. package/dist/chunk-JOIREKL7.js.map +1 -0
  37. package/dist/chunk-KRGXUQ2Y.js +1696 -0
  38. package/dist/chunk-KRGXUQ2Y.js.map +1 -0
  39. package/dist/{chunk-3LV6RRPH.js → chunk-MHEPLBFB.js} +2 -2
  40. package/dist/chunk-MR2764X2.js +831 -0
  41. package/dist/chunk-MR2764X2.js.map +1 -0
  42. package/dist/{chunk-XNORY7M6.cjs → chunk-NFVBT3UZ.cjs} +166 -87
  43. package/dist/chunk-NFVBT3UZ.cjs.map +1 -0
  44. package/dist/chunk-NQF32I6Z.cjs +6478 -0
  45. package/dist/chunk-NQF32I6Z.cjs.map +1 -0
  46. package/dist/chunk-O5RYH2PG.js +69 -0
  47. package/dist/chunk-O5RYH2PG.js.map +1 -0
  48. package/dist/{chunk-ITBSKI26.js → chunk-Q2OHWD2A.js} +1064 -360
  49. package/dist/chunk-Q2OHWD2A.js.map +1 -0
  50. package/dist/{chunk-FODNLX5N.js → chunk-QJSOZFCZ.js} +38 -4
  51. package/dist/chunk-QJSOZFCZ.js.map +1 -0
  52. package/dist/{chunk-SML64VJG.cjs → chunk-RRREAOVM.cjs} +4 -4
  53. package/dist/{chunk-SML64VJG.cjs.map → chunk-RRREAOVM.cjs.map} +1 -1
  54. package/dist/{chunk-5S3Z4PPF.js → chunk-SWE3NPOU.js} +347 -28
  55. package/dist/chunk-SWE3NPOU.js.map +1 -0
  56. package/dist/chunk-TXXNBDQX.cjs +1696 -0
  57. package/dist/chunk-TXXNBDQX.cjs.map +1 -0
  58. package/dist/chunk-UBCFIABU.js +409 -0
  59. package/dist/chunk-UBCFIABU.js.map +1 -0
  60. package/dist/chunk-X7HXL2SB.js +6478 -0
  61. package/dist/chunk-X7HXL2SB.js.map +1 -0
  62. package/dist/{chunk-SBCZ6RN5.cjs → chunk-YOMYSFJU.cjs} +1163 -459
  63. package/dist/chunk-YOMYSFJU.cjs.map +1 -0
  64. package/dist/{chunk-3CN2WD3X.js → chunk-ZRNHGAQT.js} +661 -76
  65. package/dist/chunk-ZRNHGAQT.js.map +1 -0
  66. package/dist/commands/index.cjs +425 -4
  67. package/dist/commands/index.cjs.map +1 -1
  68. package/dist/commands/index.d.cts +39 -77
  69. package/dist/commands/index.d.ts +39 -77
  70. package/dist/commands/index.js +424 -3
  71. package/dist/commands/index.js.map +1 -1
  72. package/dist/compare/index.cjs +3 -3
  73. package/dist/compare/index.d.cts +1 -1
  74. package/dist/compare/index.d.ts +1 -1
  75. package/dist/compare/index.js +2 -2
  76. package/dist/controller-CxXGOEmy.d.cts +2038 -0
  77. package/dist/controller-CxXGOEmy.d.ts +2038 -0
  78. package/dist/{documents-BQjzJNe2.d.ts → documents-CHT1U5Vs.d.ts} +10 -0
  79. package/dist/{documents-KRTPhvst.d.cts → documents-Gp7wb0Me.d.cts} +10 -0
  80. package/dist/export/index.cjs +36 -0
  81. package/dist/export/index.cjs.map +1 -0
  82. package/dist/export/index.d.cts +243 -0
  83. package/dist/export/index.d.ts +243 -0
  84. package/dist/export/index.js +36 -0
  85. package/dist/export/index.js.map +1 -0
  86. package/dist/extensions/index.cjs +101 -6
  87. package/dist/extensions/index.cjs.map +1 -1
  88. package/dist/extensions/index.d.cts +18 -5
  89. package/dist/extensions/index.d.ts +18 -5
  90. package/dist/extensions/index.js +101 -6
  91. package/dist/generation/index.cjs +1013 -69
  92. package/dist/generation/index.cjs.map +1 -1
  93. package/dist/generation/index.d.cts +474 -13
  94. package/dist/generation/index.d.ts +474 -13
  95. package/dist/generation/index.js +976 -32
  96. package/dist/generation/index.js.map +1 -1
  97. package/dist/image-editor/index.cjs +3385 -1275
  98. package/dist/image-editor/index.cjs.map +1 -1
  99. package/dist/image-editor/index.d.cts +693 -128
  100. package/dist/image-editor/index.d.ts +693 -128
  101. package/dist/image-editor/index.js +3325 -1215
  102. package/dist/image-editor/index.js.map +1 -1
  103. package/dist/{index-fJrlkJCd.d.ts → index-B273Zllk.d.ts} +500 -7
  104. package/dist/{index-BhJBSm2d.d.cts → index-jcJwmBYt.d.cts} +500 -7
  105. package/dist/index.cjs +1603 -45
  106. package/dist/index.cjs.map +1 -1
  107. package/dist/index.d.cts +154 -27
  108. package/dist/index.d.ts +154 -27
  109. package/dist/index.js +1584 -26
  110. package/dist/index.js.map +1 -1
  111. package/dist/mention-text-CDnCFd3c.d.cts +53 -0
  112. package/dist/mention-text-CDnCFd3c.d.ts +53 -0
  113. package/dist/model-C1zApQM8.d.cts +219 -0
  114. package/dist/model-C1zApQM8.d.ts +219 -0
  115. package/dist/persistence/index.d.cts +3 -120
  116. package/dist/persistence/index.d.ts +3 -120
  117. package/dist/registry-CED5C0lA.d.cts +204 -0
  118. package/dist/registry-CED5C0lA.d.ts +204 -0
  119. package/dist/{registry-GJI4gToU.d.cts → registry-CEgwXED1.d.cts} +12 -1
  120. package/dist/{registry-GJI4gToU.d.ts → registry-CEgwXED1.d.ts} +12 -1
  121. package/dist/{registry-D32LpIc4.d.cts → registry-D0GADKc7.d.cts} +1 -1
  122. package/dist/{registry-evKTP4ls.d.ts → registry-DhVUZioj.d.ts} +1 -1
  123. package/dist/serializers/index.cjs +12 -4
  124. package/dist/serializers/index.cjs.map +1 -1
  125. package/dist/serializers/index.d.cts +41 -13
  126. package/dist/serializers/index.d.ts +41 -13
  127. package/dist/serializers/index.js +12 -4
  128. package/dist/spreadsheet/index.cjs +157 -3
  129. package/dist/spreadsheet/index.cjs.map +1 -1
  130. package/dist/spreadsheet/index.d.cts +534 -11
  131. package/dist/spreadsheet/index.d.ts +534 -11
  132. package/dist/spreadsheet/index.js +157 -3
  133. package/dist/storage-BpFfspHm.d.cts +120 -0
  134. package/dist/storage-BpFfspHm.d.ts +120 -0
  135. package/dist/tokens/index.cjs +115 -0
  136. package/dist/tokens/index.cjs.map +1 -0
  137. package/dist/tokens/index.d.cts +212 -0
  138. package/dist/tokens/index.d.ts +212 -0
  139. package/dist/tokens/index.js +115 -0
  140. package/dist/tokens/index.js.map +1 -0
  141. package/dist/{track-changes-BK5sVf4_.d.cts → track-changes-D_VAPELi.d.cts} +95 -11
  142. package/dist/{track-changes-CDjCrwKe.d.ts → track-changes-Db_fGEvx.d.ts} +95 -11
  143. package/package.json +15 -1
  144. package/dist/chunk-3CN2WD3X.js.map +0 -1
  145. package/dist/chunk-5S3Z4PPF.js.map +0 -1
  146. package/dist/chunk-D27YFC46.cjs.map +0 -1
  147. package/dist/chunk-FODNLX5N.js.map +0 -1
  148. package/dist/chunk-ITBSKI26.js.map +0 -1
  149. package/dist/chunk-MA2F5KHF.cjs +0 -3223
  150. package/dist/chunk-MA2F5KHF.cjs.map +0 -1
  151. package/dist/chunk-MCSJFWAO.cjs.map +0 -1
  152. package/dist/chunk-OLZJXL4R.cjs.map +0 -1
  153. package/dist/chunk-PGNZKFQS.js.map +0 -1
  154. package/dist/chunk-SBCZ6RN5.cjs.map +0 -1
  155. package/dist/chunk-U5KWZU4X.js +0 -3223
  156. package/dist/chunk-U5KWZU4X.js.map +0 -1
  157. package/dist/chunk-XNORY7M6.cjs.map +0 -1
  158. package/dist/controller-BhLLAoi8.d.cts +0 -1000
  159. package/dist/controller-BhLLAoi8.d.ts +0 -1000
  160. package/dist/types-DX4Mh4SL.d.cts +0 -217
  161. package/dist/types-DX4Mh4SL.d.ts +0 -217
  162. /package/dist/{chunk-3LV6RRPH.js.map → chunk-MHEPLBFB.js.map} +0 -0
@@ -0,0 +1,69 @@
1
+ // src/serializers/mention-text.ts
2
+ var MENTION_REGEX = /(?:^|[\s>(*_"';\\/[\]{}~`:]|"|>|<|&)@(?:"([^"]+)"|"([^&]+)"|([a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*))/g;
3
+ var NODE_ROLE_MARK = "";
4
+ var ROLE_SUFFIX_REGEX = /[:\u0001]([A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?)(?![A-Za-z0-9])/y;
5
+ var PLAIN_HANDLE_REGEX = /^[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)*$/;
6
+ function readRoleSuffix(text, index, roles) {
7
+ const first = text.charAt(index);
8
+ if (first !== ":" && first !== NODE_ROLE_MARK) return null;
9
+ if (first === ":" && !roles) return null;
10
+ ROLE_SUFFIX_REGEX.lastIndex = index;
11
+ const match = ROLE_SUFFIX_REGEX.exec(text);
12
+ if (!match) return null;
13
+ let role = match[1];
14
+ if (first === ":" && roles !== true) {
15
+ const lower = role.toLowerCase();
16
+ const listed = roles.find((r) => r.toLowerCase() === lower);
17
+ if (listed === void 0) return null;
18
+ role = listed;
19
+ }
20
+ return { role, end: index + match[0].length };
21
+ }
22
+ function formatMentionHandle(label) {
23
+ return PLAIN_HANDLE_REGEX.test(label) || label.includes('"') ? `@${label}` : `@"${label}"`;
24
+ }
25
+ function formatMentionText(handle, role) {
26
+ return role ? `${formatMentionHandle(handle)}:${role}` : formatMentionHandle(handle);
27
+ }
28
+ function findTextMentions(text, options = {}) {
29
+ if (!text || typeof text !== "string") return [];
30
+ const roles = options.roles === false ? void 0 : options.roles ?? true;
31
+ const result = [];
32
+ const regex = new RegExp(MENTION_REGEX.source, "g");
33
+ let match;
34
+ while ((match = regex.exec(text)) !== null) {
35
+ const handle = match[1] ?? match[2] ?? match[3] ?? "";
36
+ const start = match.index + match[0].indexOf("@");
37
+ const handleEnd = regex.lastIndex;
38
+ const suffix = text.charAt(handleEnd) === ":" ? readRoleSuffix(text, handleEnd, roles) : null;
39
+ if (suffix) regex.lastIndex = suffix.end;
40
+ result.push({
41
+ handle,
42
+ ...suffix ? { role: suffix.role } : {},
43
+ start,
44
+ end: suffix ? suffix.end : handleEnd,
45
+ handleEnd
46
+ });
47
+ }
48
+ return result;
49
+ }
50
+ function setMentionRoleInText(text, start, role, options = {}) {
51
+ const mention = findTextMentions(text, { roles: options.roles ?? true }).find((m) => m.start === start);
52
+ if (!mention) return text;
53
+ if (role !== null && !/^[A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$/.test(role)) {
54
+ throw new Error(`Invalid mention role "${role}".`);
55
+ }
56
+ const suffix = role ? `:${role}` : "";
57
+ return text.slice(0, mention.handleEnd) + suffix + text.slice(mention.end);
58
+ }
59
+
60
+ export {
61
+ MENTION_REGEX,
62
+ NODE_ROLE_MARK,
63
+ readRoleSuffix,
64
+ formatMentionHandle,
65
+ formatMentionText,
66
+ findTextMentions,
67
+ setMentionRoleInText
68
+ };
69
+ //# sourceMappingURL=chunk-O5RYH2PG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/serializers/mention-text.ts"],"sourcesContent":["/**\n * Dependency-free mention text helpers: the `@handle` pattern, the opt-in\n * `@handle:role` suffix used by asset mentions, and offset-based editing of\n * mentions in plain prompt text. Kept apart from `mentions.ts` (which pulls in\n * the HTML serializers) so `@pixerate/editor/generation` can re-export them.\n */\n\n/**\n * Canonical regex pattern for matching @mentions in plain text or markdown.\n * Supports:\n * - Standard unquoted handles: @username, @user.name, @team_alpha, @sa-1\n * - Quoted handles: @\"John Doe\", "Jane Doe"\n * Unquoted handles exclude trailing punctuation (e.g. @violet. matches \"violet\" without the dot).\n */\nexport const MENTION_REGEX =\n /(?:^|[\\s>(*_\"';\\\\/[\\]{}~`:]|"|>|<|&)@(?:\"([^\"]+)\"|"([^&]+)"|([a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*))/g;\n\n/**\n * Which `@handle:role` suffixes are read as a mention role: `true` for any\n * role name, or a list of accepted roles (matched case-insensitively and\n * returned as listed). Off by default, so `@john:` text is unchanged.\n */\nexport type MentionRoleSyntax = true | readonly string[];\n\n/** Marks a role taken from a mention node's `data-role` while extracting (never in output). */\nexport const NODE_ROLE_MARK = \"\\u0001\";\nconst ROLE_SUFFIX_REGEX = /[:\\u0001]([A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?)(?![A-Za-z0-9])/y;\nconst PLAIN_HANDLE_REGEX = /^[a-zA-Z0-9_-]+(?:\\.[a-zA-Z0-9_-]+)*$/;\n\n/**\n * Reads a `:role` suffix at `index`. Returns the role (as listed in `roles`)\n * and the index after it, or `null`. A suffix taken from a mention node\n * (`NODE_ROLE_MARK`) is accepted whatever `roles` says.\n */\nexport function readRoleSuffix(\n text: string,\n index: number,\n roles: MentionRoleSyntax | undefined,\n): { role: string; end: number } | null {\n const first = text.charAt(index);\n if (first !== \":\" && first !== NODE_ROLE_MARK) return null;\n if (first === \":\" && !roles) return null;\n ROLE_SUFFIX_REGEX.lastIndex = index;\n const match = ROLE_SUFFIX_REGEX.exec(text);\n if (!match) return null;\n let role = match[1];\n if (first === \":\" && roles !== true) {\n const lower = role.toLowerCase();\n const listed = (roles as readonly string[]).find((r) => r.toLowerCase() === lower);\n if (listed === undefined) return null;\n role = listed;\n }\n return { role, end: index + match[0].length };\n}\n\n/** `@label`, quoted when the label is not a plain handle (and has no `\"`). */\nexport function formatMentionHandle(label: string): string {\n return PLAIN_HANDLE_REGEX.test(label) || label.includes('\"') ? `@${label}` : `@\"${label}\"`;\n}\n\n/**\n * Formats a mention as text: `@handle` or `@handle:role` (quoted as\n * `@\"Two words\":role` when the handle is not a plain handle).\n */\nexport function formatMentionText(handle: string, role?: string | null): string {\n return role ? `${formatMentionHandle(handle)}:${role}` : formatMentionHandle(handle);\n}\n\n/** A mention found in plain text, with offsets into that text. */\nexport interface TextMention {\n handle: string;\n role?: string;\n /** Offset of the `@`. */\n start: number;\n /** Offset just past the handle (and role, when present). */\n end: number;\n /** Offset just past the handle (where a `:role` suffix starts). */\n handleEnd: number;\n}\n\n/**\n * Every mention in plain text (prompt text), in order, with offsets and\n * `@handle:role` roles (`roles` defaults to `true` here). Unlike\n * {@link extractMentions} it does not skip code or URLs and keeps duplicates.\n */\nexport function findTextMentions(text: string, options: { roles?: MentionRoleSyntax | false } = {}): TextMention[] {\n if (!text || typeof text !== \"string\") return [];\n const roles = options.roles === false ? undefined : (options.roles ?? true);\n const result: TextMention[] = [];\n const regex = new RegExp(MENTION_REGEX.source, \"g\");\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n const handle = match[1] ?? match[2] ?? match[3] ?? \"\";\n const start = match.index + match[0].indexOf(\"@\");\n const handleEnd = regex.lastIndex;\n const suffix = text.charAt(handleEnd) === \":\" ? readRoleSuffix(text, handleEnd, roles) : null;\n if (suffix) regex.lastIndex = suffix.end;\n result.push({\n handle,\n ...(suffix ? { role: suffix.role } : {}),\n start,\n end: suffix ? suffix.end : handleEnd,\n handleEnd,\n });\n }\n return result;\n}\n\n/**\n * Sets (or with `null` removes) the `:role` of the text mention starting at\n * offset `start` (its `@`). Returns the text unchanged when no mention starts there.\n */\nexport function setMentionRoleInText(\n text: string,\n start: number,\n role: string | null,\n options: { roles?: MentionRoleSyntax } = {},\n): string {\n const mention = findTextMentions(text, { roles: options.roles ?? true }).find((m) => m.start === start);\n if (!mention) return text;\n if (role !== null && !/^[A-Za-z](?:[A-Za-z0-9_-]*[A-Za-z0-9])?$/.test(role)) {\n throw new Error(`Invalid mention role \"${role}\".`);\n }\n const suffix = role ? `:${role}` : \"\";\n return text.slice(0, mention.handleEnd) + suffix + text.slice(mention.end);\n}\n\n"],"mappings":";AAcO,IAAM,gBACX;AAUK,IAAM,iBAAiB;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAOpB,SAAS,eACd,MACA,OACA,OACsC;AACtC,QAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,MAAI,UAAU,OAAO,UAAU,eAAgB,QAAO;AACtD,MAAI,UAAU,OAAO,CAAC,MAAO,QAAO;AACpC,oBAAkB,YAAY;AAC9B,QAAM,QAAQ,kBAAkB,KAAK,IAAI;AACzC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,OAAO,MAAM,CAAC;AAClB,MAAI,UAAU,OAAO,UAAU,MAAM;AACnC,UAAM,QAAQ,KAAK,YAAY;AAC/B,UAAM,SAAU,MAA4B,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,KAAK;AACjF,QAAI,WAAW,OAAW,QAAO;AACjC,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,KAAK,QAAQ,MAAM,CAAC,EAAE,OAAO;AAC9C;AAGO,SAAS,oBAAoB,OAAuB;AACzD,SAAO,mBAAmB,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK;AACzF;AAMO,SAAS,kBAAkB,QAAgB,MAA8B;AAC9E,SAAO,OAAO,GAAG,oBAAoB,MAAM,CAAC,IAAI,IAAI,KAAK,oBAAoB,MAAM;AACrF;AAmBO,SAAS,iBAAiB,MAAc,UAAiD,CAAC,GAAkB;AACjH,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO,CAAC;AAC/C,QAAM,QAAQ,QAAQ,UAAU,QAAQ,SAAa,QAAQ,SAAS;AACtE,QAAM,SAAwB,CAAC;AAC/B,QAAM,QAAQ,IAAI,OAAO,cAAc,QAAQ,GAAG;AAClD,MAAI;AACJ,UAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAC1C,UAAM,SAAS,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AACnD,UAAM,QAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,GAAG;AAChD,UAAM,YAAY,MAAM;AACxB,UAAM,SAAS,KAAK,OAAO,SAAS,MAAM,MAAM,eAAe,MAAM,WAAW,KAAK,IAAI;AACzF,QAAI,OAAQ,OAAM,YAAY,OAAO;AACrC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,GAAI,SAAS,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,MACtC;AAAA,MACA,KAAK,SAAS,OAAO,MAAM;AAAA,MAC3B;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAMO,SAAS,qBACd,MACA,OACA,MACA,UAAyC,CAAC,GAClC;AACR,QAAM,UAAU,iBAAiB,MAAM,EAAE,OAAO,QAAQ,SAAS,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AACtG,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,SAAS,QAAQ,CAAC,2CAA2C,KAAK,IAAI,GAAG;AAC3E,UAAM,IAAI,MAAM,yBAAyB,IAAI,IAAI;AAAA,EACnD;AACA,QAAM,SAAS,OAAO,IAAI,IAAI,KAAK;AACnC,SAAO,KAAK,MAAM,GAAG,QAAQ,SAAS,IAAI,SAAS,KAAK,MAAM,QAAQ,GAAG;AAC3E;","names":[]}