@alfalab/core-components-phone-input 7.2.2 → 7.2.4
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/Component.js +11 -4
- package/cssm/Component.js +11 -4
- package/cssm/utils/index.d.ts +2 -1
- package/cssm/utils/index.js +17 -0
- package/esm/Component.js +12 -5
- package/esm/utils/index.d.ts +2 -1
- package/esm/utils/index.js +17 -1
- package/modern/Component.js +13 -5
- package/modern/utils/index.d.ts +2 -1
- package/modern/utils/index.js +17 -1
- package/package.json +2 -2
- package/src/Component.tsx +17 -6
- package/src/utils/index.ts +18 -0
- package/utils/index.d.ts +2 -1
- package/utils/index.js +17 -0
package/Component.js
CHANGED
|
@@ -38,6 +38,17 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
|
|
|
38
38
|
var inputRef = React.useRef(null);
|
|
39
39
|
var handleBeforeDisplay = React.useCallback(function (conformedValue, config) {
|
|
40
40
|
var rawValue = config.rawValue, previousConformedValue = config.previousConformedValue, currentCaretPosition = config.currentCaretPosition;
|
|
41
|
+
var previousValueWithoutFormatting = previousConformedValue
|
|
42
|
+
? utils_index.deleteFormatting(previousConformedValue)
|
|
43
|
+
: '';
|
|
44
|
+
/*
|
|
45
|
+
* Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
|
|
46
|
+
*/
|
|
47
|
+
if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
|
|
48
|
+
var newRaw = utils_index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
|
|
49
|
+
conformedValue = textMaskCore.conformToMask(newRaw, mask, config).conformedValue;
|
|
50
|
+
}
|
|
51
|
+
var currentValueWithoutFormatting = utils_index.deleteFormatting(conformedValue) || '';
|
|
41
52
|
/*
|
|
42
53
|
* код ниже нужен для фикса следующих багов библиотеки text-mask:
|
|
43
54
|
* 1) так как код страны указан в маске жестко как "+7",
|
|
@@ -46,10 +57,6 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
|
|
|
46
57
|
* при редактировании цифр рядом с этими символами каретка перескакивает через них,
|
|
47
58
|
* а не остается на том же месте, на котором была до редактирования
|
|
48
59
|
*/
|
|
49
|
-
var previousValueWithoutFormatting = previousConformedValue
|
|
50
|
-
? utils_index.deleteFormatting(previousConformedValue)
|
|
51
|
-
: '';
|
|
52
|
-
var currentValueWithoutFormatting = utils_index.deleteFormatting(conformedValue) || '';
|
|
53
60
|
if (previousConformedValue &&
|
|
54
61
|
(([3, 6].includes(currentCaretPosition) &&
|
|
55
62
|
Math.abs(previousValueWithoutFormatting.length -
|
package/cssm/Component.js
CHANGED
|
@@ -38,6 +38,17 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
|
|
|
38
38
|
var inputRef = React.useRef(null);
|
|
39
39
|
var handleBeforeDisplay = React.useCallback(function (conformedValue, config) {
|
|
40
40
|
var rawValue = config.rawValue, previousConformedValue = config.previousConformedValue, currentCaretPosition = config.currentCaretPosition;
|
|
41
|
+
var previousValueWithoutFormatting = previousConformedValue
|
|
42
|
+
? utils_index.deleteFormatting(previousConformedValue)
|
|
43
|
+
: '';
|
|
44
|
+
/*
|
|
45
|
+
* Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
|
|
46
|
+
*/
|
|
47
|
+
if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
|
|
48
|
+
var newRaw = utils_index.deleteMaskChar(previousValueWithoutFormatting, rawValue);
|
|
49
|
+
conformedValue = textMaskCore.conformToMask(newRaw, mask, config).conformedValue;
|
|
50
|
+
}
|
|
51
|
+
var currentValueWithoutFormatting = utils_index.deleteFormatting(conformedValue) || '';
|
|
41
52
|
/*
|
|
42
53
|
* код ниже нужен для фикса следующих багов библиотеки text-mask:
|
|
43
54
|
* 1) так как код страны указан в маске жестко как "+7",
|
|
@@ -46,10 +57,6 @@ var PhoneInput = React__default.default.forwardRef(function (_a, ref) {
|
|
|
46
57
|
* при редактировании цифр рядом с этими символами каретка перескакивает через них,
|
|
47
58
|
* а не остается на том же месте, на котором была до редактирования
|
|
48
59
|
*/
|
|
49
|
-
var previousValueWithoutFormatting = previousConformedValue
|
|
50
|
-
? utils_index.deleteFormatting(previousConformedValue)
|
|
51
|
-
: '';
|
|
52
|
-
var currentValueWithoutFormatting = utils_index.deleteFormatting(conformedValue) || '';
|
|
53
60
|
if (previousConformedValue &&
|
|
54
61
|
(([3, 6].includes(currentCaretPosition) &&
|
|
55
62
|
Math.abs(previousValueWithoutFormatting.length -
|
package/cssm/utils/index.d.ts
CHANGED
|
@@ -14,4 +14,5 @@ declare function getInsertedNumber({ rawValue, clearableCountryCode, countryPref
|
|
|
14
14
|
countryPrefix: string;
|
|
15
15
|
previousConformedValue: string;
|
|
16
16
|
}): string;
|
|
17
|
-
|
|
17
|
+
declare function deleteMaskChar(previousValue: string, rawValue: string): string;
|
|
18
|
+
export { deleteFormatting, setCaretPosition, getInsertedNumber, deleteMaskChar };
|
package/cssm/utils/index.js
CHANGED
|
@@ -27,7 +27,24 @@ function getInsertedNumber(_a) {
|
|
|
27
27
|
}
|
|
28
28
|
return rawValue;
|
|
29
29
|
}
|
|
30
|
+
function deleteMaskChar(previousValue, rawValue) {
|
|
31
|
+
var prevRawValueAsArr = deleteFormatting(rawValue).split('').reverse();
|
|
32
|
+
var prevConformedCharIdx = previousValue.length - 1;
|
|
33
|
+
var isMaskRemoved = false;
|
|
34
|
+
var newRaw = [];
|
|
35
|
+
prevRawValueAsArr.forEach(function (char) {
|
|
36
|
+
if (isMaskRemoved || char === previousValue[prevConformedCharIdx]) {
|
|
37
|
+
newRaw.push(char);
|
|
38
|
+
prevConformedCharIdx -= 1;
|
|
39
|
+
}
|
|
40
|
+
else if (char === '7') {
|
|
41
|
+
isMaskRemoved = true;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return newRaw.reverse().join('');
|
|
45
|
+
}
|
|
30
46
|
|
|
31
47
|
exports.deleteFormatting = deleteFormatting;
|
|
48
|
+
exports.deleteMaskChar = deleteMaskChar;
|
|
32
49
|
exports.getInsertedNumber = getInsertedNumber;
|
|
33
50
|
exports.setCaretPosition = setCaretPosition;
|
package/esm/Component.js
CHANGED
|
@@ -3,7 +3,7 @@ import React, { useRef, useCallback } from 'react';
|
|
|
3
3
|
import mergeRefs from 'react-merge-refs';
|
|
4
4
|
import { conformToMask } from 'text-mask-core';
|
|
5
5
|
import { MaskedInput } from '@alfalab/core-components-masked-input/esm';
|
|
6
|
-
import { deleteFormatting, setCaretPosition, getInsertedNumber } from './utils/index.js';
|
|
6
|
+
import { deleteFormatting, deleteMaskChar, setCaretPosition, getInsertedNumber } from './utils/index.js';
|
|
7
7
|
|
|
8
8
|
var mask = [
|
|
9
9
|
'+',
|
|
@@ -29,6 +29,17 @@ var PhoneInput = React.forwardRef(function (_a, ref) {
|
|
|
29
29
|
var inputRef = useRef(null);
|
|
30
30
|
var handleBeforeDisplay = useCallback(function (conformedValue, config) {
|
|
31
31
|
var rawValue = config.rawValue, previousConformedValue = config.previousConformedValue, currentCaretPosition = config.currentCaretPosition;
|
|
32
|
+
var previousValueWithoutFormatting = previousConformedValue
|
|
33
|
+
? deleteFormatting(previousConformedValue)
|
|
34
|
+
: '';
|
|
35
|
+
/*
|
|
36
|
+
* Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
|
|
37
|
+
*/
|
|
38
|
+
if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
|
|
39
|
+
var newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);
|
|
40
|
+
conformedValue = conformToMask(newRaw, mask, config).conformedValue;
|
|
41
|
+
}
|
|
42
|
+
var currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';
|
|
32
43
|
/*
|
|
33
44
|
* код ниже нужен для фикса следующих багов библиотеки text-mask:
|
|
34
45
|
* 1) так как код страны указан в маске жестко как "+7",
|
|
@@ -37,10 +48,6 @@ var PhoneInput = React.forwardRef(function (_a, ref) {
|
|
|
37
48
|
* при редактировании цифр рядом с этими символами каретка перескакивает через них,
|
|
38
49
|
* а не остается на том же месте, на котором была до редактирования
|
|
39
50
|
*/
|
|
40
|
-
var previousValueWithoutFormatting = previousConformedValue
|
|
41
|
-
? deleteFormatting(previousConformedValue)
|
|
42
|
-
: '';
|
|
43
|
-
var currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';
|
|
44
51
|
if (previousConformedValue &&
|
|
45
52
|
(([3, 6].includes(currentCaretPosition) &&
|
|
46
53
|
Math.abs(previousValueWithoutFormatting.length -
|
package/esm/utils/index.d.ts
CHANGED
|
@@ -14,4 +14,5 @@ declare function getInsertedNumber({ rawValue, clearableCountryCode, countryPref
|
|
|
14
14
|
countryPrefix: string;
|
|
15
15
|
previousConformedValue: string;
|
|
16
16
|
}): string;
|
|
17
|
-
|
|
17
|
+
declare function deleteMaskChar(previousValue: string, rawValue: string): string;
|
|
18
|
+
export { deleteFormatting, setCaretPosition, getInsertedNumber, deleteMaskChar };
|
package/esm/utils/index.js
CHANGED
|
@@ -23,5 +23,21 @@ function getInsertedNumber(_a) {
|
|
|
23
23
|
}
|
|
24
24
|
return rawValue;
|
|
25
25
|
}
|
|
26
|
+
function deleteMaskChar(previousValue, rawValue) {
|
|
27
|
+
var prevRawValueAsArr = deleteFormatting(rawValue).split('').reverse();
|
|
28
|
+
var prevConformedCharIdx = previousValue.length - 1;
|
|
29
|
+
var isMaskRemoved = false;
|
|
30
|
+
var newRaw = [];
|
|
31
|
+
prevRawValueAsArr.forEach(function (char) {
|
|
32
|
+
if (isMaskRemoved || char === previousValue[prevConformedCharIdx]) {
|
|
33
|
+
newRaw.push(char);
|
|
34
|
+
prevConformedCharIdx -= 1;
|
|
35
|
+
}
|
|
36
|
+
else if (char === '7') {
|
|
37
|
+
isMaskRemoved = true;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return newRaw.reverse().join('');
|
|
41
|
+
}
|
|
26
42
|
|
|
27
|
-
export { deleteFormatting, getInsertedNumber, setCaretPosition };
|
|
43
|
+
export { deleteFormatting, deleteMaskChar, getInsertedNumber, setCaretPosition };
|
package/modern/Component.js
CHANGED
|
@@ -2,8 +2,9 @@ import React, { useRef, useCallback } from 'react';
|
|
|
2
2
|
import mergeRefs from 'react-merge-refs';
|
|
3
3
|
import { conformToMask } from 'text-mask-core';
|
|
4
4
|
import { MaskedInput } from '@alfalab/core-components-masked-input/modern';
|
|
5
|
-
import { deleteFormatting, setCaretPosition, getInsertedNumber } from './utils/index.js';
|
|
5
|
+
import { deleteFormatting, deleteMaskChar, setCaretPosition, getInsertedNumber } from './utils/index.js';
|
|
6
6
|
|
|
7
|
+
/* eslint-disable complexity, no-param-reassign */
|
|
7
8
|
const mask = [
|
|
8
9
|
'+',
|
|
9
10
|
'7',
|
|
@@ -27,6 +28,17 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
|
|
|
27
28
|
const inputRef = useRef(null);
|
|
28
29
|
const handleBeforeDisplay = useCallback((conformedValue, config) => {
|
|
29
30
|
const { rawValue, previousConformedValue, currentCaretPosition } = config;
|
|
31
|
+
const previousValueWithoutFormatting = previousConformedValue
|
|
32
|
+
? deleteFormatting(previousConformedValue)
|
|
33
|
+
: '';
|
|
34
|
+
/*
|
|
35
|
+
* Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
|
|
36
|
+
*/
|
|
37
|
+
if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
|
|
38
|
+
const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);
|
|
39
|
+
conformedValue = conformToMask(newRaw, mask, config).conformedValue;
|
|
40
|
+
}
|
|
41
|
+
const currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';
|
|
30
42
|
/*
|
|
31
43
|
* код ниже нужен для фикса следующих багов библиотеки text-mask:
|
|
32
44
|
* 1) так как код страны указан в маске жестко как "+7",
|
|
@@ -35,10 +47,6 @@ const PhoneInput = React.forwardRef(({ clearableCountryCode = true, ...restProps
|
|
|
35
47
|
* при редактировании цифр рядом с этими символами каретка перескакивает через них,
|
|
36
48
|
* а не остается на том же месте, на котором была до редактирования
|
|
37
49
|
*/
|
|
38
|
-
const previousValueWithoutFormatting = previousConformedValue
|
|
39
|
-
? deleteFormatting(previousConformedValue)
|
|
40
|
-
: '';
|
|
41
|
-
const currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';
|
|
42
50
|
if (previousConformedValue &&
|
|
43
51
|
(([3, 6].includes(currentCaretPosition) &&
|
|
44
52
|
Math.abs(previousValueWithoutFormatting.length -
|
package/modern/utils/index.d.ts
CHANGED
|
@@ -14,4 +14,5 @@ declare function getInsertedNumber({ rawValue, clearableCountryCode, countryPref
|
|
|
14
14
|
countryPrefix: string;
|
|
15
15
|
previousConformedValue: string;
|
|
16
16
|
}): string;
|
|
17
|
-
|
|
17
|
+
declare function deleteMaskChar(previousValue: string, rawValue: string): string;
|
|
18
|
+
export { deleteFormatting, setCaretPosition, getInsertedNumber, deleteMaskChar };
|
package/modern/utils/index.js
CHANGED
|
@@ -19,5 +19,21 @@ function getInsertedNumber({ rawValue, clearableCountryCode, countryPrefix, prev
|
|
|
19
19
|
}
|
|
20
20
|
return rawValue;
|
|
21
21
|
}
|
|
22
|
+
function deleteMaskChar(previousValue, rawValue) {
|
|
23
|
+
const prevRawValueAsArr = deleteFormatting(rawValue).split('').reverse();
|
|
24
|
+
let prevConformedCharIdx = previousValue.length - 1;
|
|
25
|
+
let isMaskRemoved = false;
|
|
26
|
+
const newRaw = [];
|
|
27
|
+
prevRawValueAsArr.forEach((char) => {
|
|
28
|
+
if (isMaskRemoved || char === previousValue[prevConformedCharIdx]) {
|
|
29
|
+
newRaw.push(char);
|
|
30
|
+
prevConformedCharIdx -= 1;
|
|
31
|
+
}
|
|
32
|
+
else if (char === '7') {
|
|
33
|
+
isMaskRemoved = true;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return newRaw.reverse().join('');
|
|
37
|
+
}
|
|
22
38
|
|
|
23
|
-
export { deleteFormatting, getInsertedNumber, setCaretPosition };
|
|
39
|
+
export { deleteFormatting, deleteMaskChar, getInsertedNumber, setCaretPosition };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alfalab/core-components-phone-input",
|
|
3
|
-
"version": "7.2.
|
|
3
|
+
"version": "7.2.4",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"react": "^16.9.0 || ^17.0.1 || ^18.0.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@alfalab/core-components-masked-input": "^6.2.
|
|
17
|
+
"@alfalab/core-components-masked-input": "^6.2.3",
|
|
18
18
|
"react-merge-refs": "^1.1.0",
|
|
19
19
|
"text-mask-core": "^5.1.2",
|
|
20
20
|
"tslib": "^2.4.0"
|
package/src/Component.tsx
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
/* eslint-disable complexity, no-param-reassign */
|
|
1
2
|
import React, { useCallback, useRef } from 'react';
|
|
2
3
|
import mergeRefs from 'react-merge-refs';
|
|
3
4
|
import { conformToMask, TextMaskConfig } from 'text-mask-core';
|
|
4
5
|
|
|
5
6
|
import { MaskedInput, MaskedInputProps } from '@alfalab/core-components-masked-input';
|
|
6
7
|
|
|
7
|
-
import { deleteFormatting, getInsertedNumber, setCaretPosition } from './utils';
|
|
8
|
+
import { deleteFormatting, deleteMaskChar, getInsertedNumber, setCaretPosition } from './utils';
|
|
8
9
|
|
|
9
10
|
const mask = [
|
|
10
11
|
'+',
|
|
@@ -39,6 +40,21 @@ export const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(
|
|
|
39
40
|
(conformedValue: string, config: TextMaskConfig) => {
|
|
40
41
|
const { rawValue, previousConformedValue, currentCaretPosition } = config;
|
|
41
42
|
|
|
43
|
+
const previousValueWithoutFormatting = previousConformedValue
|
|
44
|
+
? deleteFormatting(previousConformedValue)
|
|
45
|
+
: '';
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* Удаляем лишний символ маски при вводе или вставке значений перед знаком + или после него.
|
|
49
|
+
*/
|
|
50
|
+
if (previousConformedValue && rawValue.indexOf('+7') !== 0) {
|
|
51
|
+
const newRaw = deleteMaskChar(previousValueWithoutFormatting, rawValue);
|
|
52
|
+
|
|
53
|
+
conformedValue = conformToMask(newRaw, mask, config).conformedValue;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';
|
|
57
|
+
|
|
42
58
|
/*
|
|
43
59
|
* код ниже нужен для фикса следующих багов библиотеки text-mask:
|
|
44
60
|
* 1) так как код страны указан в маске жестко как "+7",
|
|
@@ -47,11 +63,6 @@ export const PhoneInput = React.forwardRef<HTMLInputElement, PhoneInputProps>(
|
|
|
47
63
|
* при редактировании цифр рядом с этими символами каретка перескакивает через них,
|
|
48
64
|
* а не остается на том же месте, на котором была до редактирования
|
|
49
65
|
*/
|
|
50
|
-
const previousValueWithoutFormatting = previousConformedValue
|
|
51
|
-
? deleteFormatting(previousConformedValue)
|
|
52
|
-
: '';
|
|
53
|
-
const currentValueWithoutFormatting = deleteFormatting(conformedValue) || '';
|
|
54
|
-
|
|
55
66
|
if (
|
|
56
67
|
previousConformedValue &&
|
|
57
68
|
(([3, 6].includes(currentCaretPosition) &&
|
package/src/utils/index.ts
CHANGED
|
@@ -41,3 +41,21 @@ export function getInsertedNumber({
|
|
|
41
41
|
|
|
42
42
|
return rawValue;
|
|
43
43
|
}
|
|
44
|
+
|
|
45
|
+
export function deleteMaskChar(previousValue: string, rawValue: string) {
|
|
46
|
+
const prevRawValueAsArr = deleteFormatting(rawValue).split('').reverse();
|
|
47
|
+
let prevConformedCharIdx = previousValue.length - 1;
|
|
48
|
+
let isMaskRemoved = false;
|
|
49
|
+
const newRaw: string[] = [];
|
|
50
|
+
|
|
51
|
+
prevRawValueAsArr.forEach((char) => {
|
|
52
|
+
if (isMaskRemoved || char === previousValue[prevConformedCharIdx]) {
|
|
53
|
+
newRaw.push(char);
|
|
54
|
+
prevConformedCharIdx -= 1;
|
|
55
|
+
} else if (char === '7') {
|
|
56
|
+
isMaskRemoved = true;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return newRaw.reverse().join('');
|
|
61
|
+
}
|
package/utils/index.d.ts
CHANGED
|
@@ -14,4 +14,5 @@ declare function getInsertedNumber({ rawValue, clearableCountryCode, countryPref
|
|
|
14
14
|
countryPrefix: string;
|
|
15
15
|
previousConformedValue: string;
|
|
16
16
|
}): string;
|
|
17
|
-
|
|
17
|
+
declare function deleteMaskChar(previousValue: string, rawValue: string): string;
|
|
18
|
+
export { deleteFormatting, setCaretPosition, getInsertedNumber, deleteMaskChar };
|
package/utils/index.js
CHANGED
|
@@ -27,7 +27,24 @@ function getInsertedNumber(_a) {
|
|
|
27
27
|
}
|
|
28
28
|
return rawValue;
|
|
29
29
|
}
|
|
30
|
+
function deleteMaskChar(previousValue, rawValue) {
|
|
31
|
+
var prevRawValueAsArr = deleteFormatting(rawValue).split('').reverse();
|
|
32
|
+
var prevConformedCharIdx = previousValue.length - 1;
|
|
33
|
+
var isMaskRemoved = false;
|
|
34
|
+
var newRaw = [];
|
|
35
|
+
prevRawValueAsArr.forEach(function (char) {
|
|
36
|
+
if (isMaskRemoved || char === previousValue[prevConformedCharIdx]) {
|
|
37
|
+
newRaw.push(char);
|
|
38
|
+
prevConformedCharIdx -= 1;
|
|
39
|
+
}
|
|
40
|
+
else if (char === '7') {
|
|
41
|
+
isMaskRemoved = true;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
return newRaw.reverse().join('');
|
|
45
|
+
}
|
|
30
46
|
|
|
31
47
|
exports.deleteFormatting = deleteFormatting;
|
|
48
|
+
exports.deleteMaskChar = deleteMaskChar;
|
|
32
49
|
exports.getInsertedNumber = getInsertedNumber;
|
|
33
50
|
exports.setCaretPosition = setCaretPosition;
|