@expo/ui 57.0.15 → 57.0.17

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 (85) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/expo/modules/ui/DatePickerView.kt +29 -18
  4. package/android/src/main/java/expo/modules/ui/DateRangePickerView.kt +191 -0
  5. package/android/src/main/java/expo/modules/ui/ExpoUIModule.kt +25 -0
  6. package/android/src/main/java/expo/modules/ui/HostView.kt +8 -1
  7. package/android/src/main/java/expo/modules/ui/RadioButtonView.kt +23 -1
  8. package/android/src/main/java/expo/modules/ui/VerticalSliderView.kt +145 -0
  9. package/android/src/main/java/expo/modules/ui/textfield/BasicTextField.kt +2 -0
  10. package/build/community/bottom-sheet/BottomSheet.android.d.ts.map +1 -1
  11. package/build/community/bottom-sheet/BottomSheet.ios.d.ts.map +1 -1
  12. package/build/jetpack-compose/DatePicker/index.d.ts +84 -0
  13. package/build/jetpack-compose/DatePicker/index.d.ts.map +1 -1
  14. package/build/jetpack-compose/RadioButton/index.d.ts +19 -0
  15. package/build/jetpack-compose/RadioButton/index.d.ts.map +1 -1
  16. package/build/jetpack-compose/Slider/index.d.ts +21 -0
  17. package/build/jetpack-compose/Slider/index.d.ts.map +1 -1
  18. package/build/swift-ui/modifiers/background.d.ts +32 -5
  19. package/build/swift-ui/modifiers/background.d.ts.map +1 -1
  20. package/build/swift-ui/modifiers/containerBackground.d.ts +9 -4
  21. package/build/swift-ui/modifiers/containerBackground.d.ts.map +1 -1
  22. package/build/swift-ui/modifiers/index.d.ts +45 -10
  23. package/build/swift-ui/modifiers/index.d.ts.map +1 -1
  24. package/build/swift-ui/modifiers/presentationModifiers.d.ts +6 -3
  25. package/build/swift-ui/modifiers/presentationModifiers.d.ts.map +1 -1
  26. package/expo-module.config.json +1 -1
  27. package/ios/Modifiers/BackgroundModifier.swift +10 -10
  28. package/ios/Modifiers/ContainerBackgroundModifier.swift +4 -4
  29. package/ios/Modifiers/PresentationModifiers.swift +3 -3
  30. package/ios/Modifiers/ScrollClipDisabledModifier.swift +16 -0
  31. package/ios/Modifiers/ViewModifierRegistry.swift +18 -8
  32. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{57.0.15/expo.modules.ui-57.0.15-sources.jar → 57.0.17/expo.modules.ui-57.0.17-sources.jar} +0 -0
  33. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17-sources.jar.md5 +1 -0
  34. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17-sources.jar.sha1 +1 -0
  35. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17-sources.jar.sha256 +1 -0
  36. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17-sources.jar.sha512 +1 -0
  37. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.aar +0 -0
  38. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.aar.md5 +1 -0
  39. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.aar.sha1 +1 -0
  40. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.aar.sha256 +1 -0
  41. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.aar.sha512 +1 -0
  42. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{57.0.15/expo.modules.ui-57.0.15.module → 57.0.17/expo.modules.ui-57.0.17.module} +22 -22
  43. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.module.md5 +1 -0
  44. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.module.sha1 +1 -0
  45. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.module.sha256 +1 -0
  46. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.module.sha512 +1 -0
  47. package/local-maven-repo/expo/modules/ui/expo.modules.ui/{57.0.15/expo.modules.ui-57.0.15.pom → 57.0.17/expo.modules.ui-57.0.17.pom} +1 -1
  48. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.pom.md5 +1 -0
  49. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.pom.sha1 +1 -0
  50. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.pom.sha256 +1 -0
  51. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.17/expo.modules.ui-57.0.17.pom.sha512 +1 -0
  52. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml +4 -4
  53. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.md5 +1 -1
  54. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha1 +1 -1
  55. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha256 +1 -1
  56. package/local-maven-repo/expo/modules/ui/expo.modules.ui/maven-metadata.xml.sha512 +1 -1
  57. package/package.json +4 -4
  58. package/spm.config.json +1 -1
  59. package/src/community/bottom-sheet/BottomSheet.android.tsx +5 -3
  60. package/src/community/bottom-sheet/BottomSheet.ios.tsx +4 -3
  61. package/src/jetpack-compose/DatePicker/index.tsx +152 -0
  62. package/src/jetpack-compose/RadioButton/index.tsx +20 -0
  63. package/src/jetpack-compose/Slider/index.tsx +33 -2
  64. package/src/swift-ui/modifiers/background.ts +49 -7
  65. package/src/swift-ui/modifiers/containerBackground.ts +10 -5
  66. package/src/swift-ui/modifiers/index.ts +62 -8
  67. package/src/swift-ui/modifiers/presentationModifiers.ts +7 -4
  68. package/src/universal/transformStyle.ios.ts +2 -2
  69. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.md5 +0 -1
  70. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.sha1 +0 -1
  71. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.sha256 +0 -1
  72. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15-sources.jar.sha512 +0 -1
  73. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar +0 -0
  74. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.md5 +0 -1
  75. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.sha1 +0 -1
  76. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.sha256 +0 -1
  77. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.aar.sha512 +0 -1
  78. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.md5 +0 -1
  79. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.sha1 +0 -1
  80. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.sha256 +0 -1
  81. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.module.sha512 +0 -1
  82. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.md5 +0 -1
  83. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.sha1 +0 -1
  84. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.sha256 +0 -1
  85. package/local-maven-repo/expo/modules/ui/expo.modules.ui/57.0.15/expo.modules.ui-57.0.15.pom.sha512 +0 -1
