@flun/node-mobile-app 1.0.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/Android /346/236/204/345/273/272/346/214/207/345/215/227.md" +315 -0
- package/LICENSE +29 -0
- package/README.md +448 -0
- package/bin/cli.js +49 -0
- package/cli-assets/server.js +37 -0
- package/mobileAppConfig.js +146 -0
- package/package.json +88 -0
- package/scripts/copy-files.js +37 -0
- package/src/commands/build.js +109 -0
- package/src/commands/clean.js +25 -0
- package/src/commands/test.js +108 -0
- package/src/config.js +112 -0
- package/src/copy.js +235 -0
- package/src/fingerprint.js +102 -0
- package/src/generate.js +102 -0
- package/src/install.js +144 -0
- package/src/patcher.js +374 -0
- package/src/platform-ios.js +142 -0
- package/src/utils.js +131 -0
- package/template/.prettierrc.js +5 -0
- package/template/.watchmanconfig +22 -0
- package/template/@types/nodejs-mobile-react-native/index.d.ts +9 -0
- package/template/App.tsx +108 -0
- package/template/Gemfile +17 -0
- package/template/android/app/build.gradle +127 -0
- package/template/android/app/debug.keystore +0 -0
- package/template/android/app/proguard-rules.pro +10 -0
- package/template/android/app/src/main/AndroidManifest.xml +27 -0
- package/template/android/app/src/main/java/com/myapp/MainActivity.kt +22 -0
- package/template/android/app/src/main/java/com/myapp/MainApplication.kt +27 -0
- package/template/android/app/src/main/res/drawable/rn_edit_text_material.xml +37 -0
- package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/template/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/template/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/template/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/template/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/template/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/template/android/app/src/main/res/raw/keep.xml +1 -0
- package/template/android/app/src/main/res/values/strings.xml +3 -0
- package/template/android/app/src/main/res/values/styles.xml +9 -0
- package/template/android/build.gradle +21 -0
- package/template/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/template/android/gradle/wrapper/gradle-wrapper.properties +7 -0
- package/template/android/gradle.properties +49 -0
- package/template/android/gradlew +248 -0
- package/template/android/gradlew.bat +98 -0
- package/template/android/settings.gradle +6 -0
- package/template/app.json +4 -0
- package/template/babel.config.js +3 -0
- package/template/eslint.config.js +6 -0
- package/template/index.js +12 -0
- package/template/ios/.xcode.env +11 -0
- package/template/ios/MyApp/AppDelegate.swift +55 -0
- package/template/ios/MyApp/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
- package/template/ios/MyApp/Images.xcassets/Contents.json +6 -0
- package/template/ios/MyApp/Info.plist +74 -0
- package/template/ios/MyApp/LaunchScreen.storyboard +47 -0
- package/template/ios/MyApp/PrivacyInfo.xcprivacy +37 -0
- package/template/ios/MyApp.xcodeproj/project.pbxproj +475 -0
- package/template/ios/MyApp.xcodeproj/xcshareddata/xcschemes/MyApp.xcscheme +88 -0
- package/template/ios/Podfile +34 -0
- package/template/metro.config.js +18 -0
- package/template/mobileApp.runtime.d.ts +16 -0
- package/template/package.json +18 -0
- package//350/207/252/345/256/232/344/271/211libnode/346/214/207/345/215/227.md +447 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# Android 构建指南
|
|
2
|
+
|
|
3
|
+
本文档是 [README.md](./README.md) 的**深度附件**。日常使用(`test` / `build`)不需要看——CLI 自动处理。
|
|
4
|
+
|
|
5
|
+
本文档只讲四件事,都是 README 没细说的:
|
|
6
|
+
1. **环境准备**(JDK / SDK / NDK / adb / 原生模块编译)
|
|
7
|
+
2. **libnode.so**(v18 vs v22、预编译仓库、替换、full-icu 验证)
|
|
8
|
+
3. **Express 版本选择**(踩坑清单)
|
|
9
|
+
4. **调试与缓存排查**(logcat 命令、手动清缓存兜底)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 一、环境准备
|
|
14
|
+
|
|
15
|
+
### 1.1 JDK 17(必须)
|
|
16
|
+
|
|
17
|
+
Android Gradle Plugin 不支持 JDK 18+。
|
|
18
|
+
|
|
19
|
+
下载:[Adoptium JDK 17](https://adoptium.net/temurin/releases/?version=17)
|
|
20
|
+
|
|
21
|
+
**CLI 不读 `JAVA_HOME`**,直接用系统 PATH 里的 `java`。确保 `java -version` 输出是 17。
|
|
22
|
+
|
|
23
|
+
### 1.2 Android SDK
|
|
24
|
+
|
|
25
|
+
CLI 自动查找,顺序:
|
|
26
|
+
|
|
27
|
+
1. `mobileAppConfig.js` 的 `android.sdkPath`
|
|
28
|
+
2. 环境变量 `ANDROID_HOME` / `ANDROID_SDK_ROOT`
|
|
29
|
+
3. 常见默认路径(Windows:`%LOCALAPPDATA%\Android\Sdk`)
|
|
30
|
+
|
|
31
|
+
**必需组件**:
|
|
32
|
+
|
|
33
|
+
| 组件 | 版本 |
|
|
34
|
+
| -------------- | ------------------------------------ |
|
|
35
|
+
| SDK Platform | 36 |
|
|
36
|
+
| Build-Tools | 37.0.0 |
|
|
37
|
+
| Platform-Tools | 最新(含 adb) |
|
|
38
|
+
| NDK | 27.1.12297006(libnode.so 编译依赖) |
|
|
39
|
+
|
|
40
|
+
### 1.3 adb
|
|
41
|
+
|
|
42
|
+
查找顺序同 SDK。常用命令:
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
|
|
46
|
+
& $adb devices
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 1.4 原生模块编译开关(Windows)
|
|
50
|
+
|
|
51
|
+
`nodejs-mobile-react-native` 在 Windows 上无法编译原生模块。CLI 首次运行时自动写:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
<buildDir>/nodejs-assets/BUILD_NATIVE_MODULES.txt # 内容: 0
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**例外场景**:用了 v22 的 `libnode.so`,且需要重编原生模块(如 `bcrypt`)。
|
|
58
|
+
|
|
59
|
+
1. `mobileAppConfig.js` 里设 `android.buildNativeModules: true`
|
|
60
|
+
2. 跑 `npx node-mobile-app test`(CLI 写 `1` 并设环境变量 `NODEJS_MOBILE_BUILD_NATIVE_MODULES=1`)
|
|
61
|
+
3. 编完后改回 `false`
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 二、libnode.so
|
|
66
|
+
|
|
67
|
+
`nodejs-mobile-react-native` 用它提供 Node.js 运行时。**是否带 full-icu** 决定能跑哪个 Express 版本。
|
|
68
|
+
|
|
69
|
+
### 2.1 官方 v18(默认随包带)
|
|
70
|
+
|
|
71
|
+
路径:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
<你的项目>/node_modules/nodejs-mobile-react-native/android/libnode/bin/<架构>/libnode.so
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
| 架构 | 大小 |
|
|
78
|
+
| ----------- | ------- |
|
|
79
|
+
| arm64-v8a | 59.6 MB |
|
|
80
|
+
| armeabi-v7a | 56 MB |
|
|
81
|
+
| x86_64 | 62.3 MB |
|
|
82
|
+
|
|
83
|
+
**特点**:`--with-intl=none`,**不含 ICU**。
|
|
84
|
+
|
|
85
|
+
- 不能用 `\p{...}` / `\P{...}` Unicode 正则
|
|
86
|
+
- **必须 Express 4**
|
|
87
|
+
|
|
88
|
+
### 2.2 自编译 v22+(推荐)
|
|
89
|
+
|
|
90
|
+
**官方 v18 已停更**。要跑 Express 5 或新语法,需替换。
|
|
91
|
+
|
|
92
|
+
**预编译产物仓库**:
|
|
93
|
+
|
|
94
|
+
- GitHub:https://github.com/OpenFlun/nodejs-mobile
|
|
95
|
+
- Gitee(国内):https://gitee.com/OpenFlun/nodejs-mobile
|
|
96
|
+
|
|
97
|
+
**当前 Android 支持情况**:
|
|
98
|
+
|
|
99
|
+
| 架构 | v18 | v22 |
|
|
100
|
+
| ----------- | --- | --- |
|
|
101
|
+
| arm64-v8a | ✓ | ✓ |
|
|
102
|
+
| x86_64 | ✓ | ✓ |
|
|
103
|
+
| armeabi-v7a | ✓ | ✗ |
|
|
104
|
+
|
|
105
|
+
**未来计划**:v24、v26 逐步适配。
|
|
106
|
+
|
|
107
|
+
**替换步骤**:
|
|
108
|
+
|
|
109
|
+
1. 下载 `libnode.zip`(含 `bin/` + `include/`)
|
|
110
|
+
2. **整体替换** `你的项目/node_modules/nodejs-mobile-react-native/android/libnode/`
|
|
111
|
+
3. `mobileAppConfig.js` 的 `android.abiFilters` 只写实际存在的架构(v22 是 `['arm64-v8a', 'x86_64']`)
|
|
112
|
+
4. 跑 `npx node-mobile-app test` 或 `build`
|
|
113
|
+
|
|
114
|
+
CLI 指纹机制会自动清 `.cxx` / `android/build` / `app/build` 并全量重编——**无需手动清缓存**。
|
|
115
|
+
|
|
116
|
+
**完整自编译流程**见 `自定义libnode指南.md`。
|
|
117
|
+
|
|
118
|
+
### 2.3 验证是否带 full-icu
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Linux / macOS / WSL / Git Bash
|
|
122
|
+
strings libnode.so | grep -c icudt78l
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- 输出几千(约 4300)→ 带 full-icu
|
|
126
|
+
- 输出 0 → 不带
|
|
127
|
+
|
|
128
|
+
**体积对照**(实测,strip 后):
|
|
129
|
+
|
|
130
|
+
| 版本 | arm64-v8a | x86_64 |
|
|
131
|
+
| ----------------------- | --------- | -------- |
|
|
132
|
+
| v18(官方,无 ICU) | 59.6 MB | 62.3 MB |
|
|
133
|
+
| v22(自编译,full-icu) | 112.4 MB | 117.2 MB |
|
|
134
|
+
|
|
135
|
+
体积差异约 50 MB,来自三部分:Node v22 核心引擎 + full-icu 数据(约 25–30 MB)+ V8 版本升级。**不是编译出错**。
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 三、Express 版本选择(踩坑清单)
|
|
140
|
+
|
|
141
|
+
**选错版本会在 Node 进程启动时崩溃**,且错误信息极具误导性(如 `number 116 is not a function`)。
|
|
142
|
+
|
|
143
|
+
### 3.1 版本对照
|
|
144
|
+
|
|
145
|
+
| libnode.so | Node.js | ICU | Express |
|
|
146
|
+
| --------------------- | ------- | --- | ---------------------- |
|
|
147
|
+
| 官方 v18 | v18 | 无 | **4.x**(如 `4.22.2`) |
|
|
148
|
+
| 自编译 v22 + full-icu | v22 | 有 | **5.x**(如 `5.2.1`) |
|
|
149
|
+
|
|
150
|
+
### 3.2 场景 A(v18 + Express 4)
|
|
151
|
+
|
|
152
|
+
`nodejs-project/package.json`:
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"dependencies": {
|
|
157
|
+
"express": "4.22.2"
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
依赖里如有 `\P{ASCII}` 等 Unicode 正则,改写成 ASCII 等价:
|
|
163
|
+
|
|
164
|
+
| 原写法 | ASCII 写法 |
|
|
165
|
+
| ----------- | -------------- |
|
|
166
|
+
| `\P{ASCII}` | `[^\x00-\x7F]` |
|
|
167
|
+
|
|
168
|
+
### 3.3 场景 B(v22 + full-icu + Express 5)
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"dependencies": {
|
|
173
|
+
"express": "5.2.1"
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**三个前提**:
|
|
179
|
+
|
|
180
|
+
1. `libnode.so` 确实带 full-icu(用 `strings` 验证过)
|
|
181
|
+
2. **不要**用 `@alloc/path-to-regexp` 替换原版——它的 `exports` 只有 `import` 条件,CJS 下 `require()` 报 `No "exports" main defined`
|
|
182
|
+
3. **不要**加任何 `overrides` 强制替换 `path-to-regexp`
|
|
183
|
+
|
|
184
|
+
### 3.4 Express 5 路由语法迁移
|
|
185
|
+
|
|
186
|
+
`app.get('*')` 会抛 `TypeError: Missing parameter name`:
|
|
187
|
+
|
|
188
|
+
| Express 4 | Express 5 |
|
|
189
|
+
| ---------------------------- | --------------------------------- |
|
|
190
|
+
| `app.get('*', handler)` | `app.get('/{*splat}', handler)` |
|
|
191
|
+
| `app.get('/:id?', handler)` | `app.get('/user{/:id}', handler)` |
|
|
192
|
+
| `app.get('/:id(\\d+)', ...)` | 中间件校验 `req.params.id` |
|
|
193
|
+
| `app.del('/x', handler)` | `app.delete('/x', handler)` |
|
|
194
|
+
| `res.json(obj, 200)` | `res.status(200).json(obj)` |
|
|
195
|
+
| `res.send(200, body)` | `res.status(200).send(body)` |
|
|
196
|
+
|
|
197
|
+
### 3.5 验证依赖树
|
|
198
|
+
|
|
199
|
+
```powershell
|
|
200
|
+
cd node-mobile-app-build\nodejs-assets\nodejs-project
|
|
201
|
+
npm ls express --all
|
|
202
|
+
npm ls path-to-regexp --all
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**期望(场景 B)**:
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
express@5.2.1
|
|
209
|
+
└─┬ router@2.2.0
|
|
210
|
+
└── path-to-regexp@8.4.2
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
如出现 `@alloc/path-to-regexp`,说明 `package-lock.json` 里有残留 `overrides`。**彻底清理**:
|
|
214
|
+
|
|
215
|
+
```powershell
|
|
216
|
+
Remove-Item -Recurse -Force node_modules, package-lock.json
|
|
217
|
+
npm install
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 3.6 三个常见误区
|
|
221
|
+
|
|
222
|
+
- **误区 1**:以为 `@alloc/path-to-regexp` 能解决 ESM 问题 → 它的 `exports` 也是纯 `import`,`require()` 依然失败
|
|
223
|
+
- **误区 2**:只改路由语法就想让 Express 5 跑 → 若 `libnode.so` 无 full-icu,加载 `path-to-regexp@8` 时仍崩
|
|
224
|
+
- **误区 3**:用 `overrides` 强制替换 `path-to-regexp` → 破坏依赖链,且 `package-lock.json` 会残留解析结果,删掉 `overrides` 也不生效
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 四、调试与缓存排查
|
|
229
|
+
|
|
230
|
+
### 4.1 抓 Node.js 日志
|
|
231
|
+
|
|
232
|
+
```powershell
|
|
233
|
+
$adb = "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe"
|
|
234
|
+
|
|
235
|
+
# 清空
|
|
236
|
+
& $adb logcat -c
|
|
237
|
+
|
|
238
|
+
# 重启 App
|
|
239
|
+
& $adb shell am force-stop com.me.myapp
|
|
240
|
+
& $adb shell am start -n com.me.myapp/.MainActivity
|
|
241
|
+
|
|
242
|
+
# 抓关键日志
|
|
243
|
+
& $adb logcat -d | Select-String 'NODEJS-MOBILE|ReactNativeJS'
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**正常日志**:
|
|
247
|
+
```
|
|
248
|
+
NODEJS-MOBILE: [node-mobile-app] server URL: http://127.0.0.1:3000
|
|
249
|
+
NODEJS-MOBILE: Express started on port 3000
|
|
250
|
+
ReactNativeJS: Node started on http://127.0.0.1:3000
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**失败日志**:
|
|
254
|
+
```
|
|
255
|
+
NODEJS-MOBILE: [node-mobile-app] failed: Node 服务 5 秒内未启动 -- 请检查 ./server.js 是否调用了 listen()
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**崩溃日志**:
|
|
259
|
+
|
|
260
|
+
```powershell
|
|
261
|
+
& $adb logcat -c
|
|
262
|
+
& $adb logcat | Select-String 'FATAL|AndroidRuntime|NODEJS-MOBILE'
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### 4.2 手动清缓存(兜底)
|
|
266
|
+
|
|
267
|
+
**正常情况不需要**——CLI 指纹机制自动清。以下仅当指纹判断失效(如手动改过 `node-mobile-app-build/` 内文件)时用:
|
|
268
|
+
|
|
269
|
+
```powershell
|
|
270
|
+
# 最彻底:删整个 RN 工程
|
|
271
|
+
Remove-Item -Recurse -Force D:\你的项目\node-mobile-app-build
|
|
272
|
+
|
|
273
|
+
# 或删插件 CMake 缓存
|
|
274
|
+
Remove-Item -Recurse -Force D:\你的项目\node_modules\nodejs-mobile-react-native\android\.cxx
|
|
275
|
+
Remove-Item -Recurse -Force D:\你的项目\node_modules\nodejs-mobile-react-native\android\build
|
|
276
|
+
|
|
277
|
+
# 或删指纹文件(下次跑 = 首次构建)
|
|
278
|
+
Remove-Item -Force D:\你的项目\node-mobile-app-build\.build-fingerprint.json
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
或直接:
|
|
282
|
+
|
|
283
|
+
```powershell
|
|
284
|
+
npx node-mobile-app clean
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### 4.3 手动端口转发(`test` 会自动做)
|
|
288
|
+
|
|
289
|
+
```powershell
|
|
290
|
+
& "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe" reverse tcp:8081 tcp:8081
|
|
291
|
+
& "$env:LOCALAPPDATA\Android\Sdk\platform-tools\adb.exe" reverse --list
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### 4.4 模拟器(x86_64)
|
|
295
|
+
|
|
296
|
+
```powershell
|
|
297
|
+
# 列出 AVD
|
|
298
|
+
& "$env:LOCALAPPDATA\Android\Sdk\emulator\emulator.exe" -list-avds
|
|
299
|
+
|
|
300
|
+
# 启动
|
|
301
|
+
& "$env:LOCALAPPDATA\Android\Sdk\emulator\emulator.exe" -avd Pixel_7_API_34
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**三个必须**:
|
|
305
|
+
- `mobileAppConfig.js` 的 `abiFilters` 含 `x86_64`
|
|
306
|
+
- `libnode/bin/x86_64/libnode.so` 存在
|
|
307
|
+
- 模拟器镜像是 **x86_64 架构**
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 相关文档
|
|
312
|
+
|
|
313
|
+
- [README.md](./README.md) —— 快速开始、配置字段、命令
|
|
314
|
+
- [自定义libnode指南.md](./自定义libnode指南.md) —— 自编译 v22 + full-icu 完整流程
|
|
315
|
+
- [libnode.so 预编译仓库](https://github.com/OpenFlun/nodejs-mobile)([Gitee](https://gitee.com/OpenFlun/nodejs-mobile))
|
package/LICENSE
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
ISC 许可证 (ISC License)
|
|
2
|
+
|
|
3
|
+
版权所有 (c) 2026, flun <open@flun.top>
|
|
4
|
+
|
|
5
|
+
特此免费授予任何获得本软件及相关文档文件(“软件”)副本的人,不受限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,并允许向其提供本软件的人这样做,但须满足以下条件:
|
|
6
|
+
|
|
7
|
+
上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中;
|
|
8
|
+
|
|
9
|
+
本软件按“原样”提供,不作任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证;在任何情况下,作者或版权持有人均不对因本软件或本软件的使用或其他交易而产生的任何索赔、损害或其他责任负责,无论是合同之诉、侵权之诉还是其他行为之诉;
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
英文原文 (English Version)
|
|
14
|
+
|
|
15
|
+
ISC License
|
|
16
|
+
|
|
17
|
+
Copyright (c) 2026, flun <open@flun.top>
|
|
18
|
+
|
|
19
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
20
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
21
|
+
copyright notice and this permission notice appear in all copies.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
24
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
25
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
26
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
27
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
28
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
29
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|