@xyo-network/xl1-cli-lib 1.15.2 → 1.15.3
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/README.md +364 -236
- package/dist/node/commands/bridge/index.d.ts +2 -0
- package/dist/node/commands/bridge/index.d.ts.map +1 -0
- package/dist/node/commands/bridge/runBridge.d.ts +9 -0
- package/dist/node/commands/bridge/runBridge.d.ts.map +1 -0
- package/dist/node/commands/index.d.ts +1 -0
- package/dist/node/commands/index.d.ts.map +1 -1
- package/dist/node/index.mjs +58 -101
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts +1 -1
- package/dist/node/orchestration/archivists/lib/localPersistentArchivist.d.ts.map +1 -1
- package/dist/node/orchestration/initServices.d.ts +1 -1
- package/dist/node/orchestration/initServices.d.ts.map +1 -1
- package/dist/node/orchestration/map/BalanceSummary/initBalanceSummaryMap.d.ts +2 -4
- package/dist/node/orchestration/map/BalanceSummary/initBalanceSummaryMap.d.ts.map +1 -1
- package/dist/node/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.d.ts +2 -4
- package/dist/node/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.d.ts.map +1 -1
- package/dist/node/orchestration/map/BalanceSummary/initLocalTransferSummaryMap.d.ts +2 -4
- package/dist/node/orchestration/map/BalanceSummary/initLocalTransferSummaryMap.d.ts.map +1 -1
- package/dist/node/orchestration/map/BalanceSummary/initTransferSummaryMap.d.ts +2 -4
- package/dist/node/orchestration/map/BalanceSummary/initTransferSummaryMap.d.ts.map +1 -1
- package/dist/node/orchestration/map/index.d.ts +0 -1
- package/dist/node/orchestration/map/index.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/balance.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts +2 -2
- package/dist/node/orchestration/services/implementation/head/createForkedHead/config/getBridgeSourceDetails.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/head/head.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/index.d.ts +1 -0
- package/dist/node/orchestration/services/implementation/index.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/iterator.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/producer.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/transfer.d.ts.map +1 -1
- package/dist/node/orchestration/services/implementation/validator.d.ts.map +1 -1
- package/dist/node/runCLI.d.ts.map +1 -1
- package/dist/node/xl1.mjs +57 -101
- package/dist/node/xl1.mjs.map +1 -1
- package/package.json +36 -32
- package/src/commands/bridge/index.ts +1 -0
- package/src/commands/bridge/runBridge.ts +12 -0
- package/src/commands/index.ts +1 -0
- package/src/orchestration/archivists/lib/localPersistentArchivist.ts +1 -3
- package/src/orchestration/initServices.ts +22 -7
- package/src/orchestration/map/BalanceSummary/initBalanceSummaryMap.ts +3 -5
- package/src/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.ts +5 -7
- package/src/orchestration/map/BalanceSummary/initLocalTransferSummaryMap.ts +5 -7
- package/src/orchestration/map/BalanceSummary/initTransferSummaryMap.ts +3 -5
- package/src/orchestration/map/index.ts +0 -1
- package/src/orchestration/services/implementation/balance.ts +5 -5
- package/src/orchestration/services/implementation/head/head.ts +28 -28
- package/src/orchestration/services/implementation/index.ts +1 -0
- package/src/orchestration/services/implementation/iterator.ts +10 -10
- package/src/orchestration/services/implementation/producer.ts +5 -5
- package/src/orchestration/services/implementation/transfer.ts +5 -5
- package/src/orchestration/services/implementation/validator.ts +5 -5
- package/src/runCLI.ts +10 -1
- package/dist/node/orchestration/map/driver/index.d.ts +0 -2
- package/dist/node/orchestration/map/driver/index.d.ts.map +0 -1
- package/dist/node/orchestration/map/driver/lmdb/Params.d.ts +0 -7
- package/dist/node/orchestration/map/driver/lmdb/Params.d.ts.map +0 -1
- package/dist/node/orchestration/map/driver/lmdb/SynchronousLmdbMap.d.ts +0 -32
- package/dist/node/orchestration/map/driver/lmdb/SynchronousLmdbMap.d.ts.map +0 -1
- package/dist/node/orchestration/map/driver/lmdb/index.d.ts +0 -2
- package/dist/node/orchestration/map/driver/lmdb/index.d.ts.map +0 -1
- package/dist/node/orchestration/map/driver/lmdb/spec/SynchronousLmdbMap.spec.d.ts +0 -2
- package/dist/node/orchestration/map/driver/lmdb/spec/SynchronousLmdbMap.spec.d.ts.map +0 -1
- package/dist/node/orchestration/map/localPersistentMap.d.ts +0 -13
- package/dist/node/orchestration/map/localPersistentMap.d.ts.map +0 -1
- package/dist/node/orchestration/store/StoreKind.d.ts +0 -2
- package/dist/node/orchestration/store/StoreKind.d.ts.map +0 -1
- package/dist/node/orchestration/store/getStoreDirectory.d.ts +0 -10
- package/dist/node/orchestration/store/getStoreDirectory.d.ts.map +0 -1
- package/dist/node/orchestration/store/index.d.ts +0 -3
- package/dist/node/orchestration/store/index.d.ts.map +0 -1
- package/src/orchestration/map/driver/index.ts +0 -1
- package/src/orchestration/map/driver/lmdb/Params.ts +0 -7
- package/src/orchestration/map/driver/lmdb/SynchronousLmdbMap.ts +0 -66
- package/src/orchestration/map/driver/lmdb/index.ts +0 -1
- package/src/orchestration/map/driver/lmdb/spec/SynchronousLmdbMap.spec.ts +0 -97
- package/src/orchestration/map/localPersistentMap.ts +0 -52
- package/src/orchestration/store/StoreKind.ts +0 -1
- package/src/orchestration/store/getStoreDirectory.ts +0 -14
- package/src/orchestration/store/index.ts +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/bridge/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Logger } from '@xylabs/logger';
|
|
2
|
+
import type { Config } from '@xyo-network/xl1-protocol-sdk';
|
|
3
|
+
interface RunBridgeContext {
|
|
4
|
+
config: Config;
|
|
5
|
+
logger?: Logger;
|
|
6
|
+
}
|
|
7
|
+
export declare function runBridge(context: RunBridgeContext): void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=runBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runBridge.d.ts","sourceRoot":"","sources":["../../../../src/commands/bridge/runBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAE3D,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,QAElD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -528,9 +528,10 @@ var initHealthEndpoints = /* @__PURE__ */ __name((params) => {
|
|
|
528
528
|
|
|
529
529
|
// src/orchestration/initServices.ts
|
|
530
530
|
import { assertEx as assertEx18 } from "@xylabs/assert";
|
|
531
|
-
import { asAddress as asAddress2 } from "@xylabs/hex";
|
|
531
|
+
import { asAddress as asAddress2, ZERO_HASH } from "@xylabs/hex";
|
|
532
532
|
import { isDefined as isDefined14 } from "@xylabs/typeof";
|
|
533
|
-
import {
|
|
533
|
+
import { initTelemetry, startupSpanAsync as startupSpanAsync8, validateHydratedBlockState } from "@xyo-network/chain-sdk";
|
|
534
|
+
import { readPayloadMapFromStore } from "@xyo-network/xl1-protocol-sdk";
|
|
534
535
|
|
|
535
536
|
// src/orchestration/archivists/ChainFinalized/archivist.ts
|
|
536
537
|
import { initArchivistSync, startupSpanAsync } from "@xyo-network/chain-sdk";
|
|
@@ -541,17 +542,10 @@ import { Mutex as Mutex2 } from "async-mutex";
|
|
|
541
542
|
|
|
542
543
|
// src/orchestration/archivists/lib/localPersistentArchivist.ts
|
|
543
544
|
import { rm } from "fs/promises";
|
|
544
|
-
import Path2 from "path";
|
|
545
|
-
import { LmdbArchivist, LmdbArchivistConfigSchema } from "@xyo-network/archivist-lmdb";
|
|
546
|
-
|
|
547
|
-
// src/orchestration/store/getStoreDirectory.ts
|
|
548
545
|
import Path from "path";
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
// src/orchestration/archivists/lib/localPersistentArchivist.ts
|
|
554
|
-
var DEFAULT_STORAGE_ROOT = Path2.join(process.cwd(), ".store");
|
|
546
|
+
import { LmdbArchivist, LmdbArchivistConfigSchema } from "@xyo-network/archivist-lmdb";
|
|
547
|
+
import { getStoreDirectory } from "@xyo-network/chain-sdk";
|
|
548
|
+
var DEFAULT_STORAGE_ROOT = Path.join(process.cwd(), ".store");
|
|
555
549
|
var getLocalPersistentArchivist = /* @__PURE__ */ __name((name, dbName, storeName, storageRoot, kind = "lmdb") => {
|
|
556
550
|
switch (kind) {
|
|
557
551
|
case "lmdb": {
|
|
@@ -807,91 +801,8 @@ import { Mutex as Mutex15 } from "async-mutex";
|
|
|
807
801
|
|
|
808
802
|
// src/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.ts
|
|
809
803
|
import { isDefined as isDefined4 } from "@xylabs/typeof";
|
|
804
|
+
import { getLocalPersistentMap } from "@xyo-network/chain-sdk";
|
|
810
805
|
import { Mutex as Mutex14 } from "async-mutex";
|
|
811
|
-
|
|
812
|
-
// src/orchestration/map/localPersistentMap.ts
|
|
813
|
-
import { rm as rm2 } from "fs/promises";
|
|
814
|
-
import Path3 from "path";
|
|
815
|
-
|
|
816
|
-
// src/orchestration/map/driver/lmdb/SynchronousLmdbMap.ts
|
|
817
|
-
import { AbstractCreatable, creatable } from "@xylabs/creatable";
|
|
818
|
-
import { open } from "lmdb";
|
|
819
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
820
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
821
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
822
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
823
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
824
|
-
}
|
|
825
|
-
__name(_ts_decorate, "_ts_decorate");
|
|
826
|
-
var SynchronousLmdbMap = class extends AbstractCreatable {
|
|
827
|
-
static {
|
|
828
|
-
__name(this, "SynchronousLmdbMap");
|
|
829
|
-
}
|
|
830
|
-
db;
|
|
831
|
-
rootDatabase;
|
|
832
|
-
/**
|
|
833
|
-
* The path to the LMDB folder where the database is stored.
|
|
834
|
-
* This is constructed from the location and dbName parameters
|
|
835
|
-
* allowing for multiple DBs within the root (by specifying a
|
|
836
|
-
* different storeName).
|
|
837
|
-
* @returns The folder path for the LMDB database.
|
|
838
|
-
*/
|
|
839
|
-
get folderPath() {
|
|
840
|
-
return `${this.params.location}/${this.params.dbName}`;
|
|
841
|
-
}
|
|
842
|
-
all() {
|
|
843
|
-
return [
|
|
844
|
-
...this.db.getRange({})
|
|
845
|
-
].map((entry) => entry.value);
|
|
846
|
-
}
|
|
847
|
-
clear() {
|
|
848
|
-
this.db.clearSync();
|
|
849
|
-
}
|
|
850
|
-
delete(id) {
|
|
851
|
-
return this.db.removeSync(id);
|
|
852
|
-
}
|
|
853
|
-
get(id) {
|
|
854
|
-
return this.db.get(id);
|
|
855
|
-
}
|
|
856
|
-
has(id) {
|
|
857
|
-
return this.db.doesExist(id);
|
|
858
|
-
}
|
|
859
|
-
set(id, data) {
|
|
860
|
-
this.db.putSync(id, data);
|
|
861
|
-
return this;
|
|
862
|
-
}
|
|
863
|
-
async startHandler() {
|
|
864
|
-
await super.startHandler();
|
|
865
|
-
this.rootDatabase = open({
|
|
866
|
-
path: this.folderPath
|
|
867
|
-
});
|
|
868
|
-
this.db = this.rootDatabase.openDB({
|
|
869
|
-
name: this.params.storeName
|
|
870
|
-
});
|
|
871
|
-
}
|
|
872
|
-
};
|
|
873
|
-
SynchronousLmdbMap = _ts_decorate([
|
|
874
|
-
creatable()
|
|
875
|
-
], SynchronousLmdbMap);
|
|
876
|
-
|
|
877
|
-
// src/orchestration/map/localPersistentMap.ts
|
|
878
|
-
var DEFAULT_STORAGE_ROOT2 = Path3.join(process.cwd(), ".store");
|
|
879
|
-
var getLocalPersistentMap = /* @__PURE__ */ __name(async (dbName, storeName, storageRoot, kind = "lmdb") => {
|
|
880
|
-
switch (kind) {
|
|
881
|
-
case "lmdb": {
|
|
882
|
-
const root = storageRoot ?? DEFAULT_STORAGE_ROOT2;
|
|
883
|
-
const location = getStoreDirectory(dbName, root, "lmdb");
|
|
884
|
-
const store = await SynchronousLmdbMap.create({
|
|
885
|
-
location,
|
|
886
|
-
dbName,
|
|
887
|
-
storeName
|
|
888
|
-
});
|
|
889
|
-
return store;
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
}, "getLocalPersistentMap");
|
|
893
|
-
|
|
894
|
-
// src/orchestration/map/BalanceSummary/initLocalBalanceSummaryMap.ts
|
|
895
806
|
var mutex13 = new Mutex14();
|
|
896
807
|
var singleton13;
|
|
897
808
|
var initLocalBalanceSummaryMap = /* @__PURE__ */ __name(async (params) => {
|
|
@@ -923,6 +834,7 @@ import { Mutex as Mutex17 } from "async-mutex";
|
|
|
923
834
|
|
|
924
835
|
// src/orchestration/map/BalanceSummary/initLocalTransferSummaryMap.ts
|
|
925
836
|
import { isDefined as isDefined6 } from "@xylabs/typeof";
|
|
837
|
+
import { getLocalPersistentMap as getLocalPersistentMap2 } from "@xyo-network/chain-sdk";
|
|
926
838
|
import { Mutex as Mutex16 } from "async-mutex";
|
|
927
839
|
var mutex15 = new Mutex16();
|
|
928
840
|
var singleton15;
|
|
@@ -930,7 +842,7 @@ var initLocalTransferSummaryMap = /* @__PURE__ */ __name(async (params) => {
|
|
|
930
842
|
return await mutex15.runExclusive(async () => {
|
|
931
843
|
if (isDefined6(singleton15)) return singleton15;
|
|
932
844
|
const { root } = params.config.storage;
|
|
933
|
-
singleton15 = await
|
|
845
|
+
singleton15 = await getLocalPersistentMap2("transfer", "summary", root);
|
|
934
846
|
return singleton15;
|
|
935
847
|
});
|
|
936
848
|
}, "initLocalTransferSummaryMap");
|
|
@@ -1449,6 +1361,15 @@ var initTimeService = /* @__PURE__ */ __name(async ({ chainArchivist, chainItera
|
|
|
1449
1361
|
return await timeSyncServiceSingleton;
|
|
1450
1362
|
}, "initTimeService");
|
|
1451
1363
|
|
|
1364
|
+
// src/orchestration/services/implementation/transfer.ts
|
|
1365
|
+
import { BaseAccountTransfersService } from "@xyo-network/chain-sdk";
|
|
1366
|
+
var transferServiceSingleton;
|
|
1367
|
+
var initTransferService = /* @__PURE__ */ __name(async (params) => {
|
|
1368
|
+
if (transferServiceSingleton) return transferServiceSingleton;
|
|
1369
|
+
transferServiceSingleton = await BaseAccountTransfersService.create(params);
|
|
1370
|
+
return transferServiceSingleton;
|
|
1371
|
+
}, "initTransferService");
|
|
1372
|
+
|
|
1452
1373
|
// src/orchestration/services/implementation/validator.ts
|
|
1453
1374
|
var serviceSingleton3;
|
|
1454
1375
|
var initValidator = /* @__PURE__ */ __name((params) => {
|
|
@@ -1607,6 +1528,7 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
|
|
|
1607
1528
|
startupSpanAsync8("TransferSummaryMap", () => initTransferSummaryMap(initParams))
|
|
1608
1529
|
]);
|
|
1609
1530
|
const chainId = chainService.chainId;
|
|
1531
|
+
const chainMap = readPayloadMapFromStore(chainArchivist);
|
|
1610
1532
|
const chainContractViewer = chainService;
|
|
1611
1533
|
const chainStakeViewer = chainService;
|
|
1612
1534
|
const chainStaker = chainService;
|
|
@@ -1634,14 +1556,32 @@ var initServices = /* @__PURE__ */ __name(async (context) => {
|
|
|
1634
1556
|
})),
|
|
1635
1557
|
startupSpanAsync8("ChainIterator", () => initChainIterator({
|
|
1636
1558
|
name: "ChainIterator",
|
|
1637
|
-
|
|
1559
|
+
chainMap,
|
|
1638
1560
|
head,
|
|
1639
1561
|
...initParams
|
|
1640
1562
|
})),
|
|
1641
1563
|
startupSpanAsync8("BalanceService", () => initBalanceService({
|
|
1642
1564
|
name: "BalanceService",
|
|
1643
|
-
|
|
1644
|
-
|
|
1565
|
+
context: {
|
|
1566
|
+
store: {
|
|
1567
|
+
chainMap
|
|
1568
|
+
},
|
|
1569
|
+
head: /* @__PURE__ */ __name(() => ZERO_HASH, "head"),
|
|
1570
|
+
chainId,
|
|
1571
|
+
summaryMap: balanceSummaryMap
|
|
1572
|
+
},
|
|
1573
|
+
...initParams
|
|
1574
|
+
})),
|
|
1575
|
+
startupSpanAsync8("TransferService", () => initTransferService({
|
|
1576
|
+
name: "TransferService",
|
|
1577
|
+
context: {
|
|
1578
|
+
store: {
|
|
1579
|
+
chainMap
|
|
1580
|
+
},
|
|
1581
|
+
head: /* @__PURE__ */ __name(() => ZERO_HASH, "head"),
|
|
1582
|
+
chainId,
|
|
1583
|
+
summaryMap: transferSummaryMap
|
|
1584
|
+
},
|
|
1645
1585
|
...initParams
|
|
1646
1586
|
}))
|
|
1647
1587
|
]);
|
|
@@ -1734,6 +1674,13 @@ function runApi(context) {
|
|
|
1734
1674
|
}
|
|
1735
1675
|
__name(runApi, "runApi");
|
|
1736
1676
|
|
|
1677
|
+
// src/commands/bridge/runBridge.ts
|
|
1678
|
+
import { getServer as getServer2 } from "@xyo-network/chain-bridge";
|
|
1679
|
+
function runBridge(context) {
|
|
1680
|
+
void getServer2(context);
|
|
1681
|
+
}
|
|
1682
|
+
__name(runBridge, "runBridge");
|
|
1683
|
+
|
|
1737
1684
|
// src/commands/producer/runProducer.ts
|
|
1738
1685
|
var runProducer = /* @__PURE__ */ __name(async (context) => {
|
|
1739
1686
|
const { config: config3, logger, orchestrator } = context;
|
|
@@ -1855,7 +1802,7 @@ var waitForHostPort = /* @__PURE__ */ __name((host, port) => {
|
|
|
1855
1802
|
|
|
1856
1803
|
// src/runCLI.ts
|
|
1857
1804
|
var config;
|
|
1858
|
-
var version = isDefined17("1.15.
|
|
1805
|
+
var version = isDefined17("1.15.2") ? "1.15.2" : "unknown";
|
|
1859
1806
|
var getContextFromConfig = /* @__PURE__ */ __name((config3) => {
|
|
1860
1807
|
const logger = initLogger(config3);
|
|
1861
1808
|
const orchestrator = new Orchestrator(logger);
|
|
@@ -1910,6 +1857,15 @@ $0 <command> [options]`).parserConfiguration({
|
|
|
1910
1857
|
config
|
|
1911
1858
|
});
|
|
1912
1859
|
});
|
|
1860
|
+
}).command("bridge", "Run a XL1 Bridge Node", (yargs2) => {
|
|
1861
|
+
return yargs2.command("$0", "Run a XL1 Bridge Node", () => {
|
|
1862
|
+
}, () => {
|
|
1863
|
+
const context = getContextFromConfig(config);
|
|
1864
|
+
runBridge({
|
|
1865
|
+
...context,
|
|
1866
|
+
config
|
|
1867
|
+
});
|
|
1868
|
+
});
|
|
1913
1869
|
}).command("producer", "Run a XL1 Producer Node", (yargs2) => {
|
|
1914
1870
|
return yargs2.command("$0", "Run a XL1 Producer Node", () => {
|
|
1915
1871
|
}, async () => {
|
|
@@ -1968,6 +1924,7 @@ export {
|
|
|
1968
1924
|
initServices,
|
|
1969
1925
|
initStakeIntentService,
|
|
1970
1926
|
initTimeService,
|
|
1927
|
+
initTransferService,
|
|
1971
1928
|
initValidator,
|
|
1972
1929
|
runCLI,
|
|
1973
1930
|
start
|