@yahoo/uds-mobile 2.24.0-beta.8 → 2.24.0-beta.9

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 (91) hide show
  1. package/README.md +1 -0
  2. package/dist/components/Avatar/useAvatarFontScale.cjs +2 -2
  3. package/dist/components/Avatar/useAvatarFontScale.js +3 -3
  4. package/dist/components/Avatar/useAvatarFontScale.js.map +1 -1
  5. package/dist/components/Button.cjs +4 -3
  6. package/dist/components/Button.js +5 -4
  7. package/dist/components/Button.js.map +1 -1
  8. package/dist/components/Checkbox.cjs +2 -2
  9. package/dist/components/Checkbox.js +3 -3
  10. package/dist/components/Checkbox.js.map +1 -1
  11. package/dist/components/Chip/ChipBase.cjs +1 -1
  12. package/dist/components/Chip/ChipBase.js +2 -2
  13. package/dist/components/Chip/ChipBase.js.map +1 -1
  14. package/dist/components/Icon.cjs +6 -5
  15. package/dist/components/Icon.d.cts +2 -0
  16. package/dist/components/Icon.d.cts.map +1 -1
  17. package/dist/components/Icon.d.ts +2 -0
  18. package/dist/components/Icon.d.ts.map +1 -1
  19. package/dist/components/Icon.js +7 -6
  20. package/dist/components/Icon.js.map +1 -1
  21. package/dist/components/IconButton.cjs +1 -1
  22. package/dist/components/IconButton.js +2 -2
  23. package/dist/components/IconButton.js.map +1 -1
  24. package/dist/components/Input.cjs +3 -1
  25. package/dist/components/Input.js +4 -2
  26. package/dist/components/Input.js.map +1 -1
  27. package/dist/components/InputHelpText.cjs +1 -0
  28. package/dist/components/InputHelpText.js +1 -0
  29. package/dist/components/InputHelpText.js.map +1 -1
  30. package/dist/components/Link.cjs +4 -2
  31. package/dist/components/Link.js +5 -3
  32. package/dist/components/Link.js.map +1 -1
  33. package/dist/components/Pagination/PaginationEllipsis.cjs +1 -1
  34. package/dist/components/Pagination/PaginationEllipsis.js +2 -2
  35. package/dist/components/Pagination/PaginationEllipsis.js.map +1 -1
  36. package/dist/components/Pagination/usePaginationControlStyles.cjs +1 -1
  37. package/dist/components/Pagination/usePaginationControlStyles.js +2 -2
  38. package/dist/components/Pagination/usePaginationControlStyles.js.map +1 -1
  39. package/dist/components/Radio/Radio.cjs +1 -1
  40. package/dist/components/Radio/Radio.js +2 -2
  41. package/dist/components/Radio/Radio.js.map +1 -1
  42. package/dist/components/Select/Select.cjs +2 -0
  43. package/dist/components/Select/Select.js +2 -0
  44. package/dist/components/Select/Select.js.map +1 -1
  45. package/dist/components/Select/SelectItem.cjs +1 -4
  46. package/dist/components/Select/SelectItem.d.cts.map +1 -1
  47. package/dist/components/Select/SelectItem.d.ts.map +1 -1
  48. package/dist/components/Select/SelectItem.js +2 -5
  49. package/dist/components/Select/SelectItem.js.map +1 -1
  50. package/dist/components/Select/SelectTrigger.cjs +1 -4
  51. package/dist/components/Select/SelectTrigger.d.cts.map +1 -1
  52. package/dist/components/Select/SelectTrigger.d.ts.map +1 -1
  53. package/dist/components/Select/SelectTrigger.js +2 -5
  54. package/dist/components/Select/SelectTrigger.js.map +1 -1
  55. package/dist/components/Switch.cjs +2 -2
  56. package/dist/components/Switch.js +3 -3
  57. package/dist/components/Switch.js.map +1 -1
  58. package/dist/components/Tabs/Tab.cjs +1 -1
  59. package/dist/components/Tabs/Tab.js +2 -2
  60. package/dist/components/Tabs/Tab.js.map +1 -1
  61. package/dist/components/Text.cjs +1 -1
  62. package/dist/components/Text.js +2 -2
  63. package/dist/components/Text.js.map +1 -1
  64. package/dist/fontScaling/FontScalingContext.cjs +14 -3
  65. package/dist/fontScaling/FontScalingContext.d.cts +8 -2
  66. package/dist/fontScaling/FontScalingContext.d.cts.map +1 -1
  67. package/dist/fontScaling/FontScalingContext.d.ts +8 -2
  68. package/dist/fontScaling/FontScalingContext.d.ts.map +1 -1
  69. package/dist/fontScaling/FontScalingContext.js +14 -4
  70. package/dist/fontScaling/FontScalingContext.js.map +1 -1
  71. package/dist/fontScaling/androidNonlinearFontScaling.cjs +85 -9
  72. package/dist/fontScaling/androidNonlinearFontScaling.d.cts +2 -2
  73. package/dist/fontScaling/androidNonlinearFontScaling.d.cts.map +1 -1
  74. package/dist/fontScaling/androidNonlinearFontScaling.d.ts +2 -2
  75. package/dist/fontScaling/androidNonlinearFontScaling.d.ts.map +1 -1
  76. package/dist/fontScaling/androidNonlinearFontScaling.js +85 -9
  77. package/dist/fontScaling/androidNonlinearFontScaling.js.map +1 -1
  78. package/dist/fontScaling/useFontScale.cjs +18 -5
  79. package/dist/fontScaling/useFontScale.d.cts +6 -18
  80. package/dist/fontScaling/useFontScale.d.cts.map +1 -1
  81. package/dist/fontScaling/useFontScale.d.ts +6 -18
  82. package/dist/fontScaling/useFontScale.d.ts.map +1 -1
  83. package/dist/fontScaling/useFontScale.js +18 -6
  84. package/dist/fontScaling/useFontScale.js.map +1 -1
  85. package/dist/mobile/generated/fontMetrics.cjs +530 -530
  86. package/dist/mobile/generated/fontMetrics.js +530 -530
  87. package/dist/mobile/generated/fontMetrics.js.map +1 -1
  88. package/fonts/index.cjs +214 -214
  89. package/fonts/index.mjs +214 -214
  90. package/generated/fontMetrics.ts +530 -530
  91. package/package.json +1 -1
