@lage-run/cli 0.33.4 → 0.34.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/lib/commands/createReporter.d.ts +23 -1
- package/lib/commands/createReporter.js +51 -27
- package/lib/commands/createReporter.js.map +1 -1
- package/lib/commands/exec/action.js +6 -1
- package/lib/commands/exec/action.js.map +1 -1
- package/lib/commands/exec/executeRemotely.js +5 -2
- package/lib/commands/exec/executeRemotely.js.map +1 -1
- package/lib/commands/info/action.d.ts +7 -1
- package/lib/commands/info/action.js +15 -10
- package/lib/commands/info/action.js.map +1 -1
- package/lib/commands/init/action.js +4 -2
- package/lib/commands/init/action.js.map +1 -1
- package/lib/commands/initializeReporters.d.ts +2 -1
- package/lib/commands/initializeReporters.js +3 -3
- package/lib/commands/initializeReporters.js.map +1 -1
- package/lib/commands/run/createTargetGraph.d.ts +3 -2
- package/lib/commands/run/createTargetGraph.js +27 -9
- package/lib/commands/run/createTargetGraph.js.map +1 -1
- package/lib/commands/run/runAction.js +7 -3
- package/lib/commands/run/runAction.js.map +1 -1
- package/lib/commands/run/watchAction.js +4 -3
- package/lib/commands/run/watchAction.js.map +1 -1
- package/lib/commands/server/action.js +7 -2
- package/lib/commands/server/action.js.map +1 -1
- package/lib/commands/server/lageService.js +2 -1
- package/lib/commands/server/lageService.js.map +1 -1
- package/lib/filter/getFilteredPackages.js +11 -2
- package/lib/filter/getFilteredPackages.js.map +1 -1
- package/lib/filter/hasRepoChanged.d.ts +13 -1
- package/lib/filter/hasRepoChanged.js +14 -12
- package/lib/filter/hasRepoChanged.js.map +1 -1
- package/lib/index.d.ts +4 -2
- package/lib/internal.d.ts +1 -0
- package/lib/internal.js +4 -0
- package/lib/internal.js.map +1 -0
- package/lib/optimizeTargetGraph.js +1 -1
- package/lib/optimizeTargetGraph.js.map +1 -1
- package/lib/types/ReporterInitOptions.d.ts +4 -0
- package/lib/types/ReporterInitOptions.js.map +1 -1
- package/package.json +10 -10
- package/lib/cache/isRunningFromCI.d.ts +0 -1
- package/lib/cache/isRunningFromCI.js +0 -11
- package/lib/cache/isRunningFromCI.js.map +0 -1
- package/lib/commands/isRunningFromCI.d.ts +0 -1
- package/lib/commands/isRunningFromCI.js +0 -11
- package/lib/commands/isRunningFromCI.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/filter/hasRepoChanged.ts"],"sourcesContent":["import { getBranchChanges } from \"workspace-tools\";\nimport * as fg from \"fast-glob\";\nimport type { Logger } from \"@lage-run/logger\";\n\nexport function hasRepoChanged(since: string
|
|
1
|
+
{"version":3,"sources":["../../src/filter/hasRepoChanged.ts"],"sourcesContent":["import { getBranchChanges } from \"workspace-tools\";\nimport * as fg from \"fast-glob\";\nimport type { Logger } from \"@lage-run/logger\";\n\n/**\n * Check whether any `environmentGlob` files have changed since the `--since` ref.\n * If `environmentGlob` is empty, it returns false.\n */\nexport function hasRepoChanged(params: {\n /** `--since` CLI arg */\n since: string;\n /** Absolute path to monorepo root */\n root: string;\n /** `environmentGlob` from cache config */\n environmentGlob: string[];\n logger: Logger;\n}): boolean {\n const { since, root, environmentGlob, logger } = params;\n\n if (!environmentGlob.length) {\n // Following old logic: if no environmentGlob, it hasn't changed\n return false;\n }\n\n try {\n const changedFiles = getBranchChanges({\n branch: since,\n cwd: root,\n });\n if (!changedFiles.length) {\n return false;\n }\n\n const envFiles = fg.sync(environmentGlob, { cwd: root });\n\n return envFiles.some((envFile) => changedFiles.includes(envFile));\n } catch (e) {\n // if this fails, let's assume repo has changed\n logger.warn(`An error in the git command has caused this to consider the repo has changed\\n${e}`);\n return true;\n }\n}\n"],"names":["hasRepoChanged","params","since","root","environmentGlob","logger","length","changedFiles","getBranchChanges","branch","cwd","envFiles","fg","sync","some","envFile","includes","e","warn"],"mappings":";;;;+BAQgBA;;;eAAAA;;;gCARiB;kEACb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOb,SAASA,eAAeC,MAQ9B;IACC,MAAM,EAAEC,KAAK,EAAEC,IAAI,EAAEC,eAAe,EAAEC,MAAM,EAAE,GAAGJ;IAEjD,IAAI,CAACG,gBAAgBE,MAAM,EAAE;QAC3B,gEAAgE;QAChE,OAAO;IACT;IAEA,IAAI;QACF,MAAMC,eAAeC,IAAAA,gCAAgB,EAAC;YACpCC,QAAQP;YACRQ,KAAKP;QACP;QACA,IAAI,CAACI,aAAaD,MAAM,EAAE;YACxB,OAAO;QACT;QAEA,MAAMK,WAAWC,UAAGC,IAAI,CAACT,iBAAiB;YAAEM,KAAKP;QAAK;QAEtD,OAAOQ,SAASG,IAAI,CAAC,CAACC,UAAYR,aAAaS,QAAQ,CAACD;IAC1D,EAAE,OAAOE,GAAG;QACV,+CAA+C;QAC/CZ,OAAOa,IAAI,CAAC,CAAC,8EAA8E,EAAED,GAAG;QAChG,OAAO;IACT;AACF"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
export type { CacheOptions, ConfigFileOptions, ConfigOptions, LoggerOptions, PipelineDefinition
|
|
1
|
+
export type { CacheOptions, ConfigFileOptions, ConfigOptions, LoggerOptions, PipelineDefinition } from "@lage-run/config";
|
|
2
|
+
export type { Reporter, LogLevel, LogEntry, LogStructuredData } from "@lage-run/logger";
|
|
2
3
|
export type { NpmScriptRunnerOptions, NpmScriptTargetOptions, TargetRunnerPickerOptions, TargetRunOptions, TargetRunResult, WorkerRunnerFunction, WorkerRunnerFunctionOptions, WorkerRunnerOptions, WorkerTargetOptions, } from "@lage-run/runners";
|
|
3
|
-
export type { Target, TargetConfig } from "@lage-run/target-graph";
|
|
4
|
+
export type { Priority, Target, TargetConfig } from "@lage-run/target-graph";
|
|
5
|
+
export type { ReporterInitOptions } from "./types/ReporterInitOptions.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { InfoResult } from "./commands/info/action.js";
|
package/lib/internal.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -13,7 +13,7 @@ async function optimizeTargetGraph(graph, runnerPicker, createBackCompatGraph) {
|
|
|
13
13
|
const targetMinimizedNodes = await (0, _targetgraph.removeNodes)([
|
|
14
14
|
...graph.targets.values()
|
|
15
15
|
], async (target)=>{
|
|
16
|
-
if (target.type ===
|
|
16
|
+
if (target.type === _targetgraph.builtInTargetTypes.noop) {
|
|
17
17
|
return true;
|
|
18
18
|
}
|
|
19
19
|
if (target.id === (0, _targetgraph.getStartTargetId)()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/optimizeTargetGraph.ts"],"sourcesContent":["import type { TargetRunnerPicker } from \"@lage-run/runners\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/optimizeTargetGraph.ts"],"sourcesContent":["import type { TargetRunnerPicker } from \"@lage-run/runners\";\nimport {\n type TargetGraph,\n removeNodes,\n transitiveReduction,\n getStartTargetId,\n type Target,\n builtInTargetTypes,\n} from \"@lage-run/target-graph\";\n\nexport async function optimizeTargetGraph(\n graph: TargetGraph,\n runnerPicker: TargetRunnerPicker,\n createBackCompatGraph: boolean\n): Promise<Target[]> {\n const targetMinimizedNodes = await removeNodes([...graph.targets.values()], async (target) => {\n if (target.type === builtInTargetTypes.noop) {\n return true;\n }\n\n if (target.id === getStartTargetId()) {\n return createBackCompatGraph;\n }\n\n const runner = await runnerPicker.pick(target);\n if (await runner.shouldRun(target)) {\n return false;\n }\n\n return true;\n });\n\n if (createBackCompatGraph) {\n return targetMinimizedNodes;\n }\n\n const reduced = transitiveReduction(targetMinimizedNodes);\n\n // Update the dependents of nodes based on the new set of dependencies\n // first build up a dependency map for quick lookup\n const dependencyMap = new Map<string, Set<string>>();\n for (const node of reduced) {\n for (const depId of node.dependencies) {\n if (!dependencyMap.has(depId)) {\n dependencyMap.set(depId, new Set<string>());\n }\n dependencyMap.get(depId)!.add(node.id);\n }\n }\n\n // update the dependents of each node\n for (const node of reduced) {\n const dependents = new Set<string>();\n if (dependencyMap.has(node.id)) {\n dependencyMap.get(node.id)!.forEach((dependentId) => dependents.add(dependentId));\n }\n\n node.dependents = Array.from(dependents);\n }\n\n return reduced;\n}\n"],"names":["optimizeTargetGraph","graph","runnerPicker","createBackCompatGraph","targetMinimizedNodes","removeNodes","targets","values","target","type","builtInTargetTypes","noop","id","getStartTargetId","runner","pick","shouldRun","reduced","transitiveReduction","dependencyMap","Map","node","depId","dependencies","has","set","Set","get","add","dependents","forEach","dependentId","Array","from"],"mappings":";;;;+BAUsBA;;;eAAAA;;;6BAFf;AAEA,eAAeA,oBACpBC,KAAkB,EAClBC,YAAgC,EAChCC,qBAA8B;IAE9B,MAAMC,uBAAuB,MAAMC,IAAAA,wBAAW,EAAC;WAAIJ,MAAMK,OAAO,CAACC,MAAM;KAAG,EAAE,OAAOC;QACjF,IAAIA,OAAOC,IAAI,KAAKC,+BAAkB,CAACC,IAAI,EAAE;YAC3C,OAAO;QACT;QAEA,IAAIH,OAAOI,EAAE,KAAKC,IAAAA,6BAAgB,KAAI;YACpC,OAAOV;QACT;QAEA,MAAMW,SAAS,MAAMZ,aAAaa,IAAI,CAACP;QACvC,IAAI,MAAMM,OAAOE,SAAS,CAACR,SAAS;YAClC,OAAO;QACT;QAEA,OAAO;IACT;IAEA,IAAIL,uBAAuB;QACzB,OAAOC;IACT;IAEA,MAAMa,UAAUC,IAAAA,gCAAmB,EAACd;IAEpC,sEAAsE;IACtE,mDAAmD;IACnD,MAAMe,gBAAgB,IAAIC;IAC1B,KAAK,MAAMC,QAAQJ,QAAS;QAC1B,KAAK,MAAMK,SAASD,KAAKE,YAAY,CAAE;YACrC,IAAI,CAACJ,cAAcK,GAAG,CAACF,QAAQ;gBAC7BH,cAAcM,GAAG,CAACH,OAAO,IAAII;YAC/B;YACAP,cAAcQ,GAAG,CAACL,OAAQM,GAAG,CAACP,KAAKT,EAAE;QACvC;IACF;IAEA,qCAAqC;IACrC,KAAK,MAAMS,QAAQJ,QAAS;QAC1B,MAAMY,aAAa,IAAIH;QACvB,IAAIP,cAAcK,GAAG,CAACH,KAAKT,EAAE,GAAG;YAC9BO,cAAcQ,GAAG,CAACN,KAAKT,EAAE,EAAGkB,OAAO,CAAC,CAACC,cAAgBF,WAAWD,GAAG,CAACG;QACtE;QAEAV,KAAKQ,UAAU,GAAGG,MAAMC,IAAI,CAACJ;IAC/B;IAEA,OAAOZ;AACT"}
|
|
@@ -7,6 +7,10 @@ export type ReporterName = BuiltInReporterName | string;
|
|
|
7
7
|
export declare const builtInReporterNames: string[];
|
|
8
8
|
/** Built-in reporter names that should be listed in doc output */
|
|
9
9
|
export declare const logBuiltInReporterNames: string[];
|
|
10
|
+
/**
|
|
11
|
+
* Options for initializing reporters.
|
|
12
|
+
* This is also passed to the constructor of a custom reporter class.
|
|
13
|
+
*/
|
|
10
14
|
export interface ReporterInitOptions {
|
|
11
15
|
reporter: ReporterName[] | ReporterName | undefined;
|
|
12
16
|
progress: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/ReporterInitOptions.ts"],"sourcesContent":["import type { LogLevel } from \"@lage-run/logger\";\n\n/** All the built-in reporter names */\nexport type BuiltInReporterName =\n | \"default\"\n | \"profile\"\n | \"json\"\n | \"azureDevops\"\n | \"adoLog\"\n | \"githubActions\"\n | \"gha\"\n | \"npmLog\"\n | \"old\"\n | \"verboseFileLog\"\n | \"vfl\"\n | \"fancy\";\n/** Built-in or custom reporter name */\nexport type ReporterName = BuiltInReporterName | string;\n\n/** Whether each built-in reporter name should be listed in doc output */\nconst shouldListBuiltInReporters: Record<BuiltInReporterName, boolean> = {\n json: true,\n azureDevops: true,\n npmLog: true,\n verboseFileLog: true,\n vfl: true,\n adoLog: true,\n githubActions: true,\n gha: true,\n fancy: true,\n default: true,\n // Not encouraged\n old: false,\n // Intended to be set via --profile\n profile: false,\n};\n\n/** All the built-in reporter names */\nexport const builtInReporterNames: string[] = Object.keys(shouldListBuiltInReporters);\n\n/** Built-in reporter names that should be listed in doc output */\nexport const logBuiltInReporterNames: string[] = builtInReporterNames.filter(\n (name) => shouldListBuiltInReporters[name as BuiltInReporterName]\n);\n\nexport interface ReporterInitOptions {\n reporter: ReporterName[] | ReporterName | undefined;\n progress: boolean;\n verbose: boolean;\n grouped: boolean;\n concurrency: number;\n logLevel: keyof typeof LogLevel;\n profile?: boolean | string;\n logFile?: string;\n indented?: boolean;\n}\n"],"names":["builtInReporterNames","logBuiltInReporterNames","shouldListBuiltInReporters","json","azureDevops","npmLog","verboseFileLog","vfl","adoLog","githubActions","gha","fancy","default","old","profile","Object","keys","filter","name"],"mappings":";;;;;;;;;;;QAsCaA;eAAAA;;QAGAC;eAAAA;;;AAtBb,uEAAuE,GACvE,MAAMC,6BAAmE;IACvEC,MAAM;IACNC,aAAa;IACbC,QAAQ;IACRC,gBAAgB;IAChBC,KAAK;IACLC,QAAQ;IACRC,eAAe;IACfC,KAAK;IACLC,OAAO;IACPC,SAAS;IACT,iBAAiB;IACjBC,KAAK;IACL,mCAAmC;IACnCC,SAAS;AACX;AAGO,MAAMd,uBAAiCe,OAAOC,IAAI,CAACd;AAGnD,MAAMD,0BAAoCD,qBAAqBiB,MAAM,CAC1E,CAACC,OAAShB,0BAA0B,CAACgB,KAA4B"}
|
|
1
|
+
{"version":3,"sources":["../../src/types/ReporterInitOptions.ts"],"sourcesContent":["import type { LogLevel } from \"@lage-run/logger\";\n\n/** All the built-in reporter names */\nexport type BuiltInReporterName =\n | \"default\"\n | \"profile\"\n | \"json\"\n | \"azureDevops\"\n | \"adoLog\"\n | \"githubActions\"\n | \"gha\"\n | \"npmLog\"\n | \"old\"\n | \"verboseFileLog\"\n | \"vfl\"\n | \"fancy\";\n/** Built-in or custom reporter name */\nexport type ReporterName = BuiltInReporterName | string;\n\n/** Whether each built-in reporter name should be listed in doc output */\nconst shouldListBuiltInReporters: Record<BuiltInReporterName, boolean> = {\n json: true,\n azureDevops: true,\n npmLog: true,\n verboseFileLog: true,\n vfl: true,\n adoLog: true,\n githubActions: true,\n gha: true,\n fancy: true,\n default: true,\n // Not encouraged\n old: false,\n // Intended to be set via --profile\n profile: false,\n};\n\n/** All the built-in reporter names */\nexport const builtInReporterNames: string[] = Object.keys(shouldListBuiltInReporters);\n\n/** Built-in reporter names that should be listed in doc output */\nexport const logBuiltInReporterNames: string[] = builtInReporterNames.filter(\n (name) => shouldListBuiltInReporters[name as BuiltInReporterName]\n);\n\n/**\n * Options for initializing reporters.\n * This is also passed to the constructor of a custom reporter class.\n */\nexport interface ReporterInitOptions {\n reporter: ReporterName[] | ReporterName | undefined;\n progress: boolean;\n verbose: boolean;\n grouped: boolean;\n concurrency: number;\n logLevel: keyof typeof LogLevel;\n profile?: boolean | string;\n logFile?: string;\n indented?: boolean;\n}\n"],"names":["builtInReporterNames","logBuiltInReporterNames","shouldListBuiltInReporters","json","azureDevops","npmLog","verboseFileLog","vfl","adoLog","githubActions","gha","fancy","default","old","profile","Object","keys","filter","name"],"mappings":";;;;;;;;;;;QAsCaA;eAAAA;;QAGAC;eAAAA;;;AAtBb,uEAAuE,GACvE,MAAMC,6BAAmE;IACvEC,MAAM;IACNC,aAAa;IACbC,QAAQ;IACRC,gBAAgB;IAChBC,KAAK;IACLC,QAAQ;IACRC,eAAe;IACfC,KAAK;IACLC,OAAO;IACPC,SAAS;IACT,iBAAiB;IACjBC,KAAK;IACL,mCAAmC;IACnCC,SAAS;AACX;AAGO,MAAMd,uBAAiCe,OAAOC,IAAI,CAACd;AAGnD,MAAMD,0BAAoCD,qBAAqBiB,MAAM,CAC1E,CAACC,OAAShB,0BAA0B,CAACgB,KAA4B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.1",
|
|
4
4
|
"description": "Command Line Interface for Lage",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,18 +22,18 @@
|
|
|
22
22
|
"lint": "monorepo-scripts lint"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@lage-run/cache": "^1.4.
|
|
26
|
-
"@lage-run/config": "^0.
|
|
27
|
-
"@lage-run/format-hrtime": "^0.1.
|
|
25
|
+
"@lage-run/cache": "^1.4.8",
|
|
26
|
+
"@lage-run/config": "^0.9.1",
|
|
27
|
+
"@lage-run/format-hrtime": "^0.1.9",
|
|
28
28
|
"@lage-run/globby": "^13.0.1",
|
|
29
|
-
"@lage-run/hasher": "^1.9.
|
|
29
|
+
"@lage-run/hasher": "^1.9.5",
|
|
30
30
|
"@lage-run/logger": "^1.3.3",
|
|
31
|
-
"@lage-run/reporters": "^1.
|
|
31
|
+
"@lage-run/reporters": "^1.5.0",
|
|
32
32
|
"@lage-run/rpc": "^1.4.3",
|
|
33
|
-
"@lage-run/runners": "^1.
|
|
34
|
-
"@lage-run/scheduler": "^1.5.
|
|
35
|
-
"@lage-run/scheduler-types": "^0.3.
|
|
36
|
-
"@lage-run/target-graph": "^0.
|
|
33
|
+
"@lage-run/runners": "^1.4.0",
|
|
34
|
+
"@lage-run/scheduler": "^1.5.20",
|
|
35
|
+
"@lage-run/scheduler-types": "^0.3.31",
|
|
36
|
+
"@lage-run/target-graph": "^0.14.0",
|
|
37
37
|
"@lage-run/worker-threads-pool": "^0.9.3",
|
|
38
38
|
"chokidar": "^3.6.0",
|
|
39
39
|
"commander": "^9.5.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const isRunningFromCI: boolean;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "isRunningFromCI", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return isRunningFromCI;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const isRunningFromCI = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cache/isRunningFromCI.ts"],"sourcesContent":["export const isRunningFromCI: boolean = process.env.NODE_ENV !== \"test\" && (!!process.env.CI || !!process.env.TF_BUILD);\n"],"names":["isRunningFromCI","process","env","NODE_ENV","CI","TF_BUILD"],"mappings":";;;;+BAAaA;;;eAAAA;;;AAAN,MAAMA,kBAA2BC,QAAQC,GAAG,CAACC,QAAQ,KAAK,UAAW,CAAA,CAAC,CAACF,QAAQC,GAAG,CAACE,EAAE,IAAI,CAAC,CAACH,QAAQC,GAAG,CAACG,QAAQ,AAAD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const isRunningFromCI: boolean;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "isRunningFromCI", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return isRunningFromCI;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const isRunningFromCI = process.env.NODE_ENV !== "test" && (!!process.env.CI || !!process.env.TF_BUILD);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/isRunningFromCI.ts"],"sourcesContent":["export const isRunningFromCI: boolean = process.env.NODE_ENV !== \"test\" && (!!process.env.CI || !!process.env.TF_BUILD);\n"],"names":["isRunningFromCI","process","env","NODE_ENV","CI","TF_BUILD"],"mappings":";;;;+BAAaA;;;eAAAA;;;AAAN,MAAMA,kBAA2BC,QAAQC,GAAG,CAACC,QAAQ,KAAK,UAAW,CAAA,CAAC,CAACF,QAAQC,GAAG,CAACE,EAAE,IAAI,CAAC,CAACH,QAAQC,GAAG,CAACG,QAAQ,AAAD"}
|