@flamingo-stack/openframe-frontend-core 0.0.672 → 0.0.673-2406.7239.1

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 (164) hide show
  1. package/dist/{chunk-YNGAJGYB.cjs → chunk-6LWIJJJ6.cjs} +410 -6
  2. package/dist/{chunk-3PVOF3IB.js.map → chunk-6LWIJJJ6.cjs.map} +1 -1
  3. package/dist/{chunk-XLJNYTUW.cjs → chunk-6YSDCC3J.cjs} +56 -55
  4. package/dist/chunk-6YSDCC3J.cjs.map +1 -0
  5. package/dist/{chunk-GV7R2NTS.cjs → chunk-76DQOFZG.cjs} +23 -23
  6. package/dist/{chunk-GV7R2NTS.cjs.map → chunk-76DQOFZG.cjs.map} +1 -1
  7. package/dist/{chunk-UUOBCUHW.cjs → chunk-7ALCRUZ3.cjs} +3 -3
  8. package/dist/{chunk-UUOBCUHW.cjs.map → chunk-7ALCRUZ3.cjs.map} +1 -1
  9. package/dist/{chunk-PWPYCJ33.js → chunk-7RQZ2FTF.js} +2 -2
  10. package/dist/{chunk-XDTU23P4.js → chunk-ALSCESHG.js} +2 -2
  11. package/dist/{chunk-HVEX4BSC.cjs → chunk-AUQ4UITE.cjs} +60 -45
  12. package/dist/chunk-AUQ4UITE.cjs.map +1 -0
  13. package/dist/{chunk-CBCETEB4.cjs → chunk-E6B34U5Q.cjs} +6 -6
  14. package/dist/{chunk-CBCETEB4.cjs.map → chunk-E6B34U5Q.cjs.map} +1 -1
  15. package/dist/{chunk-H54F476P.cjs → chunk-FK3VSQ35.cjs} +3 -3
  16. package/dist/{chunk-H54F476P.cjs.map → chunk-FK3VSQ35.cjs.map} +1 -1
  17. package/dist/{chunk-HOEVEB7N.cjs → chunk-GCOVKIE7.cjs} +40 -29
  18. package/dist/chunk-GCOVKIE7.cjs.map +1 -0
  19. package/dist/{chunk-42OVTTOM.js → chunk-GIYAUKCY.js} +18 -3
  20. package/dist/{chunk-42OVTTOM.js.map → chunk-GIYAUKCY.js.map} +1 -1
  21. package/dist/{chunk-TQPKNG2E.js → chunk-INVZNRWB.js} +3 -3
  22. package/dist/{chunk-ZRIVCLPR.js → chunk-JD5TKRCU.js} +1 -1
  23. package/dist/chunk-JD5TKRCU.js.map +1 -0
  24. package/dist/{chunk-IBGHJLNT.js → chunk-JF4ZQZZJ.js} +2 -2
  25. package/dist/{chunk-SNWAN52K.cjs → chunk-JJDPSYBV.cjs} +3 -3
  26. package/dist/{chunk-SNWAN52K.cjs.map → chunk-JJDPSYBV.cjs.map} +1 -1
  27. package/dist/{chunk-D55IENZJ.cjs → chunk-LCMT2GZK.cjs} +1 -1
  28. package/dist/chunk-LCMT2GZK.cjs.map +1 -0
  29. package/dist/{chunk-AL4I5HHB.js → chunk-MMDGSGVE.js} +4 -4
  30. package/dist/{chunk-O5PYXQ6H.js → chunk-N3Q4FMMB.js} +3 -3
  31. package/dist/{chunk-RD3I5PBB.cjs → chunk-NUVRMZW5.cjs} +15 -15
  32. package/dist/{chunk-RD3I5PBB.cjs.map → chunk-NUVRMZW5.cjs.map} +1 -1
  33. package/dist/{chunk-T3KXCOB2.js → chunk-OIE6GKS3.js} +2 -2
  34. package/dist/{chunk-TFSGYKWG.js → chunk-OZL6FSB2.js} +28 -17
  35. package/dist/chunk-OZL6FSB2.js.map +1 -0
  36. package/dist/{chunk-NETIHUEY.cjs → chunk-P2A3KAYW.cjs} +10 -10
  37. package/dist/{chunk-NETIHUEY.cjs.map → chunk-P2A3KAYW.cjs.map} +1 -1
  38. package/dist/{chunk-6S2KLT7O.js → chunk-Q4KRZOQR.js} +4 -4
  39. package/dist/{chunk-BODMICIH.cjs → chunk-S7W7MTBM.cjs} +40 -40
  40. package/dist/{chunk-BODMICIH.cjs.map → chunk-S7W7MTBM.cjs.map} +1 -1
  41. package/dist/{chunk-3PVOF3IB.js → chunk-SGK4Q2W2.js} +407 -3
  42. package/dist/chunk-SGK4Q2W2.js.map +1 -0
  43. package/dist/{chunk-VZRVQEMT.cjs → chunk-SYTDEWZJ.cjs} +7 -7
  44. package/dist/{chunk-VZRVQEMT.cjs.map → chunk-SYTDEWZJ.cjs.map} +1 -1
  45. package/dist/{chunk-Z6E45TJM.js → chunk-TDCIGINK.js} +5 -5
  46. package/dist/{chunk-UOQRNZIB.cjs → chunk-TQATQ4CX.cjs} +17 -17
  47. package/dist/{chunk-UOQRNZIB.cjs.map → chunk-TQATQ4CX.cjs.map} +1 -1
  48. package/dist/{chunk-PSL2WBEO.cjs → chunk-TT6O7BUZ.cjs} +33 -33
  49. package/dist/{chunk-PSL2WBEO.cjs.map → chunk-TT6O7BUZ.cjs.map} +1 -1
  50. package/dist/{chunk-JREG4T6K.cjs → chunk-U7BJC4WF.cjs} +3 -3
  51. package/dist/{chunk-JREG4T6K.cjs.map → chunk-U7BJC4WF.cjs.map} +1 -1
  52. package/dist/{chunk-EKABOXNB.js → chunk-UIKMPCHW.js} +2 -2
  53. package/dist/{chunk-7KM34VWL.js → chunk-XMJT3QZ2.js} +3 -3
  54. package/dist/{chunk-4AZWVS7F.js → chunk-XSOL5ISO.js} +7 -6
  55. package/dist/{chunk-4AZWVS7F.js.map → chunk-XSOL5ISO.js.map} +1 -1
  56. package/dist/{chunk-KSBDARII.js → chunk-Y2ASYQ3P.js} +5 -5
  57. package/dist/components/case-studies/index.cjs +17 -14
  58. package/dist/components/case-studies/index.cjs.map +1 -1
  59. package/dist/components/case-studies/index.js +8 -5
  60. package/dist/components/case-studies/index.js.map +1 -1
  61. package/dist/components/case-studies/share-experience-section.d.ts.map +1 -1
  62. package/dist/components/contact/contact-form.d.ts +7 -1
  63. package/dist/components/contact/contact-form.d.ts.map +1 -1
  64. package/dist/components/contact/index.cjs +5 -5
  65. package/dist/components/contact/index.js +4 -4
  66. package/dist/components/docs/index.cjs +8 -8
  67. package/dist/components/docs/index.js +7 -7
  68. package/dist/components/embeds/index.cjs +5 -5
  69. package/dist/components/embeds/index.js +4 -4
  70. package/dist/components/faq/index.cjs +5 -5
  71. package/dist/components/faq/index.js +4 -4
  72. package/dist/components/features/index.cjs +4 -4
  73. package/dist/components/features/index.js +3 -3
  74. package/dist/components/features/waitlist-form.d.ts +7 -2
  75. package/dist/components/features/waitlist-form.d.ts.map +1 -1
  76. package/dist/components/help-center-pages/index.cjs +54 -52
  77. package/dist/components/help-center-pages/index.cjs.map +1 -1
  78. package/dist/components/help-center-pages/index.js +17 -15
  79. package/dist/components/help-center-pages/index.js.map +1 -1
  80. package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
  81. package/dist/components/index.cjs +35 -35
  82. package/dist/components/index.js +14 -14
  83. package/dist/components/meeting-scheduler/booking-form.d.ts +7 -1
  84. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  85. package/dist/components/meeting-scheduler/index.cjs +53 -31
  86. package/dist/components/meeting-scheduler/index.cjs.map +1 -1
  87. package/dist/components/meeting-scheduler/index.d.ts +5 -1
  88. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  89. package/dist/components/meeting-scheduler/index.js +31 -9
  90. package/dist/components/meeting-scheduler/index.js.map +1 -1
  91. package/dist/components/navigation/index.cjs +7 -7
  92. package/dist/components/navigation/index.js +6 -6
  93. package/dist/components/onboarding-guides/index.cjs +7 -7
  94. package/dist/components/onboarding-guides/index.js +6 -6
  95. package/dist/components/tickets/help-center-create-form.d.ts.map +1 -1
  96. package/dist/components/tickets/index.cjs +8 -8
  97. package/dist/components/tickets/index.js +7 -7
  98. package/dist/components/ui/index.cjs +4 -4
  99. package/dist/components/ui/index.js +3 -3
  100. package/dist/contexts/endpoints-runtime-context.d.ts +5 -0
  101. package/dist/contexts/endpoints-runtime-context.d.ts.map +1 -1
  102. package/dist/contexts/index.cjs +2 -2
  103. package/dist/contexts/index.js +1 -1
  104. package/dist/hooks/index.cjs +9 -3
  105. package/dist/hooks/index.cjs.map +1 -1
  106. package/dist/hooks/index.d.ts +2 -0
  107. package/dist/hooks/index.d.ts.map +1 -1
  108. package/dist/hooks/index.js +8 -2
  109. package/dist/hooks/use-form-rescue.d.ts +43 -0
  110. package/dist/hooks/use-form-rescue.d.ts.map +1 -0
  111. package/dist/hooks/use-rescued-form.d.ts +28 -0
  112. package/dist/hooks/use-rescued-form.d.ts.map +1 -0
  113. package/dist/index.cjs +60 -8
  114. package/dist/index.cjs.map +1 -1
  115. package/dist/index.js +59 -7
  116. package/dist/index.js.map +1 -1
  117. package/dist/utils/form-rescue.cjs +142 -0
  118. package/dist/utils/form-rescue.cjs.map +1 -0
  119. package/dist/utils/form-rescue.d.ts +133 -0
  120. package/dist/utils/form-rescue.d.ts.map +1 -0
  121. package/dist/utils/form-rescue.js +118 -0
  122. package/dist/utils/form-rescue.js.map +1 -0
  123. package/dist/utils/index.cjs +138 -0
  124. package/dist/utils/index.cjs.map +1 -1
  125. package/dist/utils/index.d.ts +1 -0
  126. package/dist/utils/index.d.ts.map +1 -1
  127. package/dist/utils/index.js +116 -1
  128. package/dist/utils/index.js.map +1 -1
  129. package/package.json +7 -1
  130. package/src/components/case-studies/share-experience-section.tsx +2 -0
  131. package/src/components/contact/contact-form.tsx +33 -12
  132. package/src/components/features/waitlist-form.tsx +27 -2
  133. package/src/components/help-center-pages/trust-center-sections.tsx +2 -0
  134. package/src/components/meeting-scheduler/booking-form.tsx +30 -2
  135. package/src/components/meeting-scheduler/index.tsx +10 -1
  136. package/src/components/tickets/help-center-create-form.tsx +2 -0
  137. package/src/contexts/endpoints-runtime-context.tsx +5 -0
  138. package/src/hooks/__tests__/use-form-rescue.test.tsx +189 -0
  139. package/src/hooks/__tests__/use-rescued-form.test.tsx +91 -0
  140. package/src/hooks/index.ts +4 -0
  141. package/src/hooks/use-form-rescue.ts +330 -0
  142. package/src/hooks/use-rescued-form.ts +71 -0
  143. package/src/utils/__tests__/form-rescue.test.ts +124 -0
  144. package/src/utils/form-rescue.ts +237 -0
  145. package/src/utils/index.ts +5 -0
  146. package/dist/chunk-D55IENZJ.cjs.map +0 -1
  147. package/dist/chunk-HOEVEB7N.cjs.map +0 -1
  148. package/dist/chunk-HVEX4BSC.cjs.map +0 -1
  149. package/dist/chunk-TFSGYKWG.js.map +0 -1
  150. package/dist/chunk-XLJNYTUW.cjs.map +0 -1
  151. package/dist/chunk-YNGAJGYB.cjs.map +0 -1
  152. package/dist/chunk-ZRIVCLPR.js.map +0 -1
  153. /package/dist/{chunk-PWPYCJ33.js.map → chunk-7RQZ2FTF.js.map} +0 -0
  154. /package/dist/{chunk-XDTU23P4.js.map → chunk-ALSCESHG.js.map} +0 -0
  155. /package/dist/{chunk-TQPKNG2E.js.map → chunk-INVZNRWB.js.map} +0 -0
  156. /package/dist/{chunk-IBGHJLNT.js.map → chunk-JF4ZQZZJ.js.map} +0 -0
  157. /package/dist/{chunk-AL4I5HHB.js.map → chunk-MMDGSGVE.js.map} +0 -0
  158. /package/dist/{chunk-O5PYXQ6H.js.map → chunk-N3Q4FMMB.js.map} +0 -0
  159. /package/dist/{chunk-T3KXCOB2.js.map → chunk-OIE6GKS3.js.map} +0 -0
  160. /package/dist/{chunk-6S2KLT7O.js.map → chunk-Q4KRZOQR.js.map} +0 -0
  161. /package/dist/{chunk-Z6E45TJM.js.map → chunk-TDCIGINK.js.map} +0 -0
  162. /package/dist/{chunk-EKABOXNB.js.map → chunk-UIKMPCHW.js.map} +0 -0
  163. /package/dist/{chunk-7KM34VWL.js.map → chunk-XMJT3QZ2.js.map} +0 -0
  164. /package/dist/{chunk-KSBDARII.js.map → chunk-Y2ASYQ3P.js.map} +0 -0
