@vitalscope/cli 0.0.0-stage → 0.1.0
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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +60 -2
- package/SECURITY.md +16 -0
- package/dist/app.js +70 -0
- package/dist/app.js.map +1 -0
- package/dist/buffer.js +115 -0
- package/dist/buffer.js.map +1 -0
- package/dist/cli.js +12 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.js +92 -0
- package/dist/commands.js.map +1 -0
- package/dist/fingerprint.js +56 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/live.js +37 -0
- package/dist/live.js.map +1 -0
- package/dist/node-version.js +7 -0
- package/dist/node-version.js.map +1 -0
- package/dist/origin.js +26 -0
- package/dist/origin.js.map +1 -0
- package/dist/panel/assets/index-BMlDnoZj.css +1 -0
- package/dist/panel/assets/index-D-PRDDvW.js +12 -0
- package/dist/panel/index.html +14 -0
- package/dist/panel.js +108 -0
- package/dist/panel.js.map +1 -0
- package/dist/queries.js +290 -0
- package/dist/queries.js.map +1 -0
- package/dist/report.js +99 -0
- package/dist/report.js.map +1 -0
- package/dist/rows.js +57 -0
- package/dist/rows.js.map +1 -0
- package/dist/server.js +33 -0
- package/dist/server.js.map +1 -0
- package/dist/sqlite.js +99 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/start.js +48 -0
- package/dist/start.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -3
package/dist/server.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { serve } from "@hono/node-server";
|
|
2
|
+
/** Kapanışta tamponu yazmak için tanınan süre; orkestratörün `SIGKILL` süresinden kısa olmalı. */
|
|
3
|
+
const DEFAULT_DRAIN_TIMEOUT_MS = 10_000;
|
|
4
|
+
/** Bitmeyen bir istek (yavaş gönderen istemci) tamponun yazılmasını engellemesin. */
|
|
5
|
+
const CLOSE_GRACE_MS = 2_000;
|
|
6
|
+
export function startServer(app, buffer, { port, hostname, drainTimeoutMs = DEFAULT_DRAIN_TIMEOUT_MS }) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const options = hostname ? { fetch: app.fetch, port, hostname } : { fetch: app.fetch, port };
|
|
9
|
+
const server = serve(options, (info) => {
|
|
10
|
+
server.off("error", reject);
|
|
11
|
+
let closing;
|
|
12
|
+
resolve({
|
|
13
|
+
port: info.port,
|
|
14
|
+
shutdown: () => (closing ??= new Promise((closed) => {
|
|
15
|
+
const force = setTimeout(() => {
|
|
16
|
+
if ("closeAllConnections" in server)
|
|
17
|
+
server.closeAllConnections();
|
|
18
|
+
}, CLOSE_GRACE_MS);
|
|
19
|
+
server.close(() => {
|
|
20
|
+
clearTimeout(force);
|
|
21
|
+
closed();
|
|
22
|
+
});
|
|
23
|
+
// Boştaki keep-alive bağlantıları kapanışı bekletmesin.
|
|
24
|
+
if ("closeIdleConnections" in server)
|
|
25
|
+
server.closeIdleConnections();
|
|
26
|
+
}).then(() => buffer.drain(drainTimeoutMs))),
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
// Port doluysa süreç yakalanmamış hatayla düşmesin; çağıran açıklamalı mesaj yazar.
|
|
30
|
+
server.once("error", reject);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAI1C,kGAAkG;AAClG,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,qFAAqF;AACrF,MAAM,cAAc,GAAG,KAAK,CAAC;AAQ7B,MAAM,UAAU,WAAW,CACzB,GAAS,EACT,MAAmB,EACnB,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,wBAAwB,EAAgE;IAE3H,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC7F,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,IAAiB,EAAE,EAAE;YAClD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,IAAI,OAAoC,CAAC;YACzC,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,GAAG,EAAE,CACb,CAAC,OAAO,KAAK,IAAI,OAAO,CAAO,CAAC,MAAM,EAAE,EAAE;oBACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC5B,IAAI,qBAAqB,IAAI,MAAM;4BAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC;oBACpE,CAAC,EAAE,cAAc,CAAC,CAAC;oBACnB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;wBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;wBACpB,MAAM,EAAE,CAAC;oBACX,CAAC,CAAC,CAAC;oBACH,wDAAwD;oBACxD,IAAI,sBAAsB,IAAI,MAAM;wBAAE,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBACtE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,oFAAoF;QACpF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/sqlite.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { DatabaseSync } from "node:sqlite";
|
|
4
|
+
import { toRows } from "./rows.js";
|
|
5
|
+
export const DB_FILE = "vitalscope.db";
|
|
6
|
+
const COMMON = ["ts", "received_at", "sample_rate", "sdk", "path", "route", "release", "env", "device", "conn", "nav_type", "session_id"];
|
|
7
|
+
const COLUMNS = {
|
|
8
|
+
vitals: [...COMMON, "name", "metric_id", "value", "rating", "attr_target", "attr_url", "attr_script", "attr_type", "attr"],
|
|
9
|
+
errors: [...COMMON, "type", "message", "stack", "handled"],
|
|
10
|
+
pageviews: COMMON,
|
|
11
|
+
custom_events: [...COMMON, "name", "value"],
|
|
12
|
+
};
|
|
13
|
+
const COMMON_SCHEMA = `
|
|
14
|
+
ts INTEGER NOT NULL,
|
|
15
|
+
received_at INTEGER NOT NULL,
|
|
16
|
+
sample_rate REAL NOT NULL,
|
|
17
|
+
sdk TEXT NOT NULL,
|
|
18
|
+
path TEXT NOT NULL,
|
|
19
|
+
route TEXT,
|
|
20
|
+
release TEXT,
|
|
21
|
+
env TEXT NOT NULL,
|
|
22
|
+
device TEXT NOT NULL,
|
|
23
|
+
conn TEXT,
|
|
24
|
+
nav_type TEXT,
|
|
25
|
+
session_id TEXT NOT NULL`;
|
|
26
|
+
const SCHEMA = `
|
|
27
|
+
CREATE TABLE IF NOT EXISTS vitals (${COMMON_SCHEMA},
|
|
28
|
+
name TEXT NOT NULL,
|
|
29
|
+
metric_id TEXT NOT NULL,
|
|
30
|
+
value REAL NOT NULL,
|
|
31
|
+
rating TEXT NOT NULL,
|
|
32
|
+
attr_target TEXT,
|
|
33
|
+
attr_url TEXT,
|
|
34
|
+
attr_script TEXT,
|
|
35
|
+
attr_type TEXT,
|
|
36
|
+
attr TEXT
|
|
37
|
+
);
|
|
38
|
+
CREATE TABLE IF NOT EXISTS errors (${COMMON_SCHEMA},
|
|
39
|
+
type TEXT NOT NULL,
|
|
40
|
+
message TEXT NOT NULL,
|
|
41
|
+
stack TEXT NOT NULL,
|
|
42
|
+
handled INTEGER NOT NULL
|
|
43
|
+
);
|
|
44
|
+
-- Genel bakış yüzdelikleri bu index'lerde sıra atlayarak bulur; zaman ve cihaz filtresi de tabloya inmez.
|
|
45
|
+
CREATE INDEX IF NOT EXISTS vitals_metric ON vitals (env, name, value, ts, device);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS vitals_page ON vitals (env, COALESCE(route, path), name, value, ts, device);
|
|
47
|
+
CREATE TABLE IF NOT EXISTS pageviews (${COMMON_SCHEMA});
|
|
48
|
+
CREATE TABLE IF NOT EXISTS custom_events (${COMMON_SCHEMA},
|
|
49
|
+
name TEXT NOT NULL,
|
|
50
|
+
value REAL
|
|
51
|
+
);`;
|
|
52
|
+
/** Klasörü ve veritabanını gerekirse oluşturur. Klasördeki `.gitignore` ölçümlerin commit'lenmesini önler. */
|
|
53
|
+
export function openStore(dir) {
|
|
54
|
+
mkdirSync(dir, { recursive: true });
|
|
55
|
+
writeFileSync(join(dir, ".gitignore"), "*\n");
|
|
56
|
+
const db = new DatabaseSync(join(dir, DB_FILE));
|
|
57
|
+
// WAL: rapor ve panel, toplayıcı yazarken de okuyabilir. Kilitliyse kısa süre beklenir; sonrası tamponun yeniden denemesi.
|
|
58
|
+
db.exec("PRAGMA journal_mode = WAL; PRAGMA busy_timeout = 1000;");
|
|
59
|
+
db.exec(SCHEMA);
|
|
60
|
+
// Aynı metrik örneği değeri büyüdükçe yeniden gönderilir; tabloda sadece son değeri kalır, sorgular ayıklamaz.
|
|
61
|
+
// Önceki sürümün yazdığı tekrarlar index'ten önce temizlenir.
|
|
62
|
+
if (!db.prepare("SELECT 1 FROM sqlite_master WHERE name = 'vitals_sample'").get()) {
|
|
63
|
+
db.exec(`DELETE FROM vitals WHERE rowid NOT IN (SELECT MAX(rowid) FROM vitals GROUP BY session_id, metric_id);
|
|
64
|
+
CREATE UNIQUE INDEX vitals_sample ON vitals (session_id, metric_id);`);
|
|
65
|
+
}
|
|
66
|
+
const inserts = Object.entries(COLUMNS).map(([table, columns]) => {
|
|
67
|
+
const latest = `ON CONFLICT (session_id, metric_id) DO UPDATE SET ${columns.map((column) => `${column} = excluded.${column}`).join(", ")}`;
|
|
68
|
+
const values = `VALUES (${columns.map((column) => `:${column}`).join(", ")})`;
|
|
69
|
+
return {
|
|
70
|
+
table: table,
|
|
71
|
+
columns,
|
|
72
|
+
statement: db.prepare(`INSERT INTO ${table} (${columns.join(", ")}) ${values}${table === "vitals" ? ` ${latest}` : ""}`),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
db,
|
|
77
|
+
sink: {
|
|
78
|
+
// Tek transaction: parti ya tamamen yazılır ya hiç, yeniden deneme çift kayıt üretmez.
|
|
79
|
+
async write(events) {
|
|
80
|
+
const rows = toRows(events);
|
|
81
|
+
db.exec("BEGIN");
|
|
82
|
+
try {
|
|
83
|
+
for (const { table, columns, statement } of inserts) {
|
|
84
|
+
for (const row of rows[table]) {
|
|
85
|
+
statement.run(Object.fromEntries(columns.map((column) => [column, (row[column] ?? null)])));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
db.exec("COMMIT");
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
db.exec("ROLLBACK");
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
close: () => db.close(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/start.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import { createApp } from "./app.js";
|
|
3
|
+
import { createEventBuffer } from "./buffer.js";
|
|
4
|
+
import { createLive } from "./live.js";
|
|
5
|
+
import { loadPanelAssets } from "./panel.js";
|
|
6
|
+
import { startServer } from "./server.js";
|
|
7
|
+
import { openStore } from "./sqlite.js";
|
|
8
|
+
/** Sadece bu makineden ulaşılır; ağdaki başka cihazlar ölçümleri göremez, veri gönderemez. */
|
|
9
|
+
const HOSTNAME = "127.0.0.1";
|
|
10
|
+
/** Yazma hataları yeniden denenir; görünür olmalarının tek yolu bu. */
|
|
11
|
+
function logFailures(sink) {
|
|
12
|
+
return {
|
|
13
|
+
write: (events) => sink.write(events).catch((error) => {
|
|
14
|
+
console.error(`Could not write ${events.length} events: ${error instanceof Error ? error.message : "unknown error"}`);
|
|
15
|
+
throw error;
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Depoyu ve servisi kurar; `shutdown` tamponu boşaltıp veritabanını da kapatır. */
|
|
20
|
+
export async function start({ port, dir }) {
|
|
21
|
+
const store = openStore(dir);
|
|
22
|
+
const live = createLive();
|
|
23
|
+
const sink = logFailures(store.sink);
|
|
24
|
+
const buffer = createEventBuffer({
|
|
25
|
+
write: async (events) => {
|
|
26
|
+
await sink.write(events);
|
|
27
|
+
live.notify();
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
let server;
|
|
31
|
+
try {
|
|
32
|
+
const assets = loadPanelAssets(fileURLToPath(new URL("./panel/", import.meta.url)));
|
|
33
|
+
server = await startServer(createApp({ buffer, panel: { db: store.db, assets, live } }), buffer, { port, hostname: HOSTNAME });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
store.close();
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
let closing;
|
|
40
|
+
return {
|
|
41
|
+
port: server.port,
|
|
42
|
+
shutdown: () => (closing ??= (live.close(), server.shutdown()).then((lost) => {
|
|
43
|
+
store.close();
|
|
44
|
+
return lost;
|
|
45
|
+
})),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,8FAA8F;AAC9F,MAAM,QAAQ,GAAG,WAAW,CAAC;AAE7B,uEAAuE;AACvE,SAAS,WAAW,CAAC,IAAe;IAClC,OAAO;QACL,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC1C,OAAO,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,MAAM,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;YACtH,MAAM,KAAK,CAAC;QACd,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAiC;IACtE,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC/B,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACtB,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;IACH,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjI,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,OAAoC,CAAC;IACzC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,GAAG,EAAE,CACb,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3D,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;KACN,CAAC;AACJ,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitalscope/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local Core Web Vitals and error panel for development: collects what @vitalscope/sdk measures, with no server, account or Docker",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/emircanbakar/vitalscope.git",
|
|
8
|
+
"directory": "packages/cli"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/emircanbakar/vitalscope/tree/main/packages/cli#readme",
|
|
11
|
+
"bugs": "https://github.com/emircanbakar/vitalscope/issues",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"bin": {
|
|
15
|
+
"vitalscope": "./dist/cli.js"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"CHANGELOG.md",
|
|
20
|
+
"SECURITY.md"
|
|
21
|
+
],
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=24.15.0"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@hono/node-server": "2.1.5",
|
|
27
|
+
"@vitalscope/protocol": "0.1.1",
|
|
28
|
+
"hono": "4.13.16"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "24.19.2",
|
|
32
|
+
"@vitalscope/panel": "0.0.0",
|
|
33
|
+
"typescript": "6.0.3",
|
|
34
|
+
"vitest": "5.0.5"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json && node scripts/copy-panel.mjs",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"seed": "node scripts/seed.mjs"
|
|
44
|
+
}
|
|
6
45
|
}
|