@batijs/cli 0.0.86 → 0.0.88
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/boilerplates/@batijs/edgedb/files/$package.json.js +3 -3
- package/dist/boilerplates/@batijs/edgedb/{package-KT5MTOEW.js → package-Z3MWAXVW.js} +2 -2
- package/dist/boilerplates/@batijs/eslint/files/$package.json.js +17 -0
- package/dist/boilerplates/@batijs/eslint/files/.eslintignore +7 -0
- package/dist/boilerplates/@batijs/eslint/files/.eslintrc.json +10 -0
- package/dist/boilerplates/@batijs/eslint/package-6IZEDCMJ.js +61 -0
- package/dist/boilerplates/@batijs/express/files/$package.json.js +4 -4
- package/dist/boilerplates/@batijs/express/files/express-entry.ts +1 -1
- package/dist/boilerplates/@batijs/express/{package-SRLMDQOG.js → package-TAXLRPPG.js} +4 -4
- package/dist/boilerplates/@batijs/h3/files/$package.json.js +4 -4
- package/dist/boilerplates/@batijs/h3/files/h3-entry.ts +1 -1
- package/dist/boilerplates/@batijs/h3/{package-FGRNBFRV.js → package-GAI6KFVK.js} +4 -4
- package/dist/boilerplates/@batijs/hattip/files/$package.json.js +4 -4
- package/dist/boilerplates/@batijs/hattip/files/$vite.config.ts.js +2 -2
- package/dist/boilerplates/@batijs/hattip/{package-QHKHWIGI.js → package-3BN33DJA.js} +4 -4
- package/dist/boilerplates/@batijs/prisma/files/$.env.js +2 -2
- package/dist/boilerplates/@batijs/prisma/files/$package.json.js +3 -3
- package/dist/boilerplates/@batijs/prisma/{package-ZSTKB5SK.js → package-5JR5MUIX.js} +3 -3
- package/dist/boilerplates/@batijs/react/files/$.eslintrc.json.js +16 -0
- package/dist/boilerplates/@batijs/react/files/$package.json.js +8 -3
- package/dist/boilerplates/@batijs/react/files/$tsconfig.json.js +2 -2
- package/dist/boilerplates/@batijs/react/files/$vite.config.ts.js +6 -4
- package/dist/boilerplates/@batijs/react/files/components/Link.tsx +8 -10
- package/dist/boilerplates/@batijs/react/files/layouts/LayoutDefault.tsx +1 -1
- package/dist/boilerplates/@batijs/react/files/pages/_error/+Page.tsx +1 -3
- package/dist/boilerplates/@batijs/react/files/pages/index/Counter.tsx +1 -3
- package/dist/boilerplates/@batijs/react/files/pages/star-wars/@id/+Page.tsx +1 -3
- package/dist/boilerplates/@batijs/react/files/pages/star-wars/@id/+onBeforeRender.ts +2 -4
- package/dist/boilerplates/@batijs/react/files/pages/star-wars/filterMovieData.ts +1 -5
- package/dist/boilerplates/@batijs/react/files/pages/star-wars/index/+Page.tsx +1 -3
- package/dist/boilerplates/@batijs/react/files/pages/star-wars/index/+onBeforeRender.ts +2 -5
- package/dist/boilerplates/@batijs/react/{package-7UIWNLCR.js → package-EYTH4VNP.js} +9 -5
- package/dist/boilerplates/@batijs/react-telefunc/files/database/todoItems.ts +2 -5
- package/dist/boilerplates/@batijs/react-telefunc/files/pages/todo/+config.h.ts +3 -1
- package/dist/boilerplates/@batijs/react-telefunc/files/pages/todo/+onBeforeRender.ts +1 -3
- package/dist/boilerplates/@batijs/react-telefunc/files/pages/todo/TodoList.telefunc.ts +2 -4
- package/dist/boilerplates/@batijs/shared/files/$index.html.js +2 -2
- package/dist/boilerplates/@batijs/shared/files/package.json +1 -1
- package/dist/boilerplates/@batijs/solid/files/$.eslintrc.json.js +13 -0
- package/dist/boilerplates/@batijs/solid/files/$package.json.js +8 -3
- package/dist/boilerplates/@batijs/solid/files/$tsconfig.json.js +2 -2
- package/dist/boilerplates/@batijs/solid/files/$vite.config.ts.js +3 -3
- package/dist/boilerplates/@batijs/solid/files/layouts/HeadDefault.tsx +1 -1
- package/dist/boilerplates/@batijs/solid/files/pages/_error/+Page.tsx +17 -16
- package/dist/boilerplates/@batijs/solid/files/pages/star-wars/index/+Page.tsx +1 -1
- package/dist/boilerplates/@batijs/solid/files/pages/star-wars/index/+onBeforeRender.ts +3 -2
- package/dist/boilerplates/@batijs/solid/{package-4C6WDKEK.js → package-3SC4XVSR.js} +5 -4
- package/dist/boilerplates/@batijs/solid-telefunc/files/pages/todo/+Page.tsx +3 -4
- package/dist/boilerplates/@batijs/solid-telefunc/files/pages/todo/+onBeforeRender.ts +2 -2
- package/dist/boilerplates/@batijs/solid-telefunc/files/pages/todo/TodoList.tsx +3 -4
- package/dist/boilerplates/@batijs/tailwindcss/files/$package.json.js +3 -3
- package/dist/boilerplates/@batijs/tailwindcss/{package-V23T5FWL.js → package-GTN2QH7M.js} +3 -3
- package/dist/boilerplates/@batijs/telefunc/files/$package.json.js +3 -3
- package/dist/boilerplates/@batijs/telefunc/files/$vite.config.ts.js +2 -2
- package/dist/boilerplates/@batijs/telefunc/{package-FVE6G445.js → package-3G2SQFKV.js} +3 -3
- package/dist/boilerplates/@batijs/vercel/files/$package.json.js +3 -3
- package/dist/boilerplates/@batijs/vercel/files/$vite.config.ts.js +2 -2
- package/dist/boilerplates/@batijs/vercel/{package-4ZQYRTJA.js → package-2NMHCJGC.js} +5 -5
- package/dist/boilerplates/@batijs/vue/files/$.eslintrc.json.js +16 -0
- package/dist/boilerplates/@batijs/vue/files/$package.json.js +15 -4
- package/dist/boilerplates/@batijs/vue/files/$tsconfig.json.js +2 -2
- package/dist/boilerplates/@batijs/vue/files/$vite.config.ts.js +2 -2
- package/dist/boilerplates/@batijs/vue/files/components/Counter.vue +2 -2
- package/dist/boilerplates/@batijs/vue/files/components/Link.vue +13 -11
- package/dist/boilerplates/@batijs/vue/files/components/Logo.vue +5 -1
- package/dist/boilerplates/@batijs/vue/files/layouts/HeadDefault.vue +9 -2
- package/dist/boilerplates/@batijs/vue/files/layouts/LayoutDefault.vue +9 -3
- package/dist/boilerplates/@batijs/vue/files/pages/star-wars/@id/+Page.vue +8 -3
- package/dist/boilerplates/@batijs/vue/files/pages/star-wars/index/+Page.vue +10 -2
- package/dist/boilerplates/@batijs/vue/files/pages/star-wars/index/+onBeforeRender.ts +3 -2
- package/dist/boilerplates/@batijs/vue/{package-BURNOCV3.js → package-SEZV7AAY.js} +5 -4
- package/dist/boilerplates/@batijs/vue-telefunc/files/components/TodoList.vue +15 -4
- package/dist/boilerplates/@batijs/vue-telefunc/files/pages/todo/+Page.vue +3 -2
- package/dist/boilerplates/boilerplates.json +15 -1
- package/dist/index.js +85 -53
- package/package.json +5 -12
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// package.json
|
|
2
2
|
var name = "@batijs/vue";
|
|
3
3
|
var private2 = true;
|
|
4
|
-
var version = "0.0.
|
|
4
|
+
var version = "0.0.88";
|
|
5
5
|
var description = "";
|
|
6
6
|
var type = "module";
|
|
7
7
|
var scripts = {
|
|
@@ -13,17 +13,18 @@ var license = "MIT";
|
|
|
13
13
|
var devDependencies = {
|
|
14
14
|
"@batijs/tsup": "workspace:*",
|
|
15
15
|
"@types/node": "^16.18.40",
|
|
16
|
-
"@vitejs/plugin-vue": "^4.
|
|
16
|
+
"@vitejs/plugin-vue": "^4.4.0",
|
|
17
17
|
"@vue/compiler-sfc": "^3.3.4",
|
|
18
18
|
"@vue/server-renderer": "^3.3.4",
|
|
19
19
|
"cross-fetch": "^4.0.0",
|
|
20
|
+
"eslint-plugin-vue": "^9.17.0",
|
|
20
21
|
tailwindcss: "^3.3.3",
|
|
21
22
|
tsup: "^7.2.0",
|
|
22
23
|
typescript: "^5.2.2",
|
|
23
24
|
"unplugin-vue-markdown": "^0.24.3",
|
|
25
|
+
vike: "^0.4.143",
|
|
24
26
|
"vike-vue": "^0.4.0",
|
|
25
|
-
vite: "^4.4.
|
|
26
|
-
vike: "^0.4.142",
|
|
27
|
+
vite: "^4.4.11",
|
|
27
28
|
vue: "^3.3.4"
|
|
28
29
|
};
|
|
29
30
|
var dependencies = {
|
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<ul>
|
|
3
|
-
<li
|
|
3
|
+
<li
|
|
4
|
+
v-for="item in todoItems"
|
|
5
|
+
:key="item.text"
|
|
6
|
+
>
|
|
7
|
+
{{ item.text }}
|
|
8
|
+
</li>
|
|
4
9
|
<li>
|
|
5
10
|
<form @submit.prevent="submitDraft()">
|
|
6
|
-
<input
|
|
7
|
-
|
|
11
|
+
<input
|
|
12
|
+
v-model="draft"
|
|
13
|
+
type="text"
|
|
14
|
+
>{{ " " }}
|
|
15
|
+
<button type="submit">
|
|
16
|
+
Add to-do
|
|
17
|
+
</button>
|
|
8
18
|
</form>
|
|
9
19
|
</li>
|
|
10
20
|
</ul>
|
|
11
21
|
</template>
|
|
12
22
|
|
|
13
23
|
<script lang="ts" setup>
|
|
24
|
+
import { ref, useAttrs } from "vue";
|
|
14
25
|
import { onNewTodo } from "./TodoList.telefunc.js";
|
|
15
|
-
|
|
26
|
+
|
|
16
27
|
const { todoItemsInitial } = useAttrs();
|
|
17
28
|
|
|
18
29
|
const todoItems = ref(todoItemsInitial);
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
3
|
<h1>To-do List</h1>
|
|
4
|
-
<TodoList :
|
|
4
|
+
<TodoList :todo-items-initial="todoItemsInitial" />
|
|
5
5
|
<Counter />
|
|
6
6
|
</div>
|
|
7
7
|
</template>
|
|
8
8
|
|
|
9
9
|
<script lang="ts" setup>
|
|
10
|
-
import { useAttrs } from
|
|
10
|
+
import { useAttrs } from "vue";
|
|
11
|
+
|
|
11
12
|
const { todoItemsInitial } = useAttrs();
|
|
12
13
|
</script>
|
|
13
14
|
|
|
@@ -22,6 +22,18 @@
|
|
|
22
22
|
"hooks"
|
|
23
23
|
]
|
|
24
24
|
},
|
|
25
|
+
{
|
|
26
|
+
"config": {
|
|
27
|
+
"flag": "eslint",
|
|
28
|
+
"name": "ESLint",
|
|
29
|
+
"homepage": "https://eslint.org"
|
|
30
|
+
},
|
|
31
|
+
"folder": "@batijs/eslint",
|
|
32
|
+
"description": "",
|
|
33
|
+
"subfolders": [
|
|
34
|
+
"files"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
25
37
|
{
|
|
26
38
|
"config": {
|
|
27
39
|
"flag": "express",
|
|
@@ -107,7 +119,9 @@
|
|
|
107
119
|
]
|
|
108
120
|
},
|
|
109
121
|
{
|
|
110
|
-
"config": {
|
|
122
|
+
"config": {
|
|
123
|
+
"enforce": "pre"
|
|
124
|
+
},
|
|
111
125
|
"folder": "@batijs/shared",
|
|
112
126
|
"description": "",
|
|
113
127
|
"subfolders": [
|
package/dist/index.js
CHANGED
|
@@ -448,11 +448,25 @@ async function runMain(cmd, opts = {}) {
|
|
|
448
448
|
}
|
|
449
449
|
}
|
|
450
450
|
|
|
451
|
-
// ../build/dist/
|
|
452
|
-
import { loadFile, renderSquirrelly, transformAstAndGenerate } from "@batijs/core";
|
|
451
|
+
// ../build/dist/index.js
|
|
453
452
|
import { existsSync } from "fs";
|
|
454
453
|
import { copyFile, mkdir, opendir, readFile, writeFile } from "fs/promises";
|
|
455
454
|
import path from "path";
|
|
455
|
+
import { loadFile, renderSquirrelly, transformAstAndGenerate } from "@batijs/core";
|
|
456
|
+
function queue() {
|
|
457
|
+
const tasks = [];
|
|
458
|
+
return {
|
|
459
|
+
add(task) {
|
|
460
|
+
tasks.push(task);
|
|
461
|
+
},
|
|
462
|
+
async run() {
|
|
463
|
+
let task;
|
|
464
|
+
while (task = tasks.shift()) {
|
|
465
|
+
await task();
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
}
|
|
456
470
|
var reIgnoreFile = /^(chunk-|asset-|#)/gi;
|
|
457
471
|
var isWin = process.platform === "win32";
|
|
458
472
|
function toDist(filepath, source, dist) {
|
|
@@ -508,9 +522,16 @@ async function fileContainsBatiMeta(filepath) {
|
|
|
508
522
|
const code = await readFile(filepath, { encoding: "utf-8" });
|
|
509
523
|
return code.includes("import.meta.BATI_");
|
|
510
524
|
}
|
|
525
|
+
async function importTransformer(p) {
|
|
526
|
+
const importFile = isWin ? "file://" + p : p;
|
|
527
|
+
const f = await import(importFile);
|
|
528
|
+
return f.default;
|
|
529
|
+
}
|
|
511
530
|
async function main(options, meta) {
|
|
512
531
|
const sources = Array.isArray(options.source) ? options.source : [options.source];
|
|
513
532
|
const targets = /* @__PURE__ */ new Set();
|
|
533
|
+
const simpleCopyQ = queue();
|
|
534
|
+
const transformAndWriteQ = queue();
|
|
514
535
|
for (const source of sources) {
|
|
515
536
|
for await (const p of walk(source)) {
|
|
516
537
|
const target = toDist(p, source, options.dist);
|
|
@@ -523,53 +544,67 @@ async function main(options, meta) {
|
|
|
523
544
|
Please report this issue to https://github.com/magne4000/bati`
|
|
524
545
|
);
|
|
525
546
|
} else if (parsed.name.startsWith("$") && parsed.ext.match(/\.jsx?$/)) {
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
547
|
+
transformAndWriteQ.add(async () => {
|
|
548
|
+
const transformer = await importTransformer(p);
|
|
549
|
+
const rf = () => {
|
|
550
|
+
return readFile(target, { encoding: "utf-8" });
|
|
551
|
+
};
|
|
552
|
+
const fileContent = transformFileAfterExec(
|
|
553
|
+
target,
|
|
554
|
+
await transformer({
|
|
555
|
+
readfile: targets.has(target) ? rf : void 0,
|
|
556
|
+
meta,
|
|
557
|
+
source,
|
|
558
|
+
target
|
|
559
|
+
})
|
|
560
|
+
);
|
|
561
|
+
if (fileContent !== null) {
|
|
562
|
+
await safeWriteFile(target, fileContent);
|
|
563
|
+
targets.add(target);
|
|
564
|
+
}
|
|
565
|
+
});
|
|
536
566
|
} else if (await fileContainsBatiMeta(p)) {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
567
|
+
transformAndWriteQ.add(async () => {
|
|
568
|
+
let fileContent = "";
|
|
569
|
+
if (parsed.ext.match(/\.[tj]sx?$/)) {
|
|
570
|
+
const mod = await loadFile(p);
|
|
571
|
+
fileContent = await transformAstAndGenerate(mod.$ast, meta, {
|
|
572
|
+
filepath: p
|
|
573
|
+
});
|
|
574
|
+
} else {
|
|
575
|
+
const template = await readFile(p, { encoding: "utf-8" });
|
|
576
|
+
try {
|
|
577
|
+
fileContent = renderSquirrelly(template, meta);
|
|
578
|
+
} catch (e) {
|
|
579
|
+
console.error("SquirrellyJS error while rendering", p);
|
|
580
|
+
throw e;
|
|
581
|
+
}
|
|
550
582
|
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
583
|
+
if (fileContent) {
|
|
584
|
+
await safeWriteFile(target, fileContent);
|
|
585
|
+
targets.add(target);
|
|
586
|
+
}
|
|
587
|
+
});
|
|
556
588
|
} else {
|
|
557
|
-
|
|
558
|
-
|
|
589
|
+
simpleCopyQ.add(async () => {
|
|
590
|
+
await safeCopyFile(p, target);
|
|
591
|
+
targets.add(target);
|
|
592
|
+
});
|
|
559
593
|
}
|
|
560
594
|
}
|
|
561
595
|
}
|
|
596
|
+
await simpleCopyQ.run();
|
|
597
|
+
await transformAndWriteQ.run();
|
|
562
598
|
}
|
|
563
599
|
|
|
564
600
|
// package.json
|
|
565
601
|
var package_default = {
|
|
566
602
|
name: "@batijs/cli",
|
|
567
|
-
version: "0.0.
|
|
603
|
+
version: "0.0.88",
|
|
568
604
|
type: "module",
|
|
569
605
|
scripts: {
|
|
570
606
|
prerelease: "rimraf ./dist",
|
|
571
607
|
prepublishOnly: "pnpm run build",
|
|
572
|
-
test: "pnpm run build && vitest run",
|
|
573
608
|
build: "rimraf ./dist && tsup"
|
|
574
609
|
},
|
|
575
610
|
keywords: [],
|
|
@@ -585,17 +620,11 @@ var package_default = {
|
|
|
585
620
|
citty: "^0.1.4",
|
|
586
621
|
colorette: "^2.0.20",
|
|
587
622
|
esbuild: "^0.19.4",
|
|
588
|
-
espree: "^9.6.1",
|
|
589
623
|
execa: "^8.0.1",
|
|
590
|
-
"get-port": "^7.0.0",
|
|
591
|
-
"node-fetch": "^3.3.2",
|
|
592
624
|
rimraf: "^5.0.5",
|
|
593
|
-
"tree-kill": "^1.2.2",
|
|
594
625
|
tsup: "^7.2.0",
|
|
595
626
|
typescript: "^5.2.2",
|
|
596
|
-
vite: "^4.4.
|
|
597
|
-
vitest: "^0.34.6",
|
|
598
|
-
which: "^4.0.0"
|
|
627
|
+
vite: "^4.4.11"
|
|
599
628
|
},
|
|
600
629
|
dependencies: {
|
|
601
630
|
"@batijs/core": "workspace:*"
|
|
@@ -907,13 +936,13 @@ async function retrieveHooks(hooks) {
|
|
|
907
936
|
return map;
|
|
908
937
|
}
|
|
909
938
|
function testFlags(flags, bl) {
|
|
910
|
-
if (
|
|
911
|
-
return
|
|
939
|
+
if (bl.config.flag) {
|
|
940
|
+
return flags.includes(bl.config.flag);
|
|
912
941
|
}
|
|
913
942
|
if (Array.isArray(bl.config.includeIf)) {
|
|
914
943
|
return bl.config.includeIf.every((f) => flags.includes(f));
|
|
915
944
|
}
|
|
916
|
-
return
|
|
945
|
+
return true;
|
|
917
946
|
}
|
|
918
947
|
async function run() {
|
|
919
948
|
const dir = boilerplatesDir();
|
|
@@ -936,15 +965,18 @@ async function run() {
|
|
|
936
965
|
const features = [];
|
|
937
966
|
const flags = Object.entries(args).filter(([, val]) => val === true).map(([key]) => key);
|
|
938
967
|
checkRules(flags);
|
|
939
|
-
|
|
940
|
-
if (
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
968
|
+
boilerplates.sort((b1, b2) => {
|
|
969
|
+
if (b1.config.enforce === "pre")
|
|
970
|
+
return -1;
|
|
971
|
+
if (b1.config.enforce === "post")
|
|
972
|
+
return 1;
|
|
973
|
+
if (b2.config.enforce === "pre")
|
|
974
|
+
return 1;
|
|
975
|
+
if (b2.config.enforce === "post")
|
|
976
|
+
return -1;
|
|
977
|
+
return 0;
|
|
978
|
+
});
|
|
979
|
+
for (const bl of boilerplates) {
|
|
948
980
|
if (testFlags(flags, bl)) {
|
|
949
981
|
if (bl.subfolders.includes("files")) {
|
|
950
982
|
sources.push(join(dir, bl.folder, "files"));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@batijs/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.88",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"description": "Next-gen scaffolder. Get started with fully-functional apps, and choose any tool you want",
|
|
@@ -13,22 +13,16 @@
|
|
|
13
13
|
"citty": "^0.1.4",
|
|
14
14
|
"colorette": "^2.0.20",
|
|
15
15
|
"esbuild": "^0.19.4",
|
|
16
|
-
"espree": "^9.6.1",
|
|
17
16
|
"execa": "^8.0.1",
|
|
18
|
-
"get-port": "^7.0.0",
|
|
19
|
-
"node-fetch": "^3.3.2",
|
|
20
17
|
"rimraf": "^5.0.5",
|
|
21
|
-
"tree-kill": "^1.2.2",
|
|
22
18
|
"tsup": "^7.2.0",
|
|
23
19
|
"typescript": "^5.2.2",
|
|
24
|
-
"vite": "^4.4.
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"@batijs/build": "0.0.86",
|
|
28
|
-
"@batijs/tsup": "0.0.86"
|
|
20
|
+
"vite": "^4.4.11",
|
|
21
|
+
"@batijs/build": "0.0.88",
|
|
22
|
+
"@batijs/tsup": "0.0.88"
|
|
29
23
|
},
|
|
30
24
|
"dependencies": {
|
|
31
|
-
"@batijs/core": "0.0.
|
|
25
|
+
"@batijs/core": "0.0.88"
|
|
32
26
|
},
|
|
33
27
|
"bin": "./dist/index.js",
|
|
34
28
|
"exports": {
|
|
@@ -39,7 +33,6 @@
|
|
|
39
33
|
],
|
|
40
34
|
"scripts": {
|
|
41
35
|
"prerelease": "rimraf ./dist",
|
|
42
|
-
"test": "pnpm run build && vitest run",
|
|
43
36
|
"build": "rimraf ./dist && tsup"
|
|
44
37
|
}
|
|
45
38
|
}
|