@@ -5,6 +5,7 @@ import {
5
5
  batchFetchAuthenticatedImages,
6
6
  clearParams,
7
7
  coerceValue,
8
+ completeFormRescue,
8
9
  configureAuthenticatedImage,
9
10
  configureBatchImageFetch,
10
11
  extractVariablesFromQuery,
@@ -32,6 +33,7 @@ import {
32
33
  useDeferredError,
33
34
  useDragAndDropEnabled,
34
35
  useFocusTrap,
36
+ useFormRescue,
35
37
  useHorizontalScrollbar,
36
38
  useHumanitySignals,
37
39
  useKeyboardCollisionPadding,
@@ -44,6 +46,7 @@ import {
44
46
  usePlatformConfig,
45
47
  usePreventScroll,
46
48
  useQueryParams,
49
+ useRescuedForm,
47
50
  useScrollToHash,
48
51
  useSearch,
49
52
  useTablePagination,
@@ -54,8 +57,8 @@ import {
54
57
  validateSchema,
55
58
  validateVariables,
56
59
  variablesToUrlParams
57
- } from "../chunk-3PVOF3IB.js";
58
- import "../chunk-ZRIVCLPR.js";
60
+ } from "../chunk-SGK4Q2W2.js";
61
+ import "../chunk-JD5TKRCU.js";
59
62
  import {
60
63
  createSearchParams,
61
64
  shouldIncludeInUrl
@@ -104,6 +107,7 @@ export {
104
107
  clearAuthedImageCache,
105
108
  clearParams as clearVariablesParams,
106
109
  coerceValue,
110
+ completeFormRescue,
107
111
  configureAuthenticatedImage,
108
112
  configureBatchImageFetch,
109
113
  createSearchParams,
@@ -136,6 +140,7 @@ export {
136
140
  useDeferredError,
137
141
  useDragAndDropEnabled,
138
142
  useFocusTrap,
143
+ useFormRescue,
139
144
  useHeaderHeight,
140
145
  useHorizontalScrollbar,
141
146
  useHumanitySignals,
@@ -158,6 +163,7 @@ export {
158
163
  usePlatformConfig,
159
164
  usePreventScroll,
160
165
  useQueryParams,
166
+ useRescuedForm,
161
167
  useResetOnPageHidden,
162
168
  useScrollToHash,
163
169
  useSearch,
@@ -0,0 +1,43 @@
1
+ import { type FormRescueDefinition } from '../utils/form-rescue';
2
+ export interface UseFormRescueOptions {
3
+ /** Which form this is (`defineRescueForm`); `null` turns rescue off. */
4
+ form: FormRescueDefinition | null;
5
+ /** Every field the visitor can see. Hidden fields are never listed, so never sent. */
6
+ fieldNames: readonly string[];
7
+ /** Called once after mount with values from a resume link, else from this device's local draft. */
8
+ onRestore?: (values: Record<string, string>) => void;
9
+ /** The form's humanity signals, so the draft endpoint can run the same bot gate as the submit. */
10
+ getSignals?: () => Record<string, string | number>;
11
+ }
12
+ export interface FormRescueHandle {
13
+ /** Report the form's current values after a change (`lastField` = the field just edited). */
14
+ track: (values: Record<string, unknown>, lastField?: string | null) => void;
15
+ /** Keys to spread into the SUBMIT body so the host closes this attempt's draft. */
16
+ submitFields: () => Record<string, string>;
17
+ /** Call after a successful submit: clears the local draft and starts a fresh attempt. */
18
+ complete: () => void;
19
+ }
20
+ /**
21
+ * Close a rescue attempt after a successful submit, for a form that has already
22
+ * unmounted by then (the meeting scheduler's details-first flow): clears this
23
+ * device's draft and reports the submit. The hook's `complete` calls it too.
24
+ */
25
+ export declare function completeFormRescue(form: FormRescueDefinition | null, attemptId?: unknown): void;
26
+ /**
27
+ * useFormRescue — saves a public form's progress so a visitor who leaves
28
+ * before submitting can be followed up with, and restores it when they return.
29
+ *
30
+ * Every public lead form calls it the same way (next to `useHumanitySignals`):
31
+ *
32
+ * const rescue = useFormRescue({ form: RESCUE_FORMS.waitlist, fieldNames, onRestore, getSignals })
33
+ * // on change: rescue.track(values, changedField)
34
+ * // submit: body = { ...data, ...getSignals(), ...rescue.submitFields() }
35
+ * // success: rescue.complete()
36
+ *
37
+ * Saves go to the host's `EndpointsRuntime.formDraftsUrl` (debounced, plus one
38
+ * final keepalive save when the tab is hidden). A host that does not provide
39
+ * the url gets the local draft only. Nothing here can block or delay a submit:
40
+ * every network and storage call is fire-and-forget and swallows its errors.
41
+ */
42
+ export declare function useFormRescue({ form, fieldNames, onRestore, getSignals }: UseFormRescueOptions): FormRescueHandle;
43
+ //# sourceMappingURL=use-form-rescue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form-rescue.d.ts","sourceRoot":"","sources":["../../src/hooks/use-form-rescue.ts"],"names":[],"mappings":"AAKA,OAAO,EAgBL,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAa9B,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClC,sFAAsF;IACtF,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,mGAAmG;IACnG,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACrD,kGAAkG;IAClG,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,6FAA6F;IAC7F,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5E,mFAAmF;IACnF,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,yFAAyF;IACzF,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AA0CD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAQ/F;AAgBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,oBAAoB,GAAG,gBAAgB,CA6LjH"}
@@ -0,0 +1,28 @@
1
+ import type { FieldValues, Path, UseFormReturn } from 'react-hook-form';
2
+ import type { FormRescueDefinition } from '../utils/form-rescue';
3
+ import { type FormRescueHandle } from './use-form-rescue';
4
+ export interface UseRescuedFormOptions<T extends FieldValues> {
5
+ /** The form's definition (`defineRescueForm` / `RESCUE_FORMS`); `null` turns rescue off. */
6
+ rescue: FormRescueDefinition | null;
7
+ /** The fields the visitor can see, by the name a draft stores them under. Hidden fields are never listed. */
8
+ fields: readonly string[];
9
+ /** The form's humanity signals, so draft saves pass the same bot gate as the submit. */
10
+ getSignals?: () => Record<string, string | number>;
11
+ /** Where a stored field lives in the form, when it is nested (`company` → `formFields.company`). Default: the same name. */
12
+ fieldPath?: (name: string) => Path<T>;
13
+ }
14
+ /**
15
+ * useRescuedForm — form rescue for ANY react-hook-form form, in one call.
16
+ *
17
+ * Wires what every rescued form needs so no form hand-rolls it: every edit is
18
+ * tracked (`watch`), a resume link or this device's draft fills the empty
19
+ * fields (`setValue`), and the handle's `submitFields()` / `complete()` close
20
+ * the attempt on submit. A form that is not react-hook-form uses
21
+ * `useFormRescue` directly.
22
+ *
23
+ * const rescue = useRescuedForm(form, { rescue: RESCUE_FORMS.contact, fields, getSignals })
24
+ * // submit: body = { ...data, ...getSignals(), ...rescue.submitFields() }
25
+ * // success: rescue.complete()
26
+ */
27
+ export declare function useRescuedForm<T extends FieldValues>(form: Pick<UseFormReturn<T>, 'watch' | 'getValues' | 'setValue'>, { rescue, fields, getSignals, fieldPath }: UseRescuedFormOptions<T>): FormRescueHandle;
28
+ //# sourceMappingURL=use-rescued-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-rescued-form.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rescued-form.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAa,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,WAAW;IAC1D,4FAA4F;IAC5F,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACpC,6GAA6G;IAC7G,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACnD,4HAA4H;IAC5H,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;CACvC;AAYD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,WAAW,EAClD,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC,EAChE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAClE,gBAAgB,CA0BlB"}