@@ -1,12 +1,54 @@
1
- import { createModifier } from './createModifier';
1
+ import { createModifier, type ModifierConfig } from './createModifier';
2
+ import { resolveShapeStyle, type ShapeStyle } from './shapeStyle';
2
3
  import type { Shape } from './shapes/index';
3
- import type { Color } from './types';
4
+
5
+ export type BackgroundOptions = {
6
+ /**
7
+ * The safe area edges the background extends into.
8
+ * @default 'all'
9
+ */
10
+ ignoresSafeAreaEdges?:
11
+ | 'all'
12
+ | 'top'
13
+ | 'bottom'
14
+ | 'leading'
15
+ | 'trailing'
16
+ | 'horizontal'
17
+ | 'vertical';
18
+ };
4
19
 
5
20
  /**
6
21
  * Sets the background of a view.
7
- * @param color - The background color (hex string). For example, `#FF0000`.
8
- * @param shape - Optional shape to clip the background. If not provided, the background will fill the entire view.
9
- * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/SwiftUI/View/background(_:alignment:)).
22
+ *
23
+ * Two variants matching SwiftUI:
24
+ * - `background(style)` — paints the whole view, expanding into the safe area unless
25
+ * `ignoresSafeAreaEdges` narrows it down
26
+ * - `background(style, shapes.capsule())` — paints the given shape
27
+ *
28
+ * To draw an arbitrary view behind another one, use the `Background` component instead.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * <Text modifiers={[background('#FF0000')]}>Solid color</Text>
33
+ * <Text modifiers={[background({ type: 'material', material: 'thin' })]}>Blurred backdrop</Text>
34
+ * <Text modifiers={[background('#FF0000', shapes.roundedRectangle({ cornerRadius: 12 }))]}>
35
+ * Rounded
36
+ * </Text>
37
+ * ```
38
+ *
39
+ * @param style - Any [`ShapeStyle`](#shapestyle): a color, a hierarchical style, a material, or a gradient.
40
+ * @param shape - The shape the style is painted in. Omit it to paint the whole view.
41
+ * @param options - Options of the variant without a shape, such as the safe area edges the background extends into.
42
+ * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/background(_:ignoressafeareaedges:)).
10
43
  */
