@mic-rexjs/usecases-react 2.10.3 → 2.11.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.
- package/dist/index.min.js +1 -1
- package/es/hooks/useConstantEntityReducers/index.d.ts +3 -0
- package/es/hooks/useConstantEntityReducers/index.js +7 -0
- package/es/hooks/useConstantReducers/index.d.ts +3 -0
- package/es/hooks/useConstantReducers/index.js +6 -0
- package/es/hooks/useContextualItem/index.d.ts +2 -1
- package/es/hooks/useContextualItem/index.js +5 -3
- package/es/hooks/useDepsKey/index.d.ts +1 -1
- package/es/hooks/useDepsKey/index.js +2 -2
- package/es/hooks/useEntity/index.d.ts +2 -1
- package/es/hooks/useEntity/index.js +11 -3
- package/es/hooks/useFullArguments/types.d.ts +3 -3
- package/es/hooks/useRuntimeEntity/index.d.ts +2 -1
- package/es/hooks/useRuntimeEntity/index.js +4 -3
- package/es/hooks/useUseCase/index.js +13 -8
- package/es/hooks/useUseCase/index.test.js +60 -0
- package/es/hooks/useUseCase/types.d.ts +3 -3
- package/es/usecases/valueUseCase/index.js +50 -16
- package/es/usecases/valueUseCase/types.d.ts +7 -2
- package/lib/hooks/useConstantEntityReducers/index.js +13 -0
- package/lib/hooks/useConstantReducers/index.js +12 -0
- package/lib/hooks/useContextualItem/index.js +6 -4
- package/lib/hooks/useDepsKey/index.js +3 -3
- package/lib/hooks/useEntity/index.js +15 -4
- package/lib/hooks/useRuntimeEntity/index.js +6 -5
- package/lib/hooks/useUseCase/index.js +19 -11
- package/lib/hooks/useUseCase/index.test.js +152 -72
- package/lib/usecases/valueUseCase/index.js +86 -42
- package/package.json +2 -2
- package/es/hooks/useEntityReducers/index.d.ts +0 -4
- package/es/hooks/useEntityReducers/index.js +0 -18
- package/es/hooks/useReducers/index.d.ts +0 -4
- package/es/hooks/useReducers/index.js +0 -13
- package/es/methods/initEntityReducers/index.d.ts +0 -5
- package/es/methods/initEntityReducers/index.js +0 -11
- package/lib/hooks/useEntityReducers/index.js +0 -30
- package/lib/hooks/useReducers/index.js +0 -20
- package/lib/methods/initEntityReducers/index.js +0 -24
|
@@ -14,9 +14,10 @@ var _usecases = require("@mic-rexjs/usecases");
|
|
|
14
14
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
15
15
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
16
16
|
var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function () {
|
|
17
|
-
var keyIndex = 0;
|
|
18
17
|
return function () {
|
|
19
|
-
var
|
|
18
|
+
var _utilsUseCase = (0, _usecases.utilsUseCase)(),
|
|
19
|
+
createKey = _utilsUseCase.createKey;
|
|
20
|
+
var prevKeyIndex = createKey();
|
|
20
21
|
var entityReducers = (0, _usecases.entityUseCase)();
|
|
21
22
|
var hasField = function hasField(entity, field) {
|
|
22
23
|
if ((0, _typeof2["default"])(entity) !== 'object' || entity === null) {
|
|
@@ -27,7 +28,7 @@ var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function
|
|
|
27
28
|
var isValueChanged = function isValueChanged(entity, value) {
|
|
28
29
|
return entity !== value;
|
|
29
30
|
};
|
|
30
|
-
var isValueMatched = function isValueMatched(entity, value) {
|
|
31
|
+
var isValueMatched = function isValueMatched(entity, value, onMatchFailed) {
|
|
31
32
|
if (entity === value) {
|
|
32
33
|
return true;
|
|
33
34
|
}
|
|
@@ -36,23 +37,39 @@ var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function
|
|
|
36
37
|
if (!isObject1 || !isObject2) {
|
|
37
38
|
return false;
|
|
38
39
|
}
|
|
40
|
+
var allMatched = true;
|
|
39
41
|
var keys1 = Object.keys(entity);
|
|
40
42
|
var keys2 = Object.keys(value);
|
|
41
43
|
var length1 = keys1.length;
|
|
42
|
-
var
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
var
|
|
44
|
+
var keys = [].concat(keys1, keys2);
|
|
45
|
+
var hasCallback = typeof onMatchFailed === 'function';
|
|
46
|
+
for (var i = 0, length = keys.length; i < length; i++) {
|
|
47
|
+
var key = keys[i];
|
|
48
|
+
var isFromKeys2 = i >= length1;
|
|
49
|
+
var isInKey1 = keys1.includes(key);
|
|
50
|
+
var isUsed = isFromKeys2 && isInKey1;
|
|
51
|
+
if (isUsed) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
var hasField1 = Object.hasOwn(entity, key);
|
|
55
|
+
var hasField2 = Object.hasOwn(value, key);
|
|
56
|
+
var onlyHasField1 = hasField1 && !hasField2;
|
|
57
|
+
var onlyHasField2 = !hasField1 && hasField2;
|
|
58
|
+
var onlyHasOneField = onlyHasField1 || onlyHasField2;
|
|
48
59
|
var value1 = entity[key];
|
|
49
60
|
var value2 = value[key];
|
|
50
|
-
|
|
61
|
+
var matched = value1 === value2;
|
|
62
|
+
if (!onlyHasOneField && matched) {
|
|
51
63
|
continue;
|
|
52
64
|
}
|
|
53
|
-
|
|
65
|
+
allMatched = false;
|
|
66
|
+
if (hasCallback) {
|
|
67
|
+
onMatchFailed(key, value2, value1);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
54
71
|
}
|
|
55
|
-
return
|
|
72
|
+
return allMatched;
|
|
56
73
|
};
|
|
57
74
|
var matchProperty = function matchProperty(entity, value, fieldPath, onFailed) {
|
|
58
75
|
var allMatched = true;
|
|
@@ -141,56 +158,83 @@ var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function
|
|
|
141
158
|
}
|
|
142
159
|
}, recordValue);
|
|
143
160
|
});
|
|
144
|
-
var
|
|
145
|
-
var matched;
|
|
161
|
+
var recordValueDiff = /*#__PURE__*/_regenerator["default"].mark(function recordValueDiff(entity, value) {
|
|
162
|
+
var isArray1, isArray2, isArray, result, length1, length2, matched;
|
|
146
163
|
return _regenerator["default"].wrap(function (_context2) {
|
|
147
164
|
while (1) switch (_context2.prev = _context2.next) {
|
|
165
|
+
case 0:
|
|
166
|
+
isArray1 = Array.isArray(entity);
|
|
167
|
+
isArray2 = Array.isArray(value);
|
|
168
|
+
isArray = isArray1 && isArray2;
|
|
169
|
+
result = isArray ? [] : {};
|
|
170
|
+
if (isArray) {
|
|
171
|
+
length1 = entity.length;
|
|
172
|
+
length2 = value.length;
|
|
173
|
+
result.length = Math.max(length1, length2);
|
|
174
|
+
}
|
|
175
|
+
matched = isValueMatched(entity, value, function (key, newValue) {
|
|
176
|
+
result[key] = newValue;
|
|
177
|
+
});
|
|
178
|
+
if (matched) {
|
|
179
|
+
_context2.next = 1;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
_context2.next = 1;
|
|
183
|
+
return value;
|
|
184
|
+
case 1:
|
|
185
|
+
return _context2.abrupt("return", result);
|
|
186
|
+
case 2:
|
|
187
|
+
case "end":
|
|
188
|
+
return _context2.stop();
|
|
189
|
+
}
|
|
190
|
+
}, recordValueDiff);
|
|
191
|
+
});
|
|
192
|
+
var recordValueMatch = /*#__PURE__*/_regenerator["default"].mark(function recordValueMatch(entity, value) {
|
|
193
|
+
var matched;
|
|
194
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
195
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
148
196
|
case 0:
|
|
149
197
|
matched = isValueMatched(entity, value);
|
|
150
198
|
if (!matched) {
|
|
151
|
-
|
|
199
|
+
_context3.next = 1;
|
|
152
200
|
break;
|
|
153
201
|
}
|
|
154
|
-
return
|
|
202
|
+
return _context3.abrupt("return", true);
|
|
155
203
|
case 1:
|
|
156
|
-
|
|
204
|
+
_context3.next = 2;
|
|
157
205
|
return value;
|
|
158
206
|
case 2:
|
|
159
|
-
return
|
|
207
|
+
return _context3.abrupt("return", false);
|
|
160
208
|
case 3:
|
|
161
209
|
case "end":
|
|
162
|
-
return
|
|
210
|
+
return _context3.stop();
|
|
163
211
|
}
|
|
164
212
|
}, recordValueMatch);
|
|
165
213
|
});
|
|
166
|
-
var recordValueMatchWith = function recordValueMatchWith(entity, value) {
|
|
167
|
-
var
|
|
168
|
-
return
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
return _context3.stop();
|
|
185
|
-
}
|
|
186
|
-
}, _callee);
|
|
187
|
-
})();
|
|
188
|
-
};
|
|
214
|
+
var recordValueMatchWith = /*#__PURE__*/_regenerator["default"].mark(function recordValueMatchWith(entity, value, key) {
|
|
215
|
+
var matched;
|
|
216
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
217
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
218
|
+
case 0:
|
|
219
|
+
return _context4.delegateYield(recordValueMatch(entity, value), "t0", 1);
|
|
220
|
+
case 1:
|
|
221
|
+
matched = _context4.t0;
|
|
222
|
+
if (!matched) {
|
|
223
|
+
prevKeyIndex = key !== null && key !== void 0 ? key : createKey();
|
|
224
|
+
}
|
|
225
|
+
return _context4.abrupt("return", prevKeyIndex);
|
|
226
|
+
case 2:
|
|
227
|
+
case "end":
|
|
228
|
+
return _context4.stop();
|
|
229
|
+
}
|
|
230
|
+
}, recordValueMatchWith);
|
|
231
|
+
});
|
|
189
232
|
return _objectSpread(_objectSpread({}, entityReducers), {}, {
|
|
190
233
|
isValueChanged: isValueChanged,
|
|
191
234
|
isValueMatched: isValueMatched,
|
|
192
235
|
matchProperty: matchProperty,
|
|
193
236
|
recordValue: recordValue,
|
|
237
|
+
recordValueDiff: recordValueDiff,
|
|
194
238
|
recordValueMatch: recordValueMatch,
|
|
195
239
|
recordValueMatchWith: recordValueMatchWith
|
|
196
240
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mic-rexjs/usecases-react",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.11.1",
|
|
4
4
|
"description": "React-based solution for use usecases of Clean Architecture",
|
|
5
5
|
"private": false,
|
|
6
6
|
"sideEffects": false,
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"@eslint/js": "^10.0.1",
|
|
55
55
|
"@ianvs/prettier-plugin-sort-imports": "^4.7.1",
|
|
56
56
|
"@jest/globals": "^30.3.0",
|
|
57
|
-
"@mic-rexjs/usecases": "^2.
|
|
57
|
+
"@mic-rexjs/usecases": "^2.15.1",
|
|
58
58
|
"@testing-library/dom": "^10.4.1",
|
|
59
59
|
"@testing-library/react": "^16.3.2",
|
|
60
60
|
"@types/node": "^25.6.0",
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { CreateEntityReducersOptions, ScopedEntityReducers } from '@mic-rexjs/usecases/es/methods/createEntityReducers/types';
|
|
2
|
-
import { EntityReducerMap, EntityReducers, InferableEntityUseCase } from '@mic-rexjs/usecases/es/types';
|
|
3
|
-
import { Dependencies } from '../../types';
|
|
4
|
-
export declare const useEntityReducers: <T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object>(initailEntity: T, usecase: InferableEntityUseCase<T, TEntityReducers & EntityReducers<T>, TUseCaseOptions>, options?: CreateEntityReducersOptions<T, TUseCaseOptions>, deps?: Dependencies) => ScopedEntityReducers<T, EntityReducers<T, TEntityReducers>>;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { useConstant } from '../useConstant';
|
|
2
|
-
import { createEntityReducers } from '@mic-rexjs/usecases';
|
|
3
|
-
import { useCreation, useMemoizedFn } from 'ahooks';
|
|
4
|
-
import { valueUseCase } from '../../usecases/valueUseCase';
|
|
5
|
-
export const useEntityReducers = (initailEntity, usecase, options, deps = []) => {
|
|
6
|
-
const { recordValueMatchWith } = useConstant(() => {
|
|
7
|
-
return createEntityReducers(deps, valueUseCase);
|
|
8
|
-
});
|
|
9
|
-
const [, depsKey] = recordValueMatchWith(deps);
|
|
10
|
-
const onCreate = useMemoizedFn(() => {
|
|
11
|
-
return createEntityReducers(initailEntity, usecase, options);
|
|
12
|
-
});
|
|
13
|
-
return useCreation(() => {
|
|
14
|
-
void depsKey;
|
|
15
|
-
void usecase;
|
|
16
|
-
return onCreate();
|
|
17
|
-
}, [depsKey, usecase, onCreate]);
|
|
18
|
-
};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { NonEntitySymbolSet } from '../useUseCase/types';
|
|
2
|
-
import { ReducerMap, SymbolSetTarget, UseCase } from '@mic-rexjs/usecases/es/types';
|
|
3
|
-
import { Dependencies } from '../../types';
|
|
4
|
-
export declare const useReducers: <T extends ReducerMap, TUseCaseOptions extends object = object>(usecase: UseCase<T & SymbolSetTarget<NonEntitySymbolSet>, TUseCaseOptions>, options?: TUseCaseOptions, deps?: Dependencies) => T;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { useDepsKey } from '../useDepsKey';
|
|
2
|
-
import { useCreation, useMemoizedFn } from 'ahooks';
|
|
3
|
-
export const useReducers = (usecase, options, deps = []) => {
|
|
4
|
-
const depsKey = useDepsKey(deps);
|
|
5
|
-
const onCreate = useMemoizedFn(() => {
|
|
6
|
-
return usecase(options);
|
|
7
|
-
});
|
|
8
|
-
return useCreation(() => {
|
|
9
|
-
void depsKey;
|
|
10
|
-
void usecase;
|
|
11
|
-
return onCreate();
|
|
12
|
-
}, [depsKey, usecase, onCreate]);
|
|
13
|
-
};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { UseCaseHookOptions } from '../../hooks/useUseCase/types';
|
|
2
|
-
import { EntityStore } from '@mic-rexjs/usecases';
|
|
3
|
-
import { EntityReducerMap, InferableEntityUseCase } from '@mic-rexjs/usecases/es/types';
|
|
4
|
-
import { ContextualEntityReducers } from '../../usecases/contextUseCase/types';
|
|
5
|
-
export declare const initEntityReducers: <T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object>(usecase: InferableEntityUseCase<T, TEntityReducers, TUseCaseOptions>, store: EntityStore<T>, options: UseCaseHookOptions<T, TUseCaseOptions>) => ContextualEntityReducers<T, TEntityReducers>;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createEntityReducers } from '@mic-rexjs/usecases';
|
|
2
|
-
export const initEntityReducers = (usecase, store, options) => {
|
|
3
|
-
const { watch, onChange, options: usecaseOptions, ...restUseCaseOptions } = options;
|
|
4
|
-
return createEntityReducers(store, usecase, {
|
|
5
|
-
...restUseCaseOptions,
|
|
6
|
-
...usecaseOptions,
|
|
7
|
-
onGenerate(newEntity, result) {
|
|
8
|
-
return result;
|
|
9
|
-
},
|
|
10
|
-
});
|
|
11
|
-
};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.useEntityReducers = void 0;
|
|
8
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
-
var _useConstant2 = require("../useConstant");
|
|
10
|
-
var _usecases = require("@mic-rexjs/usecases");
|
|
11
|
-
var _ahooks = require("ahooks");
|
|
12
|
-
var _valueUseCase = require("../../usecases/valueUseCase");
|
|
13
|
-
var useEntityReducers = exports.useEntityReducers = function useEntityReducers(initailEntity, usecase, options) {
|
|
14
|
-
var deps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
15
|
-
var _useConstant = (0, _useConstant2.useConstant)(function () {
|
|
16
|
-
return (0, _usecases.createEntityReducers)(deps, _valueUseCase.valueUseCase);
|
|
17
|
-
}),
|
|
18
|
-
recordValueMatchWith = _useConstant.recordValueMatchWith;
|
|
19
|
-
var _recordValueMatchWith = recordValueMatchWith(deps),
|
|
20
|
-
_recordValueMatchWith2 = (0, _slicedToArray2["default"])(_recordValueMatchWith, 2),
|
|
21
|
-
depsKey = _recordValueMatchWith2[1];
|
|
22
|
-
var onCreate = (0, _ahooks.useMemoizedFn)(function () {
|
|
23
|
-
return (0, _usecases.createEntityReducers)(initailEntity, usecase, options);
|
|
24
|
-
});
|
|
25
|
-
return (0, _ahooks.useCreation)(function () {
|
|
26
|
-
void depsKey;
|
|
27
|
-
void usecase;
|
|
28
|
-
return onCreate();
|
|
29
|
-
}, [depsKey, usecase, onCreate]);
|
|
30
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.useReducers = void 0;
|
|
7
|
-
var _useDepsKey = require("../useDepsKey");
|
|
8
|
-
var _ahooks = require("ahooks");
|
|
9
|
-
var useReducers = exports.useReducers = function useReducers(usecase, options) {
|
|
10
|
-
var deps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
11
|
-
var depsKey = (0, _useDepsKey.useDepsKey)(deps);
|
|
12
|
-
var onCreate = (0, _ahooks.useMemoizedFn)(function () {
|
|
13
|
-
return usecase(options);
|
|
14
|
-
});
|
|
15
|
-
return (0, _ahooks.useCreation)(function () {
|
|
16
|
-
void depsKey;
|
|
17
|
-
void usecase;
|
|
18
|
-
return onCreate();
|
|
19
|
-
}, [depsKey, usecase, onCreate]);
|
|
20
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.initEntityReducers = void 0;
|
|
8
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
-
var _usecases = require("@mic-rexjs/usecases");
|
|
11
|
-
var _excluded = ["watch", "onChange", "options"];
|
|
12
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
-
var initEntityReducers = exports.initEntityReducers = function initEntityReducers(usecase, store, options) {
|
|
15
|
-
var watch = options.watch,
|
|
16
|
-
onChange = options.onChange,
|
|
17
|
-
usecaseOptions = options.options,
|
|
18
|
-
restUseCaseOptions = (0, _objectWithoutProperties2["default"])(options, _excluded);
|
|
19
|
-
return (0, _usecases.createEntityReducers)(store, usecase, _objectSpread(_objectSpread(_objectSpread({}, restUseCaseOptions), usecaseOptions), {}, {
|
|
20
|
-
onGenerate: function onGenerate(newEntity, result) {
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
|
-
}));
|
|
24
|
-
};
|