@@ -26,20 +26,33 @@ function getFontScale() {
26
26
  * Pass the SP size that the geometry accompanies on Android so this mirrors
27
27
  * Android 14+'s nonlinear scaling. Omitting `fontSize` preserves the legacy
28
28
  * scalar behavior for custom callers that do not know their base size.
29
+ * On iOS this follows the global text-size curve; accompanying text should
30
+ * omit `dynamicTypeRamp` so its native size uses the same multiplier.
29
31
  *
30
32
  * Subscribes to font-scale changes only — rotation does not re-render, and
31
33
  * components re-render solely when the user changes the OS text size.
32
34
  * Returns 1 when the nearest font-scaling provider has `enabled: false`.
33
35
  */
34
- function useFontScale(cap, fontSize) {
36
+ function useFontScaleValue(cap, fontSize, honorResolvedComponentOverride = false) {
35
37
  const enabled = require_fontScaling_FontScalingContext.useFontScalingEnabled();
36
38
  const fontScale = (0, react.useSyncExternalStore)(subscribe, getFontScale, getFontScale);
37
- if (!enabled) return 1;
39
+ if (!enabled && !honorResolvedComponentOverride) return 1;
38
40
  const effectiveCap = typeof cap === "number" && cap >= 1 ? cap : Number.POSITIVE_INFINITY;
39
- const cappedFontScale = Math.min(fontScale, effectiveCap);
40
41
  const platformVersion = Number(react_native.Platform.Version);
41
- const nativeScale = react_native.Platform.OS === "android" && platformVersion >= 34 && typeof fontSize === "number" && fontSize > 0 ? require_fontScaling_androidNonlinearFontScaling.convertAndroidSpToDp(fontSize, cappedFontScale) / fontSize : cappedFontScale;
42
- return Math.max(1, nativeScale);
42
+ const nativeScale = react_native.Platform.OS === "android" && platformVersion >= 34 && typeof fontSize === "number" && fontSize > 0 ? require_fontScaling_androidNonlinearFontScaling.convertAndroidSpToDp(fontSize, fontScale, platformVersion) / fontSize : fontScale;
43
+ return Math.max(1, Math.min(nativeScale, effectiveCap));
44
+ }
45
+ function useFontScale(cap, fontSize) {
46
+ return useFontScaleValue(cap, fontSize);
47
+ }
48
+ /**
49
+ * Internal component path. A resolved cap is defined under rollback mode only
50
+ * when it came from an explicit component prop, which the public contract says
51
+ * must continue to apply.
52
+ */
53
+ function useComponentFontScale(cap, fontSize) {
54
+ return useFontScaleValue(cap, fontSize, cap !== void 0);
43
55
  }
44
56
  //#endregion
57
+ exports.useComponentFontScale = useComponentFontScale;
45
58
  exports.useFontScale = useFontScale;
@@ -1,24 +1,12 @@
1
1
 
2
2
  //#region src/fontScaling/useFontScale.d.ts
3
+ declare function useFontScale(cap?: number | null, fontSize?: number): number;
3
4
  /**
4
- * The effective scale for `fontSize`, clamped to `[1, cap]`, for sizing
5
- * containers around scaled text (e.g. a checkbox box growing with its
6
- * checkmark).
7
- *
8
- * `cap` uses the same semantics as `maxFontSizeMultiplier`: a number >= 1
9
- * caps the scale; `null`, `0`, or `undefined` leave it uncapped. The result
10
- * is never below 1 so containers never shrink under their token metrics
11
- * (font scales < 1 shrink text only, as today).
12
- *
13
- * Pass the SP size that the geometry accompanies on Android so this mirrors
14
- * Android 14+'s nonlinear scaling. Omitting `fontSize` preserves the legacy
15
- * scalar behavior for custom callers that do not know their base size.
16
- *
17
- * Subscribes to font-scale changes only — rotation does not re-render, and
18
- * components re-render solely when the user changes the OS text size.
19
- * Returns 1 when the nearest font-scaling provider has `enabled: false`.
5
+ * Internal component path. A resolved cap is defined under rollback mode only
6
+ * when it came from an explicit component prop, which the public contract says
7
+ * must continue to apply.
20
8
  */
21
- declare function useFontScale(cap?: number | null, fontSize?: number): number;
9
+ declare function useComponentFontScale(cap?: number | null, fontSize?: number): number;
22
10
  //#endregion
23
- export { useFontScale };
11
+ export { useComponentFontScale, useFontScale };
24
12
  //# sourceMappingURL=useFontScale.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFontScale.d.cts","names":[],"sources":["../../src/fontScaling/useFontScale.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;iBAmCS,YAAA,CAAa,GAAA,kBAAqB,QAAA"}
1
+ {"version":3,"file":"useFontScale.d.cts","names":[],"sources":["../../src/fontScaling/useFontScale.ts"],"mappings":";;iBA+DS,YAAA,CAAa,GAAA,kBAAqB,QAAA;;;;;;iBASlC,qBAAA,CAAsB,GAAA,kBAAqB,QAAA"}
@@ -1,24 +1,12 @@
1
1
 
2
2
  //#region src/fontScaling/useFontScale.d.ts
3
+ declare function useFontScale(cap?: number | null, fontSize?: number): number;
3
4
  /**
4
- * The effective scale for `fontSize`, clamped to `[1, cap]`, for sizing
5
- * containers around scaled text (e.g. a checkbox box growing with its
6
- * checkmark).
7
- *
8
- * `cap` uses the same semantics as `maxFontSizeMultiplier`: a number >= 1
9
- * caps the scale; `null`, `0`, or `undefined` leave it uncapped. The result
10
- * is never below 1 so containers never shrink under their token metrics
11
- * (font scales < 1 shrink text only, as today).
12
- *
13
- * Pass the SP size that the geometry accompanies on Android so this mirrors
14
- * Android 14+'s nonlinear scaling. Omitting `fontSize` preserves the legacy
15
- * scalar behavior for custom callers that do not know their base size.
16
- *
17
- * Subscribes to font-scale changes only — rotation does not re-render, and
18
- * components re-render solely when the user changes the OS text size.
19
- * Returns 1 when the nearest font-scaling provider has `enabled: false`.
5
+ * Internal component path. A resolved cap is defined under rollback mode only
6
+ * when it came from an explicit component prop, which the public contract says
7
+ * must continue to apply.
20
8
  */
21
- declare function useFontScale(cap?: number | null, fontSize?: number): number;
9
+ declare function useComponentFontScale(cap?: number | null, fontSize?: number): number;
22
10
  //#endregion
23
- export { useFontScale };
11
+ export { useComponentFontScale, useFontScale };
24
12
  //# sourceMappingURL=useFontScale.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFontScale.d.ts","names":[],"sources":["../../src/fontScaling/useFontScale.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;iBAmCS,YAAA,CAAa,GAAA,kBAAqB,QAAA"}
1
+ {"version":3,"file":"useFontScale.d.ts","names":[],"sources":["../../src/fontScaling/useFontScale.ts"],"mappings":";;iBA+DS,YAAA,CAAa,GAAA,kBAAqB,QAAA;;;;;;iBASlC,qBAAA,CAAsB,GAAA,kBAAqB,QAAA"}
@@ -24,22 +24,34 @@ function getFontScale() {
24
24
  * Pass the SP size that the geometry accompanies on Android so this mirrors
25
25
  * Android 14+'s nonlinear scaling. Omitting `fontSize` preserves the legacy
26
26
  * scalar behavior for custom callers that do not know their base size.
27
+ * On iOS this follows the global text-size curve; accompanying text should
28
+ * omit `dynamicTypeRamp` so its native size uses the same multiplier.
27
29
  *
28
30
  * Subscribes to font-scale changes only — rotation does not re-render, and
29
31
  * components re-render solely when the user changes the OS text size.
30
32
  * Returns 1 when the nearest font-scaling provider has `enabled: false`.
31
33
  */
32
- function useFontScale(cap, fontSize) {
34
+ function useFontScaleValue(cap, fontSize, honorResolvedComponentOverride = false) {
33
35
  const enabled = useFontScalingEnabled();
34
36
  const fontScale = useSyncExternalStore(subscribe, getFontScale, getFontScale);
35
- if (!enabled) return 1;
37
+ if (!enabled && !honorResolvedComponentOverride) return 1;
36
38
  const effectiveCap = typeof cap === "number" && cap >= 1 ? cap : Number.POSITIVE_INFINITY;
37
- const cappedFontScale = Math.min(fontScale, effectiveCap);
38
39
  const platformVersion = Number(Platform.Version);
39
- const nativeScale = Platform.OS === "android" && platformVersion >= 34 && typeof fontSize === "number" && fontSize > 0 ? convertAndroidSpToDp(fontSize, cappedFontScale) / fontSize : cappedFontScale;
40
- return Math.max(1, nativeScale);
40
+ const nativeScale = Platform.OS === "android" && platformVersion >= 34 && typeof fontSize === "number" && fontSize > 0 ? convertAndroidSpToDp(fontSize, fontScale, platformVersion) / fontSize : fontScale;
41
+ return Math.max(1, Math.min(nativeScale, effectiveCap));
42
+ }
43
+ function useFontScale(cap, fontSize) {
44
+ return useFontScaleValue(cap, fontSize);
45
+ }
46
+ /**
47
+ * Internal component path. A resolved cap is defined under rollback mode only
48
+ * when it came from an explicit component prop, which the public contract says
49
+ * must continue to apply.
50
+ */
51
+ function useComponentFontScale(cap, fontSize) {
52
+ return useFontScaleValue(cap, fontSize, cap !== void 0);
41
53
  }
42
54
  //#endregion
43
- export { useFontScale };
55
+ export { useComponentFontScale, useFontScale };
44
56
 
45
57
  //# sourceMappingURL=useFontScale.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFontScale.js","names":[],"sources":["../../src/fontScaling/useFontScale.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\nimport { Dimensions, Platform } from 'react-native';\n\nimport { convertAndroidSpToDp } from './androidNonlinearFontScaling';\nimport { useFontScalingEnabled } from './FontScalingContext';\n\nfunction subscribe(onStoreChange: () => void): () => void {\n const subscription = Dimensions.addEventListener('change', onStoreChange);\n return () => subscription.remove();\n}\n\n// Unistyles' rt.fontScale is stale when the OS text size changes while the\n// app is running; Dimensions reflects the live value on both platforms.\nfunction getFontScale(): number {\n return Dimensions.get('window').fontScale;\n}\n\n/**\n * The effective scale for `fontSize`, clamped to `[1, cap]`, for sizing\n * containers around scaled text (e.g. a checkbox box growing with its\n * checkmark).\n *\n * `cap` uses the same semantics as `maxFontSizeMultiplier`: a number >= 1\n * caps the scale; `null`, `0`, or `undefined` leave it uncapped. The result\n * is never below 1 so containers never shrink under their token metrics\n * (font scales < 1 shrink text only, as today).\n *\n * Pass the SP size that the geometry accompanies on Android so this mirrors\n * Android 14+'s nonlinear scaling. Omitting `fontSize` preserves the legacy\n * scalar behavior for custom callers that do not know their base size.\n *\n * Subscribes to font-scale changes only — rotation does not re-render, and\n * components re-render solely when the user changes the OS text size.\n * Returns 1 when the nearest font-scaling provider has `enabled: false`.\n */\nfunction useFontScale(cap?: number | null, fontSize?: number): number {\n const enabled = useFontScalingEnabled();\n const fontScale = useSyncExternalStore(subscribe, getFontScale, getFontScale);\n if (!enabled) {\n return 1;\n }\n\n const effectiveCap = typeof cap === 'number' && cap >= 1 ? cap : Number.POSITIVE_INFINITY;\n const cappedFontScale = Math.min(fontScale, effectiveCap);\n const platformVersion = Number(Platform.Version);\n const nativeScale =\n Platform.OS === 'android' &&\n platformVersion >= 34 &&\n typeof fontSize === 'number' &&\n fontSize > 0\n ? convertAndroidSpToDp(fontSize, cappedFontScale) / fontSize\n : cappedFontScale;\n\n return Math.max(1, nativeScale);\n}\n\nexport { useFontScale };\n"],"mappings":";;;;;;AAMA,SAAS,UAAU,eAAuC;CACxD,MAAM,eAAe,WAAW,iBAAiB,UAAU,cAAc;CACzE,aAAa,aAAa,QAAQ;;AAKpC,SAAS,eAAuB;CAC9B,OAAO,WAAW,IAAI,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;AAqBlC,SAAS,aAAa,KAAqB,UAA2B;CACpE,MAAM,UAAU,uBAAuB;CACvC,MAAM,YAAY,qBAAqB,WAAW,cAAc,aAAa;CAC7E,IAAI,CAAC,SACH,OAAO;CAGT,MAAM,eAAe,OAAO,QAAQ,YAAY,OAAO,IAAI,MAAM,OAAO;CACxE,MAAM,kBAAkB,KAAK,IAAI,WAAW,aAAa;CACzD,MAAM,kBAAkB,OAAO,SAAS,QAAQ;CAChD,MAAM,cACJ,SAAS,OAAO,aAChB,mBAAmB,MACnB,OAAO,aAAa,YACpB,WAAW,IACP,qBAAqB,UAAU,gBAAgB,GAAG,WAClD;CAEN,OAAO,KAAK,IAAI,GAAG,YAAY"}
1
+ {"version":3,"file":"useFontScale.js","names":[],"sources":["../../src/fontScaling/useFontScale.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\nimport { Dimensions, Platform } from 'react-native';\n\nimport { convertAndroidSpToDp } from './androidNonlinearFontScaling';\nimport { useFontScalingEnabled } from './FontScalingContext';\n\nfunction subscribe(onStoreChange: () => void): () => void {\n const subscription = Dimensions.addEventListener('change', onStoreChange);\n return () => subscription.remove();\n}\n\n// Unistyles' rt.fontScale is stale when the OS text size changes while the\n// app is running; Dimensions reflects the live value on both platforms.\nfunction getFontScale(): number {\n return Dimensions.get('window').fontScale;\n}\n\n/**\n * The effective scale for `fontSize`, clamped to `[1, cap]`, for sizing\n * containers around scaled text (e.g. a checkbox box growing with its\n * checkmark).\n *\n * `cap` uses the same semantics as `maxFontSizeMultiplier`: a number >= 1\n * caps the scale; `null`, `0`, or `undefined` leave it uncapped. The result\n * is never below 1 so containers never shrink under their token metrics\n * (font scales < 1 shrink text only, as today).\n *\n * Pass the SP size that the geometry accompanies on Android so this mirrors\n * Android 14+'s nonlinear scaling. Omitting `fontSize` preserves the legacy\n * scalar behavior for custom callers that do not know their base size.\n * On iOS this follows the global text-size curve; accompanying text should\n * omit `dynamicTypeRamp` so its native size uses the same multiplier.\n *\n * Subscribes to font-scale changes only — rotation does not re-render, and\n * components re-render solely when the user changes the OS text size.\n * Returns 1 when the nearest font-scaling provider has `enabled: false`.\n */\nfunction useFontScaleValue(\n cap?: number | null,\n fontSize?: number,\n honorResolvedComponentOverride = false,\n): number {\n const enabled = useFontScalingEnabled();\n const fontScale = useSyncExternalStore(subscribe, getFontScale, getFontScale);\n if (!enabled && !honorResolvedComponentOverride) {\n return 1;\n }\n\n const effectiveCap = typeof cap === 'number' && cap >= 1 ? cap : Number.POSITIVE_INFINITY;\n const platformVersion = Number(Platform.Version);\n const nativeScale =\n Platform.OS === 'android' &&\n platformVersion >= 34 &&\n typeof fontSize === 'number' &&\n fontSize > 0\n ? convertAndroidSpToDp(fontSize, fontScale, platformVersion) / fontSize\n : fontScale;\n\n // React Native applies maxFontSizeMultiplier after the platform conversion.\n // This matters on Android 14+, where the converted size is nonlinear.\n return Math.max(1, Math.min(nativeScale, effectiveCap));\n}\n\nfunction useFontScale(cap?: number | null, fontSize?: number): number {\n return useFontScaleValue(cap, fontSize);\n}\n\n/**\n * Internal component path. A resolved cap is defined under rollback mode only\n * when it came from an explicit component prop, which the public contract says\n * must continue to apply.\n */\nfunction useComponentFontScale(cap?: number | null, fontSize?: number): number {\n return useFontScaleValue(cap, fontSize, cap !== undefined);\n}\n\nexport { useComponentFontScale, useFontScale };\n"],"mappings":";;;;;;AAMA,SAAS,UAAU,eAAuC;CACxD,MAAM,eAAe,WAAW,iBAAiB,UAAU,cAAc;CACzE,aAAa,aAAa,QAAQ;;AAKpC,SAAS,eAAuB;CAC9B,OAAO,WAAW,IAAI,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;AAuBlC,SAAS,kBACP,KACA,UACA,iCAAiC,OACzB;CACR,MAAM,UAAU,uBAAuB;CACvC,MAAM,YAAY,qBAAqB,WAAW,cAAc,aAAa;CAC7E,IAAI,CAAC,WAAW,CAAC,gCACf,OAAO;CAGT,MAAM,eAAe,OAAO,QAAQ,YAAY,OAAO,IAAI,MAAM,OAAO;CACxE,MAAM,kBAAkB,OAAO,SAAS,QAAQ;CAChD,MAAM,cACJ,SAAS,OAAO,aAChB,mBAAmB,MACnB,OAAO,aAAa,YACpB,WAAW,IACP,qBAAqB,UAAU,WAAW,gBAAgB,GAAG,WAC7D;CAIN,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,aAAa,CAAC;;AAGzD,SAAS,aAAa,KAAqB,UAA2B;CACpE,OAAO,kBAAkB,KAAK,SAAS;;;;;;;AAQzC,SAAS,sBAAsB,KAAqB,UAA2B;CAC7E,OAAO,kBAAkB,KAAK,UAAU,QAAQ,KAAA,EAAU"}