11
- export const background = (color: Color, shape?: Shape) =>
12
- createModifier('background', { color, ...shape });
44
+ export function background(style: ShapeStyle, options?: BackgroundOptions): ModifierConfig;
45
+ export function background(style: ShapeStyle, shape?: Shape): ModifierConfig;
46
+ export function background(
47
+ style: ShapeStyle,
48
+ shapeOrOptions?: Shape | BackgroundOptions
49
+ ): ModifierConfig {
50
+ return createModifier('background', {
51
+ style: resolveShapeStyle(style),
52
+ ...shapeOrOptions,
53
+ });
54
+ }
@@ -1,13 +1,18 @@
1
1
  import { createModifier } from './createModifier';
2
- import type { Color } from './types';
2
+ import { resolveShapeStyle, type ShapeStyle } from './shapeStyle';
3
3
 
4
4
  export type ContainerBackgroundPlacement = 'widget' | 'navigation' | 'navigationSplitView';
5
5
 
6
6
  /**
7
- * Sets the container background of the enclosing container using a view.
8
- * @param color - The color to set as the background of the container.
7
+ * Sets the container background of the enclosing container.
8
+ *
9
+ * > **Note:** `navigation` and `navigationSplitView` require iOS 18. On iOS 17 they fall back to
10
+ * > the `widget` placement.
11
+ *
12
+ * @param style - Any [`ShapeStyle`](#shapestyle): a color, a hierarchical style, a material, or a gradient.
9
13
  * @param container - The type of container to apply the background to.
14
+ * @platform ios 17.0+
10
15
  * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/containerbackground(_:for:)).
11
16
  */
12
- export const containerBackground = (color: Color, container: ContainerBackgroundPlacement) =>
13
- createModifier('containerBackground', { color, container });
17
+ export const containerBackground = (style: ShapeStyle, container: ContainerBackgroundPlacement) =>
18
+ createModifier('containerBackground', { style: resolveShapeStyle(style), container });
@@ -287,13 +287,38 @@ export const clipShape = (
287
287
  cornerRadius?: number
288
288
  ) => createModifier('clipShape', { shape, cornerRadius });
289
289
 
290
+ /**
291
+ * The parameters of the `border` modifier.
292
+ */
293
+ export type BorderParams =
294
+ | {
295
+ /**
296
+ * The style painted along the border. No border is drawn when the style is not available on
297
+ * the running platform, unlike `strokeBorder`, which falls back to the foreground style.
298
+ */
299
+ content: ShapeStyle;
300
+ /** The border width. @default 1 */
301
+ width?: number;
302
+ }
303
+ | {
304
+ /**
305
+ * @deprecated Use `content`, which takes any `ShapeStyle` and not only a color.
306
+ */
307
+ color: Color;
308
+ /** The border width. @default 1 */
309
+ width?: number;
310
+ };
311
+
290
312
  /**
291
313
  * Adds a border to a view.
292
- * @param params - The border parameters. Color and width.
314
+ * @param params - The border parameters. The style painted along the border, and its width.
293
315
  * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/border(_:width:)).
294
316
  */
295
- export const border = (params: { color: Color; width?: number }) =>
296
- createModifier('border', params);
317
+ export const border = (params: BorderParams) =>
318
+ createModifier('border', {
319
+ content: resolveShapeStyle('content' in params ? params.content : params.color),
320
+ width: params.width,
321
+ });
297
322
 
298
323
  /**
299
324
  * The characteristics of a stroke that traces a path.
@@ -316,10 +341,15 @@ export type StrokeStyle = {
316
341
 
317
342
  /**
318
343
  * Strokes an inset border along the view's shape.
319
- * @param params - The stroke parameters. Color (omit for the foreground style), style, antialiased, shape and cornerRadius.
344
+ * @param params - The stroke parameters. The style painted along the stroke (omit for the foreground style), the stroke style, antialiased, shape and cornerRadius.
320
345
  * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/insettableshape/strokeborder(_:style:antialiased:)).
321
346
  */
