@hasna/testers 0.0.17 → 0.0.19
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/cli/index.js +10 -10
- package/dist/db/pg-migrations.d.ts +7 -0
- package/dist/db/pg-migrations.d.ts.map +1 -0
- package/dist/index.js +7 -8
- package/dist/lib/browser-bun.d.ts +6 -6
- package/dist/lib/browser-bun.d.ts.map +1 -1
- package/dist/mcp/index.js +7 -8
- package/dist/server/index.js +7 -8
- package/package.json +5 -4
package/dist/cli/index.js
CHANGED
|
@@ -12414,7 +12414,7 @@ var init_browser_bun = __esm(() => {
|
|
|
12414
12414
|
this._emit("navigationfailed", error);
|
|
12415
12415
|
};
|
|
12416
12416
|
}
|
|
12417
|
-
async goto(url,
|
|
12417
|
+
async goto(url, _opts) {
|
|
12418
12418
|
await this.view.navigate(url);
|
|
12419
12419
|
await new Promise((r) => setTimeout(r, 200));
|
|
12420
12420
|
}
|
|
@@ -12437,14 +12437,14 @@ var init_browser_bun = __esm(() => {
|
|
|
12437
12437
|
}
|
|
12438
12438
|
return this.view.evaluate(expr);
|
|
12439
12439
|
}
|
|
12440
|
-
async screenshot(
|
|
12440
|
+
async screenshot(_opts) {
|
|
12441
12441
|
const uint8 = await this.view.screenshot();
|
|
12442
12442
|
return Buffer.from(uint8);
|
|
12443
12443
|
}
|
|
12444
12444
|
async click(selector, opts) {
|
|
12445
12445
|
await this.view.click(selector, opts ? { button: opts.button } : undefined);
|
|
12446
12446
|
}
|
|
12447
|
-
async type(selector, text,
|
|
12447
|
+
async type(selector, text, _opts) {
|
|
12448
12448
|
try {
|
|
12449
12449
|
await this.view.click(selector);
|
|
12450
12450
|
} catch {}
|
|
@@ -12539,7 +12539,7 @@ var init_browser_bun = __esm(() => {
|
|
|
12539
12539
|
})()
|
|
12540
12540
|
`);
|
|
12541
12541
|
}
|
|
12542
|
-
async setInputFiles(
|
|
12542
|
+
async setInputFiles(_selector, _files) {
|
|
12543
12543
|
throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
|
|
12544
12544
|
}
|
|
12545
12545
|
getByRole(role, opts) {
|
|
@@ -12589,11 +12589,10 @@ var init_browser_bun = __esm(() => {
|
|
|
12589
12589
|
})
|
|
12590
12590
|
};
|
|
12591
12591
|
}
|
|
12592
|
-
getByText(text,
|
|
12593
|
-
const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
|
|
12592
|
+
getByText(text, _opts) {
|
|
12594
12593
|
return {
|
|
12595
12594
|
first: () => ({
|
|
12596
|
-
click: async (
|
|
12595
|
+
click: async (_clickOpts) => {
|
|
12597
12596
|
await this.view.evaluate(`
|
|
12598
12597
|
(() => {
|
|
12599
12598
|
const text = ${JSON.stringify(text)};
|
|
@@ -12660,7 +12659,7 @@ var init_browser_bun = __esm(() => {
|
|
|
12660
12659
|
viewportSize() {
|
|
12661
12660
|
return { width: 1280, height: 720 };
|
|
12662
12661
|
}
|
|
12663
|
-
async waitForLoadState(
|
|
12662
|
+
async waitForLoadState(_state, _opts) {
|
|
12664
12663
|
await new Promise((r) => setTimeout(r, 200));
|
|
12665
12664
|
}
|
|
12666
12665
|
async waitForURL(pattern, opts) {
|
|
@@ -19820,7 +19819,7 @@ import chalk6 from "chalk";
|
|
|
19820
19819
|
// package.json
|
|
19821
19820
|
var package_default = {
|
|
19822
19821
|
name: "@hasna/testers",
|
|
19823
|
-
version: "0.0.
|
|
19822
|
+
version: "0.0.19",
|
|
19824
19823
|
description: "AI-powered QA testing CLI \u2014 spawns cheap AI agents to test web apps with headless browsers",
|
|
19825
19824
|
type: "module",
|
|
19826
19825
|
main: "dist/index.js",
|
|
@@ -19855,7 +19854,8 @@ var package_default = {
|
|
|
19855
19854
|
"dev:cli": "bun run src/cli/index.tsx",
|
|
19856
19855
|
"dev:mcp": "bun run src/mcp/index.ts",
|
|
19857
19856
|
"dev:serve": "bun run src/server/index.ts",
|
|
19858
|
-
prepublishOnly: "bun run build"
|
|
19857
|
+
prepublishOnly: "bun run build",
|
|
19858
|
+
postinstall: "mkdir -p $HOME/.hasna/testers/screenshots $HOME/.hasna/testers/browser/profiles 2>/dev/null || true"
|
|
19859
19859
|
},
|
|
19860
19860
|
dependencies: {
|
|
19861
19861
|
"@anthropic-ai/sdk": "^0.52.0",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg-migrations.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,aAAa,EAAE,MAAM,EAgXjC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10183,7 +10183,7 @@ var init_browser_bun = __esm(() => {
|
|
|
10183
10183
|
this._emit("navigationfailed", error);
|
|
10184
10184
|
};
|
|
10185
10185
|
}
|
|
10186
|
-
async goto(url,
|
|
10186
|
+
async goto(url, _opts) {
|
|
10187
10187
|
await this.view.navigate(url);
|
|
10188
10188
|
await new Promise((r) => setTimeout(r, 200));
|
|
10189
10189
|
}
|
|
@@ -10206,14 +10206,14 @@ var init_browser_bun = __esm(() => {
|
|
|
10206
10206
|
}
|
|
10207
10207
|
return this.view.evaluate(expr);
|
|
10208
10208
|
}
|
|
10209
|
-
async screenshot(
|
|
10209
|
+
async screenshot(_opts) {
|
|
10210
10210
|
const uint8 = await this.view.screenshot();
|
|
10211
10211
|
return Buffer.from(uint8);
|
|
10212
10212
|
}
|
|
10213
10213
|
async click(selector, opts) {
|
|
10214
10214
|
await this.view.click(selector, opts ? { button: opts.button } : undefined);
|
|
10215
10215
|
}
|
|
10216
|
-
async type(selector, text,
|
|
10216
|
+
async type(selector, text, _opts) {
|
|
10217
10217
|
try {
|
|
10218
10218
|
await this.view.click(selector);
|
|
10219
10219
|
} catch {}
|
|
@@ -10308,7 +10308,7 @@ var init_browser_bun = __esm(() => {
|
|
|
10308
10308
|
})()
|
|
10309
10309
|
`);
|
|
10310
10310
|
}
|
|
10311
|
-
async setInputFiles(
|
|
10311
|
+
async setInputFiles(_selector, _files) {
|
|
10312
10312
|
throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
|
|
10313
10313
|
}
|
|
10314
10314
|
getByRole(role, opts) {
|
|
@@ -10358,11 +10358,10 @@ var init_browser_bun = __esm(() => {
|
|
|
10358
10358
|
})
|
|
10359
10359
|
};
|
|
10360
10360
|
}
|
|
10361
|
-
getByText(text,
|
|
10362
|
-
const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
|
|
10361
|
+
getByText(text, _opts) {
|
|
10363
10362
|
return {
|
|
10364
10363
|
first: () => ({
|
|
10365
|
-
click: async (
|
|
10364
|
+
click: async (_clickOpts) => {
|
|
10366
10365
|
await this.view.evaluate(`
|
|
10367
10366
|
(() => {
|
|
10368
10367
|
const text = ${JSON.stringify(text)};
|
|
@@ -10429,7 +10428,7 @@ var init_browser_bun = __esm(() => {
|
|
|
10429
10428
|
viewportSize() {
|
|
10430
10429
|
return { width: 1280, height: 720 };
|
|
10431
10430
|
}
|
|
10432
|
-
async waitForLoadState(
|
|
10431
|
+
async waitForLoadState(_state, _opts) {
|
|
10433
10432
|
await new Promise((r) => setTimeout(r, 200));
|
|
10434
10433
|
}
|
|
10435
10434
|
async waitForURL(pattern, opts) {
|
|
@@ -49,7 +49,7 @@ export declare class BunWebViewSession {
|
|
|
49
49
|
private _sessionId?;
|
|
50
50
|
private _eventListeners;
|
|
51
51
|
constructor(opts?: BunWebViewOptions);
|
|
52
|
-
goto(url: string,
|
|
52
|
+
goto(url: string, _opts?: {
|
|
53
53
|
waitUntil?: string;
|
|
54
54
|
timeout?: number;
|
|
55
55
|
}): Promise<void>;
|
|
@@ -57,7 +57,7 @@ export declare class BunWebViewSession {
|
|
|
57
57
|
goForward(): Promise<void>;
|
|
58
58
|
reload(): Promise<void>;
|
|
59
59
|
evaluate<T = unknown>(fnOrExpr: string | ((...args: unknown[]) => unknown), ...args: unknown[]): Promise<T>;
|
|
60
|
-
screenshot(
|
|
60
|
+
screenshot(_opts?: {
|
|
61
61
|
path?: string;
|
|
62
62
|
type?: string;
|
|
63
63
|
fullPage?: boolean;
|
|
@@ -67,7 +67,7 @@ export declare class BunWebViewSession {
|
|
|
67
67
|
button?: "left" | "right" | "middle";
|
|
68
68
|
timeout?: number;
|
|
69
69
|
}): Promise<void>;
|
|
70
|
-
type(selector: string, text: string,
|
|
70
|
+
type(selector: string, text: string, _opts?: {
|
|
71
71
|
delay?: number;
|
|
72
72
|
}): Promise<void>;
|
|
73
73
|
fill(selector: string, value: string): Promise<void>;
|
|
@@ -91,11 +91,11 @@ export declare class BunWebViewSession {
|
|
|
91
91
|
selectOption(selector: string, value: string): Promise<string[]>;
|
|
92
92
|
check(selector: string): Promise<void>;
|
|
93
93
|
uncheck(selector: string): Promise<void>;
|
|
94
|
-
setInputFiles(
|
|
94
|
+
setInputFiles(_selector: string, _files: string | string[]): Promise<void>;
|
|
95
95
|
getByRole(role: string, opts?: {
|
|
96
96
|
name?: string | RegExp;
|
|
97
97
|
}): any;
|
|
98
|
-
getByText(text: string,
|
|
98
|
+
getByText(text: string, _opts?: {
|
|
99
99
|
exact?: boolean;
|
|
100
100
|
}): any;
|
|
101
101
|
locator(selector: string): any;
|
|
@@ -105,7 +105,7 @@ export declare class BunWebViewSession {
|
|
|
105
105
|
width: number;
|
|
106
106
|
height: number;
|
|
107
107
|
} | null;
|
|
108
|
-
waitForLoadState(
|
|
108
|
+
waitForLoadState(_state?: string, _opts?: {
|
|
109
109
|
timeout?: number;
|
|
110
110
|
}): Promise<void>;
|
|
111
111
|
waitForURL(pattern: string | RegExp, opts?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-bun.d.ts","sourceRoot":"","sources":["../../src/lib/browser-bun.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAaD,UAAU,gBAAgB;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,kBAAkB,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAID,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACxD;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,eAAe,CAA0D;gBAErE,IAAI,GAAE,iBAAsB;IAoClC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"browser-bun.d.ts","sourceRoot":"","sources":["../../src/lib/browser-bun.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -10760,7 +10760,7 @@ var init_browser_bun = __esm(() => {
|
|
|
10760
10760
|
this._emit("navigationfailed", error);
|
|
10761
10761
|
};
|
|
10762
10762
|
}
|
|
10763
|
-
async goto(url,
|
|
10763
|
+
async goto(url, _opts) {
|
|
10764
10764
|
await this.view.navigate(url);
|
|
10765
10765
|
await new Promise((r) => setTimeout(r, 200));
|
|
10766
10766
|
}
|
|
@@ -10783,14 +10783,14 @@ var init_browser_bun = __esm(() => {
|
|
|
10783
10783
|
}
|
|
10784
10784
|
return this.view.evaluate(expr);
|
|
10785
10785
|
}
|
|
10786
|
-
async screenshot(
|
|
10786
|
+
async screenshot(_opts) {
|
|
10787
10787
|
const uint8 = await this.view.screenshot();
|
|
10788
10788
|
return Buffer.from(uint8);
|
|
10789
10789
|
}
|
|
10790
10790
|
async click(selector, opts) {
|
|
10791
10791
|
await this.view.click(selector, opts ? { button: opts.button } : undefined);
|
|
10792
10792
|
}
|
|
10793
|
-
async type(selector, text,
|
|
10793
|
+
async type(selector, text, _opts) {
|
|
10794
10794
|
try {
|
|
10795
10795
|
await this.view.click(selector);
|
|
10796
10796
|
} catch {}
|
|
@@ -10885,7 +10885,7 @@ var init_browser_bun = __esm(() => {
|
|
|
10885
10885
|
})()
|
|
10886
10886
|
`);
|
|
10887
10887
|
}
|
|
10888
|
-
async setInputFiles(
|
|
10888
|
+
async setInputFiles(_selector, _files) {
|
|
10889
10889
|
throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
|
|
10890
10890
|
}
|
|
10891
10891
|
getByRole(role, opts) {
|
|
@@ -10935,11 +10935,10 @@ var init_browser_bun = __esm(() => {
|
|
|
10935
10935
|
})
|
|
10936
10936
|
};
|
|
10937
10937
|
}
|
|
10938
|
-
getByText(text,
|
|
10939
|
-
const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
|
|
10938
|
+
getByText(text, _opts) {
|
|
10940
10939
|
return {
|
|
10941
10940
|
first: () => ({
|
|
10942
|
-
click: async (
|
|
10941
|
+
click: async (_clickOpts) => {
|
|
10943
10942
|
await this.view.evaluate(`
|
|
10944
10943
|
(() => {
|
|
10945
10944
|
const text = ${JSON.stringify(text)};
|
|
@@ -11006,7 +11005,7 @@ var init_browser_bun = __esm(() => {
|
|
|
11006
11005
|
viewportSize() {
|
|
11007
11006
|
return { width: 1280, height: 720 };
|
|
11008
11007
|
}
|
|
11009
|
-
async waitForLoadState(
|
|
11008
|
+
async waitForLoadState(_state, _opts) {
|
|
11010
11009
|
await new Promise((r) => setTimeout(r, 200));
|
|
11011
11010
|
}
|
|
11012
11011
|
async waitForURL(pattern, opts) {
|
package/dist/server/index.js
CHANGED
|
@@ -9894,7 +9894,7 @@ var init_browser_bun = __esm(() => {
|
|
|
9894
9894
|
this._emit("navigationfailed", error);
|
|
9895
9895
|
};
|
|
9896
9896
|
}
|
|
9897
|
-
async goto(url,
|
|
9897
|
+
async goto(url, _opts) {
|
|
9898
9898
|
await this.view.navigate(url);
|
|
9899
9899
|
await new Promise((r) => setTimeout(r, 200));
|
|
9900
9900
|
}
|
|
@@ -9917,14 +9917,14 @@ var init_browser_bun = __esm(() => {
|
|
|
9917
9917
|
}
|
|
9918
9918
|
return this.view.evaluate(expr);
|
|
9919
9919
|
}
|
|
9920
|
-
async screenshot(
|
|
9920
|
+
async screenshot(_opts) {
|
|
9921
9921
|
const uint8 = await this.view.screenshot();
|
|
9922
9922
|
return Buffer.from(uint8);
|
|
9923
9923
|
}
|
|
9924
9924
|
async click(selector, opts) {
|
|
9925
9925
|
await this.view.click(selector, opts ? { button: opts.button } : undefined);
|
|
9926
9926
|
}
|
|
9927
|
-
async type(selector, text,
|
|
9927
|
+
async type(selector, text, _opts) {
|
|
9928
9928
|
try {
|
|
9929
9929
|
await this.view.click(selector);
|
|
9930
9930
|
} catch {}
|
|
@@ -10019,7 +10019,7 @@ var init_browser_bun = __esm(() => {
|
|
|
10019
10019
|
})()
|
|
10020
10020
|
`);
|
|
10021
10021
|
}
|
|
10022
|
-
async setInputFiles(
|
|
10022
|
+
async setInputFiles(_selector, _files) {
|
|
10023
10023
|
throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
|
|
10024
10024
|
}
|
|
10025
10025
|
getByRole(role, opts) {
|
|
@@ -10069,11 +10069,10 @@ var init_browser_bun = __esm(() => {
|
|
|
10069
10069
|
})
|
|
10070
10070
|
};
|
|
10071
10071
|
}
|
|
10072
|
-
getByText(text,
|
|
10073
|
-
const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
|
|
10072
|
+
getByText(text, _opts) {
|
|
10074
10073
|
return {
|
|
10075
10074
|
first: () => ({
|
|
10076
|
-
click: async (
|
|
10075
|
+
click: async (_clickOpts) => {
|
|
10077
10076
|
await this.view.evaluate(`
|
|
10078
10077
|
(() => {
|
|
10079
10078
|
const text = ${JSON.stringify(text)};
|
|
@@ -10140,7 +10139,7 @@ var init_browser_bun = __esm(() => {
|
|
|
10140
10139
|
viewportSize() {
|
|
10141
10140
|
return { width: 1280, height: 720 };
|
|
10142
10141
|
}
|
|
10143
|
-
async waitForLoadState(
|
|
10142
|
+
async waitForLoadState(_state, _opts) {
|
|
10144
10143
|
await new Promise((r) => setTimeout(r, 200));
|
|
10145
10144
|
}
|
|
10146
10145
|
async waitForURL(pattern, opts) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hasna/testers",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "AI-powered QA testing CLI
|
|
3
|
+
"version": "0.0.19",
|
|
4
|
+
"description": "AI-powered QA testing CLI \u2014 spawns cheap AI agents to test web apps with headless browsers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
"dev:cli": "bun run src/cli/index.tsx",
|
|
36
36
|
"dev:mcp": "bun run src/mcp/index.ts",
|
|
37
37
|
"dev:serve": "bun run src/server/index.ts",
|
|
38
|
-
"prepublishOnly": "bun run build"
|
|
38
|
+
"prepublishOnly": "bun run build",
|
|
39
|
+
"postinstall": "mkdir -p $HOME/.hasna/testers/screenshots $HOME/.hasna/testers/browser/profiles 2>/dev/null || true"
|
|
39
40
|
},
|
|
40
41
|
"dependencies": {
|
|
41
42
|
"@anthropic-ai/sdk": "^0.52.0",
|
|
@@ -76,4 +77,4 @@
|
|
|
76
77
|
"cli",
|
|
77
78
|
"mcp"
|
|
78
79
|
]
|
|
79
|
-
}
|
|
80
|
+
}
|