From 392fadcdb0eca7da28973ad42534d5f07dea47b9 Mon Sep 17 00:00:00 2001 From: ypc <15051963820@163.com> Date: Fri, 26 Jun 2026 17:47:46 +0800 Subject: [PATCH] =?UTF-8?q?<=E4=BF=AE=E6=94=B9>=201=E3=80=81webserver?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9C=A8=E6=95=B0=E6=8D=AE=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E4=BF=A1=E5=8F=B7=E7=9B=B4=E6=8E=A5add?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8out=E7=95=8C=E9=9D=A2=E7=9C=81=E5=8E=BB?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E4=B8=AA=E6=B7=BB=E5=8A=A0=EF=BC=9B2?= =?UTF-8?q?=E3=80=81=E5=A2=9E=E5=8A=A0=E9=85=8D=E7=BD=AE=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E8=B0=83=E8=AF=95rk3568?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/c_cpp_properties.json | 18 +- .vscode/launch.json | 68 +- .vscode/tasks.json | 40 ++ AGENTS.md | 33 +- mimo/plan/远程调试环境迁移指南.md | 96 +++ mimo/问题处理文档.md | 38 + src/system/libweb_server/src/packed_fs.c | 844 ++++++++++++++--------- test/web_root/css/style.css | 44 ++ test/web_root/js/pages.js | 346 ++++++---- 9 files changed, 1089 insertions(+), 438 deletions(-) create mode 100644 mimo/plan/远程调试环境迁移指南.md diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index f71304d..e32b3f7 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -1,7 +1,7 @@ { "configurations": [ { - "name": "Linux", + "name": "Linux (x86)", "includePath": [ "${workspaceFolder}/**", "${workspaceFolder}/src/protocol/libicp67/inc", @@ -13,6 +13,22 @@ "cStandard": "c17", "cppStandard": "gnu++17", "intelliSenseMode": "linux-gcc-x64" + }, + { + "name": "ARM (RK3568)", + "includePath": [ + "${workspaceFolder}/**", + "${workspaceFolder}/src/protocol/libicp67/inc", + "${workspaceFolder}/src/system/libiec61850m/inc", + "${workspaceFolder}/src/protocol/libmms_m/inc", + "/opt/atk-dlrk356x-toolchain/aarch64-buildroot-linux-gnu/sysroot/usr/include", + "/opt/atk-dlrk356x-toolchain/include" + ], + "defines": ["RK356x"], + "compilerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc", + "cStandard": "c17", + "cppStandard": "gnu++17", + "intelliSenseMode": "linux-gcc-arm64" } ], "version": 4 diff --git a/.vscode/launch.json b/.vscode/launch.json index 986b7b4..ee8f734 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,6 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/test/RTU", - // "program": "${workspaceFolder}/release/x86/exe/FTU_cfg_parse", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", @@ -22,7 +21,7 @@ }, { "description": "Set default output to hex", - "text": "set output-radix 16", // 16 表示十六进制,10 表示十进制 + "text": "set output-radix 16", "ignoreFailures": true } ] @@ -50,6 +49,71 @@ "ignoreFailures": true } ] + }, + { + "name": "ARM 编译+部署+调试 (RK3568)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/release/arm/exe/RTU", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb", + "miDebuggerServerAddress": "198.120.0.100:2345", + "preLaunchTask": "deploy-to-rk", + "sourceFileMap": { + "/home/ypc/RTU/RTU": "${workspaceFolder}" + }, + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set default output to hex", + "text": "set output-radix 16", + "ignoreFailures": true + }, + { + "description": "Set sysroot for ARM libs", + "text": "set sysroot /opt/atk-dlrk356x-toolchain/aarch64-buildroot-linux-gnu/sysroot", + "ignoreFailures": true + } + ] + }, + { + "name": "ARM 调试 (不编译, RK3568)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/release/arm/exe/RTU", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb", + "miDebuggerServerAddress": "198.120.0.100:2345", + "preLaunchTask": "start-gdbserver", + "sourceFileMap": { + "/home/ypc/RTU/RTU": "${workspaceFolder}" + }, + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set default output to hex", + "text": "set output-radix 16", + "ignoreFailures": true + } + ] } ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f4ce3e0..550911a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,6 +13,46 @@ "isDefault": true } }, + { + "label": "build-arm", + "type": "shell", + "command": "${workspaceFolder}/release/build.sh arm", + "problemMatcher": [ + "$gcc" + ], + "group": "build" + }, + { + "label": "deploy-to-rk", + "type": "shell", + "command": "sshpass -p 'root' scp -o StrictHostKeyChecking=no ${workspaceFolder}/release/arm/exe/RTU root@198.120.0.100:/mnt/RTU/ && echo 'Deploy OK' && sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null; killall RTU 2>/dev/null; sleep 1; nohup gdbserver 0.0.0.0:2345 /mnt/RTU/RTU > /tmp/rtu_output.log 2>&1 &' && echo 'gdbserver started on :2345 | RTU output → /tmp/rtu_output.log'", + "problemMatcher": [], + "dependsOn": ["build-arm"], + "group": "build", + "detail": "Build ARM binary, deploy to RK3568, start gdbserver, RTU output→/tmp/rtu_output.log" + }, + { + "label": "start-gdbserver", + "type": "shell", + "command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null; killall RTU 2>/dev/null; sleep 1; nohup gdbserver 0.0.0.0:2345 /mnt/RTU/RTU > /tmp/rtu_output.log 2>&1 &' && echo 'gdbserver started on :2345 | RTU output → /tmp/rtu_output.log'", + "problemMatcher": [], + "group": "build" + }, + { + "label": "tail-rtu-output", + "type": "shell", + "command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'tail -f /tmp/rtu_output.log'", + "problemMatcher": [], + "group": "build", + "isBackground": true + }, + { + "label": "stop-gdbserver", + "type": "shell", + "command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null' && echo 'gdbserver stopped'", + "problemMatcher": [], + "group": "build" + }, { "type": "cppbuild", "label": "C/C++: aarch64-linux-gnu-g++ 生成活动文件", diff --git a/AGENTS.md b/AGENTS.md index 7a5e06a..eb7aaa1 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -43,9 +43,12 @@ src/ | 命令 | 说明 | |------|------| | `./release/build.sh` | 本地 x86 编译 | -| `./release/build.sh arm` | ARM 交叉编译 | +| `./release/build.sh arm` | ARM 交叉编译 → `release/arm/exe/RTU` | | `make -C release` | 在 release 目录执行 make | -| `./test/RTU` | 运行编译产物 | +| `./test/RTU` | 运行 x86 编译产物 | +| VS Code Task `build-arm` | Ctrl+Shift+B 中选择 ARM 交叉编译 | +| VS Code Task `deploy-to-rk` | 编译+部署到 RK3568 `/mnt/RTU/` | +| VS Code F5 "ARM 编译+部署+调试" | 一键编译→部署→gdbserver→远程调试 | ## 📐 代码规范 @@ -87,15 +90,39 @@ src/ | 构建配置 | [release/linux.mk](release/linux.mk) | | 公共头文件目录 | [release/inc/](release/inc/) | | 模块分析文档生成技能 | [mimo/skills/模块分析文档生成/SKILL.md](mimo/skills/模块分析文档生成/SKILL.md) | +| RK3568 MCP 服务 | [../rk-mcp/src/index.ts](../rk-mcp/src/index.ts) | +| VS Code 调试配置 | [.vscode/launch.json](.vscode/launch.json) / [.vscode/tasks.json](.vscode/tasks.json) | +| Gitea Git 服务记忆 | [/memories/repo/gitea-config.md](/memories/repo/gitea-config.md) | + +## ⚙️ 开发环境 + +- **环境类型**: WSL 2 (Ubuntu 24.04),与 Windows 共享固定 IP `198.120.10.240` +- **Gitea Git 服务**: `http://127.0.0.1:3000` | 局域网 `http://192.168.1.54:3000` | 管理员 `admin`/`admin123` +- **交叉编译器**: `/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-*` (GCC 10.3.0, Buildroot 2018.02) +- **RK3568 目标机**: `root@198.120.0.100` (密码 `root`),目标路径 `/mnt/RTU/` + +### RK3568 远程调试 (MCP 服务) + +| 项目 | 值 | +|---|---| +| MCP 服务路径 | `/home/ypc/RTU/rk-mcp/dist/index.js` (Node.js) | +| MCP 配置 | `.vscode/mcp.json` → `rk-mcp` 服务 | +| 可用工具 | `rk_check` `rk_deploy` `rk_gdbserver_start` `rk_gdbserver_stop` `rk_shell` | +| SSH 包装 | `~/.ssh/rk_ssh` `~/.ssh/rk_scp` (sshpass 封装) | + +**调试流程**: `./release/build.sh arm` → F5 选 "ARM 编译+部署+调试 (RK3568)" → 自动 scp → gdbserver :2345 → GDB 连接 + +**launch.json 提供 4 个调试配置**: 本地 x86(编译/不编译)、ARM 远程(编译+部署/纯调试) ## ⚠️ 注意事项 -1. **交叉编译依赖**: `release/linux.mk` 引用了本地交叉工具链路径(`GCCLIB_PATH`),不同主机可能需要调整 +1. **交叉编译依赖**: `release/linux.mk` 引用 `/opt/atk-dlrk356x-toolchain/bin`,需保证工具链存在 2. **Web 资源打包**: 构建流程中的 `pack_web.sh` 会打包 web 资源到可执行文件中,不可跳过 3. **代码风格严格**: 修改代码时必须遵循上述规范(Tab/Allman/Yoda),否则可能导致审查问题 4. **多线程安全**: 大量使用多线程(9 个应用线程),修改时需注意竞态条件 5. **C 风格内存管理**: 使用 `malloc`/`free`,需注意空指针检查和释放时机 6. **第三方依赖**: mongoose、cJSON、mosquitto、tinyxml2、libiec61850 是关键依赖 +7. **RK3568 使用 dropbear SSH**,不支持 OpenSSH 密钥认证;使用 `sshpass -p 'root' ssh` 连接 ## 🔄 工作流程规则 diff --git a/mimo/plan/远程调试环境迁移指南.md b/mimo/plan/远程调试环境迁移指南.md new file mode 100644 index 0000000..e761185 --- /dev/null +++ b/mimo/plan/远程调试环境迁移指南.md @@ -0,0 +1,96 @@ +# RTU 远程调试 RK3568 环境迁移指南 + +> 将当前 WSL 环境中的 RTU 远程调试体系迁移到另一台电脑。 + +--- + +## 零、哪些是必须的? + +| 组件 | 必要性 | F5 调试用到? | +|------|--------|---------------| +| ARM 交叉工具链 `/opt/atk-dlrk356x-toolchain/` | 🔴 必须 | ✅ 编译 + GDB 连接 | +| `sshpass` (`apt install sshpass`) | 🔴 必须 | ✅ tasks.json 的 sshpass 命令 | +| RTU 项目代码 | 🔴 必须 | ✅ 编译源码 + launch.json 指向 | +| `.vscode/launch.json` `.vscode/tasks.json` | 🔴 必须 | ✅ preLaunchTask + GDB 配置 | +| **rk-mcp** | 🟢 非必须 | ❌ 仅 Copilot AI 诊断用,F5 调试完全不走它 | +| `mcp.json` | 🟢 非必须 | ❌ 无 rk-mcp 则删掉此文件即可 | +| Node.js | 🟢 非必须 | ❌ 仅 rk-mcp 依赖它 | +| `~/.ssh/rk_ssh` `~/.ssh/rk_scp` | 🟢 非必须 | ❌ tasks.json 直接用 sshpass,不依赖这两个脚本 | + +**结论:你只需要 工具链 + sshpass + 代码 + .vscode/ 就能在新电脑上 F5 远程调试。** + +--- + +## 一、最小安装步骤(共 4 步) + +### 1. 安装 sshpass + +```bash +sudo apt update && sudo apt install sshpass +``` + +### 2. 安装 ARM 交叉工具链 + +```bash +# 旧电脑上打包 +cd /opt +tar czf atk-dlrk356x-toolchain.tar.gz atk-dlrk356x-toolchain/ + +# 传到新电脑后解压 +sudo tar xzf atk-dlrk356x-toolchain.tar.gz -C /opt/ + +# 验证 +/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc --version +/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb --version +``` + +### 3. 克隆 RTU 项目 + +```bash +mkdir -p ~/RTU && cd ~/RTU +git clone RTU +cd RTU +``` + +### 4. 验证 + +```bash +# 测试编译 +./release/build.sh arm + +# 测试 RK 连接 +sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'echo OK' + +# VS Code 中 F5 → "ARM 编译+部署+调试 (RK3568)" +# Ctrl+Shift+P → Run Task → "tail-rtu-output" 查看实时打印 +``` + +--- + +## 二、可选:安装 rk-mcp(让 Copilot 帮诊断 RK) + +```bash +# 1. 安装 Node.js +nvm install 20 && nvm use 20 + +# 2. 克隆 rk-mcp(和 RTU 平级目录) +cd ~/RTU +git clone rk-mcp +cd rk-mcp +npm install && npm run build + +# 3. 确保 ~/RTU/RTU/.vscode/mcp.json 存在即可 +``` + +--- + +## 三、硬编码路径速查 + +| 文件 | 关键路径 | 何时需改 | +|------|----------|----------| +| `launch.json` → miDebuggerPath | `/opt/atk-dlrk356x-toolchain/bin/...` | 工具链路径变化时 | +| `launch.json` → miDebuggerServerAddress | `198.120.0.100:2345` | RK IP 变化时 | +| `launch.json` → sourceFileMap | `/home/ypc/RTU/RTU` | 用户名变化时 | +| `tasks.json` → sshpass 命令 | `root@198.120.0.100` | RK IP 变化时 | +| `mcp.json` | `/home/ypc/RTU/...` | 用户名变化时(无 rk-mcp 可删) | +| `tasks.json` 其他 | `${workspaceFolder}` | ✅ 无需改动 | diff --git a/mimo/问题处理文档.md b/mimo/问题处理文档.md index 11d8d87..6430f53 100644 --- a/mimo/问题处理文档.md +++ b/mimo/问题处理文档.md @@ -2,6 +2,44 @@ --- +## 2026-06-26: 远程调试 gdbserver 未自动启动 & RTU 打印信息查看问题 + +**问题**:F5 选择 "ARM 编译+部署+调试 (RK3568)" 后无法断点调试。 + +**根因**:`deploy-to-rk` 任务只做了编译+scp 传输,没有自动启动 gdbserver。VS Code GDB 尝试连接 `198.120.0.100:2345` 时端口无监听。 + +**修复**: +1. 修改 `deploy-to-rk` 任务:scp 传输后自动 `killall gdbserver` + 启动新 gdbserver +2. 修改 `start-gdbserver` 任务:统一用 `>/tmp/rtu_output.log 2>&1` 重定向 gdbserver+RTU 输出 +3. 新增 `tail-rtu-output` 任务:一键 `tail -f /tmp/rtu_output.log` 实时查看 RTU printf 输出 + +**原理**:RTU 作为 gdbserver 的子进程,继承 gdbserver 重定向后的 fd 1/2,所以 printf/LOG_I/LOG_E 全部进入 `/tmp/rtu_output.log`。 + +**涉及文件**:`.vscode/tasks.json` + +**注意事项**:RTU 的 stdin 被 gdbserver 接管,无法在 tail 窗口输入 CLI 命令。交互式命令测试需单独 `ssh root@198.120.0.100 /mnt/RTU/RTU`。 + +**验证**:GDB 连接→continue→tail 文件成功看到所有 LOG_I/LOG_E 输出。 + +### 补充修复 (2026-06-26): "ARM 调试 (不编译)" preLaunchTask 卡住 + +**问题**:F5 选 "ARM 调试 (不编译, RK3568)" 不工作,且后续引入复合任务后 "ARM 编译+部署+调试" 也失效。 + +**根因**:尝试用 `dependsOrder: "sequence"/"parallel"` + `isBackground: true` 复合任务作为 preLaunchTask。VS Code preLaunchTask 需要子任务明确完成信号,复合任务+后台子任务组合行为不可靠(exit code 异常、卡住)。 + +**最终修复**: +1. 删除所有复合任务 (`deploy-with-tail`, `start-gdbserver-with-tail`) +2. `deploy-to-rk` = scp + gdbserver(同步,preLaunchTask 可靠) +3. `start-gdbserver` = gdbserver(同步,preLaunchTask 可靠) +4. `tail-rtu-output` = 手动 `tail -f`(独立任务,不参与 preLaunchTask) +5. `stopAtEntry` 改为 `false`,RTU 直接运行不需手动按继续 + +**涉及文件**:`.vscode/tasks.json`、`.vscode/launch.json` + +**tail 使用方式**:F5 启动调试后,`Ctrl+Shift+P` → Run Task → `tail-rtu-output` 查看实时打印。 + +--- + ## 2026-06-18: X-Macro 应用模块注册表 — 名称大小写匹配修复 **问题**:X-Macro 生成 g_vec_app 名称时使用 `"app_" #name`(如 `app_SYS`),但配置文件 `app_config.json` 使用小写 `app_sys`,导致名称不匹配,所有线程被 "skipped (disabled by config)"。 diff --git a/src/system/libweb_server/src/packed_fs.c b/src/system/libweb_server/src/packed_fs.c index 45658a2..b0bba20 100644 --- a/src/system/libweb_server/src/packed_fs.c +++ b/src/system/libweb_server/src/packed_fs.c @@ -969,7 +969,66 @@ static const unsigned char v3[] = { 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, 32, 118, 97, 114, // ;. color: var 40, 45, 45, 116, 101, 120, 116, 45, 109, 117, 116, 101, 100, 41, 59, 10, // (--text-muted);. 32, 32, 32, 32, 109, 97, 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, // margin-left: - 32, 97, 117, 116, 111, 59, 10, 125, 10, 0 // auto;.}. + 32, 97, 117, 116, 111, 59, 10, 125, 10, 10, 47, 42, 32, 61, 61, 61, // auto;.}../* === + 32, 230, 149, 176, 230, 141, 174, 228, 184, 173, 229, 191, 131, 32, 233, 128, // ............ .. + 137, 230, 139, 169, 230, 183, 187, 229, 138, 160, 230, 160, 143, 32, 61, 61, // ............. == + 61, 32, 42, 47, 10, 46, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, // = */..dc-sel-bar + 32, 123, 10, 32, 32, 32, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // {. backgroun + 100, 58, 32, 35, 101, 56, 102, 53, 101, 57, 59, 10, 32, 32, 32, 32, // d: #e8f5e9;. + 98, 111, 114, 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, // border: 1px soli + 100, 32, 35, 97, 53, 100, 54, 97, 55, 59, 10, 32, 32, 32, 32, 98, // d #a5d6a7;. b + 111, 114, 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 118, 97, // order-radius: va + 114, 40, 45, 45, 114, 97, 100, 105, 117, 115, 41, 59, 10, 32, 32, 32, // r(--radius);. + 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 49, 48, 112, 120, 32, 50, // padding: 10px 2 + 48, 112, 120, 59, 10, 32, 32, 32, 32, 109, 97, 114, 103, 105, 110, 45, // 0px;. margin- + 98, 111, 116, 116, 111, 109, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, // bottom: 16px;. + 32, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, 101, 120, 59, // display: flex; + 10, 32, 32, 32, 32, 97, 108, 105, 103, 110, 45, 105, 116, 101, 109, 115, // . align-items + 58, 32, 99, 101, 110, 116, 101, 114, 59, 10, 32, 32, 32, 32, 103, 97, // : center;. ga + 112, 58, 32, 52, 112, 120, 59, 10, 32, 32, 32, 32, 102, 108, 101, 120, // p: 4px;. flex + 45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, 59, 10, 32, 32, 32, // -wrap: wrap;. + 32, 97, 110, 105, 109, 97, 116, 105, 111, 110, 58, 32, 100, 99, 83, 108, // animation: dcSl + 105, 100, 101, 68, 111, 119, 110, 32, 48, 46, 50, 115, 32, 101, 97, 115, // ideDown 0.2s eas + 101, 45, 111, 117, 116, 59, 10, 125, 10, 64, 107, 101, 121, 102, 114, 97, // e-out;.}.@keyfra + 109, 101, 115, 32, 100, 99, 83, 108, 105, 100, 101, 68, 111, 119, 110, 32, // mes dcSlideDown + 123, 10, 32, 32, 32, 32, 102, 114, 111, 109, 32, 123, 32, 111, 112, 97, // {. from { opa + 99, 105, 116, 121, 58, 32, 48, 59, 32, 116, 114, 97, 110, 115, 102, 111, // city: 0; transfo + 114, 109, 58, 32, 116, 114, 97, 110, 115, 108, 97, 116, 101, 89, 40, 45, // rm: translateY(- + 54, 112, 120, 41, 59, 32, 125, 10, 32, 32, 32, 32, 116, 111, 32, 123, // 6px); }. to { + 32, 111, 112, 97, 99, 105, 116, 121, 58, 32, 49, 59, 32, 116, 114, 97, // opacity: 1; tra + 110, 115, 102, 111, 114, 109, 58, 32, 116, 114, 97, 110, 115, 108, 97, 116, // nsform: translat + 101, 89, 40, 48, 41, 59, 32, 125, 10, 125, 10, 46, 100, 99, 45, 115, // eY(0); }.}..dc-s + 101, 108, 45, 108, 97, 98, 101, 108, 32, 123, 10, 32, 32, 32, 32, 102, // el-label {. f + 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 52, 112, 120, 59, 10, // ont-size: 14px;. + 32, 32, 32, 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, // font-weight: + 32, 54, 48, 48, 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, // 600;. color: + 32, 35, 50, 101, 55, 100, 51, 50, 59, 10, 125, 10, 46, 100, 99, 45, // #2e7d32;.}..dc- + 115, 101, 108, 45, 98, 97, 114, 32, 108, 97, 98, 101, 108, 32, 123, 10, // sel-bar label {. + 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, // font-size: 1 + 51, 112, 120, 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, 32, // 3px;. color: + 118, 97, 114, 40, 45, 45, 116, 101, 120, 116, 45, 115, 101, 99, 111, 110, // var(--text-secon + 100, 97, 114, 121, 41, 59, 10, 125, 10, 46, 100, 99, 45, 115, 101, 108, // dary);.}..dc-sel + 45, 98, 97, 114, 32, 115, 101, 108, 101, 99, 116, 32, 123, 10, 32, 32, // -bar select {. + 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 52, 112, 120, 32, 56, // padding: 4px 8 + 112, 120, 59, 10, 32, 32, 32, 32, 98, 111, 114, 100, 101, 114, 58, 32, // px;. border: + 49, 112, 120, 32, 115, 111, 108, 105, 100, 32, 118, 97, 114, 40, 45, 45, // 1px solid var(-- + 98, 111, 114, 100, 101, 114, 41, 59, 10, 32, 32, 32, 32, 98, 111, 114, // border);. bor + 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 52, 112, 120, 59, // der-radius: 4px; + 10, 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, // . font-size: + 49, 51, 112, 120, 59, 10, 32, 32, 32, 32, 98, 97, 99, 107, 103, 114, // 13px;. backgr + 111, 117, 110, 100, 58, 32, 35, 102, 102, 102, 59, 10, 125, 10, 46, 100, // ound: #fff;.}..d + 99, 45, 115, 101, 108, 45, 98, 97, 114, 32, 46, 98, 116, 110, 32, 123, // c-sel-bar .btn { + 10, 32, 32, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 54, 112, // . padding: 6p + 120, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 102, 111, 110, 116, // x 16px;. font + 45, 115, 105, 122, 101, 58, 32, 49, 51, 112, 120, 59, 10, 125, 10, 35, // -size: 13px;.}.# + 100, 99, 45, 99, 98, 45, 97, 108, 108, 44, 32, 46, 100, 99, 45, 99, // dc-cb-all, .dc-c + 98, 45, 114, 111, 119, 32, 123, 10, 32, 32, 32, 32, 119, 105, 100, 116, // b-row {. widt + 104, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 104, 101, 105, // h: 16px;. hei + 103, 104, 116, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 99, // ght: 16px;. c + 117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, 101, 114, 59, 10, // ursor: pointer;. + 32, 32, 32, 32, 97, 99, 99, 101, 110, 116, 45, 99, 111, 108, 111, 114, // accent-color + 58, 32, 118, 97, 114, 40, 45, 45, 112, 114, 105, 109, 97, 114, 121, 41, // : var(--primary) + 59, 10, 125, 10, 0 // ;.}. }; static const unsigned char v4[] = { 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, // . @@ -4265,318 +4324,471 @@ static const unsigned char v7[] = { 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 32, 42, // ============== * 47, 10, 118, 97, 114, 32, 68, 97, 116, 97, 99, 101, 110, 116, 101, 114, // /.var Datacenter 80, 97, 103, 101, 32, 61, 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, // Page = (function - 40, 41, 32, 123, 10, 32, 32, 32, 32, 118, 97, 114, 32, 97, 108, 108, // () {. var all - 68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, 32, 32, 32, 118, // Data = {};. v - 97, 114, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 39, // ar activeTab = ' - 111, 117, 116, 39, 59, 10, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, // out';. var se - 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 10, // archText = '';.. - 32, 32, 32, 32, 118, 97, 114, 32, 67, 79, 76, 85, 77, 78, 83, 32, // var COLUMNS - 61, 32, 91, 39, 105, 100, 39, 44, 32, 39, 115, 97, 100, 100, 114, 39, // = ['id', 'saddr' - 44, 32, 39, 100, 101, 115, 99, 39, 44, 32, 39, 230, 149, 176, 230, 141, // , 'desc', '..... - 174, 231, 177, 187, 229, 158, 139, 39, 44, 32, 39, 99, 116, 114, 108, 95, // .......', 'ctrl_ - 116, 121, 112, 101, 39, 44, 32, 39, 108, 105, 110, 107, 95, 115, 97, 100, // type', 'link_sad - 100, 114, 115, 39, 93, 59, 10, 10, 32, 32, 32, 32, 102, 117, 110, 99, // drs'];.. func - 116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, // tion renderTable - 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // () {. var - 32, 100, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, 91, // data = allData[ - 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, 93, // activeTab] || [] - 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 98, // ;. var tb - 111, 100, 121, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, // ody = document.g - 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, // etElementById('d - 99, 45, 116, 98, 111, 100, 121, 39, 41, 59, 10, 32, 32, 32, 32, 32, // c-tbody');. - 32, 32, 32, 105, 102, 32, 40, 33, 116, 98, 111, 100, 121, 41, 32, 114, // if (!tbody) r - 101, 116, 117, 114, 110, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, // eturn;.. - 105, 102, 32, 40, 100, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 32, // if (data.length - 61, 61, 61, 32, 48, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // === 0) {. - 32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, 110, 110, 101, 114, // tbody.inner - 72, 84, 77, 76, 32, 61, 32, 39, 60, 116, 114, 32, 99, 108, 97, 115, // HTML = '.. - 130, 230, 151, 160, 230, 149, 176, 230, 141, 174, 60, 47, 116, 100, 62, 60, // ..........< - 47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // /tr>';. - 32, 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, // document.getE - 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, // lementById('dc-c - 111, 117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, 116, 101, // ount').textConte - 110, 116, 32, 61, 32, 39, 48, 39, 59, 10, 32, 32, 32, 32, 32, 32, // nt = '0';. - 32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, // return;. - 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, // }.. - 32, 118, 97, 114, 32, 114, 111, 119, 115, 32, 61, 32, 100, 97, 116, 97, // var rows = data - 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, // ;. if (se - 97, 114, 99, 104, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, // archText) {. - 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 116, 32, 61, // var st = - 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 46, 116, 111, 76, 111, // searchText.toLo - 119, 101, 114, 67, 97, 115, 101, 40, 41, 59, 10, 32, 32, 32, 32, 32, // werCase();. - 32, 32, 32, 32, 32, 32, 32, 114, 111, 119, 115, 32, 61, 32, 100, 97, // rows = da - 116, 97, 46, 102, 105, 108, 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, // ta.filter(functi - 111, 110, 40, 105, 116, 101, 109, 41, 32, 123, 10, 32, 32, 32, 32, 32, // on(item) {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, // retur - 110, 32, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 32, 38, 38, // n (item.saddr && - 32, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 46, 116, 111, 76, 111, // item.saddr.toLo - 119, 101, 114, 67, 97, 115, 101, 40, 41, 46, 105, 110, 100, 101, 120, 79, // werCase().indexO - 102, 40, 115, 116, 41, 32, 33, 61, 61, 32, 45, 49, 41, 10, 32, 32, // f(st) !== -1). - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 124, 124, 32, 40, 105, 116, 101, 109, 46, 100, 101, 115, 99, 32, // || (item.desc - 38, 38, 32, 105, 116, 101, 109, 46, 100, 101, 115, 99, 46, 116, 111, 76, // && item.desc.toL - 111, 119, 101, 114, 67, 97, 115, 101, 40, 41, 46, 105, 110, 100, 101, 120, // owerCase().index - 79, 102, 40, 115, 116, 41, 32, 33, 61, 61, 32, 45, 49, 41, 59, 10, // Of(st) !== -1);. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 10, // });. - 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, // }. - 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, // document.getEl - 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, 111, // ementById('dc-co - 117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, 116, 101, 110, // unt').textConten - 116, 32, 61, 32, 114, 111, 119, 115, 46, 108, 101, 110, 103, 116, 104, 32, // t = rows.length - 43, 32, 39, 32, 47, 32, 39, 32, 43, 32, 100, 97, 116, 97, 46, 108, // + ' / ' + data.l - 101, 110, 103, 116, 104, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ength;.. - 105, 102, 32, 40, 114, 111, 119, 115, 46, 108, 101, 110, 103, 116, 104, 32, // if (rows.length - 61, 61, 61, 32, 48, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // === 0) {. - 32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, 110, 110, 101, 114, // tbody.inner - 72, 84, 77, 76, 32, 61, 32, 39, 60, 116, 114, 32, 99, 108, 97, 115, // HTML = '.. - 160, 229, 140, 185, 233, 133, 141, 231, 187, 147, 230, 158, 156, 60, 47, 116, // .............';. - 32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, // return;. - 32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, // }.. - 32, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, 39, 39, 59, 10, // var html = '';. - 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, 114, // for (var - 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 114, 111, 119, 115, // i = 0; i < rows - 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, // .length; i++) {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // var - 105, 116, 101, 109, 32, 61, 32, 114, 111, 119, 115, 91, 105, 93, 59, 10, // item = rows[i];. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 104, 116, 109, 108, // html - 32, 43, 61, 32, 39, 60, 116, 114, 62, 39, 10, 32, 32, 32, 32, 32, // += ''. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, // + '' + fmtVal(ite - 109, 46, 105, 100, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, // m.id) + ''. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 43, 32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, // + '' + fmtVa - 108, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 41, 32, 43, 32, // l(item.saddr) + - 39, 60, 47, 116, 100, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ''. - 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 100, 62, 39, // + '' - 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 100, // + fmtVal(item.d - 101, 115, 99, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 32, // esc) + ''. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, // + - 32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, // '' + fmtVal - 40, 105, 116, 101, 109, 46, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, // (item.type) + '< - 47, 116, 100, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // /td>'. - 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 100, 62, 39, 32, 43, // + '' + - 32, 102, 109, 116, 86, 97, 108, 40, 67, 84, 82, 76, 95, 84, 89, 80, // fmtVal(CTRL_TYP - 69, 95, 77, 65, 80, 91, 105, 116, 101, 109, 46, 99, 116, 114, 108, 95, // E_MAP[item.ctrl_ - 116, 121, 112, 101, 93, 32, 124, 124, 32, 105, 116, 101, 109, 46, 99, 116, // type] || item.ct - 114, 108, 95, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, 47, 116, 100, // rl_type) + ''. - 32, 32, 32, 43, 32, 39, 60, 116, 100, 32, 115, 116, 121, 108, 101, 61, // + '' + fmtVal( - 105, 116, 101, 109, 46, 108, 105, 110, 107, 95, 115, 97, 100, 100, 114, 115, // item.link_saddrs - 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 32, 32, 32, 32, // ) + ''. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, // + '< - 47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, // /tr>';. } - 10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, // . tbody.i - 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, // nnerHTML = html; - 10, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 102, 117, 110, 99, // . }.. func + 40, 41, 32, 123, 10, 9, 118, 97, 114, 32, 97, 108, 108, 68, 97, 116, // () {..var allDat + 97, 32, 61, 32, 123, 125, 59, 10, 9, 118, 97, 114, 32, 97, 99, 116, // a = {};..var act + 105, 118, 101, 84, 97, 98, 32, 61, 32, 39, 111, 117, 116, 39, 59, 10, // iveTab = 'out';. + 9, 118, 97, 114, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, // .var searchText + 61, 32, 39, 39, 59, 10, 9, 118, 97, 114, 32, 115, 101, 108, 101, 99, // = '';..var selec + 116, 101, 100, 83, 101, 116, 32, 61, 32, 123, 125, 59, 32, 32, 32, 32, // tedSet = {}; + 32, 32, 32, 32, 47, 47, 32, 123, 115, 97, 100, 100, 114, 58, 32, 116, // // {saddr: t + 114, 117, 101, 125, 10, 10, 9, 118, 97, 114, 32, 67, 79, 76, 85, 77, // rue}...var COLUM + 78, 83, 32, 61, 32, 91, 39, 39, 44, 32, 39, 105, 100, 39, 44, 32, // NS = ['', 'id', + 39, 115, 97, 100, 100, 114, 39, 44, 32, 39, 100, 101, 115, 99, 39, 44, // 'saddr', 'desc', + 32, 39, 230, 149, 176, 230, 141, 174, 231, 177, 187, 229, 158, 139, 39, 44, // '............', + 32, 39, 99, 116, 114, 108, 95, 116, 121, 112, 101, 39, 44, 32, 39, 108, // 'ctrl_type', 'l + 105, 110, 107, 95, 115, 97, 100, 100, 114, 115, 39, 93, 59, 10, 10, 9, // ink_saddrs'];... + 102, 117, 110, 99, 116, 105, 111, 110, 32, 103, 101, 116, 86, 105, 115, 105, // function getVisi + 98, 108, 101, 68, 97, 116, 97, 40, 41, 32, 123, 10, 9, 9, 118, 97, // bleData() {...va + 114, 32, 100, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, // r data = allData + 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, // [activeTab] || [ + 93, 59, 10, 9, 9, 105, 102, 32, 40, 33, 115, 101, 97, 114, 99, 104, // ];...if (!search + 84, 101, 120, 116, 41, 32, 114, 101, 116, 117, 114, 110, 32, 100, 97, 116, // Text) return dat + 97, 59, 10, 9, 9, 118, 97, 114, 32, 115, 116, 32, 61, 32, 115, 101, // a;...var st = se + 97, 114, 99, 104, 84, 101, 120, 116, 46, 116, 111, 76, 111, 119, 101, 114, // archText.toLower + 67, 97, 115, 101, 40, 41, 59, 10, 9, 9, 114, 101, 116, 117, 114, 110, // Case();...return + 32, 100, 97, 116, 97, 46, 102, 105, 108, 116, 101, 114, 40, 102, 117, 110, // data.filter(fun + 99, 116, 105, 111, 110, 40, 105, 116, 101, 109, 41, 32, 123, 10, 9, 9, // ction(item) {... + 9, 114, 101, 116, 117, 114, 110, 32, 40, 105, 116, 101, 109, 46, 115, 97, // .return (item.sa + 100, 100, 114, 32, 38, 38, 32, 105, 116, 101, 109, 46, 115, 97, 100, 100, // ddr && item.sadd + 114, 46, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 40, 41, 46, // r.toLowerCase(). + 105, 110, 100, 101, 120, 79, 102, 40, 115, 116, 41, 32, 33, 61, 61, 32, // indexOf(st) !== + 45, 49, 41, 10, 9, 9, 9, 9, 124, 124, 32, 40, 105, 116, 101, 109, // -1).....|| (item + 46, 100, 101, 115, 99, 32, 38, 38, 32, 105, 116, 101, 109, 46, 100, 101, // .desc && item.de + 115, 99, 46, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 40, 41, // sc.toLowerCase() + 46, 105, 110, 100, 101, 120, 79, 102, 40, 115, 116, 41, 32, 33, 61, 61, // .indexOf(st) !== + 32, 45, 49, 41, 59, 10, 9, 9, 125, 41, 59, 10, 9, 125, 10, 10, // -1);...});..}.. + 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 111, 110, 83, 101, 108, 101, // .function onSele + 99, 116, 65, 108, 108, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, // ctAll() {...var + 118, 105, 115, 105, 98, 108, 101, 32, 61, 32, 103, 101, 116, 86, 105, 115, // visible = getVis + 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, 59, 10, 9, 9, 118, 97, // ibleData();...va + 114, 32, 99, 98, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, // r cb = document. + 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, // getElementById(' + 100, 99, 45, 99, 98, 45, 97, 108, 108, 39, 41, 59, 10, 9, 9, 105, // dc-cb-all');...i + 102, 32, 40, 99, 98, 32, 38, 38, 32, 99, 98, 46, 99, 104, 101, 99, // f (cb && cb.chec + 107, 101, 100, 32, 38, 38, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, // ked && visible.l + 101, 110, 103, 116, 104, 32, 62, 32, 48, 41, 32, 123, 10, 9, 9, 9, // ength > 0) {.... + 102, 111, 114, 32, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, // for (var i = 0; + 105, 32, 60, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, 103, // i < visible.leng + 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 9, 115, // th; i++) {.....s + 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, // electedSet[visib + 108, 101, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 32, 61, 32, 116, // le[i].saddr] = t + 114, 117, 101, 59, 10, 9, 9, 9, 125, 10, 9, 9, 125, 32, 101, 108, // rue;....}...} el + 115, 101, 32, 123, 10, 9, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // se {....for (var + 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 118, 105, 115, 105, // i = 0; i < visi + 98, 108, 101, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, // ble.length; i++) + 32, 123, 10, 9, 9, 9, 9, 100, 101, 108, 101, 116, 101, 32, 115, 101, // {.....delete se + 108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, 108, // lectedSet[visibl + 101, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 59, 10, 9, 9, 9, // e[i].saddr];.... + 125, 10, 9, 9, 125, 10, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, // }...}...renderTa + 98, 108, 101, 40, 41, 59, 10, 9, 9, 117, 112, 100, 97, 116, 101, 83, // ble();...updateS + 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, 9, // electionBar();.. + 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 111, 110, 84, // }...function onT + 111, 103, 103, 108, 101, 82, 111, 119, 40, 115, 97, 100, 100, 114, 41, 32, // oggleRow(saddr) + 123, 10, 9, 9, 105, 102, 32, 40, 115, 101, 108, 101, 99, 116, 101, 100, // {...if (selected + 83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 41, 32, 123, 10, 9, 9, // Set[saddr]) {... + 9, 100, 101, 108, 101, 116, 101, 32, 115, 101, 108, 101, 99, 116, 101, 100, // .delete selected + 83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 59, 10, 9, 9, 125, 32, // Set[saddr];...} + 101, 108, 115, 101, 32, 123, 10, 9, 9, 9, 115, 101, 108, 101, 99, 116, // else {....select + 101, 100, 83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 32, 61, 32, 116, // edSet[saddr] = t + 114, 117, 101, 59, 10, 9, 9, 125, 10, 9, 9, 114, 101, 110, 100, 101, // rue;...}...rende + 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 9, 9, 117, 112, 100, 97, // rTable();...upda + 116, 101, 83, 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, // teSelectionBar() + 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ;..}...function + 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, 100, 67, 111, 117, 110, 116, // getSelectedCount + 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, 99, 111, 117, 110, 116, // () {...var count + 32, 61, 32, 48, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // = 0;...for (var + 32, 107, 32, 105, 110, 32, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, // k in selectedSe + 116, 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 115, 101, 108, 101, // t) {....if (sele + 99, 116, 101, 100, 83, 101, 116, 46, 104, 97, 115, 79, 119, 110, 80, 114, // ctedSet.hasOwnPr + 111, 112, 101, 114, 116, 121, 40, 107, 41, 41, 32, 99, 111, 117, 110, 116, // operty(k)) count + 43, 43, 59, 10, 9, 9, 125, 10, 9, 9, 114, 101, 116, 117, 114, 110, // ++;...}...return + 32, 99, 111, 117, 110, 116, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, // count;..}...fun + 99, 116, 105, 111, 110, 32, 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, // ction getSelecte + 100, 73, 116, 101, 109, 115, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, // dItems() {...var + 32, 114, 101, 115, 117, 108, 116, 32, 61, 32, 91, 93, 59, 10, 9, 9, // result = [];... + 118, 97, 114, 32, 102, 117, 108, 108, 68, 97, 116, 97, 32, 61, 32, 97, // var fullData = a + 108, 108, 68, 97, 116, 97, 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, // llData[activeTab + 93, 32, 124, 124, 32, 91, 93, 59, 10, 9, 9, 102, 111, 114, 32, 40, // ] || [];...for ( + 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 102, // var i = 0; i < f + 117, 108, 108, 68, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 59, 32, // ullData.length; + 105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 115, 101, // i++) {....if (se + 108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 102, 117, 108, 108, 68, 97, // lectedSet[fullDa + 116, 97, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 41, 32, 123, 10, // ta[i].saddr]) {. + 9, 9, 9, 9, 114, 101, 115, 117, 108, 116, 46, 112, 117, 115, 104, 40, // ....result.push( + 102, 117, 108, 108, 68, 97, 116, 97, 91, 105, 93, 41, 59, 10, 9, 9, // fullData[i]);... + 9, 125, 10, 9, 9, 125, 10, 9, 9, 114, 101, 116, 117, 114, 110, 32, // .}...}...return + 114, 101, 115, 117, 108, 116, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, // result;..}...fun + 99, 116, 105, 111, 110, 32, 117, 112, 100, 97, 116, 101, 83, 101, 108, 101, // ction updateSele + 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 32, 123, 10, 9, 9, 118, // ctionBar() {...v + 97, 114, 32, 98, 97, 114, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, // ar bar = documen + 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, // t.getElementById + 40, 39, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, 39, 41, 59, 10, // ('dc-sel-bar');. + 9, 9, 105, 102, 32, 40, 33, 98, 97, 114, 41, 32, 114, 101, 116, 117, // ..if (!bar) retu + 114, 110, 59, 10, 9, 9, 118, 97, 114, 32, 99, 111, 117, 110, 116, 32, // rn;...var count + 61, 32, 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, 100, 67, 111, 117, // = getSelectedCou + 110, 116, 40, 41, 59, 10, 9, 9, 105, 102, 32, 40, 99, 111, 117, 110, // nt();...if (coun + 116, 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 98, 97, // t === 0) {....ba + 114, 46, 115, 116, 121, 108, 101, 46, 100, 105, 115, 112, 108, 97, 121, 32, // r.style.display + 61, 32, 39, 110, 111, 110, 101, 39, 59, 10, 9, 9, 125, 32, 101, 108, // = 'none';...} el + 115, 101, 32, 123, 10, 9, 9, 9, 98, 97, 114, 46, 115, 116, 121, 108, // se {....bar.styl + 101, 46, 100, 105, 115, 112, 108, 97, 121, 32, 61, 32, 39, 102, 108, 101, // e.display = 'fle + 120, 39, 59, 10, 9, 9, 9, 98, 97, 114, 46, 113, 117, 101, 114, 121, // x';....bar.query + 83, 101, 108, 101, 99, 116, 111, 114, 40, 39, 46, 100, 99, 45, 115, 101, // Selector('.dc-se + 108, 45, 108, 97, 98, 101, 108, 39, 41, 46, 116, 101, 120, 116, 67, 111, // l-label').textCo + 110, 116, 101, 110, 116, 32, 61, 32, 39, 229, 183, 178, 233, 128, 137, 32, // ntent = '...... + 39, 32, 43, 32, 99, 111, 117, 110, 116, 32, 43, 32, 39, 32, 228, 184, // ' + count + ' .. + 170, 228, 191, 161, 229, 143, 183, 39, 59, 10, 9, 9, 125, 10, 9, 125, // .......';...}..} + 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 100, 111, 65, 100, // ...function doAd + 100, 83, 101, 108, 101, 99, 116, 101, 100, 40, 41, 32, 123, 10, 9, 9, // dSelected() {... + 118, 97, 114, 32, 105, 116, 101, 109, 115, 32, 61, 32, 103, 101, 116, 83, // var items = getS + 101, 108, 101, 99, 116, 101, 100, 73, 116, 101, 109, 115, 40, 41, 59, 10, // electedItems();. + 9, 9, 105, 102, 32, 40, 105, 116, 101, 109, 115, 46, 108, 101, 110, 103, // ..if (items.leng + 116, 104, 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 97, // th === 0) {....a + 108, 101, 114, 116, 40, 39, 232, 175, 183, 229, 133, 136, 229, 139, 190, 233, // lert('.......... + 128, 137, 232, 166, 129, 230, 183, 187, 229, 138, 160, 231, 154, 132, 228, 191, // ................ + 161, 229, 143, 183, 39, 41, 59, 10, 9, 9, 9, 114, 101, 116, 117, 114, // ....');....retur + 110, 59, 10, 9, 9, 125, 10, 10, 9, 9, 118, 97, 114, 32, 116, 121, // n;...}....var ty + 112, 101, 76, 97, 98, 101, 108, 115, 32, 61, 32, 123, 32, 111, 117, 116, // peLabels = { out + 58, 39, 230, 179, 168, 229, 134, 140, 39, 44, 32, 105, 110, 58, 39, 233, // :'......', in:'. + 147, 190, 230, 142, 165, 230, 179, 168, 229, 134, 140, 39, 44, 32, 121, 107, // ...........', yk + 58, 39, 233, 129, 165, 230, 142, 167, 39, 44, 32, 97, 111, 58, 39, 229, // :'......', ao:'. + 143, 130, 230, 149, 176, 39, 44, 32, 112, 97, 114, 97, 109, 58, 39, 229, // .....', param:'. + 174, 154, 229, 128, 188, 39, 32, 125, 59, 10, 9, 9, 118, 97, 114, 32, // .....' };...var + 108, 97, 98, 101, 108, 32, 61, 32, 116, 121, 112, 101, 76, 97, 98, 101, // label = typeLabe + 108, 115, 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, // ls[activeTab] || + 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 59, 10, 10, 9, 9, 105, // activeTab;....i + 102, 32, 40, 33, 99, 111, 110, 102, 105, 114, 109, 40, 39, 231, 161, 174, // f (!confirm('... + 229, 174, 154, 229, 176, 134, 32, 39, 32, 43, 32, 105, 116, 101, 109, 115, // ...... ' + items + 46, 108, 101, 110, 103, 116, 104, 32, 43, 32, 39, 32, 228, 184, 170, 228, // .length + ' .... + 191, 161, 229, 143, 183, 230, 183, 187, 229, 138, 160, 229, 136, 176, 32, 39, // .............. ' + 32, 43, 32, 108, 97, 98, 101, 108, 32, 43, 32, 39, 239, 188, 159, 39, // + label + '...' + 41, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, 10, 9, 9, 118, 97, // )) return;....va + 114, 32, 115, 117, 99, 99, 32, 61, 32, 48, 59, 10, 9, 9, 102, 111, // r succ = 0;...fo + 114, 32, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, // r (var i = 0; i + 60, 32, 105, 116, 101, 109, 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, // < items.length; + 105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 118, 97, 114, 32, 111, 107, // i++) {....var ok + 32, 61, 32, 87, 115, 67, 108, 105, 101, 110, 116, 46, 115, 101, 110, 100, // = WsClient.send + 40, 123, 10, 9, 9, 9, 9, 115, 97, 100, 100, 114, 58, 32, 105, 116, // ({.....saddr: it + 101, 109, 115, 91, 105, 93, 46, 115, 97, 100, 100, 114, 44, 10, 9, 9, // ems[i].saddr,... + 9, 9, 115, 105, 103, 110, 97, 108, 95, 116, 121, 112, 101, 58, 32, 97, // ..signal_type: a + 99, 116, 105, 118, 101, 84, 97, 98, 44, 10, 9, 9, 9, 9, 99, 117, // ctiveTab,.....cu + 114, 100, 58, 32, 39, 97, 100, 100, 39, 44, 10, 9, 9, 9, 9, 115, // rd: 'add',.....s + 101, 116, 116, 105, 110, 103, 95, 122, 111, 110, 101, 58, 32, 39, 48, 39, // etting_zone: '0' + 44, 10, 9, 9, 9, 9, 115, 105, 103, 110, 97, 108, 95, 100, 97, 116, // ,.....signal_dat + 97, 58, 32, 39, 39, 10, 9, 9, 9, 125, 41, 59, 10, 9, 9, 9, // a: ''....});.... + 105, 102, 32, 40, 111, 107, 41, 32, 115, 117, 99, 99, 43, 43, 59, 10, // if (ok) succ++;. + 9, 9, 125, 10, 9, 9, 97, 108, 101, 114, 116, 40, 39, 229, 183, 178, // ..}...alert('... + 229, 143, 145, 233, 128, 129, 32, 39, 32, 43, 32, 115, 117, 99, 99, 32, // ...... ' + succ + 43, 32, 39, 47, 39, 32, 43, 32, 105, 116, 101, 109, 115, 46, 108, 101, // + '/' + items.le + 110, 103, 116, 104, 32, 43, 32, 39, 32, 228, 184, 170, 32, 97, 100, 100, // ngth + ' ... add + 32, 232, 175, 183, 230, 177, 130, 229, 136, 176, 32, 39, 32, 43, 32, 108, // ......... ' + l + 97, 98, 101, 108, 41, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, // abel);..}...func 116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, // tion renderHeade - 114, 115, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, // rs() {. v - 97, 114, 32, 116, 104, 101, 97, 100, 32, 61, 32, 100, 111, 99, 117, 109, // ar thead = docum - 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, // ent.getElementBy - 73, 100, 40, 39, 100, 99, 45, 116, 104, 101, 97, 100, 39, 41, 59, 10, // Id('dc-thead');. - 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, 116, 104, 101, // if (!the - 97, 100, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, 32, 32, // ad) return;. - 32, 32, 32, 32, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, 39, // var html = ' - 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, // ';. for ( - 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 67, // var i = 0; i < C - 79, 76, 85, 77, 78, 83, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, // OLUMNS.length; i - 43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ++) {. - 32, 32, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 116, 104, 62, 39, // html += '' - 32, 43, 32, 67, 79, 76, 85, 77, 78, 83, 91, 105, 93, 32, 43, 32, // + COLUMNS[i] + - 39, 60, 47, 116, 104, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, // '';. - 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 104, 101, 97, 100, // }. thead - 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, // .innerHTML = htm - 108, 59, 10, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 102, 117, // l;. }.. fu - 110, 99, 116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, // nction renderTab - 115, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, // s() {. va - 114, 32, 116, 121, 112, 101, 115, 32, 61, 32, 91, 39, 111, 117, 116, 39, // r types = ['out' - 44, 32, 39, 105, 110, 39, 44, 32, 39, 121, 107, 39, 44, 32, 39, 97, // , 'in', 'yk', 'a - 111, 39, 44, 32, 39, 112, 97, 114, 97, 109, 39, 93, 59, 10, 32, 32, // o', 'param'];. - 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 108, 97, 98, 101, 108, 115, // var labels - 32, 61, 32, 123, 32, 111, 117, 116, 58, 32, 39, 230, 179, 168, 229, 134, // = { out: '..... - 140, 32, 40, 111, 117, 116, 41, 39, 44, 32, 105, 110, 58, 32, 39, 233, // . (out)', in: '. - 147, 190, 230, 142, 165, 230, 179, 168, 229, 134, 140, 32, 40, 105, 110, 41, // ........... (in) - 39, 44, 32, 121, 107, 58, 32, 39, 233, 129, 165, 230, 142, 167, 32, 40, // ', yk: '...... ( - 121, 107, 41, 39, 44, 32, 97, 111, 58, 32, 39, 229, 143, 130, 230, 149, // yk)', ao: '..... - 176, 32, 40, 97, 111, 41, 39, 44, 32, 112, 97, 114, 97, 109, 58, 32, // . (ao)', param: - 39, 229, 174, 154, 229, 128, 188, 32, 40, 112, 97, 114, 97, 109, 41, 39, // '...... (param)' - 32, 125, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // };. var - 101, 108, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // el = document.ge + 114, 115, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, 116, 104, 101, // rs() {...var the + 97, 100, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // ad = document.ge 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, // tElementById('dc - 45, 116, 97, 98, 45, 98, 97, 114, 39, 41, 59, 10, 32, 32, 32, 32, // -tab-bar');. - 32, 32, 32, 32, 105, 102, 32, 40, 33, 101, 108, 41, 32, 114, 101, 116, // if (!el) ret - 117, 114, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // urn;. var - 32, 104, 116, 109, 108, 32, 61, 32, 39, 39, 59, 10, 32, 32, 32, 32, // html = '';. - 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, 114, 32, 105, 32, 61, // for (var i = - 32, 48, 59, 32, 105, 32, 60, 32, 116, 121, 112, 101, 115, 46, 108, 101, // 0; i < types.le - 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 32, 32, 32, // ngth; i++) {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 32, 61, // var t = - 32, 116, 121, 112, 101, 115, 91, 105, 93, 59, 10, 32, 32, 32, 32, 32, // types[i];. - 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 99, 108, 115, 32, 61, // var cls = - 32, 116, 32, 61, 61, 61, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, // t === activeTab - 32, 63, 32, 39, 100, 99, 45, 116, 97, 98, 32, 97, 99, 116, 105, 118, // ? 'dc-tab activ - 101, 39, 32, 58, 32, 39, 100, 99, 45, 116, 97, 98, 39, 59, 10, 32, // e' : 'dc-tab';. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 104, 116, 109, 108, 32, // html - 43, 61, 32, 39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, // += '' + labels[t] - 32, 43, 32, 39, 60, 47, 115, 112, 97, 110, 62, 39, 59, 10, 32, 32, // + '';. - 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, // }. - 101, 108, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, // el.innerHTML = h - 116, 109, 108, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // tml;. var - 32, 116, 97, 98, 115, 32, 61, 32, 101, 108, 46, 113, 117, 101, 114, 121, // tabs = el.query - 83, 101, 108, 101, 99, 116, 111, 114, 65, 108, 108, 40, 39, 46, 100, 99, // SelectorAll('.dc - 45, 116, 97, 98, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // -tab');. - 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, 48, 59, 32, // for (var k = 0; - 107, 32, 60, 32, 116, 97, 98, 115, 46, 108, 101, 110, 103, 116, 104, 59, // k < tabs.length; - 32, 107, 43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // k++) {. - 32, 32, 32, 32, 116, 97, 98, 115, 91, 107, 93, 46, 111, 110, 99, 108, // tabs[k].oncl - 105, 99, 107, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // ick = function() - 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. - 32, 32, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 116, // activeTab = t - 104, 105, 115, 46, 103, 101, 116, 65, 116, 116, 114, 105, 98, 117, 116, 101, // his.getAttribute - 40, 39, 100, 97, 116, 97, 45, 116, 97, 98, 39, 41, 59, 10, 32, 32, // ('data-tab');. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, // se - 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 32, // archText = '';. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 100, // d - 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, // ocument.getEleme - 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 115, 101, 97, 114, 99, // ntById('dc-searc - 104, 39, 41, 46, 118, 97, 108, 117, 101, 32, 61, 32, 39, 39, 59, 10, // h').value = '';. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 114, 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, 10, 32, 32, // renderTabs();. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, // re - 110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 32, // nderHeaders();. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, // r - 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 32, 32, // enderTable();. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // };. - 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 32, 32, // }. }.. - 32, 32, 114, 101, 116, 117, 114, 110, 32, 123, 10, 32, 32, 32, 32, 32, // return {. - 32, 32, 32, 114, 101, 110, 100, 101, 114, 58, 32, 102, 117, 110, 99, 116, // render: funct - 105, 111, 110, 40, 99, 111, 110, 116, 97, 105, 110, 101, 114, 41, 32, 123, // ion(container) { - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, 108, 108, // . all - 68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, 32, 32, 32, 32, // Data = {};. - 32, 32, 32, 32, 32, 32, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, // activeTab - 32, 61, 32, 39, 111, 117, 116, 39, 59, 10, 32, 32, 32, 32, 32, 32, // = 'out';. - 32, 32, 32, 32, 32, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, // searchText - 32, 61, 32, 39, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // = '';. - 32, 32, 32, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 105, 110, 110, // container.inn - 101, 114, 72, 84, 77, 76, 32, 61, 32, 39, 39, 10, 32, 32, 32, 32, // erHTML = ''. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, // + '< - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 112, 97, 103, 101, 45, // div class="page- - 104, 101, 97, 100, 101, 114, 34, 62, 60, 104, 50, 62, 230, 149, 176, 230, // header">

.... - 141, 174, 228, 184, 173, 229, 191, 131, 60, 47, 104, 50, 62, 60, 112, 62, // ........

- 230, 159, 165, 231, 156, 139, 230, 137, 128, 230, 156, 137, 228, 191, 161, 229, // ................ - 143, 183, 230, 149, 176, 230, 141, 174, 239, 188, 140, 230, 140, 137, 231, 177, // ................ - 187, 229, 158, 139, 229, 136, 134, 232, 161, 168, 239, 188, 140, 230, 148, 175, // ................ - 230, 140, 129, 230, 144, 156, 231, 180, 162, 60, 47, 112, 62, 60, 47, 100, // .........

'. - 32, 32, 32, 32, 32, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, // + '
'. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 32, 32, 39, 60, // + '< - 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, 116, 97, // div class="dc-ta - 98, 45, 98, 97, 114, 34, 32, 105, 100, 61, 34, 100, 99, 45, 116, 97, // b-bar" id="dc-ta - 98, 45, 98, 97, 114, 34, 62, 60, 47, 100, 105, 118, 62, 39, 10, 32, // b-bar">
'. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, // + - 32, 32, 32, 39, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // '' - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // . - 32, 43, 32, 32, 32, 39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // + '0'. - 32, 32, 32, 32, 32, 43, 32, 39, 60, 47, 100, 105, 118, 62, 39, 10, // + ''. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 116, // + '
'. - 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 97, 98, 108, // + ' - 60, 47, 116, 114, 62, 60, 47, 116, 104, 101, 97, 100, 62, 60, 116, 98, // '. - 32, 32, 32, 32, 43, 32, 39, 60, 47, 100, 105, 118, 62, 60, 47, 100, // + '
';.. - 32, 32, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, // renderTabs(); - 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, // . ren - 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 32, 32, // derHeaders();. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, 100, 101, 114, // render - 84, 97, 98, 108, 101, 40, 41, 59, 10, 10, 32, 32, 32, 32, 32, 32, // Table();.. - 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, 97, 114, 99, 104, // var search - 73, 110, 112, 117, 116, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, // Input = document - 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, // .getElementById( - 39, 100, 99, 45, 115, 101, 97, 114, 99, 104, 39, 41, 59, 10, 32, 32, // 'dc-search');. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, // if (se - 97, 114, 99, 104, 73, 110, 112, 117, 116, 41, 32, 123, 10, 32, 32, 32, // archInput) {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, 97, // sea - 114, 99, 104, 73, 110, 112, 117, 116, 46, 111, 110, 105, 110, 112, 117, 116, // rchInput.oninput - 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, // = function() {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 32, 32, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, // searchText = - 32, 116, 104, 105, 115, 46, 118, 97, 108, 117, 101, 59, 10, 32, 32, 32, // this.value;. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, // renderTable();. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // - 125, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, // };. } - 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 44, 10, 10, 32, 32, 32, // . },.. - 32, 32, 32, 32, 32, 111, 110, 69, 110, 116, 101, 114, 58, 32, 102, 117, // onEnter: fu - 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, // nction() {. - 32, 32, 32, 125, 44, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 111, // },.. o - 110, 76, 101, 97, 118, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, // nLeave: function - 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // () {. - 32, 97, 108, 108, 68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, // allData = {};. - 32, 32, 32, 32, 32, 32, 32, 125, 44, 10, 10, 32, 32, 32, 32, 32, // },.. - 32, 32, 32, 111, 110, 68, 97, 116, 97, 58, 32, 102, 117, 110, 99, 116, // onData: funct - 105, 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, 32, 32, 32, 32, // ion(data) {. - 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, 100, 97, 116, // if (!dat - 97, 32, 124, 124, 32, 116, 121, 112, 101, 111, 102, 32, 100, 97, 116, 97, // a || typeof data - 32, 33, 61, 61, 32, 39, 111, 98, 106, 101, 99, 116, 39, 41, 32, 114, // !== 'object') r - 101, 116, 117, 114, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // eturn;. - 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, 116, 41, // if (data.out) - 32, 97, 108, 108, 68, 97, 116, 97, 46, 111, 117, 116, 32, 61, 32, 100, // allData.out = d - 97, 116, 97, 46, 111, 117, 116, 59, 10, 32, 32, 32, 32, 32, 32, 32, // ata.out;. - 32, 32, 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 105, 110, // if (data.in - 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 105, 110, 32, 61, 32, 100, // ) allData.in = d - 97, 116, 97, 46, 105, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ata.in;. - 32, 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 121, 107, 41, // if (data.yk) + 45, 116, 104, 101, 97, 100, 39, 41, 59, 10, 9, 9, 105, 102, 32, 40, // -thead');...if ( + 33, 116, 104, 101, 97, 100, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, // !thead) return;. + 9, 9, 118, 97, 114, 32, 118, 105, 115, 105, 98, 108, 101, 32, 61, 32, // ..var visible = + 103, 101, 116, 86, 105, 115, 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, // getVisibleData() + 59, 10, 9, 9, 118, 97, 114, 32, 97, 108, 108, 67, 104, 101, 99, 107, // ;...var allCheck + 101, 100, 32, 61, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, // ed = visible.len + 103, 116, 104, 32, 62, 32, 48, 59, 10, 9, 9, 102, 111, 114, 32, 40, // gth > 0;...for ( + 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 118, // var i = 0; i < v + 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, 103, 116, 104, 32, 38, 38, // isible.length && + 32, 97, 108, 108, 67, 104, 101, 99, 107, 101, 100, 59, 32, 105, 43, 43, // allChecked; i++ + 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 33, 115, 101, 108, 101, // ) {....if (!sele + 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, 108, 101, 91, // ctedSet[visible[ + 105, 93, 46, 115, 97, 100, 100, 114, 93, 41, 32, 97, 108, 108, 67, 104, // i].saddr]) allCh + 101, 99, 107, 101, 100, 32, 61, 32, 102, 97, 108, 115, 101, 59, 10, 9, // ecked = false;.. + 9, 125, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, // .}...var html = + 39, 60, 116, 104, 32, 115, 116, 121, 108, 101, 61, 34, 119, 105, 100, 116, // '';...fo + 114, 32, 40, 118, 97, 114, 32, 106, 32, 61, 32, 49, 59, 32, 106, 32, // r (var j = 1; j + 60, 32, 67, 79, 76, 85, 77, 78, 83, 46, 108, 101, 110, 103, 116, 104, // < COLUMNS.length + 59, 32, 106, 43, 43, 41, 32, 123, 10, 9, 9, 9, 104, 116, 109, 108, // ; j++) {....html + 32, 43, 61, 32, 39, 60, 116, 104, 62, 39, 32, 43, 32, 67, 79, 76, // += '' + COL + 85, 77, 78, 83, 91, 106, 93, 32, 43, 32, 39, 60, 47, 116, 104, 62, // UMNS[j] + ' + 39, 59, 10, 9, 9, 125, 10, 9, 9, 116, 104, 101, 97, 100, 46, 105, // ';...}...thead.i + 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, // nnerHTML = html; + 10, 10, 9, 9, 118, 97, 114, 32, 99, 98, 65, 108, 108, 32, 61, 32, // ....var cbAll = + 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, // document.getElem + 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, 98, 45, 97, // entById('dc-cb-a + 108, 108, 39, 41, 59, 10, 9, 9, 105, 102, 32, 40, 99, 98, 65, 108, // ll');...if (cbAl + 108, 41, 32, 99, 98, 65, 108, 108, 46, 111, 110, 99, 104, 97, 110, 103, // l) cbAll.onchang + 101, 32, 61, 32, 111, 110, 83, 101, 108, 101, 99, 116, 65, 108, 108, 59, // e = onSelectAll; + 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 114, // ..}...function r + 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 32, 123, 10, 9, // enderTable() {.. + 9, 118, 97, 114, 32, 100, 97, 116, 97, 32, 61, 32, 103, 101, 116, 86, // .var data = getV + 105, 115, 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, 59, 10, 9, 9, // isibleData();... + 118, 97, 114, 32, 116, 98, 111, 100, 121, 32, 61, 32, 100, 111, 99, 117, // var tbody = docu + 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, // ment.getElementB + 121, 73, 100, 40, 39, 100, 99, 45, 116, 98, 111, 100, 121, 39, 41, 59, // yId('dc-tbody'); + 10, 9, 9, 105, 102, 32, 40, 33, 116, 98, 111, 100, 121, 41, 32, 114, // ...if (!tbody) r + 101, 116, 117, 114, 110, 59, 10, 10, 9, 9, 118, 97, 114, 32, 102, 117, // eturn;....var fu + 108, 108, 68, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, // llData = allData + 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, // [activeTab] || [ + 93, 59, 10, 9, 9, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // ];...document.ge + 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, // tElementById('dc + 45, 99, 111, 117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, // -count').textCon + 116, 101, 110, 116, 32, 61, 32, 100, 97, 116, 97, 46, 108, 101, 110, 103, // tent = data.leng + 116, 104, 32, 43, 32, 39, 32, 47, 32, 39, 32, 43, 32, 102, 117, 108, // th + ' / ' + ful + 108, 68, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 59, 10, 10, 9, // lData.length;... + 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, // .if (data.length + 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 116, 98, 111, // === 0) {....tbo + 100, 121, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 39, // dy.innerHTML = ' + 60, 116, 114, 32, 99, 108, 97, 115, 115, 61, 34, 101, 109, 112, 116, 121, // ..... + 160, 230, 149, 176, 230, 141, 174, 60, 47, 116, 100, 62, 60, 47, 116, 114, // .......';....return;.. + 9, 125, 10, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, // .}....var html = + 32, 39, 39, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, 32, // '';...for (var + 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 100, 97, 116, 97, 46, // i = 0; i < data. + 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 9, // length; i++) {.. + 9, 9, 118, 97, 114, 32, 105, 116, 101, 109, 32, 61, 32, 100, 97, 116, // ..var item = dat + 97, 91, 105, 93, 59, 10, 9, 9, 9, 118, 97, 114, 32, 99, 104, 101, // a[i];....var che + 99, 107, 101, 100, 32, 61, 32, 33, 33, 115, 101, 108, 101, 99, 116, 101, // cked = !!selecte + 100, 83, 101, 116, 91, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 93, // dSet[item.saddr] + 59, 10, 9, 9, 9, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 116, // ;....html += ''.....+ '< + 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 34, 99, 104, 101, 99, // input type="chec + 107, 98, 111, 120, 34, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, // kbox" class="dc- + 99, 98, 45, 114, 111, 119, 34, 39, 32, 43, 32, 40, 99, 104, 101, 99, // cb-row"' + (chec + 107, 101, 100, 32, 63, 32, 39, 32, 99, 104, 101, 99, 107, 101, 100, 39, // ked ? ' checked' + 32, 58, 32, 39, 39, 41, 32, 43, 32, 39, 32, 100, 97, 116, 97, 45, // : '') + ' data- + 115, 97, 100, 100, 114, 61, 34, 39, 32, 43, 32, 102, 109, 116, 86, 97, // saddr="' + fmtVa + 108, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 41, 32, 43, 32, // l(item.saddr) + + 39, 34, 62, 60, 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, // '">'.....+ + 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // '' + fmtVal( + 105, 116, 101, 109, 46, 105, 100, 41, 32, 43, 32, 39, 60, 47, 116, 100, // item.id) + ''.....+ '' + 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 115, 97, // + fmtVal(item.sa + 100, 100, 114, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 9, // ddr) + ''.. + 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, // ...+ '' + fm + 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 100, 101, 115, 99, 41, 32, // tVal(item.desc) + 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, // + ''.....+ + 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // '' + fmtVal( + 105, 116, 101, 109, 46, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, 47, // item.type) + ''.....+ ' + 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 67, 84, 82, 76, 95, // ' + fmtVal(CTRL_ + 84, 89, 80, 69, 95, 77, 65, 80, 91, 105, 116, 101, 109, 46, 99, 116, // TYPE_MAP[item.ct + 114, 108, 95, 116, 121, 112, 101, 93, 32, 124, 124, 32, 105, 116, 101, 109, // rl_type] || item + 46, 99, 116, 114, 108, 95, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, // .ctrl_type) + '< + 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, // /td>'.....+ '' + + 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 108, 105, 110, 107, // fmtVal(item.link + 95, 115, 97, 100, 100, 114, 115, 41, 32, 43, 32, 39, 60, 47, 116, 100, // _saddrs) + ''.....+ '' + 59, 10, 9, 9, 125, 10, 9, 9, 116, 98, 111, 100, 121, 46, 105, 110, // ;...}...tbody.in + 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, 10, // nerHTML = html;. + 10, 9, 9, 47, 47, 32, 231, 187, 145, 229, 174, 154, 232, 161, 140, 229, // ...// .......... + 164, 141, 233, 128, 137, 230, 161, 134, 228, 186, 139, 228, 187, 182, 10, 9, // ................ + 9, 118, 97, 114, 32, 99, 98, 115, 32, 61, 32, 116, 98, 111, 100, 121, // .var cbs = tbody + 46, 113, 117, 101, 114, 121, 83, 101, 108, 101, 99, 116, 111, 114, 65, 108, // .querySelectorAl + 108, 40, 39, 46, 100, 99, 45, 99, 98, 45, 114, 111, 119, 39, 41, 59, // l('.dc-cb-row'); + 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, // ...for (var k = + 48, 59, 32, 107, 32, 60, 32, 99, 98, 115, 46, 108, 101, 110, 103, 116, // 0; k < cbs.lengt + 104, 59, 32, 107, 43, 43, 41, 32, 123, 10, 9, 9, 9, 99, 98, 115, // h; k++) {....cbs + 91, 107, 93, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, 32, 102, 117, // [k].onclick = fu + 110, 99, 116, 105, 111, 110, 40, 101, 41, 32, 123, 10, 9, 9, 9, 9, // nction(e) {..... + 101, 46, 115, 116, 111, 112, 80, 114, 111, 112, 97, 103, 97, 116, 105, 111, // e.stopPropagatio + 110, 40, 41, 59, 10, 9, 9, 9, 9, 111, 110, 84, 111, 103, 103, 108, // n();.....onToggl + 101, 82, 111, 119, 40, 116, 104, 105, 115, 46, 103, 101, 116, 65, 116, 116, // eRow(this.getAtt + 114, 105, 98, 117, 116, 101, 40, 39, 100, 97, 116, 97, 45, 115, 97, 100, // ribute('data-sad + 100, 114, 39, 41, 41, 59, 10, 9, 9, 9, 125, 59, 10, 9, 9, 125, // dr'));....};...} + 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 114, // ..}...function r + 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 32, 123, 10, 9, 9, // enderTabs() {... + 118, 97, 114, 32, 116, 121, 112, 101, 115, 32, 61, 32, 91, 39, 111, 117, // var types = ['ou + 116, 39, 44, 32, 39, 105, 110, 39, 44, 32, 39, 121, 107, 39, 44, 32, // t', 'in', 'yk', + 39, 97, 111, 39, 44, 32, 39, 112, 97, 114, 97, 109, 39, 93, 59, 10, // 'ao', 'param'];. + 9, 9, 118, 97, 114, 32, 108, 97, 98, 101, 108, 115, 32, 61, 32, 123, // ..var labels = { + 32, 111, 117, 116, 58, 32, 39, 230, 179, 168, 229, 134, 140, 32, 40, 111, // out: '...... (o + 117, 116, 41, 39, 44, 32, 105, 110, 58, 32, 39, 233, 147, 190, 230, 142, // ut)', in: '..... + 165, 230, 179, 168, 229, 134, 140, 32, 40, 105, 110, 41, 39, 44, 32, 121, // ....... (in)', y + 107, 58, 32, 39, 233, 129, 165, 230, 142, 167, 32, 40, 121, 107, 41, 39, // k: '...... (yk)' + 44, 32, 97, 111, 58, 32, 39, 229, 143, 130, 230, 149, 176, 32, 40, 97, // , ao: '...... (a + 111, 41, 39, 44, 32, 112, 97, 114, 97, 109, 58, 32, 39, 229, 174, 154, // o)', param: '... + 229, 128, 188, 32, 40, 112, 97, 114, 97, 109, 41, 39, 32, 125, 59, 10, // ... (param)' };. + 9, 9, 118, 97, 114, 32, 101, 108, 32, 61, 32, 100, 111, 99, 117, 109, // ..var el = docum + 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, // ent.getElementBy + 73, 100, 40, 39, 100, 99, 45, 116, 97, 98, 45, 98, 97, 114, 39, 41, // Id('dc-tab-bar') + 59, 10, 9, 9, 105, 102, 32, 40, 33, 101, 108, 41, 32, 114, 101, 116, // ;...if (!el) ret + 117, 114, 110, 59, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, // urn;...var html + 61, 32, 39, 39, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // = '';...for (var + 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 116, 121, 112, 101, // i = 0; i < type + 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, // s.length; i++) { + 10, 9, 9, 9, 118, 97, 114, 32, 116, 32, 61, 32, 116, 121, 112, 101, // ....var t = type + 115, 91, 105, 93, 59, 10, 9, 9, 9, 118, 97, 114, 32, 99, 108, 115, // s[i];....var cls + 32, 61, 32, 116, 32, 61, 61, 61, 32, 97, 99, 116, 105, 118, 101, 84, // = t === activeT + 97, 98, 32, 63, 32, 39, 100, 99, 45, 116, 97, 98, 32, 97, 99, 116, // ab ? 'dc-tab act + 105, 118, 101, 39, 32, 58, 32, 39, 100, 99, 45, 116, 97, 98, 39, 59, // ive' : 'dc-tab'; + 10, 9, 9, 9, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 115, 112, // ....html += '' + + 108, 97, 98, 101, 108, 115, 91, 116, 93, 32, 43, 32, 39, 60, 47, 115, // labels[t] + '';...}...el. + 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, // innerHTML = html + 59, 10, 9, 9, 118, 97, 114, 32, 116, 97, 98, 115, 32, 61, 32, 101, // ;...var tabs = e + 108, 46, 113, 117, 101, 114, 121, 83, 101, 108, 101, 99, 116, 111, 114, 65, // l.querySelectorA + 108, 108, 40, 39, 46, 100, 99, 45, 116, 97, 98, 39, 41, 59, 10, 9, // ll('.dc-tab');.. + 9, 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, 48, 59, // .for (var k = 0; + 32, 107, 32, 60, 32, 116, 97, 98, 115, 46, 108, 101, 110, 103, 116, 104, // k < tabs.length + 59, 32, 107, 43, 43, 41, 32, 123, 10, 9, 9, 9, 116, 97, 98, 115, // ; k++) {....tabs + 91, 107, 93, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, 32, 102, 117, // [k].onclick = fu + 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 9, 9, 9, 9, 97, // nction() {.....a + 99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 116, 104, 105, 115, 46, // ctiveTab = this. + 103, 101, 116, 65, 116, 116, 114, 105, 98, 117, 116, 101, 40, 39, 100, 97, // getAttribute('da + 116, 97, 45, 116, 97, 98, 39, 41, 59, 10, 9, 9, 9, 9, 115, 101, // ta-tab');.....se + 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 9, // archText = '';.. + 9, 9, 9, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 32, 61, // ...selectedSet = + 32, 123, 125, 59, 10, 9, 9, 9, 9, 100, 111, 99, 117, 109, 101, 110, // {};.....documen + 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, // t.getElementById + 40, 39, 100, 99, 45, 115, 101, 97, 114, 99, 104, 39, 41, 46, 118, 97, // ('dc-search').va + 108, 117, 101, 32, 61, 32, 39, 39, 59, 10, 9, 9, 9, 9, 114, 101, // lue = '';.....re + 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, 10, 9, 9, 9, 9, // nderTabs();..... + 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, // renderHeaders(); + 10, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, // .....renderTable + 40, 41, 59, 10, 9, 9, 9, 9, 117, 112, 100, 97, 116, 101, 83, 101, // ();.....updateSe + 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, 9, 9, // lectionBar();... + 9, 125, 59, 10, 9, 9, 125, 10, 9, 125, 10, 10, 9, 114, 101, 116, // .};...}..}...ret + 117, 114, 110, 32, 123, 10, 9, 9, 114, 101, 110, 100, 101, 114, 58, 32, // urn {...render: + 102, 117, 110, 99, 116, 105, 111, 110, 40, 99, 111, 110, 116, 97, 105, 110, // function(contain + 101, 114, 41, 32, 123, 10, 9, 9, 9, 97, 108, 108, 68, 97, 116, 97, // er) {....allData + 32, 61, 32, 123, 125, 59, 10, 9, 9, 9, 97, 99, 116, 105, 118, 101, // = {};....active + 84, 97, 98, 32, 61, 32, 39, 111, 117, 116, 39, 59, 10, 9, 9, 9, // Tab = 'out';.... + 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, // searchText = ''; + 10, 9, 9, 9, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 32, // ....selectedSet + 61, 32, 123, 125, 59, 10, 9, 9, 9, 99, 111, 110, 116, 97, 105, 110, // = {};....contain + 101, 114, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 39, // er.innerHTML = ' + 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, // '.....+ '

.......... + 191, 131, 60, 47, 104, 50, 62, 60, 112, 62, 229, 139, 190, 233, 128, 137, // ..

...... + 228, 191, 161, 229, 143, 183, 229, 144, 142, 231, 130, 185, 229, 135, 187, 34, // ..............." + 230, 183, 187, 229, 138, 160, 229, 136, 176, 34, 229, 141, 179, 229, 143, 175, // ........."...... + 230, 183, 187, 229, 138, 160, 232, 135, 179, 229, 175, 185, 229, 186, 148, 233, // ................ + 133, 141, 231, 189, 174, 233, 161, 181, 32, 124, 32, 230, 159, 165, 231, 156, // ........ | ..... + 139, 230, 137, 128, 230, 156, 137, 228, 191, 161, 229, 143, 183, 230, 149, 176, // ................ + 230, 141, 174, 239, 188, 140, 230, 140, 137, 231, 177, 187, 229, 158, 139, 229, // ................ + 136, 134, 232, 161, 168, 239, 188, 140, 230, 148, 175, 230, 140, 129, 230, 144, // ................ + 156, 231, 180, 162, 60, 47, 112, 62, 60, 47, 100, 105, 118, 62, 39, 10, // ....

'. + 9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, // ....+ '
'.....+ + 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // '
+ 39, 10, 9, 9, 9, 9, 43, 32, 32, 32, 39, 60, 105, 110, 112, 117, // '.....+ ''.....+ + 39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // '0'. + 9, 9, 9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, 39, 10, 9, // ....+ '
'.. + 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, // ...+ '
'.....+ '...... + 48, 32, 228, 184, 170, 228, 191, 161, 229, 143, 183, 60, 47, 115, 112, 97, // 0 .........'.....+ '.......... + 133, 141, 231, 189, 174, 233, 161, 181, 60, 47, 98, 117, 116, 116, 111, 110, // ........'.....+ '
+ 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, // '.....+ '
'... + 9, 9, 43, 32, 39, 60, 116, 97, 98, 108, 101, 32, 99, 108, 97, 115, // ..+ '< + 47, 116, 104, 101, 97, 100, 62, 60, 116, 98, 111, 100, 121, 32, 105, 100, // /thead>
'... + 9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, // ..+ '
';.....renderTa + 98, 115, 40, 41, 59, 10, 9, 9, 9, 114, 101, 110, 100, 101, 114, 72, // bs();....renderH + 101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 9, 9, 9, 114, 101, 110, // eaders();....ren + 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 10, 9, 9, 9, // derTable();..... + 118, 97, 114, 32, 115, 101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 32, // var searchInput + 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, // = document.getEl + 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 115, 101, // ementById('dc-se + 97, 114, 99, 104, 39, 41, 59, 10, 9, 9, 9, 105, 102, 32, 40, 115, // arch');....if (s + 101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 41, 32, 123, 10, 9, 9, // earchInput) {... + 9, 9, 115, 101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 46, 111, 110, // ..searchInput.on + 105, 110, 112, 117, 116, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // input = function + 40, 41, 32, 123, 10, 9, 9, 9, 9, 9, 115, 101, 97, 114, 99, 104, // () {......search + 84, 101, 120, 116, 32, 61, 32, 116, 104, 105, 115, 46, 118, 97, 108, 117, // Text = this.valu + 101, 59, 10, 9, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 72, 101, // e;......renderHe + 97, 100, 101, 114, 115, 40, 41, 59, 10, 9, 9, 9, 9, 9, 114, 101, // aders();......re + 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 9, 9, 9, // nderTable();.... + 9, 125, 59, 10, 9, 9, 9, 125, 10, 10, 9, 9, 9, 118, 97, 114, // .};....}.....var + 32, 97, 100, 100, 66, 116, 110, 32, 61, 32, 100, 111, 99, 117, 109, 101, // addBtn = docume + 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, // nt.getElementByI + 100, 40, 39, 100, 99, 45, 98, 116, 110, 45, 97, 100, 100, 39, 41, 59, // d('dc-btn-add'); + 10, 9, 9, 9, 105, 102, 32, 40, 97, 100, 100, 66, 116, 110, 41, 32, // ....if (addBtn) + 97, 100, 100, 66, 116, 110, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, // addBtn.onclick = + 32, 100, 111, 65, 100, 100, 83, 101, 108, 101, 99, 116, 101, 100, 59, 10, // doAddSelected;. + 9, 9, 125, 44, 10, 10, 9, 9, 111, 110, 69, 110, 116, 101, 114, 58, // ..},....onEnter: + 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 125, 44, 10, // function() {},. + 10, 9, 9, 111, 110, 76, 101, 97, 118, 101, 58, 32, 102, 117, 110, 99, // ...onLeave: func + 116, 105, 111, 110, 40, 41, 32, 123, 10, 9, 9, 9, 97, 108, 108, 68, // tion() {....allD + 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 9, 9, 9, 115, 101, 108, // ata = {};....sel + 101, 99, 116, 101, 100, 83, 101, 116, 32, 61, 32, 123, 125, 59, 10, 9, // ectedSet = {};.. + 9, 125, 44, 10, 10, 9, 9, 111, 110, 68, 97, 116, 97, 58, 32, 102, // .},....onData: f + 117, 110, 99, 116, 105, 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, // unction(data) {. + 9, 9, 9, 105, 102, 32, 40, 33, 100, 97, 116, 97, 32, 124, 124, 32, // ...if (!data || + 116, 121, 112, 101, 111, 102, 32, 100, 97, 116, 97, 32, 33, 61, 61, 32, // typeof data !== + 39, 111, 98, 106, 101, 99, 116, 39, 41, 32, 114, 101, 116, 117, 114, 110, // 'object') return + 59, 10, 9, 9, 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, // ;....if (data.ou + 116, 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 111, 117, 116, 32, 61, // t) allData.out = + 32, 100, 97, 116, 97, 46, 111, 117, 116, 59, 10, 9, 9, 9, 105, 102, // data.out;....if + 32, 40, 100, 97, 116, 97, 46, 105, 110, 41, 32, 97, 108, 108, 68, 97, // (data.in) allDa + 116, 97, 46, 105, 110, 32, 61, 32, 100, 97, 116, 97, 46, 105, 110, 59, // ta.in = data.in; + 10, 9, 9, 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 121, 107, 41, // ....if (data.yk) 32, 97, 108, 108, 68, 97, 116, 97, 46, 121, 107, 32, 61, 32, 100, 97, // allData.yk = da - 116, 97, 46, 121, 107, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ta.yk;. - 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 97, 111, 41, 32, // if (data.ao) - 97, 108, 108, 68, 97, 116, 97, 46, 97, 111, 32, 61, 32, 100, 97, 116, // allData.ao = dat - 97, 46, 97, 111, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // a.ao;. - 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, // if (data.param - 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 112, 97, 114, 97, 109, 32, // ) allData.param - 61, 32, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 59, 10, 32, 32, // = data.param;. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 100, 97, // if (da - 116, 97, 46, 111, 117, 116, 32, 124, 124, 32, 100, 97, 116, 97, 46, 105, // ta.out || data.i - 110, 32, 124, 124, 32, 100, 97, 116, 97, 46, 121, 107, 32, 124, 124, 32, // n || data.yk || - 100, 97, 116, 97, 46, 97, 111, 32, 124, 124, 32, 100, 97, 116, 97, 46, // data.ao || data. - 112, 97, 114, 97, 109, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // param) {. - 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, 100, 101, 114, 84, // renderT - 97, 98, 108, 101, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // able();. - 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, // }. }. - 32, 32, 32, 32, 125, 59, 10, 125, 41, 40, 41, 59, 10, 0 // };.})();. + 116, 97, 46, 121, 107, 59, 10, 9, 9, 9, 105, 102, 32, 40, 100, 97, // ta.yk;....if (da + 116, 97, 46, 97, 111, 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 97, // ta.ao) allData.a + 111, 32, 61, 32, 100, 97, 116, 97, 46, 97, 111, 59, 10, 9, 9, 9, // o = data.ao;.... + 105, 102, 32, 40, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 41, 32, // if (data.param) + 97, 108, 108, 68, 97, 116, 97, 46, 112, 97, 114, 97, 109, 32, 61, 32, // allData.param = + 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 59, 10, 9, 9, 9, 105, // data.param;....i + 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, 116, 32, 124, 124, 32, 100, // f (data.out || d + 97, 116, 97, 46, 105, 110, 32, 124, 124, 32, 100, 97, 116, 97, 46, 121, // ata.in || data.y + 107, 32, 124, 124, 32, 100, 97, 116, 97, 46, 97, 111, 32, 124, 124, 32, // k || data.ao || + 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 41, 32, 123, 10, 9, 9, // data.param) {... + 9, 9, 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, // ..renderHeaders( + 41, 59, 10, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, 98, // );.....renderTab + 108, 101, 40, 41, 59, 10, 9, 9, 9, 9, 117, 112, 100, 97, 116, 101, // le();.....update + 83, 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, // SelectionBar();. + 9, 9, 9, 125, 10, 9, 9, 125, 10, 9, 125, 59, 10, 125, 41, 40, // ...}...}..};.})( + 41, 59, 10, 10, 0 // );.. }; static const unsigned char v8[] = { 47, 42, 42, 10, 32, 42, 32, 119, 115, 45, 99, 108, 105, 101, 110, 116, // /**. * ws-client @@ -4860,11 +5072,11 @@ static const unsigned char v8[] = { }; const struct mg_mem_file mg_packed_files[] = { - {"/css/style.css", v3, sizeof(v3) - 1, 1782283693}, - {"/index.html", v4, sizeof(v4) - 1, 1781250466}, - {"/js/app.js", v5, sizeof(v5) - 1, 1782283151}, - {"/js/monitor.js", v6, sizeof(v6) - 1, 1781250466}, - {"/js/pages.js", v7, sizeof(v7) - 1, 1782284424}, - {"/js/ws-client.js", v8, sizeof(v8) - 1, 1781746272}, + {"/css/style.css", v3, sizeof(v3) - 1, 1782465409}, + {"/index.html", v4, sizeof(v4) - 1, 1782440107}, + {"/js/app.js", v5, sizeof(v5) - 1, 1782440107}, + {"/js/monitor.js", v6, sizeof(v6) - 1, 1782440107}, + {"/js/pages.js", v7, sizeof(v7) - 1, 1782466738}, + {"/js/ws-client.js", v8, sizeof(v8) - 1, 1782440107}, {NULL, NULL, 0, 0} }; diff --git a/test/web_root/css/style.css b/test/web_root/css/style.css index cdab23d..7ae96e7 100644 --- a/test/web_root/css/style.css +++ b/test/web_root/css/style.css @@ -694,3 +694,47 @@ body.login-page #main-content { margin-left: 0; display: flex; align-items: cent color: var(--text-muted); margin-left: auto; } + +/* === 数据中心 选择添加栏 === */ +.dc-sel-bar { + background: #e8f5e9; + border: 1px solid #a5d6a7; + border-radius: var(--radius); + padding: 10px 20px; + margin-bottom: 16px; + display: flex; + align-items: center; + gap: 4px; + flex-wrap: wrap; + animation: dcSlideDown 0.2s ease-out; +} +@keyframes dcSlideDown { + from { opacity: 0; transform: translateY(-6px); } + to { opacity: 1; transform: translateY(0); } +} +.dc-sel-label { + font-size: 14px; + font-weight: 600; + color: #2e7d32; +} +.dc-sel-bar label { + font-size: 13px; + color: var(--text-secondary); +} +.dc-sel-bar select { + padding: 4px 8px; + border: 1px solid var(--border); + border-radius: 4px; + font-size: 13px; + background: #fff; +} +.dc-sel-bar .btn { + padding: 6px 16px; + font-size: 13px; +} +#dc-cb-all, .dc-cb-row { + width: 16px; + height: 16px; + cursor: pointer; + accent-color: var(--primary); +} diff --git a/test/web_root/js/pages.js b/test/web_root/js/pages.js index f1dc168..8efcf19 100644 --- a/test/web_root/js/pages.js +++ b/test/web_root/js/pages.js @@ -981,134 +981,248 @@ var TerminalPage = (function() { * 数据中心页面 * ======================================================================== */ var DatacenterPage = (function() { - var allData = {}; - var activeTab = 'out'; - var searchText = ''; + var allData = {}; + var activeTab = 'out'; + var searchText = ''; + var selectedSet = {}; // {saddr: true} - var COLUMNS = ['id', 'saddr', 'desc', '数据类型', 'ctrl_type', 'link_saddrs']; + var COLUMNS = ['', 'id', 'saddr', 'desc', '数据类型', 'ctrl_type', 'link_saddrs']; - function renderTable() { - var data = allData[activeTab] || []; - var tbody = document.getElementById('dc-tbody'); - if (!tbody) return; + function getVisibleData() { + var data = allData[activeTab] || []; + if (!searchText) return data; + var st = searchText.toLowerCase(); + return data.filter(function(item) { + return (item.saddr && item.saddr.toLowerCase().indexOf(st) !== -1) + || (item.desc && item.desc.toLowerCase().indexOf(st) !== -1); + }); + } - if (data.length === 0) { - tbody.innerHTML = '暂无数据'; - document.getElementById('dc-count').textContent = '0'; - return; - } + function onSelectAll() { + var visible = getVisibleData(); + var cb = document.getElementById('dc-cb-all'); + if (cb && cb.checked && visible.length > 0) { + for (var i = 0; i < visible.length; i++) { + selectedSet[visible[i].saddr] = true; + } + } else { + for (var i = 0; i < visible.length; i++) { + delete selectedSet[visible[i].saddr]; + } + } + renderTable(); + updateSelectionBar(); + } - var rows = data; - if (searchText) { - var st = searchText.toLowerCase(); - rows = data.filter(function(item) { - return (item.saddr && item.saddr.toLowerCase().indexOf(st) !== -1) - || (item.desc && item.desc.toLowerCase().indexOf(st) !== -1); - }); - } - document.getElementById('dc-count').textContent = rows.length + ' / ' + data.length; + function onToggleRow(saddr) { + if (selectedSet[saddr]) { + delete selectedSet[saddr]; + } else { + selectedSet[saddr] = true; + } + renderTable(); + updateSelectionBar(); + } - if (rows.length === 0) { - tbody.innerHTML = '无匹配结果'; - return; - } + function getSelectedCount() { + var count = 0; + for (var k in selectedSet) { + if (selectedSet.hasOwnProperty(k)) count++; + } + return count; + } - var html = ''; - for (var i = 0; i < rows.length; i++) { - var item = rows[i]; - html += '' - + '' + fmtVal(item.id) + '' - + '' + fmtVal(item.saddr) + '' - + '' + fmtVal(item.desc) + '' - + '' + fmtVal(item.type) + '' - + '' + fmtVal(CTRL_TYPE_MAP[item.ctrl_type] || item.ctrl_type) + '' - + '' + fmtVal(item.link_saddrs) + '' - + ''; - } - tbody.innerHTML = html; - } + function getSelectedItems() { + var result = []; + var fullData = allData[activeTab] || []; + for (var i = 0; i < fullData.length; i++) { + if (selectedSet[fullData[i].saddr]) { + result.push(fullData[i]); + } + } + return result; + } - function renderHeaders() { - var thead = document.getElementById('dc-thead'); - if (!thead) return; - var html = ''; - for (var i = 0; i < COLUMNS.length; i++) { - html += '' + COLUMNS[i] + ''; - } - thead.innerHTML = html; - } + function updateSelectionBar() { + var bar = document.getElementById('dc-sel-bar'); + if (!bar) return; + var count = getSelectedCount(); + if (count === 0) { + bar.style.display = 'none'; + } else { + bar.style.display = 'flex'; + bar.querySelector('.dc-sel-label').textContent = '已选 ' + count + ' 个信号'; + } + } - function renderTabs() { - var types = ['out', 'in', 'yk', 'ao', 'param']; - var labels = { out: '注册 (out)', in: '链接注册 (in)', yk: '遥控 (yk)', ao: '参数 (ao)', param: '定值 (param)' }; - var el = document.getElementById('dc-tab-bar'); - if (!el) return; - var html = ''; - for (var i = 0; i < types.length; i++) { - var t = types[i]; - var cls = t === activeTab ? 'dc-tab active' : 'dc-tab'; - html += '' + labels[t] + ''; - } - el.innerHTML = html; - var tabs = el.querySelectorAll('.dc-tab'); - for (var k = 0; k < tabs.length; k++) { - tabs[k].onclick = function() { - activeTab = this.getAttribute('data-tab'); - searchText = ''; - document.getElementById('dc-search').value = ''; - renderTabs(); - renderHeaders(); - renderTable(); - }; - } - } + function doAddSelected() { + var items = getSelectedItems(); + if (items.length === 0) { + alert('请先勾选要添加的信号'); + return; + } - return { - render: function(container) { - allData = {}; - activeTab = 'out'; - searchText = ''; - container.innerHTML = '' - + '' - + '
' - + '
' - + '' - + '0' - + '
' - + '
' - + '
' - + '
'; + var typeLabels = { out:'注册', in:'链接注册', yk:'遥控', ao:'参数', param:'定值' }; + var label = typeLabels[activeTab] || activeTab; - renderTabs(); - renderHeaders(); - renderTable(); + if (!confirm('确定将 ' + items.length + ' 个信号添加到 ' + label + '?')) return; - var searchInput = document.getElementById('dc-search'); - if (searchInput) { - searchInput.oninput = function() { - searchText = this.value; - renderTable(); - }; - } - }, + var succ = 0; + for (var i = 0; i < items.length; i++) { + var ok = WsClient.send({ + saddr: items[i].saddr, + signal_type: activeTab, + curd: 'add', + setting_zone: '0', + signal_data: '' + }); + if (ok) succ++; + } + alert('已发送 ' + succ + '/' + items.length + ' 个 add 请求到 ' + label); + } - onEnter: function() { - }, + function renderHeaders() { + var thead = document.getElementById('dc-thead'); + if (!thead) return; + var visible = getVisibleData(); + var allChecked = visible.length > 0; + for (var i = 0; i < visible.length && allChecked; i++) { + if (!selectedSet[visible[i].saddr]) allChecked = false; + } + var html = ''; + for (var j = 1; j < COLUMNS.length; j++) { + html += '' + COLUMNS[j] + ''; + } + thead.innerHTML = html; - onLeave: function() { - allData = {}; - }, + var cbAll = document.getElementById('dc-cb-all'); + if (cbAll) cbAll.onchange = onSelectAll; + } - onData: function(data) { - if (!data || typeof data !== 'object') return; - if (data.out) allData.out = data.out; - if (data.in) allData.in = data.in; - if (data.yk) allData.yk = data.yk; - if (data.ao) allData.ao = data.ao; - if (data.param) allData.param = data.param; - if (data.out || data.in || data.yk || data.ao || data.param) { - renderTable(); - } - } - }; + function renderTable() { + var data = getVisibleData(); + var tbody = document.getElementById('dc-tbody'); + if (!tbody) return; + + var fullData = allData[activeTab] || []; + document.getElementById('dc-count').textContent = data.length + ' / ' + fullData.length; + + if (data.length === 0) { + tbody.innerHTML = '暂无数据'; + return; + } + + var html = ''; + for (var i = 0; i < data.length; i++) { + var item = data[i]; + var checked = !!selectedSet[item.saddr]; + html += '' + + '' + + '' + fmtVal(item.id) + '' + + '' + fmtVal(item.saddr) + '' + + '' + fmtVal(item.desc) + '' + + '' + fmtVal(item.type) + '' + + '' + fmtVal(CTRL_TYPE_MAP[item.ctrl_type] || item.ctrl_type) + '' + + '' + fmtVal(item.link_saddrs) + '' + + ''; + } + tbody.innerHTML = html; + + // 绑定行复选框事件 + var cbs = tbody.querySelectorAll('.dc-cb-row'); + for (var k = 0; k < cbs.length; k++) { + cbs[k].onclick = function(e) { + e.stopPropagation(); + onToggleRow(this.getAttribute('data-saddr')); + }; + } + } + + function renderTabs() { + var types = ['out', 'in', 'yk', 'ao', 'param']; + var labels = { out: '注册 (out)', in: '链接注册 (in)', yk: '遥控 (yk)', ao: '参数 (ao)', param: '定值 (param)' }; + var el = document.getElementById('dc-tab-bar'); + if (!el) return; + var html = ''; + for (var i = 0; i < types.length; i++) { + var t = types[i]; + var cls = t === activeTab ? 'dc-tab active' : 'dc-tab'; + html += '' + labels[t] + ''; + } + el.innerHTML = html; + var tabs = el.querySelectorAll('.dc-tab'); + for (var k = 0; k < tabs.length; k++) { + tabs[k].onclick = function() { + activeTab = this.getAttribute('data-tab'); + searchText = ''; + selectedSet = {}; + document.getElementById('dc-search').value = ''; + renderTabs(); + renderHeaders(); + renderTable(); + updateSelectionBar(); + }; + } + } + + return { + render: function(container) { + allData = {}; + activeTab = 'out'; + searchText = ''; + selectedSet = {}; + container.innerHTML = '' + + '' + + '
' + + '
' + + '' + + '0' + + '
' + + '' + + '
' + + '
' + + '
'; + + renderTabs(); + renderHeaders(); + renderTable(); + + var searchInput = document.getElementById('dc-search'); + if (searchInput) { + searchInput.oninput = function() { + searchText = this.value; + renderHeaders(); + renderTable(); + }; + } + + var addBtn = document.getElementById('dc-btn-add'); + if (addBtn) addBtn.onclick = doAddSelected; + }, + + onEnter: function() {}, + + onLeave: function() { + allData = {}; + selectedSet = {}; + }, + + onData: function(data) { + if (!data || typeof data !== 'object') return; + if (data.out) allData.out = data.out; + if (data.in) allData.in = data.in; + if (data.yk) allData.yk = data.yk; + if (data.ao) allData.ao = data.ao; + if (data.param) allData.param = data.param; + if (data.out || data.in || data.yk || data.ao || data.param) { + renderHeaders(); + renderTable(); + updateSelectionBar(); + } + } + }; })(); +