322
347
  export const strokeBorder = (params: {
348
+ /** The style painted along the stroke. Omit to use the foreground style. */
349
+ content?: ShapeStyle;
350
+ /**
351
+ * @deprecated Use `content`, which takes any `ShapeStyle` and not only a color.
352
+ */
323
353
  color?: Color;
324
354
  style?: StrokeStyle;
325
355
  antialiased?: boolean;
@@ -331,7 +361,14 @@ export const strokeBorder = (params: {
331
361
  | 'roundedRectangle'
332
362
  | 'containerRelativeShape';
333
363
  cornerRadius?: number;
334
- }) => createModifier('strokeBorder', params);
364
+ }) => {
365
+ const { content, color, ...rest } = params;
366
+ const shapeStyle = content ?? color;
367
+ return createModifier('strokeBorder', {
368
+ ...rest,
369
+ content: shapeStyle === undefined ? undefined : resolveShapeStyle(shapeStyle),
370
+ });
371
+ };
335
372
 
336
373
  /**
337
374
  * Applies scaling transformation.
@@ -495,11 +532,11 @@ export const italic = () => createModifier('italic', {});
495
532
  export const monospacedDigit = () => createModifier('monospacedDigit', {});
496
533
 
497
534
  /**
498
- * Sets the tint color of a view.
499
- * @param color - The tint color (hex string). For example, `#FF0000`.
535
+ * Sets the tint of a view.
536
+ * @param tint - Any [`ShapeStyle`](#shapestyle): a color, a hierarchical style, a material, or a gradient.
500
537
  * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/tint(_:)).
501
538
  */
502
- export const tint = (color: Color) => createModifier('tint', { color });
539
+ export const tint = (tint: ShapeStyle) => createModifier('tint', { tint: resolveShapeStyle(tint) });
503
540
 
504
541
  /**
505
542
  * Hides or shows a view.
@@ -749,6 +786,18 @@ export const scrollDismissesKeyboard = (
749
786
  export const scrollDisabled = (disabled: boolean = true) =>
750
787
  createModifier('scrollDisabled', { disabled });
751
788
 
789
+ /**
790
+ * Disables or enables clipping of a scrollable view's content to its bounds.
791
+ * Content drawn outside those bounds, such as a shadow or a view scaled up past the edge, is
792
+ * cut off by default and stays visible once clipping is disabled.
793
+ * @param disabled - Whether clipping should be disabled (default: true).
794
+ * @platform ios 17.0+
795
+ * @platform tvos 17.0+
796
+ * @see Official [SwiftUI documentation](https://developer.apple.com/documentation/swiftui/view/scrollclipdisabled(_:)).
797
+ */
798
+ export const scrollClipDisabled = (disabled: boolean = true) =>
799
+ createModifier('scrollClipDisabled', { disabled });
800
+
752
801
  /**
753
802
  * Controls the visibility of scroll indicators for scrollable views.
754
803
  * Mirrors SwiftUI's `scrollIndicators(_:axes:)` modifier.
@@ -1002,6 +1051,10 @@ export const overlay = (params: {
1002
1051
  /**
1003
1052
  * Adds a background behind the view.
1004
1053
  * @param params - Background color and alignment.
1054
+ * @deprecated Wraps `background(_:alignment:)`, which SwiftUI deprecated in favor of
1055
+ * `background(alignment:content:)`, available since iOS 15. Use the `background` modifier for a
1056
+ * plain fill, or the `Background` component when the background has to be a view or needs an
1057
+ * alignment.
1005
1058
  */
