@cdx-ui/primitives 0.3.6 → 0.3.8

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.
@@ -6,13 +6,26 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.ProgressBarIndicator = void 0;
7
7
  var _react = require("react");
8
8
  var _reactNative = require("react-native");
9
+ var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
10
+ var _utils = require("@cdx-ui/utils");
9
11
  var _slot = require("../slot");
10
12
  var _dataAttributes = require("../utils/dataAttributes");
11
13
  var _context = require("./context");
12
14
  var _jsxRuntime = require("react/jsx-runtime");
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
16
+ /**
17
+ * HeroUI indeterminate fill: a 2/5 segment translates from -100% to 350% of its
18
+ * own width over 1.5s (`progress-bar.css`). It enters off the start edge and
19
+ * exits off the end edge; the ease holds the slow parts of that travel off-screen.
20
+ */
21
+ const INDETERMINATE_WIDTH = '40%';
22
+ const INDETERMINATE_DURATION_MS = 1500;
23
+ const INDETERMINATE_FROM = -1;
24
+ const INDETERMINATE_TO = 3.5;
13
25
  const ProgressBarIndicator = exports.ProgressBarIndicator = /*#__PURE__*/(0, _react.forwardRef)(({
14
26
  asChild,
15
27
  style,
28
+ onLayout,
16
29
  ...rest
17
30
  }, ref) => {
18
31
  const {
@@ -21,7 +34,46 @@ const ProgressBarIndicator = exports.ProgressBarIndicator = /*#__PURE__*/(0, _re
21
34
  max,
22
35
  value
23
36
  } = (0, _context.useProgressContext)();
24
- const filledStyle = (0, _react.useMemo)(() => {
37
+ const isIndeterminate = state === 'indeterminate';
38
+ const reducedMotion = (0, _reactNativeReanimated.useReducedMotion)();
39
+ const travel = (0, _reactNativeReanimated.useSharedValue)(0);
40
+ const segmentWidth = (0, _reactNativeReanimated.useSharedValue)(0);
41
+ const direction = _reactNative.I18nManager.isRTL ? -1 : 1;
42
+ (0, _react.useEffect)(() => {
43
+ if (!isIndeterminate) {
44
+ travel.set(0);
45
+ return;
46
+ }
47
+ if (reducedMotion) {
48
+ travel.set(0);
49
+ return;
50
+ }
51
+ travel.set(0);
52
+ travel.set((0, _reactNativeReanimated.withRepeat)((0, _reactNativeReanimated.withTiming)(1, {
53
+ duration: INDETERMINATE_DURATION_MS,
54
+ easing: _reactNativeReanimated.Easing.bezier(0.65, 0, 0.35, 1)
55
+ }), -1, false));
56
+ }, [isIndeterminate, reducedMotion, travel]);
57
+ const handleLayout = event => {
58
+ if (!isIndeterminate) return;
59
+ const next = event.nativeEvent.layout.width;
60
+ if (segmentWidth.get() !== next) {
61
+ segmentWidth.set(next);
62
+ }
63
+ };
64
+ const indeterminateStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => {
65
+ const width = segmentWidth.get();
66
+ const span = INDETERMINATE_TO - INDETERMINATE_FROM;
67
+ const offset = reducedMotion ? 0 : width * (INDETERMINATE_FROM + travel.get() * span);
68
+ return {
69
+ width: INDETERMINATE_WIDTH,
70
+ height: '100%',
71
+ transform: [{
72
+ translateX: direction * offset
73
+ }]
74
+ };
75
+ }, [segmentWidth, travel, direction, reducedMotion]);
76
+ const determinateStyle = (0, _react.useMemo)(() => {
25
77
  const pct = `${String(percent)}%`;
26
78
  return {
27
79
  width: pct,
@@ -33,12 +85,13 @@ const ProgressBarIndicator = exports.ProgressBarIndicator = /*#__PURE__*/(0, _re
33
85
  value: value === null ? undefined : String(value),
34
86
  max: String(max)
35
87
  });
36
- const Comp = asChild ? _slot.Slot : _reactNative.View;
88
+ const Comp = asChild ? _slot.Slot : _reactNativeReanimated.default.View;
37
89
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(Comp, {
38
90
  ref: ref,
39
91
  ...rest,
40
92
  ...dataAttrs,
41
- style: [filledStyle, style]
93
+ onLayout: (0, _utils.composeEventHandlers)(onLayout, handleLayout),
94
+ style: [isIndeterminate ? indeterminateStyle : determinateStyle, style]
42
95
  });
43
96
  });
44
97
  ProgressBarIndicator.displayName = 'ProgressBarIndicator';
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","_slot","_dataAttributes","_context","_jsxRuntime","ProgressBarIndicator","exports","forwardRef","asChild","style","rest","ref","percent","state","max","value","useProgressContext","filledStyle","useMemo","pct","String","width","height","dataAttrs","dataAttributes","undefined","Comp","Slot","View","jsx","displayName"],"sourceRoot":"../../../src","sources":["progress-bar/ProgressBarIndicator.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AAA+C,IAAAK,WAAA,GAAAL,OAAA;AAQxC,MAAMM,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,gBAAG,IAAAE,iBAAU,EAC5C,CAAC;EAAEC,OAAO;EAAEC,KAAK;EAAE,GAAGC;AAAK,CAAC,EAAEC,GAAG,KAAK;EACpC,MAAM;IAAEC,OAAO;IAAEC,KAAK;IAAEC,GAAG;IAAEC;EAAM,CAAC,GAAG,IAAAC,2BAAkB,EAAC,CAAC;EAE3D,MAAMC,WAAW,GAAG,IAAAC,cAAO,EAAC,MAAiB;IAC3C,MAAMC,GAAG,GAAG,GAAGC,MAAM,CAACR,OAAO,CAAC,GAAoB;IAClD,OAAO;MAAES,KAAK,EAAEF,GAAG;MAAEG,MAAM,EAAE;IAAO,CAAC;EACvC,CAAC,EAAE,CAACV,OAAO,CAAC,CAAC;EAEb,MAAMW,SAAS,GAAG,IAAAC,8BAAc,EAAC;IAC/BX,KAAK;IACLE,KAAK,EAAEA,KAAK,KAAK,IAAI,GAAGU,SAAS,GAAGL,MAAM,CAACL,KAAK,CAAC;IACjDD,GAAG,EAAEM,MAAM,CAACN,GAAG;EACjB,CAAC,CAAC;EAEF,MAAMY,IAAI,GAAGlB,OAAO,GAAGmB,UAAI,GAAGC,iBAAI;EAElC,oBAAO,IAAAxB,WAAA,CAAAyB,GAAA,EAACH,IAAI;IAACf,GAAG,EAAEA,GAAI;IAAA,GAAKD,IAAI;IAAA,GAAMa,SAAS;IAAEd,KAAK,EAAE,CAACQ,WAAW,EAAER,KAAK;EAAE,CAAE,CAAC;AACjF,CACF,CAAC;AAEDJ,oBAAoB,CAACyB,WAAW,GAAG,sBAAsB","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","_reactNativeReanimated","_interopRequireWildcard","_utils","_slot","_dataAttributes","_context","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","INDETERMINATE_WIDTH","INDETERMINATE_DURATION_MS","INDETERMINATE_FROM","INDETERMINATE_TO","ProgressBarIndicator","exports","forwardRef","asChild","style","onLayout","rest","ref","percent","state","max","value","useProgressContext","isIndeterminate","reducedMotion","useReducedMotion","travel","useSharedValue","segmentWidth","direction","I18nManager","isRTL","useEffect","withRepeat","withTiming","duration","easing","Easing","bezier","handleLayout","event","next","nativeEvent","layout","width","indeterminateStyle","useAnimatedStyle","span","offset","height","transform","translateX","determinateStyle","useMemo","pct","String","dataAttrs","dataAttributes","undefined","Comp","Slot","Animated","View","jsx","composeEventHandlers","displayName"],"sourceRoot":"../../../src","sources":["progress-bar/ProgressBarIndicator.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,14 +1,26 @@
1
1
  "use strict";
2
2
 
3
- import { forwardRef, useMemo } from 'react';
4
- import { View } from 'react-native';
3
+ import { forwardRef, useEffect, useMemo } from 'react';
4
+ import { I18nManager } from 'react-native';
5
+ import Animated, { Easing, useAnimatedStyle, useReducedMotion, useSharedValue, withRepeat, withTiming } from 'react-native-reanimated';
6
+ import { composeEventHandlers } from '@cdx-ui/utils';
5
7
  import { Slot } from '../slot';
6
8
  import { dataAttributes } from '../utils/dataAttributes';
7
9
  import { useProgressContext } from './context';
8
10
  import { jsx as _jsx } from "react/jsx-runtime";
11
+ /**
12
+ * HeroUI indeterminate fill: a 2/5 segment translates from -100% to 350% of its
13
+ * own width over 1.5s (`progress-bar.css`). It enters off the start edge and
14
+ * exits off the end edge; the ease holds the slow parts of that travel off-screen.
15
+ */
16
+ const INDETERMINATE_WIDTH = '40%';
17
+ const INDETERMINATE_DURATION_MS = 1500;
18
+ const INDETERMINATE_FROM = -1;
19
+ const INDETERMINATE_TO = 3.5;
9
20
  export const ProgressBarIndicator = /*#__PURE__*/forwardRef(({
10
21
  asChild,
11
22
  style,
23
+ onLayout,
12
24
  ...rest
13
25
  }, ref) => {
14
26
  const {
@@ -17,7 +29,46 @@ export const ProgressBarIndicator = /*#__PURE__*/forwardRef(({
17
29
  max,
18
30
  value
19
31
  } = useProgressContext();
20
- const filledStyle = useMemo(() => {
32
+ const isIndeterminate = state === 'indeterminate';
33
+ const reducedMotion = useReducedMotion();
34
+ const travel = useSharedValue(0);
35
+ const segmentWidth = useSharedValue(0);
36
+ const direction = I18nManager.isRTL ? -1 : 1;
37
+ useEffect(() => {
38
+ if (!isIndeterminate) {
39
+ travel.set(0);
40
+ return;
41
+ }
42
+ if (reducedMotion) {
43
+ travel.set(0);
44
+ return;
45
+ }
46
+ travel.set(0);
47
+ travel.set(withRepeat(withTiming(1, {
48
+ duration: INDETERMINATE_DURATION_MS,
49
+ easing: Easing.bezier(0.65, 0, 0.35, 1)
50
+ }), -1, false));
51
+ }, [isIndeterminate, reducedMotion, travel]);
52
+ const handleLayout = event => {
53
+ if (!isIndeterminate) return;
54
+ const next = event.nativeEvent.layout.width;
55
+ if (segmentWidth.get() !== next) {
56
+ segmentWidth.set(next);
57
+ }
58
+ };
59
+ const indeterminateStyle = useAnimatedStyle(() => {
60
+ const width = segmentWidth.get();
61
+ const span = INDETERMINATE_TO - INDETERMINATE_FROM;
62
+ const offset = reducedMotion ? 0 : width * (INDETERMINATE_FROM + travel.get() * span);
63
+ return {
64
+ width: INDETERMINATE_WIDTH,
65
+ height: '100%',
66
+ transform: [{
67
+ translateX: direction * offset
68
+ }]
69
+ };
70
+ }, [segmentWidth, travel, direction, reducedMotion]);
71
+ const determinateStyle = useMemo(() => {
21
72
  const pct = `${String(percent)}%`;
22
73
  return {
23
74
  width: pct,
@@ -29,12 +80,13 @@ export const ProgressBarIndicator = /*#__PURE__*/forwardRef(({
29
80
  value: value === null ? undefined : String(value),
30
81
  max: String(max)
31
82
  });
32
- const Comp = asChild ? Slot : View;
83
+ const Comp = asChild ? Slot : Animated.View;
33
84
  return /*#__PURE__*/_jsx(Comp, {
34
85
  ref: ref,
35
86
  ...rest,
36
87
  ...dataAttrs,
37
- style: [filledStyle, style]
88
+ onLayout: composeEventHandlers(onLayout, handleLayout),
89
+ style: [isIndeterminate ? indeterminateStyle : determinateStyle, style]
38
90
  });
39
91
  });
40
92
  ProgressBarIndicator.displayName = 'ProgressBarIndicator';
@@ -1 +1 @@
1
- {"version":3,"names":["forwardRef","useMemo","View","Slot","dataAttributes","useProgressContext","jsx","_jsx","ProgressBarIndicator","asChild","style","rest","ref","percent","state","max","value","filledStyle","pct","String","width","height","dataAttrs","undefined","Comp","displayName"],"sourceRoot":"../../../src","sources":["progress-bar/ProgressBarIndicator.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,OAAO,QAAQ,OAAO;AAC3C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,IAAI,QAAQ,SAAS;AAC9B,SAASC,cAAc,QAAQ,yBAAyB;AACxD,SAASC,kBAAkB,QAAQ,WAAW;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAQ/C,OAAO,MAAMC,oBAAoB,gBAAGR,UAAU,CAC5C,CAAC;EAAES,OAAO;EAAEC,KAAK;EAAE,GAAGC;AAAK,CAAC,EAAEC,GAAG,KAAK;EACpC,MAAM;IAAEC,OAAO;IAAEC,KAAK;IAAEC,GAAG;IAAEC;EAAM,CAAC,GAAGX,kBAAkB,CAAC,CAAC;EAE3D,MAAMY,WAAW,GAAGhB,OAAO,CAAC,MAAiB;IAC3C,MAAMiB,GAAG,GAAG,GAAGC,MAAM,CAACN,OAAO,CAAC,GAAoB;IAClD,OAAO;MAAEO,KAAK,EAAEF,GAAG;MAAEG,MAAM,EAAE;IAAO,CAAC;EACvC,CAAC,EAAE,CAACR,OAAO,CAAC,CAAC;EAEb,MAAMS,SAAS,GAAGlB,cAAc,CAAC;IAC/BU,KAAK;IACLE,KAAK,EAAEA,KAAK,KAAK,IAAI,GAAGO,SAAS,GAAGJ,MAAM,CAACH,KAAK,CAAC;IACjDD,GAAG,EAAEI,MAAM,CAACJ,GAAG;EACjB,CAAC,CAAC;EAEF,MAAMS,IAAI,GAAGf,OAAO,GAAGN,IAAI,GAAGD,IAAI;EAElC,oBAAOK,IAAA,CAACiB,IAAI;IAACZ,GAAG,EAAEA,GAAI;IAAA,GAAKD,IAAI;IAAA,GAAMW,SAAS;IAAEZ,KAAK,EAAE,CAACO,WAAW,EAAEP,KAAK;EAAE,CAAE,CAAC;AACjF,CACF,CAAC;AAEDF,oBAAoB,CAACiB,WAAW,GAAG,sBAAsB","ignoreList":[]}
1
+ {"version":3,"names":["forwardRef","useEffect","useMemo","I18nManager","Animated","Easing","useAnimatedStyle","useReducedMotion","useSharedValue","withRepeat","withTiming","composeEventHandlers","Slot","dataAttributes","useProgressContext","jsx","_jsx","INDETERMINATE_WIDTH","INDETERMINATE_DURATION_MS","INDETERMINATE_FROM","INDETERMINATE_TO","ProgressBarIndicator","asChild","style","onLayout","rest","ref","percent","state","max","value","isIndeterminate","reducedMotion","travel","segmentWidth","direction","isRTL","set","duration","easing","bezier","handleLayout","event","next","nativeEvent","layout","width","get","indeterminateStyle","span","offset","height","transform","translateX","determinateStyle","pct","String","dataAttrs","undefined","Comp","View","displayName"],"sourceRoot":"../../../src","sources":["progress-bar/ProgressBarIndicator.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ProgressBarIndicator.d.ts","sourceRoot":"","sources":["../../../src/progress-bar/ProgressBarIndicator.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAkB,MAAM,cAAc,CAAC;AAOpE,MAAM,WAAW,yBAA0B,SAAQ,SAAS;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,oBAAoB,4GAmBhC,CAAC"}
1
+ {"version":3,"file":"ProgressBarIndicator.d.ts","sourceRoot":"","sources":["../../../src/progress-bar/ProgressBarIndicator.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,IAAI,EAEJ,KAAK,SAAS,EAEf,MAAM,cAAc,CAAC;AA0BtB,MAAM,WAAW,yBAA0B,SAAQ,SAAS;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,oBAAoB,4GAyEhC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdx-ui/primitives",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -69,8 +69,8 @@
69
69
  "@react-stately/disclosure": "3.1.1",
70
70
  "@react-stately/radio": "3.12.0",
71
71
  "@react-stately/toggle": "3.9.4",
72
- "@cdx-ui/formatters": "0.3.6",
73
- "@cdx-ui/utils": "0.3.6"
72
+ "@cdx-ui/formatters": "0.3.8",
73
+ "@cdx-ui/utils": "0.3.8"
74
74
  },
75
75
  "devDependencies": {
76
76
  "@types/react": "19.2.14",
@@ -1,20 +1,91 @@
1
- import { forwardRef, useMemo } from 'react';
2
- import { View, type ViewProps, type ViewStyle } from 'react-native';
1
+ import { forwardRef, useEffect, useMemo } from 'react';
2
+ import {
3
+ I18nManager,
4
+ View,
5
+ type LayoutChangeEvent,
6
+ type ViewProps,
7
+ type ViewStyle,
8
+ } from 'react-native';
9
+ import Animated, {
10
+ Easing,
11
+ useAnimatedStyle,
12
+ useReducedMotion,
13
+ useSharedValue,
14
+ withRepeat,
15
+ withTiming,
16
+ } from 'react-native-reanimated';
17
+ import { composeEventHandlers } from '@cdx-ui/utils';
3
18
  import { Slot } from '../slot';
4
19
  import { dataAttributes } from '../utils/dataAttributes';
5
20
  import { useProgressContext } from './context';
6
21
 
7
22
  type PercentString = `${number}%`;
8
23
 
24
+ /**
25
+ * HeroUI indeterminate fill: a 2/5 segment translates from -100% to 350% of its
26
+ * own width over 1.5s (`progress-bar.css`). It enters off the start edge and
27
+ * exits off the end edge; the ease holds the slow parts of that travel off-screen.
28
+ */
29
+ const INDETERMINATE_WIDTH = '40%';
30
+ const INDETERMINATE_DURATION_MS = 1500;
31
+ const INDETERMINATE_FROM = -1;
32
+ const INDETERMINATE_TO = 3.5;
33
+
9
34
  export interface ProgressBarIndicatorProps extends ViewProps {
10
35
  readonly asChild?: boolean;
11
36
  }
12
37
 
13
38
  export const ProgressBarIndicator = forwardRef<View, ProgressBarIndicatorProps>(
14
- ({ asChild, style, ...rest }, ref) => {
39
+ ({ asChild, style, onLayout, ...rest }, ref) => {
15
40
  const { percent, state, max, value } = useProgressContext();
41
+ const isIndeterminate = state === 'indeterminate';
42
+ const reducedMotion = useReducedMotion();
43
+ const travel = useSharedValue(0);
44
+ const segmentWidth = useSharedValue(0);
45
+ const direction = I18nManager.isRTL ? -1 : 1;
46
+
47
+ useEffect(() => {
48
+ if (!isIndeterminate) {
49
+ travel.set(0);
50
+ return;
51
+ }
52
+ if (reducedMotion) {
53
+ travel.set(0);
54
+ return;
55
+ }
56
+ travel.set(0);
57
+ travel.set(
58
+ withRepeat(
59
+ withTiming(1, {
60
+ duration: INDETERMINATE_DURATION_MS,
61
+ easing: Easing.bezier(0.65, 0, 0.35, 1),
62
+ }),
63
+ -1,
64
+ false,
65
+ ),
66
+ );
67
+ }, [isIndeterminate, reducedMotion, travel]);
68
+
69
+ const handleLayout = (event: LayoutChangeEvent) => {
70
+ if (!isIndeterminate) return;
71
+ const next = event.nativeEvent.layout.width;
72
+ if (segmentWidth.get() !== next) {
73
+ segmentWidth.set(next);
74
+ }
75
+ };
76
+
77
+ const indeterminateStyle = useAnimatedStyle(() => {
78
+ const width = segmentWidth.get();
79
+ const span = INDETERMINATE_TO - INDETERMINATE_FROM;
80
+ const offset = reducedMotion ? 0 : width * (INDETERMINATE_FROM + travel.get() * span);
81
+ return {
82
+ width: INDETERMINATE_WIDTH,
83
+ height: '100%',
84
+ transform: [{ translateX: direction * offset }],
85
+ };
86
+ }, [segmentWidth, travel, direction, reducedMotion]);
16
87
 
17
- const filledStyle = useMemo((): ViewStyle => {
88
+ const determinateStyle = useMemo((): ViewStyle => {
18
89
  const pct = `${String(percent)}%` as PercentString;
19
90
  return { width: pct, height: '100%' };
20
91
  }, [percent]);
@@ -25,9 +96,17 @@ export const ProgressBarIndicator = forwardRef<View, ProgressBarIndicatorProps>(
25
96
  max: String(max),
26
97
  });
27
98
 
28
- const Comp = asChild ? Slot : View;
99
+ const Comp = asChild ? Slot : Animated.View;
29
100
 
30
- return <Comp ref={ref} {...rest} {...dataAttrs} style={[filledStyle, style]} />;
101
+ return (
102
+ <Comp
103
+ ref={ref}
104
+ {...rest}
105
+ {...dataAttrs}
106
+ onLayout={composeEventHandlers(onLayout, handleLayout)}
107
+ style={[isIndeterminate ? indeterminateStyle : determinateStyle, style]}
108
+ />
109
+ );
31
110
  },
32
111
  );
33
112