1006
1059
  export const backgroundOverlay = (params: {
1007
1060
  color?: Color;
@@ -1721,6 +1774,7 @@ export type BuiltInModifier =
1721
1774
  | ReturnType<typeof containerRelativeFrame>
1722
1775
  | ReturnType<typeof scrollContentBackground>
1723
1776
  | ReturnType<typeof scrollDisabled>
1777
+ | ReturnType<typeof scrollClipDisabled>
1724
1778
  | ReturnType<typeof scrollIndicators>
1725
1779
  | ReturnType<typeof defaultScrollAnchor>
1726
1780
  | ReturnType<typeof defaultScrollAnchorForRole>
@@ -3,7 +3,7 @@ import {
3
3
  createModifierWithEventListener,
4
4
  type ModifierConfig,
5
5
  } from './createModifier';
6
- import type { Color } from './types';
6
+ import { resolveShapeStyle, type ShapeStyle } from './shapeStyle';
7
7
 
8
8
  /**
9
9
  * Presentation detent type for controlling sheet heights.
@@ -89,13 +89,16 @@ export const presentationBackgroundInteraction = (
89
89
  * Sets the background of a sheet presentation. Paints the entire sheet chrome
90
90
  * including the drag-indicator zone and home-indicator safe-area inset, which
91
91
  * a regular `background()` modifier cannot reach.
92
- * @param color - The background color.
92
+ *
93
+ * > **Note:** iOS 26 renders a material as a flat color rather than a translucent blur.
94
+ * @param style - Any [`ShapeStyle`](#shapestyle): a color, a hierarchical style, a material, or a gradient.
93
95
  * @platform ios 16.4+
96
+ * @platform tvos 16.4+
94
97
  * @see Official [SwiftUI
95
98
  documentation](https://developer.apple.com/documentation/swiftui/view/presentationbackground(_:)).
96
99
  */
97
- export const presentationBackground = (color: Color) =>
98
- createModifier('presentationBackground', { color });
100
+ export const presentationBackground = (style: ShapeStyle) =>
101
+ createModifier('presentationBackground', { style: resolveShapeStyle(style) });
99
102
 
100
103
  /**
101
104
  * Disables interactive dismissal of a sheet.
@@ -131,12 +131,12 @@ export function transformToModifiers(
131
131
 
132
132
  // Background (fills the frame area including padding)
133
133
  if (style.backgroundColor) {
134
- mods.push(background(String(style.backgroundColor)));
134
+ mods.push(background(style.backgroundColor));
135
135
  }
136
136
 
137
137
  // Border (before clip so the clip rounds the border corners too)
138
138
  if (style.borderWidth != null && style.borderColor != null) {
139
- mods.push(border({ color: String(style.borderColor), width: style.borderWidth }));
139
+ mods.push(border({ content: style.borderColor, width: style.borderWidth }));
140
140
  }
141
141
 
142
142
  // Clip (border radius — rounds both background and border)
@@ -1 +0,0 @@
1
- 8f8ba3c03ae3deb578a50866e3aa7c1da0a1608a
@@ -1 +0,0 @@
1
- c0de9f779e4c1fa3758abcbbee8831628a015e11cc4d7242fd1c1ead65a62eef
@@ -1 +0,0 @@
1
- 20a3c1eb5e1bddbb7b3708606f314fbffaa9165cff2e148826fd2e7cd7e1def14e2b3e7ef1190ba853b66f5a71f3d32c05c71f7c7e98dc8470d2e5c2bfccd752
@@ -1 +0,0 @@
1
- 413330dc1478358eefbcd2ad21a352e69567b868
@@ -1 +0,0 @@
1
- 3954246789a3258d28107744fc6c8ffb721f105c6403279b0e93ca1a961bcddb
@@ -1 +0,0 @@
1
- 0fed5da498418bb5841100fac2b2f04d302598b81abd4159f62c8f1caecca14b831712cfff61039087834f9f1f32fe6b695cbab710e70a1b969e0bae70e471f0
@@ -1 +0,0 @@
1
- 0b9ff6c6054311175dc6bd90b07c314a7ede6f84
@@ -1 +0,0 @@
1
- 78e5605f43fc4b0f3d2f9a15f1c4fdec5c2ea8cd318b91c420b6eb15dd5eb494
@@ -1 +0,0 @@
1
- 5f05356766b79d9fdcf15c07d42f0d07954b8ccf6603f68f05ce2c1520ef4a7be053913ea4dc39f8c9d778ab0e844d3933e057b56073a68eecb6acbc4dffca05
@@ -1 +0,0 @@
1
- 20bca33f9608309fa2b6d4b60f481576201db951
@@ -1 +0,0 @@
1
- 05310f77cf9090370c199b477a3a20040419deaf872950d919fe112d9820ca3b
@@ -1 +0,0 @@
1
- 872bf3ee828e9dcea87db32b2396a6eb3cccacffdedf263d0f85a7943ca20d09fbb5e97c6f20bcd2852e128597f47f67ed957b76350335de57c13f5a103cd67f