From 35238b4645ae5e9e0e99555d4fb64080d945565c Mon Sep 17 00:00:00 2001 From: Alfred Date: Thu, 24 Sep 2026 21:02:01 +0800 Subject: [PATCH 1/9] fix: prepare v0.5.2 reliability and bilingual result corrections --- .github/workflows/build.yml | 43 +- .gitignore | 3 + build/TianShanOS.bin | Bin 2154096 -> 2161568 bytes build/www.bin | Bin 3145728 -> 3145728 bytes .../libssh2/src/mbedtls.c | 2 +- .../libssh2/src/userauth.c | 2 +- components/ts_api/CMakeLists.txt | 2 +- components/ts_api/src/ts_api_automation.c | 1067 ++---- components/ts_api/src/ts_api_cert.c | 110 +- components/ts_api/src/ts_api_ssh.c | 196 +- components/ts_automation/CMakeLists.txt | 2 + .../ts_automation/include/ts_action_manager.h | 10 + .../include/ts_automation_types.h | 12 +- .../ts_automation/include/ts_rule_codec.h | 14 + .../ts_automation/include/ts_rule_engine.h | 13 +- .../ts_automation/src/ts_action_manager.c | 585 ++-- components/ts_automation/src/ts_automation.c | 120 +- components/ts_automation/src/ts_rule_codec.c | 502 +++ components/ts_automation/src/ts_rule_engine.c | 1959 ++++------- components/ts_automation/src/ts_rule_store.c | 400 +++ components/ts_automation/src/ts_rule_store.h | 11 + components/ts_cert/CMakeLists.txt | 1 + components/ts_cert/include/ts_cert.h | 49 +- components/ts_cert/include/ts_cert_time.h | 17 + components/ts_cert/src/ts_cert.c | 913 +++-- components/ts_cert/src/ts_cert_time.c | 42 + components/ts_console/commands/ts_cmd_auto.c | 1 + components/ts_console/commands/ts_cmd_pki.c | 17 +- components/ts_console/commands/ts_cmd_ssh.c | 15 +- .../ts_core/ts_event/include/ts_event.h | 3 + components/ts_core/ts_log/include/ts_log.h | 2 + components/ts_core/ts_log/src/ts_log.c | 443 ++- .../ts_core/ts_log/src/ts_log_preview.h | 59 + .../ts_core/ts_service/src/ts_service.c | 7 +- components/ts_https/include/ts_https.h | 13 + components/ts_https/src/ts_https.c | 164 +- components/ts_https/src/ts_https_auth.c | 25 +- components/ts_net/src/ts_time_sync.c | 13 +- components/ts_pki_client/src/ts_pki_client.c | 83 +- components/ts_security/CMakeLists.txt | 2 + components/ts_security/Kconfig | 8 + .../ts_security/include/ts_ssh_client.h | 10 +- .../ts_security/include/ts_ssh_log_watch.h | 9 +- components/ts_security/include/ts_ssh_probe.h | 17 + .../ts_security/include/ts_ssh_service.h | 57 + components/ts_security/src/ts_security.c | 6 + components/ts_security/src/ts_ssh_client.c | 960 ++--- .../ts_security/src/ts_ssh_commands_config.c | 81 +- .../ts_security/src/ts_ssh_hosts_config.c | 65 +- components/ts_security/src/ts_ssh_log_watch.c | 739 ++-- components/ts_security/src/ts_ssh_probe.c | 63 + components/ts_security/src/ts_ssh_service.c | 646 ++++ components/ts_webui/CMakeLists.txt | 2 +- components/ts_webui/src/ts_webui_ws.c | 2 +- components/ts_webui/web/index.html | 169 +- components/ts_webui/web/js/api.js | 113 +- components/ts_webui/web/js/app.js | 3100 +++++++++-------- components/ts_webui/web/js/lang/en-US.js | 366 +- components/ts_webui/web/js/lang/zh-CN.js | 336 +- components/ts_webui/web/js/router.js | 79 +- components/ts_webui/web/js/terminal.js | 87 +- docs/CERTIFICATE_FIX_REPORT.md | 254 ++ docs/OS_RUNTIME_AUDIT_2026-09-23.md | 145 + docs/PROMPT_REPAIR_REPORT.md | 34 + docs/releases/v0.5.2-validation.md | 28 + docs/releases/v0.5.2.md | 57 + docs/runtime-repair/IMPLEMENTATION_REPORT.md | 64 + docs/runtime-repair/REVIEW_FIXES_REPORT.md | 57 + docs/runtime-repair/VERIFICATION.md | 83 + docs/runtime-repair/baseline-notes.md | 17 + docs/runtime-repair/evidence/artifacts.json | 26 + .../runtime-repair/evidence/build-summary.txt | 8 + .../evidence/certificate-tests.log | 9 + docs/runtime-repair/evidence/host-tests.log | 9 + .../evidence/resource-sizeof.txt | 16 + .../reviewer-fixes/build-source-check.txt | 1 + .../evidence/reviewer-fixes/certificate.log | 9 + .../evidence/reviewer-fixes/configuration.log | 1 + .../reviewer-fixes/resource-sizeof.txt | 7 + .../evidence/reviewer-fixes/runtime.log | 13 + .../evidence/reviewer-fixes/ui-final.log | 1 + .../evidence/web-artifact-check.txt | 3 + main/ts_https_retry.h | 27 + main/ts_services.c | 285 +- sdkconfig | 1 + tests/certificate/README.md | 68 + tests/certificate/extract_lifecycle.py | 27 + tests/certificate/generate_fixtures.py | 30 + tests/certificate/run_host.sh | 26 + tests/certificate/stubs/esp_err.h | 1 + tests/certificate/stubs/esp_heap_caps.h | 1 + tests/certificate/stubs/esp_http_server.h | 18 + tests/certificate/stubs/esp_https_server.h | 10 + tests/certificate/stubs/esp_log.h | 1 + tests/certificate/stubs/esp_netif.h | 1 + tests/certificate/stubs/esp_tls.h | 1 + tests/certificate/stubs/freertos/FreeRTOS.h | 1 + tests/certificate/stubs/freertos/semphr.h | 1 + tests/certificate/stubs/lwip/inet.h | 1 + tests/certificate/stubs/nvs.h | 1 + tests/certificate/stubs/nvs_flash.h | 1 + tests/certificate/stubs/platform.h | 64 + tests/certificate/stubs/ts_core.h | 1 + tests/certificate/stubs/ts_crypto.h | 1 + tests/certificate/stubs/ts_event.h | 1 + tests/certificate/stubs/ts_time_sync.h | 1 + tests/certificate/test_api.c | 42 + tests/certificate/test_coordinator.c | 75 + tests/certificate/test_lifecycle.c | 46 + tests/certificate/test_material.c | 131 + tests/certificate/test_service_stop.c | 44 + tests/certificate/test_service_stop.sh | 34 + tests/certificate/test_time_cancel.c | 39 + tests/certificate/test_time_retry.c | 47 + tests/certificate/test_ui.cjs | 42 + tests/prompts/README.md | 21 + tests/prompts/browser.test.cjs | 132 + tests/prompts/harness.cjs | 51 + tests/prompts/ownership.browser.test.cjs | 273 ++ tests/prompts/package-lock.json | 59 + tests/prompts/package.json | 15 + tests/prompts/regression.test.cjs | 165 + tests/prompts/static.test.cjs | 28 + tests/release/test_release.py | 57 + tests/runtime/README.md | 7 + tests/runtime/extract_engine.py | 9 + tests/runtime/run_all.sh | 16 + tests/runtime/run_codec.sh | 9 + tests/runtime/run_engine.sh | 10 + tests/runtime/run_log.sh | 20 + tests/runtime/run_service_watch.sh | 11 + tests/runtime/run_ssh.sh | 8 + tests/runtime/run_store.sh | 9 + tests/runtime/ssh_stubs/esp_timer.h | 3 + tests/runtime/ssh_stubs/freertos/FreeRTOS.h | 1 + tests/runtime/ssh_stubs/freertos/task.h | 1 + tests/runtime/ssh_stubs/ts_core.h | 5 + tests/runtime/state_stubs/esp_err.h | 3 + tests/runtime/state_stubs/freertos/FreeRTOS.h | 8 + tests/runtime/state_stubs/freertos/semphr.h | 3 + tests/runtime/state_stubs/freertos/task.h | 7 + tests/runtime/stubs/esp_heap_caps.h | 6 + tests/runtime/stubs/nvs.h | 6 + tests/runtime/test_codec.c | 33 + tests/runtime/test_completion.py | 55 + tests/runtime/test_configuration_protocol.py | 53 + tests/runtime/test_engine.c | 77 + tests/runtime/test_log.c | 115 + tests/runtime/test_probe.py | 21 + tests/runtime/test_rule_reload.py | 36 + tests/runtime/test_service_protocol.c | 147 + tests/runtime/test_service_watch.c | 64 + tests/runtime/test_ssh.c | 89 + tests/runtime/test_stop_protocol.py | 78 + tests/runtime/test_store.c | 81 + tests/runtime/test_ui.cjs | 31 + tools/check_release.py | 22 + version.txt | 2 +- 158 files changed, 11447 insertions(+), 6149 deletions(-) create mode 100644 components/ts_automation/include/ts_rule_codec.h create mode 100644 components/ts_automation/src/ts_rule_codec.c create mode 100644 components/ts_automation/src/ts_rule_store.c create mode 100644 components/ts_automation/src/ts_rule_store.h create mode 100644 components/ts_cert/include/ts_cert_time.h create mode 100644 components/ts_cert/src/ts_cert_time.c create mode 100644 components/ts_core/ts_log/src/ts_log_preview.h create mode 100644 components/ts_security/include/ts_ssh_probe.h create mode 100644 components/ts_security/include/ts_ssh_service.h create mode 100644 components/ts_security/src/ts_ssh_probe.c create mode 100644 components/ts_security/src/ts_ssh_service.c create mode 100644 docs/CERTIFICATE_FIX_REPORT.md create mode 100644 docs/OS_RUNTIME_AUDIT_2026-09-23.md create mode 100644 docs/PROMPT_REPAIR_REPORT.md create mode 100644 docs/releases/v0.5.2-validation.md create mode 100644 docs/releases/v0.5.2.md create mode 100644 docs/runtime-repair/IMPLEMENTATION_REPORT.md create mode 100644 docs/runtime-repair/REVIEW_FIXES_REPORT.md create mode 100644 docs/runtime-repair/VERIFICATION.md create mode 100644 docs/runtime-repair/baseline-notes.md create mode 100644 docs/runtime-repair/evidence/artifacts.json create mode 100644 docs/runtime-repair/evidence/build-summary.txt create mode 100644 docs/runtime-repair/evidence/certificate-tests.log create mode 100644 docs/runtime-repair/evidence/host-tests.log create mode 100644 docs/runtime-repair/evidence/resource-sizeof.txt create mode 100644 docs/runtime-repair/evidence/reviewer-fixes/build-source-check.txt create mode 100644 docs/runtime-repair/evidence/reviewer-fixes/certificate.log create mode 100644 docs/runtime-repair/evidence/reviewer-fixes/configuration.log create mode 100644 docs/runtime-repair/evidence/reviewer-fixes/resource-sizeof.txt create mode 100644 docs/runtime-repair/evidence/reviewer-fixes/runtime.log create mode 100644 docs/runtime-repair/evidence/reviewer-fixes/ui-final.log create mode 100644 docs/runtime-repair/evidence/web-artifact-check.txt create mode 100644 main/ts_https_retry.h create mode 100644 tests/certificate/README.md create mode 100644 tests/certificate/extract_lifecycle.py create mode 100644 tests/certificate/generate_fixtures.py create mode 100755 tests/certificate/run_host.sh create mode 100644 tests/certificate/stubs/esp_err.h create mode 100644 tests/certificate/stubs/esp_heap_caps.h create mode 100644 tests/certificate/stubs/esp_http_server.h create mode 100644 tests/certificate/stubs/esp_https_server.h create mode 100644 tests/certificate/stubs/esp_log.h create mode 100644 tests/certificate/stubs/esp_netif.h create mode 100644 tests/certificate/stubs/esp_tls.h create mode 100644 tests/certificate/stubs/freertos/FreeRTOS.h create mode 100644 tests/certificate/stubs/freertos/semphr.h create mode 100644 tests/certificate/stubs/lwip/inet.h create mode 100644 tests/certificate/stubs/nvs.h create mode 100644 tests/certificate/stubs/nvs_flash.h create mode 100644 tests/certificate/stubs/platform.h create mode 100644 tests/certificate/stubs/ts_core.h create mode 100644 tests/certificate/stubs/ts_crypto.h create mode 100644 tests/certificate/stubs/ts_event.h create mode 100644 tests/certificate/stubs/ts_time_sync.h create mode 100644 tests/certificate/test_api.c create mode 100644 tests/certificate/test_coordinator.c create mode 100644 tests/certificate/test_lifecycle.c create mode 100644 tests/certificate/test_material.c create mode 100644 tests/certificate/test_service_stop.c create mode 100755 tests/certificate/test_service_stop.sh create mode 100644 tests/certificate/test_time_cancel.c create mode 100644 tests/certificate/test_time_retry.c create mode 100644 tests/certificate/test_ui.cjs create mode 100644 tests/prompts/README.md create mode 100644 tests/prompts/browser.test.cjs create mode 100644 tests/prompts/harness.cjs create mode 100644 tests/prompts/ownership.browser.test.cjs create mode 100644 tests/prompts/package-lock.json create mode 100644 tests/prompts/package.json create mode 100644 tests/prompts/regression.test.cjs create mode 100644 tests/prompts/static.test.cjs create mode 100644 tests/release/test_release.py create mode 100644 tests/runtime/README.md create mode 100644 tests/runtime/extract_engine.py create mode 100755 tests/runtime/run_all.sh create mode 100755 tests/runtime/run_codec.sh create mode 100755 tests/runtime/run_engine.sh create mode 100755 tests/runtime/run_log.sh create mode 100755 tests/runtime/run_service_watch.sh create mode 100755 tests/runtime/run_ssh.sh create mode 100755 tests/runtime/run_store.sh create mode 100644 tests/runtime/ssh_stubs/esp_timer.h create mode 100644 tests/runtime/ssh_stubs/freertos/FreeRTOS.h create mode 100644 tests/runtime/ssh_stubs/freertos/task.h create mode 100644 tests/runtime/ssh_stubs/ts_core.h create mode 100644 tests/runtime/state_stubs/esp_err.h create mode 100644 tests/runtime/state_stubs/freertos/FreeRTOS.h create mode 100644 tests/runtime/state_stubs/freertos/semphr.h create mode 100644 tests/runtime/state_stubs/freertos/task.h create mode 100644 tests/runtime/stubs/esp_heap_caps.h create mode 100644 tests/runtime/stubs/nvs.h create mode 100644 tests/runtime/test_codec.c create mode 100644 tests/runtime/test_completion.py create mode 100644 tests/runtime/test_configuration_protocol.py create mode 100644 tests/runtime/test_engine.c create mode 100644 tests/runtime/test_log.c create mode 100644 tests/runtime/test_probe.py create mode 100644 tests/runtime/test_rule_reload.py create mode 100644 tests/runtime/test_service_protocol.c create mode 100644 tests/runtime/test_service_watch.c create mode 100644 tests/runtime/test_ssh.c create mode 100644 tests/runtime/test_stop_protocol.py create mode 100644 tests/runtime/test_store.c create mode 100644 tests/runtime/test_ui.cjs create mode 100644 tools/check_release.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0ef85c5..c987e15 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,11 +18,36 @@ on: types: [published] # 手动发布 Release 时也自动构建并上传 bin workflow_dispatch: # 允许手动触发 +permissions: + contents: read + +concurrency: + group: firmware-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + env: IDF_VERSION: v5.5.2 TARGET: esp32s3 jobs: + web-tests: + name: WebUI regression tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + cache: npm + cache-dependency-path: tests/prompts/package-lock.json + - run: npm ci --prefix tests/prompts + - run: npm test --prefix tests/prompts + - run: python3 tests/release/test_release.py + - name: Install Chrome for actual-page regressions + working-directory: tests/prompts + run: npx playwright install --with-deps chrome + - run: npm run test:browser --prefix tests/prompts + build: name: Build ESP32-S3 Firmware runs-on: ubuntu-latest @@ -129,13 +154,16 @@ jobs: # 编译成功后自动创建或更新 Release:tag 推送、main 推送或手动发布 Release release: name: Create or Update Release - needs: build - if: github.event_name == 'release' || startsWith(github.ref, 'refs/tags/v') || (github.ref == 'refs/heads/main' && github.event_name == 'push') + needs: [build, web-tests] + if: github.repository == 'RMinte-AI/TianshanOS' && (github.event_name == 'release' || startsWith(github.ref, 'refs/tags/v') || (github.ref == 'refs/heads/main' && github.event_name == 'push')) runs-on: ubuntu-latest permissions: contents: write # 创建 Release 需要写权限 steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} - name: Download artifacts uses: actions/download-artifact@v4 with: @@ -156,6 +184,13 @@ jobs: echo "tag=$TAG" >> "$GITHUB_OUTPUT" echo "Release tag: $TAG" + - name: Validate Chinese release notes and build version + env: + RELEASE_TAG: ${{ steps.release_tag.outputs.tag }} + BUILD_VERSION: ${{ needs.build.outputs.version }} + run: | + python3 tools/check_release.py "$RELEASE_TAG" "$BUILD_VERSION" + - name: Check if release already exists (main branch) if: github.ref == 'refs/heads/main' id: check @@ -181,6 +216,8 @@ jobs: firmware/**/*.bin firmware/**/flasher_args.json fail_on_unmatched_files: true - generate_release_notes: true + target_commitish: ${{ github.sha }} + body_path: docs/releases/${{ steps.release_tag.outputs.tag }}.md + generate_release_notes: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 4cf8c8a..37986b2 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ password*.txt # Documentation frontend_modification.md frontend_emoji_list.md + +# Local regression dependencies +tests/prompts/node_modules/ diff --git a/build/TianShanOS.bin b/build/TianShanOS.bin index 552f5daa55efa7f58644d111e34c6f6e92378e37..86c142e1d7286b9c02813bc09f94529e7f046b05 100644 GIT binary patch delta 899797 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

I@QTDD~ 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�@pLH&6l3i2}BW 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

  • 9i(`bKNH1Ba-cF#PyzofPXyLR4Wjkr1 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%0D#APjngN@g71UQLhl`A+frRmp3 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%0A!=|6}dNLgniOP~q*U;?D< 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%0AhniNB&M1|F&^-8D_ztSC$Pc~$AGxyzdcE8l6Z z@sq*IkD7D5NUv%3!6WMOI+pVm_;kge%kouU=o za8~ygZy5uRx+yrJMOhTOb805%5`A5B#prG*pFP^qdu01UqBHmp&b@GnZ$G!U~ zpUOQR^RhlDEVr-m+kKQzH$iQ{J|f*O}sKoe*F)g8?P*pQ@`P@1}Y1?|8W(l5$=ZrYF~1Ij%5xh{tmhR zGVdA1TKxglod=Wm%BbMyN#gYf|8Af%NDkY~Jq9V|^3PZK)$sYz zB*?$l@o9-lT)^2nXbBx#JSlU`Z2m-&aw8V|O>i7@q>k4lDl_G}iM-PgWkJ_u!u7>T zE$>iVt4eYWa;3O1?v?idr7aO@zu9|+8&_;SL){g7&rp4Z zzdBC&v_)>ie|AJny~3Z4Q*?6L6|PHCYMoC#&JIY}!24$CB6-V~abZ#Hm1oUAi@xH# z*uEp8ZefG**^UUeD@gL^J0ijsG;GC=h_kM8-X+=$;mc=FR-8INxCGGo8MYk}A6=rI z0JII5m$+N9GFATM5}%W- zSo+*}`0sXzNDAY>+acn}p7))lTvgvX4}q5CGOPr~wm$v()hqU*>#3C`i+(*D zcYbU9TS{{Wryb`E$=mpX=}OP7E9WQ`4s!V~w(Symzu2}*J393lE*AbaFlddO{|zGU@twSg=3l&;c58AK>ff zf%{utKTjDPu!k@sWs8t;Tfe=$^7fB6JGj?0o#i9uD_t}@c=~)LM)x(rIuHzVIpwAC z`+2-Q*udkl%{W-+}mYYf3GJ|KVBM&=DfPf0ntRd;qILN&MwKoa1 zYuwKA&_zlor^O9PJI3%WR-MA%UxcRa{RX~!kup@C)4<&pEB$01Umo7TC#5Ta^1aiv>m*K2XyCijm2O@Gp=~STFCP2d%~|d>UT0_{%7=3A2F@~+ zS3J8nB=vSPAl6}sb=B$9{4Z=%kvlhVf2M?ccWm%0f0E#V&bC@#hTLGIPV+HLQM}qU z)H-0?QS1v*s+s*&?*d#JWlZ|t1xc7agvW)jV>tc8b7sK zS=3|RNuaPEHNd$5Ba?3}sS>(Mp>7l_ISE~zKPLZ`L;vk6EhqW191JgTKESaYWurXh zBww7X%#{b9$e($F-~SAi`K=SY{~D!N>(moa6fK$ClQP-a^@(JO zIN}%JIA+2Lp0h@oE?bxJ#x=@(-HqeV;^U3s%C}{X&!W?XDS&dNmE8ISFXzf=2kUz- zT)$EY;;r*Ao;!1#Z_Y#Z?mf=$VJ(x5NCh z85O~Lk_TCob+Yv!-(^uU^e_B~7-t_c5BU)wYlbszmzE4go(qj)C*GhR`J^JmE9ggF zRD_1j`$ztLkrFka^eC~dFqR*t-8t5iHw_`JU9L4Zc!_21A%1K#0djMl4V%|zWO-s& zjR1J?KWUQ=BmH+BZ&6C4(tjQTC%F0CEHe7gRtqxgEkq^eJj@^Y)P#Ag7dGQ4 zAFx6B)-m>IR7+lARl4%tC1@ps1W>cR%MmA_u*v?%{yNlxSYCq7q3>SB~>V6-v9UKU64* zT3%A2gmUlg%4k0^>yJo=Y|ap$XtHySC&FWR@(!hS!ifZM+AabbAZ6bUIicAbi~|Yq zXNVt;e;b2WNXWCZ!?L?ZUIEXd+xEG#Y|uvY{o9pqbpIgY$w4?&4gF zlrfNKh|kk{@y_%7eET9KD1x*0cBL5P7L92J*>e~E9Cyt($XfbyqQ7Rlj0Ui|>UWLb zwZtGh@5(dC%^UOhnm*bt{GHI&K3kXXP_nfzeI$o>>vnaZHr!hYZxd4BjU;Iyg}>M_ z{Ee>R1NBH24=FN!NFt`nBF7FHj}`EdDMQi{oFyr8?vVKjj#8vyh%r-^B6El2)xy&< zq*QlvYm4udVy7`UGT?Sx#vWmSEECA zWS)1vzp-s}p0m**t1WUP&*5+s`5_Ozvm9)ZvHb8}mOLD*66L0S zC1hV@NScQ2N+5v_*#Y{m6DVu;r{H4C6s~xx(LL+h98SQoCh;4BrhVyq{6^E?&f50F zJy6|JLk@?SWo(I%2D}+QXL`8NvDC#7N$W+~*-m_=r#iIdp+Pw8Vq5RQZ-$P}T~hF8 zPJ4dUQ`P&|6&x&>!9H&S^zik`Uk7(C5)H*VuC`ReeHy=vNx(|rjBcLCLNvi`f};}j zE%=0%YIMwwzF1HJGk;D~)BIsgO~x;qnk=|?@?)5JFen|##>nwLY0l$)=lfMWNDH4D z-cElfj2~#Jj&X7bpYz5zu6U`PJWqsa&(1|5ae1=5S5nS{u6&Z0TF~6u@IzOZC)(4| z(H?V-bmcDIYCqq)yFXCfh)a^pdpyTmjd1!rEGIvV@Ag*T z@MK|@Z>NlR8XJ~`k}+m+81L+(`gKYjbAgUzwtK;k(Ia zeX}sDMK`jZ)l6u~CRg+KeAM^-+Y>CWrL(ux)yq}u#=Qs484@-iF^oI-sv~5+fRFW6 zLo{CeJzq6qKuFk}QEx}$Xy%ZRURr0I4I0u02a>%F7j902Q!l+0kLWsPrwm$M5Q%fU zg91_pWwT*#APj1if8ZB<)iBxGk~{jT-J5kK|G9%!FZz?!wBs-MsWE}6wdZh-wIuEG zBm9PQ+E%;epn$m$62SBP)X3)1SV%VlSDqr32JD)}kNTM`t$NaGIFPP?kvdz2HVL|oS6tSOs za~0`wLX+!~#?H>>vs$TdcJ}AM6)VW+e9_bp>;M-; zW+NJ^EG8WDT*aMQt7*!cM9RKiy}1dcm!**lc`hw_j4AunD!#I{+A}>#V9Mb$j%?1L z!#$#l4s<^*g8!R!sU_B&MRmuK5z#wu_fW{De zcs>+fekAiDir+6H4DV+=!sSUWTZnYy6~1w3g%pE_G0R}EtB`!jd9)9@21EQ|XWBU{ z8AEXNR*0QJ`X7e+`K)0Jh32lQ*1KCm+S;6ANT6+Yq}lFfS()G~NAF%rHcCnoU?m44 zkYuDo@KX~n)iPTQYSX2agW2bTi&D{%<&)hWmLprUg?}G}>|a5?_Ar(TbUCm~$mUE% z!I5Q2Y+`{IPk4-+w$n$11{wu@x zO(7)lze1*M;W;{W(2SS@rP9JXJbS< zII&o=C!kA`P%kJAW47@AirTqn@wMn(~PbeD?>-)Mv7lI^D0&C(dEQul%~vAB|}JeTtiaZLmDry9LK&F zGIoeiz9V~rOcfmmN^It>g4GE5tIa$vSoKY>5}Rgzr@Did_7?36eg$n{*| zB68&oq?(7dGNv5sW|3sJiZV7t8vC6q%NP7>AwQ377%;&48CkWh4f4KjIG8je!!g6y zG9y2jeY81aNU#WYrC_tAQWn{t2b#H=yXe)PN%I7v91D!zCtEGn@xlI%u+tK?ocAeV z5`v|%W(}LMIb&R~QC?{@Omk#uf)lb!2eYYUx5Akjb=D_(dT$ zNCYuj*m2^MP;?l%p4Z?+ay?h|1x(O}sBP1G3Cvok7bAF)2F|PpSy8$gjjW5HKdO$v z5WlU>l}Y2Ce~WSlLS#}YMG9*Z@h8f1n!Iu<(+h4&Drcq&915dw1(8cTu?t;hN3}12 z+_u`6Ca2W8GH=03Y3M~ZXDY?cti@(t7ov8Gau@7q0IwNBmU$QrDa&wcffsAqL{gg_ zaj4$sZwcwkG@E(fHfoG~XA_^-MjhaPdK1rU@wdYTO<)a9O@FCru{%CL=bYKZkF`<5 zXIM{Mq*oBS7pQ(Lt07rcyEYk$re|qx9o{6mw8NWl@;=*1B#hQ-qa;g+n$;btB;4u|_ zqtwv!nU(f}LD$~p(O+(wZyw=|tJ(eM8t zlAa@MQp+sXQoGc$QWs~-Ay?L}lE2qh9UUG^vBYs!?yR{;3wNZ&5u`;2TcUTZL^*M* zKPK|26pDDhx#?gj!!AO6Ok{2=yDHIIp05Lo3~i zovq+u?J*P@SHXw0N9UDX!RNMD!@{kEdwESbTPs9;22o!@)IOW2Z!4$_d|JVGw^suv zRT3mTU!3!3vu8Z737!eyIRKta8_x>CGrodXc2Hx|hX}|ZKz;;djtw%K zv>8Ygx*nDiP-xSKCD9_FJnMpiO{g_6?}U~ zH6s1oMp9NIl?Eiucw&^F=Xo>Y!AjSYM7OC!jemVSdqO@{4I2%`nFy(~Ee4$^;tz>J zE&o_4=^dHf5x{={Tn=EkU8QiL(%*Jyx^tprY*U}ct_kq(02=`gw1a~L_=+8j#cxL0 z5UKTxl-YTKKeN%+YIqCWnP<3eQ~+x(ZEWuWty)k_7Q5HK!hRGyKOl@%2t%eYJkaDg z3Fd^`RD|&6MlIF8>GlAoivSdR0GS%R*FmUQ2#t5_-EvJbrNvmHizP$@r0{Mnk5AfI zGihVB=^yi?jcju{Ki*aKNgBTqO2pY(Y?|mxmI`H$V)jX>>EBaQ3tT;{?BoCXoOeAw zbYso1jn(Gu=7fzbuN(of%+SHxROTx*C>Gbd;UU5cGgrzZF;xLq4V7r~WC6kP*hGdP(jQCS(Jhg}MHtft^Bx3bGEQ_{g z$<#8nmDwjEysKsHDY(03BB}0_As!zSA%RI!N=?u{lLHz9NEleg|B6u~(-#Y_V`Z^1 z;JRqzx=38}1=pLz6{*b@p>`lIq*<03BV^~&@2!WhOc3LrnL@^%vRLXgj@V@UNHV4g z8Lyz6AFQda>0J7K-EJ9~Tw~h!jwM-p{QI(f>1`a?VM5KKw*D0%sIqK$Bn0iW3ED$~ z#t{KokvSNH%4uHE#)Iu4zg-Krb<-}ww@5^37kNyg!D*t9^Lg2DQmD)(XA{X8NQ4ef zc+E$=rgm*XEq?OX7%dHXpZhDhOu6PIlFA4KbY6rm`%jood`4mjyaK>2O-P1 zcVHa_mX#SwnzC9>q$Kx0;&1uncu5%Pnx{hIUrb)ZuhNONeI8 zD>7R|BDQ(8$HasuHVp+xfpJo~*|Z}#WBZbfvQOB1L@!;w%bmSLHp*;pJuHR2YFL@U zbQpn7vj;j=1bUljI7>(>JzcRQ?4!mG?k^!t>IFwXaL`EU6j_aE;pq3Os14s^SfgeSW%=Zd(#%Ww ztv+f%`W_+3tIS~j5Q2Kx_3bW#-%d2@YP}?5{CwAx5Q%*u;Lc@eJX}OUZd;}u$~Ft3 zGVZ>@r;zKcT!5aG8q72V3brYyC*`a}K|0saDUQame)uGI)xRBEN8ZMiH zowGOV6PIgIY=+RlrD~VZ;10xJv5CJ*;@=SB`Le#MXZj?e#OBgiSBl(SAb+wUe<5U& zU6IdpLxtT!Rc2eNYQvOW~D zyoA2ab<)_WI9VOjQPu@0Kd2ENg6TCd1%YXqo#|u2S2~4F z$cGAl35k6nu^S{#u}OTJGOUg$D2oYOG2@py@=;#R-mI25g@1Y}&*`s5#!N0+8*@;f!Rtl zdV9nt$qff0wzZ-p>yR%*Zx(zq_y&P5%FfqI@RgPD>2Ye1+@+K+k5i-N`Vzi3PED14 zOL@cqwf(EJ1n=IGhqfC1s07!4PbWWZAg;u7pai!^lG@~@TXO14R%9KRrfs%&uj4j< zOeL_#gwAux_d@~J4#lx)E>+njyluQ1)$jWfG(H{3 zGeMTJr`k46E~hg^nUs_(voIo6%`Y)nh9XsJN^BKreF;@0wS?!yV}|OpnS4{cs(-x` zVQIXg6-=*zX$+W3z=Xn7B6ysM6k>M4hm&V7uOY3O+cVB58z{KZ;CvCB`8Lj%OHgPY zZr~jUsy$NT2wFdb{UMOOOAJL4kjw0fO%#FrN;GP9J4>Y}vT+L$@r;j8l#Tm#xu)#H z_!wR4c>-yJFiP!_dh;nf&XNavrvyuA)y{*0h{tb+6SgSSpg#*>Lg>_hu0|Z(ra3;j zq-JtSb&+bGT*6)@M&yAuk}@I}f7=-9!z(4c*B~`6v6#qJ_cs_U)EEr5#YsnTT1OOW zlqX5^Eft*Q3uHZz^lsGG9;a9lr%yKUnn7y#*fPR|2lyXxp%?!UTzO0$Qv+NKA^tQI z>t8yceke;9l8!@CC?tj0!VIA>7Z8QgCPoUvfQxn7z+3Ht?tfHB>&kfsaa1LtKt+D0R(Vn92(h)F21;{RYkxFsk3Zf$vFBTetdp z11=rT3mRVa)do*)$T5`@|wZw`|>g?@0F-V$uDor56*m0+UoYcses z>}fIg9j5k?_Z0K7!!T#I+RE85bz-m^VP_H70g_ksj-Bg$!L`4bKN+UR%FBv*pW&Eo zEEkw@cFY8U*+72OE{~JWf6FWaG2Eu`7%LUmXY>(L5JmGex#?{Ka|de#dVpQtU?DHp zhSwwvz$iJ$qf}-?NXN2P=dTZBD+EIiJ438s$b81oQ9|bR7vRB&P`bdjwPU*q><7hM zKSEX0qpYkG0mB0n_O`&awy7K{U~iHaChlFMWD0sgeuFKPd8&T9Pvq$nF-91B7*yvnu?d_w@sXL-tqX; z;+jXr)s~g!hGKS>IPvi|th~wK=;>#aETIm})qy0j2gN*Lq`EWcBw>OuAd&W(GuU== z8T9VquANx(Vy+vdhQx0td?x1A%W@EQPlWmv`JCU+>Iq%7rg(bGD9sZGQBF4&BgR5w zTXPexVGhNdjZ(eSF9`JV;wQ2|nu}=!Bvi!wALb*%t~B}eZel{Ast=2UZwCupUNH*J zkHm|eo1)OzzWLBK+RKY;auM0z&C83~RD!VmB9OP91(Hqb>?OZ6uXxdjGt#{@1nHky z%)>@wnTDZ=CyZ8=z6%K!q{ZM$!;;C42?-76(S*qGfYY#6lQ$abx5d+$y+Ojz5mXd$ z^JvvC{l(%MoW)<{ZGN$sbtTMsr{k{`*Gz<;k9lM<>p*_C87|9y4bJ;AtzE)h^(>S8 ztGX21YVC_i84WX#-&oWwnmJ5rBXwz4j4Y35aTKO;tk#8IuNS)-Ba@6xEVOv}CobXr z9dXV=CKk21(yO$8_O!fKer_&)XPmV^APqN?KpLr{^34zd`q~4G5dlsu;_r=7`^(`) z{Od8QUiL2LXUC|cnm;J2aYFr3k|Iy2qXj@NSgE+L=?MzCi zl3XkqT&q3ej59?KSoq?xsB)LdduqTtb3?FOitHt=bco7%vZ7OW#$juC0b~K>P7n(u zK>f*1Z65q#mYwxwg0DGyhSk}tEAIoiJvF`8$n`NLdoG6H^@;Ipv)PpkjfVr%Hx zTJj5yFhzzOKEbjq8Ou%6BRe>2efv`soFL1@O@=53!vRfJFSeS%e&4ywO_5lj#gO7d zOJjXgOqyL+Ss~Hb8Z%NPZ~kz1K6Eco+yaSA-A#nMx#4%VkzWf z_|`wzXo_?_d<8acouDe|FO$EYqtgPpmlwNY&KirZGbMSTMf5?Vh-h@dyl!4hV19lK z!W>3kY!Lld^|sLE)AVLYMXMKzj3etu6uW*N!v0LZ0aBVgr#&StCSX|%(PqD&ZZbw= z0a|qZ85VBI$TXpsz$-|Er6$5sZ5d~du&_fW3Q#2??lg$hwxaF?$?swgu&_vy;`hLD zrN!DLYg<)BuxRqh=}akYTwvL}2TcL2SqoTaB6!S8xZi|+u}%o}GGA_wXt-IPIEw^s zCSuT>fMS@Fj8A@PUSq$vrJ&Z#|Hj7PF;C4kPtDbqJo6(nDLC!Ew zOhlbuWfpP!*o<<&)Wn}oRNHj;&J;Tg&aViEyB&XVX734>ndXTH!195O&* zsjb_8VX8L8uwsIBaBm#SrU-^t%?8tCaLllAyh$9doA@V_(A&N!5JQ1T1!95?@hTxk z5@m$*T)h9Tk+3YZjb?d%1RE^y{eYhe{0JL?su}Nxm_U3Nf;-p*cOk(cCcf-7H9WnQKs7hx zT~gqvr4O{>f(hqI^tomYEoGFXkV7<&AhQlJR4Kt35)4#k~?|Vw+bOG z;dBzH|5Z|E8uFdIAvkqsQ`c{K+t<|&gX-7AtLit?0x0@16u4y)8TWu@C$AE1uGy)! z6Gm&3GnZh<8TaWDZftq{mZ|0zvSyX}tcfjN&p&@1FSB(fUi-S*Zt^)(mcck6%GEf) z=$eycLhIm`AH(*NtPAc&@570=_M0*#3IA1Jmw@1xk6N=Q=1lGD_ zx=F@4*=d!o%s?L5DTrA5dOl{d+H>kwlA+&f!uOB?d5){IOskEnX|ikCmYizSiY#Mf z7851DL^j|ID74nUZZcu3=Mneaaw%i&DIqWo_X_)%Bv&mn8H!dT_8Sm;YBsGV>XD7> z`QMY(R_U2So#(ZvZoQ~QB%Xapf>5_VBnX=)gv~Nd&^)x&?Nt<;x#TO_E+*|W`Bbem z(cD5y^2Nw%w_K?S`x+xK@iBvzN2CfV6HNwFJyc?*<~E&X2%TPE&vTO1w#thFG!&pl zfM(nE9xpH>*7LK;YNzx#f$3>7nB9SyWXstX1f(~SXdpR6${TAi^AHl)|ZxDj=0^dNv=N?=$P%x^{ zIR#(EgVyuP6fBy2Ybf%Xs-U{@ee$hp6c z_jp5XJMy}~{kq;@?hcIBj`?Rj<=O8FY{yl7##;sA^Yy4zW@=Xs0z>8MfCzIPQAx*6sMiJu$BKu;UFU6U$GG77c>Qqt z?qHq)zMXcyoq}&Qbew|eBI|nICROd$>67(CQWne=pMY%(Ytn>(*P&Pem~-sRvjlU> zI=(Db?H=@!zzhYZ6qv;}<;RoqBiHetQq{Piz5>w=h`m5evmpi$B6=O~GF5GpK5;#! z&nK>5zCD7q6<|HU)P|3<2bm;-3?&-HbBtv4-j$d$a{X#!2L6|Ck77ZB&l`O7)orky zZ;0UYd&V~q>Ek!WIcL!NwV$#<;7$>DzK+Z=y~_ryU$HdjU~)#5%@6a}Rejg*_;O2r zO76iX`UJW9U3>(p&r4c>c25NMaGk+?41u+`2i8pl_PCJir>Wi@?-fGXs=t8w85q?T z>qr6lhe%k=DTRDzYlHtOfl-;>+64LhKQU z{S{(0HnHxMn8yqG57X2)TKrJxyj+sP4RQjmUb+7s@0+GZdR|?Zut3tDS?(n#;Nq3v z*YWq#)H(8Z>-e=a6=%1s%N#8QT?5q_7paV##QmqMsm<4~!`ps)85g5S`Zo&s%IRvy zklb|%p-4piON9v`SS;YI#~@9{J3>gY#dp3Msr-h|+Ai<~fA(kHCrf6h=Zr+dGbKxJC* zzAm8ysnQDov3gu%>(le2_2&wmX=9H5Od(ZyNq?%)*^Qnj3Z3zuEa{IG zVxNrdiP62JKT;?Ly81(f{J~5$bkKfCYX@odXHU=XrvI+c86oZ~#4;-V9=oL7c1b(! zlJFFgw%H|pRmfkTrH)Lu7S>n`W6znbh3wwvC_F5w0RP$77dwAHP?WYj4+LQ~196j1`8p z#;O^G%lkM7h6G)U*mnJ2rIHJ4ra;b6^Ta|{BILYEI)y~~1-BdYpYUETta%l<(dMy* ztWe;_6ms=#b*e}I!qw%b4D1DnDdel)##D4zAwT*yCbD?}_n3`Qv|r(N*LEvrm%cH_ zr?AWgeMf426Z0-CbKT~m4Y2;z#9G2$+YBqA3TU>Y6Wd7gPna|{9)(y_VD>0vODH8# zLRc}8YMg|>b0J%7PhnbMNS%@+C7kU)JisNqt((?8lW&}@HkJ@4YA@h-IWVn<=7lqyTd|KNi>u z4#Ky|bZ3W&Po#gclyjm0Sz>fEA1|=K(7EOOX!kl=z|C{8eQ%=(vW2!Ev^kHxa~9Jq zwt@U|zO^GyraouhQ^2pzQPttwNM5k%T~j&krU^zEIGFWIJAB*}&@2||8G&so$iopL z`I^$m?JaR3W|`hF#+j89y41C%tbmW1t9I(PuHaa{XQ{?yN}XM1+9<&o+j3%;5M@IKjK129E*D9ZL4#$SP*$H zPoMj$`2~`e=f3D#hHXLr|JT;Dz(rMbfA8hBEGzO5L_~H#7ZJ4-N>M2R4aqXCe_Gi~ zQt;7B%rZ?|1{D{?WYJ~zE~H#?WtZnJpx^^#wG8tGT0Tm@&-&UjU!P@$Z~o`pUCe*K z|Nee^@64GqXU?2?pP4yVsZS|WDFJ5nm6BayJt5K)|L~9fhkvx&pD(Y&mFy3}yMoil zBNWQ>(Fa9B)_RdLuOi)4a(13x&JF~(n|ex2?i}?o?r5I_++A9|+@P8Vs9*mviuRXN zRY?28S^Hx3aHYT7pJ!s-i`7H4f;$$EvIJK0eWmVFWJy_|gOf!F!Tjo!_S>a!mhOSy zcX?G$gvv!B`ak42zS8E>9)9vXIsFwk^aMa%#PyvnQ1(L8LIi2Co;h8xB{tiH0}{#~i93e#};6$@P+g)8vb{|&UyHo1`} zx)Iv{fl%0k;0|{@91aXEj_zTIHk7gjAHgviYiSSY)S^Cmg*#8ndh!J7H@)BjstS69 zL|3^p`0@jKz%bBHaA&x99;g4r6-!EaAY1)nH)#9=5Y_5S<=Y9Of)!A-cdsx1q<)>>A8rvrPOpW^!~XEkj?=6e6LN8s*RvbYy7` z=)@JE#!ws(I6B`u{CS@L+6kJM|p%0euusm=x|5xtwbP+=FN}}Xf zN*Br~cw12NDW&hAk9s40)Zub;E&_%t3olAsDa}F;Ob%te@?8^sOFXZAm_AN+E*HZj zk9L_rW8AKwf8zUsqVT!S8z$fbp7t9i*pZn3pZ-hIVD{*g%UD=_!O;bXmMJsL63Ft<_^5WT#ixO<*3FSjPqz)5} zb7dL!hT+#=+?xNbbjU;pAry{#dGkzMrtb5^eiQBQq6XR&7qz`^YUvNC?J&_`H#IMr z)G2H+{vx}$Or4;uG|_G&iq}_83mGbRkr-_B1t0LHQd*$~ZO#8lDmBp?h%BGziB1W? zx{$$9BUT@%s=2W~IXQ-y3s(XXP1+dB|nbB7=)g;h<}(D4#>uqg3>3P0;wK zKpUh5*a&oCeJ?0!o=K-Dmaea{o}#OIpaeywr|32I>pMTRKwsg@=~tlN3f%{mry}(9 zJ-Woie)|OGfNz^v%yRWu-j8K0SC7*^XEG{uFo(zwgsILHOd8(Ly5G;>o2Hr8X3I$M z8Bf##PLM-=XsY|2f^TKYArb^RV$(`YF8YH6^tjz{ZrwzI0?9*s-=X2W={iHjh=3m{^ zjR}=izMHAJ-VGxJEOW|QK;<0|eY#Fjm`?u?97dAeJ=B$`imTSkY*aT@Sl5Y4B$b(0DcElZGbr|5j@WH$^OIrEZz=B4NQ z5C|Cz9VPuuwV-cWZw{=PW8Ix6 z4Hnt6--U&1rTL@5l}dq~ zELsG@uSulqj5%E!?HObAr2 z;dBMW4!z(-w_x;hf@8S|YYnXkaPX(WHw-ztTnh;uzDYk3mnz`2tF%A_CxpV7U{TNx zL8gB;P~eX@m@UTFmF+j9Z`+ z&ml&c^2do{=R|Q|`PcS|BAqP98bzmLjO@|k6(88P8ZYAUTKc?9B^5E~6m-jhiLSuO z2!Q!)AD4Kbc~KW;ii|HmRlUye_j>)Lg=KEMXpa}A1d-mtcroDtog+oZNb$9|rI8{% zRf0)8Dne6yM2_tXMS*7mMj)~y4of0Vq`sIG9flZk<9GE;TVuWGemNvY7HljRn%GT= zOvm-q-e5?spGz#Q%8pAO9p^k9A)?e@q<>-(G+aivBN@mEUP<}^;dwmNA2|$m3;H2W z=*9cs3`HlHj_xHodWj9?nNly2ZpBPMSO-Qt!arjNcQ3??(S`?hdW#MZzseX5r}_e7gq*xP^YB8wx;f zI5LcKucXX>erZO9G>iU$nC~hZq5_k*coOriYYI@PAET4jVxH{#jKA+O%JW`_5h}4o&gcX=xh*onPUG*}T?ji6 zpm|Mbn z=fNGq*Gt%_JoRkqHePx$zQ z_BQ74gGcUL0qCrt{>J7lYt%P9g5NjfB$PvEs0-HjX0Z3HKeLh5tW^&Xycs*R7S5=r z8(4gyI(qQWCD>&S;iNw!T+2=vLG(WdXUfmUu4b0 z$n7QUP@y`?zpcd4R?<*jD7BSP%|><`U_x^V8?a6tl`woG2sbp|3#BjDSvU$-gMvQd zVYif+qqun!s1^O?S-Bs_LtsS-%U%cPgEy5hwod(Sde%l*jl()iOx0^jMvn4r)(TOCI~`4mP7CfAqPA-0DT~X7MHMRKT{7ACU0cRK7&KEZmBzdi5;f$Bk@Yk@|7Z z`v&Js_F9p8wC6R0<|W38)VfJW4UVIR2B}CoYM^1rM%IMD&cg=BK>+Hdg9aLmKx%YQ4PWbXB6;gg=say-Op9%_V$Lm zBiIyk(N|dIzJRKg@#H5AEqKs|{&z#HVhF$c>%vC53_}l_V7&=zzV~C%*UIBe{6ln} zjRU(DKJ){0x1cKM(nQ z1D~2kr+n`7b(x6#T%ml|kG_n4TUJ|TGw+vGzNC%5B-4FfraMb)ThhY&i3@dYrd|=o+5j)A>vt;ALgaF7{ccJ&@=KH>#v@KSkiSTYyg^}0|E~X=H4o)0RA2Z0?1%IWFjEi=4{P0onVTK~3E!Ma2gE78O z_XAZ4Y!M7GSbg*R(ZL2bcB4ARXHM?uhOnBksxQ>*h0I6UxGm~5e`j2P z>b2!}Y>gve={%6F-=Z!NGQ-(mGvI3aG#8lF2SS96*PCD1r7rLioRitV+SFM>=EUYS zhk7C}XhyKYeNbDSLz=JdQ+GWrm?N8iRgtZ|dS{MN6}bkBoY|aaG%E`yVHmnSoJ{c$ zy#8Qbkz|$d)pfQulDsK=b%kAyBr&~Kf9)3=MSck;v$@rOHmlWSJZEC&xUrD+KHUzp#Vgx7pV0=yk*sD|Y77P{7^+ocY5p(3POR=5&+u z^c(Ea;M_SPQ!d3~RNUYYppexkG zNwrOym98YJo6NbcBrqF)()pN;PyWt^^Kr~ZAg7tzLwQqE=7PVoQQBmlFK44KWaH1V z@jwIf@)D<+(^a@k+R$WP-j&94lDI%ImOK4S-b9NV~uiOI5X>z`WDaHE0V~mgH4V2Xjo=GSFGVWG@x0!#Dr&18@^a|V)stqCM57sbq` z%=cX6k^L~4_RxpecaCa?X?GliHLy z?{E4XTey`33eE(!aw{3ix3T)IWRzfjl>Lg{02W+H25RY18&-uM>;D#F=1}A!fXhto z5u!(vdBQ_N>~1uty4V;IPq3ioa^@#6r?(oBTOKN1SEG6Q15TXdy1+&iistu5&G-j$ zy4sleBzwM+L})V;G4{`m&S|dLKQ%(eiWT+8P2#N1u*!f&0q4xdF-CVJWx1JLm8SI6Qz}tAx)FB#beXD=G^px=o7KkZY>o z+)G?nn9n`mHe&$We1YqQcTPW7!1C~X`Ql1r1@_laai9ht_uwAlq@j7Nh0Nspp7&8F zCH5mp5zwQ|Iel<^>Pp0TMQ=8LXEvsRyBWFLxOmIJUdlOhWnkFrB1pwDkwF=8{*fI z&-qVSZ5^55*8+TBdlJ5p3B2B^Bg2JDw^>|0*~Gue4%U;G_*xcaBmMm%AWI8@!`)mk zn`9#+USzi`glPC$VeDeqSI-KIpc??-Cj+3>()G7tmlPC)5Dr;KGn8H36{)Id!M`jh zN_RU}sE9_^3n$Yby8!`Y+vXR{4%x`~X|wGWv7A*X9IH`rhbKpEuf^GKk4pJnA^k1- zn*C+P0k}E_y5=mN?yNyQc6x|;{{7q-{2}(RR#j*vn`tKl`AzIoJBbb3 zT!Y#(;(Y7AE)-D5A?i3g{etbWlVN-=yJRQh1oKZUwt-CIGuXlg@}6+r#?Cj8P>^I- z12n+L*uX|IJ^Glm<9Hp)fqu%*F~1~~9$OH&~XPAf!t)~3ma6$Ey%kqi^MYFJnki4d;U zuu)B9=wK%>uY>D(G7%U{qSo8Id6a@%k;VoL6jgC*m9crfa>y(f48u+#D5Z*X)R-RWfp*S##f!W z94*)lS6+@g;?=@0*ab`5`N%q~OpnyFYQW%?>`*fq9qU|mKlFN#k?LMaw}T}Xu(Xz} zYkOJ$5;&jcLZ=5wvoT*kRI|7isHY3rb1fuvKqAuWCt0X2JU2GHP^a>9v0zfsbJdKt zkRc)K>K&ieH*DDm9bD$>`)4oi-i9WA_O_5gVPArbb%_`Br|oz)5@MeH9`3I}k>6<{ z{loTGfy&Qf�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

    %v(84L~WBU?^Z; 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%0AYYnw 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 >otLq~d@bcG*Sv{N%w`F0&`;QGC(twaq>* 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%0Drvpsx?ApkQ5xiR&ziM49Y5LWcdc1P_>q@g#2WQq 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%0Ae~zAemWrA5SaHBi26|xTD!Lz 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 LMbp81LHhp#P8#H~ diff --git a/build/www.bin b/build/www.bin index f37185b9134239f2a0ae170912bcaaa5cbeb58b1..14be972315ade05b18efeed0d01358b5342392c1 100644 GIT binary patch delta 874260 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�lfUu^0XFik6_#hZkk{oN8AEkyXi7F73CD}6= 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

    m@dSk-n?Yc93P+u}XtIR~%tjHd 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

  • C3q2zOcp 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%0DjA~VhXJC`v zUiDjTc?Ng9A?I~(zYS?Y8h+1us6efMQ)VOtH3xucviH#axmiKbbE;3jlyTu0mOf&X zQJptnYPCk+M4gEol$d9G0^3i(u>+E&UN{}rmgGL8`vK3q zzLqw#>#5<4@u&VOGnqi;TQbYgy_jQFyQBK1s?BeK`RsU04oM@1j|b42*W6BEPvaIr zE+aFw(zoSQlcH-?+1oIN-}*MB^!MI|V0G`?Ao-McU@9(nM0uL&e+Opiu|wNv|E!W72P6qdb@Tjl@p_TBMOR@vV` zG9;Old!O_&NhTr5qz(z4P(tV^)rg9KkTQXhG?E}7Vo=vEDz9H8TEMiKh@1nDDRH_ATFvGJL&oW_w?Qm z;9OOwwtN5rD*ij3c4%LKi+e^GvP|h}0##M)w->?*)F1v1D&?{N@^{=&sfXjF0ag*9 zA3n;phvP=-R(lS|xsuVqBpsvzhBAbT+yX?jN>#&;KqTe?@l%ZIIsyTe4?CS}y}toH z5$+TplJi!bF<#|tcV@usb}XRwk$bFvGM-54 zrO)Du*a+bGJnmR19>C_#`y#FeH~(C~@%9&S?ifwp@N7rQFeN|7RbKcdXybt|LF9ap zNM5%x#h@_81XOy+f&k2Ug4|!lIT|dbuPMO?%S^hjrNqSy41I3fx+Y|&m3TDZYix zz6CAΞN*gI259ouSt#$?e+Dfd*Z-GWwD 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

    j2RF&AGA*E(JC5}C;oW*JQ_&CZ&#EhSpDt8O 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 z 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 z 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�&#xP=wR58L4bt>FeExQFEc72taN3~G&pzhDDOE$ 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 z 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 =rG>#xT%H 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

    iD1yT=H}xs7w}HzY+6A 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 TpM&JbCqLy2wvL(5Yt{b%@LF}Z delta 828461 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

    Zd-;Vg`DCVp(TVm|W{HPh;lSGsTe9mn3-wbl zSlP9ja~g{0$um~GSEN0^$7L>gnzJ3mPiA+;ewe>oLr^95+D?sXxg6}{8 z(a1PL$SFBbOm=sD`-QU=WwlKdx= zl7__@fFL?JYrLc^Pho?;tW41`t#U~X9AI`k**K8}ED2_hdLisuD74Al=y^~Se2-2c zH8kim_F^j)DYB6-9(p0%KmO5YC7t?vQ%B5#?&q$Vr`C%dMB9@~c)q-aQ&-Q+M5<@f zxNk$tvURxKdDpi4$(55S%VbyIy8G$7`F1gNJ}mdI|SZSAb(0aN-`3A9{ zZ3Njc#RbfPK(6prQn%#0TSNqFqhFua@G0r6zfPQ-P@_@_8`nv$<39=bm4 zTdZ?T39GE)PYekm2*k`j9oF~(AF*7ZsnAA(NaZ=(GhUOdK(K=?`)P_Rz}XRR{GgQd z&lU8Jf7M!gfPMF9Lwi@y_{fhG&h|gTq*2)Gv()7@Ts7VXR~UWPkd zM&Z^L#edh|n_WUbtlhQwx$L^_%z`lk$GjvLk;`n*-w%$LzeHB|+sg}kpYJF$)>;u& zAPU|lyOZ)}8Yhw&PbJz6ui2OVqU{RFagyD!z4iIWL_R2E+&%b{EYsPDHq}!$E$6_7 zqCuU7%W8yn4bb^fl?aX}9V;e}Z*-wN*TELOTSWK#5v@I(H`Pb33HW7V{iDC9eOkJpmzT} zRqpYpDEKjNI9NspaZ3Zpqh&7Q5pBfK19pl~L28h7o`+nf*$hCWx4G$;f6Mb3Jx?$-Hgx;u_gfxl(b@U&ub;6YP=gK7L1)P;f_%0V<^3uC@nV|;=PorX@L^tfq zRrV!dhlG3-{ESw)PEnTXud!6!mB@PXcojTt$QIe_XdIEOIg@^zY22MZwQWbr;oP8b+N}pEJ)rb`)#fI$sHH$b94jDlZsTV0}ZmX4gF5 zvUN??-bC#3ig?-UVM+Ymzn4tzMk(EK^ZAg=Mo`L6Ze4FgE>i5U`X&l~MKRO$b@7e= zDCrl{TTj0p9ufcO?y9sO%_sm#m66Hivzy zGp>)@jHDxt6Rupd+Hz-_XUQ%dUOC!wl+N`;O=R6&)kND|T6vQ@i3&Q$1Ga{Pd$@uu zTG&Zla`8>NYlE%nU0;Jl(x%FsbCxgY;lV!EcC&a+262F2ZWxZ$EH*I6&X7kt?=^yIJ-q zt|mJ!hGfuSv6A!AN*--3@U*p~T18uXpEY;ZtT#~<^JBZ8z9oD614gkj;(=$GDN4UTK$K~_so=S5{ z((N^@GB63$3#A@BfU?w4?WR(`a*;CdM!|0j+BPnvd$x2#Oohj&ney+nC6!#*7%9*C zEN61YwO3NweyP{oeU_EiKfqJta1cl?xnhyI2aQ`4{EoQCu^08}9$&gMEWUt_fn8Zs zM)y5XR6<$On@S35V-2M+sW7Lna>`EhO0-j69x^^u!$Eqd0K?(!fW=dP+^5&X#S=v#XzB@%`#1 zA<~UI!=dpH-w3--DkC>ajn4iM1s@i)L2hxboC46qVpBhSeJR?G898O=@7N@JVm08OkDxvo0jaJ2k+V)ugKIj&6`2X zzV*Rd_H4a>_qw&2#`!gMb=3_tm+(6A>4FT|a})bFL^`f9!mx4j!LI>(9QP;=2&)z+g}m7+s932Lsux zoRP3;L1v2jo-lR|nOTYE7;)Z7yh(IIsnwiNa;*<#OH+H|>E8*vADx%!q|HH|DG+6t zN*mPO8$Lv%a5X)e?J4b!j8zouCXp)nscDwjAv&)e1I}+Lm!A_jY$-(zx+>G7lpMCe z=7LeIH$SD4gV5r_XLRnL?i92=GfFEr0er$XjRw3q`I%FD6zm~Gz*+)KZz92LC7ip= z8Q-!-D}Pu9v~$j!mf7?8E&BeDD;t?|8z|RC^)+Tl?Ve`^ zd?2HF=In4;0h6~gdG27)=L0DdJ#D~_)Y}Gja19~(>5(OV4GZ-}yKiRDO`r@nX ziu?E6w!)~AtPYe@@RvH(W_V>M^ zmb+lrSr3Fxn$DVIN?V#0D`{6vwtR+1%%71c_@toCI;j)GX>*0RQbIOp5$JcW4x6NB zBQq1mQ7r5DNh329&o~12HGzEc$*L4PoLVT8XRdi;VRXe0!(Lj&aK7=5oiS&3xE>Q3 zJK^hTE9g_o!9aJ<=pz9slPN=F-HK`$WOH6i=tEU;sh$YS)FDiGpruSBmOEhHgV=4u zQIjxwb-A8&Xvk%X5VVP6>d-oI)ExXT&8m5xQ@37$#iIg+G#!XL3 zT=Hg^(H6f$8967Uc!8Ki4+$#QOe5VbXuJ63`2ml!86o+c8A}xWnOrV>#Ks>r-z{ag zN$rv)CX>D`qNHVp4_GG_n_)~=KzEYO$y446hjmlauEc?}yW%-{u+J0)e^I^+p@x;) zcWqtEiD_?T&XSctj-MaoX z+YNe;Ek(g!^^xih@^(#Y?#NRRyyzGzzgpo9++Sg@CRZYJDo3}q_f3kb>@!sE#1PGg zb0orO;`sPKTqnaNn+fJg=S3R@e=pYoBZOrDA^%N#bfo-W|3KWt>?u;VG`XFcuP zA5Q=1XuR32PaqefL ziP(*=zqGPea)*#dq2Etz(-dv!a*`edV`-|Lf46il+`3l8q{c+T&ngKGALK2QDELP~ z+s=oP+YqC^tLx@vEqC0nOz^n&Ct)8gYrVw@rAF4bRh=Bu()Gi&yL#kj&YtDv`Jtf0ikZ82S8rut6CrS`D;af&#)AO#MhP?-? zhML;b!!9bBsysJu6#SEd-pDnk9iIG#B1Bxz$`7(B(n-nBra zlAJEPYJo59^@$4B$c1PS$B=XAOOZYM5xtXNiiw~9pv3M-^=n3UHvS?L(5KnNvh$0F43po**@Xmcw$f)86Osksz$Di&OnmZE;X_+cS%j=BflkJPmB18-qdxK z&1N%8Ei=V8^%_$QCZ|FioJi)^g>kM=P4Rps6ez8nn;yh>{W9z^Ne#FxM;##;1wq)B zXA4n#ErbzWCKIIQB2k}cxTzzC4mcS_JYHbW14|WhK58!ahm!HTdHBcbo%ZaCo5)aC zTd&Ai&TbF53*B`2nnI(XAZ)9v(rFGT)APKh1=Tw9jK5FY?*zLljM@Ynj{Bx6*_Zz- zVSc8YHhBizI$O+Yh=MR|YZzWeH(gQ?R6BEEJq6VEUXqqtOK&TDtQQFu$kKPiep(xG zX2!YohuQJY=UbL-%8IoCCu{50Tg2T&8}u{hQlsY0tE{VP#|12snYeJ+mOOny!Z{xI zY01H-^Q;S>H3Oz-EZu-bIJ@nbVj}XgTrXEHBvXzSx*h|kn@$j*(4R>{&W-U_i4OBq z<*}tP`V7Uw0G5nUQAxX7l(OL58`w8l=f4%OK}qt@;1LWfnUyL*_5+N@oXkv zj0CmZOUkC#iCrS%Pl}KFu%Pqdq-Yj~B32YR`pxA7;pzu5TdPz!Om_2A*=6_b+P;jG zY2%<5dU0IlO?5SC?zA*-TH}I->IE}Z;G4Cf|3fGDT*_}+L`w=cA*&wo03{nI|JE$i z4FSTmOlfxVh8YT&%u<)6N{+6l-O)T%6#vZ(PDh|o<+RFnKXq&CL#s07lH424GPHpA z7oWeM!`c_$-n!*!#1YUQ;~>QSW>+lTbKA1r60ODIMfbmw-M&$*mxaFx`xQmOeqq~! z_&a|usW{IQxVm<3P=e5uaB|O=Spz@`F!;i$>2cTh!~S|_$^9f=_I}vA2k$+TJ969v z_D1q468?l**5|M&C??iSR3P1)GOL~<15698q?Te%NGm31#>(3#D&fq1xW8t)XlvX| zmiWPp)05s3p5U43KJOS$ex&_Fx_JeYtp-s--lu<2+FKU#OtmJ|;T3&HAqAW8359Jp zwY>P`sO()!39{Q3W*5IK%cT0+>X}Wl11j#p`uY5KH8e)qca%XkHROUID5}QaZaQ9lSyNBCUf*S@-T}hx?(K-G?^4yHO=&k*4d0F zabB9s!Se51?ls0`Ua2GEGct2hqn=`>g&z%(D%(;1?FC4sABy_lC2Vs?LDCdVMjvx} zKPhkTCvoqY%!@t@N0b_pmg_cMep!Mcabv4FFG6#Ag%xAm3ZtMaab{=CD^#U)|0sEs z8)@%zran$$byNQ&vs%gH%?f}vO1kP8BZNhA`#vbI2A4_NtJ$$2+EsPYOu9|p*a5nk zbZXt#q0=ptC^#T&tEZa;6t_aKhx&)Qz0@$W1r%~*-gKroe&f4g>EUUlX@|fi&G@n3 zhkcvH%T~??941w&P}o%ekqchB(Bu>T6u5vv=FJRNR~)9f`Cf+774V zQU`}^YhEWmVs-`26;)PU%`sI~WHrp5ZK7yB@n}uh#Ji16WZh7f>KlYh7~x4A($O7e z9O5iHk%_J^ULBszSlxA68p|<~IF;e$>K@&V?jiGkvYtmKHA;)3BLTFc$7GQl2-P`H zlFIFBMbPeIY;G zC9`;0>-KfKHs9kVSdrUVWNG^QylI@m4@@`BaEd_euDwA>%W&gf)`G;wYT7Y9#T`=- z1yRs5Y}32BJOPHj4V%g#Mjn@AKMG6reL^W65k_aoS#${3@Yf~8cYPFg(e4K=>WucP zdt&!667z0^7@m{bLL`YS0K5dFpjX&7+*yY_^V~C}`dWpVSzVRwBaWc%$`L|0+- zUEP2CBrnl9Oh(L&`V`_)w3SPso@(am9!$f`%!DL5WV>Acd$C>mhHVb5r%({3xKivc zDN3{jE6=rKSi30U8PmE2(}=TKZR5&a-@nYS=8V}#x3sK&0g0gbw9KQAl0yR-g|Hzg zCa+5PQRk%#cbQ; zX#)3nc6{(>1*KKCXuV0Rj;pP>t99*`mQ}Zr-Xpz{UZe$#Ip?LkNto!XWY!TG1^q=Q zb9EK1s<6|D^4>4IZ_m9C>|Vd#$+a!@JGmHA^LRUE5U6booADDUcx=J}^gqP;)Usp& z(mUqt4ax_XSQ3U;7~$b7M{e7#yT$82huTEJfUr&ZQsl7LnVsPbla5fL+N!GR950B` zG-xogI~Vhry2ozYy>5d{L)r;42}U^nj8i2Tblnc$pG}vTa?Ff#3t5VA%MoWnA(do_ znt^b8JRu4OhHY%GF(00Jf>VVXGVBJf8e*{GnC9Hw&6AkfIlPJH%+WycIF+NGL^Ym( za%Wyx7c5{|<5Li+tfiIXw1|R1M2hl$M0Lcs?kO23*$v#@R>+M!JR(-@7?7iO&`LEN zH$Ld253y!lrE`npC}j{wv|ypgdHks6{|S(^{9PnnDo+={^@Ec zluIt=kV6{h@j2idWF!quT5b{rL&#aj$KfsOpw9Yh%J5~7Lf=J6^HDZ~&gW8g0*Ox_;P(Z)H%6zkMA1R- zeH08OqQlx(H0j7)$9wOzV_!RT5(^PuO?fl_pMH5Egz5Aq4h9Yr#r>{P|XQ-R`ET&veph}=OVtJzA zP*VLUdXxBw8^U6n>v2molkRJzr@pxb{hqUNq4|Ccr4o<}D_(%i-Qe-8%?A(Lac-T?Jz+(<9sN0VH7aw6u`2@4)WP2K)^lz3ZfNuQ(n zcUk3f>s#WgbYAnhdGd3PdY{0BKp8Y5X{SI5>C zgQRvj47!8vZu`V_yiZ&-K8kNT0!oKN=(7VjdMpzwV|eNPIW^K-DOM7kAfq@HmQ1kD--6IT;F==6DLYo&DU2ru#TT%)u}s`Z;-)2-g}iLgLhH! zfK-HdLtD6C7d84^n;a)Png7QBwHr0+UVNZ(RS2pq%(bLp2@hT`=4W zDRfJaV{D>4>HTkRfP@N`x+W(-l}>RIuK`D)gZ$8lOsf#`W5Za>XrIBJUE^Qk8~+vd zJ2tbRzDdVbxDE0y4~T+M#29Gcswx*$mg$QHaYut>6Fc4QcN$;i3hBSpmB2qZRZBMN zABze^D|dpn>?D6Gvzdjv(R+232gW)p|q*|H@9j&{A|xJ+u3#P%_yj#&=pR6nD{!b z_;y&@jTUbWb6GVz{H)ns%={4-M~)KyV^S@+&CpWDnFO~5X_e>51+GWQ`esfkWoyzc z$W8a4T`Ey9CTvTd3CQ%Ne zRCkI=1JWC>nzLDzoCFUKgepcNcu3r}bE5+93zm@@HCA*9-&O9m{BC1?6J2Lq=IFRe?29|1FAIG;Vl!#aS;v;eoLN!s z!Qc;~U_31!t^J70(p68TJ92@C2q)8Z7QJR{6Ju^&?0W7+CDokVlmSb}HjB{IqE z0;hzm@`wnTJ9|>jrP@3$(kqq91SBYd_G9={Z}JkCg2;CinrZK4m;3lG&G{~Q6$ys1 zombTgzkHD1+0K zux;B4%0ld%BCl(zt#xT!H0U^yNqfO{wPfPfEFk5RvW@fXU}D@4^G*s6(3e}OTtVZ4 zlXwdA*N~jP88mZrt7(%qTxbZR;7D46)BjY08^@#(o*#@WlJ90!);2mHvIPjvkVtQu zS_G}hmb+HBzVf&}<|<)5b|aH`Z8OKc!_#A93$eQNjpBN<%WVCLNXG;oCrMKIL_vGY zJPMAYI6-?GtV3?N)2I~AO+{SFNy*b=q`|%=ikVH5i9t6!cWn4w<%>fUT(fov@{mc2 zN95dOe=a43q#*D_LP$DMLAf7ITFC6WCE3N#P=?Oz`djzh{bcLLDELa)#%X0o(ZS6FbFxr*Hi3qXk{Z z$!hl&r{O+c><{5DN*N)(x7H1C%~i}3d)tzNgJ;$kbkxaaq5xwHOIKg6~b)BEmV67K8WP?m5QE+V7HivVW z;ert+@mvFhpCSN+`R$j?wwIt#%|OzMabtcR-da&UmRS_leL9BECPY%acB~l|9cE#l zB!)K%juWd09l|~hU+^}BJLy$APV+^>2ROlQ``b&ov?Lc4=_Qhg5K0LUa&`fDtc6;< zqcyCHIyzSr98YmpIv7Z;yA(1#!Y%+Rjt(4i3OVC6P5Gcu)=cC) zo=vtl)dyNXbspcVno8?6{8O1n@rrh%;DnHpjN6@iq2FoyqF*yEIs=0Bfh6Xd+bwi^ zA^$C52g}f^#(C+Q6irPqO0=da`$SX3nD~cv;Q;a`N5P4pDm9Wh3oc*FECGt!W?%H9 z*QRf&2)ppzt#MtqsMnc_`8!sRb(pyB2m6$D-zYeV9bIL!YWO5KZ9tOOLMA%i+$|dB zeoSt@1%}yb?(aXGL?>fa(2F*%8F5_fyQ(H*hq9~@Poj>}p_MlJ1 z@;RBz1Xo;2q>m7jIdyV&yW-N}BXm5=@DXQ&8Oo_;4%D0Yy#u3+w;f@&|AdZd5B@~$ zRB#3`3QnPOSb7v^G|`C!ZBu9&!9E6enVDXsGBd+V_eG5D>}k52Q7p%K@KW5gN5K|J z<SD$@?fcl~iMIr%A+buBg{p%#CiGtI}lzHRh(jLw2FgVK#Q`U63X>`rJ*||&Giad8|+ov#V z%Vsqvm$gw~r}L@X%&{|h_8K#1Rn}G4W`>`0T_bsv=wGv|M<_*C9Gf`yiG$_oSLH^* z=^S2Dqc-4>G@*K4+~>1`ZhVVf-{uP5&_TKaCAu6Y%`{^uSe%5))#cXg9?iCAV*KMs zxpRcP##QlQap}RBD4sI$&3XAOIF-dLvO>=wR|v&Y+C0d%T_hzWekvnz(U}YlCepc5 z?t8wYS-mN#Tesi}mX^m>P~;0;+(vg)P$picNABwkp$_MoUs|SvrA-N;Vu_@~E6_=? zpyDZ`U@Aws@;$#4JgXh5ybY;|Tr!}Zainx9`_Pu`x(8cUFQjX?=sZMr%TwHH=0Z7> z;Vs*g6+2pSPB%7H29ZryuthP+NG5?MC}~t_uhVT-hLkFq3XMLmw4*4PMlM-8#RKh# z_^=L@7NthQu=ej64IBav;OJE8A50T^g!j3u`f3_93KFqL2kiE8`9!T1?SA^H?247U zHowTpe<(rt_U)8_r1jpdJa#eF-EU+RoJoGv*%`l24r8jUBNYYQG(MqcbO(So84n0V($rG1-~YB=IZwIf8K?R0Ui)7S||y6U9qx_m(M zOXSQqtvzxl+TXJDHVR0k{NlnyRa#H^_LykCYba1Z za7SV1+JatWj8og3QQ(#+jyS8Kejatvna_rLy3V_L_~@!?vQ*VLP_TH~J7Xu9w{DDr z>2eawqi{?O_QTVKM#A1P(o_qR9JO+sd18jm**WoL3Eyv&LM#7?Jcxp`X|l9XNXi7i z663O`t2vxrQy#mv4*S+mc9SxlxTJvS&^I~$BWte@>Y^< zx`19(NTL!3Og!uf{dTi8%AYLA}{>$WIZ(0*V2z?oOpt|CT~x3{L1c4 z4?{}QjboB9Om%=P#YX5G6iz|vhm#~*wJQqFBXyUL=kBw~h{(t-FTSF0MAuA$@2g_f z<`oew3-Eh4lHAtS+cz>TEAHC0<00~N?%I3@-;ySYVmOV0^oaX#Bd2po?FAhVbu+5b z6{WUd)fv>zBgM{C+X7R=r`yPgS(w+5(PqqyPsNNmKWtm7lRxOHRYG|oHAwK3Ko?TW zXx7d71=|n|84E&7NJq;0K%S{tm34fch^L&qvZ6=oVNT{eqhWSQn%u~H9>1S7BgD-U zf#L3(?27fRH@%*{Z7bhbAb+9j3)F=|TT1UE-!i$L_bhrfyW_cNVIi(-Sxncngm2L` zEpJ6V!}kc^i>{xrH|M`7xFBq!vlT6Cp2&4vD-UzrwO=$slS)4Q(!aR7oCl$ydKN|d zyGg>G056*>-c`5k)1+26NJiKQhjfv;e-vD(99!(p%DozHKW2c`xOnv1u!k`-`MxEd z&vrL|+x#r)fUR=P9!;98UhX$p3iDY{UeMG?ff%_F0a0)fovhJrPBD~@ z;M$?~8(C@9YgP(vgpN3fhLi8=Y7*!=*HThD7KX)zN-WRu{I?u`DvMFKt-NWjDAkN} zLJ0Tbg1DVga4`)ulyE91UNj);Jv4tJAQJ|Njk$HpOS_8hNuLckQtK?VX3BK(t$if# z(=#RJ?^!|`4sDq$)@XgvOSMKoL##r`}iZIC2NZh(x9^`Y|OK{Nx#Cg!{~Vl%_oits`w^(@C2la=Pg_SxE_A!Uw=B_!evWpD4J(1jy!5S93!4 zsrdu-X=Y|8q~l>k41;5p&*=ZC-L)#?QEerCMlt6}3I%DdGvuSojmuRS%}GY>j)MOZ z!61sK!~srm&e6JO4$=n5w?FKfmsnqBf856dJfq***ZkWdQ)bmPB(CJ;jz&Qxspk!4 zLPoL4YlQT1^x5M2%Eor%BYJS~AtFC{=%sZcNwHmC< zSgGsWWur3+X0prhkf?{w_2bO<7;>cX)q0#3Tx*hgDHwjtO&zOq<3rt~VW2;TfMdDbBjP)*t3HYV3H;XU;flYE!25p_L^4?ENRiA7w|r4zZf%f7OlO?(3A3knYqn zai8W@`U~@@&WMvE^L}>qf^~iwd4_Qp24` z7gF|{k(TJxczOJhvxDYJCTxJ~J)<;<#L>;;WOazMItpsoku5- zSHhB0ZetNJMoD*DNnr+L`BiZf;3zLst{c^k`IR$k zARot!&x{^iGjD!bu|$lE_L=0pdW%jD9l|i!xnYdMTlhu}%nxzy9q&%Osv_s4; zDD4fj6Ow;AC`%>ngys?_bt&$5M09{QoJ?7`M~!>Trj8>N-Hlnh1Cgse8fL^4ZbW`Q zO|sdTpefzrBXhLoqF^4)R~oT-z0>XWmS0N0WdECdq%ziIU^~2!^jYOww$lVY!?F94 z9>8?ZvoK@kL-D6~mlnyHJioV5P)C9{caD6nld@BdPx9#f93w7a&8|n!4iX_#W%D1d?nMXl=*rpuHqJT3^Gf!W>KD+(# z-8&y5e+}I~sX4lY=CbMUo=CAKmcN0jwk{@_6b#xMZl7r7lBWVa*K5j&<5uPH?i9vT zmt&s@X(9Wb+O{d1j4c_xawtE~d}8<%Sv*5?(pfdNwXW4f!Q=IFn@PN>A%goIRmyMG zbh};^pC2ObsYY4`WPU^aZ1UUb@XOS4-EUb6sRG%?oyj~w(n(NVENIkkRh5(-p2NtA zV@yytvN=B)_O5?(*H_MaB(tO7s<6$=!Av|N8EoC0vD2Ai#+w{hFqq9hoe7Y?avGfB z6ev$S7yQ49!kmRlDZNuSfr{PJ|NV7T#;&c;(P^sIhwj&eIJ>fm+~xTxF$x-3Ri3)~72rZ-D)m|qx*e?4rC`&zs-@5+Gr`ot8v6jb z8B!^2IyjL%TUb$fV;}rLQADEa>;vJ9>h%8@0he^qCgQV67As>Q zArhnrT@$uleuKD^?Bw`-Ryjz^>^(PXmr=e-j8Pg**}GV-`n)tFI*-G6seL-g(yB} zQ83E&5{yFirJUSK8DB5Wzzn)zhgTE&D||_Gd_^p(L;|(AXC32iNSOij2t{A3#N1sK z;AF}74?v3N<02M*UJ*L)3o+g(xFKxI(Nc*4=BNfKeU)SHHjd9m7qv@EhK#sf#+De3 zy(%>_+yG(?6cvg2&95;Sn~C#-evRU%=hFG=_^B^SdRp&@SS8h5T{^=}5U6YOazh;M ztJjBBoK?#-AGKD{9Inr0Z}MgecjGDy$B2R(p-Q-fkgn)?9OHN`NNHbv^$R|85ckjj zZ>)i*GYY;=do-RHrMqpuEMqV`TE=1}W0V*EapXl|(M)BUfuh0nxJ|mUA(YM&5!1be zl!%}H%ZXf4Ty+y|MLq_fv$;r6vsc8=!8b z$OJUdyIS7vsj9VNuIe-6CHMW&DOzTVNOnj^@J;p-vv93DT=q{`R7JtUWX8?3+9N_{d+4&S=PvwiCOR!>>QCYxzkDaCOH!Z9>YKQegx%0h=N75wZvKC z)xMhVN6;P_$+c7{q9a~(WK?Q)wpcR*dl1*8nljxfS}K|!yQ@$O{p7TZJoAfion)ZW z_Kb-FvnzA)M`BIfM0Pg3#FI>=sSMoCxEx{3ZFQPA=LpqSJ_p(Ov{ z)5!iLA8!$U9J_>qFY=HH>3E5v>t^Y!>t-+7nF2QlM(!kYHw~Ma1nu5cA*3n!t_ARS zrbQVzm1>TH#bF!Ce&m`}S92mWYf2EKUCz#gQ7Q4FuSOKQ5BcnNj7oO*>dfCMgoC#^ zTGy>%HF&vw91btr zTp7Ae@m5+=*1yi9ssy)W|54MS3!712r85s0=9w4<6$Hr=#Srf3oRiFMoEeECR(umx zHBzuEDFA91Rh!1xL!n%)n=y-9u5BvXd?{GKJNW%1luWlH3T`8k^@Fzth-A^)kDua( zq=xRejvdqjE0Iq_C`buWUq+c#EJ9kAAe@O#ZVGNX-3mhMUjmBdR5aOADT9LinNe^% zsowmRHwi^hrbYL(mvD$IOpL8;9=Z%J-#(Zgxr{^y7=df$vh>+eH75j(+F>M=q($hm4yB0>OY3J@hx_TMJXDvIngwObey zY4$3Ng5?woRB=*dQ(2pUq<$wwqk1aNZCZlO!}#@+qG4myZ)VkcZE+^XIs|P4i*F=3 zy@D7Z7j=ZExyr(!r-xE!byqA6DikO}p?X?|DO zmY@nZY9nP1^STX6c{S#k*p>~$q-HZP_gphOk;R0wu}0iUHp3*2K4WAW2EILo-00)I z{~-GKN~4eKGsU(|1B8QA<`IW%nGHXQU(q~TyB}Rux?@J0iSy}u26K3XFDW-GZH?cJ zt#L>%H6hG7Iusfu$3jn*WE6h6yt9^5q#KvA@A)0-be{?{i&wdvqu?H1VJk}2(OpkQ z4Xomizod9d6Z6i1Nb7UOk#V@wn4yDAKT6e)f_o)rCUIf<&t1CqD3(#vp{2VTiIgG- zqD`6RXqWcQHLD|2#%1Bu;z*T5Ew1sIQcGUTK>KFxo_2iHeH04AVe%)^V9|1F-L`6X z6x!CZp~6UijsY32OVWOV$b8N_6PVDvn@|i zOdee)wkm9s7ZLGHg;26d{$Bk8KTZ)Yy37)Tm4MB&($M z@ULI#=lviN%tqtq7lzTztuaO3#w-33_KLSojk-~6?f0kBW}W&_DgS(MJjamGOfmIG zXMECsue?_8yQlp=P-PJ1Cg=Q4*Fta`i|F*l{j^LMPKyQ{s@iMBn$nK6SwhzWHPI2> z_(!b;15`E>x)Gu@{=w9!Z`?dB>Z$XfYd1|Yl%`B?lt~eTw8_L|7X=ScY9KG|rJOc7 zQ>||yO<4!+<@<6{eVIr2uZewr9q9S6@0 zwc3uIn}{SuG)YIJV0GB$%3u9`yyfhud*bd645>EVw`c3mzx{4P2@;3zOk+QnP zcb|jF>0A+coLHmev*X7za|hGOB{e*EZA9!cjJ46Ex=WQaC}Rr|5B+z9#}2iku#J@|v^1|-CEhDNve?;IQzGRnO4Urw zZh4F;*DNZz5X}m2cXXt5TITzk!I5=-01p%Eol)=vaj(agm-f9_4Z(_~Efn0aaGUOb zRa0ec{{Gvpd+MdX=^pc`+>{aEMu;?UHE5~NwTGR-&>FMMubxSFGhRM!tfn&nQLt8d zE)_9!p@KZNrD?V~%>HZ1N?(ish+UZl8 z$UlsdNL0>@<80}`q>J17r2JE)UbkfmX*WcXb82dJ9JdlF+7sj6IH;y- z3uXIw9=4=rMO>WRTc|pi;TsKm^`{si7M%R+HI)r@`bROVTTOR_H!X-VLbE|hkMn)H~e6X+a**W+|5*3?{EPc~QGY)Zkanj#K3=bsG?lqdx9 zDMc?y#89^5g*%4?YZN?3R;*3}AS+ChmbtQr$mhCj)@8IH6k7)-7USIg=0p+i^M2cGfy_3 zyR4aN?yshE@>8=pg2ipMf;m}cI{yJ3;6#Mi3}<4J?B3O&=2SQHfjZfPkj!x$0x8y5 zLW&?`LUzNJ?E1~SH{9HEA1AYmf^|xbH=ag}mM>pyr^+M*$NAqQJ9p=9CsgkEpvowN zjFoyAB~OiRSa$Qx*^LX~UZYguhGAA-N3GX6%5cw-#2wM}$+_)D^2^h?eEj0jWrdET z5^jc4<{d^R7KcgF+Z{4&n)irdvt9&XZna~mTE)3hK`l`$iLHFi9GiT97G?iWeO;YK zKNSg$?tFp#kK|vZ8B%c;E`cjUPQOHN5Vt{!ik9}G85kTq@N?{PEUkt<=ZJB-MP<- zThAj!e-bSO>O~a1OoO=QFBH7bgRTUV%%h{JLgm@L;~qLoOHnos9U%dX6sV?GxvQ;~ zs%evb$f(~;tlM`c;&?CNfWAL(0@nv7;`+uC$ni}aeJj#yWd8T{!i}4-r1lw<# z=Cjhw529cb>9csJitdHc&())b`k8a9bvwARm9^EjUB8_b^`gLAdd#z#Cgnu?ljO02otfi*8PJT5MM`y;DbkBM%4p6Wf5e1vWw$;lx?~>evgv3hD9O>B*A3u$YGwU=u)tJthw zUp9->r}qr~b(IYaZ%Bx#*H)zth!MMLK-B(>d8`zD(E_4id)UVNMzkG7M+cn!P7+)Y zfRsnG;p%2i)hbh=>iyDz!%~bXMK-mdlX{bB8fhm}ls2deKcZ{HL{(5-&^yLP^$<_< zp|na+TRxki)51jk^ho(X<4`c|r5?1u zd&vYKgrfW>@yDN+cCApHN;r~Uez�xPzD#7AK59N_(PnWqz$T>f4-9>vNJ-dj3{Q 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%0AbFN{*20+r^~GW6|&;>D%n_S_G)%gM@&z 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%0A#kB0|ozYK~QfAJML8kt6;!mYq+Go~Bc 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 z z#;A{4hct#3MQ=~rdVw~YyHFeobHh$wGb#`@KT5FaOWqykC+e$V#|YYpPC{&17}CKx znN`%07gLj=wRsVfy5MRqrs#GxKMBX+i7uP!pKgSt+BEE$D&A*EasO<@x{}NBo2^}3 zPdMXWUG4aR{4vm}HMaEf2FZ5@+`z5HczQ5WL%_!hH>s2;h=#2BR zWyV5IDpoFZQf%AWhcK=|=62gcr>i*?)fH6}1NVX#OM!51%8Xr3a$*R<@?b4i#+j8< z`ykaFSmtCI2O~%rkRSs$M#NRw4>&I>;|#-{Wt>Jm{T5$?ugjcv&FFpamT=)B zj#g_IaS+cv47&g6BBzCq>USIl-tDe(nzhiHW{xr`RmOYSwvN#Ghd!rPL2C#{(>YbV znaV1@V>VauTiL5soa$At6Mac|VOy`bC#noZ`6S0jdG(4YcN5+oTahF3@+Vs^3RD){IHHhubh4ZU9>Abtz>80f|G`(M=Gx72x2@L=aOC=1`LvGR=45v?CXf(+& z%=M%}hSWD67wN5R>rDvh;yP%54d7(6s0!TMJiwhy|~#x$ip}No)(!UCy@N#xg&# zl*8r2rA`ky?PCt*Hp`r;{G4O$G02jXnR_wqsW^=3=96A@| zhS!`n^0Av8W;qaf3)qvhoT>6LDLAW{sVJ~`nE~L-W?S!K+$GC7Il5^%ckeu~+!^NW z7oA=}CSL0xO_lr4<+BxiQ?%2z-qVsBO-acgOv%1*!9HL}MxCuAr*0PGu68#v2bu5;R%s~VXYx-Jijj!mW$FS0OuH@+d{7TNB zoLK3!=Vb5(r>7B+K;EN`9OztWEoa=|w8-=@04_m4OBU8JLDBaQF^sEka59bjM$3uK zxvPB&<4;|==LTn>@ub!FOFbqCZ@qMhBrx@CHwd;I*`^#t1d;3;on+U5-?ly?YN}e2 zIV%yubnZ>gg)QPt=VkOpe!M+=BL~{MH#!-YdXONAG7SCnR5Y7Of@QM(E3NO&X9POSNTB5M%>zJwICTBR4osoL9m2W8etJ?GsH~EAv&I#Dy!IyjmZtGo#y`j+rHY#Fi8zH{%L^N)~8td z_f|W8xO8eruQ#|g{e!KT>4wx@T1~)8W$MjNKSP;RU72>X(^f9Jne)fD;R*c5X8?4e z^81euEpxIOro^Az?4%nV6gD;4dmziHr~NTI8+5u%qup3}WTRsz=_$q>GuP&cY$Gk8 zPx7>RAtvG;Pwl7JleGc8il`a6=Js;)UeOD6knap4iABV0luJ z&)R8dY;(;=c5TH-%uj^afLhki3^AkqAP;o#R;MGv7=Kki53{HWahf#woL$8a z<@B{Yv_i>RE|R%-t)(J|PM`5~k{vZT43UCaBxZn+3uQfoOUHk64jUN-lFmh^tyOV8X z7sPkFN;6=J;<`b_pr!iSsza6$HgVbP1c>VV+xdlZ{q0V!PYyn~-RX(!<&JOrI1d36 zZ0jUwLHBhWm9ALF&)l2WIRpJxUS8*1n#4N>A7oqKppC|N@Nhww-oX$5qB}U@zWWZ& zo$bHF$?%UbVk7b2s`DIVp4V@~rs@bgg?>-sdwJhePD6i?P1p133|`N9o09dMn%=(N z>0tc4ba=f{w)HKVePKPnRD7}CX>URkkqBBQZse`@*vMO*jxx^8lHq10q}UpX>{Si4 zPj}_4)C~oOTg=Vk9p0ylgn-%zSEgzY@DIPggZj9CjTULa%m+PMx{XJ=$3w$)4mPv zZMAC9bnX(xa6gb6?*?!5^sUYX&EssjBlyrRnE^ zG2ZE35rNY`-Hu$VHiVvawJgdpfNTbd%;7F@+NxWO^PaTFeDIw%apWAkiKF|`G)ZIi5^&MT#J$#-+@8Oq=+4pe#J(7Yb zIa}{>8nv^nbIQaCbS;V;CH37w_uu2>2ye(P(oCe_E8bBf6D7Y&_mobSF(`KHW6hPm zyx5J|=i-3TqZfC#tsekl3hRfL6xR>>pCFBuZ%8N2zkvd5N|xw~6;<>=!UH91tVhYv z@?O4Yr=G(N?#mU2NAkB_JFx&c3xmc5QQhB(s^_Oql>-4+WYX(uI zWa4J#t>#Ah%iql7_AcD)bTmAaZT$wzy1{Z5ExY!>O~!^0Z`Z@Ar*Gls z!RRec7l@&Mi?%DbaEsVmws4a3KTFyTh=>wuGlnTO^I-CcyFUPBTfejFMwlXXx9U+D zuqBmO-N(@nY7NFrymp_HZO9!Y2h&OxBSsFwdC0`APP?Co+(ajbcS1C8rcQ|88~PNZ z?FeopFwDIKR@1v-tY9y z@^FFpkfmnXNG!Fqo>kj`Pp}XFXw`WJD9ZAJJck1}izC0o?cjI!J1slnOelde3H+J6Xp7@dugbL)vvOtu*+KwCa^1pftOIg%ujS8|K0E#aO<2D z*xEku|2O&ArkS*~|3lU!+xoNOyMW_AkveIF+;c1?sbvU~800SEbYayFKKF-qIJ1l} zqf90~=(NY~{0jh{`Jgk%U#Ox7oe}=ioIgR;cIZK;=U5M^RB|Yl5<{n>3gpDFt-oT( zlnGILTDVmLvC?JwuQ;!h`zwCT6#mLt+uOGO#+>h6AqZso0E8<}!9$EZzv)AqzIA$t zPkr1&e2Y{*=KcjU{qP~DM|VG4k#BeCTcY9@2Qr!S87*3k&M}2? zy4j}cjcM+gNKf&2G}m5|o&(rLHW`TA_zy!=LUP%|99ml*cG?>!5bP2P--^zGwDgM) z^Vq|XszFK2-(CEOGdjt({)yeNunYI!l~dnNVV>WWk2ro>2Si_0A>GjpxB)l3J8Km@ zMRk}m8W28)IjD-4Le8m*M(AJcD-{fij8^pzRzi2n#U&Gv-V;I4P(eRK*+I{&o_?WY zSJ>8n17w|-SFDJyCo>*(GF=;E71>kekf8gNe`TU4jlcMR)(5@Ew7kjTu#b)OPc>9# z3OCGtY@mN#o`0ooBsSPT$c~2_Pg4 z!e>Z$1!Gzy2sW*$C(Og^jtFUZehp%%fQ4agVMHnzLMeO}lSHyxfAaA2MEsK$DKyT z>XNVni!u>^Sc8})@=0XpPBE(|3m$hmPV?sV6S*D8MnGqa@j(<-=^||FKjg($PtFLV z$^|_EPGCHGY1oKVN(h5tZa#WcbaTa9|R!dPiBF`az%BmX!b*ullFBAe1WphqXy?)t4zBI5L>cB$yTE zwm^=UM|N_&{BWn!(b%&hy`F6)B-GXDh>UI|GzuaF>KJ3LES+6kX*qZo=M2ktaUsW! zT}&8ADg11!K>}i=) zcCg&6DLCG~!+zZ0i>UW%pEoGE!ci@!l*8D>Y)GCq=_Ol1p!G>z4_2fix!QI(JGO^E`hyzp_#$ z9iMnSu-j>M33UdhP~jSyP(n7uO#nqD-!%1_xZ${?`_ zzy-jk58i^N=jo#<7f!5Rfa@krZ&+{*MqaN5n1rJZL(`?P(a5w?Q{@SvdbV{TM!)VUr?qkY(115kXU%Kj8%pBR zT3}>uuQV?D$v%@Oo^t$T;6R92>grulb!;K;R?1q?9qZz_zO{hL{Z_4uZC#X57x=t9 zB0HRPT5zGUo4UlThrD7B=diEc!%b1Q>~Tb3lW)exgn^#d$rv^Y;DKEs*qZqM)yHYxD5=oya98=i3n;zH60Yxwpv0ljPDvrZ>7 zx0(uxR@x$}g*zHP+G)@7-iS3f=5n-FBsB6xmju(Sp$+Wpo%)Cj(#bAb1B-j6u5unT^Mkjwp!|lRr}4@to7q zD1vnHhC@D zbvj?779_r^?jwI`w7P^cn(7}6`m+1;PCvtUVFBHh4x@euVrRJinRNtvJ`%=>%@XR2 zGgGzBxQ=k8>J@7kmD!@XS>9NAxDtWjpyj3un0)EGlqQ#Y0Q>n&b&yL|jMf~l70vjO z4j_JPie*wc-*EMUopm7X8!Veuk!>|ks2d40=Rm3K`GS*fEH(h$dbn#j`vpcNz*9iW z1`Y*70lVNnFi6OaFYp6-_X|#IvmhoNDS@fpY@}qyXIm{2>WZrK-JHYPOfaM#SwF6n zMVF#EPu3FBZ&=N6I|SM_^@!JuuOo-N$X%}YR0z9iX2*anc;rRShHiM#X$OOwmVvWJ z?tPJ4$bI>u)2Rt_jQ}Iq=p{~nvtHtg49a0|xD~JuUS>^br`^1opacm#qTfwu&BPU+ zS6EX_Nk<8^_!*jp-wX=!&`bOk`gGSvwHByln|0>`#7=;+~=ei`zigsk!0#0{>N^w=Lw>`3N86O z;ubs^Sv{zNQcHLWeV-zbr~r2mC>)bPNDu7eRO#b=PFF)ZiV$UDzY{W`r;|b*ouB|P zxQT^??6{w=`jr=_rO0{v9S4VbD|EDCzth(kSit8I7kt$k0Op3w)~&O-%MbQDZJQb5 za7}d;q(1VpcU@;zDkz2Zbr}c()&LE`oF9SA^doBr1D{+~i46_ntTcl@Fe2(bp@MC- z294C=>fG8MhOnmG`m(4oG*^`exSnHst1@(#(SX)7Gtb4r*9PZ? z76r3@T+Jfolv0P4*A6MB0<4zoeUL+a#zC%wzUiRTXMzVm8qN77Kq|_QZM9AC0u%bT z8#XNY#X+aDOgzLbCW6_NjvN-PQ@2U&}`-K0)8iLz#HeRL8bbJWfWNHfmi? zRu=B$D!v$=Ls?mD2)df=f*?XhTch9U<&q0g;%|y(hdHh4bJ!VVoER$*<(@2b9bjk8 zVP~5E(cxxT%HxNfB;#08jGB?97))+;J~D;DGvJ6b=jZB#8Y#9#coPlD;v-yUu;B<- zL!Ej_q|4tPflj*3KGDL49x^T$R>mt%hd#EIngG{(1{o}{3HMb^M|)@i$P%K@8MKq* zUUAZm|J>rjDugRMU;0V8@)a&(-u4PV7hZnF=?9T|FG!)6VeY6g1I|205wTSch_sot7+I4u|AL#nAMn2M&l2UUjlf{4YR(aK?23 zg$&V*aK23ZHH$Q~(6tz*+5uYz6i}Ec&=V?(i8zJkU9u3OSm=?eSTa~tUhF0aQluu> zv~7jjLP4kzJKM`wGMIar9Oxe9qAcmQxf@F^$0?qnK-p&TgaPzQY1zk@KA zcf9TlhPniR_8=kOe%I3H!&XclOya9RP{kL_YJ43A)}CMA>wj` z28xd}A>4v9Q@eaz06KtnRw9-*G?~y#wF~LsVPpVJ6AW-!N8WIH7=CeaxMYdTWMC|4 zbOv5{GD(){f@VY4MAV2GFEjl>VLsW1xDB#NxkrktcAOHH`ENR%VUOPt@~1d8TF_SI zkvE+YMw^USI7KDnVGg7YCfG?rC9qIEvd*M2XfYN^@%~Ix#@bdVVC}TGxUdtJF3b&* zyrzs9ILwd%A!UP{gau^%xh2Z(rS02}Z6uSO2@B-*wrNT7(zp4sb@SWK&|(ik&=@n~ zn5BNtj&o0CV0QPf0(DeNkD;=o3%oY+v#m@I{bciZc&ZN1=H()}@Ez`*bL~6a@G!$k zv*j!AIAWeR#8Oxkfnl<(E+8Na5FbwmaIeOnP^L0AfhjY2p_deMRC7P0FGeA5Jt0pi z{bjI|li%egDU08Ax()MsRSn}C1rhcQNP~7TRS^oXMyud!g)!1d5ZL2%Ry>Y3N)Hs9nB1_-ryDC0+oZ$m-0z<(Af~FJS zx<{>YO(-k_r*jlhTfwJhc?cbn6t%%X8q*=>Q3oeEUxfZ~N4byNvZFjpBvMT#!|tj_ zLS02sSxs>X@VF8edWdy(E>Jx_KDEO1wAM0ojBl7=8cHOd94cQv<}|^%m<{N>cZ?r- zKb3KD;b&ZNi2RG0&1|b@fZh1N%)6NT5uf_0W-63w4hFS4Sm0$F^v|77KXSUtk;}LV zLzj9+Q`yuZNB91$eTarvf#%)b}nm$lW92)Y|zetWwQN= zlYw)gH|`}6sReHvLq6fgJjc3;)-Av;#n@on`H6GcC~uG`rrRdDeq&Q;gDvHlRRKL% zDZNHuWZUWk?5b}tp--JGeyR01CYSkwE1-^|7hrQIe(GFe?u{lI8YKInCYk zsY8*+`vQt@e(H2G`wO3tc+Z6BL(ILz&-kf?q=u<-)fdhMGC7%F?J0|)S{~c#r?*Q? zs=&8Lv`mqI_{?c86F+xC4Lu;~gtD35BUW+j28}N9$2x zaK2!8%FRBaAy56clVt82c#&HcE+p}T`pfCm#IKwJBX@)^NnzAw;in;17bFgYuztPU zhz|18ulPJOx}~*gj|ArkO@hz_i@|oQ4Wp?(Z$Irgm;dxX?o1p>Q=osChSo`e|AZU# z;DkC{A}W0p(id7!#Y7Z?H@xLI_Z9fyI1i}ZH$yPXe99(m46F4B^U&WA%xv-rZtYom zf=dB6oZy1UZS6#MV?AyJy#x0vr)G&xJ|VpDYbS&Z3`0SYRICP^nTV*)jhN^o#ysOE zpUwn)&u$wk)wiCyzQ6>yp&P$;dK!94WX7$DU%btpdz|F?e9SoM2?-SQKEt+#L7Ehw z6XLx2Ml|TWLDBKfI}4q3l85rnbVcfmRdZ2SH|2#M_P&zMGewSEa?(kfEsACUWvACmjyOxgY^_XCcm* zja2T+hIDY#Da3*H#z&vKf&e+J30nfp3WSTW7s36n;eiaA=cKht@q~xar@_UB8!gGk z-#YEQ!_u~fV<@u6w_Id50~LHMLn83>fcgKHZ=EijCdZsT3lKHL-%#?^Z=H_tG|Nk< zL!9!OibBZvi5U;gTdMdYn6Ajg?>HHa%cD9~zWSY$45*F3P(5azL+z*X>>{1+I2;Kh zvGHF1-pMj|CfFGiFD;PHIX>0+47z3ytNJkZvaL~QYI`l0C%#|n^hyO{A*v_|K7Ljv z-JuxNXtZ=)Yfh^kJk5_FB+yNgU*VNZJi}9dm@K-qipWQ=&y&#qDjTj5AOMG8;qVjx zd8b9ghU!)@7K0yi)|uiXN?fko(JQ0IX(28ltb0IucZLET-x4|IF`G=-xlxJ~e%NYx zsovneC6l{NNC2jb0ya~SC19JVFfiJk(-lsc{YWuZ@>ME4B{)$v^>a{o;>N_(X-=oP z0XT!nd&;3Dj1Vt3QT zk-k_#VKF{o-K*rhBsfyx6!6KIf&$s?H%@bph++>;0>}pahLf?%->`ru6!8HcQsfEN zu-y6^XON*t;FxeDkS}Kl-;Lgj*f)mq1CNJ4hiy$pPy2*mNv*Sg%VOOF-(lOPOjW$u z8*G;oe#^E6b+ zrY6*R5t{ilU;7=uBwX9uPSXr#+V449Uh;e1;_Tl$Lm;i3=F&C{Q*Oa4pW192n$}kS z;rCAS=5g+DM~C7R?fgf61Hr4-^0$K_F(~|_N=cTFNiO?i;J*DwC)4-|!OTfE%T06S z(f_1eAT$1pb9!?J+DUTUe>rV%1uh6&fmMmfO>3$@3(oK1|8mmjc;H?TE{0W{$l z;nbUnHpc(S$ulB6pezf?LMJ>#U_J*Ct(kWrk#%=1n-xD^!h z)eqK`{OYex$HoDUw&CAc00C`qSe#3=(6+8fsMF@2#i85)S6|+nSY72O%GMS!ugW#N(NIBB>1z zua6k3sWSWTJfO^pQ6Mlg{?0FhxBs140xFwo9mZa}mGLO{wsj>DHMwXsbmbra-DzW_ z%5)=eCFrEdh_$X%(bEBj*eL3<%|Dz}<4i#Cf=I)FOXc=B4|w#I$UsDn`v=K1@z1tq zYr-q5{=ql%)_-s%a@iONB#!=r)7fof(uBIe_@qYs)9Hn~)m6c})zp7-)^W!_xsTQH ze`3=-Ioi3%Z=}h8gSW6({lfLtJ_TRx(lmKdX<8{L${bLX9{=sM@?~4vq>qxtw3Frk z&F|ZhCj6A4G%zY*9;md_prxcLE*#a4UA%?ZOwK0wSWwe7Ei^L27d(L6W-xh zkVR5;l+FM(lnx;?z~f>BBr`@9K)6_%ZuKKh|4~(u@-cEi9Vaj|>YOWa4iyH@q37zH z2^@tl{Fl?-@EN3+f#fbI=kXyu>t9X><8t8+2&@TEVqQX>FRWrN^uQOn@?Tu#aR0xY z3?sx_D0ADxWct&8@r%yd327-a7}e)`ar8zxQQe%U9HWYsWB%== zW_cKI8goev0Pp_dbnAwHvmn9dlU(g=gHPOF{F7Jy?F{W3Ldes_CEc|^ehIj8fTPkZIgLjdi;`B*Cg2txA$Vq~E zS9bizX=@a|uoUt_eR_Iyg&($6f?f6De-NxIF+q$m^#PpoTLH*<38I_vyum<0iBy6O z%9$S6EiPiwG_{H(aL!sWPv+dcM4h{(IO$xCirFM`M}lC%wT~u1sx#)SNHxYVn%3p3 zB%*RdV`l&tdfeNs-=}djr7I_yw$@EM6UdxPg2u>Jmi$8qUh(X zDQ2hD4N5=>%gVwsGf*vI91k$6yh95B~ z2rkN(p_e-@6wJn9&xK;L93w=ba&;jP>hK#ha;zb~)d4y}W02+@h7Leyyk>xuYcAsL z?Yf9Bb>R#cRGqs>v#diuQ-Hxf*0 zcyl8jGyj`~SeE^bL|0=uh7{;zU}3menV80rD&=A^$f!~Y7E_eXHy`nokrO$b7hNov zchdD~qNkDFdEFrSITrZf#Uig&q=F!e5Va+I2gzpXqO(7vfsI8U|EZ#}xCEG3g(eCwWYES{%48wL zU5a!3lv!>9m>=XyPpDIOtZ6!n2wFl&Ksl(XV9wJ=;9@OHnu=aNoMltd+ju7U&>$W? zG<~drfqc8EaJte==%0c}%&8GPMZ7a4y^lIWY7*)c+wb}-_#l^w&BQ!^H1nGYmR@;1 zo=jL=eWK_uX>^$2NF5_04=K+<4Aja{34@$G*-V7|=4;yX^W|6V#cURRiu}x*>-k}Z zB@oXp0rKr^!J&1$gd}Xg4BH~r0BC+>dZnU}tR2lqFZ^BWNrsenT8~b3`5y~-r$VFWGV;?ZJdN~ zD1-_joYUXm?DDE)j)FHQ!;;iPimDPMFvqIyN#=UN6Z6tUjvf+&h_*!4uL1nHa*0SM z<1~#z^B9>CJ*X2pz{GfRN%#P&QxIv&alJDikZWM@7(^3_T;Xkyn^gtAMS;BXQ>Rgk z-uum>wDk5$H4LXxu#uc%mlPF83*EF8@~W?#Jj3rnlT1FS$axOTmX~?Mz*;B<4SC4HWYxowY0eL@RpuEg51QuaLJ0H&OHBHNVS;Se zmXC-m1`M*_wc`s{{r^x~k!;KvbPou?gf!-$Y|{Cq2pdN;jPLx+VonOzi&riH$FnL$ zc(QY(Hm40GN%3tYkZ4bFhK4H)a?tXr1rX-GoFY1>dJrPE4$~)xB*Xyp@Zn3aoAE4S zwj(k@7;f}7GJ2nhAc6)0@-9aVFm?>ovUf<*pg0&$!uHJn?7Bk`bhZ|vO{@&D{&T2d zUv&=M1O&+zVws`BG0H}RrL2qY`8N2)&5k`4lUk{7Eh##HbxEYu~49B|IeHn@n*&upBlEUThQN27mLw9 zk1y+&F8t_6fEQLiq%Hd?{7E1@#@uw#R&&b4d9A^k%Wo3-jcU>vyOrFT&MEANfv2F& z2dq3OF3_zQZxh&Y}K*UvRd(RA!wR% zZJ>-yQ_Oy)0BA@@o=~TvR_OR=Y@YI)c8DaK*j^0q+aB6pTw<)0Fe0D-S{R4(;E_5f zA$2$me8I2thGY1pM_ULMQfp8LzB`FC!meM(c0I92{)ncwK>h`9IT75fBL@ZXNycJH z^L@nExqJwcb^{*@I`T7ycq6}YVv7td)hv*4d6vg)!Ls5u>m*tk`I};E=TAaXZ3vZ= zufGc@5)*SsT-u3a@PbbKfRmlXaDOPU0qp?{-hdJB=#xTZ=Wv0caZp5cZ`O;6m7o?(`~v0 zXH`WPE|9pri(n~z4|fsT7n5KD)N&J>;U+=9*gRC!WzZ3ody~C)lcu3$EJE%hGBYc~ zf@w}($(3ohgFpR~PwmpQKJ4Ibie4?z}Me?G8}i9Rup^g?3UJ zMnd;=2-A&dkqt@ah?ErBuN!B#7j)yv4_9{+9n8fJGjMqeHF`5}+q%cy$}$*N5yrQj z&80~b-~1Yx*qw7B!@7%Ha{>VevB4zP>Zb0Z(ipqysE)-GB1MH|#C%p2%h}wO1j0Mj^QDUAbALd;PZe}Lp!Vbv>)e$TS3_*BgM0F+9gij`%o3I zHnk!_mCARPr!|u8dvJ<7qzC7#OM7sU$%Y=nF)}X-3NpW{P`RH|ND%eg?+0m~>DZ<$ zk$nkH^iRzJASG0z>5$}#E>2oF7i*Z(IGf*&Mx`-tH&;#LP7%$K=mM<;sUX0wMTDq8 z>!Kh0A*yh@1vmrmOQ&f3rkaSU=RMH}$g^zDbJ?U9KLY#q z;=I7sy?DN}?Y%^HvO&LS}K^@8c~-uzT~1APzldh_D!0F!5y z%$q(I-Fm@xXsf7qK@^uyUJns%w>~1pY%&p86d$1p{6{)V)qmEIzQFN~|9hNYFLNL@^*8S8}w z1&N0+UPG)0thL^fBs5g^ULcBOfNa*hSdQz2NCKF z&AYK>;SZ-YzudP(Q_^WNv7g8>!UsmOHCYQ)gH`e=c6s5|kt(fyz}iftr;vVRla=}X zM22ayl5{NQ6BtrJ;}Z7?`qe0k+{RFJd(pfNbmYcohDQ^!D?MxtTNS7*e(DAIC>|V1$@E%R5 z)2l=KxE}15Ndx&cWaTZ8Hcc4F&t*DT{AId+AQ#8qi;oTK#WtF|$B=_KXvG0XKxd`G zj2Q04PyXXGF{ByLHaM}o3{Wng2%V4Is&Dsf!tCQuDOF)gVNJATmU5t?U!3z*<>ZHo z%nWG2{l#{MUf{gyDw0I&Wo4x$unl?~IC`o-Qm3pKBvQ?J;f@s{PbyWczOrE86S-xO zNH@Y9%D)oz?l05mf%PHZN4o|^wSls!tgVoFbr*+K3|Fs7q)tw#b1|9M#raNFwO%!V zj~-dyHI?)Nwy$#BV4iyQ^1;F}Ap~`$F;x@8m3u;m5ku`?|7`p)U!-M(3c4Dyb6SuoSFiq4mciC!) zNH<`OA0gR%yV-r%K-DsuW)FZ8Wg@?r( z))q$OdB3_iA^gk3L_34<@CDJF z3JAFRF`JE7Q=s8BaDd4by>q-xLf@2ERxcfnhzUpuolv(>MVp(YUh?nd_H`Kh!d$NM zyE9kxH`K>#34jCRj3>U=&CEp%so9k;#Lts)^i<5v9so)V7difkGI6-b z@SiG%bFtr}DC2-uBvAz}NLPe|LC3b9fpDRu+9iat#dpGyZS%y%M#F6qx@Hu=o$VYYX86mJI9h}{==KH-te3GYbZ;WQkA8=8oprdi`iIcDlC_ z-LFR|dvqj>hI=fQ-6KExHQ!Ng+oUBzJ^I5&BMx2n9pD>s%J216qs4ztDx z$G7U$4pC?qULCAiB1GLa2bzjUl<3+enmoPF3BY-n=sSSB~6T(K}DK{EyT6~a$m^Q)` z3{e^{_N5#@j$dQT$BDMXy+s27HBtG1-5d%i@^i?!zj&)pj}zI(ieYgfa;_n1H3B>6 z2;v?Ui$BujE;wI~_6AU&i zU5#AV0N)eixy8t_@uE{NZ$R^^B1@tr0Dno;GszgPUeS^SdEK-L90^BF5TlwR4>pT~ zBG*k2fq)Gz?*r5Zl>80*|I!Qe^-t!sY9J=sNbsiXPvuabJV%}vb(z>Rj9~cpv`^}bd`1Evv0(`y0jEq)CXm+N&I-Z zY?25W*$+WU0|fY_U=&Az{VH-}uG85Z35IP$;%zwn(nj;SHa0$aa+1gx4C2lxH7mx6 zjHMu|h8Bp%xlgQ$%$Y2D8PiVeK`p1J`tZTk54`%dlZ8&}gaqCid~(NRzP5)ZiyWf^ zTp~N?ITsqHJmP^;R^8>e z)N(@XGw1D;hRGh~p?)Z&7!rwtM7{TvXl?jsuzgk4Ubr!QoUekfc`sP|vRS@pb*0xL zyw=s-EeDrke3io?#fUr^DZLzgOoha-buEuou=2 z0#v-_puDm`Of$EhxUt}{t|uJLse8e}O(_%?%5_7Wi`on%ofNIr91uv}_Q@TPVNL$b zxsbxtB!Xjq6TC(Uq?1=Vv>B-xyHDrrZSI5c(jpE~mQCl9$?K+bW#tsXJdS|*2 z@a}mF0`8)c9{TpcrL>q9-Iud-=@xC!w~(HO7Zy`;qRy&_4U3o2x2y=Q#kv53Q=jIB z)hGZcSY_hj^@c_#ROU(sSe5gK-TMeLRrD`big3Y9;iqSE?Lw9PPC=z-9f~yYu=|~NS4mzYrc7AQ1&yqlDsD)EZAqHa^xZaapWRsd)Sa8m6NoBsX7#2G@2Ot(Fg$n z5)mqZk(u`)62&XR9jP2mU+XHpszTtC<6D_PtxP~{#y}H*QlwHAcHJcItS_d#S* z7a!P!Gzwklf=gz+B9huq#I5sv44yQ4u81%+xuPsUvSwc{D*ZdhdzXv$g&xS!2{EwQ z;c^5DsE2c^h>WEY#pGg)5U%K&rTFN)Ox!Azct+^XP{qU@#g$SA`(iVc&J|*Sk>Ow{ z#QYShjX~25FvA5`h++O5?z%#Zz|Hvs*mq!CRz+d_1*cvv*r3~w+;6DFcVnB~H& zkeJ&|o6aq^W#Sw@>XW-*5L`4z3^2y4FjC2dhVWCgv11O`l6^Htbd+E8bsQNg6oT7u z@x`cr3e5-LvzdjWiMicEmHipI$Qi&xi`-GjJp`T{;B=enEh8Xh=oHCP!#)duU8(68 z_}6ezu8Qafrv@GJ2088~jR*i>hB*xg5lUvlF-(cf^ui>gKz6?x)wk}2BO7YHqeX;)QI zaF~E}XHnHC1mc812$+jtw|ti$t1{is(;=mxU|H1IM<$OsG>2>~mdZChTocgZ{8Gd8mj>-O}$8ZMu5n)!$9S z**ht}0YANbhG{C$JQRg&vyGKUlfkRV>oX zT^^Wcgj4PjR6qK?RV*%Xd^sz-*x1%_ut?G_5xtCU9h%LDgLKgX!>7oRB_c=pSjH%l zDUpntMnt>NLfjFnJ+6^!f1lFHcpbrDs8I1rIF<{&gyRsCocCb1*umUtm^zqGfOlYX z2+1*dP8Sntj$(m%;`>5=ywa@{UZrj!$rm|fMJc~`j4c(t%qj03GLs@i@3Af})NSi) z(5SmgMLQEMg*rERF{m@wu7vee0SCPK#C^qUeTt9>R9iCS>0j(K`N8#~tzkQ{Mg;pJ z9-J@y9Nok;KoD>~TPhUW);9okvjtp@)GP2beF49BEDJnsTfhf$ zV1ej>^WU~kX)zOAOuktlLXG*APBsjSR6}W^Ws%B~0w^)2BZwSk`pVOJ*@*GO=Xz%$k z6cY%5`=~G+Pms=+s|#FB{UM`kK$mp@-9FRxPu7uFG@Poi_Xr6_ZgZyrfidMm7=}QP zT&ArSZR8E*VvsSxp>eqbV$Gm${T@Bz2P=^$%0>G=vA7CGZ%PD09<)T99{skhGoa}F z%MKM{vPqYWfg<#cR#@RHy$tR%`v_<-sGB*kVMiefuDTf)9ZJh(a z--(E}BfZm7NA#nanZ%@Sk&2(A=1b60iP>YpDO)Y#dha2NxU2S}MS?=k{17x&dSnq- zL4LhR`1&}#n8+Ye6_|AuhuDNFkv-40e#Fs$&2UYq7?5UATR?fqz!!(3)5r4Xu5IfNV3F|{3VL4aO`z*&q83v@E`Jpf@rEqn&XP-) za5=(5OGMu;w)ID{8(r)IHW=clA_5TTgP}yOTqIIu>uZF~S5aX|sFG-Lnn<>>mS2Zs!R1m9j_HA5}G+Q4Ee3wT`@SYnd+Hmo5wjwFKz3; zFt_R$Q(Reb4cDyRdW{%m?mVP?8(mnV#KY<@8?-5NqY&hmAOn23iir1o9OO$yx)EMb zRTt|Dkf^XcqC`As%eMaHF&SVphAb81%$B2Xbbva*D?U=){Y%AI19+-CTphefC@~*& zEQ*An{0in)a7Q{Og8TEIAt_%*vdJ}tINigrDpYY@kut27oZ<9D%j z%S3;}*i_4m>qHx4K~cTbw*G>B@y#+35>cps$uAp*+_8sQwY>B?ZsFQ4kkGNEuOY}+8&4f>-( z7>n1M(~V_x<-lu2mKmC^nO_c~0N|;=G%DNrn>UP*Tyd>P%k)lD{lP>C*=r~}rvAYv za_r5t)+?8Uiv!W~^j8xo+W|gOf7v&z)Lr-9*?mIww?SS`XoCKPrbT%CZQTkLjF3H6 zh&Cf_>+d{VnY*>zT@|W;Ya{IJNL%2V*usaU3_-R^s*8FsL%T66I6Gdxf?Gn~vO=UA z_j!yLo4epAH-lg2Je$C_{^0>$p28%I_{sm0?iVWGp8mn$C{wQEoWy|ZIH|6D8yePy z*NH|3x7{Y?;pI&23Mhg1gV_MV-w-RTzHR*zBZEZ|%JM2}um*WkrnAm<$wU=D2mc?b z;#`X^ggTI9C-f)wL;2x#qLsOP>guCaFQe<}MOizbCG|J9sp=UBSB~95-2rEKmg2lJ?1y|}CBKY)vQlIik6^l;PQzsDAiKpn z%Earre*f#wQd(W@K_;pU!7vKW0OAUul{xsq2CeHx$$cOPS`4mzbc=eSs8>vpy#9J& z`|^8jc$U+X8tEBR)orCW753JJw)HQ*xAn;M2!exC(gveg1apSC4H~i07`QW#bN89e zNH)2FYx}Zp5V>Zg<%qD=GZfj@zj1K88Uax^kVsk8%6WMq*LRP8`n61lIamw z4mx04R)ac-`j&>&OEw|d{U&~5Uv?8`c;!u;i+>Jfo*Klq5*k1ZNIGAiTXt59gNKH+M^(_C?FS9{noaA z>9z}eBRpK9_L@(fBDaV>W+`AK0IPdcLmRjU;&+Uhk34V-b6r7`nzEYaqUtD|q;g-P z4gG_UPnG9ZlX?Pr1ynJ=<7(MfVuLz2qzfv#zfjGXA)qrsOR88SQh2;Eb#sr;4=mTL5jibw>w*S#0bG!W)`(7u9^jIp06-9i%9cy5VaygQ zwMH#^1=%Uf8Mg}C-&=id6`l0vv#kr&+RH0$ zTg4c^`Wv^3t|rgBa<3j;8IE8M+C+8q6xerHLcWCUhBxua*)bip!Gb`yt&2Q# z&REMSckWuz*6;j^wIbD+*`lS%RpI%Rv)F(|p~z%!qthNod^&(3#*BE~TG7UD_2IRm zM{C<^*q~0UF8GNVV@lQZc5ctm=XTLILY>e*3`Zk3qzXLEibip5(i|LyTcRYO!1J(o z?*0TT<68#g4^+%dBMmlm?xiaVbnaVI2fJ49sp9~waH>e}=C_S^K7jnU^|ZM?zLR!84v^w=cy?CDCBu|f9KY1kpb46cQD2;1=1i>lyC zNBzXr(`MEv(#F*^McZoPZY+unNX#YF%Ar65w}Q)$L7Qqb(GTN`^!51PK06d zmd>_X07>Ro^Hdb^ihgr2X!W+I=>LDz@td0mTD7f~4ajrze^m63@Ya5cpG;jn2?XI`+yQMwgWXs+}stU#u15~)U74Pk=5 zc#s-T|73Ns!rEmTVW@$4;TSQOoVtmhr%N`8E++Mb_IjLH2v6Q?h;}Cd1)kg_T8;By zt1FBsDJ?{TZw!=JA>CPU0HYLYK}1vqfe}{E7Z%G?n?$m)CsGyE86Xqy=3?^!cMB6h zP&YG{$Tqg<(lI4vmAG;xV{GBO#h?OjY^p6XAVKOjofpM_V53vja^bTZu14Zk%)$I- zmE<>fQ&_ZnI8WB~9+8UeVOy;{>Mlp$!%g$T_i)kCE%$Jq>QOvtSpev@!!OS=U2@viNAlQ_3nf1t)<}_VE)i-3 zBQ!h#0{0gm#miE3m|$CN8q^_Y+*QynN zd5fWY#fTAs#maa0gZj&=s&8v?iH=g1%s|r*r1vf{#k6?ph1d_YuliX z?qGBmz{jk8Y#_}p`$w-&Bwx9g1W#TSTGHe(%}B5C8YJh~6^sKGDheX%rRZ(|t`PWx-w(z<69(y*GR)qwf=!`|WPO zPb6LHt#MJ2)>C2)^$+%4QIU>)hO+o@#>ejy9a^$nnYNXxc-KZ-MK=|Wi+U(3QbZCB z_%~_Qb5YSW*Mm#_Wu3~)wu-JslIu30op82p6>V9G`clr>Dx73o>LC3~!y&|5I=K}N z+P~V$T^Cy4FS3onf}Xov^@Nk$1~+#2fVsCb-pHc+MUFXYJct;Y9)v8+M!f@;bmjaBd3;7KBqU|u#1E_P`$Uct<+Yl?-U+2wP zBd>f!2#;s5tq_(;Uh|0P+SS7W@)PpZ?c|XiZxAI9JR*7+zj2p4A4yL3a{U1qv9^3v zw4UfShpmZOo=>7tJyuJED1#LJw5<#X1i&6H3#icL_(!=0`?^PkpLto|4|Cu%_1yhPa6DTQI0 zj2k$b4go~t!`T(Cit&U`eVmJ6a~~HYeS&cF<19uHNKpsO|Ej-0CI0r~oC{ff1y4`d zYA4rQ=kDZlxEfCs*Sw>52#4fdJH^m+h9R1uLxRJTyB^yqvJ94Kb0S?&ZoJt^ZUwx< zA)xZUGI+>dyF@pbYjgs0&$B-8D&@O4--0lmEE40?zrpagc9(G4BFM`M)q1o`4D?z( zA>53ww$)ipO7?$(8^csS!DT_mKTYYt9R5!{A=>xl_95O9Mk+@AJgdrv{ncrhiG@kt zjcg$vAQ#K=2sq}iDz zB7KSnJ#6`(=jce@W7u054!MruR}6X}iW9TF8Hy(pW&%SYQ!byku82&osjjrGZUA=S z9%i{w=7udnFPWHeC>#wzCR-iIP=nUM%^T?A#=W3=a-6tIzph8VSD(~N*%Y5g?DhU0 zkulkWmizGp*At~6J_-TVu&wS5>LynNYXugr(=#H|DDE&J1nn~ulIf|fTFWjaPGcGF zFIvhQpW%Sr{*1^n4l9t}g9XJ}xZwc70c8QCUq2(-8V(7hvsxW3dhzJE@g8GVF!fm; z-!T7KE-hL0EEoP!V7^4#>VdwVf0omcZ=Pk`$r5BuMW-_HITjh=if&!Z5|_3V2I2+AExZ z;W*jZ`HAOc$GyzP3VcMB)-dPdmu>Zg>^ES}fdxZXI%G*~P)vEnUT$Nxey`}lC6%~u zmcVSC67>eW=wC!V9}K7ViZ;2nmD2!TION1oQoJI2c{PGymaPauYE%^tghjw`v)EDbI7vxg_vZ@I0rB*Zv1KS@%3IG7M`Og~?bitnW+Db87na^YHrmv4_*h+{Dqj z_S|IsHhV#|F>DzsDBeJ^=pn^%u&SM35aUv8t2fRQqpsu&KQ|#gS>E-6=)-|XW@kXG zSnf)`@q$aTX}c;*IhDdt+3tcfW$l8%s<$q2RlixWD;3sZdWaT5E^J$U8q|?+m?IV@ z=jzS8?VAvim%PZerkA}a+L`Mt)z`Vyq30);9q{iEP%wauZ;+1U?JtTJJ~k|BkS`K28CiqqI%^_O39 z`pA3ti9!CWkM@bIR>h&hXlQT|lmJ7OU*RO%>W_WeYQI=u_MEHLtsfWUg{9OfTVJTdmwGu_{O)t>QPhP@m8)kQgItJ^dr;*1{UDlG zIvD3cxHfzKv1HK4k$KNS&NRMzQ1l4|stX2x>T-yWigbzQw5A}$M9rs=uu;!rFy^u7 z5WhrhJtPJh*0xICJ3pYA%(eyPj+W&fE)1)@C9HT)Kd1&I+*F=S1`fii-wlev3QHIhHD82r5G2JiS*%SxO zA6^&DC5GC;O-mj;ni6Wv*If2^Qw;ifUIGm} zDOxxR?T6nKQYOA7rW=mV1+s08MseX=Jn6;Wx5W5gR24_%VPwM#cHZ@EmAGaMzM1;A z*y;~?ke%+xChv&Bn9x|1j(vx#lFQx^n`GjR~%tgu`n&SsI67 zD^8~mR4!G#p{eh2e~cptkS67OBD1+|O@O8v>Rb1peC0jS+gv78DR@EYe*CCl$KPHwFwC1GpyhHV z1bA{0^Z`y!^%+p$y*%=Lif@ES73(*ewyntxD4RtI*t~jO1S!g>4k0GAU8!+tO1zh~T2539BExop+AmI`7SyTr@#ITvtvq?3{vo2)zn&ZE{C# z3X5x!@*$)Ag^TA;kNQ`c;4MZ@_>f~j@rNA!@B2`6L#CUlW_yI>>mQ1a1>We$aE^?j zl~n>DqW*SPILYKC1@JK-6C7ovqzZwT>J68fNQe$v%dC%hZlWC@!TfN_M?9+VoR35X zP;?qlbk#?k;%@qgOG)4ONMxB46E5d&cy=YZplDt?T6-K6Q$FVRoM9h}wxDbIq|pVB z7y;u=$*}lhE%;bW^YQ)SRFIrcJ{Dvbj*KM`3*r&4lFxH=!!kp-Aa|4;Z4 zTl@*X2Cn-=6dTcla_}ie6pI2x^8&=bUBBn|FRl-T@)y)p(`$(BA-khriWglK;7EP` z)ZNAyYQ;IsyP#<%^o zpNV`QL`SK*y(-c5O8+q}t!1C|zUlqaFG=s8J|KNy`k?f|=^HcNY-d|DA<%No{+2J+ z_TDRIaNs9?&V%XaeJ+L@pNC3dxu@pBEggb7jdA?*?VpR}J{~H&sVdY3i*(7Cfx1qw zSg7)_DAtL8`SItXdo$v>_{+v$a0DFog*tIB2ZVNg!K{3vO6CBmmN&Y5^@1dO{O)6_ zMYZ@2OI?3OCGhit9Vp!+8O6}L zBA6jvt5Vw7)+|kl zWbdyyw|v!CTsVJI;A!VqqD#KF$aG(V%E`48B@-%0VPeBkEGQ|gEFdWhV2(iDi0f%v zSK{h}H+=FknuW1(AJ7+vUE9~ahr$Ke$KE6Y(;B_$!62QN%IAu_ov#a)|X6`$5WRpsCl zqVs$YdP?*JpeW$5)+k&)UQbt1^KI*@26cujfsH9iylD*V103Yj3i4nVOCBVqu3UdY z^fbOOsH1?dE0M?p7k(vXW5YXqLi91pHoCAu5l#aPUfs&bB`I1xybRHWQK~$XKzHZR zWlz0iLz9_bb32GJUyD>jQ)n`(K3%#LSoIVCeAU+?&FK0u2N$qKg_VW#!m#033g$5i z(cQe7pycm?uSFN!7v?soQw6-qqhAY=>8$}8a^0usk83T%YhQGdOZz&W7|Y^TO3`bCAquD@RFKzp(aHf3EqAZ54tjy4EzIOjxZ0qJf?ItCMUO(5EVP$%u)$ zp*#XW&~W4=#+Jgm0<!IKA@hcB7 zh$(;>I2W;Qv@fIdg4dGQpAxOj4IKkf+g2T={&?;^B|68|feehR?GB$39ZYywA_HJp zk=xIuCir`v^VmvSm1HG(r*fwb>QpWQr&mTSFN7?h-pC#nyyMFj-*P(A^II{+9A_Ap z3dx4A19=XM>hbE5TfY?@4ASZx1fY4vP)4gffjX@VZE^p)L5gw{543rcaDX&6`i^r^ z+28R|PWnz{nsuzIE+VRdmNoG(z(xTBS|QBpN&>eXe`i&PD;Yu9@|_sv^BUiL2Myk9 z&$nV(x3j)SWGl4=Y^zj}(#k00FcTt6j;R&RjO@jYT?Gx^xTvx}pNJbhI27BO5B{KgEkDd=)^gd)@>+hh?WpBans;hN zb{n&u%i)r4TMHnaRx!q8D2K-b51r<|HFHk$U|5?^i!^n~ViSjFwQ43H*oHTRE9WK- zDcqoLxmhsz=4sK}9Du~y(&>tY9f_Y{N`uDAt=o7CjmWG5RI5s+W1Ay*+znl22i<5y=yN8307 z(HJ0u#y4_D7DT@7&x)Kh+gb>|NViMk&zRfP1&y6-Be*M)JsXHZg9W-R9WPUlg-@dS zInlwktupMozzF15KOol1oO4|IxbQPBl)n2M7i=J%Vphv|rwV!MXi6JIDJXAH=UOl+ zKro1D1r9i6ogkzhsA=Dadf?Xi2Yz>$^n)lhYBp^L^yYFT1jdx(}n(gN{uhfktSqYYMI0MSTg^zkVaL?I88`*d8YsBl*FYK>fyPduE z9eHZkym0!Sr&&=^SwtBe)UJN^oZQU{D8f0~I(v9iZRh(QUu{oXV8;<}X`amXcE4XnD| zkJN5l%PNK|N=e;wdi{no5A9>`mnyOU>3eyj6;!i!!y~L(Nrjswuy(^!SW;F3*2^tA z^T_qxgJt?Ff^h8%&%}Kx%Xg->R;WS{pu<&pXP;U7{OMKKvmW#gA^!06UF*I-xRn(V zCo(X}`URF5173ILQNB{dyW*oWd-m5pa2xvwA})`~8yH#%kgPv@n19DitIs}p=*+<< z*|*T%mC@y(cHgGpRLMk;Fznnd>w;fs0!5!Zb)fbZ4tlkVSJFpRwEAJz4apja8$j9j zFWz?c;6YZVtZ8(~+V2l2tWC0h=^;9jP6OTW-RT!spWDngmFtXndfUTiw))@z{K@=; zKG=KP*{AMi9U(~-UY|X@;p~pv*=yI`ruO=+r+0H?#sVt$9ISKgT8<$AjavlZpp>;$ zS-27x9qN3`4QP;+RF$~%$2Yb%ltKP%w+qk7?#5cd(9$m++=-N@HeN$6F<^WX2k zhYiUU`A|Dscb?f6Kx*SMaBly-9>I6#Uxau|5jqRb-mq3i5?@2=G8mLp9J03f`ZUY;swvt<^Ab4ieHqcyFNN#uZ(S6U=KD33s zhn7^W`KIU3?tOv1cg-5`N$tVAYHwY~ihP@w+LxZKy`S5tK{1yCQ3>uL^dVpzSarE? zPFm_zy=b9Og%^4dTjg|;b&*vkx1YZI>C@{td4lnU<|N=}s}8oUJI}3-AxLul7pY8l zGO!zen$az_ozHYX{zNKE6?NSeX~O>f0fu8qRzvJMnUtgC3o=XUUkY9Ttk$B|Y05JxiP0fA`^71ciZ;OR9loY}=GuzVmZH4s$tv?L-^ zyYBAq53V!tDu&|{HSo~m47dxBj7+_KdObd31yDmE+=VJybMv`7wiRR`z=%YmI3YVGa&rf5FHfE%m?1!hO= zCL%(*P}gLGr$fQ55mzQZ>yg@}>Gv-_!|Kb6v-x(+%1-T>m}E5t9hsdS*yh=(ED780 zz|-;U)DCtib9zBuw*dhmRr8$GRz{{*y=?Tv0t_7gPj!>5W>#HZx1NCy2Ir)9^Ecc4 zoYWrv)7>a*@8P=w5}mx7ajD&`?-NukU(QK&eCdp0vq|KSt`)1DWHqZjxcC-C5zg(p_spifI5}7|WeS_WKX^x6iMrYo&$$2e zR?cc_@}O}kNFC~9V$@0~VN|xA#vJy${ynXeze+=Ur>0)w%}g_;WUZEDwX_hfaAK5r zrrL-0oPF+L-1^F+^LaoMxuSP!XTPa^Ib56na_>|>UMbQlKu4g?$0u(+`>WMP5lTHP z(D^ie`z>d7A5!n|jk-+ux6PQVND|a`b@kt56rq+&cc!x3*gKr`Dvnr_N#x3$~1v@SW3lw==tMtv$3FhYBl|NBX3;S_uKB^O*-Z4-XvBa9`%^AT-gYZ0pX`hgYEnYgAs@*F8)j8sQ6vi_h6LJI}7) z`hQq^59q3{D}DSb3GNt#E)qyOM^E%FiVMwv=$IzD8$}=iGC~q6V2o)t)f9oj9Am(M zF$PR`rDMl-oWwnewzcQig&8QyY2jN`BP&7L2YadV zoJr9W>z6~oW21-p8t+j_`RJy#wdW3bk6b4eD}a9_^v>7eD`-Yi@#BZ18@Z(YgK8>5 zbhTo+`lT!9Hk&(hPu$v@^~^DgSF_?g^bvD+wC|K}KqWz-U=+M5n~BxaU-& zF`sBhswB9uq=w6cZybb(>l{XkP8iacJ--OYfkVZ2DfFg zh98QqJQzL41^!ATkrV^{x3toAnt_L|zf-igV2~AyiV%TJ)X?1gb!%%jJ)3a<)kk-V z4mMk`s$%AZMMbJXPr(3~+VvD2Sg0mh&P||P#l3~D(;VN;@5!0^V?70nbwAcq1TY7F zXg@9Au5;n@jg3K72h#Ry*RO+|%r>p4VD@DDbj0AHk%Sg1xtD0BUCFeRu9J>YweKZ_ z1$@`1ik^W|W9MMFv%eTeq}kE1K~LR-F6^N)?Mz8e+dAQZ6~O6$r-R4mj%G8^z6kuB zHzE8x_Lk0BbRU-^$q9xZJwiG_Q!CfWFjq1HTZJdahmAj#o-c}S(TV-++e)_0%Cw@4 zoi?$o?XT3F+hTuFjeCnUTg%Q1%%FjQ_iqlYHAs2&QB~+s%`4nawg}8NOOH3egNC|5hBZV zgcIAm;p$WCqAM;$+D+zyA7qzpWq)>6aUan?_|8Y)rZ-b>_Tic+e#%m%eZ+O!HvYMF zhU-WtcH+56x1L?PPX6PC^?Z%{_7%(-RnS+A4mv*FSFp(EFZ+tt+aiCx5pr)9PU)?8 z36|W}?k?VR{9R&D0UcWUXSWF(XY?!k%MU1CD3gXA4A(&`E}KsXkfZWO`w);M@O5vg z1-^(!`B8tes>CzvQUyw5f{POmzP(Eb8z(~D;&xEjg*FCL|B;#lD`3+LzXmEZx{8K1 zX~MurRMVx5-%em9U%WErRBG35#Gi3;S5JdsDmUAOhFb4z>eeL$7)4wx~tX<5{-h9 zKRJk-@!qRVZ|35XB=oGl9wai-T&JxQdoi)!>j#S#h5itUcm)Jcldk$G9yKF~FC-vh zthyQ9&UkwoHADI$)Em7nYSEv>5F3@H9~uqEU$s$ruG0>y_R*h2S9Ro1f+f-1I7G0* zt?1W_T{In+{8@DC>CeF^oI?SDOi(EppRp>qPJ1U-xA`?=GGq&{&JGd7)TDnCEMI2m zP;L@gFjTYxpXz|2JvmfFf(>|ODCf!9zfVtDZdZf0A*8ag2?x0?Ke%=i$Szt{MkK}P z5T^Bo6|g86j#BsPYS5TJUf2j5KH2KesIh+$4cnQeaGj2H!}Vr);j?jFsYQPgT}(() zyhd_hbItm-MrG4i9kod6(?hPZc6?1o4j0Wwgm(lxVOl3xd3^M_x{JrIuHece=I=V4 zuG04A@|OI7_-WXO2YAac`;mX1K_*bRL|_XwAD`3~!EpK;W_(F``C4 zHXdqNx!A<$YnE@BkA+zl)ei83OI)Y36Qcu|stw5r&Mfud2$60l0{^!z_CT}HPH<2j z_GPte1f#R$D5OXRYOI}w2@}`OM@nMXt3nRQ1g|3LwWCcKi_vOp4)2d%;0`L|*74fF zwKH7%cDjID$G0pmBYA&(9vAni><4~~ZrTSSzUJh1KAYipi@w1{T6jS+L+8*7vTNh; z;h9uI!r6@xEu7`xL|p%(WG;*^56Fy=QD}ZADTD6wMvB{lzgCSD7HbzuQdji$=19@Q zVkGF}IDrHv)nF8-16@an+ku0mTCCm^%ABp*XeHAypQI1_1WEZ>$z>pKviO^YS*8Q zGm|bGEt*^P(SipUcF4Z%K?cxn$8!Od^N9@HH`-UE!;8??xQY_oV&vAgSenMUjdNGK zo!hbC6?B~*FmIZMT58fB!h|Uh7HRLH#8S!c#KsIrJ5uHCxZrY+Qf!3GR=bS&H&(ScjTDml4E3;2Ja$ z*SW)94>fHZSGX(3i8gt(opCqR=wJGFS_5X{4K=Ndzlg8c<#8f&rhiC`sDeS6)(MR9 zhg3J$xl@n)8v2_UFVb@T?@${E6ZjCRd6D{@j|FpQ5i=P)d{7=A?$q&u(b3Ysi!6IO zY4Am}M$lVV_v}QRP-H~tRnj0mTa@ecq_L`BjAuI697Iek(%5vEJ*WozY=JIHIC#ti z_S^h?vM7$u9TbV~J{8@wf<3CJ(BMoHCWMmi%JM5JP~<>ciB7Ju_taTuda5TUQR6DdB1rAUz=kSxMcY4b&`?dde!HEll1>DnQ4`2 zh|BXdHviRamk=02s?V7-n5^scwkI{B#!eJA1Q9NDy$dyJU)&Zfp2!_z=l_FSm%hSZ z_OjAPaX?Jem-%qQVWiYS>_7tNhnoUFN3lkIoLF2S9?l4!)gIl6RgAQoFfo_gpYqGP z(?h+)DE*ojer8_9D;;w~$7<{(>$QWm7~zRDru9b=I>t_fT0TjnPW3l*ZfRvjnbu0p z$5=zHm6DQ>z=V8jlI!%vx+nVb)%%mUOxo^0n2prLpCw%WA9nw15I8ca!wes-eyv{b z8h9AY#kD8)*KS#3#B$>&G4y8?P1qL^cvCiELrlRt@6w{FX=Os7!ji69Hd%=2{t}Wu z#ZjuRa%hobszff3%AG9|VFVTv|2kxm+Q$%xXH!1)Zs?;UQ(N;&T@<1`QWD4i` zPfZbb23L3ge>1nY87L`tuG1f)iH=Y5#v30-sunyVr4_7Z>uKZbW?s?fxa3a@Xdkhy zRO9a911q^lNNa1TD4=Sjcx%F7IJLMbsiLfC_H5##6Y@q39m**z-38Yf015WxdjyO3 zpZ?$Jsp_qJL{pV{FE{TFzL%RHKKQZBvPl**3HD{MUe?~=vANisn)PQ9=$E*<&)q8! z#q9kvE9lz;_*V0Ie}AvYYV~T(x*ate@P8M*HCuP8=J<2b=T`BS+4pf5&c6Q<0TLRf zI?##Hx~tQlBKm#FeWF=_`3Lu|jz){F+Z8>}-S@!8L7=NYLNZBhy%@d=>hgUe^=5xY zIMeF;V=_hk{yvdx>8%cy#aWAwlf71;pozPsL$J+t27wiYV{eTZ6^dP}Pq&yLtZP(1 z*8b8!bW!6T5KVQS0S%tw7wDLn0EXx~Rkxoj!d_&h7RWY&D1~m!)(7~(Jn?{NZka1Z ze-m~FMBu?hSB;XL5GA3$e?SCv%b^+%Li`}o;%N!Aa-87dRdOo-XrHNqA#U9_RRk5; zX=W<&pCYxjze$t>fu7+_cAX)J4yr!D4^i$InPx5V(3$6shFn%kLxI($?&Qjv9cRN@ zv-)_dki~xI^ak)7(L8z*aZ3lyOY8$kbXkoxPiq(;6TxNJ{n#i^@VQDW{SFAt;wH2!L zTq}^5tzF$U`_@L+uBp4UEgWQx=Lnw1#t);7H;oda=vBArT!|e%U5H!!m88gE6=}jH zs}<9^4ED@)F5z6BE+Uqo&TtU7{{JXa;e?Yc+_C5w*Vx0hg9OvU$m@B8%*uR` z)xjSiY~)ngh!B>jNKvGyTTj;+;lxVxb)!~lU%u!Z?8^K2%etLQP(x(?eAQqkH!60V zDSF#Pe-IOP4|bf2y3XBB?EJZ!gd4bWCg)OTW{Tlz>6gipdkb6761`xt7>OmBHcQ+U z3~JXbQK*{bHtBd<;9JDZD6Yc$dc>sn1%`lAm419exH zY-O(=@RW-I{7odmNZo{?NVl9~gtg75i{|g6G0fybZpH5(`fGlnV30AxAChgd{9U17 z2SVv9M6Q-WcXXXG=q`U-lMKEfSuG^v?2}ta78O@ETl5R2abmWRx4O<)KJE8si;gDq z4&TKWi)Jr|`8f|7wpy?-J+pnVmPY0rK?KA|onf#L)qjpipY0Exq(U8Gk9aCv`??jO zFpk-?Q3TV(VVrmhbcoRn#MP42fDp5qmki-{oji{=z_|kP8i<(cy>61(vsXUXq^bIF zj_B4f6mz3)n#*Guddw9aEpia-Ihdx|I%4(Xu&~)uGP^{#%=C1%cdqCatY5}r8L7IBlwJw>7{7*$DY*}a+TOmJda6Jl$LF4e_Sk)b-jmfVmZnbW_`Xr?|a6*sEh zXOabflHNwL2_Jt@bcO|Gq7z$DvxiG#>iY*pmMVNRxk<<1fMD(=rE{ywB3I6AHr_p> zblEAYXSzuivo~O#$j42dgr(mIo&05bnWjhr!%bD8E!_J5vFCQKMS|s z#={nGC=ufty3RfRsRVhvw?uRec4U2tV8C#1m59FTqYsj=cSsh;Kdo7YG_zmPPBJIfm<3{BFu5%YM7wtWxF|Hy>(V2DhJ7Mrz;*7YUHNTt z3qJ2&cS?r;n_bQY_WjL)R8&$fdbxi0WKkVkqVWVrfvBckw}PS>Z9;a#98F^%aAH(g zP7U}xxjFyVr+3Qs>W$BnbNG+lD)>6R+fLrD)>a4?$6+dl+h`UyrJb%2O|9%p7GRSk z>ZK0qV;yH?Ly%r{wFxf{LiYku)mL&&vjjz(L@or{7a^nE#8TCrJL+CJe=$MyQm391 z*;Y0Md(HEWMy@kWODSNo%y^{NQ%$SnQ(s=m4L^G;xl;7NLD5`&RVkVb^mk%Wc`0#) zz%-?ERLnOLgrP-+`SYl)>rBU*Myj~6wQrSZmhJb7(BUE-Gq&@5^x~8J3KUjxIe1kS z_h6i@VkV%<(s?LA0gjQIHzERgzSebSII;CSRFx_pR2EL8hQwL4YD6tVjZk0@4g5wm zPds;Z`-+4{`eP6xipo{5g`#nADMl<5veci|+{(%_8qx5H6Z5#DI=@oa6P!PB)PzX1 zdSi6U)`X3P2sYZ57^T5#(c2hK^zyh)zE5`4>4m}|cg7vUAR<&BQ5`0lcm{)3Y~B43 zKOeFfBhZn4p#W2wrx!ajSv6b418%x55}7uLpKi zCv@K;eg-Zt;sX8`_>jGto-n2nhH23@u8wXwYBG)4+z5IYfrt=r(5CLSm+CIBb)8vG z?CJ{}p$)NyRb_L^^R>}1VcPjKjmic3R&)Fop1Y{-eTa{bqWOd4@!jX#=63QSe)B%W zU)^1&z=?4u5AHO^>V;GyeYl>O$;Dhx>av)BeZ*oRNBhUoOvl6&m8tKmQ&qAO3jCON)!WOy}sXXKK## zbQ;y;VUc5z{ruB7!ekzsqZl9U>pHVBBDLaSz5u%(=11pT=&#Qo7B*dois*nSgW8TL zFagT(@$d8V%jao`WK0vHT-}LN2{{>F{_=QlULJCbNj$G}S0rgnt>alIvQB25&U!KH zrL32;RJ#LN5B=ybS*qJ#vdXeuXO0sy@!5Joa93&`4_PK=E#b=5hsz{W#=c*j+Dv`0 zgrB#fR^a4K9uaAMY0;Nq<2@QXYsjJQ}aA~m1Qhu9nfP;p?|_8K-}HmT@|EF7)h+WkPnK!$<#SmBQ+YtadsiYhH_PdO0CXQKc;x z0<^RkfgVquVry=Wmmak_UvZ-zx15V8^Fx2FN1p*Ddw#i)7OM%x;VLJZTyh;z2E%X7 zvHdKk+zi}Aqj(MJU?A7nb>=&<#}6m8RoAcNaX+QV?;+~shvv}SgUoZ&JyzK?8mj|} zbR-a>-)c{&+G9MV$hHGH(`AYg+ERDvF$7q%l`5q^)asSY=&OH1fYBJ^lGub)BgzN~ z^gh4AFfxE3S=@C>oY*y*7~TF5o?f$?QM#K`>R(oh>#hCL|HdfY!Kv!{I#A6X71AC) z{|(jcpmc3NsL23fa4b+hX{?)`#D3Kz*bijqCLXV^RL!j=8<4J{Y^5dsd0$;JYVQi2;qw$#k7^8eHK+YT0TSFI!JaZ^Tux%++E>@ZKYr^^1i~C^aXnYvzy$_{m9Dg&_>uW?y3k5~#kPxu^Z&#?IT`cYdqZ%}7 z1c;pW7vO)%m9LpIeFrYsLB4aJni(5Yg7epVdz6=%rwvhc`(39BCz-7ddP8B$S%oM+ zuZoV!o7IeGWs_je8=sb=g1=s0%h%((wW7K8)*&)@yhY|fjIoJyW*>sHY9W+!BH1Q} zl0736k_-jE4O_Fw*6{Wpk^1U_Ht5>pF`Z z;6l~AsOqbAq6JI-rI;SiQcMFjQ9bea8?fRHny)Tz=Qh`A>-iEbTQ5>=9+$r(`L6Sj z6N8n4$d2x_H=oGy^&*`gPzsd85vYW$9DfwlJL^T(aC7(~9`r3bHAy9`PjfH_YiL|M zorG4ZYik%?x;`$luQOeeJaThqEsrdw%d5sc&iP--<6O*M|2P-3m+g=(ZKl!>Mb>>2 z>XM?-8e*d!_6Zr_AT|ieZC^%|vKQS_KQm<2cLPiJCA+LCvpjytgozQD1=yl2sxXgi zg&6h>%9eR(YR7aLF_t}C=mD>p7RE*!;>7x@!s4+66zh!*f*HAH>}r;(ijT@0no<~k zLcpuq*exR?IpHd+-Wx?$u$q{ZF+L?k!>ZzqqO~=Ay3QjQz}Ai2UNXEpFN?PKwPsD# z<)h8A(gK?LAmHy{#+$1pL{)aISyN7@hi(!bVFg|a598{CJlaJi-vJNwhD|&z;q6V_ zbv>g;M)Tx^z$dl5M@DBG2jqWTlO)$!hVhTs%-t6Ik2gzEPjBYOu>EcIuGyEHIn^(_ zEu&qs>nwL-UD-~m&ehy&^k6l=yN_3MZg;v`^wZFTbj~VGIQwX=#kkH2C#HkgjSvdh z&5F>^(qnRXK&Y^6&DASgMGjVVC6dzOveDi+kNM8OBjfsB^_(*r3TO~H zp2in0z{Msim*|J?@q}O>T=E2WH|~5wv;=Q`6bpUf3GPAs27fi)eJ;|uGheTU+xVh( z*%pdGshDN83Jro4qH3_UHf_&;@z63bY7WfdI*(~evt}EYSl-(vZo4I<1mC!wZ%)_k z;x=~dS7A114rbq^WZb=D$LW&cK_VDa(J7~DKfMR&jtb?As>R5F;nR^nFTK+QU64z$jR?Tk~^PAl%P`BsT+mFLRwR=}rihw=OTIc`XZXBgk(TP@Jc zb=HHZh1>FxuXu_F4h`7F!=|V0k_^4$`={U!``LcJf^w&5himpY4(7`J+<#QOlSk*P zo%~c^+9`V2@G85|2uafVg;7-!w2XYp;2ZK#q3dkG$K=!8hjFPN++`!5=5kVUe;l{Z zsyQylNi^tht^~-7j&8Qc2QrwJA6#c64C{z=#wo%93UNPrRVDA@=d$}QF3;Z|`fJrL zkz<3djB-vQ{h(q>=?vss+6vd%6vzc1?Gjx%XS#kjX9}%$bDLx1ff;Tx18?vye8q0j z&B%PNvsw2Xd>?o%be1(r8w`DME{QjH^9k)An30lZJUEFfk+MhRSP?MjA5zEM(o%wW z^!`77)@JMhijwP8JF)7mR}qy=-h)Wp$=7O5KU!~0rTMlIJ8UKQzSueHi4;C5ogfP)bM;w{n5nBcPV}DEys{cW`U!0cU_P}?UOVkI zah)xI)!}`S1=4R<_uAg8Pgf_Kk+U(YG0$)_&4c*M3W*3CK(M%RoDo5~3f#~Tbe!7z zjA(tIJ>mqJHAEv)>ewueX?b-o59ZD73})b+#fPkl=LA9ZFbGb=_X> zLF=$ruyQ`j_X@Lz^nIw!EB8We{^tYohUKBHb)6?XGcBkXLd#*~(EAIo0|h80Zmwy= zmI&aIUc^-Zxyl}ga4XvmnUJR%?-$ZanefzH3&cU??&pI41N%iYtAorbs+?Oj6N^5~ zb+$P%1j<#-c2c+V&Wp1Hf%tP3X7qZkpYMnsY2t@w&i4nBIoSM;_>*dvmMDK zK~TOP^S1q;r>FrPn?BZ6j?$cnoG0UY`tU;s-WRIPXZB-)>Y@?$NOzj9r3yYTycO?xS5)8Krq|D zx1*shK74?mg(nY)?!F-AIy*p9)jJ0`T@L%5Z+ea^2%Vqf0_fQ1#1vxx867qISKv3% z)rbFK#iMLK+V>rZ4Ie)z+FDftDl_?v5X|Pgs#WsdTT++CfA71+v^bG0nDdma10 zVql`_H_nFU*zb9UZJ2N1?LwH9RKSsz80*V=L){koEgnU$1m%&b@s;xk9D1SNo6eT4 z3RQA3q$SJsy{9`kbFl{&cwE&z&JW8xB12&DsPR zsd{>GXUN=HAX)?QNI%!O&a@hKG1!GScinY%IWYpNGH7*b@*#e@0i)T*5<5@H#gL5T zVG_03=+vo0{A#~{NMzf56@-q?EGj6_Q5JP4E?-qA>YhCcNarxf@67xHD6Um7Xh2ok zjm_{r6|H_02A+7Dgu;S{xqN)zVJ>4*GD1KKzWao$@@Ef=pg1GhUM)cdP;fSO691%jB2;%l>Vkvw>5w=g2^aI}}wepB?NBCT? zz;&KM>IEfqkU&DP1nU4p&h=kY0m6F;|zaTQl`Rxrrwi&vH$WCZ)JRY{i>Vr|&*$2x@e79|m3TahI zu;GePI5_4tIy4s(I#x4|iaUaN?KsMXz;j2180HVMB)@X70XnA*7?V2@^5lMKpTKK< zeq|U83QeJX!Tvu15j0+F)$I$O`Imi6w7=2sdY0<{1iuL3xbO|fguKIVYP@0)#Jt4uMQH*%U;ZVnOvijLpp(>NK7{D1fb*7HPM{mW5jy zHXm-Dj+%=-&fb#N)PBl)&2x<^CZw_WNOKonJ)h!@G zoe?clUFRhDf929}V4hNE0{kp(($>!I+ViVmfeU(gBlM9zQGY zu!g@y`9+lj3kmWeh>d~RX`pPQYxfbF_7>MUjZ@O_9M6Afb569e6oHJSYUOzzg*q3{ zgU#N2j*GkE8JVVDKPMtcgn5xC!hC-YF^a%ug|v!-%1E6c&3b8zNFpj%_IZ9n$DHRU zv~zQA;of;3P=>Dak`voidzfP|s>|p3ZNJ=1whp<%Q!a>>+#hVlg)mEWQ+s|}%`>}$ zHNE44XlGsWpxn?Fp?eJ-JATlR=_5ys8a2dqUUp)GLApK2HOQ71&Vi(vPC517d_l09 z-JhZ3hP!=5ktndb>7otppsFAGTbfM_YOmSED>%bmB|7?^F1C^&GvSzcs<1|z3uaP$ zk#jY5kxN$ZUleU7S}p*4x0OT;PHUVb;ySP5(!!KoY1?_m+IXZmm2-*nk13bLfZ*(? zOG4V}%@{ZQ^1*PE7l2ay@{(|o4DuR%&HPi}T;lZPz6BX=RJ+T9l~2CyGN-3AE_08@ z=F6g8W7jzo$_rO#FY^=q?PZZ2IxaW7!5z+>-{2f+@*AR6rav~1W|qKPg*eHxFxHiV zST<~&$tl>O(EA^~AzE6Vp+$pFU@++C4F3oRzJs)c7n<4^a&+|^~-18(_QDj>PC4BIkoINdm zlZ)qj-sF_*^*6a<`}Lbb+LFM?WXD-|oeLQLb#L*V_~uK|LXCM#Tpt{nTfXAQY3W;h zM&s6Jv{3K9B~sy*zUah4BduN!j=$>*?t5(dwrIzhN8ZR0IS5t1a`yS)5Z?8+=xh~% zB6Ye>x@!5`;>H2~mV;H5g~BeKH|hg{!FyC2WJ+_r;ji|><~5<{6#k9wibO_2Ic1!&WBClGOiNY1dNm! z8I%j@pXLmFk4WAS4%DTd_!&Rx=YJ+T+Su{3c}4J=dFnJ4E)rdP9R1X%SgTv#;WO>} zj>t%No!6b%7PC-sEcu>y_e=lf+@ZG3(?+Qn5y#P(Wsd*9EmV$SkKfhEPb!XFL{RVgTEA= z$l#m$+n-R?v9~BDmY<`|LJu_WHYgtG~lvVIuqgFUdm<>*JJ{_T-{%&rw(s-P zI_Z6WVV1qm-NL8w%nRHE=qIp1evZz*dSA3^vZSaWUM_9)0jJ_!KHzk9{0E$kFa1Dt zp5>2|;`6nfj==C=I5Eqcy=++>D<8+nBN1cxvTcp&E1{J-{b)wIYV;u&1lxYdr_dwAqSp4IvJhtNYgG?%*ZW4;LOKIR`A_pwMpV#mAK ze{IO~qUC8R`2m0EW6mx1ea!Wek3SY&>}9M_4Spp$*?_uP9f5o?8#;^Dm zZ1@$wMf+CsaIiO4XJp)G7Bf+~rDJ8v%#t+cI`2b}jk7yalR?*n9hs$ye~nbaQNQLQ z_?%z!r0RXY=ES$*8xkl{GQB~r>wEyf5Gt#*1yxG+hVlLAO6)%jpMXi;vSbLHy4akr z5d|vwU|JfZ29e+JH5vIE&iqS$!%*^#kTj~Wzywda&WBjvk|Sx&S!ZwjMzpf{2Id72 zB1j2XDDW;5JX&-9xvNj|@(}9gPxu+R?Gw?(M(xnhy|92u9()WLo}>gX*d$(F zCJ4{qE@}|Z#Jjj0y$2%Ep3q+#{~{U0$rryBtq1wzC@O&jR|Nk6aIZ=#3aMBD4TQ>+ zxz4Yg*gE*$qT4p1bfQr#`9gI6l;0%cu)zQx`jk`d;`@;ted<$AC@u|^sp^|g#f{b! z0gEv)rp}*g#`J5XXqQ)pdGzXoi89m8pYacM{EYARL_D)OyIzczT}YD%lDLrDJ`){` zbJcZzqjd~*@iU%&^yz1!MF)TVN=hf_*d60&x95;A6O~A_VP-#69ZlW+IhXEBKNlHI zT;~%f7DB6wD+NcmQg$?CFZM9#jkP!-?@&=!Cg1?2;8T>;8Xqtf7zuXV9YV4l|yx{HJnM*s9Aq0 z3L))N5Qozv8+YVt$)GPe!JYr5Xm3SlN@=&d?tz5HUorLKmyFbdFo3S)QrS?~`3zsX z^DTb1N#Ef1ZR6Vy*5$UZgcXXl1xe$e#iOCm`AT%Limn#N$Cbke;X0q=gL}W?r~2|& zqN5c&2&L46)KwMws%j%0Ifg_+nH|y1M7t z;7k$zPcWU_f8hN5;eQaVt(_EcHuI7C@GWNY+&}O;G4=^KIDY>R0B7qky-5~7HEpi& zDB$8NA_8;BcVTl#^%cGOn;UkM_*=0yH1pufytUop;9Erc?-4n9D))U3-y|)Td(p3=ya8{ z4stNq0nUXJgi_dt%rDcx;>H1D^4PDOIR}t&);oz;V1l5%B~**Wb!s4bPy&_FSWWte z3FL?@p`PP3Gvc|WmBR`vhpW_o@L5C7s1;tp%ZhCD--DI?EVnnh6>gu!J(0I>6}^LwOa z>RKYEXt;SHj{S80XK}kte$ai`y)kbk?#-4x2n6pxi{m4`@y{Zsh3otiKB%KEBX>_2 zI|dQ;#P8TCRpi$S)|~uu!CwpiC?;9~VU`YLaGgJZ^nLV4(NzRqIZU6MkbqM%NnLo4 zU#c;CGcw4V+9YIXx%XeifEh%?dCZOL{Ie4ywNMwYWfdR{ATI8Eu)zQ4>PY%4^d%}r z@&9ju5mReP?H?kV*~AL^idP^6+peo-xXvF@8%Ec&hsYTh(p>Z>F(Fv?3x5)WtIr8b_nNYAbjo{j_C()2%z0sU#-^slURQDOO5 zB0D;Fi;21Qzx+4R%C|_n&YvKH`V&we|C?}=6KepJJqMdo_rGxA z;DNu0k(RVyD`GP--i$)cT<6d6X4HgY=lYcLgN-xoh3f`FST8TeFHctj2u}9@LE}pO zcYeWc`*)Gu*I#2SJ@FiDwBax8zLyjt5WX_stEh2x_lmmbSGvx>VV53355XDS^Y7eX zdTOd{Zb=fVkNdf(q|k3Z7+noa(YQ*}D*dk_{Q-YK1UXVf@aYDqosFkpF``kx9RGsk zUOY#x4}jd+^J2sVXuOfyLwjq(g;nPLl`p{hzj7TR`w%Px7yc?5aRFFk&l8Gxg{2^B zT=OgjkoL`AMe}@r(DM<4@b6BnpfHyp=Ie(Er`~eQu%Kv>02OXG+&C{{rZ1_doL=>Ehs?z1H~+l$OGuU z>->iki$mVW^_j0e8ZVmKRI49A^^XTQ4;WY+mip%Z6p>#3=&uDkk69U9`5bdJf~C0h zpCV(j>-=X}w)g=Mcv>J`F2eRf_aE~%))sahG_JfQT81T~o!JuB&hScFx`dnQMU~)@ zDQC^z(#7fNL3{}n3L?VqUJS|dVBt)xD7}LCj{mw=8D%_Ah+HuW3B6gp1JSi?6k6n= z2k~*Ov`kc(?xvt-oeI}EplT5v{Eb8K#4z|tO^F8z(@ZGypc?;8v~J`&e{*8Nl+>Mn z|k1pYZ&npgG_CO*ColkATF0+*v58R{;t!r*M+1l46`neQ*?F z+wC##DZV?#KbL(hBjvUPaWClBS8x)8t)GeUSj~OEXx#KVcx3-hvRh1~*%K6Wg%JW3 z%1W9>QZePq5(WSa2Pl$sy6UUsfo+0~p=QtJI1)xwWsIq~tor<&N3)IoJ6A2J$cHv9 z{kJtOZN^X5;e-Bj^WtS~b^Pz#XhYRCtWkV!Q9&Wq=D>KbKE0(*RRd50woiT8;uy4% zkK^ha#4~5r_`gNuN0A5#WQ~5M1+xFKL+uK~X+Yb<2>EmWTL^1EEGZodOC&8KxM;MR z!mJaD^(ZpK2EASQZ;@`LIb-YcPe8&RxsHA|V(WpzWI>Kq@H-RZ0$p!r3qXkLX|rZM&w;VUG}0H`6CYMTJ|HJ>|F9=#M>SJk!1BB zFZ@Ub*U~#{lgtEM=O;nomg54YZW65gt7XO%ka_f&}_6SQp6LLLt znuqH&NQ#BRap?%?>JIV7aHoVGUliIkQOR`~l8u2n%Dn`$Gv{D9rrGC*w5 zb=q|Tsl_Og6TP&GEhFsw;EOuO+Iw4vR=du1NjA336k2FPC|l7}p~^9Noki37OCoBy zi&=0D`;VtiG-dz`?@`7sWyh@c{X{Zo=2w0qyVw9u$T;x+4z9NZ6FqaC>yu)-fojk| z1_+Smy(u8u*(#`puVggum>`*$SKyPy8(s}8Z@*P>1KFvyzxk%!&}%>r9dCfm zbDbNA++5_YeDj)BP!gmc{@lZN)Mb^KvEdp+p0KzA#TRMUUpkK(uWdUqCvuPLWEUIG zj14edT-|>*PVQCt*Gb}S=AY}_m=sehuH*0nRJ7_Azk!u*ZQnm2-D*+DHe^XWTjDc# zZbe}}>+&uvDbU56C>V9m-f;aUt$a-^Lh$%a80diOC0CB>FUFK#<|k}orNE|5b|pI& zC~k$!%@U2Dgy%SAD1lzy&1eSnh*R)Jgwvj8=2sO^h+^+lbotV=sJa(dg8r8`GTOVSaAs9eo`K^< z+{C02(5p^T36%N-G&r$x;2;3fNkIkoW&ug3K0>JLSbJ8tunJm{r3K#ch4}@#G|H*d zwdY@8bFLui?#5qh>F!o+Pv@ItfKyzd-wie=A-mEvu+nsbbY`A=P_??&_eq#O_~-Q( zJclfHhQb|Js=c{9K=tHJvbp78M0K|BtUGy6XSmr> z-I{&edqrOoe!{C*Rm&0cZL6$IWX(V|%u)3_3`5v2q`u1j-VecwD+vWL$ z2#0hiQ`@6@3$)JYn$^)0ykdpQx7mk*cq*(367ZI?darnHXA1%H| zpV(Nd8r&*#0;MLtKumqLVe)R3ZD;udG0p}6P1PRBW!r*&JhpK zPXnrl5w1+b;W+W|+2YP#yp==ad~z$7G(UKf*Y9oFNU~&sS&d}x2CmZ-UF>PZkL%?| zvU8?C@`A#$;?l(!R&M14lruse*W%%-L9%3t7h{uU;G{-|7d+^x=yYkaWSH6~ljUHW z?~D8$f=XObEu|IO=_G1IN<_-l?7Kkma?iaS9Hh)9GQ%2Y0dEKFs$w{;(~@G>ta>-L z2`?8huL+MT&i+YO_mG$7jV7|A)pF4Pp!|~Yg|m@AZ?IQYa)EFWX5B0)_8cy(sfWVP z>Vh|c2h}r0Hfrau9HDRJ0jIyHaM76360$7C0b@;1k!`KBu3YW?RJ8Zs)%VhX=_8hK z-Iib-PNm2ekO`Y7#q4hgnKxL$=CFhUp76|D9}^s&fVE7^u3gV@6<}=d^%QzxGGYJt zN-tAzq|&kbCqoZVnT7e^Y&Dh^frvwtU3(1T>?!KjrW|q~p&V^cJtiY5MueJe0J*u< z`_qICIn}{K8Y{PU*BM9@c0#JMDOb&QH?>R+ zGl{ZN^afnH@HC7JaR^`{m1A#COqHxq)6rC(0r^&{)Yg{BN17jtq!{}&cqu9gA@X-r z=^S;sxeNz%G*06m8J5OTpa8xBJ0+Ds0#342=18;N*PUnNh-=W?AaUuISHN30;_jFGO7x8t%k z!y*LiD4fYQrn!`eu8Snar?i$g=Vi0@HJ1-qJ%lc*YLG7b*+3-7jN0-v+I6y%kdljq zyWfZ(QxgK9)Xa3g=#Afnne;$9Pjg3dPi!WI>{D) zc0RmFEpWYnnBTz$z~R?o-A7@;#PX^_b*fQHdgtJ3vByL6iz{gVXVd?(e$|l-&H>)d zkZlY7BU9+bmn4{9b6lroQp~TS#8WBlU8^()7GI2>cm`Q?z{;vS!v#>4ohj3UUF?&| zSM1(Qe)Sh-assY0Wm}M%R#=NmnXcD7$@IzCC2eObUFwB=ULGjga1kFOspo@^r zf;dlri5D7FIg%kCJ)8ibMzqUw7p;ybHZz3Gz&KlDoRKPCQx6!IOl5jmNS5Lot^_u1 zu4rr7B$x{3q=iSKo?b>^7*J@(e9i!EgkN@panAo9$-V{`)5 zpp~>C`4K9}q)Wzls41(DUDbs!Ny&?RteHwDP(+k);TJz^(8_hXCB+{7PdEJ^Z9XV?%?kGnMWCJ&D8P~ZTS3sjP+Hsrf zYaAWs>hhcOen;8eT7ykdFVobJ1m5)S63Jv}D!Xa}f(CyOeklux3lbO4L+2CXBry)gw5m!+*T+J3SkaBTRR^29<1HHA%STla@BQu!hz(C zL#GC@?okJV3KpBECdrjO)n2h&{{Ya}yl(WzSVMb>Oc(LczO%c?GUVg;@^1!i*WC-b zoHK8sWF=91=g0xpc!RDjyR*kljr|@83R`kyGMG?rcn*wrn~g{v&5=RwE7hm)v{d!| z2;71Ds{n8B|HCKDafZTBv-?=^mB!t;nc?Tw;;VTlH*Q=Pr-(CsykG zU(0g#!}t2(dyVJwIE2LVo54J(@+Q0QFw5#1M#v-cEApPKzKXi`=yZPx&l>o_vYg4m z2mE53cfwdP03O5|6l2piIer4d)i+UzxUJgutK_j<6q|8}>}VB?3X`=0bp=)CF|^AI zL{4&I)H~JM3`TNh0gr(XSJI@~nb%)AkK*v?t*o5qSRcESoB6I;6w^DSsMAi{r>OSj zVE@!oAdk6@33xDcp#1_YhN8p^?8|#{I=`o<%xvNJJKwKJjvBxJ5+tS7~E zWiN`=J$D(A3m9@@S)w<3%j}u7@^L{frf4a1BqR7$n=j)%C}jv*npjk+?IPwSRIN=2 zDOJt-@Kw(3BU>Y~ei%eAKA{KuNNYrl5Qqep+rUBaR=fWR#(`sfxYz#OKC+cHUCr^p zF9?vJ0?b)`_aK)`B7J2l@<4_s#i-Cd>llZ-?qvYyzsBmi(#oj2`f`@C;1A#sm3<`x z0(_w_7j-`ED_h)xlIlsZ6A?nWLsgajvZ+eHi=VpN@8Uwh=6^&O_eMi(8w{aei&?uN{SI%FE94deT^Idi zZa{aYh5p*xPo}p-{q>|6O~mvKXG0<&<%j*adWgT$)F1j{KH2@{)S&Za{bft!nvCLd zGKycSM!A4{(ewX#e_otuM(-3rXXB@k%&&jV%$03ydP>FIQVRl1SJc$Ji(d&fBUd)Z z=SM>&=kdd8S*~QYv|h;N$ED++5r6k>uFO`Q`=^BRKD!T;ZL?6NJt_7SO1mbkdwv11 znN)T^*-~vD$hZE;KshK_lK%geksi@)e`tA6w@yjD0ma-wmMSXL`>j(r%Eo|JDa~n> zu2YW>k_)@73_~c>vDT0(btj*%d2F>6LMp0eJ_yx64=f~kuuQRRwWy+^%HSoVn0xis za4~n)Yp@J*evx~WJKIZxzYGayuR(fZcS@C@eK6VegSkoS`N8szNvOt-1FR!k4K@vX zo7hb_<`s7vH#!dxH`r#=-Y7kYP-8EuMnh!kXu7=gugE~r3^D`-x4Z7Z>IAalH=-zQ z(*$5Nyvu$64xP1Rh-_pT6^556K~exQEgwq1!vc+B@X)5>*6@iTvZWQ#wNf*;?&kWh4S+_kD0@G`#!^DW(TvAfGVMUsWBQ@y7uUX=%$wvB7oI`VY1@@ zzdc#(3EK^G=5bd3<7;9`tG9;92zh8xvfk4!NG>XvSV}v<2G5QNUmK&Z*i`{Owhi|DzzD7pe>wv7(@A>?8Z7O>(Smy2En9+b-ospHbU(E##JF3Hq-^J` zrrym*x#4ckMUUN$s*CxU8!3kcf9)SBTUtMAg)UcZO)1yGF?b)u%hd-xOK%(_H6zF^ z0b&IKT+)fs1BMW2@*%@V!B~q)#xP!UCQH%0VZ`w$840<%vFbWX-W-gz&nVf#ZtFai z+cGmvRgIEOC-}>zOOF#(GsQ4m=YC=j=uOum_ozM_)V#vQR1wXq=o)f#s@F$xU)txR zWTp+6vacEB7YggS1_@G`qxliHJzgpLsniMlJL&3GE!Vxf0m}=x0+0YtxtlJ)M8mp7x zGHg7mVvO8i1rV%JJ&t16nHKUws?4#n%@}`0Flf*dT@}D9ADlq3y^G<+Q|OYQIdPOl z?N7>Vs>*?)6D;V)v2w@_?us9qeDOP9j{N*bEwj}PEwj5IyMB6jNWU2?JE;#VWj8gT zTh?_!A6tKfZogc_yPY>qj)AphhDQ%E4|QU;$g<8AqJP>V@3G{#>RX?UlkL=i5_wbb zkw)WXUhvoS@iG(r=d=EojF+tDNkw00svNr?M;nXFx zh$zlZvsSAo%dWxHUYRUMs{7wexrN(DQl`j}esX5SSJ>#9ZYOU`v#&KppOX}$=na19 z%BS#=JvD`M&6lTeE$n+dv!lj+hX3EQe&cjpRfi+(#!lk;xB70LlvujCSh_y-PG_sBGBbMQn+I)+-t{Z(Q&%gcQEx?BEai3(ME6eWV-`aDZY;6fJ zPw+xPZ!E`g)*0P#-<25$#|0S&zEw@5O_MN#8WURu@0e?6#7P!1W$*`zBMzgHRW-ja(Gfq z1CDtn9F6(U`cZETb5qo__j67Ev-@Sc<%cz%gm$KI3lU$M$fOZgjxp;(-d0TCE*|?( z(7=l}*Nsp#92SJ=#?>a4Ji2;i-H9_~novcvQu_1D^wb0VfWH2KY+d9N5ANFVMqv0y zed8cIJT)3sq*-tc8RJpjJ1MrowvOr?2R3%KWC52cr%vT3no@!TLhy^JEYJ<0qNur@ z6kDvCh2%mpjfdRjPLugT2bap3%8wc{MY9)=Eh#1fdf^Xbh%rl;p^uG4O3xgeX_uOcoiBgO4;^UAjKMI6~rL1VKxY zqHaA)>?Kg8Gr7xSd+4vTGx?@}JyS+trKv=$Ag{TpuAjwemW8w6;)joWOM^f%RY87n zFaU)9wX^^`cz(^GKXTAELq+(iB;<9^&PQSDPLcVG@dn@JpTmi3W!u781r_;T6$q8T zGvzLRJ97(UE9;@2Wqh!@%(YrxAl;wP))3EY_=V~Tol&WU|txQZr3O+BKkLam22@cP2Gl&~# z=ShXo^e^v*ApTHN?C=H;o_yzF*z(n=@sefOTer8poPO0cmJ$E*963tOJCc%$IWEQ= zlPAb*ySL9#QA&_791sMQ6zta8@e zxU)tg+sMMjp49d*M%QVg>|s5R-ebyfnNwKcpPSN&Tx#lBB=54*S5-x_3oH>!jLrI5 zeE!uU*>{jX3;Kx91rwC1imEwt2zp3k4WT4z-3gu_rIuZSL9x$+ayZuZ5sd!1NpiHc z57OLGt#X1k(3^=ftb~sqWbSSVc8GSKC&$5=y3`kl{W9hw3I>&^eN!YW{!uxPM?d_( zNN_OL-y;ch&iq4xX$-$jF}FkfZ{l3A>X6ymT4)<1+@ZiUI?T9Njt-iIf=7#KloiX#M-WnWDgrcjHNOZsIWk%r3CAQ8rE2P3fu^WPth1w2e*3J zy!w?gZviME!}=r*u9aSDLbPIYQs0#VoOW3wc`Gi#WBBq$3^Vw0zm}QlYQ_SY!P(Cs zEdfV}K_^^{1Ucyr^t%fECKsh-aDG8zlD%x26%)!sz={LaS0xBb_Y)^c`%-g~)k(3q zQsX2)*`Sv|=p?i<+H_y6H#wnvDQ>CYa$JHCm5Z6I!A!PPa5h8oRIpx`E4Y}5{MEGJ zS=jg~D`giO3}NP&c-j}C>kX{$GcdXnV74Vu)TAu__G0J#l|Pb2?~(9 zSS6cf`K`;UX5s}eoB<5B<~ZtBV`vX`k<)@D`(L75+F(Z>r$x$<=@b2)LxkIy3=1PB z$;@6^=uRV0a1okS(ZeQzZ}$t)b$eh_iEiA%kHoEuxLP!Lk?dOFe@92s`Nap|E4;j- z=H>GQy|;mxjDH=F=AD} z6>B(x+c#3iQi$sfe~61*;ds}5`6+I?y@p7Jsy)Y5PSq_lJzedcD|-2d5S6S!HC4vq zkX>c5Y;UhNw!@QA>Kk|%NpH5X8R}`X5k0{t9;_CF9*MG^C2_P_HCn>m6NqVRr@_GDf(ift z$MZ3P0T)CQph~o5aAiwmMt^@`sE4dAxX2p{*OtUssATZ&V>Jg>kggh6DQEW*u2j6f zM0TEMyDZkRNmLkC%ctbge(EHWbjf_8yJTl^*4)Bb^9(NfP}tzMB4NeLZPlN>7C`-g zM`WhmYr>hBQ;y<-L}zzy3hR_AT-dVu5pH~X@ew|Y#*0Mrz9<}>6r*{wK@tQR;L;Gj z?A3JEWiKx#pr)yerQBq8e|KR?Z6plf!`RH+rCg)E_aPB5y=z=ll!m6w)VI}s0Q(hP zw+5I{aekt5HDeuT9A7Mz5i1YPM@jL?1QSlwfE=Tz5^2J`Zm@6NzKlDX^Omt>0b+{T zpJ}GJ9lM7-Zgd79&a3K0wuEZYG8v?h0eJtr7;lbvmt zC-N2H?prPqz2H2Vz=nq`m)4GD(yTThuQ$30H06-J%WB^uj_`YV5yyCWeL1Hp-z}Hv z2&UPQ6dS>()BGWkIoUt)Rb~G1Gv8qiu`P5j<2Hr(LZO#?oVZlOR&r&&cqKm{>+#H^ zg07?VF*vbOwhO#&)bnJu_djI11sGU_#7G=po!O1O0StZ=UO4?{T%uIwqg-#h>rs9? z@*g!xx2WFikrK7?QGS_{*U40C;_-{?(f8sv7i(gi(k76};IIaJ^TDICI~Uome@xy9 zfyJ$7D|~DteSl7g#V7LD2ol$N2Vs_?XPP+uujz=ggXmvc^d^sgl>o z{=rXqYh*{C?LtZ31J1T&jcnW5Uo)ya7o_1E7|euZeD%idsVVALYh;(u#;)ZjyVY8m zJ;m=8Kp$n@aCYwRmeYMIKKl$j$9laJ4imNPPA$7rOVh}lZFURQ^0i#OAR-&g@cp&2 z`F;L}iFM(w4E0hGHBxNd$@2t}rhW0@<kA6tFt4wZohVF0|FZ+I*kXu;u_wQ1|l~e=N`>zl*DXRY_#j3X=P!I95{A)|s zbG;$AZ>FnGu9w$Yi(D17p818Ni%O6_jzKS(zZ5)lNyXAIhO22cyd3SQ(cGo*B%7w} zTSU}!a=6J6{^Nyprc4dAM7u^*;Dy3vmJi1%(@|gsERuCYyI56WpQENQBB1gG}p!QpQPuU1xKmx*DT_k3lC~S6pPz)Y1)7 zSa+ozkaz;GO6_txYhnsKYr@I@X z%+;uk@9|?;vi@`whAFKAHV{f7V-Jcqb4~r(&0HXQd$a6mg)ox;$5VkPZI`AvA`_u^X*R|0XOt;*mBSd>Le${61*2)o8V&xf`fl%)RQv9+LXQao^!pXy1MRi zhzBowQl|Iyr;0oW@Gd(2VHOMOK;?)G*1WNm+R3ZKPs%p-_*UTJox)Ck^rUQI#a**L zs@3DXyvVr6g&6C9cvfj~X*r}i@+#M!J6X5>MJfokdNrGtfiBBML04*XctiADHF!$x zc39Vfu`JsmTl#ka^^~!jYX1(V4XbbPRcjPPZP+=5wrHy#Ilt>t^fAs<7L*g@Qhc*< zV^Aln%nce^-4r;-O>gSgQ@zKhwPSMZ|%Jj2dd8;umbEk{MQe z0}1s3$)Glep~&!TG{WRHTzXprb;TFx8;r7XHP|Z;-cSvnk{QMRUO?<4UhH!hh;J`J ze0%EZT6&H3b?uZU#-lLhdf8LyQ=FY|cuGcWw5OLL{rXdq6%u~$DcQ;%(_oHysQ8R* zd7B1~&l!%DIP=V%e1H1w-KMCYY%|o zLGufSqxLgwI>0c^TAVh3>u#^F6`3J<<-4^afI`bhS%^Xuj7I0ccBFWqEu6N`&M)yn z&8{BUT(h1BA_Q`i4rMZw&fY)YuTq{rzXGm`*Kq%Q*Gl!HH4Vek|Fm69J)#MjSz}Ox zMxlsp0`=UsOXhU2i)sR=uu5njkY~0;>Z@I{l^VHQ+??aT1k>dpU_PKeDqce6>7-ad z)%cqocFQi-6N1Aw9%Qjx8{yQ!=w+2qxWzV6AMNJZoKNlM8uTl>We1z51x!DxaX1*{ z@+|OSW~r@n(^3Zplnm=^6qH2yl++X*zu^_y497BO?%|@*(q-IZIC+n3X#=QfCodnZ z+4Nc*CTvORxT>OA^UR4QRscm6^{hdkUNl?lmF+HqA%C`420BJ?i!bb`yRHd z9@+&hFqO=S56}rPDP>#Yk*m}8bJ@1ver|-8J4L_2D7%eM0|gI7iK6SCKq@BNn8ZQU z59smzQzA?KY(GB~-|k0B+UA|S#^I%%qKDOYj7B*~6Un?{I4&+@77yvQ zt>sLOTM?J!MN+p9E6`{|-N{g@aK>XI)2gsPfN!9dFBO3U#&~V7g+{RUfXr^^Q^+3# zM!-XoSZ;hrODu0-Nnby}xBN@=WJiZ3yA}acd22XT%6^WYqT$am=yEe0LyE|XNHM>z z^V6gl>TkufP%urzIRkB}xJsYdliTYqJr-SYf$ay4>GGD^6RP%DP*=XRY{&w14b$kA zbDK?Lv+t#4W2hq_dh%y_rAo_&5%UB#wSC9`T^|Jfdp&QB(r=xrj(=;EeoOyOZ*}(v z;&ti;OVJlsT!>bqMmf?h<9yON2N_kuL`_LI@MnN5+vAG$%%|9z==oRcF7sN5g$7px zkIZ{)(aH0FapH|S_dH|a6;);AelIK-T3Qa9aD^({DckU@N%ThYg*mBl zk|RVBpcng*4!WF3WE6_1<5Hcwk`^ixdCwtv_bvXSkSd|39Rm5=U6a-?3Aaq#BF zrKJ?R9KG~H?Pey^CPmbYuein`j&RD=_^)ZM8g)c=wiYcS75tcKDBR$TEyn8&P}m)- zxcvyvB>edi*;CC>9L%Eg3$pnjf0^log+U~2r;DKejxI$2N@=+VKZ6LE+Fe`g4k2yl zm-tft3!G4{dx0AQB!F$_z@tDo|2)S#0oQq8-dLhOA z{wIYE6W3m8ZLhz&;yi>SyFY5~aoHB0&JRMK&aL<{_~x18vQ-DR*TMa-cN*%e5z&C%Dmn>r4=`o+o6()+o#lOZUc_?I&wCu8g!=Vhrr@TKv=#GShPM1?59gR}oef zx((|$)$Amr3cGA->j~LvfIrj)|?6&*D}psLDSn5XwR4eP||B& z386pcp5(k{+DR_fKXQ^wi(9|uf1N-}&6Ql|Vt8L`7w5C84zu)_(!u$a`Re$BTSL4r`z21a?|Ml# zv&Ul=(4uV+UCo)*;o`Dt-b*rr%kO3tP`#vf{aSmau@b)CXr2=qCbx_sje@ES&>dR+ z5^BODc`}p{M$bp*msA)fLiiy)8&p+pPWP@C!@5xgRcOd9 zc(6)ag6l3GLy-pHz1KY+f{aOdnH#ZszASI=;x8_7OL%)xB_8e-Kb9q`3pcOc% zV(VV!iuy+{%ZN3Vdi_2<8SvAj*!t*dV4^-+ zx8kt`9;CjT3x&4i6>bH5_!aIHdHNMj0bYAWcC%g}8piO#;<6EB?NOiH+pq<$)MvO- znXmF3t1tqO0do0G*jYI{U=%FoRuxD1-YtZCTbsPlNM^Np5KZkV8_CL zhS0!-XX=r&Qd*NIjmmYt!eE~{E2rqNM;h?VBHeew%lNE$0%r{#vQMhabF!_K!;u}H zR|?|^W>fRpd4%(!kScF{-#Lu~`!&A1@Eor!aPAyu1OIOYNyK@XV=2V^e68}ntvS{= z_}-ZFJl1E)d47NPhyHr!ylio=zkR+X$dmYSmvN)1GRmoHllY#1P8F{IhsyE@KjLf9 z;Q}X(LoaZb;KB>s$8<3C?2`+!RVM1pdp3QfbAk|anx`6GU{P0%FG*Lm{iJD(J%J$52?3IOJLw90R(24TT~yY9xS@7B-64{V zbRsA+!39u82T`DOkP*~TQ6Vyj%08fgh{&iYZX?5z1=kT2w^rU$^}l^@-Olpn`<@q{ zJU^3rtL~}2>eQ)IF2|{6biXw}RNcO>YXO;t&0ZK`@gKWKyWX0a746Xmm@~8dB3fML z=gRI^Ry3jK#0sr?HQgXjlJ41~P8wb+qlx2x_h^^!iC?vEt)!s+UUlQMLpk{k$lj~P zsv{3o-|DqS|ArP}CYI_sP4%Ubjak*@41sQxr}9yXd!9c(Z?WxX!p0pdB2@_LC2+(P8AhW7 z9ivlT;J3b^PEHoQq1`qi+|=mip;4l9qa;f8wY&h@m^v?@hYQ_gqGH5L+gfz{d$Z6| zHLtn$rs_EJrZ=?#rm2V3r{80#Rrteis?xkjzsU*^F%d&D=@xjh8CtV~CS)}`?jy4x zSsQX`_A@h|^oUf()-A{MHM|pHB`IuoreTIn%iOA6PtkQK_7z-*@GHi~FK@YD8)Qyf z#l!L5a;ddEv*QJ_$EjKKn3}!W`?XZ^0(rJs=vf*DNpQOohCj4lo#Z{UUmI$ktr2lg zDlg2D22>*CMy|wcJte_-%LCdVbNN%o|8q!-wRUg66q^B452z#l+ym;lm&FIP{^puj zL~NS3!6d8ZZbbv&=Im}8dE7kAqJ*f3DJ52HZHN|)n?tG&Rj=P$wRus5T91@^#pPuq8<=SFTi?=pn?p0+%`Wuf1h?&KJ>{8EZ8Fmb z$OF2A_sIe98?y7R}PKTs#om0pZxMeiW9MjMgr3@GGn5{w%^hcQ*3aUCXsYwG$~kBL#BDM(M_kK zXuLsL?->mzwr9O9XWb!nQo8GqI+T7wzs(AFQ&xo2Np&Z>f2poBv&7~2PE<+jwMJ{V z@fvS;P`QZQ3fov6E_qvRVh_Kq_#>jM6{aqmb}K!Vke`f7X#03{NjZrIax|*GZA%A%(-O(emzGmgtYJ0o8g-(m`p{Bc43>h*D7GpOGAC)1Rr6I{S#a7k~gkVc(tUwg)mE z(N;{LXIA~s22!wr^*_qY5K(5-|FFM!*gx_iKl+XqYZ~bl70;BdRb-CKah|rM|9TJY zN~3ZrY4h@yN7OoHBCAUt9>uML)y;wK}G&YOJBXtHoatu4}ZFon1!y714H#y>460 z6je#~X%Rl|`J{KXtaz8>$7Z38&sMEi7BNqodv8Kqx2gv!X&k43wYzs$*$ihnJ@3p9 zysJ*L<)0=!8xze(lqR<2-HxixS^FN<=zxyx~(S!iOAuYW!!K~3lU zqpGI-rK4&`dFZG%m|yW?Oba!D*e5jgvXn8`l0M@nnww|5rayfoB<^pbMmPYTMed>t_y`KKQmT0!Y za#Grh7#~_i`w>cvxqcs+m=%cXD%N?cUba7`CTQ+f%9Wsfl0{Qh_3<;$*&pY6$?>*Y zub1zN=|Y-=UnqkPzpwQ(*XUwuId(qvVZ7xB+HK~Fl>Q)$4Q1+tHKQVTLxv}fa<{-+5|ncws_e@it6ILU&P$@c z+b;$TN*nx1V$)6TSJ5Gm*G(;QbE=X&;h5I_nsDXB>xQEV5~fx*4<)tfbicj0iwJ`a z6ts~We^ZXBiuvMWnmIOzz8!aVMBFRMpE#x-YB_q$a9u`=0_y*TR-xhzIjIVX+D5Th zwn%b(pdG?UEv@)eeHWdT87`=;7?k80jZ+lE{jbp(PwNqFilu+3YM94=sA@9`Kh#o8 zJr_wsmt@iq=yLo{MZM-j)j0duhgvUlhf*9F*4 zU5-D{0QoKS!o+YvQZ!Y6A)SeJU<2)#F851G~wUSI1kbI=BTweW1 z?UGCr8q;!>jAt%Va=RW^6|I*Y*UT|n6dWc7(#q5F*uV>qYw>1lKqZ_k`<>TcKeJsu zdrdKnDlaQ5E{ceuth}_y)IHnP&hn9r3@N9(?48Q(D`e5)nse6g8Ry_JsN zxi>L&yi&Lmh07v$svDm&=SZ;o4Xf!JGW>n-W924!(yJO1yQ*D}(&m>^{!+0{IbdCS zY)H^xS5HMJ_I6wjCy7th%&x^3c_XTt$d#T?DIcOz4JXLhmN!$xulYpN%+smT2$?*S zidgEJ9^*lzv2jjm@jQ7MTlLoE_O6=?<5f%RwdWJ9JLPl2QSbcT6F;cJ8{w~^|or8Bh4=A-eJ&$M_`dm!H* zO-l@{Nj5KzSRBVpPE=gPJx8B1JB*Uzp!6w5Le;Tx_`fvOa5-8zLzcaU96p7?hPhMl z|8KA%EiOic^Ukm+6vZm736)G%N_L#wZnnyH`RAJZ@^BQ!7KnU>;vu{8s>LoxYiH9vnV3&6`h~En=QkwQGaR(Z(67ecZO0QFnXV ztU!q2|7B;|tUw6b@Xj=zk1zG!5%gh4ujcNTg=WX)XseDT(&xAke)~%MJ=4bB9%4l! z3YE5z$R>C5Rgn%Zt>tW;g)EgjT)(?>El)Sf2+F@ucOLeCp=Ft=!|B+GG#iO>hUnbs zd=f#-erlfFaQ3mSRhyT)du0xqpE*c%a*8lx;MLA}9|zs-b#a`mVC2Y%tl0h3bS;TW z_{bCLslaPbXqOHN*G~DqSOOJM%aulUJGa|4W%f7ZzS2MC3^3YBR$nKy%gm{cd{bCH z&^>^8(q}!{Kb&2qTF=T?Mi!P7Dp1CP}YR#t6O56tlYtfJkB@h8>OXmd|$-Aqlb zjABf_%hApmD!sC}H2+TO1u>_7{spqXQnH0_IH{| zrKhyvW~VJbF-{&yDe{SOIr|h{S7TfFeSS*QOx-vVXO&{*61z~m%W2I+>#P_mv|*>U zMAIO_2}a({chx&Xewt_C&QcsQ!G4w!54AUnn|h(@b?fOOAH@~5=Zre>pKwNRd7!W;M_atpjB`7* z2Nk*WxO@|-%`Zh2lCV462!$u~M!D*dw3b@NoY#-CT)S>btA6prsE-Zo9)S%}I+*si$g;OT*~md1nazx!t3) zr`bJq@R1u5l6lu3)tUT&AJqyy>qph3;lUp@-MnJXa6Jz9T@!>E4QB?@HU%cf7)#$1B1#M(vI3ZN%M)iNtx;lv8c0ub-1{B?$A>(14b1^F~sEu#W z1uer=1{;h=9e>tVV(HoU`AR!*V0P68!o)=%0ntKIRR)UJBx zPpW&%l9v(^_|pdxV@H0sQ{7V(%^{puQaiV7oy(C()6!kL&@N~Px-gh$GYOgUvzBc3 z4I~u5JEwbR{=loMz3tzAR!eW~M~Rvx=Wz;es`2578Qa&?b<&OTPI2)_9e-Wy1EEKgnzI>nTyWX*!nn%1YO*{(Vk5n_a%1iDi>$$bEL5p46}>F^ zR$Hyk2WZY!kRKE`1&y7gG&*t*Na{>-T00@Ji1uuCYEW|8`}mHkUA9v?JAbj(z(PM{ zT<~PqV)Fm(AeuM`ggnBz_d40bFaK3bkVA*4uP_%X5FuO+w~$RZ#d-DqI>CfM_G@PO zykFIpz4BK@l|paRyxPn)S^&?cvmlf;q;s{avG6EtD_M`es*y*EDhnqXWcMRgGPED& zawJj3Z~vRt#nc%Xy0L2vqZm^2**E*4ATuBDTx5UDvwzc4%>IMYNKU}aG;%#Lt_xrO zo0g%6I|AA)p8+RgbV#+NfK~-AM>5Iu-fvp`!0=0?P^Xz16@c-o$fTu9$O%8Z9z}F` zokME3lemTKizbKEo+>}2rI}Opu)nTs@=Ph>U9;Wg@Hj(cJwm(aw6~yCQ@%B%jWw6M zbk4Lq-v}jLin;3s==QtX(e8Lh^}QzCn~_r1GKX?;W42 zeQgWb{zU9Vb^AkENl@0q!@rsPB|%y?%qa5SPA*D>^C7CuDWW#hF|4ZPmG&hl%?L_y z(4D57RcqBYOc9d|@Es93YR?Pu+x}3^ww7;A=$a0n81*(6<(el`PX5LpS}!qCbUAt$ zS!1X;vT1)p%;TZwa4*10+n>8IeL)#{eJoh$CU-zefsv@VNd&HmtS{&n)%n4Qi)tgi z;i5VLxa*>pMPB23IzwrFl$iOJi)tl1eo^b4ZALFXE6vc&zu=Y>oVFA4OaE+2bQGfg zJIb|Y`Y1zl-wS!cZ*8WV2RcL_2z#rDogBKpM^_vg?`@{XT^DXm)Z0ocE+I%gCaQ*t z7k+W+9pSb{>U!<9O^6I%9b#56@Lf48=pC-gZg)|!Fmy4T?21p(WT=jdj5Mcit@0>F zGUO%gVbz1%#P}cKc=Kwf-oqO9<~r30XZHpIKU%A_~VY}n@kHU6Z<4$m?qPLh8lW~zrXYQtA@RcX@_H`vHL8dp-)JB-<#aw>>RNi` z^oiHFan)|ko*lK7E6%Qr*<@yen9W4o0a4je8`C*lkI14fY+}h5E!Q-2Yln^{^`kEQ zp-y!B(~Z8wE38s`w1r;C-6K224s|(FNx@5Zu~4bN^NS+8v4L9eu^C=LyW?%cGL-Ts zk0OslA z)DcdK%p8MTB9|kbBHY?atnMKG~x7Kx2YYHtd6oZsjsCMh<>Eu41c>ql~EEVUJ_^L zwuFDTQ#D=UyV~iOszo9s;w{^&nYkjy70qAI{!6d?;+v~~=!0)uz2k;XydJ^wG z-8D-tC6CHMV+g%Ef4a-QR(l~vzgD~$;Bz|Ymr#U5>8%AF)LdTEL08m%X>XC&fy>KW zJ$Y6~eJBMOMgi89xo+i$JL<|_P}+;GIC0xC-7m^pcG3r0SvjneoQ@FVsU6-jj zwWgEq=d0$#4$!S*!Ls$07EUBj!c<=h=g}qi6!PlM`gK;6Pj}X5@#WcZBRY_u@)2so zyy6}5p?!l(S5|WKUAp4gwbG?e<=f`QcaFEOG396Jf_wVbKl>)8*%r7R=frpBd9muq zxH?v!X~~nhDWP+;NP5*Ky3U@Wh>p{Tn(oY~5{@h&4Te<($-hL^;#be?SRJ{p855`9 zYDN1@oZf2?-E2=A2JSldqEoCesKN}#O>b`?ZVIhP*eStBY%0 zbft42-$hR~r#>>8v0?*oW^hI+ElI_$mAtOn%HW(P4rPCRYMVp%+sXEP|jaDqz7 zbKw#cF8(H!iLLiZ)2G;;@*Q2(`uf7NgrcQ`jiNYrGq6JPV0D!lrNF{jU1c@aV4p{D%T1Fp(mcFvlC=qPBT2E8u7~#b>)W2I}_F3YD1!~Om-gnkkoAdP1G-G z>n1Z|mtz98y0)4+2=~|Y$yPUXkEUN?8a0-b(tUkC@*y#ddzVGKsbjy2g5SL?+IB%@ zTU{S(MKDR%l?!;*=yDvnnu1N$^f)c3q~iACf-+hko2GK7p5QH$bjABpuOu~tH za~f7c0mDW&GwIfP+F#0{Rh+0N$`|-QlXPX{?Ya$#3CgvbL0XwmxsNU=Ca=f*g~ib+ zYMn_yeL)>NK_2hX6^EpL+B*%OTCd|H zk5BRFu72SbNw?TLL(*0yn{FES3tbdhtk52^n$C(DYKvas(G#o!+2~OR{39M?eWbK6 z7{M#;t57;(wRS-ui&%W+`zFd~B*odakCRRlVXGcmN4gJpuNqR9PIiV?(=v$84U!&+ zPHw8ZYr@!bjGqr;YIl^)^b||n`AlsjPcXIf*vEA1c6Q6&$S zS8q~hv$Or)lIcRRA^MkfORC9h!X{O}A)eFztJGVqTT;iLzO+i4PF`DaRq;LB`0Z!n zF6nJeVamM0Ifi}jnH_W(biLgTAumkPE!TF!zjk&R*%Jw2==kbN@@%D=w$dFSWRGFK z@xX>NyB>ErrqY_g_FB2oMdK=X`*tziQbl{^a*O}W&c~`2-%s_+Ho-aZIqkbwd>vJG0 zA8mZs9I{Kxtomj==JVc->)O}Kej2xFH)c zlG}1BZ9H>1vYq6tk&ge6kE;Um>q;+)Gq9w>Tx&b5q4iYT*RY;?H&a0&k|)Cood*&b z5xB6YU0q{He($cTWoyJ89IxMNNxrP7o?>bQ$c%Y9bw4ln)Z;zj)cCw5#!;x+%2%o% zGaN+8r~EUL(%jUb7l-8Jml-enW_wH1bM7ef3vVxEEvMg9%%mJX(OXY2XTsDA(-omD z`{?6M)xPMMMgN6~uaXvDJx8E;ejjyCvaFA;nJ)Q^y*HQRI{Ip*?Y)2XQ9J4M(+P?h zXV<=ZvNxPGYO*uTTLkQFpB{yK;yV2WWi&<>cUgXkWz&>P>h^J^F30sG(CohI^58$G zX;0#{zUoZoWM5rR*dcCAJiBxm*>#|4Dfz*>_S1D~5~YlORIJqxZK~e>u*-3SvAPt) z6ejWNE*-af`M#^4uH1C7qo016RUmR!5LWDolG(C@dZj9t<3=ZZ)v7{isp^z*Y^t7Y zjfQ!tdOx#G_zG?3v8BQR2LjaSUQX4Ak{QxX&d|$M_T^y4%0%l%L1Q)_KEna^bk(Ar zb!Okjkps)8^zGi#DdE!@)?r{iJxx!a9Igfa`T6AU3zsS_T2!@kJB`bVkcN7hCYCP8 zESfnR+GXL>f+VmycfK`Eoy`6xO?P*MPFsB`CSB27i=`1Y2zlBZ-s0fFp!)tTb&>`j zTE;%PRCfxc=hE%64GSkuqYaxSE17B@$=zbq`QzPLdS^cCzQopi zdAh3Sdr{YVnW|SG-(03$HQeR6#Ti<*uBvj0eSd)T*EH{Fz%?TFsricg5|yRhpEA`c z^Y%{TbYu0A;a~dt&pzFe0Gc11tad%~@)%NVzm7(dFf0KIQqOmz}A}yiICyg7YH%ajW}cVyvT)|H8vV%eQHG zpa8GBFN(-s16~KV0o#Ecz)oNnup8I|>;?7#Zvbxs`AW<5Bvc9*kq9|K%@%@_Y?3l@C)!O@EZ^U zeh2;lE&|PxWQ}wJ&4Cs`%cQ1O@1G!2D}-wev;o=zQ9v}%4rmX=03CpiKqsIx-~wVB z6KN5(M6<>H0FmMlt_u(kbOpKr-GKxk5zqh~NCJ|RF1CqX)C^vWdZZ?Q>fA!T!ItC% z(Wn{TNoh<%(N~xf{s;+sAY4zN7tkB%1M~&@0jWS5kPc)5SwMea05Gu0BAtUsgAi^o zFa#J13L!@yCHy*eWm;hV_Tn$_UOavwYlYyzg zG$0$84$Nq>NdJXM*CO0Z;5y)X;0EAE;3i-ea5HcV;01C3ACL?9n=I1z5GjCgdBAKS zAGi&e0~7#-KoL+3%mqq;AW#OBH(8`VAkys!HxHN(+yUGPECB8T76N|)DuBCzdw_d^ z`+&tw6lrq{NVEjOmIC(!4*<)6KLZZ}4*`DxmIEt*M}S9xmB6YdO7wEe5JXyya2$9H zcpUgEum*SnSPT3OcoJ9-JOw-rJOlhaERyIX>-*2_mVSpw&m!D&vdeQCUEUVz@`iYL zn;{BQem34euzuOi%Q!0W&^U^}n_ z*a_?cb_08Wy}&-;4d6{+f0IS}4I&*txP!o3z#-sm;4ttGa0GZ4I10Q6ybpW;90NXV zvPeHeq>m8pIPfv>3GgZK8SpvqZ{Q2y1aJ~K1)K)X098#E=@*Dpjc_$UEpQh268H-E z8u$kI7WfYM9ykY_2Yvv4Y_dqz5a|NK{RI3B`~v(6{04-8-+@1Xi$JqvOs0V5KntK{ za#JT$H4v#4!nFq40BwONAR1@~vx20Q=*QtFDd$ktt%oj?^t>Va@QfnGpwpbyX&=$9-eZ_SOKY>4Mm=Pv5W zcA+Or!#n9fCXfa62L=EG>q=05|&JHpKa<^y*CcLEE5yMTqjpMVPBZr~o^Uf@1pag#;*4k9f&1GrKCCb6$5L4uOJ|uZi}hy%*g!Uj z4Q4~w&Pun%|xcoW#)WRbptNCyz^An+D& z2zVPf47>vz0p10U0`CFu10Mj#fDfB2QY}RK2;q(c9|NBNp8}r&p9B8}z5q@DCxKJI zY2XY{)nt**LZoVhs{v|(v%r_YSHRc6H^8^Rcfj|+Ip93-1Mp*$MOqD!E+E`bz|X)h zz^}k>KnVC9_yf2IH1lBc2Q&v-04+UDo&0f#)C%ER18sn|Kok%Sv;*1$F+c~PBhU%x z47h;UCX2KZBE=zG7a$(!3UmXy0|`JPpaD9N1SA6Va@QfnGpwpbyX& z=m(?%X+S!V31k8NfdRn4ut@eJXEWHfY$m&oUC(Y{ zH?o`9EOs-yg?U*H^RZm!X91SSX0v>D8=J!lSRpH7#cVDsWkFWP%GvE~9-GhZV0W?w z>@K#D{fSkuyV*VLUUnZ_%$BgF?0)tDTgLv(9%K)(zp&+O1$%@&TESMbRctlm>@oH@ z`zu?+o?vU)-`JCEJ$s5h&7NU@XV0?d*z;@ydx5>kUSb>BCRWKdvwyHH>=m|^y~d0B!_s0%id>1GfNPAP4XPxq!dP zBCUW(0ffr~W&`=aZNMC$04M~CfMQ@SPznTrGN8Q4BK-{_-Hvecfcd~3z@5MX;4WYx z@F$=GxEr_!xEHt&Slncho`gtC5N;`OKkxvs4EQtfAn*|I7hpNC0(b;?6j%wYYO+XA zK%~_O$AQOy$AP~BYk((!wZPwiCxP|AQ^3=}Gr-@QEYezt^endHu(hs8_RiVt1pW$jg zK4<@CU$7JGBs;}UvooxURkIpa%g(Yd*;njq_6_@%eaF6M=h%7n1N)I(U_Y^+*)MEG z(sr>Yv>Wm60rmp>fH#0Qf&Fz;)j-#_2B|uLa0h|6fJ4CBz+vDW;0W+8a1?kCcpvxx zI0k%JuSju=;vB|*W=1~-kv>AW6!5x z3$fqXAM7G)mf}olp3)+vWlF1*)+udL+NMOMM5nY%X`d34(jlc|N~e_0DXx?iNl&ic z5Z$sOy-!ph_cVWD{(ScYvbJ{LJ|JyqTBf_##C*CroBZpID$g&-B`dJ$`QD-+U3Nb? zyEg@xT~<~S9G0F==8^gHh0%B#U8hKYpIlUM2c5$66_Agip!A#?bPK~V`kNAiIBM&j zF(Il?dQ`?0!j)QTfQ-bXO@i@TVZLx^l59qwJe;fxf~CG; zCBvf@Mn&D|EAYlSnmIzj;LRhFOY>8cXZ3T7KL&$+MkKrCAL@Ror}?Fx?j+c8c#F!! zN9AXNa0piK+Kvmzd4S&stq+%p$Q7nsO_=EwozP2XQS zT=+p3j<7P*vJ4rcDA%n@EDIn=^;*{0d9%G`?s6Jq4sg9ad~ji)_SiOlcBIa)Z# zkzw*pfs7#;W_&?%lAQ1JHx{2i%Y0i{TQ%}(Rz|>lwLF+ZZ&oxUW!69|R?3*t#$q)R zB$7YJe@DY_`u$!jql86oYC$_Sn^wOZ-Hl)Ja&!x>t&9Gm;&JLD;~Xs=AzMlK1DR$T z$jftnQEE={{Kmc+7;L^DoSpA4$W8rU(vy+v6(O#dZOEHTM_U?;KBK=Gy>MnrX;PD9 z6Fp~ej(nHjTIGqo#%-3otYJArQN!XKtsEhdmAS>mrK!aw{>HxU8{k8XFIRa|Mn%Rr z7!O5cg?jOhT{rk1`wBcJD#5vkfO|+MpcaW9CRP1w7%Zmi+ZTEhEj#Y7SYPylS5*Rel zZ>Bd$jzoFB zVvHUIXFXlVM`WGfYn6v|i<47ckdsP&KnfbDM_!Z%|L0kco`}fe9MKNCxz8A^{9Z#e z{@(MQJ8KO@Gtfv}(wB4w$u1L(XsCUB>X#l@M885!(dzPq6M}|irB~6Y`I;|1bnM2~ zdIFhQ11a;{IYQz2N^o|08FhQ}8tL&UkX0MS0A1R6WzRuhE?YZK`pVNeGWP>MYe<@1 zTwau8aG*uk0YDBDz{#N%WE_bfC%mY~&hI~9}TnE>r`d=E5g|Zh@CNWVB(!8{k zj`EYw#iHCGc{Vgl#Ti*sCp7AeaA%Hm*I1$hfAr8OK?h45-cOiCN;mjfAo^zb4Mac-M#JSX#WtL~WV z9;*l&oW-@5lMt^lJ>qk}^~6t!$dar9)-X`wrRiP6dFv14TK%>thB!w@M~LsGuAxpw zE7g)54CM!CbtIC}SmZ+$K?=(A8h$m9VGJ%}{GeLnPc7>~?Y7|n{#;}7&I`Zubemw$ z0h&EoWt>+~oI@)^V;&mk=;R31U55B`eMaZA=Q~eq#Ng%+46*8UVR00^ z=Z1&1&EI=sBfF}sOk*VAo9^xs$G`pF(>iik%*?=Af=8e8Buuv#0nK}@A}}T{|I6$> zcd#{cvnz-Wj9VfXKQ2c|di-xB`~3sZSBR#T?Wbczbl4OPO{`^?o%3`bX&0343J%Y- zY36cAV{OHkV-)R)K=U~M-*a_x#P2gYK;Hhmr<*YuG3O!P!PL~^NGTT*-5y`@Y+P4< z=qpcjJ_1B~h`+F_BriLkL66!3})Dhexvo}3@+9p9<`DOMmOJjK#}@N^j) zQ3}4HR^gZ69>9jB^aqSSoEQC2Pnwk_F`Y4NB$}Ln_0gPCI@^qQ;~ZTYngT1UXBug9 zQ*%r6Z?9;q&g2HH0XmP4fR;426!7ONYfEv$tC7wjkl~f{&WjgcYrdIHYPU4xPNAP3 g^wX1mdeKjB`sqVIed(tk{iM=Q+G` /** * @file ts_api_automation.c * @brief TianShanOS Automation Engine API @@ -129,7 +132,7 @@ static esp_err_t api_automation_start(const cJSON *params, ts_api_result_t *resu result->message = strdup("Automation engine started"); } else if (ret == ESP_ERR_INVALID_STATE) { result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Engine already running or not initialized"); + result->message = strdup("Engine is stopping, busy, or not initialized"); } else { result->code = TS_API_ERR_INTERNAL; result->message = strdup("Failed to start automation engine"); @@ -150,7 +153,9 @@ static esp_err_t api_automation_stop(const cJSON *params, ts_api_result_t *resul result->message = strdup("Automation engine stopped"); } else { result->code = TS_API_ERR_INTERNAL; - result->message = strdup("Failed to stop automation engine"); + result->message = strdup(ret == ESP_ERR_TIMEOUT + ? "Automation is stopping; retry after active operations finish" + : "Failed to stop automation engine"); } return ESP_OK; @@ -472,6 +477,10 @@ static esp_err_t api_automation_variables_set(const cJSON *params, ts_api_result static esp_err_t api_automation_rules_list(const cJSON *params, ts_api_result_t *result) { result->data = cJSON_CreateObject(); + bool loaded, recovery; + ts_rule_config_status(&loaded, &recovery); + cJSON_AddBoolToObject(result->data, "loaded", loaded); + cJSON_AddBoolToObject(result->data, "recovery_required", recovery); cJSON *rules_array = cJSON_AddArrayToObject(result->data, "rules"); // 遍历所有规则 @@ -480,12 +489,17 @@ static esp_err_t api_automation_rules_list(const cJSON *params, ts_api_result_t ts_auto_rule_t rule; if (ts_rule_get_by_index(i, &rule) != ESP_OK) continue; + ts_rule_resolve_presentation(&rule); cJSON *rule_obj = cJSON_CreateObject(); cJSON_AddStringToObject(rule_obj, "id", rule.id); cJSON_AddStringToObject(rule_obj, "name", rule.name); cJSON_AddStringToObject(rule_obj, "icon", rule.icon[0] ? rule.icon : "⚡"); cJSON_AddBoolToObject(rule_obj, "enabled", rule.enabled); cJSON_AddBoolToObject(rule_obj, "manual_trigger", rule.manual_trigger); + cJSON_AddBoolToObject(rule_obj, "show_on_dashboard", rule.show_on_dashboard); + cJSON_AddBoolToObject(rule_obj, "allow_manual_trigger", rule.allow_manual_trigger); + cJSON_AddBoolToObject(rule_obj, "reference_unresolved", rule.reference_unresolved); + cJSON_AddNumberToObject(rule_obj, "revision", rule.revision); cJSON_AddNumberToObject(rule_obj, "trigger_count", rule.trigger_count); cJSON_AddNumberToObject(rule_obj, "last_trigger_ms", (double)rule.last_trigger_ms); cJSON_AddNumberToObject(rule_obj, "cooldown_ms", rule.cooldown_ms); @@ -493,6 +507,7 @@ static esp_err_t api_automation_rules_list(const cJSON *params, ts_api_result_t cJSON_AddNumberToObject(rule_obj, "actions_count", rule.action_count); cJSON_AddItemToArray(rules_array, rule_obj); + ts_rule_release(&rule); } cJSON_AddNumberToObject(result->data, "count", count); @@ -503,62 +518,157 @@ static esp_err_t api_automation_rules_list(const cJSON *params, ts_api_result_t /** * @brief automation.rules.enable - Enable a rule */ -static esp_err_t api_automation_rules_enable(const cJSON *params, ts_api_result_t *result) -{ - cJSON *id_param = cJSON_GetObjectItem(params, "id"); - if (!id_param || !cJSON_IsString(id_param)) { - result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Missing 'id' parameter"); +static void rule_commit_reply(ts_api_result_t *result, esp_err_t ret, + const ts_rule_commit_result_t *commit) { + result->code = ret == ESP_OK ? TS_API_OK : TS_API_ERR_INVALID_ARG; + result->message = strdup(commit->error_code ? commit->error_code : "invalid_configuration"); + result->data = cJSON_CreateObject(); + if (!result->data) + return; + if (commit->applied < 0) + cJSON_AddNullToObject(result->data, "applied"); + else + cJSON_AddBoolToObject(result->data, "applied", commit->applied); + if (commit->durable < 0) + cJSON_AddNullToObject(result->data, "durable"); + else + cJSON_AddBoolToObject(result->data, "durable", commit->durable); + if (commit->mirror_synced < 0) + cJSON_AddNullToObject(result->data, "mirror_synced"); + else + cJSON_AddBoolToObject(result->data, "mirror_synced", commit->mirror_synced); + cJSON_AddNumberToObject(result->data, "revision", commit->revision); + cJSON_AddStringToObject(result->data, "error_code", + commit->error_code ? commit->error_code : "invalid_configuration"); +} +static esp_err_t rule_mutate_locked(const cJSON *params, ts_api_result_t *result, int operation) { + const cJSON *id = cJSON_GetObjectItemCaseSensitive(params, "id"), + *revision = cJSON_GetObjectItemCaseSensitive(params, "expected_revision"); + if (!cJSON_IsString(id) || !ts_rule_id_valid(id->valuestring) || !cJSON_IsNumber(revision) || + !isfinite(revision->valuedouble) || revision->valuedouble < 0 || + revision->valuedouble > UINT32_MAX || + trunc(revision->valuedouble) != revision->valuedouble) { + ts_api_result_error(result, TS_API_ERR_INVALID_ARG, + "refresh_required: refresh the interface before saving"); return ESP_OK; } - - esp_err_t ret = ts_rule_enable(id_param->valuestring); - - if (ret == ESP_OK) { - result->code = TS_API_OK; - result->message = strdup("Rule enabled"); - } else if (ret == ESP_ERR_NOT_FOUND) { - result->code = TS_API_ERR_NOT_FOUND; - result->message = strdup("Rule not found"); - } else { - result->code = TS_API_ERR_INTERNAL; - result->message = strdup("Failed to enable rule"); + uint32_t expected = revision->valuedouble; + ts_rule_commit_result_t commit = {.error_code = "invalid_configuration"}; + if (operation == 3) { + esp_err_t e = ts_rule_commit(NULL, id->valuestring, expected, &commit); + rule_commit_reply(result, e, &commit); + return ESP_OK; } - + ts_auto_rule_t old = {0}; + esp_err_t found = ts_rule_acquire(id->valuestring, &old); + cJSON *merged = found == ESP_OK ? ts_rule_encode(&old) : cJSON_CreateObject(); + if (found == ESP_OK && old.revision != expected) { + ts_rule_release(&old); + cJSON_Delete(merged); + commit.error_code = "revision_conflict"; + rule_commit_reply(result, ESP_ERR_INVALID_STATE, &commit); + return ESP_OK; + } + ts_rule_release(&old); + if (!merged) { + ts_api_result_error(result, TS_API_ERR_INTERNAL, "no_memory"); + return ESP_OK; + } + const cJSON *field; + cJSON_ArrayForEach(field, params) { + if (!field->string || !strcmp(field->string, "expected_revision")) + continue; + cJSON *copy = cJSON_Duplicate(field, true); + if (!copy) { + cJSON_Delete(merged); + ts_api_result_error(result, TS_API_ERR_INTERNAL, "no_memory"); + return ESP_OK; + } + cJSON_DeleteItemFromObjectCaseSensitive(merged, field->string); + if (!cJSON_AddItemToObject(merged, field->string, copy)) { + cJSON_Delete(copy); + cJSON_Delete(merged); + ts_api_result_error(result, TS_API_ERR_INTERNAL, "no_memory"); + return ESP_OK; + } + } + if (operation == 1 || operation == 2) { + cJSON_DeleteItemFromObject(merged, "enabled"); + if (!cJSON_AddBoolToObject(merged, "enabled", operation == 1)) { + cJSON_Delete(merged); + return ESP_ERR_NO_MEM; + } + } + ts_auto_rule_t candidate = {0}; + esp_err_t e = ts_rule_decode(merged, &candidate); + cJSON_Delete(merged); + if (e == ESP_OK) + e = ts_rule_commit(&candidate, id->valuestring, expected, &commit); + else + commit.error_code = e == ESP_ERR_NO_MEM ? "no_memory" : "invalid_configuration"; + ts_rule_dispose(&candidate); + rule_commit_reply(result, e, &commit); return ESP_OK; } -/** - * @brief automation.rules.disable - Disable a rule - */ -static esp_err_t api_automation_rules_disable(const cJSON *params, ts_api_result_t *result) -{ - cJSON *id_param = cJSON_GetObjectItem(params, "id"); - if (!id_param || !cJSON_IsString(id_param)) { - result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Missing 'id' parameter"); +static esp_err_t rule_mutate(const cJSON *params, ts_api_result_t *result, int operation) { + if (!ts_rule_edit_begin()) { + ts_api_result_error(result, TS_API_ERR_INTERNAL, "configuration_busy"); return ESP_OK; } + esp_err_t ret = rule_mutate_locked(params, result, operation); + ts_rule_edit_end(); + return ret; +} +static esp_err_t api_automation_rules_enable(const cJSON *params, ts_api_result_t *result) { + return rule_mutate(params, result, 1); +} - esp_err_t ret = ts_rule_disable(id_param->valuestring); - - if (ret == ESP_OK) { - result->code = TS_API_OK; - result->message = strdup("Rule disabled"); - } else if (ret == ESP_ERR_NOT_FOUND) { - result->code = TS_API_ERR_NOT_FOUND; - result->message = strdup("Rule not found"); - } else { - result->code = TS_API_ERR_INTERNAL; - result->message = strdup("Failed to disable rule"); - } - - return ESP_OK; +/** + * @brief automation.rules.disable - Disable a rule + */ +static esp_err_t api_automation_rules_disable(const cJSON *params, ts_api_result_t *result) { + return rule_mutate(params, result, 2); } /** * @brief automation.rules.trigger - Manually trigger a rule */ +static esp_err_t service_request(const cJSON *params, ts_api_result_t *result, bool stop) { + const cJSON *id = cJSON_GetObjectItemCaseSensitive(params, "command_id"); + if (!cJSON_IsString(id) || !id->valuestring[0]) { + ts_api_result_error(result, TS_API_ERR_INVALID_ARG, "command_id required"); + return ESP_ERR_INVALID_ARG; + } + ts_ssh_service_status_t state = {0}; + esp_err_t ret = stop ? ts_ssh_service_stop(id->valuestring, &state) + : (cJSON_IsTrue(cJSON_GetObjectItemCaseSensitive(params, "verify")) + ? ts_ssh_service_query(id->valuestring, &state) + : ts_ssh_service_cached(id->valuestring, &state)); + cJSON *data = cJSON_CreateObject(); + if (!data) + return ESP_ERR_NO_MEM; + cJSON_AddStringToObject(data, "state", state.state[0] ? state.state : "unknown"); + cJSON_AddStringToObject(data, "last_known", state.last_known); + cJSON_AddStringToObject(data, "source", state.source); + cJSON_AddNumberToObject(data, "confirmed_ms", state.confirmed_ms); + cJSON_AddNumberToObject(data, "generation", state.generation); + cJSON_AddBoolToObject(data, "busy", state.busy); + if (ret == ESP_OK) + ts_api_result_ok(result, data); + else { + ts_api_result_error(result, TS_API_ERR_INTERNAL, "service_state_unconfirmed"); + result->data = data; + } + return ret; +} +static esp_err_t api_service_status(const cJSON *params, ts_api_result_t *result) { + return service_request(params, result, false); +} +static esp_err_t api_service_stop(const cJSON *params, ts_api_result_t *result) { + return service_request(params, result, true); +} + static esp_err_t api_automation_rules_trigger(const cJSON *params, ts_api_result_t *result) { cJSON *id_param = cJSON_GetObjectItem(params, "id"); @@ -589,701 +699,44 @@ static esp_err_t api_automation_rules_trigger(const cJSON *params, ts_api_result /** * @brief Convert operator to string */ -static const char *operator_to_string(ts_auto_operator_t op) -{ - switch (op) { - case TS_AUTO_OP_EQ: return "eq"; - case TS_AUTO_OP_NE: return "ne"; - case TS_AUTO_OP_LT: return "lt"; - case TS_AUTO_OP_LE: return "le"; - case TS_AUTO_OP_GT: return "gt"; - case TS_AUTO_OP_GE: return "ge"; - case TS_AUTO_OP_CONTAINS: return "contains"; - case TS_AUTO_OP_CHANGED: return "changed"; - case TS_AUTO_OP_CHANGED_TO: return "changed_to"; - default: return "eq"; - } -} /** * @brief automation.rules.get - Get rule details by ID */ -static esp_err_t api_automation_rules_get(const cJSON *params, ts_api_result_t *result) -{ - cJSON *id_param = cJSON_GetObjectItem(params, "id"); - if (!id_param || !cJSON_IsString(id_param)) { - result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Missing 'id' parameter"); - return ESP_OK; - } - - const ts_auto_rule_t *rule = ts_rule_get(id_param->valuestring); - if (!rule) { - result->code = TS_API_ERR_NOT_FOUND; - result->message = strdup("Rule not found"); +static esp_err_t api_automation_rules_get(const cJSON *params, ts_api_result_t *result) { + const cJSON *id = cJSON_GetObjectItemCaseSensitive(params, "id"); + ts_auto_rule_t rule; + if (!cJSON_IsString(id) || ts_rule_acquire(id->valuestring, &rule) != ESP_OK) { + ts_api_result_error(result, TS_API_ERR_NOT_FOUND, "Rule not found"); return ESP_OK; } - - result->data = cJSON_CreateObject(); - cJSON_AddStringToObject(result->data, "id", rule->id); - cJSON_AddStringToObject(result->data, "name", rule->name); - if (rule->icon[0]) { - cJSON_AddStringToObject(result->data, "icon", rule->icon); - } - cJSON_AddBoolToObject(result->data, "enabled", rule->enabled); - cJSON_AddBoolToObject(result->data, "manual_trigger", rule->manual_trigger); - cJSON_AddNumberToObject(result->data, "cooldown_ms", rule->cooldown_ms); - cJSON_AddStringToObject(result->data, "logic", - rule->conditions.logic == TS_AUTO_LOGIC_OR ? "or" : "and"); - cJSON_AddNumberToObject(result->data, "trigger_count", rule->trigger_count); - cJSON_AddNumberToObject(result->data, "last_trigger_ms", (double)rule->last_trigger_ms); - - // 添加条件数组 - cJSON *conditions = cJSON_AddArrayToObject(result->data, "conditions"); - for (int i = 0; i < rule->conditions.count; i++) { - const ts_auto_condition_t *c = &rule->conditions.conditions[i]; - cJSON *cond = cJSON_CreateObject(); - cJSON_AddStringToObject(cond, "variable", c->variable); - cJSON_AddStringToObject(cond, "operator", operator_to_string(c->op)); - - // 根据值类型添加值 - switch (c->value.type) { - case TS_AUTO_VAL_BOOL: - cJSON_AddBoolToObject(cond, "value", c->value.bool_val); - break; - case TS_AUTO_VAL_INT: - cJSON_AddNumberToObject(cond, "value", c->value.int_val); - break; - case TS_AUTO_VAL_FLOAT: - cJSON_AddNumberToObject(cond, "value", c->value.float_val); - break; - case TS_AUTO_VAL_STRING: - cJSON_AddStringToObject(cond, "value", c->value.str_val); - break; - default: - cJSON_AddNullToObject(cond, "value"); - break; - } - - cJSON_AddItemToArray(conditions, cond); - } - - // 获取所有动作模板用于匹配 - int tpl_count = ts_action_template_count(); - ts_action_template_t *templates = NULL; - if (tpl_count > 0) { - templates = heap_caps_malloc(sizeof(ts_action_template_t) * tpl_count, MALLOC_CAP_SPIRAM); - if (templates) { - size_t out_count = 0; - ts_action_template_list(templates, tpl_count, &out_count); - tpl_count = out_count; - } else { - tpl_count = 0; - } - } - - // 添加动作数组 - 完整序列化 - cJSON *actions = cJSON_AddArrayToObject(result->data, "actions"); - for (int i = 0; i < rule->action_count; i++) { - const ts_auto_action_t *a = &rule->actions[i]; - cJSON *act = cJSON_CreateObject(); - - // 添加动作类型 - const char *type_str = "log"; - switch (a->type) { - case TS_AUTO_ACT_LED: type_str = "led"; break; - case TS_AUTO_ACT_GPIO: type_str = "gpio"; break; - case TS_AUTO_ACT_DEVICE_CTRL: type_str = "device"; break; - case TS_AUTO_ACT_CLI: type_str = "cli"; break; - case TS_AUTO_ACT_LOG: type_str = "log"; break; - case TS_AUTO_ACT_SET_VAR: type_str = "set_var"; break; - case TS_AUTO_ACT_WEBHOOK: type_str = "webhook"; break; - case TS_AUTO_ACT_SSH_CMD: type_str = "ssh"; break; - case TS_AUTO_ACT_SSH_CMD_REF: type_str = "ssh_cmd_ref"; break; - default: type_str = "log"; break; - } - cJSON_AddStringToObject(act, "type", type_str); - cJSON_AddNumberToObject(act, "delay_ms", a->delay_ms); - - // 添加重复执行选项 - if (a->repeat_mode != TS_AUTO_REPEAT_ONCE) { - const char *repeat_mode_str = "once"; - switch (a->repeat_mode) { - case TS_AUTO_REPEAT_WHILE_TRUE: repeat_mode_str = "while_true"; break; - case TS_AUTO_REPEAT_COUNT: repeat_mode_str = "count"; break; - default: break; - } - cJSON_AddStringToObject(act, "repeat_mode", repeat_mode_str); - cJSON_AddNumberToObject(act, "repeat_interval_ms", a->repeat_interval_ms); - if (a->repeat_mode == TS_AUTO_REPEAT_COUNT) { - cJSON_AddNumberToObject(act, "repeat_count", a->repeat_count); - } - } - - // 如果有模板 ID,添加它 - if (a->template_id[0]) { - cJSON_AddStringToObject(act, "template_id", a->template_id); - } - - // 根据类型添加特定字段 - switch (a->type) { - case TS_AUTO_ACT_LED: - cJSON_AddStringToObject(act, "device", a->led.device); - cJSON_AddNumberToObject(act, "index", a->led.index); - cJSON_AddNumberToObject(act, "r", a->led.r); - cJSON_AddNumberToObject(act, "g", a->led.g); - cJSON_AddNumberToObject(act, "b", a->led.b); - if (a->led.effect[0]) { - cJSON_AddStringToObject(act, "effect", a->led.effect); - } - cJSON_AddNumberToObject(act, "duration_ms", a->led.duration_ms); - break; - case TS_AUTO_ACT_GPIO: - cJSON_AddNumberToObject(act, "pin", a->gpio.pin); - cJSON_AddBoolToObject(act, "level", a->gpio.level); - cJSON_AddNumberToObject(act, "pulse_ms", a->gpio.pulse_ms); - break; - case TS_AUTO_ACT_DEVICE_CTRL: - cJSON_AddStringToObject(act, "device", a->device.device); - cJSON_AddStringToObject(act, "action", a->device.action); - break; - case TS_AUTO_ACT_CLI: - cJSON_AddStringToObject(act, "command", a->cli.command); - break; - case TS_AUTO_ACT_LOG: - cJSON_AddStringToObject(act, "message", a->log.message); - cJSON_AddNumberToObject(act, "level", a->log.level); - break; - case TS_AUTO_ACT_SSH_CMD_REF: - cJSON_AddStringToObject(act, "cmd_id", a->ssh_ref.cmd_id); - break; - default: - break; - } - - // 尝试通过动作配置查找匹配的模板 ID(仅当没有保存 template_id 时) - if (!a->template_id[0]) { - for (int j = 0; j < tpl_count && templates; j++) { - ts_action_template_t *tpl = &templates[j]; - if (tpl->action.type == a->type) { - bool match = false; - switch (a->type) { - case TS_AUTO_ACT_CLI: - match = (strcmp(tpl->action.cli.command, a->cli.command) == 0); - break; - case TS_AUTO_ACT_LED: - match = (strcmp(tpl->action.led.device, a->led.device) == 0); - break; - case TS_AUTO_ACT_LOG: - match = (strcmp(tpl->action.log.message, a->log.message) == 0); - break; - default: - match = true; - break; - } - if (match) { - cJSON_AddStringToObject(act, "template_id", tpl->id); - break; - } - } - } - } - - // 序列化动作级别的条件 - if (a->condition.has_condition) { - cJSON *action_cond = cJSON_CreateObject(); - cJSON_AddStringToObject(action_cond, "variable", a->condition.variable); - cJSON_AddStringToObject(action_cond, "operator", operator_to_string(a->condition.op)); - - switch (a->condition.value.type) { - case TS_AUTO_VAL_BOOL: - cJSON_AddBoolToObject(action_cond, "value", a->condition.value.bool_val); - break; - case TS_AUTO_VAL_INT: - cJSON_AddNumberToObject(action_cond, "value", a->condition.value.int_val); - break; - case TS_AUTO_VAL_FLOAT: - cJSON_AddNumberToObject(action_cond, "value", a->condition.value.float_val); - break; - case TS_AUTO_VAL_STRING: - cJSON_AddStringToObject(action_cond, "value", a->condition.value.str_val); - break; - default: - cJSON_AddNullToObject(action_cond, "value"); - break; - } - - cJSON_AddItemToObject(act, "condition", action_cond); - } - - cJSON_AddItemToArray(actions, act); - } - - // 释放模板列表 - if (templates) { - free(templates); - } - - result->code = TS_API_OK; + ts_rule_resolve_presentation(&rule); + result->data = ts_rule_encode(&rule); + ts_rule_release(&rule); + result->code = result->data ? TS_API_OK : TS_API_ERR_INTERNAL; return ESP_OK; } /** * @brief Parse operator from string */ -static ts_auto_operator_t parse_operator(const char *op_str) -{ - if (!op_str) return TS_AUTO_OP_EQ; - if (strcmp(op_str, "eq") == 0 || strcmp(op_str, "==") == 0) return TS_AUTO_OP_EQ; - if (strcmp(op_str, "ne") == 0 || strcmp(op_str, "!=") == 0) return TS_AUTO_OP_NE; - if (strcmp(op_str, "lt") == 0 || strcmp(op_str, "<") == 0) return TS_AUTO_OP_LT; - if (strcmp(op_str, "le") == 0 || strcmp(op_str, "<=") == 0) return TS_AUTO_OP_LE; - if (strcmp(op_str, "gt") == 0 || strcmp(op_str, ">") == 0) return TS_AUTO_OP_GT; - if (strcmp(op_str, "ge") == 0 || strcmp(op_str, ">=") == 0) return TS_AUTO_OP_GE; - if (strcmp(op_str, "contains") == 0) return TS_AUTO_OP_CONTAINS; - if (strcmp(op_str, "changed") == 0) return TS_AUTO_OP_CHANGED; - if (strcmp(op_str, "changed_to") == 0) return TS_AUTO_OP_CHANGED_TO; - return TS_AUTO_OP_EQ; -} /** * @brief Parse action type from string */ -static ts_auto_action_type_t parse_action_type(const char *type_str) -{ - if (!type_str) return TS_AUTO_ACT_LOG; - if (strcmp(type_str, "led") == 0) return TS_AUTO_ACT_LED; - if (strcmp(type_str, "gpio") == 0) return TS_AUTO_ACT_GPIO; - if (strcmp(type_str, "ssh") == 0) return TS_AUTO_ACT_SSH_CMD; - if (strcmp(type_str, "ssh_cmd_ref") == 0) return TS_AUTO_ACT_SSH_CMD_REF; - if (strcmp(type_str, "webhook") == 0) return TS_AUTO_ACT_WEBHOOK; - if (strcmp(type_str, "log") == 0) return TS_AUTO_ACT_LOG; - if (strcmp(type_str, "set_var") == 0) return TS_AUTO_ACT_SET_VAR; - if (strcmp(type_str, "device") == 0) return TS_AUTO_ACT_DEVICE_CTRL; - return TS_AUTO_ACT_LOG; -} /** * @brief automation.rules.add - Add a new rule */ -static esp_err_t api_automation_rules_add(const cJSON *params, ts_api_result_t *result) -{ - // 必须参数 - cJSON *id_param = cJSON_GetObjectItem(params, "id"); - cJSON *name_param = cJSON_GetObjectItem(params, "name"); - - if (!id_param || !cJSON_IsString(id_param)) { - result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Missing 'id' parameter"); - return ESP_OK; - } - - if (!name_param || !cJSON_IsString(name_param)) { - result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Missing 'name' parameter"); - return ESP_OK; - } - - // 分配规则结构 - ts_auto_rule_t rule = {0}; - strncpy(rule.id, id_param->valuestring, sizeof(rule.id) - 1); - strncpy(rule.name, name_param->valuestring, sizeof(rule.name) - 1); - - // 图标(可选) - cJSON *icon = cJSON_GetObjectItem(params, "icon"); - if (icon && cJSON_IsString(icon)) { - strncpy(rule.icon, icon->valuestring, sizeof(rule.icon) - 1); - } else { - strncpy(rule.icon, "⚡", sizeof(rule.icon) - 1); - } - - // 可选参数 - cJSON *enabled = cJSON_GetObjectItem(params, "enabled"); - rule.enabled = enabled ? cJSON_IsTrue(enabled) : true; - - // 手动触发标记 - cJSON *manual_trigger = cJSON_GetObjectItem(params, "manual_trigger"); - rule.manual_trigger = manual_trigger ? cJSON_IsTrue(manual_trigger) : false; - - cJSON *cooldown = cJSON_GetObjectItem(params, "cooldown_ms"); - rule.cooldown_ms = cooldown && cJSON_IsNumber(cooldown) ? (uint32_t)cooldown->valueint : 0; - - // 解析条件数组 - cJSON *conditions = cJSON_GetObjectItem(params, "conditions"); - if (conditions && cJSON_IsArray(conditions)) { - int cond_count = cJSON_GetArraySize(conditions); - if (cond_count > 0) { - rule.conditions.conditions = heap_caps_calloc(cond_count, sizeof(ts_auto_condition_t), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (rule.conditions.conditions) { - rule.conditions.count = cond_count; - - cJSON *logic_param = cJSON_GetObjectItem(params, "logic"); - if (logic_param && cJSON_IsString(logic_param) && strcmp(logic_param->valuestring, "or") == 0) { - rule.conditions.logic = TS_AUTO_LOGIC_OR; - } else { - rule.conditions.logic = TS_AUTO_LOGIC_AND; - } - - int idx = 0; - cJSON *cond; - cJSON_ArrayForEach(cond, conditions) { - ts_auto_condition_t *c = &rule.conditions.conditions[idx]; - - cJSON *var = cJSON_GetObjectItem(cond, "variable"); - cJSON *op = cJSON_GetObjectItem(cond, "operator"); - cJSON *val = cJSON_GetObjectItem(cond, "value"); - - if (var && cJSON_IsString(var)) { - strncpy(c->variable, var->valuestring, sizeof(c->variable) - 1); - } - if (op && cJSON_IsString(op)) { - c->op = parse_operator(op->valuestring); - } - if (val) { - if (cJSON_IsBool(val)) { - c->value.type = TS_AUTO_VAL_BOOL; - c->value.bool_val = cJSON_IsTrue(val); - } else if (cJSON_IsNumber(val)) { - c->value.type = TS_AUTO_VAL_FLOAT; - c->value.float_val = val->valuedouble; - } else if (cJSON_IsString(val)) { - c->value.type = TS_AUTO_VAL_STRING; - strncpy(c->value.str_val, val->valuestring, sizeof(c->value.str_val) - 1); - } - } - idx++; - } - } - } - } - - // 解析动作数组 - // 支持两种格式: - // 1. 模板引用: { "template_id": "xxx", "delay_ms": 0 } - // 2. 内联定义: { "type": "led", "device": "board", ... } (向后兼容) - cJSON *actions = cJSON_GetObjectItem(params, "actions"); - if (actions && cJSON_IsArray(actions)) { - int act_count = cJSON_GetArraySize(actions); - if (act_count > 0) { - rule.actions = heap_caps_calloc(act_count, sizeof(ts_auto_action_t), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (rule.actions) { - rule.action_count = act_count; - - int idx = 0; - cJSON *act; - cJSON_ArrayForEach(act, actions) { - ts_auto_action_t *a = &rule.actions[idx]; - - // 检查是否是模板引用 - cJSON *template_id = cJSON_GetObjectItem(act, "template_id"); - if (template_id && cJSON_IsString(template_id)) { - // 从动作模板获取配置 - ts_action_template_t tpl; - if (ts_action_template_get(template_id->valuestring, &tpl) == ESP_OK) { - // 复制动作配置 - memcpy(a, &tpl.action, sizeof(ts_auto_action_t)); - - // 保存模板 ID 用于追踪 - strncpy(a->template_id, template_id->valuestring, sizeof(a->template_id) - 1); - - // 如果提供了覆盖的 delay_ms,使用它 - cJSON *delay = cJSON_GetObjectItem(act, "delay_ms"); - if (delay && cJSON_IsNumber(delay)) { - a->delay_ms = (uint16_t)delay->valueint; - } - - // 解析重复执行选项 - cJSON *repeat_mode = cJSON_GetObjectItem(act, "repeat_mode"); - if (repeat_mode && cJSON_IsString(repeat_mode)) { - if (strcmp(repeat_mode->valuestring, "while_true") == 0) { - a->repeat_mode = TS_AUTO_REPEAT_WHILE_TRUE; - } else if (strcmp(repeat_mode->valuestring, "count") == 0) { - a->repeat_mode = TS_AUTO_REPEAT_COUNT; - } else { - a->repeat_mode = TS_AUTO_REPEAT_ONCE; - } - } - - cJSON *repeat_count = cJSON_GetObjectItem(act, "repeat_count"); - if (repeat_count && cJSON_IsNumber(repeat_count)) { - a->repeat_count = (uint8_t)repeat_count->valueint; - } - - cJSON *repeat_interval = cJSON_GetObjectItem(act, "repeat_interval_ms"); - if (repeat_interval && cJSON_IsNumber(repeat_interval)) { - a->repeat_interval_ms = (uint16_t)repeat_interval->valueint; - } - - // 解析动作级别的条件 - cJSON *action_cond = cJSON_GetObjectItem(act, "condition"); - if (action_cond && cJSON_IsObject(action_cond)) { - a->condition.has_condition = true; - - cJSON *cond_var = cJSON_GetObjectItem(action_cond, "variable"); - cJSON *cond_op = cJSON_GetObjectItem(action_cond, "operator"); - cJSON *cond_val = cJSON_GetObjectItem(action_cond, "value"); - - if (cond_var && cJSON_IsString(cond_var)) { - strncpy(a->condition.variable, cond_var->valuestring, - sizeof(a->condition.variable) - 1); - } - if (cond_op && cJSON_IsString(cond_op)) { - a->condition.op = parse_operator(cond_op->valuestring); - } - if (cond_val) { - if (cJSON_IsBool(cond_val)) { - a->condition.value.type = TS_AUTO_VAL_BOOL; - a->condition.value.bool_val = cJSON_IsTrue(cond_val); - } else if (cJSON_IsNumber(cond_val)) { - a->condition.value.type = TS_AUTO_VAL_FLOAT; - a->condition.value.float_val = cond_val->valuedouble; - } else if (cJSON_IsString(cond_val)) { - a->condition.value.type = TS_AUTO_VAL_STRING; - strncpy(a->condition.value.str_val, cond_val->valuestring, - sizeof(a->condition.value.str_val) - 1); - } - } - - TS_LOGI(TAG, "Action condition: %s %d ...", - a->condition.variable, a->condition.op); - } - - TS_LOGI(TAG, "Rule action from template: %s (type=%d, repeat=%d)", - template_id->valuestring, a->type, a->repeat_mode); - } else { - TS_LOGW(TAG, "Action template not found: %s, using LOG action as placeholder", - template_id->valuestring); - // 设置为 LOG 类型,记录错误信息 - a->type = TS_AUTO_ACT_LOG; - a->log.level = 2; // ESP_LOG_WARN - snprintf(a->log.message, sizeof(a->log.message), - "Missing action template: %s", template_id->valuestring); - } - idx++; - continue; - } - - // 向后兼容:内联动作定义 - cJSON *type = cJSON_GetObjectItem(act, "type"); - if (type && cJSON_IsString(type)) { - a->type = parse_action_type(type->valuestring); - } - - cJSON *delay = cJSON_GetObjectItem(act, "delay_ms"); - a->delay_ms = delay && cJSON_IsNumber(delay) ? (uint16_t)delay->valueint : 0; - - // 根据类型解析参数 - switch (a->type) { - case TS_AUTO_ACT_LED: { - cJSON *device = cJSON_GetObjectItem(act, "device"); - cJSON *index = cJSON_GetObjectItem(act, "index"); - cJSON *r = cJSON_GetObjectItem(act, "r"); - cJSON *g = cJSON_GetObjectItem(act, "g"); - cJSON *b = cJSON_GetObjectItem(act, "b"); - cJSON *effect = cJSON_GetObjectItem(act, "effect"); - cJSON *duration = cJSON_GetObjectItem(act, "duration"); - - if (device && cJSON_IsString(device)) { - strncpy(a->led.device, device->valuestring, sizeof(a->led.device) - 1); - } - a->led.index = index && cJSON_IsNumber(index) ? (uint8_t)index->valueint : 0xFF; - a->led.r = r && cJSON_IsNumber(r) ? (uint8_t)r->valueint : 0; - a->led.g = g && cJSON_IsNumber(g) ? (uint8_t)g->valueint : 0; - a->led.b = b && cJSON_IsNumber(b) ? (uint8_t)b->valueint : 0; - if (effect && cJSON_IsString(effect)) { - strncpy(a->led.effect, effect->valuestring, sizeof(a->led.effect) - 1); - TS_LOGI(TAG, "Parsed LED action: device=%s, effect=%s", - a->led.device, a->led.effect); - } - a->led.duration_ms = duration && cJSON_IsNumber(duration) ? (uint16_t)duration->valueint : 0; - break; - } - case TS_AUTO_ACT_GPIO: { - cJSON *pin = cJSON_GetObjectItem(act, "pin"); - cJSON *level = cJSON_GetObjectItem(act, "level"); - cJSON *pulse = cJSON_GetObjectItem(act, "pulse_ms"); - - a->gpio.pin = pin && cJSON_IsNumber(pin) ? (uint8_t)pin->valueint : 0; - a->gpio.level = level && cJSON_IsTrue(level); - a->gpio.pulse_ms = pulse && cJSON_IsNumber(pulse) ? (uint32_t)pulse->valueint : 0; - break; - } - case TS_AUTO_ACT_DEVICE_CTRL: { - cJSON *device = cJSON_GetObjectItem(act, "device"); - cJSON *action = cJSON_GetObjectItem(act, "action"); - - if (device && cJSON_IsString(device)) { - strncpy(a->device.device, device->valuestring, sizeof(a->device.device) - 1); - } - if (action && cJSON_IsString(action)) { - strncpy(a->device.action, action->valuestring, sizeof(a->device.action) - 1); - } - break; - } - case TS_AUTO_ACT_LOG: { - cJSON *message = cJSON_GetObjectItem(act, "message"); - cJSON *level = cJSON_GetObjectItem(act, "level"); - - if (message && cJSON_IsString(message)) { - strncpy(a->log.message, message->valuestring, sizeof(a->log.message) - 1); - } - a->log.level = level && cJSON_IsNumber(level) ? (uint8_t)level->valueint : 3; // ESP_LOG_INFO - break; - } - case TS_AUTO_ACT_SET_VAR: { - cJSON *var = cJSON_GetObjectItem(act, "variable"); - cJSON *val = cJSON_GetObjectItem(act, "value"); - - if (var && cJSON_IsString(var)) { - strncpy(a->set_var.variable, var->valuestring, sizeof(a->set_var.variable) - 1); - } - if (val) { - if (cJSON_IsBool(val)) { - a->set_var.value.type = TS_AUTO_VAL_BOOL; - a->set_var.value.bool_val = cJSON_IsTrue(val); - } else if (cJSON_IsNumber(val)) { - a->set_var.value.type = TS_AUTO_VAL_FLOAT; - a->set_var.value.float_val = val->valuedouble; - } else if (cJSON_IsString(val)) { - a->set_var.value.type = TS_AUTO_VAL_STRING; - strncpy(a->set_var.value.str_val, val->valuestring, sizeof(a->set_var.value.str_val) - 1); - } - } - break; - } - case TS_AUTO_ACT_WEBHOOK: { - cJSON *url = cJSON_GetObjectItem(act, "url"); - cJSON *method = cJSON_GetObjectItem(act, "method"); - cJSON *body = cJSON_GetObjectItem(act, "body"); - - if (url && cJSON_IsString(url)) { - strncpy(a->webhook.url, url->valuestring, sizeof(a->webhook.url) - 1); - } - if (method && cJSON_IsString(method)) { - strncpy(a->webhook.method, method->valuestring, sizeof(a->webhook.method) - 1); - } else { - strcpy(a->webhook.method, "POST"); - } - if (body && cJSON_IsString(body)) { - strncpy(a->webhook.body_template, body->valuestring, sizeof(a->webhook.body_template) - 1); - } - break; - } - case TS_AUTO_ACT_SSH_CMD_REF: { - cJSON *cmd_id = cJSON_GetObjectItem(act, "cmd_id"); - if (cmd_id && cJSON_IsString(cmd_id)) { - strncpy(a->ssh_ref.cmd_id, cmd_id->valuestring, sizeof(a->ssh_ref.cmd_id) - 1); - TS_LOGI(TAG, "Parsed SSH_CMD_REF action: cmd_id=%s", a->ssh_ref.cmd_id); - } - break; - } - default: - break; - } - - // 解析内联动作的条件 - cJSON *action_cond = cJSON_GetObjectItem(act, "condition"); - if (action_cond && cJSON_IsObject(action_cond)) { - a->condition.has_condition = true; - - cJSON *cond_var = cJSON_GetObjectItem(action_cond, "variable"); - cJSON *cond_op = cJSON_GetObjectItem(action_cond, "operator"); - cJSON *cond_val = cJSON_GetObjectItem(action_cond, "value"); - - if (cond_var && cJSON_IsString(cond_var)) { - strncpy(a->condition.variable, cond_var->valuestring, - sizeof(a->condition.variable) - 1); - } - if (cond_op && cJSON_IsString(cond_op)) { - a->condition.op = parse_operator(cond_op->valuestring); - } - if (cond_val) { - if (cJSON_IsBool(cond_val)) { - a->condition.value.type = TS_AUTO_VAL_BOOL; - a->condition.value.bool_val = cJSON_IsTrue(cond_val); - } else if (cJSON_IsNumber(cond_val)) { - a->condition.value.type = TS_AUTO_VAL_FLOAT; - a->condition.value.float_val = cond_val->valuedouble; - } else if (cJSON_IsString(cond_val)) { - a->condition.value.type = TS_AUTO_VAL_STRING; - strncpy(a->condition.value.str_val, cond_val->valuestring, - sizeof(a->condition.value.str_val) - 1); - } - } - } - idx++; - } - } - } - } - - esp_err_t ret = ts_rule_register(&rule); - - // 释放分配的内存(ts_rule_register 会复制数据) - if (rule.conditions.conditions) { - free(rule.conditions.conditions); - } - if (rule.actions) { - free(rule.actions); - } - - if (ret == ESP_OK) { - result->code = TS_API_OK; - result->message = strdup("Rule created successfully"); - result->data = cJSON_CreateObject(); - cJSON_AddStringToObject(result->data, "id", rule.id); - } else if (ret == ESP_ERR_NO_MEM) { - result->code = TS_API_ERR_INTERNAL; - result->message = strdup("No memory for new rule"); - } else if (ret == ESP_ERR_INVALID_STATE) { - result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Rule with this ID already exists"); - } else { - result->code = TS_API_ERR_INTERNAL; - result->message = strdup("Failed to create rule"); - } - - return ESP_OK; +static esp_err_t api_automation_rules_add(const cJSON *params, ts_api_result_t *result) { + return rule_mutate(params, result, 0); } /** * @brief automation.rules.delete - Delete a rule */ -static esp_err_t api_automation_rules_delete(const cJSON *params, ts_api_result_t *result) -{ - cJSON *id_param = cJSON_GetObjectItem(params, "id"); - if (!id_param || !cJSON_IsString(id_param)) { - result->code = TS_API_ERR_INVALID_ARG; - result->message = strdup("Missing 'id' parameter"); - return ESP_OK; - } - - const char *rule_id = id_param->valuestring; - esp_err_t ret = ts_rule_unregister(rule_id); - - if (ret == ESP_OK) { - // 同时删除 SD 卡上的配置文件(.json 和 .tscfg) - char filepath[128]; - snprintf(filepath, sizeof(filepath), "%s/%s.json", RULES_SDCARD_DIR, rule_id); - if (unlink(filepath) == 0) { - TS_LOGI(TAG, "Deleted rule config: %s", filepath); - } - snprintf(filepath, sizeof(filepath), "%s/%s.tscfg", RULES_SDCARD_DIR, rule_id); - if (unlink(filepath) == 0) { - TS_LOGI(TAG, "Deleted rule config pack: %s", filepath); - } - - result->code = TS_API_OK; - result->message = strdup("Rule deleted"); - } else if (ret == ESP_ERR_NOT_FOUND) { - result->code = TS_API_ERR_NOT_FOUND; - result->message = strdup("Rule not found"); - } else { - result->code = TS_API_ERR_INTERNAL; - result->message = strdup("Failed to delete rule"); - } - - return ESP_OK; +static esp_err_t api_automation_rules_delete(const cJSON *params, ts_api_result_t *result) { + return rule_mutate(params, result, 3); } /*===========================================================================*/ @@ -4184,7 +3637,7 @@ static esp_err_t api_automation_sources_export(const cJSON *params, ts_api_resul } // Copy to avoid holding lock memcpy(&source_copy, source, sizeof(ts_auto_source_t)); - + // Build export JSON cJSON *export_json = cJSON_CreateObject(); cJSON_AddStringToObject(export_json, "type", "automation_source"); @@ -4395,105 +3848,6 @@ static esp_err_t api_automation_sources_import(const cJSON *params, ts_api_resul /** * @brief Serialize rule to JSON for export */ -static cJSON *rule_to_export_json(const ts_auto_rule_t *rule) -{ - cJSON *obj = cJSON_CreateObject(); - cJSON_AddStringToObject(obj, "id", rule->id); - cJSON_AddStringToObject(obj, "name", rule->name); - if (rule->icon[0]) { - cJSON_AddStringToObject(obj, "icon", rule->icon); - } - cJSON_AddBoolToObject(obj, "enabled", rule->enabled); - cJSON_AddBoolToObject(obj, "manual_trigger", rule->manual_trigger); - cJSON_AddNumberToObject(obj, "cooldown_ms", rule->cooldown_ms); - cJSON_AddStringToObject(obj, "logic", - rule->conditions.logic == TS_AUTO_LOGIC_OR ? "or" : "and"); - - // Conditions - cJSON *conditions = cJSON_AddArrayToObject(obj, "conditions"); - for (int i = 0; i < rule->conditions.count; i++) { - const ts_auto_condition_t *c = &rule->conditions.conditions[i]; - cJSON *cond = cJSON_CreateObject(); - cJSON_AddStringToObject(cond, "variable", c->variable); - cJSON_AddStringToObject(cond, "operator", operator_to_string(c->op)); - switch (c->value.type) { - case TS_AUTO_VAL_BOOL: - cJSON_AddBoolToObject(cond, "value", c->value.bool_val); - break; - case TS_AUTO_VAL_INT: - cJSON_AddNumberToObject(cond, "value", c->value.int_val); - break; - case TS_AUTO_VAL_FLOAT: - cJSON_AddNumberToObject(cond, "value", c->value.float_val); - break; - case TS_AUTO_VAL_STRING: - cJSON_AddStringToObject(cond, "value", c->value.str_val); - break; - default: - cJSON_AddNullToObject(cond, "value"); - break; - } - cJSON_AddItemToArray(conditions, cond); - } - - // Actions - cJSON *actions = cJSON_AddArrayToObject(obj, "actions"); - for (int i = 0; i < rule->action_count; i++) { - const ts_auto_action_t *a = &rule->actions[i]; - cJSON *act = cJSON_CreateObject(); - - const char *type_str = "log"; - switch (a->type) { - case TS_AUTO_ACT_LED: type_str = "led"; break; - case TS_AUTO_ACT_GPIO: type_str = "gpio"; break; - case TS_AUTO_ACT_DEVICE_CTRL: type_str = "device"; break; - case TS_AUTO_ACT_CLI: type_str = "cli"; break; - case TS_AUTO_ACT_LOG: type_str = "log"; break; - case TS_AUTO_ACT_SET_VAR: type_str = "set_var"; break; - case TS_AUTO_ACT_WEBHOOK: type_str = "webhook"; break; - case TS_AUTO_ACT_SSH_CMD: type_str = "ssh"; break; - case TS_AUTO_ACT_SSH_CMD_REF: type_str = "ssh_cmd_ref"; break; - default: type_str = "log"; break; - } - cJSON_AddStringToObject(act, "type", type_str); - cJSON_AddNumberToObject(act, "delay_ms", a->delay_ms); - - if (a->template_id[0]) { - cJSON_AddStringToObject(act, "template_id", a->template_id); - } - - // Type-specific fields - switch (a->type) { - case TS_AUTO_ACT_LED: - cJSON_AddStringToObject(act, "device", a->led.device); - cJSON_AddNumberToObject(act, "index", a->led.index); - cJSON_AddNumberToObject(act, "r", a->led.r); - cJSON_AddNumberToObject(act, "g", a->led.g); - cJSON_AddNumberToObject(act, "b", a->led.b); - if (a->led.effect[0]) { - cJSON_AddStringToObject(act, "effect", a->led.effect); - } - cJSON_AddNumberToObject(act, "duration_ms", a->led.duration_ms); - break; - case TS_AUTO_ACT_CLI: - cJSON_AddStringToObject(act, "command", a->cli.command); - break; - case TS_AUTO_ACT_LOG: - cJSON_AddStringToObject(act, "message", a->log.message); - cJSON_AddNumberToObject(act, "level", a->log.level); - break; - case TS_AUTO_ACT_SSH_CMD_REF: - cJSON_AddStringToObject(act, "cmd_id", a->ssh_ref.cmd_id); - break; - default: - break; - } - - cJSON_AddItemToArray(actions, act); - } - - return obj; -} /** * @brief automation.rules.export - Export rule as config pack @@ -4516,18 +3870,27 @@ static esp_err_t api_automation_rules_export(const cJSON *params, ts_api_result_ "This device is not authorized to export config packs"); return ESP_OK; } - - const ts_auto_rule_t *rule = ts_rule_get(id->valuestring); - if (!rule) { + + ts_auto_rule_t snapshot; + if (ts_rule_acquire(id->valuestring, &snapshot) != ESP_OK) { ts_api_result_error(result, TS_API_ERR_NOT_FOUND, "Rule not found"); return ESP_OK; } - + + char rule_id[TS_AUTO_NAME_MAX_LEN]; + strcpy(rule_id, snapshot.id); // Build export JSON cJSON *export_json = cJSON_CreateObject(); cJSON_AddStringToObject(export_json, "type", "automation_rule"); - cJSON_AddItemToObject(export_json, "rule", rule_to_export_json(rule)); - + cJSON *encoded = ts_rule_encode(&snapshot); + ts_rule_release(&snapshot); + if (!encoded || !export_json || !cJSON_AddItemToObject(export_json, "rule", encoded)) { + cJSON_Delete(encoded); + cJSON_Delete(export_json); + ts_api_result_error(result, TS_API_ERR_INTERNAL, "no_memory"); + return ESP_OK; + } + char *json_str = cJSON_PrintUnformatted(export_json); cJSON_Delete(export_json); if (!json_str) { @@ -4571,9 +3934,9 @@ static esp_err_t api_automation_rules_export(const cJSON *params, ts_api_result_ char *tscfg_output = NULL; size_t tscfg_len = 0; - ts_config_pack_result_t pack_result = ts_config_pack_create( - rule->id, json_str, strlen(json_str), &opts, &tscfg_output, &tscfg_len); - + ts_config_pack_result_t pack_result = ts_config_pack_create(rule_id, json_str, strlen(json_str), + &opts, &tscfg_output, &tscfg_len); + cJSON_free(json_str); if (free_cert) free(cert_pem); @@ -4586,7 +3949,7 @@ static esp_err_t api_automation_rules_export(const cJSON *params, ts_api_result_ cJSON *data = cJSON_CreateObject(); cJSON_AddStringToObject(data, "tscfg", tscfg_output); char filename[80]; - snprintf(filename, sizeof(filename), "rule_%s.tscfg", rule->id); + snprintf(filename, sizeof(filename), "rule_%s.tscfg", rule_id); cJSON_AddStringToObject(data, "filename", filename); free(tscfg_output); @@ -4683,45 +4046,9 @@ static esp_err_t api_automation_rules_import(const cJSON *params, ts_api_result_ ts_api_result_ok(result, data); return ESP_OK; } - - // Ensure directory exists - if (stat(RULES_SDCARD_DIR, &st) != 0) { - mkdir(RULES_SDCARD_DIR, 0755); - } - - // Save .tscfg file - snprintf(filepath, sizeof(filepath), "%s/%s.tscfg", RULES_SDCARD_DIR, config_id); - FILE *f = fopen(filepath, "w"); - if (!f) { - ts_api_result_error(result, TS_API_ERR_INTERNAL, "Failed to create config file"); - return ESP_OK; - } - - size_t written = fwrite(tscfg->valuestring, 1, strlen(tscfg->valuestring), f); - fclose(f); - - if (written != strlen(tscfg->valuestring)) { - unlink(filepath); - ts_api_result_error(result, TS_API_ERR_INTERNAL, "Failed to write config file"); - return ESP_OK; - } - - // Delete old .json if overwriting - if (do_overwrite) { - char json_path[128]; - snprintf(json_path, sizeof(json_path), "%s/%s.json", RULES_SDCARD_DIR, config_id); - unlink(json_path); - } - - TS_LOGI(TAG, "Rule config imported: %s (will be loaded on restart)", filepath); - - cJSON *data = cJSON_CreateObject(); - cJSON_AddStringToObject(data, "id", config_id); - cJSON_AddStringToObject(data, "path", filepath); - cJSON_AddBoolToObject(data, "imported", true); - cJSON_AddBoolToObject(data, "overwritten", exists && do_overwrite); - cJSON_AddStringToObject(data, "note", "Restart system to load the new config"); - ts_api_result_ok(result, data); + + ts_api_result_error(result, TS_API_ERR_INVALID_ARG, + "source_read_only: encrypted rule import requires a recoverable writer"); return ESP_OK; } @@ -5151,6 +4478,16 @@ esp_err_t ts_api_automation_register(void) }; ts_api_register(&ep_rules_get); + ts_api_endpoint_t ep_service = {.name = "automation.services.status", + .description = "Confirm managed remote process state", + .category = TS_API_CAT_SYSTEM, + .handler = api_service_status, + .requires_auth = true}; + ts_api_register(&ep_service); + ep_service.name = "automation.services.stop"; + ep_service.handler = api_service_stop; + ep_service.description = "Stop verified managed remote process"; + ts_api_register(&ep_service); ts_api_endpoint_t ep_rules_trigger = { .name = "automation.rules.trigger", .description = "Manually trigger a rule", @@ -5168,6 +4505,10 @@ esp_err_t ts_api_automation_register(void) .requires_auth = true, }; ts_api_register(&ep_rules_add); + ts_api_endpoint_t ep_rules_update = ep_rules_add; + ep_rules_update.name = "automation.rules.update"; + ep_rules_update.description = "Update rule with expected revision"; + ts_api_register(&ep_rules_update); ts_api_endpoint_t ep_rules_delete = { .name = "automation.rules.delete", diff --git a/components/ts_api/src/ts_api_cert.c b/components/ts_api/src/ts_api_cert.c index 8c20cde..d1e02b0 100644 --- a/components/ts_api/src/ts_api_cert.c +++ b/components/ts_api/src/ts_api_cert.c @@ -17,6 +17,7 @@ #include "ts_api.h" #include "ts_cert.h" +#include "ts_https.h" #include "ts_log.h" #include #include @@ -41,9 +42,11 @@ static const char *status_to_display(ts_cert_status_t status) case TS_CERT_STATUS_CSR_PENDING: return "CSR 已生成,等待签发"; case TS_CERT_STATUS_ACTIVATED: - return "已激活"; + return "设备证书时间有效"; case TS_CERT_STATUS_EXPIRED: return "已过期"; + case TS_CERT_STATUS_TIME_UNVERIFIED: return "待校时确认"; + case TS_CERT_STATUS_NOT_YET_VALID: return "尚未生效"; case TS_CERT_STATUS_ERROR: return "错误"; default: @@ -51,6 +54,66 @@ static const char *status_to_display(ts_cert_status_t status) } } +static void add_validity(cJSON *data, const ts_cert_info_t *info) +{ + cJSON_AddStringToObject(data, "validity", ts_cert_validity_to_str(info->validity)); + cJSON_AddBoolToObject(data, "time_ready", info->time_ready); + cJSON_AddBoolToObject(data, "serial_truncated", info->serial_truncated); + if (info->time_ready && info->validity != TS_CERT_VALIDITY_INVALID && info->validity != TS_CERT_VALIDITY_NONE) + cJSON_AddNumberToObject(data, "seconds_until_expiry", (double)info->seconds_until_expiry); + else cJSON_AddNullToObject(data, "seconds_until_expiry"); + cJSON_AddBoolToObject(data, "expires_soon", info->is_valid && info->seconds_until_expiry < 30LL * 86400); +} + +static void add_runtime(cJSON *data, const ts_cert_pki_status_t *s) +{ + ts_https_runtime_t runtime; + ts_https_get_runtime(&runtime); + cJSON_AddBoolToObject(data, "time_ready", s->time_ready); + cJSON_AddStringToObject(data, "validity", ts_cert_validity_to_str(s->cert_info.validity)); + cJSON_AddNumberToObject(data, "configured_generation", s->generation); + cJSON_AddBoolToObject(data, "prerequisites_satisfied", ts_cert_prerequisites(s, runtime.require_client_cert)); + cJSON_AddBoolToObject(data, "restart_required", runtime.running && runtime.loaded_generation != s->generation); + cJSON *blocked = cJSON_AddArrayToObject(data, "blocked_by"); +#define BLOCK(condition, name) if (condition) cJSON_AddItemToArray(blocked, cJSON_CreateString(name)) + BLOCK(!s->time_ready, "time_not_ready"); + BLOCK(!s->has_private_key, "private_key_missing"); + BLOCK(s->has_private_key && !s->key_valid, "private_key_invalid"); + BLOCK(!s->has_certificate, "certificate_missing"); + BLOCK(s->has_certificate && s->cert_info.validity == TS_CERT_VALIDITY_INVALID, "certificate_invalid"); + BLOCK(s->has_certificate && s->key_valid && s->cert_info.validity != TS_CERT_VALIDITY_INVALID && !s->key_matches, "key_mismatch"); + BLOCK(s->cert_info.validity == TS_CERT_VALIDITY_NOT_YET_VALID, "not_yet_valid"); + BLOCK(s->cert_info.validity == TS_CERT_VALIDITY_EXPIRED, "expired"); + BLOCK(runtime.require_client_cert && !s->has_ca_chain, "ca_missing"); + BLOCK(runtime.require_client_cert && s->has_ca_chain && !s->ca_valid, "ca_invalid"); + BLOCK(s->storage_error, "storage_error"); +#undef BLOCK + cJSON *https = cJSON_AddObjectToObject(data, "https"); + cJSON_AddBoolToObject(https, "running", runtime.running); + cJSON_AddNumberToObject(https, "port", runtime.port); + if (runtime.running) { + cJSON_AddNumberToObject(https, "loaded_generation", runtime.loaded_generation); + cJSON_AddStringToObject(https, "loaded_certificate_sha256", runtime.loaded_certificate_sha256); + } else { + cJSON_AddNullToObject(https, "loaded_generation"); + cJSON_AddNullToObject(https, "loaded_certificate_sha256"); + } + if (runtime.last_error != ESP_OK) { + cJSON_AddStringToObject(https, "last_error_stage", runtime.last_error_stage); + cJSON_AddStringToObject(https, "last_error", esp_err_to_name(runtime.last_error)); + } else { + cJSON_AddNullToObject(https, "last_error_stage"); cJSON_AddNullToObject(https, "last_error"); + } +} + +static esp_err_t install_error(ts_api_result_t *result, esp_err_t err, ts_cert_op_error_t detail) +{ + ts_api_result_error(result, err == ESP_ERR_NO_MEM ? TS_API_ERR_NO_MEM : + err == ESP_ERR_INVALID_ARG ? TS_API_ERR_INVALID_ARG : TS_API_ERR_INTERNAL, + ts_cert_op_error_to_str(detail)); + return err; +} + /*===========================================================================*/ /* API Handlers */ /*===========================================================================*/ @@ -104,6 +167,8 @@ static esp_err_t api_cert_status(const cJSON *params, ts_api_result_t *result) cJSON_AddBoolToObject(data, "has_certificate", pki_status.has_certificate); cJSON_AddBoolToObject(data, "has_ca_chain", pki_status.has_ca_chain); + add_runtime(data, &pki_status); + // 如果有证书,添加证书信息 if (pki_status.has_certificate) { cJSON *cert_info = cJSON_CreateObject(); @@ -115,11 +180,8 @@ static esp_err_t api_cert_status(const cJSON *params, ts_api_result_t *result) cJSON_AddBoolToObject(cert_info, "is_valid", pki_status.cert_info.is_valid); cJSON_AddNumberToObject(cert_info, "days_until_expiry", pki_status.cert_info.days_until_expiry); - // 计算是否即将过期(30 天内) - cJSON_AddBoolToObject(cert_info, "expires_soon", - pki_status.cert_info.days_until_expiry >= 0 && - pki_status.cert_info.days_until_expiry < 30); - + add_validity(cert_info, &pki_status.cert_info); + cJSON_AddItemToObject(data, "cert_info", cert_info); } @@ -266,23 +328,12 @@ static esp_err_t api_cert_install(const cJSON *params, ts_api_result_t *result) } const char *cert_pem = cert_obj->valuestring; - size_t cert_len = strlen(cert_pem); - - esp_err_t ret = ts_cert_install_certificate(cert_pem, cert_len); - if (ret != ESP_OK) { - TS_LOGE(TAG, "Failed to install certificate: %s", esp_err_to_name(ret)); - - const char *err_msg = "Failed to install certificate"; - if (ret == ESP_ERR_INVALID_ARG) { - err_msg = "Invalid certificate format"; - } else if (ret == ESP_ERR_INVALID_STATE) { - err_msg = "Certificate does not match private key"; - } - - ts_api_result_error(result, TS_API_ERR_INTERNAL, err_msg); - return ret; - } + size_t cert_len = strlen(cert_pem) + 1; + ts_cert_op_error_t detail; + esp_err_t ret = ts_cert_install_certificate_ex(cert_pem, cert_len, &detail); + if (ret != ESP_OK) return install_error(result, ret, detail); + // 获取安装后的证书信息 ts_cert_info_t info; cJSON *data = cJSON_CreateObject(); @@ -296,6 +347,7 @@ static esp_err_t api_cert_install(const cJSON *params, ts_api_result_t *result) cJSON_AddNumberToObject(cert_info, "not_before", (double)info.not_before); cJSON_AddNumberToObject(cert_info, "not_after", (double)info.not_after); cJSON_AddNumberToObject(cert_info, "days_until_expiry", info.days_until_expiry); + add_validity(cert_info, &info); cJSON_AddItemToObject(data, "cert_info", cert_info); } @@ -323,16 +375,12 @@ static esp_err_t api_cert_install_ca(const cJSON *params, ts_api_result_t *resul } const char *ca_pem = ca_obj->valuestring; - size_t ca_len = strlen(ca_pem); - - esp_err_t ret = ts_cert_install_ca_chain(ca_pem, ca_len); - if (ret != ESP_OK) { - TS_LOGE(TAG, "Failed to install CA chain: %s", esp_err_to_name(ret)); - ts_api_result_error(result, TS_API_ERR_INTERNAL, - "Failed to install CA certificate chain"); - return ret; - } + size_t ca_len = strlen(ca_pem) + 1; + ts_cert_op_error_t detail; + esp_err_t ret = ts_cert_install_ca_chain_ex(ca_pem, ca_len, &detail); + if (ret != ESP_OK) return install_error(result, ret, detail); + cJSON *data = cJSON_CreateObject(); cJSON_AddBoolToObject(data, "success", true); cJSON_AddStringToObject(data, "message", "CA chain installed successfully"); diff --git a/components/ts_api/src/ts_api_ssh.c b/components/ts_api/src/ts_api_ssh.c index 62b562f..95360d3 100644 --- a/components/ts_api/src/ts_api_ssh.c +++ b/components/ts_api/src/ts_api_ssh.c @@ -45,35 +45,27 @@ #define TS_API_ERR_HOST_MISMATCH 1001 /* 主机指纹不匹配 */ #define TS_API_ERR_HOST_NEW 1002 /* 新主机需要确认 */ -/* 静态缓冲区用于存储主机、用户名等 */ -static char s_host_buf[64]; -static char s_user_buf[64]; -static char s_pass_buf[128]; -static char *s_key_buf = NULL; -static size_t s_key_len = 0; - -/*===========================================================================*/ -/* Helper Functions */ -/*===========================================================================*/ - -/** - * @brief 清理密钥缓冲区 - */ -static void cleanup_key_buffer(void) -{ - if (s_key_buf) { - memset(s_key_buf, 0, s_key_len); - free(s_key_buf); - s_key_buf = NULL; - s_key_len = 0; +/* Request-local key lifetime; concurrent callers must never share credentials. */ +typedef struct { + char *data; + size_t len; +} ssh_request_key_t; +static void cleanup_key_buffer(ssh_request_key_t *key) { + if (key->data) { + volatile unsigned char *p = (volatile unsigned char *)key->data; + for (size_t i = 0; i < key->len; ++i) + p[i] = 0; + free(key->data); + key->data = NULL; + key->len = 0; } } /** * @brief 从参数中配置 SSH 会话 */ -static esp_err_t configure_ssh_from_params(const cJSON *params, ts_ssh_config_t *config) -{ +static esp_err_t configure_ssh_from_params(const cJSON *params, ts_ssh_config_t *config, + ssh_request_key_t *request_key) { /* 主机和用户名 */ const cJSON *host = cJSON_GetObjectItem(params, "host"); const cJSON *user = cJSON_GetObjectItem(params, "user"); @@ -82,39 +74,32 @@ static esp_err_t configure_ssh_from_params(const cJSON *params, ts_ssh_config_t if (!host || !cJSON_IsString(host) || !user || !cJSON_IsString(user)) { return ESP_ERR_INVALID_ARG; } - - /* 复制到静态缓冲区 */ - strncpy(s_host_buf, host->valuestring, sizeof(s_host_buf) - 1); - s_host_buf[sizeof(s_host_buf) - 1] = '\0'; - strncpy(s_user_buf, user->valuestring, sizeof(s_user_buf) - 1); - s_user_buf[sizeof(s_user_buf) - 1] = '\0'; - - config->host = s_host_buf; - config->username = s_user_buf; + + config->host = host->valuestring; + config->username = user->valuestring; config->port = cJSON_IsNumber(port) ? port->valueint : 22; /* 认证方式:密码或密钥 */ const cJSON *password = cJSON_GetObjectItem(params, "password"); const cJSON *keyid = cJSON_GetObjectItem(params, "keyid"); const cJSON *keypath = cJSON_GetObjectItem(params, "keypath"); - - cleanup_key_buffer(); - + + cleanup_key_buffer(request_key); + if (cJSON_IsString(password) && password->valuestring[0]) { - strncpy(s_pass_buf, password->valuestring, sizeof(s_pass_buf) - 1); - s_pass_buf[sizeof(s_pass_buf) - 1] = '\0'; config->auth_method = TS_SSH_AUTH_PASSWORD; - config->auth.password = s_pass_buf; + config->auth.password = password->valuestring; } else if (cJSON_IsString(keyid) && keyid->valuestring[0]) { /* 从密钥存储读取私钥 */ - esp_err_t ret = ts_keystore_load_private_key(keyid->valuestring, &s_key_buf, &s_key_len); + esp_err_t ret = + ts_keystore_load_private_key(keyid->valuestring, &request_key->data, &request_key->len); if (ret != ESP_OK) { TS_LOGE(TAG, "Failed to load key '%s': %s", keyid->valuestring, esp_err_to_name(ret)); return ret; } config->auth_method = TS_SSH_AUTH_PUBLICKEY; - config->auth.key.private_key = (const uint8_t *)s_key_buf; - config->auth.key.private_key_len = s_key_len; + config->auth.key.private_key = (const uint8_t *)request_key->data; + config->auth.key.private_key_len = request_key->len; config->auth.key.private_key_path = NULL; config->auth.key.passphrase = NULL; } else if (cJSON_IsString(keypath) && keypath->valuestring[0]) { @@ -153,8 +138,8 @@ static esp_err_t verify_host_fingerprint(ts_ssh_session_t session, /* 获取验证参数 */ const cJSON *trust_new_j = cJSON_GetObjectItem(params, "trust_new"); const cJSON *accept_changed_j = cJSON_GetObjectItem(params, "accept_changed"); - - bool trust_new = cJSON_IsBool(trust_new_j) ? cJSON_IsTrue(trust_new_j) : true; + + bool trust_new = cJSON_IsBool(trust_new_j) ? cJSON_IsTrue(trust_new_j) : false; bool accept_changed = cJSON_IsBool(accept_changed_j) ? cJSON_IsTrue(accept_changed_j) : false; /* 验证主机指纹 */ @@ -166,7 +151,13 @@ static esp_err_t verify_host_fingerprint(ts_ssh_session_t session, ts_api_result_error(result, TS_API_ERR_INTERNAL, "Failed to verify host fingerprint"); return ret; } - + + const cJSON *confirmed = cJSON_GetObjectItem(params, "confirmed_fingerprint"); + bool confirmed_match = + cJSON_IsString(confirmed) && !strcmp(confirmed->valuestring, host_info.fingerprint); + trust_new = trust_new && confirmed_match; + accept_changed = accept_changed && confirmed_match; + /* 输出主机信息 */ if (host_info_out) { *host_info_out = host_info; @@ -247,6 +238,20 @@ static esp_err_t verify_host_fingerprint(ts_ssh_session_t session, } } +typedef struct { + const cJSON *params; + ts_api_result_t *result; +} verify_context_t; +static esp_err_t verify_before_auth(ts_ssh_session_t session, void *opaque) { + verify_context_t *ctx = opaque; + return verify_host_fingerprint(session, ctx->params, ctx->result, NULL); +} +static esp_err_t connect_verified(ts_ssh_session_t session, const cJSON *params, + ts_api_result_t *result) { + verify_context_t ctx = {params, result}; + return ts_ssh_connect_with_verifier(session, verify_before_auth, &ctx); +} + /*===========================================================================*/ /* API Handlers */ /*===========================================================================*/ @@ -282,6 +287,7 @@ static esp_err_t verify_host_fingerprint(ts_ssh_session_t session, */ static esp_err_t api_ssh_exec(const cJSON *params, ts_api_result_t *result) { + ssh_request_key_t request_key __attribute__((cleanup(cleanup_key_buffer))) = {0}; if (!params) { ts_api_result_error(result, TS_API_ERR_INVALID_ARG, "Missing parameters"); return ESP_ERR_INVALID_ARG; @@ -295,10 +301,10 @@ static esp_err_t api_ssh_exec(const cJSON *params, ts_api_result_t *result) /* 配置 SSH */ ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); - esp_err_t ret = configure_ssh_from_params(params, &config); + esp_err_t ret = configure_ssh_from_params(params, &config, &request_key); if (ret != ESP_OK) { ts_api_result_error(result, TS_API_ERR_INVALID_ARG, "Invalid SSH configuration"); - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); return ret; } @@ -313,17 +319,18 @@ static esp_err_t api_ssh_exec(const cJSON *params, ts_api_result_t *result) ret = ts_ssh_session_create(&config, &session); if (ret != ESP_OK) { ts_api_result_error(result, TS_API_ERR_INTERNAL, "Failed to create session"); - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); return ret; } /* 连接(TCP 层) */ - ret = ts_ssh_connect(session); + ret = connect_verified(session, params, result); if (ret != ESP_OK) { const char *err = ts_ssh_get_error(session); - ts_api_result_error(result, TS_API_ERR_CONNECTION, err ? err : "Failed to connect"); + if (result->code == TS_API_OK) + ts_api_result_error(result, TS_API_ERR_CONNECTION, err ? err : "Failed to connect"); ts_ssh_session_destroy(session); - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); return ret; } @@ -334,7 +341,7 @@ static esp_err_t api_ssh_exec(const cJSON *params, ts_api_result_t *result) /* result 已在 verify_host_fingerprint 中设置 */ ts_ssh_disconnect(session); ts_ssh_session_destroy(session); - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); return ret; } @@ -370,8 +377,8 @@ static esp_err_t api_ssh_exec(const cJSON *params, ts_api_result_t *result) ts_ssh_disconnect(session); ts_ssh_session_destroy(session); - cleanup_key_buffer(); - + cleanup_key_buffer(&request_key); + return ret; } @@ -586,6 +593,7 @@ static esp_err_t api_ssh_cancel(const cJSON *params, ts_api_result_t *result) */ static esp_err_t api_ssh_test(const cJSON *params, ts_api_result_t *result) { + ssh_request_key_t request_key __attribute__((cleanup(cleanup_key_buffer))) = {0}; if (!params) { ts_api_result_error(result, TS_API_ERR_INVALID_ARG, "Missing parameters"); return ESP_ERR_INVALID_ARG; @@ -593,10 +601,10 @@ static esp_err_t api_ssh_test(const cJSON *params, ts_api_result_t *result) /* 配置 SSH */ ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); - esp_err_t ret = configure_ssh_from_params(params, &config); + esp_err_t ret = configure_ssh_from_params(params, &config, &request_key); if (ret != ESP_OK) { ts_api_result_error(result, TS_API_ERR_INVALID_ARG, "Invalid SSH configuration"); - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); return ret; } @@ -605,21 +613,26 @@ static esp_err_t api_ssh_test(const cJSON *params, ts_api_result_t *result) ret = ts_ssh_session_create(&config, &session); if (ret != ESP_OK) { ts_api_result_error(result, TS_API_ERR_INTERNAL, "Failed to create session"); - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); return ret; } /* 测试连接(TCP 层) */ - ret = ts_ssh_connect(session); - + ret = connect_verified(session, params, result); + if (ret != ESP_OK) { + if (result->code != TS_API_OK) { + ts_ssh_session_destroy(session); + cleanup_key_buffer(&request_key); + return ESP_OK; + } const char *err = ts_ssh_get_error(session); cJSON *data = cJSON_CreateObject(); cJSON_AddBoolToObject(data, "success", false); cJSON_AddStringToObject(data, "error", err ? err : "Connection failed"); ts_api_result_ok(result, data); ts_ssh_session_destroy(session); - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); return ESP_OK; } @@ -633,8 +646,8 @@ static esp_err_t api_ssh_test(const cJSON *params, ts_api_result_t *result) */ ts_ssh_disconnect(session); ts_ssh_session_destroy(session); - cleanup_key_buffer(); - + cleanup_key_buffer(&request_key); + /* 如果是 MISMATCH 或 NEW_HOST,返回 ESP_OK 让 HTTP 层返回 200 * 实际错误信息已在 result 中设置 */ if (result->code == TS_API_ERR_HOST_MISMATCH || @@ -655,8 +668,8 @@ static esp_err_t api_ssh_test(const cJSON *params, ts_api_result_t *result) ts_ssh_disconnect(session); ts_ssh_session_destroy(session); - cleanup_key_buffer(); - + cleanup_key_buffer(&request_key); + ts_api_result_ok(result, data); return ESP_OK; } @@ -684,6 +697,7 @@ static esp_err_t api_ssh_test(const cJSON *params, ts_api_result_t *result) */ static esp_err_t api_ssh_copyid(const cJSON *params, ts_api_result_t *result) { + ssh_request_key_t request_key __attribute__((cleanup(cleanup_key_buffer))) = {0}; if (!params) { ts_api_result_error(result, TS_API_ERR_INVALID_ARG, "Missing parameters"); return ESP_ERR_INVALID_ARG; @@ -728,16 +742,13 @@ static esp_err_t api_ssh_copyid(const cJSON *params, ts_api_result_t *result) /* 配置 SSH 连接(使用密码认证) */ ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); - strncpy(s_host_buf, host->valuestring, sizeof(s_host_buf) - 1); - strncpy(s_user_buf, user->valuestring, sizeof(s_user_buf) - 1); - strncpy(s_pass_buf, password->valuestring, sizeof(s_pass_buf) - 1); - - config.host = s_host_buf; + + config.host = host->valuestring; config.port = ssh_port; - config.username = s_user_buf; + config.username = user->valuestring; config.auth_method = TS_SSH_AUTH_PASSWORD; - config.auth.password = s_pass_buf; - + config.auth.password = password->valuestring; + /* 创建会话并连接 */ ts_ssh_session_t session = NULL; ret = ts_ssh_session_create(&config, &session); @@ -746,11 +757,12 @@ static esp_err_t api_ssh_copyid(const cJSON *params, ts_api_result_t *result) free(pubkey_data); return ret; } - - ret = ts_ssh_connect(session); + + ret = connect_verified(session, params, result); if (ret != ESP_OK) { const char *err = ts_ssh_get_error(session); - ts_api_result_error(result, TS_API_ERR_CONNECTION, err ? err : "Failed to connect"); + if (result->code == TS_API_OK) + ts_api_result_error(result, TS_API_ERR_CONNECTION, err ? err : "Failed to connect"); ts_ssh_session_destroy(session); free(pubkey_data); return ret; @@ -813,18 +825,18 @@ static esp_err_t api_ssh_copyid(const cJSON *params, ts_api_result_t *result) bool verified = false; if (do_verify) { /* 加载私钥 */ - cleanup_key_buffer(); - ret = ts_keystore_load_private_key(keyid->valuestring, &s_key_buf, &s_key_len); + cleanup_key_buffer(&request_key); + ret = ts_keystore_load_private_key(keyid->valuestring, &request_key.data, &request_key.len); if (ret == ESP_OK) { /* 使用公钥认证重新连接 */ ts_ssh_config_t verify_config = TS_SSH_DEFAULT_CONFIG(); - verify_config.host = s_host_buf; + verify_config.host = host->valuestring; verify_config.port = ssh_port; - verify_config.username = s_user_buf; + verify_config.username = user->valuestring; verify_config.auth_method = TS_SSH_AUTH_PUBLICKEY; - verify_config.auth.key.private_key = (const uint8_t *)s_key_buf; - verify_config.auth.key.private_key_len = s_key_len; - + verify_config.auth.key.private_key = (const uint8_t *)request_key.data; + verify_config.auth.key.private_key_len = request_key.len; + ts_ssh_session_t verify_session = NULL; if (ts_ssh_session_create(&verify_config, &verify_session) == ESP_OK) { if (ts_ssh_connect(verify_session) == ESP_OK) { @@ -833,7 +845,7 @@ static esp_err_t api_ssh_copyid(const cJSON *params, ts_api_result_t *result) } ts_ssh_session_destroy(verify_session); } - cleanup_key_buffer(); + cleanup_key_buffer(&request_key); } } @@ -962,16 +974,13 @@ static esp_err_t api_ssh_revoke(const cJSON *params, ts_api_result_t *result) /* 配置 SSH 连接(使用密码认证) */ ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); - strncpy(s_host_buf, host->valuestring, sizeof(s_host_buf) - 1); - strncpy(s_user_buf, user->valuestring, sizeof(s_user_buf) - 1); - strncpy(s_pass_buf, password->valuestring, sizeof(s_pass_buf) - 1); - - config.host = s_host_buf; + + config.host = host->valuestring; config.port = ssh_port; - config.username = s_user_buf; + config.username = user->valuestring; config.auth_method = TS_SSH_AUTH_PASSWORD; - config.auth.password = s_pass_buf; - + config.auth.password = password->valuestring; + /* 创建会话并连接 */ ts_ssh_session_t session = NULL; ret = ts_ssh_session_create(&config, &session); @@ -981,11 +990,12 @@ static esp_err_t api_ssh_revoke(const cJSON *params, ts_api_result_t *result) free(pubkey_copy); return ret; } - - ret = ts_ssh_connect(session); + + ret = connect_verified(session, params, result); if (ret != ESP_OK) { const char *err = ts_ssh_get_error(session); - ts_api_result_error(result, TS_API_ERR_CONNECTION, err ? err : "Failed to connect"); + if (result->code == TS_API_OK) + ts_api_result_error(result, TS_API_ERR_CONNECTION, err ? err : "Failed to connect"); ts_ssh_session_destroy(session); free(pubkey_data); free(pubkey_copy); diff --git a/components/ts_automation/CMakeLists.txt b/components/ts_automation/CMakeLists.txt index 0a65f34..efba37f 100644 --- a/components/ts_automation/CMakeLists.txt +++ b/components/ts_automation/CMakeLists.txt @@ -4,6 +4,8 @@ idf_component_register( "src/ts_variable.c" "src/ts_source_manager.c" "src/ts_rule_engine.c" + "src/ts_rule_codec.c" + "src/ts_rule_store.c" "src/ts_action_manager.c" INCLUDE_DIRS "include" diff --git a/components/ts_automation/include/ts_action_manager.h b/components/ts_automation/include/ts_action_manager.h index 1709342..27e3c0f 100644 --- a/components/ts_automation/include/ts_action_manager.h +++ b/components/ts_automation/include/ts_action_manager.h @@ -105,6 +105,7 @@ typedef struct { uint8_t priority; /**< Priority (0=highest) */ int64_t enqueue_time; /**< When queued */ /* Sync execution support */ + void *completion; /**< Shared completion lifetime, independent of waiter stack. */ SemaphoreHandle_t done_sem; /**< Signaled when done (sync mode) */ ts_action_result_t *result_ptr; /**< Where to store result (sync mode) */ } ts_action_queue_entry_t; @@ -147,6 +148,9 @@ esp_err_t ts_action_manager_init(void); * @return ESP_OK on success */ esp_err_t ts_action_manager_deinit(void); +esp_err_t ts_action_manager_quiesce(void); +bool ts_action_manager_accepting(void); +esp_err_t ts_action_manager_resume(void); /** * @brief Check if action manager is initialized @@ -524,6 +528,12 @@ esp_err_t ts_action_templates_load(void); */ esp_err_t ts_action_templates_load_from_file(const char *filepath); +/* Only actual admissions allocate snapshots; ordinary condition evaluation does not. */ +esp_err_t ts_action_snapshot(const ts_auto_action_t *source, ts_auto_action_t *out); +void ts_action_snapshot_owner(const ts_auto_action_t *action, const char *rule); +void ts_action_snapshot_retain(const ts_auto_action_t *action); +void ts_action_snapshot_release(ts_auto_action_t *action); + #ifdef __cplusplus } #endif diff --git a/components/ts_automation/include/ts_automation_types.h b/components/ts_automation/include/ts_automation_types.h index 55f1d39..9de43aa 100644 --- a/components/ts_automation/include/ts_automation_types.h +++ b/components/ts_automation/include/ts_automation_types.h @@ -287,6 +287,7 @@ typedef enum { TS_AUTO_ACT_DEVICE_CTRL, /**< Device control - deprecated, use CLI */ TS_AUTO_ACT_SSH_CMD_REF, /**< SSH command reference (from registered commands) */ TS_AUTO_ACT_CLI, /**< TianShanOS CLI command execution */ + TS_AUTO_ACT_TEMPLATE_REF, /**< Unresolved template-only reference; never execute directly. */ } ts_auto_action_type_t; /** @@ -442,6 +443,8 @@ typedef struct { ts_auto_action_condition_t condition; /**< Execute only if condition is met */ /* Template reference (for rule actions) */ + bool runtime_snapshot; /**< Execution-only; never serialized. */ + void *runtime_binding; /**< Owned execution snapshot; never serialized. */ char template_id[TS_AUTO_NAME_MAX_LEN]; /**< Source template ID (optional, for tracing) */ union { @@ -465,7 +468,14 @@ typedef struct { char name[TS_AUTO_LABEL_MAX_LEN]; /**< Display name */ char icon[64]; /**< Display icon (emoji or /sdcard/images/xxx.png) */ bool enabled; /**< Is rule enabled */ - bool manual_trigger; /**< Can be manually triggered from UI */ + bool manual_trigger; /**< Exclude from automatic evaluation */ + bool show_on_dashboard; + bool allow_manual_trigger; + uint8_t presentation_fields; /**< bit 0: show present; bit 1: allow present */ + bool reference_unresolved; + uint32_t revision; + uint32_t instance; + void *lease; /**< Internal read ownership, never persisted */ uint32_t cooldown_ms; /**< Min time between triggers */ ts_auto_condition_group_t conditions; /**< Trigger conditions */ diff --git a/components/ts_automation/include/ts_rule_codec.h b/components/ts_automation/include/ts_rule_codec.h new file mode 100644 index 0000000..24aea38 --- /dev/null +++ b/components/ts_automation/include/ts_rule_codec.h @@ -0,0 +1,14 @@ +#pragma once +#include "ts_automation_types.h" +#include "cJSON.h" +#ifdef __cplusplus +extern "C" { +#endif +/* Decode owns arrays. Dispose decoded values; release engine reads separately. */ +esp_err_t ts_rule_decode(const cJSON *json, ts_auto_rule_t *rule); +cJSON *ts_rule_encode(const ts_auto_rule_t *rule); +void ts_rule_dispose(ts_auto_rule_t *rule); +bool ts_rule_id_valid(const char *id); +#ifdef __cplusplus +} +#endif diff --git a/components/ts_automation/include/ts_rule_engine.h b/components/ts_automation/include/ts_rule_engine.h index d6e5378..43f555c 100644 --- a/components/ts_automation/include/ts_rule_engine.h +++ b/components/ts_automation/include/ts_rule_engine.h @@ -83,7 +83,10 @@ esp_err_t ts_rule_disable(const char *id); * @param id Rule ID * @return Rule pointer or NULL */ -const ts_auto_rule_t *ts_rule_get(const char *id); +typedef struct {int applied,durable,mirror_synced;uint32_t revision;const char *error_code;} ts_rule_commit_result_t; +esp_err_t ts_rule_acquire(const char *id,ts_auto_rule_t *out); +void ts_rule_release(ts_auto_rule_t *rule); +esp_err_t ts_rule_commit(const ts_auto_rule_t *candidate,const char *id,uint32_t expected_revision,ts_rule_commit_result_t *result); /** * @brief Get number of registered rules @@ -185,7 +188,7 @@ esp_err_t ts_action_execute_array(const ts_auto_action_t *actions, int count, * @brief Get rule by index * * @param index Rule index (0 to rule_count-1) - * @param rule Output rule structure + * @param rule Pinned output; caller MUST ts_rule_release after use * @return ESP_OK on success, ESP_ERR_NOT_FOUND if index out of range */ esp_err_t ts_rule_get_by_index(int index, ts_auto_rule_t *rule); @@ -346,6 +349,12 @@ esp_err_t ts_rules_load(void); */ esp_err_t ts_rules_load_from_file(const char *filepath); +/* Cold API/load path only: may allocate and resolve command/template references. */ +void ts_rule_resolve_presentation(ts_auto_rule_t *rule); +bool ts_rule_edit_begin(void); +void ts_rule_edit_end(void); +void ts_rule_config_status(bool *loaded, bool *recovery); + #ifdef __cplusplus } #endif diff --git a/components/ts_automation/src/ts_action_manager.c b/components/ts_automation/src/ts_action_manager.c index 429901c..b6ed64c 100644 --- a/components/ts_automation/src/ts_action_manager.c +++ b/components/ts_automation/src/ts_action_manager.c @@ -1,3 +1,6 @@ +#include "ts_ssh_probe.h" +#include "ts_ssh_service.h" +#include /** * @file ts_action_manager.c * @brief TianShanOS Automation Engine - Action Manager Implementation @@ -101,8 +104,10 @@ typedef struct { /* Action queue */ QueueHandle_t action_queue; TaskHandle_t executor_task; - bool running; - + atomic_bool running; + atomic_bool accepting; + unsigned pending; /* producers + queued + executing, protected by stats_mutex */ + /* Statistics */ ts_action_stats_t stats; SemaphoreHandle_t stats_mutex; @@ -113,6 +118,100 @@ typedef struct { static action_manager_ctx_t *s_ctx = NULL; +typedef struct { + atomic_uint refs; + ts_ssh_command_config_t command; + ts_action_ssh_host_t host; + bool pinned; + uint32_t registration; +} action_binding_t; +typedef struct { + atomic_uint refs; + SemaphoreHandle_t semaphore; + ts_action_result_t result; +} action_completion_t; +static void completion_release(action_completion_t *c) { + if (c && atomic_fetch_sub(&c->refs, 1) == 1) { + vSemaphoreDelete(c->semaphore); + free(c); + } +} +void ts_action_snapshot_owner(const ts_auto_action_t *a, const char *rule) { + action_binding_t *b = a->runtime_binding; + if (b && b->pinned) ts_ssh_service_set_owner(b->command.id, b->registration, rule); +} +void ts_action_snapshot_retain(const ts_auto_action_t *a) { + if (a && a->runtime_binding) + atomic_fetch_add(&((action_binding_t *)a->runtime_binding)->refs, 1); +} +void ts_action_snapshot_release(ts_auto_action_t *a) { + action_binding_t *b = a ? a->runtime_binding : NULL; + if (b && atomic_fetch_sub(&b->refs, 1) == 1) { + if (b->pinned) + ts_ssh_service_unpin(b->command.id, b->registration); + memset(b->host.password, 0, sizeof(b->host.password)); + free(b); + } + if (a) + a->runtime_binding = NULL; +} +esp_err_t ts_action_snapshot(const ts_auto_action_t *source, ts_auto_action_t *out) { + *out = *source; + out->runtime_binding = NULL; + out->runtime_snapshot = true; + if (source->template_id[0]) { + ts_action_template_t *tpl = + heap_caps_malloc(sizeof(*tpl), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!tpl) + return ESP_ERR_NO_MEM; + esp_err_t ret = ts_action_template_get(source->template_id, tpl); + if (ret == ESP_OK && !tpl->enabled) + ret = ESP_ERR_INVALID_STATE; + if (ret == ESP_OK) { + *out = tpl->action; + out->async |= tpl->async; + out->delay_ms = source->delay_ms; + out->repeat_mode = source->repeat_mode; + out->repeat_count = source->repeat_count; + out->repeat_interval_ms = source->repeat_interval_ms; + out->condition = source->condition; + out->template_id[0] = 0; + out->runtime_binding = NULL; + out->runtime_snapshot = true; + } + free(tpl); + if (ret != ESP_OK) + return ret; + } + if (out->type != TS_AUTO_ACT_SSH_CMD_REF) + return ESP_OK; + if (!source->template_id[0] && !source->runtime_snapshot) + out->async = true; + action_binding_t *binding = + heap_caps_calloc(1, sizeof(*binding), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!binding) + return ESP_ERR_NO_MEM; + atomic_init(&binding->refs, 1); + esp_err_t ret = ts_ssh_commands_config_get(out->ssh_ref.cmd_id, &binding->command); + if (ret == ESP_OK) + ret = ts_action_get_ssh_host(binding->command.host_id, &binding->host); + if (ret == ESP_OK && !binding->command.enabled) + ret = ESP_ERR_INVALID_STATE; + if (ret == ESP_OK && binding->command.nohup && binding->command.service_mode) { + if (!ts_ssh_service_start_admissible(binding->command.id)) + ret = ESP_ERR_INVALID_STATE; + else { + ret = ts_ssh_service_pin(&binding->command, binding->host.host, binding->host.port, &binding->registration); + binding->pinned = ret == ESP_OK; + } + } + if (ret != ESP_OK) { + free(binding); + return ret; + } + out->runtime_binding = binding; + return ESP_OK; +} /*===========================================================================*/ /* Forward Declarations */ /*===========================================================================*/ @@ -165,6 +264,7 @@ esp_err_t ts_action_manager_init(void) * Use xTaskCreateWithCaps to explicitly allocate stack in DRAM. */ s_ctx->running = true; + s_ctx->accepting = true; BaseType_t ret = xTaskCreateWithCaps(action_executor_task, "action_exec", ACTION_TASK_STACK_SIZE, @@ -235,20 +335,24 @@ void ts_action_deferred_load_task(void *arg) esp_err_t ts_action_manager_deinit(void) { if (s_ctx == NULL) { - return ESP_ERR_INVALID_STATE; + return ESP_OK; } ESP_LOGI(TAG, "Deinitializing action manager"); - /* Stop executor task */ + /* Admission stays closed until every producer/executor has released ownership. */ + if (ts_action_manager_quiesce() != ESP_OK) return ESP_ERR_TIMEOUT; s_ctx->running = false; - if (s_ctx->executor_task) { - /* Send empty entry to wake up task */ - ts_action_queue_entry_t empty = {0}; - xQueueSend(s_ctx->action_queue, &empty, 0); - vTaskDelay(pdMS_TO_TICKS(100)); + xSemaphoreTake(s_ctx->stats_mutex, portMAX_DELAY); + bool exiting = s_ctx->executor_task != NULL; + xSemaphoreGive(s_ctx->stats_mutex); + if (exiting) { + /* Queue receive has a bounded timeout; no fake entry owns a pending credit. */ + /* Cooperative stop requested; cleanup requires a later call after exit. */ + return ESP_ERR_INVALID_STATE; } - + + ts_action_cancel_all(); /* Cleanup resources */ if (s_ctx->action_queue) vQueueDelete(s_ctx->action_queue); if (s_ctx->ssh_hosts_mutex) vSemaphoreDelete(s_ctx->ssh_hosts_mutex); @@ -420,63 +524,90 @@ esp_err_t ts_action_get_ssh_hosts(ts_action_ssh_host_t *hosts_out, * the action executes in the executor task context, which has a DRAM stack * and can safely perform NVS/Flash operations. */ -esp_err_t ts_action_manager_execute(const ts_auto_action_t *action, - ts_action_result_t *result) -{ - if (!s_ctx || !action) { - return ESP_ERR_INVALID_ARG; - } - - if (!s_ctx->running || !s_ctx->executor_task) { - ESP_LOGE(TAG, "Executor task not running"); +static bool action_admit(void) { + xSemaphoreTake(s_ctx->stats_mutex, portMAX_DELAY); + bool accept = s_ctx->running && s_ctx->accepting; + if (accept) s_ctx->pending += 2; /* caller + queue/executor ownership */ + xSemaphoreGive(s_ctx->stats_mutex); + return accept; +} +static void action_finished(void) { + xSemaphoreTake(s_ctx->stats_mutex, portMAX_DELAY); + --s_ctx->pending; + xSemaphoreGive(s_ctx->stats_mutex); +} +bool ts_action_manager_accepting(void) { return s_ctx && s_ctx->accepting; } +esp_err_t ts_action_manager_quiesce(void) { + if (!s_ctx) return ESP_OK; + xSemaphoreTake(s_ctx->stats_mutex, portMAX_DELAY); + s_ctx->accepting = false; + bool idle = s_ctx->pending == 0; + xSemaphoreGive(s_ctx->stats_mutex); + return idle ? ESP_OK : ESP_ERR_TIMEOUT; +} +esp_err_t ts_action_manager_resume(void) { + if (!s_ctx) return ESP_ERR_INVALID_STATE; + xSemaphoreTake(s_ctx->stats_mutex, portMAX_DELAY); + bool idle = s_ctx->running && !s_ctx->pending; + if (idle) s_ctx->accepting = true; + xSemaphoreGive(s_ctx->stats_mutex); + return idle ? ESP_OK : ESP_ERR_INVALID_STATE; +} +esp_err_t ts_action_manager_execute(const ts_auto_action_t *action, ts_action_result_t *result) { + if (!s_ctx || !action || !s_ctx->running || !s_ctx->executor_task) return ESP_ERR_INVALID_STATE; - } - - ts_action_result_t local_result = {0}; - ts_action_result_t *res = result ? result : &local_result; - - /* Create semaphore for sync execution */ - SemaphoreHandle_t done_sem = xSemaphoreCreateBinary(); - if (!done_sem) { - ESP_LOGE(TAG, "Failed to create sync semaphore"); + if (!action_admit()) return ESP_ERR_INVALID_STATE; + action_completion_t *c = heap_caps_calloc(1, sizeof(*c), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!c) { action_finished(); action_finished(); return ESP_ERR_NO_MEM; } + c->semaphore = xSemaphoreCreateBinary(); + if (!c->semaphore) { + free(c); + action_finished(); action_finished(); return ESP_ERR_NO_MEM; } - - /* Queue the action with sync fields */ + atomic_init(&c->refs, 2); + ts_auto_action_t frozen; + esp_err_t ret = ESP_OK; + if (action->runtime_snapshot) { + frozen = *action; + ts_action_snapshot_retain(&frozen); + } else { + ts_ssh_binding_lock(); + ret = ts_action_snapshot(action, &frozen); + ts_ssh_binding_unlock(); + } + if (ret != ESP_OK) { + completion_release(c); + completion_release(c); + action_finished(); action_finished(); + return ret; + } ts_action_queue_entry_t entry = { - .action = *action, - .callback = NULL, - .user_data = NULL, - .priority = 0, - .enqueue_time = esp_timer_get_time() / 1000, - .done_sem = done_sem, - .result_ptr = res - }; - + .action = frozen, .completion = c, .done_sem = c->semaphore, .result_ptr = &c->result}; if (xQueueSend(s_ctx->action_queue, &entry, pdMS_TO_TICKS(100)) != pdTRUE) { - ESP_LOGW(TAG, "Action queue full"); - vSemaphoreDelete(done_sem); + ts_action_snapshot_release(&frozen); + completion_release(c); + completion_release(c); + action_finished(); action_finished(); return ESP_ERR_NO_MEM; } - - /* Wait for completion (timeout based on action type) */ - uint32_t timeout_ms = 30000; /* Default 30s */ - if (action->type == TS_AUTO_ACT_SSH_CMD || action->type == TS_AUTO_ACT_SSH_CMD_REF) { - timeout_ms = 60000; /* SSH commands may take longer */ - } - - if (xSemaphoreTake(done_sem, pdMS_TO_TICKS(timeout_ms)) != pdTRUE) { - ESP_LOGE(TAG, "Action execution timeout"); - res->status = TS_ACTION_STATUS_TIMEOUT; - snprintf(res->output, sizeof(res->output), "Execution timeout"); - vSemaphoreDelete(done_sem); - return ESP_ERR_TIMEOUT; + uint32_t timeout = + action->type == TS_AUTO_ACT_SSH_CMD || action->type == TS_AUTO_ACT_SSH_CMD_REF ? 60000 + : 30000; + if (xSemaphoreTake(c->semaphore, pdMS_TO_TICKS(timeout)) != pdTRUE) { + if (result) { + memset(result, 0, sizeof(*result)); + result->status = TS_ACTION_STATUS_TIMEOUT; + } + ret = ESP_ERR_TIMEOUT; + } else { + if (result) + *result = c->result; + ret = c->result.status == TS_ACTION_STATUS_SUCCESS ? ESP_OK : ESP_FAIL; } - - vSemaphoreDelete(done_sem); - - /* Stats are updated by executor task */ - return (res->status == TS_ACTION_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL; + completion_release(c); + action_finished(); /* caller releases only its own credit */ + return ret; } esp_err_t ts_action_queue(const ts_auto_action_t *action, @@ -484,22 +615,35 @@ esp_err_t ts_action_queue(const ts_auto_action_t *action, void *user_data, uint8_t priority) { - if (!s_ctx || !action) { + if (!s_ctx || !s_ctx->running || !action) { return ESP_ERR_INVALID_ARG; } - + + if (!action_admit()) return ESP_ERR_INVALID_STATE; + ts_auto_action_t frozen; + if (action->runtime_snapshot) { + frozen = *action; + ts_action_snapshot_retain(&frozen); + } else { + ts_ssh_binding_lock(); + esp_err_t ret = ts_action_snapshot(action, &frozen); + ts_ssh_binding_unlock(); + if (ret != ESP_OK) { action_finished(); action_finished(); return ret; } + } ts_action_queue_entry_t entry = { - .action = *action, + .action = frozen, .callback = callback, .user_data = user_data, .priority = priority, .enqueue_time = esp_timer_get_time() / 1000, - .done_sem = NULL, /* Async mode: no sync semaphore */ - .result_ptr = NULL /* Async mode: no result pointer */ + .done_sem = NULL, /* Async mode: no sync semaphore */ + .result_ptr = NULL /* Async mode: no result pointer */ }; - + if (xQueueSend(s_ctx->action_queue, &entry, pdMS_TO_TICKS(100)) != pdTRUE) { + ts_action_snapshot_release(&frozen); ESP_LOGW(TAG, "Action queue full"); + action_finished(); action_finished(); return ESP_ERR_NO_MEM; } @@ -510,7 +654,7 @@ esp_err_t ts_action_queue(const ts_auto_action_t *action, s_ctx->stats.queue_high_water = waiting; } xSemaphoreGive(s_ctx->stats_mutex); - + action_finished(); return ESP_OK; } @@ -528,7 +672,7 @@ esp_err_t ts_action_execute_sequence(const ts_auto_action_t *actions, for (int i = 0; i < count; i++) { ret = ts_action_manager_execute(&actions[i], &result); if (ret != ESP_OK || result.status != TS_ACTION_STATUS_SUCCESS) { - ESP_LOGW(TAG, "Action %d failed: %s", i, result.output); + ESP_LOGW(TAG, "Action %d failed (code=%d)", i, ret); if (stop_on_error) { return ret != ESP_OK ? ret : ESP_FAIL; } @@ -545,7 +689,16 @@ esp_err_t ts_action_cancel_all(void) } /* Clear queue */ - xQueueReset(s_ctx->action_queue); + ts_action_queue_entry_t entry; + while (xQueueReceive(s_ctx->action_queue, &entry, 0) == pdTRUE) { + ts_action_snapshot_release(&entry.action); + if (entry.result_ptr) + entry.result_ptr->status = TS_ACTION_STATUS_CANCELLED; + if (entry.done_sem) + xSemaphoreGive(entry.done_sem); + completion_release(entry.completion); + action_finished(); + } ESP_LOGI(TAG, "Cancelled all pending actions"); return ESP_OK; } @@ -586,9 +739,9 @@ esp_err_t ts_action_exec_ssh(const ts_auto_action_ssh_t *ssh, return ESP_ERR_NO_MEM; } ts_action_expand_variables(ssh->command, expanded_cmd, TS_SSH_CMD_COMMAND_MAX); - - ESP_LOGI(TAG, "SSH [%s]: %s", ssh->host_ref, expanded_cmd); - + + ESP_LOGD(TAG, "SSH host=%s, command bytes=%u", ssh->host_ref, (unsigned)strlen(expanded_cmd)); + /* Create SSH session */ ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); config.host = host.host; @@ -599,6 +752,7 @@ esp_err_t ts_action_exec_ssh(const ts_auto_action_ssh_t *ssh, /* Load SSH key from keystore if using key auth */ char *key_data = NULL; size_t key_len = 0; + char full_path[128] = {0}; esp_err_t ret; if (host.use_key_auth && host.key_path[0]) { @@ -615,7 +769,6 @@ esp_err_t ts_action_exec_ssh(const ts_auto_action_ssh_t *ssh, ESP_LOGI(TAG, "Loaded SSH key '%s' from keystore (%zu bytes)", keyid, key_len); } else { /* Fallback: try as file path */ - char full_path[128]; if (keyid[0] == '/') { strncpy(full_path, keyid, sizeof(full_path) - 1); } else { @@ -678,8 +831,7 @@ esp_err_t ts_action_exec_ssh(const ts_auto_action_ssh_t *ssh, : TS_ACTION_STATUS_FAILED; /* Free result strings */ - if (exec_result.stdout_data) free(exec_result.stdout_data); - if (exec_result.stderr_data) free(exec_result.stderr_data); + ts_ssh_exec_result_free(&exec_result); } else { snprintf(result->output, sizeof(result->output), "SSH exec failed: %s", esp_err_to_name(ret)); @@ -687,7 +839,8 @@ esp_err_t ts_action_exec_ssh(const ts_auto_action_ssh_t *ssh, ? TS_ACTION_STATUS_TIMEOUT : TS_ACTION_STATUS_FAILED; } - + + ts_ssh_exec_result_free(&exec_result); /* Cleanup */ ts_ssh_disconnect(session); ts_ssh_session_destroy(session); @@ -873,8 +1026,8 @@ esp_err_t ts_action_exec_led(const ts_auto_action_led_t *led, if (led_final->speed > 0) { len += snprintf(cmd + len, sizeof(cmd) - len, " --speed %d", led_final->speed); } - - ESP_LOGI(TAG, "Executing LED text CLI: %s", cmd); + + ESP_LOGD(TAG, "Executing LED CLI (%u bytes)", (unsigned)strlen(cmd)); ret = ts_console_exec(cmd, NULL); snprintf(result->output, sizeof(result->output), "LED text: %.200s%s", led_final->text, strlen(led_final->text) > 200 ? "..." : ""); } else { @@ -894,8 +1047,8 @@ esp_err_t ts_action_exec_led(const ts_auto_action_led_t *led, char cmd[512]; snprintf(cmd, sizeof(cmd), "led --image --device matrix --file %.256s%s", led_final->image_path, led_final->center ? " --center content" : ""); - - ESP_LOGI(TAG, "Executing LED image CLI: %s", cmd); + + ESP_LOGD(TAG, "Executing LED CLI (%u bytes)", (unsigned)strlen(cmd)); ret = ts_console_exec(cmd, NULL); snprintf(result->output, sizeof(result->output), "LED image: %.200s%s", led_final->image_path, strlen(led_final->image_path) > 200 ? "..." : ""); } else { @@ -920,8 +1073,8 @@ esp_err_t ts_action_exec_led(const ts_auto_action_led_t *led, if (led_final->r || led_final->g || led_final->b) { len += snprintf(cmd + len, sizeof(cmd) - len, " --color #%02X%02X%02X", led_final->r, led_final->g, led_final->b); } - - ESP_LOGI(TAG, "Executing LED QR CLI: %s", cmd); + + ESP_LOGD(TAG, "Executing LED CLI (%u bytes)", (unsigned)strlen(cmd)); ret = ts_console_exec(cmd, NULL); snprintf(result->output, sizeof(result->output), "LED QR: %.200s%s", led_final->qr_text, strlen(led_final->qr_text) > 200 ? "..." : ""); @@ -945,8 +1098,8 @@ esp_err_t ts_action_exec_led(const ts_auto_action_led_t *led, } else { snprintf(cmd, sizeof(cmd), "led --filter --device matrix --filter-name %s", led_final->filter); } - - ESP_LOGI(TAG, "Executing LED filter CLI: %s", cmd); + + ESP_LOGD(TAG, "Executing LED CLI (%u bytes)", (unsigned)strlen(cmd)); ret = ts_console_exec(cmd, NULL); snprintf(result->output, sizeof(result->output), "LED filter: %s", led_final->filter); } else { @@ -964,7 +1117,7 @@ esp_err_t ts_action_exec_led(const ts_auto_action_led_t *led, } { const char *cmd = "led --stop-filter --device matrix"; - ESP_LOGI(TAG, "Executing LED filter stop CLI: %s", cmd); + ESP_LOGD(TAG, "Executing LED CLI (%u bytes)", (unsigned)strlen(cmd)); ret = ts_console_exec(cmd, NULL); snprintf(result->output, sizeof(result->output), "LED filter stopped"); } @@ -979,7 +1132,7 @@ esp_err_t ts_action_exec_led(const ts_auto_action_led_t *led, } { const char *cmd = "led --stop-text --device matrix"; - ESP_LOGI(TAG, "Executing LED text stop CLI: %s", cmd); + ESP_LOGD(TAG, "Executing LED CLI (%u bytes)", (unsigned)strlen(cmd)); ret = ts_console_exec(cmd, NULL); snprintf(result->output, sizeof(result->output), "LED text stopped"); } @@ -1163,9 +1316,13 @@ esp_err_t ts_action_exec_device(const ts_auto_action_device_t *device, return ESP_OK; } -esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, - ts_action_result_t *result) -{ +static esp_err_t exec_ssh_ref_bound(const ts_auto_action_ssh_ref_t *, const action_binding_t *, + ts_action_result_t *); +esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ref, ts_action_result_t *result) { + return exec_ssh_ref_bound(ref, NULL, result); +} +static esp_err_t exec_ssh_ref_bound(const ts_auto_action_ssh_ref_t *ssh_ref, + const action_binding_t *binding, ts_action_result_t *result) { if (!ssh_ref || !result) { return ESP_ERR_INVALID_ARG; } @@ -1175,7 +1332,9 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, /* Look up the SSH command configuration */ ts_ssh_command_config_t cmd_config; - esp_err_t ret = ts_ssh_commands_config_get(ssh_ref->cmd_id, &cmd_config); + esp_err_t ret = binding ? ESP_OK : ts_ssh_commands_config_get(ssh_ref->cmd_id, &cmd_config); + if (binding) + cmd_config = binding->command; if (ret != ESP_OK) { snprintf(result->output, sizeof(result->output), "SSH command '%s' not found", ssh_ref->cmd_id); @@ -1190,22 +1349,24 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, result->status = TS_ACTION_STATUS_FAILED; return ESP_ERR_INVALID_STATE; } - - ESP_LOGI(TAG, "SSH ref [%s]: host=%s, cmd=%s", - ssh_ref->cmd_id, cmd_config.host_id, cmd_config.command); + + ESP_LOGI(TAG, "SSH ref [%s]: host=%s, command_bytes=%u", ssh_ref->cmd_id, cmd_config.host_id, + (unsigned)strlen(cmd_config.command)); ESP_LOGI(TAG, "SSH ref config: var_name='%s', nohup=%d, service_mode=%d, ready_pattern='%s'", cmd_config.var_name, cmd_config.nohup, cmd_config.service_mode, cmd_config.ready_pattern); /* Get SSH host config */ ts_action_ssh_host_t host; - if (ts_action_get_ssh_host(cmd_config.host_id, &host) != ESP_OK) { + if (binding) + host = binding->host; + if (!binding && ts_action_get_ssh_host(cmd_config.host_id, &host) != ESP_OK) { snprintf(result->output, sizeof(result->output), "SSH host '%s' not found for command '%s'", cmd_config.host_id, ssh_ref->cmd_id); result->status = TS_ACTION_STATUS_FAILED; return ESP_ERR_NOT_FOUND; } - + /* Expand variables in command * Use heap allocation to avoid stack overflow with large commands (up to 1024 bytes) */ @@ -1221,9 +1382,10 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, ts_action_expand_variables(cmd_config.command, expanded_cmd, TS_SSH_CMD_COMMAND_MAX); /* Handle nohup mode: wrap command for background execution */ - char *nohup_cmd = heap_caps_malloc(TS_SSH_CMD_COMMAND_MAX + 128, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + char *nohup_cmd = + heap_caps_malloc(TS_SSH_CMD_COMMAND_MAX * 5 + 1024, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); if (!nohup_cmd) { - nohup_cmd = malloc(TS_SSH_CMD_COMMAND_MAX + 128); + nohup_cmd = malloc(TS_SSH_CMD_COMMAND_MAX * 5 + 1024); } if (!nohup_cmd) { free(expanded_cmd); @@ -1232,47 +1394,30 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, return ESP_ERR_NO_MEM; } if (cmd_config.nohup) { - /* Generate safe name from command name for log/pid files - * Priority: cmd.name alphanumeric chars -> cmd_id alphanumeric chars -> "cmd" - * Pure Chinese names produce empty string, so fallback to cmd_id - */ - char safe_name[32] = {0}; - const char *src = cmd_config.name; - int j = 0; - for (int i = 0; src[i] && j < 20; i++) { - if ((src[i] >= 'a' && src[i] <= 'z') || - (src[i] >= 'A' && src[i] <= 'Z') || - (src[i] >= '0' && src[i] <= '9')) { - safe_name[j++] = src[i]; + if (cmd_config.service_mode) { + if (!ts_ssh_service_launch_command(&cmd_config, expanded_cmd, nohup_cmd, + TS_SSH_CMD_COMMAND_MAX * 5 + 1024)) { + free(expanded_cmd); + free(nohup_cmd); + result->status = TS_ACTION_STATUS_FAILED; + return ESP_ERR_INVALID_SIZE; } - } - if (j == 0) { - /* Fallback to cmd_id (e.g. "emb-pull-up" -> "embpullup") */ - const char *id_src = ssh_ref->cmd_id; - for (int i = 0; id_src[i] && j < 20; i++) { - if ((id_src[i] >= 'a' && id_src[i] <= 'z') || - (id_src[i] >= 'A' && id_src[i] <= 'Z') || - (id_src[i] >= '0' && id_src[i] <= '9')) { - safe_name[j++] = id_src[i]; - } + } else { + char safe_name[32]; + ts_ssh_service_safe_name(&cmd_config, safe_name); + int len = + snprintf(nohup_cmd, TS_SSH_CMD_COMMAND_MAX * 5 + 1024, + "nohup %s > /tmp/ts_nohup_%s.log 2>&1 & echo $! > /tmp/ts_nohup_%s.pid", + expanded_cmd, safe_name, safe_name); + if (len < 0 || len >= TS_SSH_CMD_COMMAND_MAX * 5 + 1024) { + free(expanded_cmd); + free(nohup_cmd); + result->status = TS_ACTION_STATUS_FAILED; + return ESP_ERR_INVALID_SIZE; } } - if (j == 0) { - strcpy(safe_name, "cmd"); - } - ESP_LOGI(TAG, "nohup safe_name='%s' (from name='%s', id='%s')", safe_name, cmd_config.name, ssh_ref->cmd_id); - - /* nohup command with PID file for process tracking - * Format: nohup > 2>&1 & echo $! > ; sleep 0.3; cat - * 注意:$! 可能获取中间 shell PID 而非真实进程 PID(差 1), - * 前端已通过 PID-1 fallback 处理此情况 - */ - snprintf(nohup_cmd, TS_SSH_CMD_COMMAND_MAX + 128, - "nohup %s > /tmp/ts_nohup_%s.log 2>&1 & echo $! > /tmp/ts_nohup_%s.pid; sleep 0.3; cat /tmp/ts_nohup_%s.pid", - expanded_cmd, safe_name, safe_name, safe_name); - ESP_LOGI(TAG, "SSH nohup mode: %s", nohup_cmd); } - + /* Create SSH session */ ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); config.host = host.host; @@ -1283,7 +1428,7 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, /* Load SSH key from keystore if using key auth */ char *key_data = NULL; size_t key_len = 0; - + char full_path[128] = {0}; if (host.use_key_auth && host.key_path[0]) { /* host.key_path actually contains the keyid */ const char *keyid = host.key_path; @@ -1298,7 +1443,6 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, ESP_LOGI(TAG, "Loaded SSH key '%s' from keystore (%zu bytes)", keyid, key_len); } else { /* Fallback: try as file path */ - char full_path[128]; if (keyid[0] == '/') { strncpy(full_path, keyid, sizeof(full_path) - 1); } else { @@ -1337,13 +1481,34 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, if (key_data) free(key_data); return ret; } - + + uint32_t run_generation = 0; + if (cmd_config.nohup && cmd_config.service_mode) { + ret = ts_ssh_service_begin(&cmd_config, session, &run_generation); + if (ret != ESP_OK) { + result->status = TS_ACTION_STATUS_FAILED; + snprintf(result->output, sizeof(result->output), + "Service busy or remote state unknown; verify before retry"); + ts_ssh_session_destroy(session); + free(expanded_cmd); + free(nohup_cmd); + free(key_data); + return ret; + } + } /* Execute command */ ts_ssh_exec_result_t exec_result = {0}; const char *cmd_to_exec = cmd_config.nohup ? nohup_cmd : expanded_cmd; - ESP_LOGI(TAG, "SSH exec command: [%s]", cmd_to_exec); + ESP_LOGD(TAG, "SSH execution: command=%s, bytes=%u", ssh_ref->cmd_id, + (unsigned)strlen(cmd_to_exec)); ret = ts_ssh_exec(session, cmd_to_exec, &exec_result); - + if (run_generation) { + bool launched = ts_ssh_service_finish(cmd_config.id, run_generation, + ret == ESP_OK && exec_result.exit_code == 0 ? exec_result.stdout_data : NULL, session); + if (!launched && ret == ESP_OK) + ret = ESP_ERR_INVALID_RESPONSE; + } + if (ret == ESP_OK) { result->exit_code = exec_result.exit_code; if (exec_result.stdout_data && exec_result.stdout_len > 0) { @@ -1365,7 +1530,7 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, : TS_ACTION_STATUS_FAILED; /* Update variables if var_name is configured */ - if (cmd_config.var_name[0]) { + if (cmd_config.var_name[0] && !run_generation) { char var_full[64]; /* Set exit_code variable */ @@ -1388,42 +1553,19 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, cmd_config.nohup, cmd_config.service_mode, cmd_config.ready_pattern); ts_variable_set_string(var_full, debug_info); } - + /* Handle service mode: start log watching for nohup commands */ - if (cmd_config.nohup && cmd_config.service_mode && + if (exec_result.exit_code == 0 && cmd_config.nohup && cmd_config.service_mode && cmd_config.ready_pattern[0] && cmd_config.var_name[0]) { - - /* Generate safe name (same logic as nohup wrapper above) - * Priority: cmd.name -> cmd_id -> "cmd" - */ - char safe_name[32] = {0}; - const char *src = cmd_config.name; - int j = 0; - for (int i = 0; src[i] && j < 20; i++) { - if ((src[i] >= 'a' && src[i] <= 'z') || - (src[i] >= 'A' && src[i] <= 'Z') || - (src[i] >= '0' && src[i] <= '9')) { - safe_name[j++] = src[i]; - } - } - if (j == 0) { - const char *id_src = ssh_ref->cmd_id; - for (int i = 0; id_src[i] && j < 20; i++) { - if ((id_src[i] >= 'a' && id_src[i] <= 'z') || - (id_src[i] >= 'A' && id_src[i] <= 'Z') || - (id_src[i] >= '0' && id_src[i] <= '9')) { - safe_name[j++] = id_src[i]; - } - } - } - if (j == 0) { - strcpy(safe_name, "cmd"); - } - + + char safe_name[32]; + ts_ssh_service_safe_name(&cmd_config, safe_name); ts_ssh_log_watch_config_t watch_config = { .timeout_sec = cmd_config.ready_timeout_sec > 0 ? cmd_config.ready_timeout_sec : 60, .check_interval_ms = cmd_config.ready_check_interval_ms > 0 ? cmd_config.ready_check_interval_ms : 3000 }; + watch_config.run_generation = run_generation; + strcpy(watch_config.command_id, cmd_config.id); strncpy(watch_config.host_id, cmd_config.host_id, sizeof(watch_config.host_id) - 1); snprintf(watch_config.log_file, sizeof(watch_config.log_file), "/tmp/ts_nohup_%s.log", safe_name); @@ -1432,6 +1574,9 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, strncpy(watch_config.var_name, cmd_config.var_name, sizeof(watch_config.var_name) - 1); esp_err_t watch_ret = ts_ssh_log_watch_start(&watch_config, NULL); + if (watch_ret != ESP_OK) + ts_ssh_service_observe(cmd_config.id, run_generation, "unknown", + cmd_config.var_name); if (watch_ret == ESP_OK) { ESP_LOGI(TAG, "🔍 Service mode: watching log for '%s' (fail='%s', timeout: %us)", cmd_config.ready_pattern, cmd_config.service_fail_pattern, watch_config.timeout_sec); @@ -1439,10 +1584,9 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, ESP_LOGW(TAG, "Failed to start log watch: %s", esp_err_to_name(watch_ret)); } } - + /* Free result strings */ - if (exec_result.stdout_data) free(exec_result.stdout_data); - if (exec_result.stderr_data) free(exec_result.stderr_data); + ts_ssh_exec_result_free(&exec_result); } else { snprintf(result->output, sizeof(result->output), "SSH exec failed: %s", esp_err_to_name(ret)); @@ -1450,7 +1594,8 @@ esp_err_t ts_action_exec_ssh_ref(const ts_auto_action_ssh_ref_t *ssh_ref, ? TS_ACTION_STATUS_TIMEOUT : TS_ACTION_STATUS_FAILED; } - + + ts_ssh_exec_result_free(&exec_result); /* Cleanup */ ts_ssh_disconnect(session); ts_ssh_session_destroy(session); @@ -1501,9 +1646,9 @@ esp_err_t ts_action_exec_cli(const ts_auto_action_cli_t *cli, result->status = TS_ACTION_STATUS_FAILED; return ESP_ERR_INVALID_ARG; } - - ESP_LOGI(TAG, "Executing CLI command: %s", cli->command); - + + ESP_LOGD(TAG, "Executing CLI command (%u bytes)", (unsigned)strlen(cli->command)); + /* Execute CLI command using ts_console_exec */ ts_cmd_result_t cmd_result = {0}; esp_err_t ret = ts_console_exec(cli->command, &cmd_result); @@ -1553,10 +1698,9 @@ esp_err_t ts_action_exec_cli(const ts_auto_action_cli_t *cli, if (cmd_result.data) { free(cmd_result.data); } - - ESP_LOGD(TAG, "CLI result: cmd=%s, exit=%d, duration=%lu ms", - cli->command, result->exit_code, result->duration_ms); - + + ESP_LOGD(TAG, "CLI result: exit=%d, duration=%lu ms", result->exit_code, result->duration_ms); + return ret; } @@ -1572,8 +1716,8 @@ static esp_err_t execute_action_internal(const ts_auto_action_t *action, return ts_action_exec_ssh(&action->ssh, result); case TS_AUTO_ACT_SSH_CMD_REF: - return ts_action_exec_ssh_ref(&action->ssh_ref, result); - + return exec_ssh_ref_bound(&action->ssh_ref, action->runtime_binding, result); + case TS_AUTO_ACT_CLI: return ts_action_exec_cli(&action->cli, result); @@ -1618,18 +1762,32 @@ static void action_executor_task(void *arg) while (s_ctx->running) { if (xQueueReceive(s_ctx->action_queue, &entry, pdMS_TO_TICKS(1000)) == pdTRUE) { - if (!s_ctx->running) break; - + if (!s_ctx->running) { + ts_action_snapshot_release(&entry.action); + if (entry.result_ptr) + entry.result_ptr->status = TS_ACTION_STATUS_CANCELLED; + if (entry.done_sem) + xSemaphoreGive(entry.done_sem); + completion_release(entry.completion); + action_finished(); + break; + } + ts_action_result_t local_result = {0}; ts_action_result_t *result = entry.result_ptr ? entry.result_ptr : &local_result; /* Handle delay */ - if (entry.action.delay_ms > 0) { - vTaskDelay(pdMS_TO_TICKS(entry.action.delay_ms)); + uint32_t delay = entry.action.delay_ms; + while (delay && s_ctx->accepting) { + uint32_t slice = delay > 100 ? 100 : delay; + vTaskDelay(pdMS_TO_TICKS(slice)); + delay -= slice; } - - /* Execute action (safe: this task has DRAM stack) */ - execute_action_internal(&entry.action, result); + /* Stop discards work not yet started; active I/O owns its cleanup. */ + if (s_ctx->accepting) + execute_action_internal(&entry.action, result); + else + result->status = TS_ACTION_STATUS_CANCELLED; /* Callback (async mode) */ if (entry.callback) { @@ -1637,10 +1795,7 @@ static void action_executor_task(void *arg) } /* Signal completion (sync mode) */ - if (entry.done_sem) { - xSemaphoreGive(entry.done_sem); - } - + /* Update stats */ xSemaphoreTake(s_ctx->stats_mutex, portMAX_DELAY); s_ctx->stats.total_executed++; @@ -1652,11 +1807,18 @@ static void action_executor_task(void *arg) s_ctx->stats.total_failed++; } xSemaphoreGive(s_ctx->stats_mutex); + ts_action_snapshot_release(&entry.action); + if (entry.done_sem) + xSemaphoreGive(entry.done_sem); + completion_release(entry.completion); + action_finished(); } } ESP_LOGI(TAG, "Action executor task exiting"); + xSemaphoreTake(s_ctx->stats_mutex, portMAX_DELAY); s_ctx->executor_task = NULL; + xSemaphoreGive(s_ctx->stats_mutex); vTaskDelete(NULL); } @@ -1914,8 +2076,7 @@ esp_err_t ts_action_template_add(const ts_action_template_t *tpl) return ESP_OK; } -esp_err_t ts_action_template_remove(const char *id) -{ +static esp_err_t template_remove_impl(const char *id) { if (!s_ctx || !id || !id[0]) { return ESP_ERR_INVALID_ARG; } @@ -2056,8 +2217,7 @@ esp_err_t ts_action_template_execute(const char *id, ts_action_result_t *result) return ret; } -esp_err_t ts_action_template_update(const char *id, const ts_action_template_t *tpl) -{ +static esp_err_t template_update_impl(const char *id, const ts_action_template_t *tpl) { if (!s_ctx || !id || !tpl) { return ESP_ERR_INVALID_ARG; } @@ -2946,3 +3106,34 @@ esp_err_t ts_action_templates_load_from_file(const char *filepath) return ESP_OK; } + +static bool template_binding_protected(const char *id, const ts_action_template_t *next) { + ts_action_template_t *old = heap_caps_malloc(sizeof(*old), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!old) + return true; + bool busy = false; + if (ts_action_template_get(id, old) == ESP_OK && old->action.type == TS_AUTO_ACT_SSH_CMD_REF && + (!next || next->action.type != old->action.type || + strcmp(next->action.ssh_ref.cmd_id, old->action.ssh_ref.cmd_id))) + busy = ts_ssh_service_command_protected(old->action.ssh_ref.cmd_id); + free(old); + return busy; +} +esp_err_t ts_action_template_update(const char *id, const ts_action_template_t *next) { + if (!id || !next) + return ESP_ERR_INVALID_ARG; + ts_ssh_binding_lock(); + esp_err_t ret = template_binding_protected(id, next) ? ESP_ERR_INVALID_STATE + : template_update_impl(id, next); + ts_ssh_binding_unlock(); + return ret; +} +esp_err_t ts_action_template_remove(const char *id) { + if (!id) + return ESP_ERR_INVALID_ARG; + ts_ssh_binding_lock(); + esp_err_t ret = + template_binding_protected(id, NULL) ? ESP_ERR_INVALID_STATE : template_remove_impl(id); + ts_ssh_binding_unlock(); + return ret; +} diff --git a/components/ts_automation/src/ts_automation.c b/components/ts_automation/src/ts_automation.c index 377db2e..c700e27 100644 --- a/components/ts_automation/src/ts_automation.c +++ b/components/ts_automation/src/ts_automation.c @@ -26,6 +26,7 @@ #include "freertos/semphr.h" #include "cJSON.h" +#include #include #include @@ -40,6 +41,7 @@ static const char *TAG = "ts_automation"; */ typedef struct { ts_automation_state_t state; // 当前状态 + atomic_bool stopping; TaskHandle_t task_handle; // 主任务句柄 SemaphoreHandle_t mutex; // 状态互斥锁 @@ -198,11 +200,12 @@ esp_err_t ts_automation_deinit(void) ESP_LOGI(TAG, "Deinitializing automation engine"); // 先停止 - ts_automation_stop(); - - // 反初始化子模块 - ts_action_manager_deinit(); - ts_rule_engine_deinit(); + esp_err_t ret = ts_automation_stop(); + if (ret != ESP_OK) return ret; + ret = ts_action_manager_deinit(); + if (ret != ESP_OK) return ret; + ret = ts_rule_engine_deinit(); + if (ret != ESP_OK) return ret; ts_source_manager_deinit(); ts_variable_deinit(); @@ -227,86 +230,52 @@ bool ts_automation_is_initialized(void) /* 控制接口 */ /*===========================================================================*/ -esp_err_t ts_automation_start(void) -{ - if (s_ctx.state == TS_AUTO_STATE_UNINITIALIZED) { - ESP_LOGE(TAG, "Not initialized"); - return ESP_ERR_INVALID_STATE; - } - - if (s_ctx.state == TS_AUTO_STATE_RUNNING) { - ESP_LOGW(TAG, "Already running"); - return ESP_OK; - } - - ESP_LOGI(TAG, "Starting automation engine"); - - // 启动数据源 - esp_err_t ret = ts_source_start_all(); - if (ret != ESP_OK) { - ESP_LOGW(TAG, "Some sources failed to start"); - } - - // 创建主任务 - BaseType_t xret = xTaskCreatePinnedToCore( - automation_task, - "ts_auto", - CONFIG_TS_AUTOMATION_TASK_STACK_SIZE, - NULL, - CONFIG_TS_AUTOMATION_TASK_PRIORITY, - &s_ctx.task_handle, - 1 // CPU 1 - ); - - if (xret != pdPASS) { - ESP_LOGE(TAG, "Failed to create task"); - return ESP_ERR_NO_MEM; - } - +esp_err_t ts_automation_start(void) { + if (!s_ctx.mutex) return ESP_ERR_INVALID_STATE; xSemaphoreTake(s_ctx.mutex, portMAX_DELAY); + if (s_ctx.stopping) { xSemaphoreGive(s_ctx.mutex); return ESP_ERR_INVALID_STATE; } + if (s_ctx.state == TS_AUTO_STATE_RUNNING) { xSemaphoreGive(s_ctx.mutex); return ESP_OK; } + if (s_ctx.task_handle || ts_action_manager_resume() != ESP_OK) { + xSemaphoreGive(s_ctx.mutex); return ESP_ERR_INVALID_STATE; + } + ts_source_start_all(); s_ctx.state = TS_AUTO_STATE_RUNNING; + BaseType_t ret = xTaskCreatePinnedToCore(automation_task, "ts_auto", + CONFIG_TS_AUTOMATION_TASK_STACK_SIZE, NULL, CONFIG_TS_AUTOMATION_TASK_PRIORITY, + &s_ctx.task_handle, 1); + if (ret != pdPASS) s_ctx.state = TS_AUTO_STATE_INITIALIZED; xSemaphoreGive(s_ctx.mutex); - - ESP_LOGI(TAG, "Automation engine started"); - return ESP_OK; + return ret == pdPASS ? ESP_OK : ESP_ERR_NO_MEM; } - -esp_err_t ts_automation_stop(void) -{ - if (s_ctx.state != TS_AUTO_STATE_RUNNING && - s_ctx.state != TS_AUTO_STATE_PAUSED) { - return ESP_OK; - } - - ESP_LOGI(TAG, "Stopping automation engine"); - - // 设置停止状态 +esp_err_t ts_automation_stop(void) { + if (!s_ctx.mutex) return ESP_OK; xSemaphoreTake(s_ctx.mutex, portMAX_DELAY); - s_ctx.state = TS_AUTO_STATE_INITIALIZED; + s_ctx.stopping = true; xSemaphoreGive(s_ctx.mutex); - - // 等待任务退出 - if (s_ctx.task_handle) { - // 给任务一些时间自行退出 - vTaskDelay(pdMS_TO_TICKS(100)); - - // 如果还在运行,强制删除 - if (eTaskGetState(s_ctx.task_handle) != eDeleted) { - vTaskDelete(s_ctx.task_handle); - } - s_ctx.task_handle = NULL; + /* No external vTaskDelete: evaluator returns through rule lease cleanup. + * Async actions may outlive it; do not reopen admission until both are idle. */ + bool exited = false; + esp_err_t idle = ESP_ERR_TIMEOUT; + for (unsigned waited = 0; waited <= 200; waited += 10) { + idle = ts_action_manager_quiesce(); + xSemaphoreTake(s_ctx.mutex, portMAX_DELAY); + exited = s_ctx.task_handle == NULL; + xSemaphoreGive(s_ctx.mutex); + if (exited && idle == ESP_OK) break; + if (waited < 200) vTaskDelay(pdMS_TO_TICKS(10)); } - - // 停止数据源 + if (!exited || idle != ESP_OK) return ESP_ERR_TIMEOUT; + xSemaphoreTake(s_ctx.mutex, portMAX_DELAY); ts_source_stop_all(); - - ESP_LOGI(TAG, "Automation engine stopped"); + s_ctx.state = TS_AUTO_STATE_INITIALIZED; + s_ctx.stopping = false; + xSemaphoreGive(s_ctx.mutex); return ESP_OK; } esp_err_t ts_automation_pause(void) { - if (s_ctx.state != TS_AUTO_STATE_RUNNING) { + if (s_ctx.stopping || s_ctx.state != TS_AUTO_STATE_RUNNING) { return ESP_ERR_INVALID_STATE; } @@ -320,7 +289,7 @@ esp_err_t ts_automation_pause(void) esp_err_t ts_automation_resume(void) { - if (s_ctx.state != TS_AUTO_STATE_PAUSED) { + if (s_ctx.stopping || s_ctx.state != TS_AUTO_STATE_PAUSED) { return ESP_ERR_INVALID_STATE; } @@ -390,9 +359,10 @@ static void automation_task(void *arg) // 检查状态 xSemaphoreTake(s_ctx.mutex, portMAX_DELAY); ts_automation_state_t state = s_ctx.state; + bool stopping = s_ctx.stopping; xSemaphoreGive(s_ctx.mutex); - if (state != TS_AUTO_STATE_RUNNING && state != TS_AUTO_STATE_PAUSED) { + if (stopping || (state != TS_AUTO_STATE_RUNNING && state != TS_AUTO_STATE_PAUSED)) { break; // 退出任务 } @@ -418,7 +388,9 @@ static void automation_task(void *arg) } ESP_LOGI(TAG, "Automation task exiting"); + xSemaphoreTake(s_ctx.mutex, portMAX_DELAY); s_ctx.task_handle = NULL; + xSemaphoreGive(s_ctx.mutex); vTaskDelete(NULL); } diff --git a/components/ts_automation/src/ts_rule_codec.c b/components/ts_automation/src/ts_rule_codec.c new file mode 100644 index 0000000..68ca25f --- /dev/null +++ b/components/ts_automation/src/ts_rule_codec.c @@ -0,0 +1,502 @@ +#include "ts_rule_codec.h" +#include "esp_heap_caps.h" +#include "ts_action_manager.h" +#include +#include +#include +#include +#include +/* Descriptors cover the actual C fields, not raw struct bytes or padding. */ +typedef enum { STRING, BOOL, U8, U16, U32, I16, ENUM } field_type; +typedef struct { + const char *name; + size_t offset, size; + field_type type; + int max; +} field; +#define F(T, m, k, t, lim) {k, offsetof(T, m), sizeof(((T *)0)->m), t, lim} +#define A(m, k, t, lim) F(ts_auto_action_t, m, k, t, lim) +#define R(m, k, t, lim) F(ts_auto_rule_t, m, k, t, lim) +static const field common[] = {A(delay_ms, "delay_ms", U16, 65535), A(async, "async", BOOL, 1), + A(repeat_count, "repeat_count", U8, 255), + A(repeat_interval_ms, "repeat_interval_ms", U16, 65535), + A(template_id, "template_id", STRING, 0)}; +static const field rule_fields[] = {R(id, "id", STRING, 0), + R(name, "name", STRING, 0), + R(icon, "icon", STRING, 0), + R(enabled, "enabled", BOOL, 1), + R(manual_trigger, "manual_trigger", BOOL, 1), + R(show_on_dashboard, "show_on_dashboard", BOOL, 1), + R(allow_manual_trigger, "allow_manual_trigger", BOOL, 1), + R(cooldown_ms, "cooldown_ms", U32, 0), + R(revision, "revision", U32, 0)}; +static const field led_fields[] = { + A(led.device, "device", STRING, 0), + A(led.ctrl_type, "ctrl_type", ENUM, 9), + A(led.index, "index", U8, 255), + A(led.r, "r", U8, 255), + A(led.g, "g", U8, 255), + A(led.b, "b", U8, 255), + A(led.brightness, "brightness", U8, 255), + A(led.effect, "effect", STRING, 0), + A(led.duration_ms, "duration_ms", U16, 65535), + A(led.speed, "speed", U8, 255), + A(led.text, "text", STRING, 0), + A(led.font, "font", STRING, 0), + A(led.image_path, "image_path", STRING, 0), + A(led.qr_text, "qr_text", STRING, 0), + A(led.qr_ecc, "qr_ecc", U8, 255), + A(led.filter, "filter", STRING, 0), + A(led.center, "center", BOOL, 1), + A(led.loop, "loop", BOOL, 1), + A(led.scroll, "scroll", STRING, 0), + A(led.align, "align", STRING, 0), + A(led.x, "x", I16, 32767), + A(led.y, "y", I16, 32767), +}; +static const field ssh_fields[] = { + A(ssh.host_ref, "host_ref", STRING, 0), + A(ssh.command, "command", STRING, 0), + A(ssh.async, "ssh_async", BOOL, 1), + A(ssh.timeout_ms, "timeout_ms", U32, 0), +}; +static const field gpio_fields[] = { + A(gpio.pin, "pin", U8, 255), + A(gpio.level, "level", BOOL, 1), + A(gpio.pulse_ms, "pulse_ms", U32, 0), +}; +static const field webhook_fields[] = { + A(webhook.url, "url", STRING, 0), + A(webhook.method, "method", STRING, 0), + A(webhook.body_template, "body_template", STRING, 0), +}; +static const field log_fields[] = { + A(log.level, "level", U8, 255), + A(log.message, "message", STRING, 0), +}; +static const field set_var_fields[] = { + A(set_var.variable, "variable", STRING, 0), +}; +static const field device_fields[] = { + A(device.device, "device", STRING, 0), + A(device.action, "action", STRING, 0), +}; +static const field ssh_ref_fields[] = { + A(ssh_ref.cmd_id, "cmd_id", STRING, 0), +}; +static const field cli_fields[] = { + A(cli.command, "command", STRING, 0), + A(cli.var_name, "var_name", STRING, 0), + A(cli.timeout_ms, "timeout_ms", U32, 0), +}; +static const struct { + const field *fields; + size_t count; +} by_type[] = { + {led_fields, sizeof(led_fields) / sizeof(field)}, + {ssh_fields, sizeof(ssh_fields) / sizeof(field)}, + {gpio_fields, sizeof(gpio_fields) / sizeof(field)}, + {webhook_fields, sizeof(webhook_fields) / sizeof(field)}, + {log_fields, sizeof(log_fields) / sizeof(field)}, + {set_var_fields, sizeof(set_var_fields) / sizeof(field)}, + {device_fields, sizeof(device_fields) / sizeof(field)}, + {ssh_ref_fields, sizeof(ssh_ref_fields) / sizeof(field)}, + {cli_fields, sizeof(cli_fields) / sizeof(field)}, +}; +static const char *types[] = {"led", "ssh", "gpio", "webhook", "log", + "set_var", "device_ctrl", "ssh_cmd_ref", "cli"}; +static const char *ops[] = {"eq", "ne", "lt", "le", "gt", "ge", "contains"}; +static const char *repeats[] = {"once", "while_true", "count"}; +static int choice(const cJSON *j, const char *const *names, size_t count, int def) { + if (!j) + return def; + if (!cJSON_IsString(j)) + return -1; + for (size_t i = 0; i < count; ++i) + if (!strcmp(j->valuestring, names[i])) + return i; + return -1; +} +static bool fields_read(const cJSON *j, void *value, const field *fields, size_t count) { + for (size_t i = 0; i < count; ++i) { + const field *f = &fields[i]; + const cJSON *v = cJSON_GetObjectItemCaseSensitive(j, f->name); + if (!v) + continue; + char *p = (char *)value + f->offset; + if (f->type == STRING) { + if (!cJSON_IsString(v) || strlen(v->valuestring) >= f->size) + return false; + strcpy(p, v->valuestring); + continue; + } + if (f->type == BOOL) { + if (!cJSON_IsBool(v)) + return false; + *(bool *)p = cJSON_IsTrue(v); + continue; + } + double d = v->valuedouble; + double max = f->type == U32 ? UINT32_MAX : f->max; + if (!cJSON_IsNumber(v) || !isfinite(d) || trunc(d) != d || d > (double)max || + d < (f->type == I16 ? INT16_MIN : 0)) + return false; + switch (f->type) { + case U8: + *(uint8_t *)p = d; + break; + case U16: + *(uint16_t *)p = d; + break; + case U32: + *(uint32_t *)p = d; + break; + case I16: + *(int16_t *)p = d; + break; + case ENUM: + *(int *)p = d; + break; + default: + return false; + } + } + return true; +} +static bool fields_write(cJSON *j, const void *value, const field *fields, size_t count) { + for (size_t i = 0; i < count; ++i) { + const field *f = &fields[i]; + const char *p = (const char *)value + f->offset; + cJSON *v = NULL; + if (f->type == STRING) { + if (!memchr(p, 0, f->size)) + return false; + v = cJSON_CreateString(p); + } else if (f->type == BOOL) + v = cJSON_CreateBool(*(const bool *)p); + else { + double d = 0; + switch (f->type) { + case U8: + d = *(const uint8_t *)p; + break; + case U16: + d = *(const uint16_t *)p; + break; + case U32: + d = *(const uint32_t *)p; + break; + case I16: + d = *(const int16_t *)p; + break; + case ENUM: + d = *(const int *)p; + break; + default: + return false; + } + v = cJSON_CreateNumber(d); + } + if (!v) + return false; + if (!cJSON_AddItemToObject(j, f->name, v)) { + cJSON_Delete(v); + return false; + } + } + return true; +} +static bool value_read(const cJSON *j, ts_auto_value_t *v) { + if (!j || cJSON_IsNull(j)) { + v->type = TS_AUTO_VAL_NULL; + return true; + } + if (cJSON_IsBool(j)) { + v->type = TS_AUTO_VAL_BOOL; + v->bool_val = cJSON_IsTrue(j); + return true; + } + if (cJSON_IsNumber(j) && isfinite(j->valuedouble)) { + double d = j->valuedouble; + if (d >= INT32_MIN && d <= INT32_MAX && trunc(d) == d) { + v->type = TS_AUTO_VAL_INT; + v->int_val = d; + } else { + v->type = TS_AUTO_VAL_FLOAT; + v->float_val = d; + } + return true; + } + if (cJSON_IsString(j) && strlen(j->valuestring) < sizeof(v->str_val)) { + v->type = TS_AUTO_VAL_STRING; + strcpy(v->str_val, j->valuestring); + return true; + } + return false; +} +static bool typed_value_read(const cJSON *object, ts_auto_value_t *v) { + const cJSON *value = cJSON_GetObjectItemCaseSensitive(object, "value"); + if (!value_read(value, v)) + return false; + const cJSON *type = cJSON_GetObjectItemCaseSensitive(object, "value_type"); + if (!type) + return true; + if (!cJSON_IsNumber(type) || type->valuedouble != type->valueint) + return false; + if (type->valueint == TS_AUTO_VAL_FLOAT && cJSON_IsNumber(value)) { + memset(v, 0, sizeof(*v)); + v->type = TS_AUTO_VAL_FLOAT; + v->float_val = value->valuedouble; + return true; + } + return type->valueint == v->type; +} +static cJSON *value_write(const ts_auto_value_t *v) { + switch (v->type) { + case TS_AUTO_VAL_NULL: + return cJSON_CreateNull(); + case TS_AUTO_VAL_BOOL: + return cJSON_CreateBool(v->bool_val); + case TS_AUTO_VAL_INT: + return cJSON_CreateNumber(v->int_val); + case TS_AUTO_VAL_FLOAT: + return isfinite(v->float_val) ? cJSON_CreateNumber(v->float_val) : NULL; + case TS_AUTO_VAL_STRING: + return memchr(v->str_val, 0, sizeof(v->str_val)) ? cJSON_CreateString(v->str_val) : NULL; + default: + return NULL; + } +} +static bool condition_read(const cJSON *j, char *variable, int *op, ts_auto_value_t *v) { + const cJSON *name = cJSON_GetObjectItemCaseSensitive(j, "variable"); + int o = choice(cJSON_GetObjectItemCaseSensitive(j, "operator"), ops, 7, 0); + if (!cJSON_IsObject(j) || !cJSON_IsString(name) || !name->valuestring[0] || + strlen(name->valuestring) >= TS_AUTO_NAME_MAX_LEN || o < 0) + return false; + strcpy(variable, name->valuestring); + *op = o; + return typed_value_read(j, v); +} +static cJSON *condition_write(const char *variable, int op, const ts_auto_value_t *value) { + if (op < 0 || op >= 7) + return NULL; + cJSON *j = cJSON_CreateObject(), *v = value_write(value); + if (!j || !v) { + cJSON_Delete(j); + cJSON_Delete(v); + return NULL; + } + if (!cJSON_AddItemToObject(j, "value", v)) { + cJSON_Delete(v); + cJSON_Delete(j); + return NULL; + } + if (!cJSON_AddStringToObject(j, "variable", variable) || + !cJSON_AddStringToObject(j, "operator", ops[op]) || + !cJSON_AddNumberToObject(j, "value_type", value->type)) { + cJSON_Delete(j); + return NULL; + } + return j; +} +bool ts_rule_id_valid(const char *id) { + if (!id || !id[0] || strlen(id) >= TS_AUTO_NAME_MAX_LEN || !strcmp(id, ".") || + !strcmp(id, "..")) + return false; + for (const unsigned char *p = (const unsigned char *)id; *p; ++p) + if (*p < 32 || *p == '/' || *p == '\\') + return false; + return true; +} +void ts_rule_dispose(ts_auto_rule_t *r) { + if (!r) + return; + free(r->conditions.conditions); + free(r->actions); + memset(r, 0, sizeof(*r)); +} +esp_err_t ts_rule_decode(const cJSON *j, ts_auto_rule_t *r) { + if (!r || !cJSON_IsObject(j)) + return ESP_ERR_INVALID_ARG; + memset(r, 0, sizeof(*r)); + r->enabled = true; + r->revision = 1; + if (!fields_read(j, r, rule_fields, sizeof(rule_fields) / sizeof(field)) || + !ts_rule_id_valid(r->id) || !r->name[0]) + goto invalid; + if (cJSON_HasObjectItem(j, "show_on_dashboard")) + r->presentation_fields |= 1; + if (cJSON_HasObjectItem(j, "allow_manual_trigger")) + r->presentation_fields |= 2; + const cJSON *c = cJSON_GetObjectItemCaseSensitive(j, "conditions"), *items = c; + const cJSON *logic = cJSON_GetObjectItemCaseSensitive(j, "logic"); + if (cJSON_IsObject(c)) { + items = cJSON_GetObjectItemCaseSensitive(c, "items"); + logic = cJSON_GetObjectItemCaseSensitive(c, "logic"); + } + const char *logics[] = {"and", "or"}; + int li = choice(logic, logics, 2, 0); + if (li < 0) + goto invalid; + r->conditions.logic = li; + if (items) { + if (!cJSON_IsArray(items) || cJSON_GetArraySize(items) > UINT8_MAX) + goto invalid; + r->conditions.count = cJSON_GetArraySize(items); + } + if (r->conditions.count) { + r->conditions.conditions = heap_caps_calloc( + r->conditions.count, sizeof(ts_auto_condition_t), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!r->conditions.conditions) + goto oom; + } + for (unsigned i = 0; i < r->conditions.count; ++i) { + ts_auto_condition_t *cond = &r->conditions.conditions[i]; + int op; + if (!condition_read(cJSON_GetArrayItem(items, i), cond->variable, &op, &cond->value)) + goto invalid; + cond->op = op; + } + const cJSON *actions = cJSON_GetObjectItemCaseSensitive(j, "actions"); + if (!cJSON_IsArray(actions) || cJSON_GetArraySize(actions) > UINT8_MAX || + !cJSON_GetArraySize(actions)) + goto invalid; + r->action_count = cJSON_GetArraySize(actions); + r->actions = heap_caps_calloc(r->action_count, sizeof(ts_auto_action_t), + MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!r->actions) + goto oom; + for (unsigned i = 0; i < r->action_count; ++i) { + const cJSON *a = cJSON_GetArrayItem(actions, i); + ts_auto_action_t *out = &r->actions[i]; + if (!cJSON_IsObject(a)) + goto invalid; + const cJSON *type = cJSON_GetObjectItemCaseSensitive(a, "type"), + *tpl = cJSON_GetObjectItemCaseSensitive(a, "template_id"); + if (!type && cJSON_IsString(tpl)) { + ts_action_template_t *t = + heap_caps_calloc(1, sizeof(*t), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!t) + goto oom; + esp_err_t ret = ts_action_template_get(tpl->valuestring, t); + if (ret == ESP_OK) + *out = t->action; + free(t); + if (ret != ESP_OK) + out->type = TS_AUTO_ACT_TEMPLATE_REF; + } else { + int ty = choice(type, types, 9, -1); + if (cJSON_IsString(type) && !strcmp(type->valuestring, "device")) + ty = TS_AUTO_ACT_DEVICE_CTRL; + if (ty < 0) + goto invalid; + out->type = ty; + } + if (!fields_read(a, out, common, sizeof(common) / sizeof(field)) || + (out->type != TS_AUTO_ACT_TEMPLATE_REF && + !fields_read(a, out, by_type[out->type].fields, by_type[out->type].count))) + goto invalid; + int rep = choice(cJSON_GetObjectItemCaseSensitive(a, "repeat_mode"), repeats, 3, + out->repeat_mode); + if (rep < 0) + goto invalid; + out->repeat_mode = rep; + if (cJSON_HasObjectItem(a, "condition")) { + const cJSON *ac = cJSON_GetObjectItemCaseSensitive(a, "condition"); + out->condition.has_condition = !cJSON_IsNull(ac); + int op; + if (out->condition.has_condition) { + if (!condition_read(ac, out->condition.variable, &op, &out->condition.value)) + goto invalid; + out->condition.op = op; + } + } + if (out->type == TS_AUTO_ACT_SET_VAR && !typed_value_read(a, &out->set_var.value)) + goto invalid; + } + return ESP_OK; +oom: + ts_rule_dispose(r); + return ESP_ERR_NO_MEM; +invalid: + ts_rule_dispose(r); + return ESP_ERR_INVALID_ARG; +} +cJSON *ts_rule_encode(const ts_auto_rule_t *r) { + if (!r || (r->conditions.count && !r->conditions.conditions) || + (r->action_count && !r->actions) || + (r->conditions.logic != TS_AUTO_LOGIC_AND && r->conditions.logic != TS_AUTO_LOGIC_OR)) + return NULL; + cJSON *j = cJSON_CreateObject(); + if (!j) + return NULL; + if (!fields_write(j, r, rule_fields, sizeof(rule_fields) / sizeof(field))) + goto fail; + if (!(r->presentation_fields & 1)) + cJSON_DeleteItemFromObject(j, "show_on_dashboard"); + if (!(r->presentation_fields & 2)) + cJSON_DeleteItemFromObject(j, "allow_manual_trigger"); + if (!cJSON_AddStringToObject(j, "logic", + r->conditions.logic == TS_AUTO_LOGIC_OR ? "or" : "and")) + goto fail; + cJSON *conditions = cJSON_AddArrayToObject(j, "conditions"), + *actions = cJSON_AddArrayToObject(j, "actions"); + if (!conditions || !actions) + goto fail; + for (unsigned i = 0; i < r->conditions.count; ++i) { + const ts_auto_condition_t *c = &r->conditions.conditions[i]; + cJSON *cj = condition_write(c->variable, c->op, &c->value); + if (!cj) + goto fail; + if (!cJSON_AddItemToArray(conditions, cj)) { + cJSON_Delete(cj); + goto fail; + } + } + for (unsigned i = 0; i < r->action_count; ++i) { + const ts_auto_action_t *a = &r->actions[i]; + if ((a->type == TS_AUTO_ACT_TEMPLATE_REF && !a->template_id[0]) || a->type < 0 || + a->type > TS_AUTO_ACT_TEMPLATE_REF || a->repeat_mode < 0 || + a->repeat_mode > TS_AUTO_REPEAT_COUNT) + goto fail; + cJSON *aj = cJSON_CreateObject(); + if (!aj) + goto fail; + if (!cJSON_AddItemToArray(actions, aj)) { + cJSON_Delete(aj); + goto fail; + } + if ((a->type != TS_AUTO_ACT_TEMPLATE_REF && + !cJSON_AddStringToObject(aj, "type", types[a->type])) || + !fields_write(aj, a, common, sizeof(common) / sizeof(field)) || + (a->type != TS_AUTO_ACT_TEMPLATE_REF && + !fields_write(aj, a, by_type[a->type].fields, by_type[a->type].count)) || + !cJSON_AddStringToObject(aj, "repeat_mode", repeats[a->repeat_mode])) + goto fail; + if (a->condition.has_condition) { + cJSON *cj = + condition_write(a->condition.variable, a->condition.op, &a->condition.value); + if (!cj) + goto fail; + if (!cJSON_AddItemToObject(aj, "condition", cj)) { + cJSON_Delete(cj); + goto fail; + } + } + if (a->type == TS_AUTO_ACT_SET_VAR) { + if (!cJSON_AddNumberToObject(aj, "value_type", a->set_var.value.type)) + goto fail; + cJSON *v = value_write(&a->set_var.value); + if (!v) + goto fail; + if (!cJSON_AddItemToObject(aj, "value", v)) { + cJSON_Delete(v); + goto fail; + } + } + } + return j; +fail: + cJSON_Delete(j); + return NULL; +} diff --git a/components/ts_automation/src/ts_rule_engine.c b/components/ts_automation/src/ts_rule_engine.c index cba637d..67bf7d3 100644 --- a/components/ts_automation/src/ts_rule_engine.c +++ b/components/ts_automation/src/ts_rule_engine.c @@ -1,3 +1,7 @@ +#include "ts_rule_codec.h" +#include "ts_rule_store.h" +#include "ts_ssh_commands_config.h" +#include "ts_ssh_service.h" /** * @file ts_rule_engine.c * @brief TianShanOS 自动化引擎 - 规则引擎实现 @@ -71,7 +75,15 @@ typedef struct { int count; // 当前规则数量 int capacity; // 最大容量 SemaphoreHandle_t mutex; // 访问互斥锁 - bool initialized; // 初始化标志 + bool initialized; + bool loaded, recovery_error; + int source; + uint32_t next_instance; + unsigned retired; + SemaphoreHandle_t transaction; + struct { + bool committing, executing, readonly; + } meta[CONFIG_TS_AUTOMATION_MAX_RULES]; ts_rule_engine_stats_t stats; // 统计信息 } ts_rule_engine_ctx_t; @@ -83,6 +95,75 @@ static ts_rule_engine_ctx_t s_rule_ctx = { .initialized = false, }; +typedef struct { + unsigned refs; + bool retired; + ts_auto_condition_t *conditions; + ts_auto_action_t *actions; +} rule_payload_t; +static void payload_free(rule_payload_t *p) { + if (p) { + free(p->conditions); + free(p->actions); + free(p); + } +} +static rule_payload_t *payload_adopt(ts_auto_rule_t *r) { + rule_payload_t *p = heap_caps_calloc(1, sizeof(*p), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (p) { + p->conditions = r->conditions.conditions; + p->actions = r->actions; + r->lease = p; + } + return p; +} +static int find_rule_index(const char *id); +void ts_rule_resolve_presentation(ts_auto_rule_t *r) { + bool service = false, unresolved = false; + for (unsigned i = 0; i < r->action_count; ++i) { + ts_auto_action_t *a = &r->actions[i]; + ts_action_template_t *tpl = NULL; + if (a->template_id[0]) { + tpl = heap_caps_calloc(1, sizeof(*tpl), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!tpl || ts_action_template_get(a->template_id, tpl) != ESP_OK) { + free(tpl); + unresolved = true; + continue; + } + a = &tpl->action; + } + if (a->type == TS_AUTO_ACT_SSH_CMD_REF) { + ts_ssh_command_config_t *cmd = + heap_caps_calloc(1, sizeof(*cmd), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!cmd || ts_ssh_commands_config_get(a->ssh_ref.cmd_id, cmd) != ESP_OK) + unresolved = true; + else + service |= cmd->service_mode; + free(cmd); + } + free(tpl); + } + if (!(r->presentation_fields & 1)) + r->show_on_dashboard = (r->enabled && r->manual_trigger) || service; + if (!(r->presentation_fields & 2)) + r->allow_manual_trigger = r->manual_trigger || service; + r->reference_unresolved = unresolved; + if (!unresolved) + r->presentation_fields = 3; + if (r->lease && s_rule_ctx.initialized) { + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + int index = find_rule_index(r->id); + if (index >= 0 && s_rule_ctx.rules[index].revision == r->revision && + s_rule_ctx.rules[index].instance == r->instance) { + s_rule_ctx.rules[index].show_on_dashboard = r->show_on_dashboard; + s_rule_ctx.rules[index].allow_manual_trigger = r->allow_manual_trigger; + s_rule_ctx.rules[index].reference_unresolved = unresolved; + s_rule_ctx.rules[index].presentation_fields = r->presentation_fields; + } + xSemaphoreGive(s_rule_ctx.mutex); + } +} + /*===========================================================================*/ /* 执行历史环形缓冲区 */ /*===========================================================================*/ @@ -252,8 +333,11 @@ esp_err_t ts_rule_engine_init(void) memset(s_rule_ctx.rules, 0, alloc_size); // 创建互斥锁 - s_rule_ctx.mutex = xSemaphoreCreateMutex(); - if (!s_rule_ctx.mutex) { + if (!s_rule_ctx.mutex) + s_rule_ctx.mutex = xSemaphoreCreateMutex(); + if (!s_rule_ctx.transaction) + s_rule_ctx.transaction = xSemaphoreCreateRecursiveMutex(); + if (!s_rule_ctx.mutex || !s_rule_ctx.transaction) { free(s_rule_ctx.rules); s_rule_ctx.rules = NULL; ESP_LOGE(TAG, "Failed to create mutex"); @@ -309,40 +393,28 @@ void ts_rule_deferred_load_task(void *arg) esp_err_t ts_rule_engine_deinit(void) { - if (!s_rule_ctx.initialized) { - return ESP_OK; - } - - ESP_LOGI(TAG, "Deinitializing rule engine"); - - // 释放规则中的动态分配内存 - for (int i = 0; i < s_rule_ctx.count; i++) { - if (s_rule_ctx.rules[i].conditions.conditions) { - free(s_rule_ctx.rules[i].conditions.conditions); - } - if (s_rule_ctx.rules[i].actions) { - free(s_rule_ctx.rules[i].actions); - } - } - - if (s_rule_ctx.mutex) { - vSemaphoreDelete(s_rule_ctx.mutex); - s_rule_ctx.mutex = NULL; - } - - if (s_rule_ctx.rules) { - if (heap_caps_get_allocated_size(s_rule_ctx.rules) > 0) { - heap_caps_free(s_rule_ctx.rules); - } else { - free(s_rule_ctx.rules); - } - s_rule_ctx.rules = NULL; + if (!s_rule_ctx.initialized) + return ESP_ERR_INVALID_STATE; + xSemaphoreTakeRecursive(s_rule_ctx.transaction, portMAX_DELAY); + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + bool busy = s_rule_ctx.retired != 0; + for (int i = 0; i < s_rule_ctx.count; ++i) + busy |= ((rule_payload_t *)s_rule_ctx.rules[i].lease)->refs != 0 || + s_rule_ctx.meta[i].executing; + if (busy) { + xSemaphoreGive(s_rule_ctx.mutex); + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + return ESP_ERR_INVALID_STATE; } - - s_rule_ctx.count = 0; - s_rule_ctx.capacity = 0; s_rule_ctx.initialized = false; - + xSemaphoreGive(s_rule_ctx.mutex); + for (int i = 0; i < s_rule_ctx.count; ++i) + payload_free(s_rule_ctx.rules[i].lease); + free(s_rule_ctx.rules); + s_rule_ctx.rules = NULL; + s_rule_ctx.count = 0; + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + /* Retain small mutexes for late rejected callers. */ return ESP_OK; } @@ -350,235 +422,275 @@ esp_err_t ts_rule_engine_deinit(void) /* 规则管理 */ /*===========================================================================*/ -esp_err_t ts_rule_register(const ts_auto_rule_t *rule) -{ - if (!rule || !rule->id[0]) { +/* Readers pin only the immutable arrays; scalar metadata is copied in the short lock. */ +esp_err_t ts_rule_acquire(const char *id, ts_auto_rule_t *out) { + if (!id || !out || !s_rule_ctx.initialized) return ESP_ERR_INVALID_ARG; - } - - if (!s_rule_ctx.initialized) { - return ESP_ERR_INVALID_STATE; - } - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - // 检查是否已存在 - int idx = find_rule_index(rule->id); - if (idx >= 0) { - // 释放旧规则的动态内存 - if (s_rule_ctx.rules[idx].conditions.conditions) { - free(s_rule_ctx.rules[idx].conditions.conditions); - s_rule_ctx.rules[idx].conditions.conditions = NULL; - } - if (s_rule_ctx.rules[idx].actions) { - free(s_rule_ctx.rules[idx].actions); - s_rule_ctx.rules[idx].actions = NULL; - } - - // 复制基本数据 - strncpy(s_rule_ctx.rules[idx].id, rule->id, sizeof(s_rule_ctx.rules[idx].id) - 1); - strncpy(s_rule_ctx.rules[idx].name, rule->name, sizeof(s_rule_ctx.rules[idx].name) - 1); - strncpy(s_rule_ctx.rules[idx].icon, rule->icon, sizeof(s_rule_ctx.rules[idx].icon) - 1); - s_rule_ctx.rules[idx].enabled = rule->enabled; - s_rule_ctx.rules[idx].manual_trigger = rule->manual_trigger; - s_rule_ctx.rules[idx].cooldown_ms = rule->cooldown_ms; - s_rule_ctx.rules[idx].conditions.logic = rule->conditions.logic; - s_rule_ctx.rules[idx].conditions.count = 0; - s_rule_ctx.rules[idx].action_count = 0; - - // 深拷贝条件数组 - if (rule->conditions.count > 0 && rule->conditions.conditions) { - s_rule_ctx.rules[idx].conditions.conditions = heap_caps_calloc( - rule->conditions.count, sizeof(ts_auto_condition_t), - MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (s_rule_ctx.rules[idx].conditions.conditions) { - memcpy(s_rule_ctx.rules[idx].conditions.conditions, - rule->conditions.conditions, - rule->conditions.count * sizeof(ts_auto_condition_t)); - s_rule_ctx.rules[idx].conditions.count = rule->conditions.count; - } - } - - // 深拷贝动作数组 - if (rule->action_count > 0 && rule->actions) { - s_rule_ctx.rules[idx].actions = heap_caps_calloc( - rule->action_count, sizeof(ts_auto_action_t), - MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (s_rule_ctx.rules[idx].actions) { - memcpy(s_rule_ctx.rules[idx].actions, - rule->actions, - rule->action_count * sizeof(ts_auto_action_t)); - s_rule_ctx.rules[idx].action_count = rule->action_count; - } - } - - xSemaphoreGive(s_rule_ctx.mutex); - - // 保存到 NVS - ts_rules_save(); - - ESP_LOGD(TAG, "Updated rule: %s", rule->id); - return ESP_OK; - } - - // 检查容量 - if (s_rule_ctx.count >= s_rule_ctx.capacity) { + int i = find_rule_index(id); + if (i < 0) { xSemaphoreGive(s_rule_ctx.mutex); - ESP_LOGE(TAG, "Rule storage full"); - return ESP_ERR_NO_MEM; - } - - // 添加新规则 - 深拷贝 - ts_auto_rule_t *new_rule = &s_rule_ctx.rules[s_rule_ctx.count]; - memset(new_rule, 0, sizeof(ts_auto_rule_t)); - - // 复制基本数据 - strncpy(new_rule->id, rule->id, sizeof(new_rule->id) - 1); - strncpy(new_rule->name, rule->name, sizeof(new_rule->name) - 1); - strncpy(new_rule->icon, rule->icon, sizeof(new_rule->icon) - 1); - new_rule->enabled = rule->enabled; - new_rule->manual_trigger = rule->manual_trigger; - new_rule->cooldown_ms = rule->cooldown_ms; - new_rule->conditions.logic = rule->conditions.logic; - - // 深拷贝条件数组 - if (rule->conditions.count > 0 && rule->conditions.conditions) { - new_rule->conditions.conditions = heap_caps_calloc( - rule->conditions.count, sizeof(ts_auto_condition_t), - MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (new_rule->conditions.conditions) { - memcpy(new_rule->conditions.conditions, - rule->conditions.conditions, - rule->conditions.count * sizeof(ts_auto_condition_t)); - new_rule->conditions.count = rule->conditions.count; - } - } - - // 深拷贝动作数组 - if (rule->action_count > 0 && rule->actions) { - new_rule->actions = heap_caps_calloc( - rule->action_count, sizeof(ts_auto_action_t), - MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (new_rule->actions) { - memcpy(new_rule->actions, - rule->actions, - rule->action_count * sizeof(ts_auto_action_t)); - new_rule->action_count = rule->action_count; - } + return ESP_ERR_NOT_FOUND; } - - s_rule_ctx.count++; - + *out = s_rule_ctx.rules[i]; + ++((rule_payload_t *)out->lease)->refs; xSemaphoreGive(s_rule_ctx.mutex); - - // 保存到 NVS - ts_rules_save(); - - ESP_LOGI(TAG, "Registered rule: %s (%s)", rule->id, rule->name); return ESP_OK; } - -esp_err_t ts_rule_unregister(const char *id) -{ - if (!id || !s_rule_ctx.initialized) { - return ESP_ERR_INVALID_ARG; - } - +void ts_rule_release(ts_auto_rule_t *r) { + if (!r || !r->lease) + return; + rule_payload_t *p = r->lease; + bool destroy = false; xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - int idx = find_rule_index(id); - if (idx < 0) { - xSemaphoreGive(s_rule_ctx.mutex); - return ESP_ERR_NOT_FOUND; - } - - // 释放动态内存 - if (s_rule_ctx.rules[idx].conditions.conditions) { - free(s_rule_ctx.rules[idx].conditions.conditions); + if (--p->refs == 0 && p->retired) { + --s_rule_ctx.retired; + destroy = true; } - if (s_rule_ctx.rules[idx].actions) { - free(s_rule_ctx.rules[idx].actions); - } - - // 移动后续元素 - if (idx < s_rule_ctx.count - 1) { - memmove(&s_rule_ctx.rules[idx], - &s_rule_ctx.rules[idx + 1], - (s_rule_ctx.count - idx - 1) * sizeof(ts_auto_rule_t)); - } - s_rule_ctx.count--; - xSemaphoreGive(s_rule_ctx.mutex); - - // 保存到 NVS - ts_rules_save(); - - ESP_LOGD(TAG, "Unregistered rule: %s", id); - return ESP_OK; + if (destroy) + payload_free(p); + memset(r, 0, sizeof(*r)); } - -esp_err_t ts_rule_enable(const char *id) -{ - if (!id || !s_rule_ctx.initialized) { - return ESP_ERR_INVALID_ARG; - } - - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - int idx = find_rule_index(id); - if (idx < 0) { - xSemaphoreGive(s_rule_ctx.mutex); - return ESP_ERR_NOT_FOUND; +static bool same_config(const ts_auto_rule_t *a, const ts_auto_rule_t *b) { + return !strcmp(a->id, b->id) && !strcmp(a->name, b->name) && !strcmp(a->icon, b->icon) && + a->enabled == b->enabled && a->manual_trigger == b->manual_trigger && + a->show_on_dashboard == b->show_on_dashboard && + a->allow_manual_trigger == b->allow_manual_trigger && + a->presentation_fields == b->presentation_fields && a->cooldown_ms == b->cooldown_ms && + a->conditions.logic == b->conditions.logic && + a->conditions.count == b->conditions.count && a->action_count == b->action_count && + (!a->conditions.count || !memcmp(a->conditions.conditions, b->conditions.conditions, + a->conditions.count * sizeof(ts_auto_condition_t))) && + (!a->action_count || + !memcmp(a->actions, b->actions, a->action_count * sizeof(ts_auto_action_t))); +} +static bool protected_bindings(const ts_auto_rule_t *old, const ts_auto_rule_t *next) { + bool actions_changed = !next || old->action_count != next->action_count || + (old->action_count && memcmp(old->actions, next->actions, old->action_count * sizeof(*old->actions))); + if (actions_changed && ts_ssh_service_rule_protected(old->id)) return true; + for (unsigned i = 0; i < old->action_count; i++) { + const ts_auto_action_t *a = &old->actions[i]; + bool retained = false; + if (next) + for (unsigned n = 0; n < next->action_count; n++) { + const ts_auto_action_t *b = &next->actions[n]; + if (a->template_id[0]) + retained |= !strcmp(a->template_id, b->template_id); + else if (a->type == TS_AUTO_ACT_SSH_CMD_REF) + retained |= b->type == a->type && !strcmp(a->ssh_ref.cmd_id, b->ssh_ref.cmd_id); + } + if (retained) + continue; + ts_action_template_t *tpl = NULL; + if (a->template_id[0]) { + tpl = heap_caps_malloc(sizeof(*tpl), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!tpl) + return true; + esp_err_t lookup = ts_action_template_get(a->template_id, tpl); + if (lookup != ESP_OK) { + free(tpl); + /* Missing configuration is not proof that a remote service ended. + * Without the old binding, conservatively consult independent runs. */ + if (lookup != ESP_ERR_NOT_FOUND || ts_ssh_service_any_in_use()) return true; + continue; + } + a = &tpl->action; + } + bool busy = a->type == TS_AUTO_ACT_SSH_CMD_REF && + ts_ssh_service_command_protected(a->ssh_ref.cmd_id); + free(tpl); + if (busy) + return true; } - - s_rule_ctx.rules[idx].enabled = true; - - xSemaphoreGive(s_rule_ctx.mutex); - - // 保存状态变更到 NVS - ts_rules_save(); - - return ESP_OK; + return false; } - -esp_err_t ts_rule_disable(const char *id) -{ - if (!id || !s_rule_ctx.initialized) { +esp_err_t ts_rule_commit(const ts_auto_rule_t *input, const char *id, uint32_t expected, + ts_rule_commit_result_t *result) { + ts_rule_commit_result_t local = {.error_code = "invalid_argument"}; + if (!result) + result = &local; + *result = local; + if (!ts_rule_id_valid(id) || !s_rule_ctx.initialized) return ESP_ERR_INVALID_ARG; + xSemaphoreTakeRecursive(s_rule_ctx.transaction, portMAX_DELAY); + ts_auto_rule_t candidate = {0}; + if (input) { + cJSON *j = ts_rule_encode(input); + if (!j) { + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + return ESP_ERR_NO_MEM; + } + esp_err_t ret = ts_rule_decode(j, &candidate); + cJSON_Delete(j); + if (ret != ESP_OK) { + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + return ret; + } + ts_rule_resolve_presentation(&candidate); + if (strcmp(candidate.id, id)) { + ts_rule_dispose(&candidate); + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + return ESP_ERR_INVALID_ARG; + } + if (!payload_adopt(&candidate)) { + ts_rule_dispose(&candidate); + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + return ESP_ERR_NO_MEM; + } } - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - int idx = find_rule_index(id); - if (idx < 0) { + int i = find_rule_index(id); + esp_err_t ret = ESP_OK; + if (!s_rule_ctx.loaded || s_rule_ctx.recovery_error) { + ret = ESP_ERR_INVALID_STATE; + result->error_code = "recovery_required"; + } else if ((i < 0 && expected != 0) || (i >= 0 && expected != s_rule_ctx.rules[i].revision)) { + ret = ESP_ERR_INVALID_STATE; + result->error_code = "revision_conflict"; + } else if (i < 0 && !input) { + ret = ESP_ERR_NOT_FOUND; + } else if (i < 0 && s_rule_ctx.count == s_rule_ctx.capacity) { + ret = ESP_ERR_NO_MEM; + result->error_code = "capacity"; + } else if (i >= 0 && s_rule_ctx.meta[i].readonly) { + ret = ESP_ERR_NOT_SUPPORTED; + result->error_code = "source_read_only"; + } else if (i >= 0 && s_rule_ctx.retired && + ((rule_payload_t *)s_rule_ctx.rules[i].lease)->refs) { + ret = ESP_ERR_INVALID_STATE; + result->error_code = "busy_retired_config"; + } else if (i >= 0 && !input && s_rule_ctx.meta[i].executing) { + ret = ESP_ERR_INVALID_STATE; + result->error_code = "execution_busy"; + } else if (i >= 0 && input && same_config(&candidate, &s_rule_ctx.rules[i])) { + result->applied = result->durable = 1; + result->mirror_synced = -1; + result->revision = s_rule_ctx.rules[i].revision; + result->error_code = "no_change"; xSemaphoreGive(s_rule_ctx.mutex); - return ESP_ERR_NOT_FOUND; + goto done; } - - s_rule_ctx.rules[idx].enabled = false; - + if (ret != ESP_OK) { + xSemaphoreGive(s_rule_ctx.mutex); + goto done; + } + if (i >= 0) + s_rule_ctx.meta[i].committing = true; + if (i >= 0 && s_rule_ctx.rules[i].revision == UINT32_MAX) { + s_rule_ctx.meta[i].committing = false; + result->error_code = "revision_exhausted"; + ret = ESP_ERR_INVALID_STATE; + xSemaphoreGive(s_rule_ctx.mutex); + goto done; + } + candidate.revision = i >= 0 ? s_rule_ctx.rules[i].revision + 1 : 1; xSemaphoreGive(s_rule_ctx.mutex); - - // 保存状态变更到 NVS - ts_rules_save(); - - return ESP_OK; -} - -const ts_auto_rule_t *ts_rule_get(const char *id) -{ - if (!id || !s_rule_ctx.initialized) { - return NULL; + ts_ssh_binding_lock(); + if (i >= 0 && protected_bindings(&s_rule_ctx.rules[i], input ? &candidate : NULL)) { + ts_ssh_binding_unlock(); + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + s_rule_ctx.meta[i].committing = false; + xSemaphoreGive(s_rule_ctx.mutex); + result->error_code = "service_busy"; + ret = ESP_ERR_INVALID_STATE; + goto done; + } + /* The edit gate keeps payloads alive; copy scalar metadata under the rule + * lock so cold presentation resolution cannot race the durable snapshot. */ + ts_auto_rule_t *persisted = s_rule_ctx.count + ? heap_caps_malloc(s_rule_ctx.count * sizeof(*persisted), + MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT) + : NULL; + if (s_rule_ctx.count && !persisted) { + ts_ssh_binding_unlock(); + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + if (i >= 0) + s_rule_ctx.meta[i].committing = false; + xSemaphoreGive(s_rule_ctx.mutex); + result->error_code = "no_memory"; + ret = ESP_ERR_NO_MEM; + goto done; } - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - int idx = find_rule_index(id); - const ts_auto_rule_t *rule = (idx >= 0) ? &s_rule_ctx.rules[idx] : NULL; - + if (persisted) + memcpy(persisted, s_rule_ctx.rules, s_rule_ctx.count * sizeof(*persisted)); + xSemaphoreGive(s_rule_ctx.mutex); + ts_rule_commit_t stored; + ret = ts_rule_store_commit(persisted, s_rule_ctx.count, input ? &candidate : NULL, id, + s_rule_ctx.source, &stored); + free(persisted); + result->applied = stored.applied; + result->durable = stored.durable; + result->mirror_synced = stored.mirror_synced; + result->error_code = stored.error_code; + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + if (stored.applied < 0) + s_rule_ctx.recovery_error = true; + rule_payload_t *old = NULL; + if (ret == ESP_OK) { + if (i >= 0) { + old = s_rule_ctx.rules[i].lease; + candidate.last_trigger_ms = s_rule_ctx.rules[i].last_trigger_ms; + candidate.trigger_count = s_rule_ctx.rules[i].trigger_count; + candidate.instance = s_rule_ctx.rules[i].instance; + } else { + i = s_rule_ctx.count++; + memset(&s_rule_ctx.meta[i], 0, sizeof(s_rule_ctx.meta[i])); + candidate.instance = ++s_rule_ctx.next_instance; + } + if (input) { + s_rule_ctx.rules[i] = candidate; + candidate.lease = NULL; + result->revision = s_rule_ctx.rules[i].revision; + } else { + memmove(s_rule_ctx.rules + i, s_rule_ctx.rules + i + 1, + (s_rule_ctx.count - i - 1) * sizeof(ts_auto_rule_t)); + memmove(s_rule_ctx.meta + i, s_rule_ctx.meta + i + 1, + (s_rule_ctx.count - i - 1) * sizeof(s_rule_ctx.meta[0])); + --s_rule_ctx.count; + i = -1; + } + if (old && old->refs) { + old->retired = true; + ++s_rule_ctx.retired; + old = NULL; + } + } + if (i >= 0) + s_rule_ctx.meta[i].committing = false; xSemaphoreGive(s_rule_ctx.mutex); - return rule; + payload_free(old); + ts_ssh_binding_unlock(); +done: + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + payload_free(candidate.lease); + return ret; +} +esp_err_t ts_rule_register(const ts_auto_rule_t *r) { + return r ? ts_rule_commit(r, r->id, r->revision, NULL) : ESP_ERR_INVALID_ARG; } +esp_err_t ts_rule_unregister(const char *id) { + ts_auto_rule_t r; + esp_err_t e = ts_rule_acquire(id, &r); + if (e != ESP_OK) + return e; + uint32_t v = r.revision; + ts_rule_release(&r); + return ts_rule_commit(NULL, id, v, NULL); +} +static esp_err_t set_enabled(const char *id, bool enabled) { + ts_auto_rule_t r; + esp_err_t e = ts_rule_acquire(id, &r); + if (e != ESP_OK) + return e; + r.enabled = enabled; + e = ts_rule_commit(&r, id, r.revision, NULL); + ts_rule_release(&r); + return e; +} +esp_err_t ts_rule_enable(const char *id) { return set_enabled(id, true); } +esp_err_t ts_rule_disable(const char *id) { return set_enabled(id, false); } int ts_rule_count(void) { @@ -611,6 +723,13 @@ bool ts_rule_eval_condition(const ts_auto_condition_t *condition) return false; } + /* Missing/non-numeric values must not compare equal after a failed coercion. */ + bool lhs_numeric = var_value.type >= TS_AUTO_VAL_BOOL && var_value.type <= TS_AUTO_VAL_FLOAT; + bool rhs_numeric = + condition->value.type >= TS_AUTO_VAL_BOOL && condition->value.type <= TS_AUTO_VAL_FLOAT; + if (var_value.type == TS_AUTO_VAL_NULL || condition->value.type == TS_AUTO_VAL_NULL || + (var_value.type != condition->value.type && !(lhs_numeric && rhs_numeric))) + return false; // 执行比较 int cmp = compare_values(&var_value, &condition->value); @@ -683,85 +802,113 @@ bool ts_rule_eval_condition_group(const ts_auto_condition_group_t *group) /* 规则评估 */ /*===========================================================================*/ -esp_err_t ts_rule_evaluate(const char *id, bool *triggered) -{ - if (!id || !triggered || !s_rule_ctx.initialized) { - return ESP_ERR_INVALID_ARG; - } - +static esp_err_t execute_rule(const char *id, bool manual, bool *triggered) { + if (!ts_action_manager_accepting()) return ESP_ERR_INVALID_STATE; *triggered = false; - - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - int idx = find_rule_index(id); - if (idx < 0) { - xSemaphoreGive(s_rule_ctx.mutex); - return ESP_ERR_NOT_FOUND; - } - - ts_auto_rule_t *rule = &s_rule_ctx.rules[idx]; - - // 检查是否启用 - if (!rule->enabled) { - xSemaphoreGive(s_rule_ctx.mutex); + ts_auto_rule_t r; + esp_err_t ret = ts_rule_acquire(id, &r); + if (ret != ESP_OK) + return ret; + if (manual && (r.reference_unresolved || r.presentation_fields != 3)) + ts_rule_resolve_presentation(&r); + if (!r.enabled || (!manual && r.manual_trigger) || (manual && !r.allow_manual_trigger)) { + ts_rule_release(&r); + return manual ? ESP_ERR_INVALID_STATE : ESP_OK; + } + if (!manual && !ts_rule_eval_condition_group(&r.conditions)) { + ts_rule_release(&r); return ESP_OK; } - - // 检查冷却时间 - int64_t now_ms = esp_timer_get_time() / 1000; - if (rule->cooldown_ms > 0 && rule->last_trigger_ms > 0) { - if ((now_ms - rule->last_trigger_ms) < rule->cooldown_ms) { - xSemaphoreGive(s_rule_ctx.mutex); - return ESP_OK; // 还在冷却中 + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + int preliminary = find_rule_index(id); + bool unavailable = preliminary < 0 || !s_rule_ctx.loaded || s_rule_ctx.recovery_error || + s_rule_ctx.meta[preliminary].committing || + s_rule_ctx.meta[preliminary].executing || + (!manual && r.cooldown_ms && r.last_trigger_ms && + esp_timer_get_time() / 1000 - r.last_trigger_ms < r.cooldown_ms); + xSemaphoreGive(s_rule_ctx.mutex); + if (unavailable) { + ts_rule_release(&r); + return manual ? ESP_ERR_INVALID_STATE : ESP_OK; + } + for (unsigned n = 0; n < r.action_count; n++) { + if (r.actions[n].type == TS_AUTO_ACT_SSH_CMD_REF && + !ts_ssh_service_start_admissible(r.actions[n].ssh_ref.cmd_id)) { + ts_rule_release(&r); + return manual ? ESP_ERR_INVALID_STATE : ESP_OK; } } - + /* Freeze all referenced actions/SSH bindings once at admission. No allocation + * on unmatched evaluations; queue entries retain their own binding lease. */ + ts_auto_action_t *frozen = + heap_caps_calloc(r.action_count, sizeof(*frozen), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!frozen) { + ts_rule_release(&r); + return ESP_ERR_NO_MEM; + } + ts_ssh_binding_lock(); + unsigned prepared = 0; + for (; prepared < r.action_count; ++prepared) { + ret = ts_action_snapshot(&r.actions[prepared], &frozen[prepared]); + if (ret != ESP_OK) + break; + } + if (ret != ESP_OK) { + ts_ssh_binding_unlock(); + for (unsigned n = 0; n < prepared; n++) + ts_action_snapshot_release(&frozen[n]); + free(frozen); + ts_rule_release(&r); + return ret; + } + int64_t now = esp_timer_get_time() / 1000; + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + int i = find_rule_index(id); + bool valid = i >= 0 && !s_rule_ctx.recovery_error && s_rule_ctx.loaded && + !s_rule_ctx.meta[i].committing && !s_rule_ctx.meta[i].executing && + s_rule_ctx.rules[i].revision == r.revision && + s_rule_ctx.rules[i].instance == r.instance; + if (valid && !manual && r.cooldown_ms && s_rule_ctx.rules[i].last_trigger_ms && + now - s_rule_ctx.rules[i].last_trigger_ms < r.cooldown_ms) + valid = false; + if (valid) + s_rule_ctx.meta[i].executing = true; xSemaphoreGive(s_rule_ctx.mutex); - - // 评估条件(在锁外执行,避免死锁) - bool conditions_met = ts_rule_eval_condition_group(&rule->conditions); - - if (conditions_met) { - // 执行动作 - ESP_LOGI(TAG, "Rule '%s' triggered", rule->id); - - int success_count = 0, fail_count = 0; - if (rule->actions && rule->action_count > 0) { - execute_actions_with_stats(rule->actions, rule->action_count, - &success_count, &fail_count); - } - - // 更新触发时间和计数 - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - rule->last_trigger_ms = now_ms; - rule->trigger_count++; - s_rule_ctx.stats.total_triggers++; - s_rule_ctx.stats.total_actions += rule->action_count; - s_rule_ctx.stats.failed_actions += fail_count; - - // 记录执行历史 - ts_rule_exec_status_t status; - char msg[TS_RULE_EXEC_MSG_LEN]; - if (fail_count == 0) { - status = TS_RULE_EXEC_SUCCESS; - snprintf(msg, sizeof(msg), "%d actions OK", success_count); - } else if (success_count == 0) { - status = TS_RULE_EXEC_FAILED; - snprintf(msg, sizeof(msg), "all %d actions failed", fail_count); - } else { - status = TS_RULE_EXEC_PARTIAL; - snprintf(msg, sizeof(msg), "%d/%d actions failed", - fail_count, success_count + fail_count); - } - record_execution(rule->id, status, TS_RULE_TRIGGER_CONDITION, - msg, (uint8_t)rule->action_count, (uint8_t)fail_count); - - xSemaphoreGive(s_rule_ctx.mutex); - - *triggered = true; + if (valid) + for (unsigned n = 0; n < r.action_count; ++n) ts_action_snapshot_owner(&frozen[n], r.id); + ts_ssh_binding_unlock(); + if (!valid) { + for (unsigned n = 0; n < r.action_count; n++) + ts_action_snapshot_release(&frozen[n]); + free(frozen); + ts_rule_release(&r); + return manual ? ESP_ERR_INVALID_STATE : ESP_OK; + } + int success = 0, failed = 0; + ret = execute_actions_with_stats(frozen, r.action_count, &success, &failed); + for (unsigned n = 0; n < r.action_count; n++) + ts_action_snapshot_release(&frozen[n]); + free(frozen); + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + i = find_rule_index(id); + if (i >= 0 && s_rule_ctx.rules[i].instance == r.instance) { + s_rule_ctx.meta[i].executing = false; + s_rule_ctx.rules[i].last_trigger_ms = now; + ++s_rule_ctx.rules[i].trigger_count; + ++s_rule_ctx.stats.total_triggers; + record_execution(id, failed ? TS_RULE_EXEC_FAILED : TS_RULE_EXEC_SUCCESS, + manual ? TS_RULE_TRIGGER_MANUAL : TS_RULE_TRIGGER_CONDITION, + failed ? "action failed" : "actions accepted", r.action_count, failed); } - - return ESP_OK; + xSemaphoreGive(s_rule_ctx.mutex); + *triggered = true; + ts_rule_release(&r); + return ret; +} +esp_err_t ts_rule_evaluate(const char *id, bool *triggered) { + if (!triggered) + return ESP_ERR_INVALID_ARG; + return execute_rule(id, false, triggered); } int ts_rule_evaluate_all(void) @@ -804,74 +951,9 @@ int ts_rule_evaluate_all(void) return triggered; } -esp_err_t ts_rule_trigger(const char *id) -{ - if (!id || !s_rule_ctx.initialized) { - return ESP_ERR_INVALID_ARG; - } - - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - int idx = find_rule_index(id); - if (idx < 0) { - xSemaphoreGive(s_rule_ctx.mutex); - return ESP_ERR_NOT_FOUND; - } - - ts_auto_rule_t *rule = &s_rule_ctx.rules[idx]; - int action_count = rule->action_count; - char rule_id_copy[TS_AUTO_NAME_MAX_LEN]; - strncpy(rule_id_copy, rule->id, sizeof(rule_id_copy) - 1); - rule_id_copy[sizeof(rule_id_copy) - 1] = '\0'; - - ESP_LOGI(TAG, "Manually triggering rule: %s (actions=%p, count=%d)", - rule->id, (void*)rule->actions, rule->action_count); - - // 执行动作 - int success_count = 0, fail_count = 0; - if (rule->actions && rule->action_count > 0) { - ESP_LOGI(TAG, "Executing %d actions for rule %s", rule->action_count, rule->id); - for (int i = 0; i < rule->action_count; i++) { - ESP_LOGI(TAG, " Action[%d]: type=%d, template=%s, delay=%d", - i, rule->actions[i].type, - rule->actions[i].template_id[0] ? rule->actions[i].template_id : "(none)", - rule->actions[i].delay_ms); - } - xSemaphoreGive(s_rule_ctx.mutex); - execute_actions_with_stats(rule->actions, rule->action_count, - &success_count, &fail_count); - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - ESP_LOGI(TAG, "Actions execution complete: success=%d, fail=%d", success_count, fail_count); - } else { - ESP_LOGW(TAG, "Rule %s has no actions (actions=%p, count=%d)", - rule->id, (void*)rule->actions, rule->action_count); - } - - rule->last_trigger_ms = esp_timer_get_time() / 1000; - rule->trigger_count++; - s_rule_ctx.stats.total_triggers++; - s_rule_ctx.stats.total_actions += action_count; - s_rule_ctx.stats.failed_actions += fail_count; - - // 记录执行历史 - ts_rule_exec_status_t status; - char msg[TS_RULE_EXEC_MSG_LEN]; - if (fail_count == 0) { - status = TS_RULE_EXEC_SUCCESS; - snprintf(msg, sizeof(msg), "%d actions OK (manual)", success_count); - } else if (success_count == 0) { - status = TS_RULE_EXEC_FAILED; - snprintf(msg, sizeof(msg), "all %d failed (manual)", fail_count); - } else { - status = TS_RULE_EXEC_PARTIAL; - snprintf(msg, sizeof(msg), "%d/%d failed (manual)", - fail_count, success_count + fail_count); - } - record_execution(rule_id_copy, status, TS_RULE_TRIGGER_MANUAL, - msg, (uint8_t)action_count, (uint8_t)fail_count); - - xSemaphoreGive(s_rule_ctx.mutex); - return ESP_OK; +esp_err_t ts_rule_trigger(const char *id) { + bool triggered; + return execute_rule(id, true, &triggered); } /*===========================================================================*/ @@ -1032,7 +1114,7 @@ static esp_err_t execute_cli_action(const ts_auto_action_t *action) } const char *command = action->cli.command; - ESP_LOGI(TAG, "CLI action: command=%s (queued)", command); + ESP_LOGD(TAG, "CLI action queued (%u bytes)", (unsigned)strlen(command)); if (!command || command[0] == '\0') { ESP_LOGE(TAG, "Empty CLI command"); @@ -1160,10 +1242,10 @@ static esp_err_t execute_ssh_action(const ts_auto_action_t *action) if (ret == ESP_OK) { ESP_LOGI(TAG, "SSH command exit code: %d", result.exit_code); if (result.stdout_data && result.stdout_len > 0) { - ESP_LOGD(TAG, "SSH stdout: %.*s", (int)result.stdout_len, result.stdout_data); + ESP_LOGD(TAG, "SSH stdout bytes: %u", (unsigned)result.stdout_len); } if (result.stderr_data && result.stderr_len > 0) { - ESP_LOGW(TAG, "SSH stderr: %.*s", (int)result.stderr_len, result.stderr_data); + ESP_LOGW(TAG, "SSH stderr bytes: %u", (unsigned)result.stderr_len); } // 存储 exit_code 到变量(使用 host_ref 作为变量前缀) @@ -1261,12 +1343,18 @@ esp_err_t ts_action_execute(const ts_auto_action_t *action) esp_err_t ret = ESP_OK; ts_action_result_t result = {0}; + if (action->runtime_snapshot) { + ts_auto_action_t queued = *action; + queued.delay_ms = 0; /* Rule sequencer already applied this delay. */ + return action->async ? ts_action_queue(&queued, NULL, NULL, 5) + : ts_action_manager_execute(&queued, &result); + } /* 如果有 template_id,使用模板执行(模板包含完整的动作数据) */ if (action->template_id[0] != '\0') { ESP_LOGD(TAG, "Executing action via template: %s", action->template_id); ret = ts_action_template_execute(action->template_id, &result); if (ret != ESP_OK) { - ESP_LOGW(TAG, "Template action failed: %s - %s", action->template_id, result.output); + ESP_LOGW(TAG, "Template action failed: %s (code=%d)", action->template_id, ret); } s_rule_ctx.stats.total_actions++; if (ret != ESP_OK) { @@ -1363,11 +1451,21 @@ static bool check_action_condition(const ts_auto_action_t *action) /** * @brief Execute a single action with repeat support */ +/* Delays/repeat waits cooperate with stop without abandoning rule ownership. */ +static bool rule_wait(uint32_t ms) { + while (ms && ts_action_manager_accepting()) { + uint32_t slice = ms > 100 ? 100 : ms; + vTaskDelay(pdMS_TO_TICKS(slice)); + ms -= slice; + } + return ts_action_manager_accepting(); +} static esp_err_t execute_action_with_repeat(const ts_auto_action_t *action, ts_action_result_cb_t callback, void *user_data) { esp_err_t ret = ESP_OK; + if (!ts_action_manager_accepting()) return ESP_ERR_INVALID_STATE; // 先检查动作级别的条件 if (!check_action_condition(action)) { @@ -1393,6 +1491,7 @@ static esp_err_t execute_action_with_repeat(const ts_auto_action_t *action, ESP_LOGI(TAG, "Repeat action %d times, interval=%dms", count, interval); for (uint8_t i = 0; i < count; i++) { + if (!ts_action_manager_accepting()) return ESP_ERR_INVALID_STATE; // 每次重复前检查条件 if (!check_action_condition(action)) { ESP_LOGI(TAG, "Repeat stopped: condition no longer met"); @@ -1406,7 +1505,7 @@ static esp_err_t execute_action_with_repeat(const ts_auto_action_t *action, // 最后一次不需要等待 if (i < count - 1 && interval > 0) { - vTaskDelay(pdMS_TO_TICKS(interval)); + if (!rule_wait(interval)) return ESP_ERR_INVALID_STATE; } } break; @@ -1420,14 +1519,14 @@ static esp_err_t execute_action_with_repeat(const ts_auto_action_t *action, ESP_LOGI(TAG, "Repeat while condition true, interval=%dms, max=%d", interval, max_iterations); - while (check_action_condition(action) && iterations < max_iterations) { + while (ts_action_manager_accepting() && check_action_condition(action) && iterations < max_iterations) { ret = ts_action_execute(action); if (callback) { callback(action, ret, user_data); } iterations++; - vTaskDelay(pdMS_TO_TICKS(interval)); + if (!rule_wait(interval)) return ESP_ERR_INVALID_STATE; } if (iterations >= max_iterations) { @@ -1462,6 +1561,7 @@ static esp_err_t execute_actions_with_stats(const ts_auto_action_t *actions, int ESP_LOGI(TAG, "Executing %d actions sequentially", count); for (int i = 0; i < count; i++) { + if (!ts_action_manager_accepting()) { fail += count - i; ret = ESP_ERR_INVALID_STATE; break; } ESP_LOGI(TAG, "Action [%d/%d]: type=%d, template=%s, delay=%dms", i + 1, count, actions[i].type, actions[i].template_id[0] ? actions[i].template_id : "(inline)", @@ -1470,7 +1570,7 @@ static esp_err_t execute_actions_with_stats(const ts_auto_action_t *actions, int // 动作前延迟 if (actions[i].delay_ms > 0) { ESP_LOGI(TAG, " Waiting %dms before action", actions[i].delay_ms); - vTaskDelay(pdMS_TO_TICKS(actions[i].delay_ms)); + if (!rule_wait(actions[i].delay_ms)) { fail += count - i; ret = ESP_ERR_INVALID_STATE; break; } } esp_err_t action_ret = execute_action_with_repeat(&actions[i], NULL, NULL); @@ -1507,7 +1607,7 @@ static esp_err_t execute_actions_with_stats(const ts_auto_action_t *actions, int } if (delay_after > 0) { ESP_LOGI(TAG, " Auto delay %dms after LED Matrix action", delay_after); - vTaskDelay(pdMS_TO_TICKS(delay_after)); + rule_wait(delay_after); } } } @@ -1550,6 +1650,7 @@ esp_err_t ts_rule_get_by_index(int index, ts_auto_rule_t *rule) } memcpy(rule, &s_rule_ctx.rules[index], sizeof(ts_auto_rule_t)); + ++((rule_payload_t *)rule->lease)->refs; xSemaphoreGive(s_rule_ctx.mutex); return ESP_OK; @@ -1685,894 +1786,262 @@ esp_err_t ts_rule_clear_exec_history(void) /** * @brief 操作符转字符串 */ -static const char *operator_to_str(ts_auto_operator_t op) -{ - switch (op) { - case TS_AUTO_OP_EQ: return "eq"; - case TS_AUTO_OP_NE: return "ne"; - case TS_AUTO_OP_GT: return "gt"; - case TS_AUTO_OP_GE: return "ge"; - case TS_AUTO_OP_LT: return "lt"; - case TS_AUTO_OP_LE: return "le"; - case TS_AUTO_OP_CONTAINS: return "contains"; - case TS_AUTO_OP_CHANGED: return "changed"; - default: return "eq"; - } -} - -/** - * @brief 字符串转操作符 - */ -static ts_auto_operator_t str_to_operator(const char *str) -{ - if (!str) return TS_AUTO_OP_EQ; - if (strcmp(str, "ne") == 0) return TS_AUTO_OP_NE; - if (strcmp(str, "gt") == 0) return TS_AUTO_OP_GT; - if (strcmp(str, "ge") == 0) return TS_AUTO_OP_GE; - if (strcmp(str, "lt") == 0) return TS_AUTO_OP_LT; - if (strcmp(str, "le") == 0) return TS_AUTO_OP_LE; - if (strcmp(str, "contains") == 0) return TS_AUTO_OP_CONTAINS; - if (strcmp(str, "changed") == 0) return TS_AUTO_OP_CHANGED; - return TS_AUTO_OP_EQ; -} - -/** - * @brief 动作类型转字符串 - */ -static const char *action_type_to_str(ts_auto_action_type_t type) -{ - switch (type) { - case TS_AUTO_ACT_LED: return "led"; - case TS_AUTO_ACT_GPIO: return "gpio"; - case TS_AUTO_ACT_DEVICE_CTRL: return "device_ctrl"; - case TS_AUTO_ACT_SSH_CMD_REF: return "ssh_cmd_ref"; - case TS_AUTO_ACT_CLI: return "cli"; - case TS_AUTO_ACT_WEBHOOK: return "webhook"; - case TS_AUTO_ACT_LOG: return "log"; - case TS_AUTO_ACT_SET_VAR: return "set_var"; - default: return "log"; - } +static esp_err_t decode_text(const char *text, ts_auto_rule_t *r) { + cJSON *j = cJSON_Parse(text); + if (!j) + return ESP_ERR_INVALID_ARG; + esp_err_t e = + ts_rule_decode(cJSON_HasObjectItem(j, "rule") ? cJSON_GetObjectItem(j, "rule") : j, r); + cJSON_Delete(j); + return e; } - -/** - * @brief 字符串转动作类型 - */ -static ts_auto_action_type_t str_to_action_type(const char *str) -{ - if (!str) return TS_AUTO_ACT_LOG; - if (strcmp(str, "led") == 0) return TS_AUTO_ACT_LED; - if (strcmp(str, "gpio") == 0) return TS_AUTO_ACT_GPIO; - if (strcmp(str, "device_ctrl") == 0) return TS_AUTO_ACT_DEVICE_CTRL; - if (strcmp(str, "ssh_cmd_ref") == 0) return TS_AUTO_ACT_SSH_CMD_REF; - if (strcmp(str, "cli") == 0) return TS_AUTO_ACT_CLI; - if (strcmp(str, "webhook") == 0) return TS_AUTO_ACT_WEBHOOK; - if (strcmp(str, "log") == 0) return TS_AUTO_ACT_LOG; - if (strcmp(str, "set_var") == 0) return TS_AUTO_ACT_SET_VAR; - return TS_AUTO_ACT_LOG; +static esp_err_t load_one(const char *path, ts_auto_rule_t *r, bool *encrypted) { + char *text = NULL; + size_t len = 0; + esp_err_t e = ts_config_pack_load_with_priority(path, &text, &len, encrypted); + if (e == ESP_OK) + e = decode_text(text, r); + free(text); + return e; } - -/** - * @brief 将值序列化为 JSON 对象 - */ -static cJSON *value_to_json(const ts_auto_value_t *val) -{ - switch (val->type) { - case TS_AUTO_VAL_BOOL: - return cJSON_CreateBool(val->bool_val); - case TS_AUTO_VAL_INT: - return cJSON_CreateNumber(val->int_val); - case TS_AUTO_VAL_FLOAT: - return cJSON_CreateNumber(val->float_val); - case TS_AUTO_VAL_STRING: - return cJSON_CreateString(val->str_val); - default: - return cJSON_CreateNull(); - } -} - -/** - * @brief 从 JSON 对象反序列化值 - */ -static void json_to_value(cJSON *json, ts_auto_value_t *val) -{ - if (!json || !val) return; - - if (cJSON_IsBool(json)) { - val->type = TS_AUTO_VAL_BOOL; - val->bool_val = cJSON_IsTrue(json); - } else if (cJSON_IsNumber(json)) { - // 判断是整数还是浮点数 - double d = json->valuedouble; - if (d == (int64_t)d && d >= INT32_MIN && d <= INT32_MAX) { - val->type = TS_AUTO_VAL_INT; - val->int_val = (int32_t)d; - } else { - val->type = TS_AUTO_VAL_FLOAT; - val->float_val = d; - } - } else if (cJSON_IsString(json)) { - val->type = TS_AUTO_VAL_STRING; - strncpy(val->str_val, json->valuestring, sizeof(val->str_val) - 1); - } -} - -/** - * @brief 将规则序列化为 JSON 字符串 - */ -static char *rule_to_json(const ts_auto_rule_t *rule) -{ - cJSON *root = cJSON_CreateObject(); - if (!root) return NULL; - - // 基本信息 - cJSON_AddStringToObject(root, "id", rule->id); - cJSON_AddStringToObject(root, "name", rule->name); - if (rule->icon[0]) { - cJSON_AddStringToObject(root, "icon", rule->icon); - } - cJSON_AddBoolToObject(root, "enabled", rule->enabled); - cJSON_AddBoolToObject(root, "manual_trigger", rule->manual_trigger); - cJSON_AddNumberToObject(root, "cooldown_ms", rule->cooldown_ms); - - // 条件组 - cJSON *conditions = cJSON_CreateObject(); - cJSON_AddStringToObject(conditions, "logic", - rule->conditions.logic == TS_AUTO_LOGIC_OR ? "or" : "and"); - - cJSON *cond_array = cJSON_CreateArray(); - for (int i = 0; i < rule->conditions.count; i++) { - const ts_auto_condition_t *c = &rule->conditions.conditions[i]; - cJSON *cond = cJSON_CreateObject(); - cJSON_AddStringToObject(cond, "variable", c->variable); - cJSON_AddStringToObject(cond, "operator", operator_to_str(c->op)); - cJSON_AddItemToObject(cond, "value", value_to_json(&c->value)); - cJSON_AddItemToArray(cond_array, cond); - } - cJSON_AddItemToObject(conditions, "items", cond_array); - cJSON_AddItemToObject(root, "conditions", conditions); - - // 动作数组 - cJSON *actions = cJSON_CreateArray(); - for (int i = 0; i < rule->action_count; i++) { - const ts_auto_action_t *a = &rule->actions[i]; - cJSON *action = cJSON_CreateObject(); - - cJSON_AddStringToObject(action, "type", action_type_to_str(a->type)); - cJSON_AddNumberToObject(action, "delay_ms", a->delay_ms); - - // 根据类型保存特定字段 - switch (a->type) { - case TS_AUTO_ACT_LED: - cJSON_AddStringToObject(action, "device", a->led.device); - cJSON_AddNumberToObject(action, "index", a->led.index); - cJSON_AddNumberToObject(action, "r", a->led.r); - cJSON_AddNumberToObject(action, "g", a->led.g); - cJSON_AddNumberToObject(action, "b", a->led.b); - if (a->led.effect[0]) { - cJSON_AddStringToObject(action, "effect", a->led.effect); - } - cJSON_AddNumberToObject(action, "duration_ms", a->led.duration_ms); - break; - - case TS_AUTO_ACT_GPIO: - cJSON_AddNumberToObject(action, "pin", a->gpio.pin); - cJSON_AddBoolToObject(action, "level", a->gpio.level); - cJSON_AddNumberToObject(action, "pulse_ms", a->gpio.pulse_ms); - break; - - case TS_AUTO_ACT_DEVICE_CTRL: - cJSON_AddStringToObject(action, "device", a->device.device); - cJSON_AddStringToObject(action, "action", a->device.action); - break; - - case TS_AUTO_ACT_CLI: - cJSON_AddStringToObject(action, "command", a->cli.command); - cJSON_AddStringToObject(action, "var_name", a->cli.var_name); - cJSON_AddNumberToObject(action, "timeout_ms", a->cli.timeout_ms); - break; - - case TS_AUTO_ACT_LOG: - cJSON_AddStringToObject(action, "message", a->log.message); - cJSON_AddNumberToObject(action, "level", a->log.level); - break; - - case TS_AUTO_ACT_SET_VAR: - cJSON_AddStringToObject(action, "variable", a->set_var.variable); - cJSON_AddItemToObject(action, "value", value_to_json(&a->set_var.value)); - break; - - case TS_AUTO_ACT_WEBHOOK: - cJSON_AddStringToObject(action, "url", a->webhook.url); - cJSON_AddStringToObject(action, "method", a->webhook.method); - cJSON_AddStringToObject(action, "body_template", a->webhook.body_template); - break; - - case TS_AUTO_ACT_SSH_CMD_REF: - cJSON_AddStringToObject(action, "cmd_id", a->ssh_ref.cmd_id); - break; - - default: - break; - } - - // 保存 template_id(如果有) - if (a->template_id[0]) { - cJSON_AddStringToObject(action, "template_id", a->template_id); - } - - cJSON_AddItemToArray(actions, action); - } - cJSON_AddItemToObject(root, "actions", actions); - - char *json_str = cJSON_PrintUnformatted(root); - cJSON_Delete(root); - return json_str; -} - -/* Forward declarations for SD card loading */ -static esp_err_t json_to_rule(const char *json_str, ts_auto_rule_t *rule); - -/*===========================================================================*/ -/* SD 卡独立文件操作 */ -/*===========================================================================*/ - -/** - * @brief 确保 rules 目录存在 - */ -static esp_err_t ensure_rules_dir(void) -{ - struct stat st; - - /* 确保 /sdcard/config 存在 */ - if (stat("/sdcard/config", &st) != 0) { - if (mkdir("/sdcard/config", 0755) != 0) { - ESP_LOGE(TAG, "Failed to create /sdcard/config"); - return ESP_FAIL; - } - } - - /* 确保 /sdcard/config/rules 存在 */ - if (stat(RULES_SDCARD_DIR, &st) != 0) { - if (mkdir(RULES_SDCARD_DIR, 0755) != 0) { - ESP_LOGE(TAG, "Failed to create %s", RULES_SDCARD_DIR); - return ESP_FAIL; - } - } - - return ESP_OK; -} - -/** - * @brief 导出单条规则到独立文件 - */ -static esp_err_t export_rule_to_file(const ts_auto_rule_t *rule) -{ - if (!rule || !rule->id[0]) return ESP_ERR_INVALID_ARG; - - char filepath[128]; - snprintf(filepath, sizeof(filepath), "%s/%s.json", RULES_SDCARD_DIR, rule->id); - - char *json = rule_to_json(rule); - if (!json) return ESP_ERR_NO_MEM; - - FILE *fp = fopen(filepath, "w"); - if (!fp) { - free(json); - ESP_LOGE(TAG, "Failed to open file: %s", filepath); - return ESP_FAIL; - } - - fprintf(fp, "%s\n", json); - fclose(fp); - free(json); - - ESP_LOGD(TAG, "Exported rule to %s", filepath); - return ESP_OK; -} - -/** - * @brief 删除单条规则的独立文件 - * @note 备用函数,当前删除操作在 API 层直接实现 - */ -static esp_err_t __attribute__((unused)) delete_rule_file(const char *id) -{ - if (!id || !id[0]) return ESP_ERR_INVALID_ARG; - - char filepath[128]; - snprintf(filepath, sizeof(filepath), "%s/%s.json", RULES_SDCARD_DIR, id); - - if (unlink(filepath) == 0) { - ESP_LOGD(TAG, "Deleted rule file: %s", filepath); - } - - return ESP_OK; -} - -/** - * @brief 从独立文件目录加载所有规则 - * - * 支持 .tscfg 加密配置优先加载 - */ -static esp_err_t load_rules_from_dir(void) -{ +static esp_err_t load_directory(ts_auto_rule_t *rules, int *count, bool *readonly) { DIR *dir = opendir(RULES_SDCARD_DIR); - if (!dir) { - ESP_LOGD(TAG, "Rules directory not found: %s", RULES_SDCARD_DIR); + if (!dir) return ESP_ERR_NOT_FOUND; - } - - int loaded = 0; + esp_err_t e = ESP_OK; struct dirent *entry; - - /* 使用堆分配避免栈溢出 */ - ts_auto_rule_t *rule = heap_caps_malloc(sizeof(ts_auto_rule_t), MALLOC_CAP_SPIRAM); - if (!rule) rule = malloc(sizeof(ts_auto_rule_t)); - if (!rule) { - closedir(dir); - return ESP_ERR_NO_MEM; - } - - while ((entry = readdir(dir)) != NULL) { - /* 跳过非 .json 和非 .tscfg 文件 */ - size_t len = strlen(entry->d_name); - bool is_json = (len >= 6 && strcmp(entry->d_name + len - 5, ".json") == 0); - bool is_tscfg = (len >= 7 && strcmp(entry->d_name + len - 6, ".tscfg") == 0); - - if (!is_json && !is_tscfg) { - continue; - } - - /* 对于 .json 文件,检查是否存在对应的 .tscfg(跳过以使用加密版本) */ - if (is_json) { - char tscfg_name[128]; - snprintf(tscfg_name, sizeof(tscfg_name), "%.*s.tscfg", (int)(len - 5), entry->d_name); - char tscfg_path[192]; - snprintf(tscfg_path, sizeof(tscfg_path), "%s/%s", RULES_SDCARD_DIR, tscfg_name); - struct stat st; - if (stat(tscfg_path, &st) == 0) { - ESP_LOGD(TAG, "Skipping %s (will use .tscfg)", entry->d_name); - continue; /* 跳过 .json,稍后处理 .tscfg */ - } - } - - /* 限制文件名长度避免缓冲区溢出 */ - if (len > 60) { + *count = 0; + while ((entry = readdir(dir))) { + size_t n = strlen(entry->d_name); + bool enc = n > 6 && !strcmp(entry->d_name + n - 6, ".tscfg"); + bool json = n > 5 && !strcmp(entry->d_name + n - 5, ".json"); + if (!enc && !json) continue; + char path[160], id[TS_AUTO_NAME_MAX_LEN]; + size_t idlen = n - (enc ? 6 : 5); + if (idlen >= sizeof(id)) { + e = ESP_ERR_INVALID_SIZE; + break; } - - char filepath[128]; - if (is_tscfg) { - /* .tscfg 文件 - 构建对应的 .json 路径用于 load_with_priority */ - snprintf(filepath, sizeof(filepath), "%s/%.*s.json", - RULES_SDCARD_DIR, (int)(len - 6), entry->d_name); - } else { - snprintf(filepath, sizeof(filepath), "%s/%.60s", RULES_SDCARD_DIR, entry->d_name); + memcpy(id, entry->d_name, idlen); + id[idlen] = 0; + if (!ts_rule_id_valid(id)) { + e = ESP_ERR_INVALID_ARG; + break; } - - /* 使用 .tscfg 优先加载 */ - char *content = NULL; - size_t content_len = 0; - bool used_tscfg = false; - - esp_err_t ret = ts_config_pack_load_with_priority( - filepath, &content, &content_len, &used_tscfg); - - if (ret != ESP_OK) { - continue; + if (json) { + snprintf(path, sizeof(path), RULES_SDCARD_DIR "/%s.tscfg", id); + struct stat st; + if (stat(path, &st) == 0) + continue; } - - /* 解析并添加 */ - memset(rule, 0, sizeof(ts_auto_rule_t)); - if (json_to_rule(content, rule) == ESP_OK && rule->id[0]) { - if (s_rule_ctx.count < s_rule_ctx.capacity) { - memcpy(&s_rule_ctx.rules[s_rule_ctx.count], rule, sizeof(ts_auto_rule_t)); - s_rule_ctx.count++; - loaded++; - ESP_LOGD(TAG, "Loaded rule from file: %s%s", rule->id, - used_tscfg ? " (encrypted)" : ""); - } + if (*count >= s_rule_ctx.capacity) { + e = ESP_ERR_NO_MEM; + break; } - free(content); + snprintf(path, sizeof(path), RULES_SDCARD_DIR "/%s.json", id); + bool encrypted = false; + e = load_one(path, &rules[*count], &encrypted); + if (e != ESP_OK) + break; + readonly[*count] = encrypted || strcmp(id, rules[*count].id) != 0; + ++*count; } - - free(rule); closedir(dir); - - if (loaded > 0) { - ESP_LOGI(TAG, "Loaded %d rules from directory: %s", loaded, RULES_SDCARD_DIR); - return ESP_OK; - } - - return ESP_ERR_NOT_FOUND; + return e == ESP_OK && !*count ? ESP_ERR_NOT_FOUND : e; } - -/** - * @brief 导出所有规则到独立文件目录 - */ -static esp_err_t export_all_rules_to_dir(void) -{ - if (!ts_storage_sd_mounted()) { - ESP_LOGD(TAG, "SD card not mounted, skip export"); - return ESP_ERR_NOT_FOUND; +static esp_err_t load_legacy_file(const char *path, ts_auto_rule_t *rules, int *count) { + char *text = NULL; + size_t len; + bool encrypted; + esp_err_t e = ts_config_pack_load_with_priority(path, &text, &len, &encrypted); + if (e != ESP_OK) + return e; + cJSON *root = cJSON_Parse(text); + free(text); + cJSON *array = cJSON_GetObjectItemCaseSensitive(root, "rules"); + if (!cJSON_IsArray(array) || cJSON_GetArraySize(array) > s_rule_ctx.capacity) { + cJSON_Delete(root); + return ESP_ERR_INVALID_ARG; } - - esp_err_t ret = ensure_rules_dir(); - if (ret != ESP_OK) return ret; - - int exported = 0; - for (int i = 0; i < s_rule_ctx.count; i++) { - if (export_rule_to_file(&s_rule_ctx.rules[i]) == ESP_OK) { - exported++; - } + *count = 0; + const cJSON *j; + cJSON_ArrayForEach(j, array) { + e = ts_rule_decode(j, &rules[*count]); + if (e != ESP_OK) + break; + ++*count; } - - ESP_LOGI(TAG, "Exported %d rules to directory: %s", exported, RULES_SDCARD_DIR); - return ESP_OK; + cJSON_Delete(root); + return e; } - -/** - * @brief 从 JSON 字符串反序列化规则 - */ -static esp_err_t json_to_rule(const char *json_str, ts_auto_rule_t *rule) -{ - if (!json_str || !rule) return ESP_ERR_INVALID_ARG; - - cJSON *root = cJSON_Parse(json_str); - if (!root) return ESP_ERR_INVALID_ARG; - - memset(rule, 0, sizeof(ts_auto_rule_t)); - - // 基本信息 - cJSON *item; - if ((item = cJSON_GetObjectItem(root, "id")) && cJSON_IsString(item)) { - strncpy(rule->id, item->valuestring, sizeof(rule->id) - 1); - } - if ((item = cJSON_GetObjectItem(root, "name")) && cJSON_IsString(item)) { - strncpy(rule->name, item->valuestring, sizeof(rule->name) - 1); - } - if ((item = cJSON_GetObjectItem(root, "icon")) && cJSON_IsString(item)) { - strncpy(rule->icon, item->valuestring, sizeof(rule->icon) - 1); - } - if ((item = cJSON_GetObjectItem(root, "enabled"))) { - rule->enabled = cJSON_IsTrue(item); - } - if ((item = cJSON_GetObjectItem(root, "manual_trigger"))) { - rule->manual_trigger = cJSON_IsTrue(item); +static esp_err_t load_legacy_nvs(ts_auto_rule_t *rules, int *count) { + nvs_handle_t h; + esp_err_t e = nvs_open(NVS_NAMESPACE_RULES, NVS_READONLY, &h); + *count = 0; + if (e == ESP_ERR_NVS_NOT_FOUND) + return ESP_OK; + if (e != ESP_OK) + return e; + uint8_t n = 0; + e = nvs_get_u8(h, NVS_KEY_RULE_COUNT, &n); + if (e == ESP_ERR_NVS_NOT_FOUND) { + nvs_close(h); + return ESP_OK; } - if ((item = cJSON_GetObjectItem(root, "cooldown_ms")) && cJSON_IsNumber(item)) { - rule->cooldown_ms = (uint32_t)item->valueint; + if (e != ESP_OK || n > s_rule_ctx.capacity) { + nvs_close(h); + return ESP_FAIL; } - - // 条件组 - cJSON *conditions = cJSON_GetObjectItem(root, "conditions"); - if (conditions) { - if ((item = cJSON_GetObjectItem(conditions, "logic")) && cJSON_IsString(item)) { - rule->conditions.logic = strcmp(item->valuestring, "or") == 0 ? - TS_AUTO_LOGIC_OR : TS_AUTO_LOGIC_AND; - } - - cJSON *items = cJSON_GetObjectItem(conditions, "items"); - if (items && cJSON_IsArray(items)) { - int count = cJSON_GetArraySize(items); - if (count > 0) { - rule->conditions.conditions = heap_caps_calloc(count, - sizeof(ts_auto_condition_t), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (rule->conditions.conditions) { - rule->conditions.count = count; - - int idx = 0; - cJSON *cond_item; - cJSON_ArrayForEach(cond_item, items) { - ts_auto_condition_t *c = &rule->conditions.conditions[idx]; - - if ((item = cJSON_GetObjectItem(cond_item, "variable")) && cJSON_IsString(item)) { - strncpy(c->variable, item->valuestring, sizeof(c->variable) - 1); - } - if ((item = cJSON_GetObjectItem(cond_item, "operator")) && cJSON_IsString(item)) { - c->op = str_to_operator(item->valuestring); - } - if ((item = cJSON_GetObjectItem(cond_item, "value"))) { - json_to_value(item, &c->value); - } - idx++; - } - } - } + for (unsigned i = 0; i < n; ++i) { + char key[16]; + snprintf(key, sizeof(key), NVS_KEY_RULE_PREFIX "%u", i); + size_t len = 0; + e = nvs_get_str(h, key, NULL, &len); + if (e != ESP_OK || !len || len > 4000) { + e = ESP_FAIL; + break; } - } - - // 动作数组 - cJSON *actions = cJSON_GetObjectItem(root, "actions"); - if (actions && cJSON_IsArray(actions)) { - int count = cJSON_GetArraySize(actions); - if (count > 0) { - rule->actions = heap_caps_calloc(count, sizeof(ts_auto_action_t), - MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (rule->actions) { - rule->action_count = count; - - int idx = 0; - cJSON *act_item; - cJSON_ArrayForEach(act_item, actions) { - ts_auto_action_t *a = &rule->actions[idx]; - - if ((item = cJSON_GetObjectItem(act_item, "type")) && cJSON_IsString(item)) { - a->type = str_to_action_type(item->valuestring); - } - if ((item = cJSON_GetObjectItem(act_item, "delay_ms")) && cJSON_IsNumber(item)) { - a->delay_ms = (uint16_t)item->valueint; - } - - // 根据类型解析特定字段 - switch (a->type) { - case TS_AUTO_ACT_LED: - if ((item = cJSON_GetObjectItem(act_item, "device")) && cJSON_IsString(item)) { - strncpy(a->led.device, item->valuestring, sizeof(a->led.device) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "index")) && cJSON_IsNumber(item)) { - a->led.index = (uint8_t)item->valueint; - } - if ((item = cJSON_GetObjectItem(act_item, "r")) && cJSON_IsNumber(item)) { - a->led.r = (uint8_t)item->valueint; - } - if ((item = cJSON_GetObjectItem(act_item, "g")) && cJSON_IsNumber(item)) { - a->led.g = (uint8_t)item->valueint; - } - if ((item = cJSON_GetObjectItem(act_item, "b")) && cJSON_IsNumber(item)) { - a->led.b = (uint8_t)item->valueint; - } - if ((item = cJSON_GetObjectItem(act_item, "effect")) && cJSON_IsString(item)) { - strncpy(a->led.effect, item->valuestring, sizeof(a->led.effect) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "duration_ms")) && cJSON_IsNumber(item)) { - a->led.duration_ms = (uint16_t)item->valueint; - } - break; - - case TS_AUTO_ACT_GPIO: - if ((item = cJSON_GetObjectItem(act_item, "pin")) && cJSON_IsNumber(item)) { - a->gpio.pin = (uint8_t)item->valueint; - } - if ((item = cJSON_GetObjectItem(act_item, "level"))) { - a->gpio.level = cJSON_IsTrue(item); - } - if ((item = cJSON_GetObjectItem(act_item, "pulse_ms")) && cJSON_IsNumber(item)) { - a->gpio.pulse_ms = (uint32_t)item->valueint; - } - break; - - case TS_AUTO_ACT_DEVICE_CTRL: - if ((item = cJSON_GetObjectItem(act_item, "device")) && cJSON_IsString(item)) { - strncpy(a->device.device, item->valuestring, sizeof(a->device.device) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "action")) && cJSON_IsString(item)) { - strncpy(a->device.action, item->valuestring, sizeof(a->device.action) - 1); - } - break; - - case TS_AUTO_ACT_CLI: - if ((item = cJSON_GetObjectItem(act_item, "command")) && cJSON_IsString(item)) { - strncpy(a->cli.command, item->valuestring, sizeof(a->cli.command) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "var_name")) && cJSON_IsString(item)) { - strncpy(a->cli.var_name, item->valuestring, sizeof(a->cli.var_name) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "timeout_ms")) && cJSON_IsNumber(item)) { - a->cli.timeout_ms = (uint32_t)item->valueint; - } - break; - - case TS_AUTO_ACT_LOG: - if ((item = cJSON_GetObjectItem(act_item, "message")) && cJSON_IsString(item)) { - strncpy(a->log.message, item->valuestring, sizeof(a->log.message) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "level")) && cJSON_IsNumber(item)) { - a->log.level = (uint8_t)item->valueint; - } - break; - - case TS_AUTO_ACT_SET_VAR: - if ((item = cJSON_GetObjectItem(act_item, "variable")) && cJSON_IsString(item)) { - strncpy(a->set_var.variable, item->valuestring, sizeof(a->set_var.variable) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "value"))) { - json_to_value(item, &a->set_var.value); - } - break; - - case TS_AUTO_ACT_WEBHOOK: - if ((item = cJSON_GetObjectItem(act_item, "url")) && cJSON_IsString(item)) { - strncpy(a->webhook.url, item->valuestring, sizeof(a->webhook.url) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "method")) && cJSON_IsString(item)) { - strncpy(a->webhook.method, item->valuestring, sizeof(a->webhook.method) - 1); - } - if ((item = cJSON_GetObjectItem(act_item, "body_template")) && cJSON_IsString(item)) { - strncpy(a->webhook.body_template, item->valuestring, sizeof(a->webhook.body_template) - 1); - } - break; - - case TS_AUTO_ACT_SSH_CMD_REF: - if ((item = cJSON_GetObjectItem(act_item, "cmd_id")) && cJSON_IsString(item)) { - strncpy(a->ssh_ref.cmd_id, item->valuestring, sizeof(a->ssh_ref.cmd_id) - 1); - } - break; - - default: - break; - } - - // 加载 template_id(如果有) - if ((item = cJSON_GetObjectItem(act_item, "template_id")) && cJSON_IsString(item)) { - strncpy(a->template_id, item->valuestring, sizeof(a->template_id) - 1); - } - - idx++; - } - } + char *text = heap_caps_malloc(len, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!text) { + e = ESP_ERR_NO_MEM; + break; } + e = nvs_get_str(h, key, text, &len); + if (e == ESP_OK) + e = decode_text(text, &rules[*count]); + free(text); + if (e != ESP_OK) + break; + ++*count; } - - cJSON_Delete(root); - return ESP_OK; + nvs_close(h); + return e; } - -/** - * @brief 保存所有规则到 NVS 和 SD 卡 - */ -esp_err_t ts_rules_save(void) -{ - if (!s_rule_ctx.initialized) { +static esp_err_t load_rules(const char *file) { + if (!s_rule_ctx.initialized) return ESP_ERR_INVALID_STATE; - } - - nvs_handle_t handle; - esp_err_t ret = nvs_open(NVS_NAMESPACE_RULES, NVS_READWRITE, &handle); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to open NVS for rules: %s", esp_err_to_name(ret)); - return ret; - } - - // 先清除旧数据 - nvs_erase_all(handle); - + xSemaphoreTakeRecursive(s_rule_ctx.transaction, portMAX_DELAY); xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - - // 保存数量 - ret = nvs_set_u8(handle, NVS_KEY_RULE_COUNT, (uint8_t)s_rule_ctx.count); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to save rule count: %s", esp_err_to_name(ret)); + bool busy = s_rule_ctx.retired != 0; + for (int i = 0; i < s_rule_ctx.count; ++i) + busy |= ((rule_payload_t *)s_rule_ctx.rules[i].lease)->refs != 0 || + s_rule_ctx.meta[i].executing; + if (busy) { xSemaphoreGive(s_rule_ctx.mutex); - nvs_close(handle); - return ret; - } - - // 保存每条规则到 NVS - for (int i = 0; i < s_rule_ctx.count; i++) { - char key[16]; - snprintf(key, sizeof(key), "%s%d", NVS_KEY_RULE_PREFIX, i); - - char *json = rule_to_json(&s_rule_ctx.rules[i]); - if (!json) { - ESP_LOGW(TAG, "Failed to serialize rule %d", i); - continue; - } - - // 保存到 NVS - ret = nvs_set_str(handle, key, json); - free(json); - - if (ret != ESP_OK) { - ESP_LOGW(TAG, "Failed to save rule %d: %s", i, esp_err_to_name(ret)); - } - } - - xSemaphoreGive(s_rule_ctx.mutex); - - ret = nvs_commit(handle); - nvs_close(handle); - - // 同时导出到 SD 卡独立文件目录 - if (ts_storage_sd_mounted()) { - export_all_rules_to_dir(); - } - - ESP_LOGI(TAG, "Saved %d rules to NVS and SD card", s_rule_ctx.count); - return ret; -} - -/** - * @brief 从存储加载所有规则 - * - * Priority: SD card directory > SD card single file > NVS > empty - * 当从 NVS 加载后,自动导出到 SD 卡(如果 SD 卡已挂载) - */ -esp_err_t ts_rules_load(void) -{ - if (!s_rule_ctx.initialized) { + xSemaphoreGiveRecursive(s_rule_ctx.transaction); return ESP_ERR_INVALID_STATE; } - - esp_err_t ret; - bool loaded_from_sdcard = false; - - /* 1. 优先从 SD 卡独立文件目录加载 */ - if (ts_storage_sd_mounted()) { - ret = load_rules_from_dir(); - if (ret == ESP_OK && s_rule_ctx.count > 0) { - ESP_LOGI(TAG, "Loaded %d rules from SD card directory", s_rule_ctx.count); - loaded_from_sdcard = true; - goto save_to_nvs; - } - - /* 2. 尝试从单一文件加载(兼容旧格式) */ - ret = ts_rules_load_from_file("/sdcard/config/rules.json"); - if (ret == ESP_OK && s_rule_ctx.count > 0) { - ESP_LOGI(TAG, "Loaded %d rules from SD card file", s_rule_ctx.count); - loaded_from_sdcard = true; - /* 迁移到独立文件格式 */ - export_all_rules_to_dir(); - goto save_to_nvs; + s_rule_ctx.loaded = false; + xSemaphoreGive(s_rule_ctx.mutex); + ts_auto_rule_t *rules = + heap_caps_calloc(s_rule_ctx.capacity, sizeof(*rules), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + bool readonly[CONFIG_TS_AUTOMATION_MAX_RULES] = {0}; + int count = 0, source = TS_RULE_SOURCE_NVS; + esp_err_t e = rules ? ESP_OK : ESP_ERR_NO_MEM; + bool staging = false, require_sd = false; + if (e == ESP_OK) + e = ts_rule_store_recover(ts_storage_sd_mounted(), &staging, &require_sd); + if (e == ESP_OK) { + if (file) { + source = TS_RULE_SOURCE_READONLY; + e = load_legacy_file(file, rules, &count); + } else if (staging) { + e = ts_rule_store_load_bank(rules, s_rule_ctx.capacity, &count); + source = require_sd ? TS_RULE_SOURCE_READONLY : TS_RULE_SOURCE_NVS; + } else { + e = ESP_ERR_NOT_FOUND; + if (ts_storage_sd_mounted()) { + e = load_directory(rules, &count, readonly); + if (e == ESP_OK || require_sd) + source = TS_RULE_SOURCE_SD; + if (e == ESP_ERR_NOT_FOUND && !require_sd) { + e = load_legacy_file("/sdcard/config/rules.json", rules, &count); + if (e == ESP_OK) + source = TS_RULE_SOURCE_READONLY; + } + } + if (e == ESP_ERR_NOT_FOUND && !require_sd) + e = load_legacy_nvs(rules, &count); + else if (e == ESP_ERR_NOT_FOUND && + require_sd) { /* Committed empty SD directory remains authoritative. */ + DIR *d = opendir(RULES_SDCARD_DIR); + if (d) { + closedir(d); + e = ESP_OK; + } + } } } - - /* 3. SD 卡无配置,从 NVS 加载 */ - uint8_t count = 0; - nvs_handle_t handle; - ret = nvs_open(NVS_NAMESPACE_RULES, NVS_READONLY, &handle); - - if (ret != ESP_OK) { - ESP_LOGI(TAG, "No saved rules found"); - return ESP_OK; - } - - ret = nvs_get_u8(handle, NVS_KEY_RULE_COUNT, &count); - if (ret != ESP_OK || count == 0) { - nvs_close(handle); - ESP_LOGI(TAG, "No saved rules found"); - return ESP_OK; - } - - ESP_LOGI(TAG, "Loading %d rules from NVS", count); - - /* 使用堆分配避免栈溢出 */ - ts_auto_rule_t *rule = heap_caps_malloc(sizeof(ts_auto_rule_t), MALLOC_CAP_SPIRAM); - if (!rule) rule = malloc(sizeof(ts_auto_rule_t)); - if (!rule) { - nvs_close(handle); - ESP_LOGE(TAG, "Failed to allocate rule buffer"); - return ESP_ERR_NO_MEM; - } - - // 加载每条规则 - for (int i = 0; i < count && s_rule_ctx.count < s_rule_ctx.capacity; i++) { - char key[16]; - snprintf(key, sizeof(key), "%s%d", NVS_KEY_RULE_PREFIX, i); - - // 获取字符串长度 - size_t len = 0; - ret = nvs_get_str(handle, key, NULL, &len); - if (ret != ESP_OK || len == 0) { - continue; - } - - char *json = heap_caps_malloc(len, MALLOC_CAP_SPIRAM); - if (!json) json = malloc(len); - if (!json) { - ESP_LOGW(TAG, "Failed to allocate memory for rule %d", i); - continue; - } - - ret = nvs_get_str(handle, key, json, &len); - if (ret == ESP_OK) { - if (json_to_rule(json, rule) == ESP_OK) { - // 直接添加到数组(不调用 ts_rule_register 避免重复保存) - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - memcpy(&s_rule_ctx.rules[s_rule_ctx.count], rule, sizeof(ts_auto_rule_t)); - s_rule_ctx.count++; - xSemaphoreGive(s_rule_ctx.mutex); - ESP_LOGD(TAG, "Loaded rule: %s", rule->id); + if (e == ESP_OK) + for (int i = 0; i < count; ++i) { + for (int k = 0; k < i; ++k) + if (!strcmp(rules[k].id, rules[i].id)) { + e = ESP_ERR_INVALID_ARG; + break; + } + if (e != ESP_OK) + break; + ts_rule_resolve_presentation(&rules[i]); + if (!rules[i].revision) + rules[i].revision = 1; + if (!payload_adopt(&rules[i])) { + e = ESP_ERR_NO_MEM; + break; } + rules[i].instance = ++s_rule_ctx.next_instance; } - - free(json); - } - - free(rule); - nvs_close(handle); - ESP_LOGI(TAG, "Loaded %d rules from NVS", s_rule_ctx.count); - - /* 从 NVS 加载后,导出到 SD 卡(如果 SD 卡已挂载且有数据) */ - if (s_rule_ctx.count > 0 && ts_storage_sd_mounted()) { - ESP_LOGI(TAG, "Exporting NVS rules to SD card..."); - export_all_rules_to_dir(); - } - - return ESP_OK; - -save_to_nvs: - /* 从 SD 卡加载后,保存到 NVS */ - if (loaded_from_sdcard && s_rule_ctx.count > 0) { - ts_rules_save(); - } - return ESP_OK; -} - -/** - * @brief Load rules from SD card JSON file - * - * 支持 .tscfg 加密配置优先加载 - */ -esp_err_t ts_rules_load_from_file(const char *filepath) -{ - if (!s_rule_ctx.initialized || !filepath) return ESP_ERR_INVALID_ARG; - - /* 使用 .tscfg 优先加载 */ - char *content = NULL; - size_t content_len = 0; - bool used_tscfg = false; - - esp_err_t ret = ts_config_pack_load_with_priority( - filepath, &content, &content_len, &used_tscfg); - - if (ret != ESP_OK) { - ESP_LOGD(TAG, "Cannot open file: %s", filepath); - return ret; - } - - if (used_tscfg) { - ESP_LOGI(TAG, "Loaded encrypted rules from .tscfg"); - } - - cJSON *root = cJSON_Parse(content); - free(content); - - if (!root) { - ESP_LOGW(TAG, "Failed to parse JSON: %s", filepath); - return ESP_ERR_INVALID_ARG; - } - - cJSON *rules = cJSON_GetObjectItem(root, "rules"); - if (!rules || !cJSON_IsArray(rules)) { - cJSON_Delete(root); - ESP_LOGW(TAG, "No 'rules' array in file"); - return ESP_ERR_INVALID_ARG; - } - - int loaded = 0; - - /* 使用堆分配避免栈溢出 */ - ts_auto_rule_t *rule = heap_caps_malloc(sizeof(ts_auto_rule_t), MALLOC_CAP_SPIRAM); - if (!rule) rule = malloc(sizeof(ts_auto_rule_t)); - if (!rule) { - cJSON_Delete(root); - ESP_LOGE(TAG, "Failed to allocate rule buffer"); - return ESP_ERR_NO_MEM; - } - - cJSON *item; - cJSON_ArrayForEach(item, rules) { - if (s_rule_ctx.count >= s_rule_ctx.capacity) break; - - char *json_str = cJSON_PrintUnformatted(item); - if (!json_str) continue; - - if (json_to_rule(json_str, rule) == ESP_OK) { - xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); - memcpy(&s_rule_ctx.rules[s_rule_ctx.count], rule, sizeof(ts_auto_rule_t)); - s_rule_ctx.count++; - xSemaphoreGive(s_rule_ctx.mutex); - loaded++; + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + if (e == ESP_OK) { + ts_auto_rule_t *old = s_rule_ctx.rules; + int oldcount = s_rule_ctx.count; + s_rule_ctx.rules = rules; + s_rule_ctx.count = count; + s_rule_ctx.source = source; + memset(s_rule_ctx.meta, 0, sizeof(s_rule_ctx.meta)); + for (int i = 0; i < count; ++i) + s_rule_ctx.meta[i].readonly = readonly[i]; + s_rule_ctx.loaded = true; + s_rule_ctx.recovery_error = false; + xSemaphoreGive(s_rule_ctx.mutex); + for (int i = 0; i < oldcount; ++i) + payload_free(old[i].lease); + free(old); + } else { + s_rule_ctx.recovery_error = true; + xSemaphoreGive(s_rule_ctx.mutex); + for (int i = 0; i < count; ++i) { + if (rules[i].lease) + payload_free(rules[i].lease); + else + ts_rule_dispose(&rules[i]); } - cJSON_free(json_str); + free(rules); } + xSemaphoreGiveRecursive(s_rule_ctx.transaction); + return e; +} +esp_err_t ts_rules_load(void) { return load_rules(NULL); } +esp_err_t ts_rules_load_from_file(const char *path) { + return path ? load_rules(path) : ESP_ERR_INVALID_ARG; +} +/* Mutations persist through ts_rule_commit; reads/loads never rewrite all rules. */ +esp_err_t ts_rules_save(void) { + return s_rule_ctx.loaded && !s_rule_ctx.recovery_error ? ESP_OK : ESP_ERR_INVALID_STATE; +} - free(rule); - - if (loaded > 0) { - ESP_LOGI(TAG, "Loaded %d rules from SD card: %s", loaded, filepath); - ts_rules_save(); /* Save to NVS for next boot */ +bool ts_rule_edit_begin(void) { + return s_rule_ctx.initialized && xSemaphoreTakeRecursive(s_rule_ctx.transaction, 0) == pdTRUE; +} +void ts_rule_edit_end(void) { xSemaphoreGiveRecursive(s_rule_ctx.transaction); } +void ts_rule_config_status(bool *loaded, bool *recovery) { + if (!s_rule_ctx.initialized) { + *loaded = false; + *recovery = false; + return; } - - return ESP_OK; + xSemaphoreTake(s_rule_ctx.mutex, portMAX_DELAY); + *loaded = s_rule_ctx.loaded; + *recovery = s_rule_ctx.recovery_error; + xSemaphoreGive(s_rule_ctx.mutex); } diff --git a/components/ts_automation/src/ts_rule_store.c b/components/ts_automation/src/ts_rule_store.c new file mode 100644 index 0000000..d31691a --- /dev/null +++ b/components/ts_automation/src/ts_rule_store.c @@ -0,0 +1,400 @@ +#include "ts_rule_store.h" +#include "esp_heap_caps.h" +#include "nvs.h" +#include +#include +#include +#include +#include +#include +#ifndef DIR_RULES +#define DIR_RULES "/sdcard/config/rules" +#endif +#define MAGIC 0x52554c32u +#define NS "rule_stage" +typedef struct { + uint32_t magic, sequence, phase, source, bank, mirror, old_hash, new_hash; + uint8_t had_old, deleting; + char id[TS_AUTO_NAME_MAX_LEN]; +} guard_t; +typedef struct { + uint32_t count, hash; +} bank_meta_t; +static guard_t guard; +static bool recovery_error; +static uint32_t hash_bytes(uint32_t h, const void *data, size_t n) { + const unsigned char *p = data; + while (n--) + h = (h ^ *p++) * 16777619u; + return h; +} +static uint32_t hash_text(const char *s) { return hash_bytes(2166136261u, s, strlen(s)); } +static esp_err_t guard_read(guard_t *g) { + nvs_handle_t h; + esp_err_t e = nvs_open(NS, NVS_READONLY, &h); + if (e != ESP_OK) + return e; + size_t n = sizeof(*g); + e = nvs_get_blob(h, "guard", g, &n); + nvs_close(h); + return e == ESP_OK && n != sizeof(*g) ? ESP_ERR_INVALID_SIZE : e; +} +/* Readback is authoritative even if a commit call reports an uncertain outcome. */ +static esp_err_t guard_write(const guard_t *g) { + nvs_handle_t h; + esp_err_t e = nvs_open(NS, NVS_READWRITE, &h); + if (e != ESP_OK) + return e; + e = nvs_set_blob(h, "guard", g, sizeof(*g)); + if (e == ESP_OK) + e = nvs_commit(h); + nvs_close(h); + guard_t actual = {0}; + esp_err_t read = guard_read(&actual); + if (read == ESP_OK && !memcmp(&actual, g, sizeof(*g))) { + guard = *g; + return ESP_OK; + } + return e == ESP_OK ? ESP_FAIL : e; +} +static void paths(const char *id, char *target, char *temp, char *backup) { + snprintf(target, 160, DIR_RULES "/%s.json", id); + snprintf(temp, 160, DIR_RULES "/.%s.pending", id); + snprintf(backup, 160, DIR_RULES "/.%s.previous", id); +} +static esp_err_t file_hash(const char *path, uint32_t *hash) { + FILE *f = fopen(path, "rb"); + if (!f) + return errno == ENOENT ? ESP_ERR_NOT_FOUND : ESP_FAIL; + char buf[256]; + size_t n; + uint32_t h = 2166136261u; + while ((n = fread(buf, 1, sizeof(buf), f))) + h = hash_bytes(h, buf, n); + bool ok = !ferror(f); + if (fclose(f)) + ok = false; + if (!ok) + return ESP_FAIL; + *hash = h; + return ESP_OK; +} +static bool matches(const char *path, uint32_t expected) { + uint32_t hash; + return file_hash(path, &hash) == ESP_OK && hash == expected; +} +static esp_err_t remove_if_present(const char *path) { + return unlink(path) == 0 || errno == ENOENT ? ESP_OK : ESP_FAIL; +} +static esp_err_t write_file(const char *path, const char *text) { + FILE *f = fopen(path, "wb"); + if (!f) + return ESP_FAIL; + size_t len = strlen(text); + bool ok = fwrite(text, 1, len, f) == len; + if (fflush(f)) + ok = false; + if (fsync(fileno(f))) + ok = false; + if (fclose(f)) + ok = false; + return ok ? ESP_OK : ESP_FAIL; +} +static esp_err_t rollback_sd(const guard_t *g) { + char target[160], temp[160], bak[160]; + paths(g->id, target, temp, bak); + if (g->had_old) { + if (!matches(target, g->old_hash)) { + if (!matches(bak, g->old_hash)) + return ESP_FAIL; + if (remove_if_present(target) != ESP_OK || rename(bak, target)) + return ESP_FAIL; + } + if (!matches(target, g->old_hash)) + return ESP_FAIL; + } else if (remove_if_present(target) != ESP_OK) + return ESP_FAIL; + if (remove_if_present(temp) != ESP_OK) + return ESP_FAIL; + guard_t clean = *g; + clean.phase = 0; + clean.mirror = 0; + return guard_write(&clean); +} +static esp_err_t finish_sd(const guard_t *g) { + char target[160], temp[160], bak[160]; + paths(g->id, target, temp, bak); + if (g->deleting) { + uint32_t unused; + if (file_hash(target, &unused) != ESP_ERR_NOT_FOUND) + return ESP_FAIL; + } else if (!matches(target, g->new_hash)) + return ESP_FAIL; + /* Keep a committed journal until the mirror is known current. */ + if (remove_if_present(temp) != ESP_OK || remove_if_present(bak) != ESP_OK) + return ESP_FAIL; + return ESP_OK; +} +esp_err_t ts_rule_store_recover(bool sd, bool *staging, bool *require_sd) { + *staging = false; + *require_sd = false; + recovery_error = false; + memset(&guard, 0, sizeof(guard)); + esp_err_t e = guard_read(&guard); + if (e == ESP_ERR_NVS_NOT_FOUND) { + memset(&guard, 0, sizeof(guard)); + return ESP_OK; + } + if (e != ESP_OK) + goto bad; + if (guard.magic != MAGIC || guard.bank > 1 || guard.phase > 2 || guard.source > 1) + goto bad; + if (guard.source == TS_RULE_SOURCE_SD) { + *require_sd = true; + if (!sd) { + if (guard.phase == 0 && guard.mirror) { + *staging = true; + return ESP_OK; + } + goto bad; + } + if (guard.phase == 1) { + if (!ts_rule_id_valid(guard.id) || rollback_sd(&guard) != ESP_OK) + goto bad; + } else if (guard.phase == 2) { + if (!ts_rule_id_valid(guard.id) || finish_sd(&guard) != ESP_OK) + goto bad; + } + } else + *staging = true; + return ESP_OK; +bad: + recovery_error = true; + return ESP_ERR_INVALID_STATE; +} +static char *bank_json(nvs_handle_t h, unsigned bank, unsigned i) { + char key[16]; + snprintf(key, sizeof(key), "%c%u", bank ? 'b' : 'a', i); + size_t n = 0; + if (nvs_get_blob(h, key, NULL, &n) != ESP_OK || n < 2 || n > 262144) + return NULL; + char *s = heap_caps_malloc(n, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!s) + return NULL; + if (nvs_get_blob(h, key, s, &n) != ESP_OK || s[n - 1] != 0 || strlen(s) != n - 1) { + free(s); + return NULL; + } + return s; +} +esp_err_t ts_rule_store_load_bank(ts_auto_rule_t *rules, int capacity, int *count) { + nvs_handle_t h; + esp_err_t e = nvs_open(NS, NVS_READONLY, &h); + if (e != ESP_OK) + return e; + bank_meta_t meta; + size_t n = sizeof(meta); + e = nvs_get_blob(h, guard.bank ? "meta_b" : "meta_a", &meta, &n); + if (e != ESP_OK || n != sizeof(meta) || meta.count > (unsigned)capacity) { + nvs_close(h); + return ESP_FAIL; + } + uint32_t hash = 2166136261u; + *count = 0; + for (unsigned i = 0; i < meta.count; ++i) { + char *s = bank_json(h, guard.bank, i); + if (!s) { + e = ESP_FAIL; + break; + } + hash = hash_bytes(hash, s, strlen(s) + 1); + cJSON *j = cJSON_Parse(s); + free(s); + e = ts_rule_decode(j, &rules[i]); + cJSON_Delete(j); + if (e != ESP_OK) + break; + for (unsigned k = 0; k < i; ++k) + if (!strcmp(rules[i].id, rules[k].id)) + e = ESP_ERR_INVALID_ARG; + ++*count; + if (e != ESP_OK) + break; + } + nvs_close(h); + if (e == ESP_OK && hash != meta.hash) + e = ESP_FAIL; + if (e != ESP_OK) { + for (int i = 0; i < *count; ++i) + ts_rule_dispose(&rules[i]); + *count = 0; + } + return e; +} +static esp_err_t stage_bank(const ts_auto_rule_t *rules, int count, const ts_auto_rule_t *candidate, + const char *id, unsigned bank) { + nvs_handle_t h; + esp_err_t e = nvs_open(NS, NVS_READWRITE, &h); + if (e != ESP_OK) + return e; + bank_meta_t meta = {.hash = 2166136261u}; + bool replaced = false; + for (int i = 0; i <= count; ++i) { + const ts_auto_rule_t *r = i < count ? &rules[i] : NULL; + if (r && !strcmp(r->id, id)) { + r = candidate; + replaced = true; + } else if (i == count && !replaced) + r = candidate; + if (!r) + continue; + cJSON *j = ts_rule_encode(r); + char *s = j ? cJSON_PrintUnformatted(j) : NULL; + cJSON_Delete(j); + if (!s) { + e = ESP_ERR_NO_MEM; + break; + } + char key[16]; + snprintf(key, sizeof(key), "%c%u", bank ? 'b' : 'a', (unsigned)meta.count); + e = nvs_set_blob(h, key, s, strlen(s) + 1); + if (e == ESP_OK) { + meta.hash = hash_bytes(meta.hash, s, strlen(s) + 1); + ++meta.count; + } + free(s); + if (e != ESP_OK) + break; + } + if (e == ESP_OK) + e = nvs_set_blob(h, bank ? "meta_b" : "meta_a", &meta, sizeof(meta)); + if (e == ESP_OK) + e = nvs_commit(h); + if (e == ESP_OK) { + bank_meta_t readback; + size_t size = sizeof(readback); + if (nvs_get_blob(h, bank ? "meta_b" : "meta_a", &readback, &size) != ESP_OK || + size != sizeof(readback) || memcmp(&readback, &meta, size)) + e = ESP_FAIL; + } + if (e == ESP_OK) { + uint32_t hash = 2166136261u; + for (unsigned i = 0; i < meta.count; ++i) { + char *s = bank_json(h, bank, i); + if (!s) { + e = ESP_FAIL; + break; + } + hash = hash_bytes(hash, s, strlen(s) + 1); + free(s); + } + if (hash != meta.hash) + e = ESP_FAIL; + } + nvs_close(h); + return e; +} +esp_err_t ts_rule_store_commit(const ts_auto_rule_t *rules, int count, + const ts_auto_rule_t *candidate, const char *id, int source, + ts_rule_commit_t *r) { + *r = (ts_rule_commit_t){ + .applied = 0, .durable = 0, .mirror_synced = 0, .error_code = "storage_failed"}; + if (recovery_error) { + r->error_code = "recovery_required"; + return ESP_ERR_INVALID_STATE; + } + if (source == TS_RULE_SOURCE_READONLY) { + r->error_code = "source_read_only"; + return ESP_ERR_NOT_SUPPORTED; + } + guard_t next = guard; + next.magic = MAGIC; + next.sequence++; + next.source = source; + unsigned bank = guard.magic ? 1 - guard.bank : 0; + if (source == TS_RULE_SOURCE_NVS) { + esp_err_t e = stage_bank(rules, count, candidate, id, bank); + if (e != ESP_OK) + return e; + next.bank = bank; + next.phase = 0; + next.mirror = 1; + if (guard_write(&next) != ESP_OK) { + guard_t actual; + if (guard_read(&actual) != ESP_OK || memcmp(&actual, &guard, sizeof(guard))) { + recovery_error = true; + r->applied = r->durable = -1; + r->error_code = "commit_unknown"; + } + return ESP_FAIL; + } + r->applied = r->durable = r->mirror_synced = 1; + r->error_code = "ok"; + return ESP_OK; + } + char target[160], temp[160], bak[160]; + paths(id, target, temp, bak); + uint32_t oldhash = 0; + esp_err_t prior = file_hash(target, &oldhash); + if (prior != ESP_OK && prior != ESP_ERR_NOT_FOUND) + return prior; + cJSON *j = candidate ? ts_rule_encode(candidate) : NULL; + char *text = j ? cJSON_PrintUnformatted(j) : NULL; + cJSON_Delete(j); + if (candidate && !text) + return ESP_ERR_NO_MEM; + next.phase = 1; + next.mirror = 0; + next.had_old = prior == ESP_OK; + next.old_hash = oldhash; + next.new_hash = text ? hash_text(text) : 0; + next.deleting = !candidate; + strcpy(next.id, id); + /* Persist SD authority before touching it: stale NVS cannot silently reappear. */ + if (guard_write(&next) != ESP_OK) { + free(text); + return ESP_FAIL; + } + bool ok = remove_if_present(temp) == ESP_OK && remove_if_present(bak) == ESP_OK; + if (ok && text) + ok = write_file(temp, text) == ESP_OK && matches(temp, next.new_hash); + free(text); + if (ok && next.had_old) + ok = rename(target, bak) == 0; + if (ok && candidate) + ok = rename(temp, target) == 0; + if (ok) { + next.phase = 2; + ok = guard_write(&next) == ESP_OK; + } + if (!ok) { + if (rollback_sd(&next) != ESP_OK) { + recovery_error = true; + r->applied = r->durable = -1; + r->error_code = "commit_unknown"; + } + return ESP_FAIL; + } + r->applied = r->durable = 1; + r->error_code = "mirror_failed"; + if (stage_bank(rules, count, candidate, id, bank) == ESP_OK) { + next.bank = bank; + next.mirror = 1; + if (guard_write(&next) == ESP_OK) { + r->mirror_synced = 1; + r->error_code = "ok"; + } + } + if (finish_sd(&guard) != ESP_OK) { + r->mirror_synced = 0; + r->error_code = "recovery_cleanup_pending"; + } else if (r->mirror_synced) { + next = guard; + next.phase = 0; + if (guard_write(&next) != ESP_OK) { + r->mirror_synced = 0; + r->error_code = "recovery_cleanup_pending"; + } + } + return ESP_OK; +} diff --git a/components/ts_automation/src/ts_rule_store.h b/components/ts_automation/src/ts_rule_store.h new file mode 100644 index 0000000..9425bbd --- /dev/null +++ b/components/ts_automation/src/ts_rule_store.h @@ -0,0 +1,11 @@ +#pragma once +#include "ts_rule_codec.h" +#define TS_RULE_SOURCE_NVS 0 +#define TS_RULE_SOURCE_SD 1 +#define TS_RULE_SOURCE_READONLY 2 +typedef struct {int applied,durable,mirror_synced;uint32_t revision;const char *error_code;} ts_rule_commit_t; +/* All calls serialized by engine configuration mutex, never evaluation mutex. */ +esp_err_t ts_rule_store_recover(bool sd_mounted, bool *use_staging, bool *require_sd); +esp_err_t ts_rule_store_load_bank(ts_auto_rule_t *rules,int capacity,int *count); +esp_err_t ts_rule_store_commit(const ts_auto_rule_t *rules,int count,const ts_auto_rule_t *candidate, + const char *id,int source,ts_rule_commit_t *result); diff --git a/components/ts_cert/CMakeLists.txt b/components/ts_cert/CMakeLists.txt index d884a97..3f8ea7c 100644 --- a/components/ts_cert/CMakeLists.txt +++ b/components/ts_cert/CMakeLists.txt @@ -3,6 +3,7 @@ idf_component_register( SRCS "src/ts_cert.c" + "src/ts_cert_time.c" INCLUDE_DIRS "include" REQUIRES diff --git a/components/ts_cert/include/ts_cert.h b/components/ts_cert/include/ts_cert.h index 6ad5a84..7d45a26 100644 --- a/components/ts_cert/include/ts_cert.h +++ b/components/ts_cert/include/ts_cert.h @@ -69,21 +69,42 @@ typedef enum { TS_CERT_STATUS_NOT_INITIALIZED = 0, /**< No key pair generated */ TS_CERT_STATUS_KEY_GENERATED, /**< Key pair exists, no CSR yet */ TS_CERT_STATUS_CSR_PENDING, /**< CSR generated, awaiting certificate */ - TS_CERT_STATUS_ACTIVATED, /**< Certificate installed, ready for mTLS */ + TS_CERT_STATUS_ACTIVATED, /**< Certificate time valid; not TLS running */ TS_CERT_STATUS_EXPIRED, /**< Certificate expired */ - TS_CERT_STATUS_ERROR /**< Error state */ + TS_CERT_STATUS_ERROR, /**< Error state */ + TS_CERT_STATUS_TIME_UNVERIFIED, + TS_CERT_STATUS_NOT_YET_VALID } ts_cert_status_t; /** * @brief Certificate information */ +typedef enum { + TS_CERT_VALIDITY_NONE, TS_CERT_VALIDITY_INVALID, TS_CERT_VALIDITY_TIME_UNVERIFIED, + TS_CERT_VALIDITY_NOT_YET_VALID, TS_CERT_VALIDITY_VALID, TS_CERT_VALIDITY_EXPIRED +} ts_cert_validity_t; + +typedef enum { + TS_CERT_OP_OK, TS_CERT_OP_NOT_INITIALIZED, TS_CERT_OP_INVALID_INPUT, + TS_CERT_OP_INPUT_TOO_LARGE, TS_CERT_OP_PEM_PARSE_FAILED, TS_CERT_OP_PRIVATE_KEY_MISSING, + TS_CERT_OP_PRIVATE_KEY_INVALID, TS_CERT_OP_KEY_MISMATCH, TS_CERT_OP_NO_MEMORY, + TS_CERT_OP_STORAGE_FAILED, TS_CERT_OP_CRYPTO_FAILED +} ts_cert_op_error_t; + +/* NVS strings include their terminating NUL; buffer capacities remain unchanged. */ +#define TS_CERT_INSTALL_MAX_LEN 4000 + typedef struct { + ts_cert_validity_t validity; char subject_cn[TS_CERT_DEVICE_ID_MAX_LEN]; /**< Subject Common Name */ char subject_ou[32]; /**< Subject Organizational Unit */ char issuer_cn[TS_CERT_DEVICE_ID_MAX_LEN]; /**< Issuer Common Name */ int64_t not_before; /**< Valid from (Unix timestamp) */ int64_t not_after; /**< Valid until (Unix timestamp) */ - char serial[64]; /**< Serial number (hex) */ + char serial[65]; /**< Serial number (hex) */ + bool serial_truncated; + int64_t seconds_until_expiry; + bool time_ready; bool is_valid; /**< Current validity */ int days_until_expiry; /**< Days until expiration */ } ts_cert_info_t; @@ -109,9 +130,25 @@ typedef struct { bool has_private_key; /**< Private key exists in NVS */ bool has_certificate; /**< Certificate exists in NVS */ bool has_ca_chain; /**< CA chain exists in NVS */ + uint32_t generation; + bool key_valid, key_matches, ca_valid, storage_error, time_ready; ts_cert_info_t cert_info; /**< Certificate details (if exists) */ } ts_cert_pki_status_t; +/* Snapshots own exact-sized buffers. Material lock is never held across TLS calls. */ +typedef struct { + char *key, *certificate, *ca; + uint32_t generation; + char certificate_sha256[65]; +} ts_cert_snapshot_t; +esp_err_t ts_cert_get_snapshot(bool require_ca, ts_cert_snapshot_t *snapshot); +void ts_cert_free_snapshot(ts_cert_snapshot_t *snapshot); +bool ts_cert_prerequisites(const ts_cert_pki_status_t *status, bool require_ca); +const char *ts_cert_validity_to_str(ts_cert_validity_t validity); +esp_err_t ts_cert_install_certificate_ex(const char *pem, size_t len, ts_cert_op_error_t *detail); +esp_err_t ts_cert_install_ca_chain_ex(const char *pem, size_t len, ts_cert_op_error_t *detail); +const char *ts_cert_op_error_to_str(ts_cert_op_error_t detail); + /*===========================================================================*/ /* Initialization */ /*===========================================================================*/ @@ -201,7 +238,7 @@ esp_err_t ts_cert_generate_csr_default(char *csr_pem, size_t *csr_len); * Stores the certificate in NVS after validating it matches the private key. * * @param cert_pem PEM-encoded certificate - * @param cert_len Certificate length + * @param cert_len Actual readable PEM length including one final NUL (not capacity) * @return ESP_OK on success * @return ESP_ERR_INVALID_ARG if certificate is invalid * @return ESP_ERR_INVALID_STATE if certificate doesn't match private key @@ -214,7 +251,7 @@ esp_err_t ts_cert_install_certificate(const char *cert_pem, size_t cert_len); * Stores the CA chain (Intermediate + Root) for verifying peer certificates. * * @param ca_chain_pem PEM-encoded CA chain - * @param ca_chain_len CA chain length + * @param ca_chain_len Actual readable PEM length including one final NUL * @return ESP_OK on success */ esp_err_t ts_cert_install_ca_chain(const char *ca_chain_pem, size_t ca_chain_len); @@ -327,7 +364,7 @@ const char *ts_cert_status_to_str(ts_cert_status_t status); * @brief Parse certificate PEM and extract info * * @param cert_pem PEM-encoded certificate - * @param cert_len Certificate length + * @param cert_len Actual readable PEM length including one final NUL (not capacity) * @param info Output certificate information * @return ESP_OK on success */ diff --git a/components/ts_cert/include/ts_cert_time.h b/components/ts_cert/include/ts_cert_time.h new file mode 100644 index 0000000..f32394c --- /dev/null +++ b/components/ts_cert/include/ts_cert_time.h @@ -0,0 +1,17 @@ +#ifndef TS_CERT_TIME_H +#define TS_CERT_TIME_H +#include +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +bool ts_cert_time_utc(int year, int month, int day, int hour, int minute, int second, int64_t *out); +int ts_cert_time_days(int64_t seconds); +bool ts_cert_time_ready(int64_t now, int minimum_year); +/* Returns true when the display was truncated. Always terminates if capacity > 0. */ +bool ts_cert_hex(const unsigned char *bytes, size_t length, char *out, size_t capacity); +#ifdef __cplusplus +} +#endif +#endif diff --git a/components/ts_cert/src/ts_cert.c b/components/ts_cert/src/ts_cert.c index 73b5a33..21afc72 100644 --- a/components/ts_cert/src/ts_cert.c +++ b/components/ts_cert/src/ts_cert.c @@ -13,6 +13,12 @@ */ #include "ts_cert.h" +#include "ts_cert_time.h" +#include "ts_event.h" +#include "freertos/semphr.h" +#include "mbedtls/platform_util.h" +#include "mbedtls/sha256.h" +#include #include "ts_crypto.h" #include "ts_core.h" #include "ts_time_sync.h" @@ -38,6 +44,28 @@ #include #include +static esp_err_t ts_cert_init_locked(void); +static void ts_cert_deinit_locked(void); +static esp_err_t ts_cert_generate_keypair_locked(void); +static bool ts_cert_has_keypair_locked(void); +static esp_err_t ts_cert_delete_keypair_locked(void); +static esp_err_t ts_cert_generate_csr_locked(const ts_cert_csr_opts_t *opts, + char *csr_pem, size_t *csr_len); +static esp_err_t ts_cert_generate_csr_default_locked(char *csr_pem, size_t *csr_len); +static esp_err_t ts_cert_install_certificate_ex_locked(const char *pem, size_t len, ts_cert_op_error_t *detail); +static esp_err_t ts_cert_install_ca_chain_ex_locked(const char *pem, size_t len, ts_cert_op_error_t *detail); +static esp_err_t ts_cert_install_certificate_locked(const char *pem, size_t len); +static esp_err_t ts_cert_install_ca_chain_locked(const char *pem, size_t len); +static esp_err_t ts_cert_get_certificate_locked(char *cert_pem, size_t *cert_len); +static esp_err_t ts_cert_get_private_key_locked(char *key_pem, size_t *key_len); +static esp_err_t ts_cert_get_ca_chain_locked(char *ca_chain_pem, size_t *ca_chain_len); +static esp_err_t ts_cert_refresh_status_locked(void); +static esp_err_t ts_cert_get_status_locked(ts_cert_pki_status_t *status); +static esp_err_t ts_cert_get_info_locked(ts_cert_info_t *info); +static bool ts_cert_is_valid_locked(void); +static int ts_cert_days_until_expiry_locked(void); +static esp_err_t ts_cert_factory_reset_locked(void); +static esp_err_t ts_cert_get_snapshot_locked(bool require_ca, ts_cert_snapshot_t *snapshot); static const char *TAG = "ts_cert"; /*===========================================================================*/ @@ -58,6 +86,25 @@ static const char *TAG = "ts_cert"; /* Static Variables */ /*===========================================================================*/ +/* Initialized once during boot, retained across deinit to protect late readers. */ +static StaticSemaphore_t s_mutex_storage; +static SemaphoreHandle_t s_mutex; +static portMUX_TYPE s_mutex_init_lock = portMUX_INITIALIZER_UNLOCKED; +static void material_lock(void) +{ + portENTER_CRITICAL(&s_mutex_init_lock); + if (!s_mutex) s_mutex = xSemaphoreCreateMutexStatic(&s_mutex_storage); + portEXIT_CRITICAL(&s_mutex_init_lock); + xSemaphoreTake(s_mutex, portMAX_DELAY); +} +static uint32_t s_generation = 1, s_metadata_generation; +static ts_cert_info_t s_metadata; +static bool s_key_valid, s_key_matches, s_ca_valid, s_storage_error; +static char s_fingerprint[65]; +static void refresh_metadata(void); +static void evaluate_time(ts_cert_info_t *info, int64_t now); +static esp_err_t info_from_crt(const mbedtls_x509_crt *crt, ts_cert_info_t *info); + static bool s_initialized = false; static nvs_handle_t s_nvs_handle = 0; @@ -76,6 +123,17 @@ static bool s_rng_initialized = false; /* Internal Functions */ /*===========================================================================*/ +/* mbedTLS can combine a high-level error with a low-level allocation error. */ +static bool allocation_error(int error) +{ + if (error >= 0) return false; + int high = (-error) & 0xFF80; + int low = (-error) & 0x007F; + return high == -MBEDTLS_ERR_X509_ALLOC_FAILED || high == -MBEDTLS_ERR_PK_ALLOC_FAILED || + high == -MBEDTLS_ERR_ECP_ALLOC_FAILED || low == -MBEDTLS_ERR_MPI_ALLOC_FAILED || + low == -MBEDTLS_ERR_ASN1_ALLOC_FAILED; +} + static esp_err_t init_rng(void) { if (s_rng_initialized) return ESP_OK; @@ -90,7 +148,9 @@ static esp_err_t init_rng(void) char err_buf[128]; mbedtls_strerror(ret, err_buf, sizeof(err_buf)); ESP_LOGE(TAG, "RNG seed failed: %s", err_buf); - return ESP_FAIL; + mbedtls_ctr_drbg_free(&s_ctr_drbg); + mbedtls_entropy_free(&s_entropy); + return allocation_error(ret) ? ESP_ERR_NO_MEM : ESP_FAIL; } s_rng_initialized = true; @@ -113,43 +173,50 @@ static esp_err_t nvs_read_string(const char *key, char **out_str) } if (!*out_str) return ESP_ERR_NO_MEM; - return nvs_get_str(s_nvs_handle, key, *out_str, &required_size); + err = nvs_get_str(s_nvs_handle, key, *out_str, &required_size); + if (err != ESP_OK) { free(*out_str); *out_str = NULL; } + return err; } static esp_err_t nvs_write_string(const char *key, const char *str) { + const char *stage = "set"; esp_err_t err = nvs_set_str(s_nvs_handle, key, str); - if (err != ESP_OK) return err; - return nvs_commit(s_nvs_handle); + if (err == ESP_OK) { stage = "commit"; err = nvs_commit(s_nvs_handle); } + if (err != ESP_OK) { + s_storage_error = true; /* Persistence uncertain: block future TLS loading. */ + ESP_LOGE(TAG, "NVS %s (%s): %s", stage, key, esp_err_to_name(err)); + } + return err; } -static void update_status(void) +static void set_status(const ts_cert_info_t *current) { - if (s_private_key_pem && s_certificate_pem) { - /* - * Check if certificate is expired - * 但如果系统时间未同步,跳过过期检查(使用统一的 ts_time_sync API) - */ - if (ts_time_sync_needs_sync()) { - /* 时间未同步,假设证书有效(这是正常的启动顺序,NTP 同步在网络就绪后完成) */ - ESP_LOGI(TAG, "Time not synced yet, deferring cert expiry check"); - s_status = TS_CERT_STATUS_ACTIVATED; - } else { - ts_cert_info_t info; - if (ts_cert_get_info(&info) == ESP_OK && info.is_valid) { - s_status = TS_CERT_STATUS_ACTIVATED; - } else { - s_status = TS_CERT_STATUS_EXPIRED; - } + ts_cert_info_t info = *current; + if (s_storage_error || (s_private_key_pem && !s_key_valid) || + (s_certificate_pem && (info.validity == TS_CERT_VALIDITY_INVALID || + (s_private_key_pem && !s_key_matches)))) { + s_status = TS_CERT_STATUS_ERROR; + } else if (s_private_key_pem && s_certificate_pem) { + switch (info.validity) { + case TS_CERT_VALIDITY_TIME_UNVERIFIED: s_status = TS_CERT_STATUS_TIME_UNVERIFIED; break; + case TS_CERT_VALIDITY_NOT_YET_VALID: s_status = TS_CERT_STATUS_NOT_YET_VALID; break; + case TS_CERT_VALIDITY_VALID: s_status = TS_CERT_STATUS_ACTIVATED; break; + case TS_CERT_VALIDITY_EXPIRED: s_status = TS_CERT_STATUS_EXPIRED; break; + default: s_status = TS_CERT_STATUS_ERROR; break; } } else if (s_private_key_pem) { - s_status = TS_CERT_STATUS_KEY_GENERATED; - } else { - s_status = TS_CERT_STATUS_NOT_INITIALIZED; - } - - nvs_set_u8(s_nvs_handle, NVS_KEY_STATUS, (uint8_t)s_status); - nvs_commit(s_nvs_handle); + if (s_status != TS_CERT_STATUS_CSR_PENDING) s_status = TS_CERT_STATUS_KEY_GENERATED; + } else s_status = TS_CERT_STATUS_NOT_INITIALIZED; + /* Derived status never writes NVS. */ +} + +static void update_status(void) +{ + refresh_metadata(); + ts_cert_info_t info = s_metadata; + evaluate_time(&info, (int64_t)time(NULL)); + set_status(&info); } /*===========================================================================*/ @@ -166,7 +233,7 @@ static void update_status(void) * iPAddress [7] OCTET STRING * } */ -static int build_san_extension(const ts_cert_csr_opts_t *opts, +static int build_san_extension(const ts_cert_csr_opts_t *opts, unsigned char *buf, size_t buf_size, size_t *olen) { @@ -224,7 +291,7 @@ static int build_san_extension(const ts_cert_csr_opts_t *opts, /* Public Functions */ /*===========================================================================*/ -esp_err_t ts_cert_init(void) +static esp_err_t ts_cert_init_locked(void) { if (s_initialized) return ESP_OK; @@ -234,29 +301,20 @@ esp_err_t ts_cert_init(void) return err; } - /* Load existing credentials */ err = nvs_read_string(NVS_KEY_PRIVKEY, &s_private_key_pem); - if (err == ESP_OK && s_private_key_pem) { - ESP_LOGI(TAG, "Loaded private key from NVS (%d bytes)", strlen(s_private_key_pem)); - } else if (err != ESP_ERR_NVS_NOT_FOUND) { - ESP_LOGW(TAG, "Failed to read private key: %s", esp_err_to_name(err)); - } - - err = nvs_read_string(NVS_KEY_CERT, &s_certificate_pem); - if (err == ESP_OK && s_certificate_pem) { - ESP_LOGI(TAG, "Loaded certificate from NVS (%d bytes)", strlen(s_certificate_pem)); - } else if (err != ESP_ERR_NVS_NOT_FOUND) { - ESP_LOGW(TAG, "Failed to read certificate: %s", esp_err_to_name(err)); - } - - err = nvs_read_string(NVS_KEY_CA_CHAIN, &s_ca_chain_pem); - if (err == ESP_OK && s_ca_chain_pem) { - ESP_LOGI(TAG, "Loaded CA chain from NVS (%d bytes)", strlen(s_ca_chain_pem)); - } else if (err != ESP_ERR_NVS_NOT_FOUND) { - ESP_LOGW(TAG, "Failed to read CA chain: %s", esp_err_to_name(err)); + if (err == ESP_OK) err = nvs_read_string(NVS_KEY_CERT, &s_certificate_pem); + if (err == ESP_OK) err = nvs_read_string(NVS_KEY_CA_CHAIN, &s_ca_chain_pem); + if (err != ESP_OK) { + if (s_private_key_pem) mbedtls_platform_zeroize(s_private_key_pem, strlen(s_private_key_pem)); + free(s_private_key_pem); free(s_certificate_pem); free(s_ca_chain_pem); + s_private_key_pem = s_certificate_pem = s_ca_chain_pem = NULL; + nvs_close(s_nvs_handle); s_nvs_handle = 0; + s_storage_error = true; + return err; } - - /* 必须先设置 initialized,因为 update_status 会调用 ts_cert_get_info */ + s_storage_error = false; + s_metadata_generation = 0; + /* 必须先设置 initialized,因为 update_status 会调用 ts_cert_get_info_locked */ s_initialized = true; update_status(); @@ -269,10 +327,11 @@ esp_err_t ts_cert_init(void) return ESP_OK; } -void ts_cert_deinit(void) +static void ts_cert_deinit_locked(void) { if (!s_initialized) return; + if (s_private_key_pem) mbedtls_platform_zeroize(s_private_key_pem, strlen(s_private_key_pem)); free(s_private_key_pem); free(s_certificate_pem); free(s_ca_chain_pem); @@ -298,7 +357,7 @@ void ts_cert_deinit(void) /* Key Pair Management */ /*===========================================================================*/ -esp_err_t ts_cert_generate_keypair(void) +static esp_err_t ts_cert_generate_keypair_locked(void) { if (!s_initialized) return ESP_ERR_INVALID_STATE; @@ -331,6 +390,7 @@ esp_err_t ts_cert_generate_keypair(void) if (err != ESP_OK) { ESP_LOGE(TAG, "Key export failed: %s", esp_err_to_name(err)); + mbedtls_platform_zeroize(key_pem, TS_CERT_KEY_MAX_LEN); free(key_pem); return err; } @@ -339,42 +399,55 @@ esp_err_t ts_cert_generate_keypair(void) err = nvs_write_string(NVS_KEY_PRIVKEY, key_pem); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to store key: %s", esp_err_to_name(err)); + mbedtls_platform_zeroize(key_pem, TS_CERT_KEY_MAX_LEN); free(key_pem); return err; } - /* Update cache */ - free(s_private_key_pem); - s_private_key_pem = key_pem; - - /* Clear existing certificate (key changed) */ - nvs_erase_key(s_nvs_handle, NVS_KEY_CERT); - nvs_commit(s_nvs_handle); - free(s_certificate_pem); - s_certificate_pem = NULL; - + err = nvs_erase_key(s_nvs_handle, NVS_KEY_CERT); + if (err == ESP_ERR_NVS_NOT_FOUND) err = ESP_OK; + if (err == ESP_OK) err = nvs_commit(s_nvs_handle); + if (err != ESP_OK) { + s_storage_error = true; + mbedtls_platform_zeroize(key_pem, strlen(key_pem)); free(key_pem); + return err; + } + if (s_private_key_pem) mbedtls_platform_zeroize(s_private_key_pem, strlen(s_private_key_pem)); + free(s_private_key_pem); s_private_key_pem = key_pem; + free(s_certificate_pem); s_certificate_pem = NULL; + ++s_generation; + s_status = TS_CERT_STATUS_KEY_GENERATED; update_status(); - + ESP_LOGI(TAG, "Key pair generated and stored"); return ESP_OK; } -bool ts_cert_has_keypair(void) +static bool ts_cert_has_keypair_locked(void) { return s_private_key_pem != NULL; } -esp_err_t ts_cert_delete_keypair(void) +static esp_err_t ts_cert_delete_keypair_locked(void) { if (!s_initialized) return ESP_ERR_INVALID_STATE; - nvs_erase_key(s_nvs_handle, NVS_KEY_PRIVKEY); - nvs_erase_key(s_nvs_handle, NVS_KEY_CERT); - nvs_commit(s_nvs_handle); - + esp_err_t err = ESP_OK; + if (err == ESP_OK) { + err = nvs_erase_key(s_nvs_handle, NVS_KEY_PRIVKEY); + if (err == ESP_ERR_NVS_NOT_FOUND) err = ESP_OK; + } + if (err == ESP_OK) { + err = nvs_erase_key(s_nvs_handle, NVS_KEY_CERT); + if (err == ESP_ERR_NVS_NOT_FOUND) err = ESP_OK; + } + if (err == ESP_OK) err = nvs_commit(s_nvs_handle); + if (err != ESP_OK) { s_storage_error = true; return err; } + ++s_generation; + /* Securely clear memory */ if (s_private_key_pem) { - memset(s_private_key_pem, 0, strlen(s_private_key_pem)); + mbedtls_platform_zeroize(s_private_key_pem, strlen(s_private_key_pem)); free(s_private_key_pem); s_private_key_pem = NULL; } @@ -392,7 +465,7 @@ esp_err_t ts_cert_delete_keypair(void) /* CSR Generation */ /*===========================================================================*/ -esp_err_t ts_cert_generate_csr(const ts_cert_csr_opts_t *opts, +static esp_err_t ts_cert_generate_csr_locked(const ts_cert_csr_opts_t *opts, char *csr_pem, size_t *csr_len) { if (!s_initialized) return ESP_ERR_INVALID_STATE; @@ -490,8 +563,7 @@ esp_err_t ts_cert_generate_csr(const ts_cert_csr_opts_t *opts, *csr_len = strlen(csr_pem) + 1; s_status = TS_CERT_STATUS_CSR_PENDING; - nvs_set_u8(s_nvs_handle, NVS_KEY_STATUS, (uint8_t)s_status); - nvs_commit(s_nvs_handle); + ESP_LOGI(TAG, "CSR generated for %s", opts->device_id); err = ESP_OK; @@ -502,7 +574,7 @@ esp_err_t ts_cert_generate_csr(const ts_cert_csr_opts_t *opts, return err; } -esp_err_t ts_cert_generate_csr_default(char *csr_pem, size_t *csr_len) +static esp_err_t ts_cert_generate_csr_default_locked(char *csr_pem, size_t *csr_len) { /* Get device IP address */ esp_netif_t *netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); @@ -531,166 +603,127 @@ esp_err_t ts_cert_generate_csr_default(char *csr_pem, size_t *csr_len) }; opts.ip_sans[0] = ip_addr; - return ts_cert_generate_csr(&opts, csr_pem, csr_len); + return ts_cert_generate_csr_locked(&opts, csr_pem, csr_len); } /*===========================================================================*/ /* Certificate Management */ /*===========================================================================*/ -esp_err_t ts_cert_install_certificate(const char *cert_pem, size_t cert_len) +static char *copy_pem(const char *pem, size_t len) { - if (!s_initialized) return ESP_ERR_INVALID_STATE; - if (!cert_pem || cert_len == 0) return ESP_ERR_INVALID_ARG; - if (!s_private_key_pem) { - ESP_LOGE(TAG, "No private key, cannot install certificate"); - return ESP_ERR_INVALID_STATE; + char *p = heap_caps_malloc(len, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!p) p = malloc(len); + if (p) memcpy(p, pem, len); + return p; +} + +static void save_ca_copy(const char *pem) +{ + struct stat st; + if (stat(CA_CHAIN_SDCARD_DIR, &st) != 0 && mkdir(CA_CHAIN_SDCARD_DIR, 0755) != 0) { + ESP_LOGW(TAG, "CA saved in NVS; SD copy unavailable"); return; } - - /* Parse and validate certificate */ + FILE *file = fopen(CA_CHAIN_SDCARD_PATH, "w"); + if (!file) { ESP_LOGW(TAG, "CA saved in NVS; SD copy open failed"); return; } + size_t len = strlen(pem); + size_t written = fwrite(pem, 1, len, file); + int closed = fclose(file); + if (written != len || closed != 0) ESP_LOGW(TAG, "CA saved in NVS; SD copy write failed"); +} + +static esp_err_t install_material(const char *pem, size_t len, bool ca, ts_cert_op_error_t *detail) +{ + ts_cert_op_error_t why = TS_CERT_OP_OK; + esp_err_t err = ESP_ERR_INVALID_ARG; + char *replacement = NULL; mbedtls_x509_crt crt; - mbedtls_x509_crt_init(&crt); - - int ret = mbedtls_x509_crt_parse(&crt, (const unsigned char *)cert_pem, cert_len); - if (ret != 0) { - char err_buf[128]; - mbedtls_strerror(ret, err_buf, sizeof(err_buf)); - ESP_LOGE(TAG, "Failed to parse certificate: %s", err_buf); - mbedtls_x509_crt_free(&crt); - return ESP_ERR_INVALID_ARG; - } - - /* Verify certificate matches private key */ mbedtls_pk_context pk; - mbedtls_pk_init(&pk); - - esp_err_t err = init_rng(); - if (err != ESP_OK) { - mbedtls_x509_crt_free(&crt); - return err; + mbedtls_x509_crt_init(&crt); mbedtls_pk_init(&pk); + if (!s_initialized) { why = TS_CERT_OP_NOT_INITIALIZED; err = ESP_ERR_INVALID_STATE; goto done; } + if (!pem || len <= 1) { why = TS_CERT_OP_INVALID_INPUT; goto done; } + size_t cap = ca ? TS_CERT_CA_CHAIN_MAX_LEN : TS_CERT_PEM_MAX_LEN; + if (cap > TS_CERT_INSTALL_MAX_LEN) cap = TS_CERT_INSTALL_MAX_LEN; + if (len > cap) { why = TS_CERT_OP_INPUT_TOO_LARGE; goto done; } + if (pem[len-1] != 0 || memchr(pem, 0, len-1)) { why = TS_CERT_OP_INVALID_INPUT; goto done; } + size_t i = 0; + while (i < len-1 && isspace((unsigned char)pem[i])) ++i; + if (i == len-1) { why = TS_CERT_OP_INVALID_INPUT; goto done; } + if (!ca && !s_private_key_pem) { + why = TS_CERT_OP_PRIVATE_KEY_MISSING; err = ESP_ERR_INVALID_STATE; goto done; } - - ret = mbedtls_pk_parse_key(&pk, (const unsigned char *)s_private_key_pem, - strlen(s_private_key_pem) + 1, NULL, 0, - mbedtls_ctr_drbg_random, &s_ctr_drbg); + if (s_storage_error) { why = TS_CERT_OP_STORAGE_FAILED; err = ESP_FAIL; goto done; } + char *old = ca ? s_ca_chain_pem : s_certificate_pem; + replacement = copy_pem(pem, len); + if (!replacement) { why = TS_CERT_OP_NO_MEMORY; err = ESP_ERR_NO_MEM; goto done; } + int ret = mbedtls_x509_crt_parse(&crt, (const unsigned char *)pem, len); if (ret != 0) { - ESP_LOGE(TAG, "Failed to parse private key for verification"); - mbedtls_x509_crt_free(&crt); - mbedtls_pk_free(&pk); - return ESP_FAIL; + ESP_LOGW(TAG, "PEM parse: %d", ret); + why = allocation_error(ret) ? TS_CERT_OP_NO_MEMORY : TS_CERT_OP_PEM_PARSE_FAILED; + err = why == TS_CERT_OP_NO_MEMORY ? ESP_ERR_NO_MEM : ESP_ERR_INVALID_ARG; + goto done; } - - /* Check if public keys match */ - unsigned char cert_pub[256], key_pub[256]; - size_t cert_pub_len, key_pub_len; - - ret = mbedtls_pk_write_pubkey_der(&crt.pk, cert_pub, sizeof(cert_pub)); - if (ret < 0) { - ESP_LOGE(TAG, "Failed to extract certificate public key"); - err = ESP_FAIL; - goto verify_cleanup; + if (!ca) { + err = init_rng(); + if (err != ESP_OK) { why = err == ESP_ERR_NO_MEM ? TS_CERT_OP_NO_MEMORY : TS_CERT_OP_CRYPTO_FAILED; goto done; } + ret = mbedtls_pk_parse_key(&pk, (const unsigned char *)s_private_key_pem, + strlen(s_private_key_pem)+1, NULL, 0, mbedtls_ctr_drbg_random, &s_ctr_drbg); + if (ret != 0) { + why = allocation_error(ret) ? TS_CERT_OP_NO_MEMORY : TS_CERT_OP_PRIVATE_KEY_INVALID; + err = why == TS_CERT_OP_NO_MEMORY ? ESP_ERR_NO_MEM : ESP_FAIL; + goto done; + } + ret = mbedtls_pk_check_pair(&crt.pk, &pk, mbedtls_ctr_drbg_random, &s_ctr_drbg); + if (ret != 0) { + why = allocation_error(ret) ? TS_CERT_OP_NO_MEMORY : TS_CERT_OP_KEY_MISMATCH; + err = why == TS_CERT_OP_NO_MEMORY ? ESP_ERR_NO_MEM : ESP_ERR_INVALID_STATE; + goto done; + } } - cert_pub_len = ret; - - ret = mbedtls_pk_write_pubkey_der(&pk, key_pub, sizeof(key_pub)); - if (ret < 0) { - ESP_LOGE(TAG, "Failed to extract private key public component"); - err = ESP_FAIL; - goto verify_cleanup; + /* Reuse the candidate parser for metadata: no second parse or allocation after persistence. */ + ts_cert_info_t info = {0}; + unsigned char hash[32]; + if (!ca) { + info_from_crt(&crt, &info); + ret = mbedtls_sha256(crt.raw.p, crt.raw.len, hash, 0); + if (ret != 0) { why = TS_CERT_OP_CRYPTO_FAILED; err = ESP_FAIL; goto done; } } - key_pub_len = ret; - - /* Public keys are written at the end of the buffer */ - if (cert_pub_len != key_pub_len || - memcmp(cert_pub + sizeof(cert_pub) - cert_pub_len, - key_pub + sizeof(key_pub) - key_pub_len, - cert_pub_len) != 0) { - ESP_LOGE(TAG, "Certificate does not match private key"); - err = ESP_ERR_INVALID_STATE; - goto verify_cleanup; + bool changed = !old || strcmp(old, pem) != 0; + if (changed) { + err = nvs_write_string(ca ? NVS_KEY_CA_CHAIN : NVS_KEY_CERT, pem); + if (err != ESP_OK) { why = TS_CERT_OP_STORAGE_FAILED; goto done; } + if (ca) s_ca_chain_pem = replacement; else s_certificate_pem = replacement; + replacement = NULL; + free(old); + ++s_generation; } - - /* Store certificate */ - err = nvs_write_string(NVS_KEY_CERT, cert_pem); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to store certificate: %s", esp_err_to_name(err)); - goto verify_cleanup; + if (ca) s_ca_valid = true; + else { + s_metadata = info; + s_key_valid = s_key_matches = true; + ts_cert_hex(hash, sizeof(hash), s_fingerprint, sizeof(s_fingerprint)); } - - /* Update cache */ - free(s_certificate_pem); - s_certificate_pem = strdup(cert_pem); - + s_metadata_generation = s_generation; update_status(); - - ESP_LOGI(TAG, "Certificate installed successfully"); + if (ca && changed) save_ca_copy(pem); err = ESP_OK; - -verify_cleanup: - mbedtls_x509_crt_free(&crt); - mbedtls_pk_free(&pk); + done: + free(replacement); + mbedtls_pk_free(&pk); mbedtls_x509_crt_free(&crt); + if (detail) *detail = why; return err; } -esp_err_t ts_cert_install_ca_chain(const char *ca_chain_pem, size_t ca_chain_len) -{ - if (!s_initialized) return ESP_ERR_INVALID_STATE; - if (!ca_chain_pem || ca_chain_len == 0) return ESP_ERR_INVALID_ARG; - - /* Validate CA chain can be parsed */ - mbedtls_x509_crt ca; - mbedtls_x509_crt_init(&ca); - - int ret = mbedtls_x509_crt_parse(&ca, (const unsigned char *)ca_chain_pem, ca_chain_len); - mbedtls_x509_crt_free(&ca); - - if (ret != 0) { - char err_buf[128]; - mbedtls_strerror(ret, err_buf, sizeof(err_buf)); - ESP_LOGE(TAG, "Invalid CA chain: %s", err_buf); - return ESP_ERR_INVALID_ARG; - } - - /* Store CA chain in NVS */ - esp_err_t err = nvs_write_string(NVS_KEY_CA_CHAIN, ca_chain_pem); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to store CA chain: %s", esp_err_to_name(err)); - return err; - } - - /* Update cache */ - free(s_ca_chain_pem); - s_ca_chain_pem = strdup(ca_chain_pem); - - /* Save CA chain to SD card for user download */ - /* Create directory if not exists */ - struct stat st; - if (stat(CA_CHAIN_SDCARD_DIR, &st) != 0) { - if (mkdir(CA_CHAIN_SDCARD_DIR, 0755) != 0) { - ESP_LOGW(TAG, "Failed to create %s directory (SD card may not be mounted)", CA_CHAIN_SDCARD_DIR); - /* Continue anyway, NVS storage succeeded */ - } - } - - /* Write CA chain file */ - FILE *f = fopen(CA_CHAIN_SDCARD_PATH, "w"); - if (f) { - size_t written = fwrite(ca_chain_pem, 1, strlen(ca_chain_pem), f); - fclose(f); - if (written == strlen(ca_chain_pem)) { - ESP_LOGI(TAG, "CA chain saved to %s for user download", CA_CHAIN_SDCARD_PATH); - } else { - ESP_LOGW(TAG, "Partial write to SD card: %zu/%zu bytes", written, strlen(ca_chain_pem)); - } - } else { - ESP_LOGW(TAG, "Could not save CA chain to SD card (SD card may not be mounted)"); - } - - ESP_LOGI(TAG, "CA chain installed"); - return ESP_OK; -} +static esp_err_t ts_cert_install_certificate_ex_locked(const char *pem, size_t len, ts_cert_op_error_t *detail) +{ return install_material(pem, len, false, detail); } +static esp_err_t ts_cert_install_ca_chain_ex_locked(const char *pem, size_t len, ts_cert_op_error_t *detail) +{ return install_material(pem, len, true, detail); } +static esp_err_t ts_cert_install_certificate_locked(const char *pem, size_t len) +{ return ts_cert_install_certificate_ex_locked(pem, len, NULL); } +static esp_err_t ts_cert_install_ca_chain_locked(const char *pem, size_t len) +{ return ts_cert_install_ca_chain_ex_locked(pem, len, NULL); } -esp_err_t ts_cert_get_certificate(char *cert_pem, size_t *cert_len) +static esp_err_t ts_cert_get_certificate_locked(char *cert_pem, size_t *cert_len) { if (!s_initialized) return ESP_ERR_INVALID_STATE; if (!cert_pem || !cert_len) return ESP_ERR_INVALID_ARG; @@ -710,7 +743,7 @@ esp_err_t ts_cert_get_certificate(char *cert_pem, size_t *cert_len) return ESP_OK; } -esp_err_t ts_cert_get_private_key(char *key_pem, size_t *key_len) +static esp_err_t ts_cert_get_private_key_locked(char *key_pem, size_t *key_len) { if (!s_initialized) return ESP_ERR_INVALID_STATE; if (!key_pem || !key_len) return ESP_ERR_INVALID_ARG; @@ -730,7 +763,7 @@ esp_err_t ts_cert_get_private_key(char *key_pem, size_t *key_len) return ESP_OK; } -esp_err_t ts_cert_get_ca_chain(char *ca_chain_pem, size_t *ca_chain_len) +static esp_err_t ts_cert_get_ca_chain_locked(char *ca_chain_pem, size_t *ca_chain_len) { if (!s_initialized) return ESP_ERR_INVALID_STATE; if (!ca_chain_pem || !ca_chain_len) return ESP_ERR_INVALID_ARG; @@ -754,7 +787,7 @@ esp_err_t ts_cert_get_ca_chain(char *ca_chain_pem, size_t *ca_chain_len) /* Status & Info */ /*===========================================================================*/ -esp_err_t ts_cert_refresh_status(void) +static esp_err_t ts_cert_refresh_status_locked(void) { if (!s_initialized) return ESP_ERR_INVALID_STATE; @@ -773,50 +806,57 @@ esp_err_t ts_cert_refresh_status(void) return ESP_OK; } -esp_err_t ts_cert_get_status(ts_cert_pki_status_t *status) +static esp_err_t ts_cert_get_status_locked(ts_cert_pki_status_t *status) { - if (!s_initialized) return ESP_ERR_INVALID_STATE; if (!status) return ESP_ERR_INVALID_ARG; - + memset(status, 0, sizeof(*status)); + if (!s_initialized) return ESP_ERR_INVALID_STATE; + refresh_metadata(); + status->has_private_key = s_private_key_pem != NULL; + status->has_certificate = s_certificate_pem != NULL; + status->has_ca_chain = s_ca_chain_pem != NULL; + status->generation = s_generation; + status->storage_error = s_storage_error; + status->key_valid = s_key_valid; + status->key_matches = s_key_matches; + status->ca_valid = s_ca_valid; + status->cert_info = s_metadata; + int64_t now = (int64_t)time(NULL); + status->time_ready = ts_cert_time_ready(now, TS_TIME_MIN_VALID_YEAR); + evaluate_time(&status->cert_info, now); + set_status(&status->cert_info); status->status = s_status; - status->has_private_key = (s_private_key_pem != NULL); - status->has_certificate = (s_certificate_pem != NULL); - status->has_ca_chain = (s_ca_chain_pem != NULL); - - if (status->has_certificate) { - ts_cert_get_info(&status->cert_info); - } else { - memset(&status->cert_info, 0, sizeof(status->cert_info)); - } - return ESP_OK; } -esp_err_t ts_cert_get_info(ts_cert_info_t *info) +static esp_err_t ts_cert_get_info_locked(ts_cert_info_t *info) { - if (!s_initialized) return ESP_ERR_INVALID_STATE; if (!info) return ESP_ERR_INVALID_ARG; + memset(info, 0, sizeof(*info)); + if (!s_initialized) return ESP_ERR_INVALID_STATE; if (!s_certificate_pem) return ESP_ERR_NOT_FOUND; - - return ts_cert_parse_certificate(s_certificate_pem, strlen(s_certificate_pem) + 1, info); + refresh_metadata(); + *info = s_metadata; + evaluate_time(info, (int64_t)time(NULL)); + return info->validity == TS_CERT_VALIDITY_INVALID ? ESP_ERR_INVALID_ARG : ESP_OK; } -bool ts_cert_is_valid(void) +static bool ts_cert_is_valid_locked(void) { if (!s_certificate_pem) return false; ts_cert_info_t info; - if (ts_cert_get_info(&info) != ESP_OK) return false; + if (ts_cert_get_info_locked(&info) != ESP_OK) return false; return info.is_valid; } -int ts_cert_days_until_expiry(void) +static int ts_cert_days_until_expiry_locked(void) { if (!s_certificate_pem) return INT32_MAX; ts_cert_info_t info; - if (ts_cert_get_info(&info) != ESP_OK) return INT32_MAX; + if (ts_cert_get_info_locked(&info) != ESP_OK) return INT32_MAX; return info.days_until_expiry; } @@ -825,20 +865,35 @@ int ts_cert_days_until_expiry(void) /* Factory Reset */ /*===========================================================================*/ -esp_err_t ts_cert_factory_reset(void) +static esp_err_t ts_cert_factory_reset_locked(void) { if (!s_initialized) return ESP_ERR_INVALID_STATE; /* Erase all NVS keys */ - nvs_erase_key(s_nvs_handle, NVS_KEY_PRIVKEY); - nvs_erase_key(s_nvs_handle, NVS_KEY_CERT); - nvs_erase_key(s_nvs_handle, NVS_KEY_CA_CHAIN); - nvs_erase_key(s_nvs_handle, NVS_KEY_STATUS); - nvs_commit(s_nvs_handle); - + esp_err_t err = ESP_OK; + if (err == ESP_OK) { + err = nvs_erase_key(s_nvs_handle, NVS_KEY_PRIVKEY); + if (err == ESP_ERR_NVS_NOT_FOUND) err = ESP_OK; + } + if (err == ESP_OK) { + err = nvs_erase_key(s_nvs_handle, NVS_KEY_CERT); + if (err == ESP_ERR_NVS_NOT_FOUND) err = ESP_OK; + } + if (err == ESP_OK) { + err = nvs_erase_key(s_nvs_handle, NVS_KEY_CA_CHAIN); + if (err == ESP_ERR_NVS_NOT_FOUND) err = ESP_OK; + } + if (err == ESP_OK) { + err = nvs_erase_key(s_nvs_handle, NVS_KEY_STATUS); + if (err == ESP_ERR_NVS_NOT_FOUND) err = ESP_OK; + } + if (err == ESP_OK) err = nvs_commit(s_nvs_handle); + if (err != ESP_OK) { s_storage_error = true; return err; } + ++s_generation; + /* Securely clear memory */ if (s_private_key_pem) { - memset(s_private_key_pem, 0, strlen(s_private_key_pem)); + mbedtls_platform_zeroize(s_private_key_pem, strlen(s_private_key_pem)); free(s_private_key_pem); s_private_key_pem = NULL; } @@ -868,26 +923,18 @@ const char *ts_cert_status_to_str(ts_cert_status_t status) case TS_CERT_STATUS_ACTIVATED: return "activated"; case TS_CERT_STATUS_EXPIRED: return "expired"; case TS_CERT_STATUS_ERROR: return "error"; + case TS_CERT_STATUS_TIME_UNVERIFIED: return "time_unverified"; + case TS_CERT_STATUS_NOT_YET_VALID: return "not_yet_valid"; default: return "unknown"; } } -esp_err_t ts_cert_parse_certificate(const char *cert_pem, size_t cert_len, - ts_cert_info_t *info) +static esp_err_t info_from_crt(const mbedtls_x509_crt *crt, ts_cert_info_t *info) { - if (!cert_pem || !info) return ESP_ERR_INVALID_ARG; - - mbedtls_x509_crt crt; - mbedtls_x509_crt_init(&crt); - - int ret = mbedtls_x509_crt_parse(&crt, (const unsigned char *)cert_pem, cert_len); - if (ret != 0) { - mbedtls_x509_crt_free(&crt); - return ESP_ERR_INVALID_ARG; - } - + memset(info, 0, sizeof(*info)); + info->validity = TS_CERT_VALIDITY_INVALID; /* Extract subject CN */ - const mbedtls_x509_name *name = &crt.subject; + const mbedtls_x509_name *name = &crt->subject; info->subject_cn[0] = '\0'; info->subject_ou[0] = '\0'; while (name) { @@ -907,7 +954,7 @@ esp_err_t ts_cert_parse_certificate(const char *cert_pem, size_t cert_len, } /* Extract issuer CN */ - name = &crt.issuer; + name = &crt->issuer; info->issuer_cn[0] = '\0'; while (name) { if (MBEDTLS_OID_CMP(MBEDTLS_OID_AT_CN, &name->oid) == 0) { @@ -920,36 +967,332 @@ esp_err_t ts_cert_parse_certificate(const char *cert_pem, size_t cert_len, name = name->next; } - /* Convert validity times */ - struct tm tm_from, tm_to; - tm_from.tm_year = crt.valid_from.year - 1900; - tm_from.tm_mon = crt.valid_from.mon - 1; - tm_from.tm_mday = crt.valid_from.day; - tm_from.tm_hour = crt.valid_from.hour; - tm_from.tm_min = crt.valid_from.min; - tm_from.tm_sec = crt.valid_from.sec; - info->not_before = mktime(&tm_from); - - tm_to.tm_year = crt.valid_to.year - 1900; - tm_to.tm_mon = crt.valid_to.mon - 1; - tm_to.tm_mday = crt.valid_to.day; - tm_to.tm_hour = crt.valid_to.hour; - tm_to.tm_min = crt.valid_to.min; - tm_to.tm_sec = crt.valid_to.sec; - info->not_after = mktime(&tm_to); - - /* Serial number (hex) */ - for (size_t i = 0; i < crt.serial.len && i < 32; i++) { - sprintf(info->serial + i * 2, "%02X", crt.serial.p[i]); + if (!ts_cert_time_utc(crt->valid_from.year, crt->valid_from.mon, crt->valid_from.day, + crt->valid_from.hour, crt->valid_from.min, crt->valid_from.sec, &info->not_before) || + !ts_cert_time_utc(crt->valid_to.year, crt->valid_to.mon, crt->valid_to.day, + crt->valid_to.hour, crt->valid_to.min, crt->valid_to.sec, &info->not_after) || + info->not_after < info->not_before) { + return ESP_ERR_INVALID_ARG; } + info->serial_truncated = ts_cert_hex(crt->serial.p, crt->serial.len, info->serial, sizeof(info->serial)); + info->validity = TS_CERT_VALIDITY_VALID; + return ESP_OK; +} + +esp_err_t ts_cert_parse_certificate(const char *cert_pem, size_t cert_len, + ts_cert_info_t *info) +{ + if (!info) return ESP_ERR_INVALID_ARG; + memset(info, 0, sizeof(*info)); + info->validity = TS_CERT_VALIDITY_INVALID; + if (!cert_pem || cert_len <= 1 || cert_pem[cert_len-1] != 0 || memchr(cert_pem, 0, cert_len-1)) + return ESP_ERR_INVALID_ARG; - /* Calculate validity */ - time_t now; - time(&now); + mbedtls_x509_crt crt; + mbedtls_x509_crt_init(&crt); - info->is_valid = (now >= info->not_before && now <= info->not_after); - info->days_until_expiry = (int)((info->not_after - now) / 86400); + int ret = mbedtls_x509_crt_parse(&crt, (const unsigned char *)cert_pem, cert_len); + if (ret != 0) { + mbedtls_x509_crt_free(&crt); + return ESP_ERR_INVALID_ARG; + } + ret = info_from_crt(&crt, info); + if (ret == ESP_OK) evaluate_time(info, (int64_t)time(NULL)); mbedtls_x509_crt_free(&crt); + return ret; +} + +static void evaluate_time(ts_cert_info_t *info, int64_t now) +{ + info->is_valid = false; + info->seconds_until_expiry = 0; + info->days_until_expiry = 0; + info->time_ready = ts_cert_time_ready(now, TS_TIME_MIN_VALID_YEAR); + if (info->validity == TS_CERT_VALIDITY_NONE || info->validity == TS_CERT_VALIDITY_INVALID) return; + if (!info->time_ready) { info->validity = TS_CERT_VALIDITY_TIME_UNVERIFIED; return; } + info->seconds_until_expiry = info->not_after - now; + info->days_until_expiry = ts_cert_time_days(info->seconds_until_expiry); + info->validity = now < info->not_before ? TS_CERT_VALIDITY_NOT_YET_VALID : + now > info->not_after ? TS_CERT_VALIDITY_EXPIRED : TS_CERT_VALIDITY_VALID; + info->is_valid = info->validity == TS_CERT_VALIDITY_VALID; +} + +static void refresh_metadata(void) +{ + if (s_metadata_generation == s_generation) return; + memset(&s_metadata, 0, sizeof(s_metadata)); + s_key_valid = s_key_matches = s_ca_valid = false; + s_fingerprint[0] = 0; + mbedtls_pk_context key; + mbedtls_x509_crt crt, ca; + mbedtls_pk_init(&key); mbedtls_x509_crt_init(&crt); mbedtls_x509_crt_init(&ca); + if (s_private_key_pem && init_rng() == ESP_OK) + s_key_valid = mbedtls_pk_parse_key(&key, (const unsigned char *)s_private_key_pem, + strlen(s_private_key_pem)+1, NULL, 0, mbedtls_ctr_drbg_random, &s_ctr_drbg) == 0; + if (s_certificate_pem) { + s_metadata.validity = TS_CERT_VALIDITY_INVALID; + if (mbedtls_x509_crt_parse(&crt, (const unsigned char *)s_certificate_pem, strlen(s_certificate_pem)+1) == 0) { + info_from_crt(&crt, &s_metadata); + s_key_matches = s_key_valid && mbedtls_pk_check_pair(&crt.pk, &key, mbedtls_ctr_drbg_random, &s_ctr_drbg) == 0; + unsigned char hash[32]; + if (mbedtls_sha256(crt.raw.p, crt.raw.len, hash, 0) == 0) + ts_cert_hex(hash, sizeof(hash), s_fingerprint, sizeof(s_fingerprint)); + } + } + if (s_ca_chain_pem) + s_ca_valid = mbedtls_x509_crt_parse(&ca, (const unsigned char *)s_ca_chain_pem, strlen(s_ca_chain_pem)+1) == 0; + mbedtls_pk_free(&key); mbedtls_x509_crt_free(&crt); mbedtls_x509_crt_free(&ca); + s_metadata_generation = s_generation; +} + +bool ts_cert_prerequisites(const ts_cert_pki_status_t *s, bool require_ca) +{ + return s && !s->storage_error && s->time_ready && s->has_private_key && s->key_valid && + s->has_certificate && s->key_matches && s->cert_info.is_valid && + (!require_ca || (s->has_ca_chain && s->ca_valid)); +} + +const char *ts_cert_validity_to_str(ts_cert_validity_t v) +{ + static const char *names[] = {"none", "invalid", "time_unverified", "not_yet_valid", "valid", "expired"}; + return (unsigned)v < sizeof(names)/sizeof(names[0]) ? names[v] : "invalid"; +} +const char *ts_cert_op_error_to_str(ts_cert_op_error_t e) +{ + static const char *names[] = {"Saved", "Certificate module not ready", "Provide non-empty PEM text", + "PEM exceeds 3999 content bytes (4000 including NUL)", "Cannot parse certificate PEM", + "Generate the device key first", "Stored private key is invalid", "Certificate does not match device key; use its CSR", + "Insufficient device memory", "Credential storage failed; restart and check stored materials", "Device cryptographic operation failed"}; + return (unsigned)e < sizeof(names)/sizeof(names[0]) ? names[e] : "Certificate operation failed"; +} + +void ts_cert_free_snapshot(ts_cert_snapshot_t *s) +{ + if (!s) return; + if (s->key) mbedtls_platform_zeroize(s->key, strlen(s->key)); + free(s->key); free(s->certificate); free(s->ca); + memset(s, 0, sizeof(*s)); +} + +static esp_err_t ts_cert_get_snapshot_locked(bool require_ca, ts_cert_snapshot_t *snapshot) +{ + if (!snapshot) return ESP_ERR_INVALID_ARG; + memset(snapshot, 0, sizeof(*snapshot)); + ts_cert_pki_status_t status; + esp_err_t err = ts_cert_get_status_locked(&status); + if (err != ESP_OK) return err; + if (!ts_cert_prerequisites(&status, require_ca)) return ESP_ERR_INVALID_STATE; + snapshot->key = copy_pem(s_private_key_pem, strlen(s_private_key_pem)+1); + snapshot->certificate = copy_pem(s_certificate_pem, strlen(s_certificate_pem)+1); + if (s_ca_chain_pem && s_ca_valid) snapshot->ca = copy_pem(s_ca_chain_pem, strlen(s_ca_chain_pem)+1); + if (!snapshot->key || !snapshot->certificate || (require_ca && !snapshot->ca)) { + ts_cert_free_snapshot(snapshot); return ESP_ERR_NO_MEM; + } + snapshot->generation = s_generation; + memcpy(snapshot->certificate_sha256, s_fingerprint, sizeof(s_fingerprint)); return ESP_OK; } + +/* All public cache/RNG operations take the same lock; events are posted after release. + * Lock order: material only -> unlock -> event; never material -> TLS/service manager. + */ +static void material_unlock(uint32_t previous, uint32_t kind) +{ + uint32_t generation = s_generation; + xSemaphoreGive(s_mutex); + if (generation != previous) { + struct { uint32_t generation; uint32_t kind; } event = {generation, kind}; + esp_err_t err = ts_event_post(TS_EVENT_BASE_PKI, TS_EVENT_PKI_MATERIAL_CHANGED, &event, sizeof(event), 0); + if (err != ESP_OK) ESP_LOGW(TAG, "Material notification lost: %s", esp_err_to_name(err)); + } +} + +esp_err_t ts_cert_init(void) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_init_locked(); + material_unlock(previous, 0); + return result; +} + +void ts_cert_deinit(void) +{ + material_lock(); + uint32_t previous = s_generation; + ts_cert_deinit_locked(); + material_unlock(previous, 0); +} + +esp_err_t ts_cert_generate_keypair(void) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_generate_keypair_locked(); + material_unlock(previous, 3); + return result; +} + +bool ts_cert_has_keypair(void) +{ + material_lock(); + uint32_t previous = s_generation; + bool result = ts_cert_has_keypair_locked(); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_delete_keypair(void) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_delete_keypair_locked(); + material_unlock(previous, 4); + return result; +} + +esp_err_t ts_cert_generate_csr(const ts_cert_csr_opts_t *opts, + char *csr_pem, size_t *csr_len) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_generate_csr_locked(opts, csr_pem, csr_len); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_generate_csr_default(char *csr_pem, size_t *csr_len) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_generate_csr_default_locked(csr_pem, csr_len); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_install_certificate_ex(const char *pem, size_t len, ts_cert_op_error_t *detail) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_install_certificate_ex_locked(pem, len, detail); + material_unlock(previous, 1); + return result; +} + +esp_err_t ts_cert_install_ca_chain_ex(const char *pem, size_t len, ts_cert_op_error_t *detail) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_install_ca_chain_ex_locked(pem, len, detail); + material_unlock(previous, 2); + return result; +} + +esp_err_t ts_cert_install_certificate(const char *pem, size_t len) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_install_certificate_locked(pem, len); + material_unlock(previous, 1); + return result; +} + +esp_err_t ts_cert_install_ca_chain(const char *pem, size_t len) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_install_ca_chain_locked(pem, len); + material_unlock(previous, 2); + return result; +} + +esp_err_t ts_cert_get_certificate(char *cert_pem, size_t *cert_len) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_get_certificate_locked(cert_pem, cert_len); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_get_private_key(char *key_pem, size_t *key_len) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_get_private_key_locked(key_pem, key_len); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_get_ca_chain(char *ca_chain_pem, size_t *ca_chain_len) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_get_ca_chain_locked(ca_chain_pem, ca_chain_len); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_refresh_status(void) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_refresh_status_locked(); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_get_status(ts_cert_pki_status_t *status) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_get_status_locked(status); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_get_info(ts_cert_info_t *info) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_get_info_locked(info); + material_unlock(previous, 0); + return result; +} + +bool ts_cert_is_valid(void) +{ + material_lock(); + uint32_t previous = s_generation; + bool result = ts_cert_is_valid_locked(); + material_unlock(previous, 0); + return result; +} + +int ts_cert_days_until_expiry(void) +{ + material_lock(); + uint32_t previous = s_generation; + int result = ts_cert_days_until_expiry_locked(); + material_unlock(previous, 0); + return result; +} + +esp_err_t ts_cert_factory_reset(void) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_factory_reset_locked(); + material_unlock(previous, 4); + return result; +} + +esp_err_t ts_cert_get_snapshot(bool require_ca, ts_cert_snapshot_t *snapshot) +{ + material_lock(); + uint32_t previous = s_generation; + esp_err_t result = ts_cert_get_snapshot_locked(require_ca, snapshot); + material_unlock(previous, 0); + return result; +} diff --git a/components/ts_cert/src/ts_cert_time.c b/components/ts_cert/src/ts_cert_time.c new file mode 100644 index 0000000..9cf8077 --- /dev/null +++ b/components/ts_cert/src/ts_cert_time.c @@ -0,0 +1,42 @@ +#include "ts_cert_time.h" +#include + +bool ts_cert_time_utc(int y, int m, int d, int h, int min, int s, int64_t *out) +{ + static const int before[] = {0,31,59,90,120,151,181,212,243,273,304,334}; + static const int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; + if (!out || y < 1 || y > 9999 || m < 1 || m > 12 || h < 0 || h > 23 || + min < 0 || min > 59 || s < 0 || s > 59) return false; + bool leap = y % 4 == 0 && (y % 100 != 0 || y % 400 == 0); + if (d < 1 || d > days[m-1] + (m == 2 && leap)) return false; + int64_t prev = y - 1; + int64_t n = 365 * (int64_t)(y - 1970) + prev/4 - prev/100 + prev/400 - 477; + n += before[m-1] + (leap && m > 2) + d - 1; + *out = n * 86400 + h * 3600 + min * 60 + s; + return true; +} + +int ts_cert_time_days(int64_t seconds) +{ + int64_t days = seconds / 86400 - (seconds < 0 && seconds % 86400 != 0); + return days > INT_MAX ? INT_MAX : days < INT_MIN ? INT_MIN : (int)days; +} + +bool ts_cert_time_ready(int64_t now, int minimum_year) +{ + int64_t threshold; + return now != -1 && ts_cert_time_utc(minimum_year, 1, 1, 0, 0, 0, &threshold) && now >= threshold; +} + +bool ts_cert_hex(const unsigned char *bytes, size_t length, char *out, size_t capacity) +{ + static const char hex[] = "0123456789ABCDEF"; + if (!capacity) return length != 0; + size_t n = length < (capacity-1)/2 ? length : (capacity-1)/2; + for (size_t i = 0; i < n; ++i) { + out[2*i] = hex[bytes[i] >> 4]; + out[2*i+1] = hex[bytes[i] & 15]; + } + out[2*n] = 0; + return n < length; +} diff --git a/components/ts_console/commands/ts_cmd_auto.c b/components/ts_console/commands/ts_cmd_auto.c index d07eb7e..864b589 100644 --- a/components/ts_console/commands/ts_cmd_auto.c +++ b/components/ts_console/commands/ts_cmd_auto.c @@ -246,6 +246,7 @@ static int cmd_auto_list(bool json_output) rule.conditions.count, rule.action_count); } + ts_rule_release(&rule); } } diff --git a/components/ts_console/commands/ts_cmd_pki.c b/components/ts_console/commands/ts_cmd_pki.c index 24200e0..82945b8 100644 --- a/components/ts_console/commands/ts_cmd_pki.c +++ b/components/ts_console/commands/ts_cmd_pki.c @@ -78,6 +78,7 @@ static void print_status_json(const ts_cert_pki_status_t *status) ts_console_printf(" \"issuer\": \"%s\",\n", status->cert_info.issuer_cn); ts_console_printf(" \"serial\": \"%s\",\n", status->cert_info.serial); ts_console_printf(" \"valid\": %s,\n", status->cert_info.is_valid ? "true" : "false"); + ts_console_printf(" \"validity\": \"%s\",\n", ts_cert_validity_to_str(status->cert_info.validity)); ts_console_printf(" \"days_until_expiry\": %d\n", status->cert_info.days_until_expiry); ts_console_printf(" }\n"); } else { @@ -99,7 +100,7 @@ static void print_status_text(const ts_cert_pki_status_t *status) switch (status->status) { case TS_CERT_STATUS_ACTIVATED: - status_str = "ACTIVATED"; + status_str = "TIME VALID"; status_color = "\033[32m"; /* Green */ break; case TS_CERT_STATUS_KEY_GENERATED: @@ -110,6 +111,12 @@ static void print_status_text(const ts_cert_pki_status_t *status) status_str = "CSR PENDING"; status_color = "\033[33m"; /* Yellow */ break; + case TS_CERT_STATUS_TIME_UNVERIFIED: + status_str = "TIME UNVERIFIED"; status_color = "\033[33m"; break; + case TS_CERT_STATUS_NOT_YET_VALID: + status_str = "NOT YET VALID"; status_color = "\033[33m"; break; + case TS_CERT_STATUS_ERROR: + status_str = "MATERIAL ERROR"; status_color = "\033[31m"; break; case TS_CERT_STATUS_EXPIRED: status_str = "EXPIRED"; status_color = "\033[31m"; /* Red */ @@ -142,7 +149,7 @@ static void print_status_text(const ts_cert_pki_status_t *status) status->cert_info.days_until_expiry); } } else { - ts_console_printf("║ Validity: \033[31mExpired\033[0m ║\n"); + ts_console_printf("║ Validity: %-30s ║\n", ts_cert_validity_to_str(status->cert_info.validity)); } } @@ -352,7 +359,7 @@ static int cmd_pki_install(const char *filepath, bool is_ca) long file_size = ftell(f); fseek(f, 0, SEEK_SET); - if (file_size <= 0 || file_size > TS_CERT_PEM_MAX_LEN) { + if (file_size <= 0 || file_size >= TS_CERT_INSTALL_MAX_LEN) { fclose(f); ts_console_printf("Error: Invalid file size\n"); return 1; @@ -488,7 +495,9 @@ static int cmd_pki_handler(int argc, char **argv) ts_console_printf(" Issuer: %s\n", info.issuer_cn); ts_console_printf(" Serial: %s\n", info.serial); ts_console_printf(" Valid: %s\n", info.is_valid ? "Yes" : "No"); - ts_console_printf(" Expires: %d days\n", info.days_until_expiry); + ts_console_printf(" Time validity: %s\n", ts_cert_validity_to_str(info.validity)); + if (info.time_ready && info.validity != TS_CERT_VALIDITY_INVALID) + ts_console_printf(" Expires: %d days\n", info.days_until_expiry); return 0; } diff --git a/components/ts_console/commands/ts_cmd_ssh.c b/components/ts_console/commands/ts_cmd_ssh.c index db7d598..ebda813 100644 --- a/components/ts_console/commands/ts_cmd_ssh.c +++ b/components/ts_console/commands/ts_cmd_ssh.c @@ -253,6 +253,11 @@ static esp_err_t verify_host_key(ts_ssh_session_t session, bool verbose) return ret; } +static esp_err_t cli_verify_before_auth(ts_ssh_session_t session, void *unused) +{ + return verify_host_key(session, false); +} + /*===========================================================================*/ /* Ctrl+C 检测任务 */ @@ -454,7 +459,7 @@ static int do_ssh_shell(const char *host, int port, const char *user, } /* 连接 */ - ret = ts_ssh_connect(session); + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); if (ret != ESP_OK) { ts_console_printf("Error: %s\n", ts_ssh_get_error(session)); ts_ssh_session_destroy(session); @@ -563,7 +568,7 @@ static int do_ssh_forward(const char *host, int port, const char *user, } /* 连接 */ - ret = ts_ssh_connect(session); + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); if (ret != ESP_OK) { ts_console_printf("Error: %s\n", ts_ssh_get_error(session)); ts_ssh_session_destroy(session); @@ -864,7 +869,7 @@ static int do_ssh_copy_id(const char *host, int port, const char *user, return 1; } - ret = ts_ssh_connect(session); + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); if (ret != ESP_OK) { ts_console_printf("FAILED\n"); ts_console_printf(" Error: %s\n", ts_ssh_get_error(session)); @@ -988,7 +993,7 @@ static int do_ssh_copy_id(const char *host, int port, const char *user, return 1; } - ret = ts_ssh_connect(session); + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); if (ret != ESP_OK) { const char *error_msg = ts_ssh_get_error(session); @@ -1196,7 +1201,7 @@ static int do_ssh_revoke(const char *host, int port, const char *user, } /* 连接 */ - ret = ts_ssh_connect(session); + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); if (ret != ESP_OK) { ts_console_printf("FAILED\n"); ts_console_printf("Error: %s\n", ts_ssh_get_error(session)); diff --git a/components/ts_core/ts_event/include/ts_event.h b/components/ts_core/ts_event/include/ts_event.h index 25d5eb9..23703dd 100644 --- a/components/ts_core/ts_event/include/ts_event.h +++ b/components/ts_core/ts_event/include/ts_event.h @@ -166,6 +166,9 @@ typedef struct { #define TS_EVENT_BASE_OTA "ts_ota" /** 时间事件 */ +#define TS_EVENT_BASE_PKI "ts_pki" +#define TS_EVENT_PKI_MATERIAL_CHANGED 0x0001 + #define TS_EVENT_BASE_TIME "ts_time" /* ============================================================================ diff --git a/components/ts_core/ts_log/include/ts_log.h b/components/ts_core/ts_log/include/ts_log.h index cd0ca12..3779244 100644 --- a/components/ts_core/ts_log/include/ts_log.h +++ b/components/ts_core/ts_log/include/ts_log.h @@ -115,6 +115,8 @@ typedef struct { size_t buffer_capacity; /**< 缓冲区容量 */ size_t buffer_count; /**< 当前缓冲区中的日志数 */ uint32_t total_captured; /**< 总捕获日志数(含溢出覆盖的)*/ + uint32_t capture_dropped; + uint32_t capture_truncated; uint32_t dropped; /**< 丢弃的日志数 */ bool esp_log_capture_enabled; /**< ESP_LOG 捕获是否启用 */ } ts_log_stats_t; diff --git a/components/ts_core/ts_log/src/ts_log.c b/components/ts_core/ts_log/src/ts_log.c index 327aeb9..441199f 100644 --- a/components/ts_core/ts_log/src/ts_log.c +++ b/components/ts_core/ts_log/src/ts_log.c @@ -1,3 +1,5 @@ +#include "ts_log_preview.h" +#include /** * @file ts_log.c * @brief TianShanOS Logging System Implementation @@ -72,6 +74,7 @@ typedef struct ts_log_tag_level { * @brief 回调节点 */ typedef struct ts_log_callback_node { + unsigned readers; ts_log_callback_t callback; ts_log_level_t min_level; void *user_data; @@ -92,7 +95,7 @@ typedef struct { * @brief 日志上下文 */ typedef struct { - bool initialized; + _Atomic bool initialized; SemaphoreHandle_t mutex; ts_log_level_t global_level; uint32_t output_mask; @@ -106,9 +109,12 @@ typedef struct { FILE *log_file; size_t file_size; int file_index; - vprintf_like_t original_vprintf; /**< 原始 vprintf 函数指针 */ - bool esp_log_capture_enabled; /**< 是否启用 ESP_LOG 捕获 */ + _Atomic(vprintf_like_t) original_vprintf; /**< 原始 vprintf 函数指针 */ + _Atomic bool esp_log_capture_enabled; /**< 是否启用 ESP_LOG 捕获 */ uint32_t total_logs_captured; /**< 总捕获日志数(含溢出) */ + _Atomic uint32_t capture_dropped; + _Atomic uint32_t capture_truncated; + unsigned active_writers; uint32_t logs_dropped; /**< 因缓冲区满丢弃的日志数 */ } ts_log_context_t; @@ -117,36 +123,53 @@ typedef struct { * ========================================================================== */ static ts_log_context_t s_log_ctx = {0}; +static SemaphoreHandle_t s_log_io_mutex; +static portMUX_TYPE s_capture_lock = portMUX_INITIALIZER_UNLOCKED; +static struct { + bool busy; + char text[512]; + ts_log_entry_t entry; +} s_capture[2]; +_Static_assert(sizeof(s_capture) <= 2048, "log capture RAM budget"); /* ============================================================================ * 私有函数声明 * ========================================================================== */ -static void log_output_console(const ts_log_entry_t *entry); +static void log_output_console(const ts_log_entry_t *entry, const char *format, va_list args); static void log_output_file(const ts_log_entry_t *entry); static void log_output_buffer(const ts_log_entry_t *entry); static void notify_callbacks(const ts_log_entry_t *entry); static ts_log_level_t get_effective_level(const char *tag); static void rotate_log_file(void); static int ts_log_vprintf_hook(const char *fmt, va_list args); -static void parse_esp_log_and_store(const char *log_line); +static void parse_esp_log(const char *log_line, ts_log_entry_t *out, bool clipped); /* ============================================================================ * 初始化和反初始化 * ========================================================================== */ +static atomic_bool s_log_lifecycle_busy; + esp_err_t ts_log_init(void) { + if (atomic_exchange(&s_log_lifecycle_busy, true)) + return ESP_ERR_INVALID_STATE; if (s_log_ctx.initialized) { + atomic_store(&s_log_lifecycle_busy, false); return ESP_ERR_INVALID_STATE; } ESP_LOGI(TAG, "Initializing TianShanOS Logging System..."); // 创建互斥锁 - s_log_ctx.mutex = xSemaphoreCreateMutex(); - if (s_log_ctx.mutex == NULL) { + if (!s_log_ctx.mutex) + s_log_ctx.mutex = xSemaphoreCreateMutex(); + if (!s_log_io_mutex) + s_log_io_mutex = xSemaphoreCreateMutex(); + if (s_log_ctx.mutex == NULL || !s_log_io_mutex) { ESP_LOGE(TAG, "Failed to create mutex"); + atomic_store(&s_log_lifecycle_busy, false); return ESP_ERR_NO_MEM; } @@ -220,12 +243,13 @@ esp_err_t ts_log_init(void) s_log_ctx.total_logs_captured = 0; s_log_ctx.logs_dropped = 0; + portENTER_CRITICAL(&s_capture_lock); s_log_ctx.initialized = true; + portEXIT_CRITICAL(&s_capture_lock); // 安装 ESP_LOG vprintf 钩子(捕获所有 ESP-IDF 日志) #ifdef CONFIG_TS_LOG_CAPTURE_ESP_LOG - s_log_ctx.esp_log_capture_enabled = true; - s_log_ctx.original_vprintf = esp_log_set_vprintf(ts_log_vprintf_hook); + ts_log_enable_esp_capture(true); ESP_LOGI(TAG, "ESP_LOG capture hook installed"); #else s_log_ctx.esp_log_capture_enabled = false; @@ -236,52 +260,59 @@ esp_err_t ts_log_init(void) s_log_ctx.global_level, (unsigned long)s_log_ctx.output_mask, s_log_ctx.buffer.capacity); + atomic_store(&s_log_lifecycle_busy, false); + return ESP_OK; } esp_err_t ts_log_deinit(void) { + if (atomic_exchange(&s_log_lifecycle_busy, true)) + return ESP_ERR_INVALID_STATE; if (!s_log_ctx.initialized) { + atomic_store(&s_log_lifecycle_busy, false); return ESP_ERR_INVALID_STATE; } - + xSemaphoreTake(s_log_io_mutex, portMAX_DELAY); xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); - - // 关闭日志文件 - if (s_log_ctx.log_file != NULL) { - fclose(s_log_ctx.log_file); - s_log_ctx.log_file = NULL; - } - - // 释放缓冲区 - if (s_log_ctx.buffer.entries != NULL) { - free(s_log_ctx.buffer.entries); - s_log_ctx.buffer.entries = NULL; - } - - // 释放标签级别列表 - ts_log_tag_level_t *tag = s_log_ctx.tag_levels; - while (tag != NULL) { - ts_log_tag_level_t *next = tag->next; - free(tag); - tag = next; + if (s_log_ctx.active_writers) { + xSemaphoreGive(s_log_ctx.mutex); + xSemaphoreGive(s_log_io_mutex); + atomic_store(&s_log_lifecycle_busy, false); + return ESP_ERR_INVALID_STATE; } + portENTER_CRITICAL(&s_capture_lock); + s_log_ctx.initialized = false; + if (s_log_ctx.esp_log_capture_enabled && s_log_ctx.original_vprintf) + esp_log_set_vprintf(s_log_ctx.original_vprintf); + s_log_ctx.esp_log_capture_enabled = false; + portEXIT_CRITICAL(&s_capture_lock); + ts_log_entry_t *entries = s_log_ctx.buffer.entries; + ts_log_tag_level_t *tags = s_log_ctx.tag_levels; + ts_log_callback_node_t *callbacks = s_log_ctx.callbacks; + s_log_ctx.buffer.entries = NULL; + s_log_ctx.buffer.count = 0; s_log_ctx.tag_levels = NULL; - - // 释放回调列表 - ts_log_callback_node_t *cb = s_log_ctx.callbacks; - while (cb != NULL) { - ts_log_callback_node_t *next = cb->next; - free(cb); - cb = next; - } s_log_ctx.callbacks = NULL; - + FILE *file = s_log_ctx.log_file; + s_log_ctx.log_file = NULL; xSemaphoreGive(s_log_ctx.mutex); - vSemaphoreDelete(s_log_ctx.mutex); - s_log_ctx.mutex = NULL; - - s_log_ctx.initialized = false; + if (file) + fclose(file); + xSemaphoreGive(s_log_io_mutex); + free(entries); + while (tags) { + ts_log_tag_level_t *next = tags->next; + free(tags); + tags = next; + } + while (callbacks) { + ts_log_callback_node_t *next = callbacks->next; + free(callbacks); + callbacks = next; + } + /* Mutex lifetime exceeds all hooks/readers that observed initialized=true. */ + atomic_store(&s_log_lifecycle_busy, false); return ESP_OK; } @@ -319,9 +350,19 @@ void ts_log_v(ts_log_level_t level, const char *tag, const char *format, va_list return; } + xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + if (!s_log_ctx.initialized) { + xSemaphoreGive(s_log_ctx.mutex); + return; + } + ++s_log_ctx.active_writers; + xSemaphoreGive(s_log_ctx.mutex); // 检查级别过滤 ts_log_level_t effective_level = get_effective_level(tag); if (level > effective_level) { + xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + --s_log_ctx.active_writers; + xSemaphoreGive(s_log_ctx.mutex); return; } @@ -342,19 +383,27 @@ void ts_log_v(ts_log_level_t level, const char *tag, const char *format, va_list } } - vsnprintf(entry.message, TS_LOG_MSG_MAX_LEN, format, args); + va_list preview; + va_copy(preview, args); + int needed = vsnprintf(entry.message, TS_LOG_MSG_MAX_LEN, format, preview); + va_end(preview); + if (ts_log_preview(entry.message, sizeof(entry.message), entry.message, + needed >= TS_LOG_MSG_MAX_LEN)) + atomic_fetch_add(&s_log_ctx.capture_truncated, 1); // 输出到各目标 - xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + xSemaphoreTake(s_log_io_mutex, portMAX_DELAY); if (s_log_ctx.output_mask & TS_LOG_OUTPUT_CONSOLE) { - log_output_console(&entry); + log_output_console(&entry, format, args); } if (s_log_ctx.output_mask & TS_LOG_OUTPUT_FILE) { log_output_file(&entry); } + xSemaphoreGive(s_log_io_mutex); + xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); if (s_log_ctx.output_mask & TS_LOG_OUTPUT_BUFFER) { log_output_buffer(&entry); } @@ -363,6 +412,9 @@ void ts_log_v(ts_log_level_t level, const char *tag, const char *format, va_list // 通知回调(在锁外调用) notify_callbacks(&entry); + xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + --s_log_ctx.active_writers; + xSemaphoreGive(s_log_ctx.mutex); } void ts_log_hex(ts_log_level_t level, const char *tag, const void *data, size_t length) @@ -523,7 +575,7 @@ esp_err_t ts_log_set_file_path(const char *path) return ESP_ERR_INVALID_ARG; } - xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + xSemaphoreTake(s_log_io_mutex, portMAX_DELAY); // 关闭当前文件 if (s_log_ctx.log_file != NULL) { @@ -535,19 +587,19 @@ esp_err_t ts_log_set_file_path(const char *path) s_log_ctx.file_index = 0; s_log_ctx.file_size = 0; - xSemaphoreGive(s_log_ctx.mutex); + xSemaphoreGive(s_log_io_mutex); return ESP_OK; } esp_err_t ts_log_flush(void) { - xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + xSemaphoreTake(s_log_io_mutex, portMAX_DELAY); if (s_log_ctx.log_file != NULL) { fflush(s_log_ctx.log_file); } - xSemaphoreGive(s_log_ctx.mutex); + xSemaphoreGive(s_log_io_mutex); return ESP_OK; } @@ -567,6 +619,10 @@ size_t ts_log_buffer_get(ts_log_entry_t *entries, size_t max_count, size_t start } xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + if (!s_log_ctx.initialized || !s_log_ctx.buffer.entries) { + xSemaphoreGive(s_log_ctx.mutex); + return 0; + } size_t count = s_log_ctx.buffer.count; if (start_index >= count) { @@ -621,6 +677,14 @@ esp_err_t ts_log_add_callback(ts_log_callback_t callback, node->user_data = user_data; xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + unsigned count = 0; + for (ts_log_callback_node_t *n = s_log_ctx.callbacks; n; n = n->next) + ++count; + if (!s_log_ctx.initialized || count == 8) { + xSemaphoreGive(s_log_ctx.mutex); + free(node); + return ESP_ERR_NO_MEM; + } node->next = s_log_ctx.callbacks; s_log_ctx.callbacks = node; xSemaphoreGive(s_log_ctx.mutex); @@ -646,6 +710,10 @@ esp_err_t ts_log_remove_callback(ts_log_callback_handle_t handle) while (node != NULL) { if (node == target) { + if (node->readers) { + xSemaphoreGive(s_log_ctx.mutex); + return ESP_ERR_INVALID_STATE; + } if (prev == NULL) { s_log_ctx.callbacks = node->next; } else { @@ -724,44 +792,19 @@ const char *ts_log_level_color(ts_log_level_t level) * 私有函数实现 * ========================================================================== */ -static void log_output_console(const ts_log_entry_t *entry) -{ - static const char level_chars[] = { 'N', 'E', 'W', 'I', 'D', 'V' }; - char level_char = (entry->level < TS_LOG_MAX) ? level_chars[entry->level] : '?'; - - if (s_log_ctx.colors_enabled) { - const char *color = ts_log_level_color(entry->level); - - if (s_log_ctx.timestamp_enabled) { - printf("%s%c (%lu) %s: %s%s\n", - color, - level_char, - (unsigned long)entry->timestamp_ms, - entry->tag, - entry->message, - LOG_RESET_COLOR); - } else { - printf("%s%c %s: %s%s\n", - color, - level_char, - entry->tag, - entry->message, - LOG_RESET_COLOR); - } - } else { - if (s_log_ctx.timestamp_enabled) { - printf("%c (%lu) %s: %s\n", - level_char, - (unsigned long)entry->timestamp_ms, - entry->tag, - entry->message); - } else { - printf("%c %s: %s\n", - level_char, - entry->tag, - entry->message); - } - } +static void log_output_console(const ts_log_entry_t *entry, const char *format, va_list args) { + static const char levels[] = "NEWIDV"; + char level = entry->level >= 0 && entry->level < TS_LOG_MAX ? levels[entry->level] : '?'; + const char *color = s_log_ctx.colors_enabled ? ts_log_level_color(entry->level) : ""; + if (s_log_ctx.timestamp_enabled) + printf("%s%c (%lu) %s: ", color, level, (unsigned long)entry->timestamp_ms, entry->tag); + else + printf("%s%c %s: ", color, level, entry->tag); + va_list output; + va_copy(output, args); + vprintf(format, output); + va_end(output); + printf("%s\n", s_log_ctx.colors_enabled ? LOG_RESET_COLOR : ""); } static void log_output_file(const ts_log_entry_t *entry) @@ -814,40 +857,63 @@ static void log_output_buffer(const ts_log_entry_t *entry) if (s_log_ctx.buffer.count < s_log_ctx.buffer.capacity) { s_log_ctx.buffer.count++; + } else { + ++s_log_ctx.logs_dropped; } } +static TaskHandle_t callback_tasks[8]; static void notify_callbacks(const ts_log_entry_t *entry) { + /* Bounded snapshot; removal returns BUSY while its user_data is borrowed. */ + ts_log_callback_node_t *snapshot[8]; + unsigned count = 0; + TaskHandle_t task = xTaskGetCurrentTaskHandle(); + int slot = -1; xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); - - ts_log_callback_node_t *node = s_log_ctx.callbacks; - while (node != NULL) { - if (entry->level <= node->min_level && node->callback != NULL) { - node->callback(entry, node->user_data); + for (unsigned i = 0; i < 8; i++) { + if (callback_tasks[i] == task) { + xSemaphoreGive(s_log_ctx.mutex); + return; + } + if (!callback_tasks[i] && slot < 0) + slot = i; + } + if (slot < 0) { + xSemaphoreGive(s_log_ctx.mutex); + return; + } + callback_tasks[slot] = task; + for (ts_log_callback_node_t *n = s_log_ctx.callbacks; n && count < 8; n = n->next) { + if (entry->level <= n->min_level && n->callback) { + ++n->readers; + snapshot[count++] = n; } - node = node->next; } - + xSemaphoreGive(s_log_ctx.mutex); + for (unsigned i = 0; i < count; ++i) { + snapshot[i]->callback(entry, snapshot[i]->user_data); + xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + --snapshot[i]->readers; + xSemaphoreGive(s_log_ctx.mutex); + } + xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + callback_tasks[slot] = NULL; xSemaphoreGive(s_log_ctx.mutex); } static ts_log_level_t get_effective_level(const char *tag) { - if (tag == NULL) { - return s_log_ctx.global_level; - } - - // 在锁外快速检查(可能存在竞争,但影响不大) - ts_log_tag_level_t *node = s_log_ctx.tag_levels; - while (node != NULL) { - if (strcmp(node->tag, tag) == 0) { - return node->level; + xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + ts_log_level_t level = s_log_ctx.global_level; + for (ts_log_tag_level_t *n = s_log_ctx.tag_levels; tag && n; n = n->next) { + if (!strcmp(n->tag, tag)) { + level = n->level; + break; } - node = node->next; } - - return s_log_ctx.global_level; + xSemaphoreGive(s_log_ctx.mutex); + return level; } /** @@ -889,14 +955,13 @@ static void rotate_log_file(void) * ESP_LOG 格式: "\033[0;32mI (12345) tag: message\033[0m" * 或无颜色格式: "I (12345) tag: message" */ -static void parse_esp_log_and_store(const char *log_line) -{ +static void parse_esp_log(const char *log_line, ts_log_entry_t *out, bool clipped) { if (log_line == NULL || log_line[0] == '\0') { return; } - ts_log_entry_t entry; - memset(&entry, 0, sizeof(entry)); + ts_log_entry_t *entry = out; + memset(entry, 0, sizeof(*entry)); const char *p = log_line; @@ -909,18 +974,29 @@ static void parse_esp_log_and_store(const char *log_line) // 解析日志级别字符 (E/W/I/D/V) char level_char = *p; switch (level_char) { - case 'E': entry.level = TS_LOG_ERROR; break; - case 'W': entry.level = TS_LOG_WARN; break; - case 'I': entry.level = TS_LOG_INFO; break; - case 'D': entry.level = TS_LOG_DEBUG; break; - case 'V': entry.level = TS_LOG_VERBOSE; break; - default: - // 非标准日志格式,作为 INFO 级别存储 - entry.level = TS_LOG_INFO; - strncpy(entry.tag, "system", TS_LOG_TAG_MAX_LEN - 1); - strncpy(entry.message, log_line, TS_LOG_MSG_MAX_LEN - 1); - entry.timestamp_ms = (uint32_t)(esp_timer_get_time() / 1000); - goto store_entry; + case 'E': + entry->level = TS_LOG_ERROR; + break; + case 'W': + entry->level = TS_LOG_WARN; + break; + case 'I': + entry->level = TS_LOG_INFO; + break; + case 'D': + entry->level = TS_LOG_DEBUG; + break; + case 'V': + entry->level = TS_LOG_VERBOSE; + break; + default: + // 非标准日志格式,作为 INFO 级别存储 + entry->level = TS_LOG_INFO; + strncpy(entry->tag, "system", TS_LOG_TAG_MAX_LEN - 1); + if (ts_log_preview(entry->message, sizeof(entry->message), log_line, clipped)) + atomic_fetch_add(&s_log_ctx.capture_truncated, 1); + entry->timestamp_ms = (uint32_t)(esp_timer_get_time() / 1000); + goto store_entry; } p++; @@ -930,10 +1006,10 @@ static void parse_esp_log_and_store(const char *log_line) // 解析时间戳 (12345) if (*p == '(') { p++; - entry.timestamp_ms = (uint32_t)strtoul(p, (char **)&p, 10); + entry->timestamp_ms = (uint32_t)strtoul(p, (char **)&p, 10); if (*p == ')') p++; } else { - entry.timestamp_ms = (uint32_t)(esp_timer_get_time() / 1000); + entry->timestamp_ms = (uint32_t)(esp_timer_get_time() / 1000); } // 跳过空格 @@ -944,8 +1020,8 @@ static void parse_esp_log_and_store(const char *log_line) while (*p && *p != ':') p++; size_t tag_len = p - tag_start; if (tag_len > 0 && tag_len < TS_LOG_TAG_MAX_LEN) { - strncpy(entry.tag, tag_start, tag_len); - entry.tag[tag_len] = '\0'; + strncpy(entry->tag, tag_start, tag_len); + entry->tag[tag_len] = '\0'; } // 跳过 ": " @@ -955,43 +1031,17 @@ static void parse_esp_log_and_store(const char *log_line) // 剩余部分是消息 const char *msg_start = p; - // 去除尾部的 ANSI 重置码和换行符 - size_t msg_len = strlen(msg_start); - while (msg_len > 0 && (msg_start[msg_len - 1] == '\n' || - msg_start[msg_len - 1] == '\r' || - msg_start[msg_len - 1] == 'm')) { - msg_len--; - // 检查是否是 ANSI 重置码结尾 - if (msg_len >= 3 && msg_start[msg_len - 3] == '\033') { - msg_len -= 3; // 跳过 \033[0 - } - } - - if (msg_len > 0 && msg_len < TS_LOG_MSG_MAX_LEN) { - strncpy(entry.message, msg_start, msg_len); - entry.message[msg_len] = '\0'; - } + if (ts_log_preview(entry->message, sizeof(entry->message), msg_start, clipped)) + atomic_fetch_add(&s_log_ctx.capture_truncated, 1); // 获取当前任务名 TaskHandle_t task = xTaskGetCurrentTaskHandle(); if (task != NULL) { - strncpy(entry.task_name, pcTaskGetName(task), sizeof(entry.task_name) - 1); + strncpy(entry->task_name, pcTaskGetName(task), sizeof(entry->task_name) - 1); } store_entry: - // 存入缓冲区(不需要互斥锁,因为调用者已经在临界区) - if (s_log_ctx.buffer.entries != NULL) { - // 直接写入,不调用 log_output_buffer 避免重复锁 - memcpy(&s_log_ctx.buffer.entries[s_log_ctx.buffer.head], &entry, sizeof(ts_log_entry_t)); - s_log_ctx.buffer.head = (s_log_ctx.buffer.head + 1) % s_log_ctx.buffer.capacity; - if (s_log_ctx.buffer.count < s_log_ctx.buffer.capacity) { - s_log_ctx.buffer.count++; - } - s_log_ctx.total_logs_captured++; - } - - // 通知回调(需要小心,回调中不能再打印日志) - // notify_callbacks(&entry); // 暂时禁用,避免递归 + return; } /** @@ -999,41 +1049,48 @@ static void parse_esp_log_and_store(const char *log_line) */ static int ts_log_vprintf_hook(const char *fmt, va_list args) { - // 临时缓冲区格式化日志 - static char log_buffer[512]; - static bool in_hook = false; // 防止递归 - - // 防止递归调用(某些情况下 vprintf 可能被嵌套调用) - if (in_hook) { - if (s_log_ctx.original_vprintf) { - return s_log_ctx.original_vprintf(fmt, args); + vprintf_like_t output = atomic_load(&s_log_ctx.original_vprintf); + if (!output || output == ts_log_vprintf_hook) + output = vprintf; + va_list console_args; + va_copy(console_args, args); + int result = output(fmt, console_args); + va_end(console_args); + if (!atomic_load(&s_log_ctx.esp_log_capture_enabled)) + return result; + int slot = -1; + portENTER_CRITICAL(&s_capture_lock); + for (unsigned i = 0; i < 2; ++i) + if (!s_capture[i].busy) { + s_capture[i].busy = true; + slot = (int)i; + break; } - return vprintf(fmt, args); - } - - in_hook = true; - - // 格式化日志到缓冲区 - int len = vsnprintf(log_buffer, sizeof(log_buffer), fmt, args); - - // 解析并存储日志(跳过空行) - if (len > 0 && log_buffer[0] != '\n' && log_buffer[0] != '\r') { - // 使用快速锁保护缓冲区访问 - if (s_log_ctx.mutex && xSemaphoreTake(s_log_ctx.mutex, pdMS_TO_TICKS(10)) == pdTRUE) { - parse_esp_log_and_store(log_buffer); + portEXIT_CRITICAL(&s_capture_lock); + if (slot < 0) { + atomic_fetch_add(&s_log_ctx.capture_dropped, 1); + return result; + } + va_list preview_args; + va_copy(preview_args, args); + int len = vsnprintf(s_capture[slot].text, sizeof(s_capture[slot].text), fmt, preview_args); + va_end(preview_args); + if (len > 0) { + parse_esp_log(s_capture[slot].text, &s_capture[slot].entry, + (size_t)len >= sizeof(s_capture[slot].text)); + if (s_log_ctx.mutex && xSemaphoreTake(s_log_ctx.mutex, 0) == pdTRUE) { + if (s_log_ctx.initialized && s_log_ctx.esp_log_capture_enabled) { + log_output_buffer(&s_capture[slot].entry); + ++s_log_ctx.total_logs_captured; + } xSemaphoreGive(s_log_ctx.mutex); - } - } - - in_hook = false; - - // 调用原始 vprintf 输出到控制台 - if (s_log_ctx.original_vprintf) { - // 需要重新创建 va_list,因为已经被消费 - // 直接用已格式化的字符串输出 - return printf("%s", log_buffer); + } else + atomic_fetch_add(&s_log_ctx.capture_dropped, 1); } - return printf("%s", log_buffer); + portENTER_CRITICAL(&s_capture_lock); + s_capture[slot].busy = false; + portEXIT_CRITICAL(&s_capture_lock); + return result; } /* ============================================================================ @@ -1056,6 +1113,8 @@ esp_err_t ts_log_get_stats(ts_log_stats_t *stats) stats->buffer_count = s_log_ctx.buffer.count; stats->total_captured = s_log_ctx.total_logs_captured; stats->dropped = s_log_ctx.logs_dropped; + stats->capture_dropped = atomic_load(&s_log_ctx.capture_dropped); + stats->capture_truncated = atomic_load(&s_log_ctx.capture_truncated); stats->esp_log_capture_enabled = s_log_ctx.esp_log_capture_enabled; xSemaphoreGive(s_log_ctx.mutex); @@ -1071,6 +1130,10 @@ size_t ts_log_buffer_search(ts_log_entry_t *entries, size_t max_count, } xSemaphoreTake(s_log_ctx.mutex, portMAX_DELAY); + if (!s_log_ctx.buffer.entries) { + xSemaphoreGive(s_log_ctx.mutex); + return 0; + } size_t found = 0; size_t count = s_log_ctx.buffer.count; @@ -1118,7 +1181,8 @@ void ts_log_enable_esp_capture(bool enable) return; } - if (enable && !s_log_ctx.esp_log_capture_enabled) { + portENTER_CRITICAL(&s_capture_lock); + if (enable && s_log_ctx.initialized && !s_log_ctx.esp_log_capture_enabled) { // 安装钩子 s_log_ctx.original_vprintf = esp_log_set_vprintf(ts_log_vprintf_hook); s_log_ctx.esp_log_capture_enabled = true; @@ -1129,4 +1193,5 @@ void ts_log_enable_esp_capture(bool enable) } s_log_ctx.esp_log_capture_enabled = false; } + portEXIT_CRITICAL(&s_capture_lock); } diff --git a/components/ts_core/ts_log/src/ts_log_preview.h b/components/ts_core/ts_log/src/ts_log_preview.h new file mode 100644 index 0000000..698b09a --- /dev/null +++ b/components/ts_core/ts_log/src/ts_log_preview.h @@ -0,0 +1,59 @@ +#pragma once +#include +#include +#include +/* Fixed UTF-8 prefix; strip complete CSI only. No allocation, no logging. */ +static bool ts_log_preview(char *dst, size_t cap, const char *src, bool clipped) { + size_t n = 0; + while (*src) { + const unsigned char *p = (const unsigned char *)src; + if (p[0] == 27 && p[1] == '[') { + size_t k = 2; + while (p[k] >= 0x20 && p[k] <= 0x3f) + ++k; + if (p[k] >= 0x40 && p[k] <= 0x7e) { + src += k + 1; + continue; + } + } + size_t bytes = + p[0] < 0x80 + ? 1 + : (p[0] >= 0xc2 && p[0] <= 0xdf + ? 2 + : (p[0] >= 0xe0 && p[0] <= 0xef ? 3 + : (p[0] >= 0xf0 && p[0] <= 0xf4 ? 4 : 0))); + bool valid = bytes != 0; + for (size_t i = 1; valid && i < bytes; ++i) + valid = p[i] >= 0x80 && p[i] <= 0xbf; + if (valid && bytes == 3) + valid = !(p[0] == 0xe0 && p[1] < 0xa0) && !(p[0] == 0xed && p[1] >= 0xa0); + if (valid && bytes == 4) + valid = !(p[0] == 0xf0 && p[1] < 0x90) && !(p[0] == 0xf4 && p[1] >= 0x90); + if (!valid) { + clipped = true; + break; + } + if (n + bytes + 1 > cap) { + clipped = true; + break; + } + memcpy(dst + n, src, bytes); + n += bytes; + src += bytes; + } + while (n && (dst[n - 1] == '\r' || dst[n - 1] == '\n')) + --n; + if (clipped && cap >= 5) { + while (n > cap - 5) { + --n; + while (n && ((unsigned char)dst[n] & 0xc0) == 0x80) + --n; + } + memcpy(dst + n, " ...", 4); + n += 4; + } + if (cap) + dst[n] = 0; + return clipped; +} diff --git a/components/ts_core/ts_service/src/ts_service.c b/components/ts_core/ts_service/src/ts_service.c index c1f39aa..df01479 100644 --- a/components/ts_core/ts_service/src/ts_service.c +++ b/components/ts_core/ts_service/src/ts_service.c @@ -490,7 +490,8 @@ esp_err_t ts_service_restart(ts_service_handle_t handle) ESP_LOGI(TAG, "Restarting service: %s", service->def.name); esp_err_t ret = ts_service_stop(handle); - if (ret != ESP_OK && ret != ESP_ERR_INVALID_STATE) { + if (ret != ESP_OK && (ret != ESP_ERR_INVALID_STATE || + service->state == TS_SERVICE_STATE_RUNNING)) { return ret; } @@ -910,7 +911,9 @@ static esp_err_t stop_service_internal(ts_service_instance_t *service) if (ret != ESP_OK) { ESP_LOGW(TAG, "Service '%s' stop returned error: %s", service->def.name, esp_err_to_name(ret)); - // 继续停止流程 + /* Failed stop retains the service and its resources for a later retry. */ + set_service_state(service, old_state); + return ret; } } diff --git a/components/ts_https/include/ts_https.h b/components/ts_https/include/ts_https.h index 8f78d34..9c23063 100644 --- a/components/ts_https/include/ts_https.h +++ b/components/ts_https/include/ts_https.h @@ -302,6 +302,19 @@ bool ts_https_role_has_permission(ts_https_role_t user_role, ts_https_role_t req */ httpd_handle_t ts_https_get_handle(void); +/* Published runtime view, copied under a short critical section. No TLS calls in GET. */ +typedef struct { + bool running; + bool require_client_cert; + uint16_t port; + uint32_t loaded_generation; + char loaded_certificate_sha256[65]; + char last_error_stage[24]; + esp_err_t last_error; +} ts_https_runtime_t; +void ts_https_get_runtime(ts_https_runtime_t *out); +void ts_https_record_error(const char *stage, esp_err_t error); + #ifdef __cplusplus } #endif diff --git a/components/ts_https/src/ts_https.c b/components/ts_https/src/ts_https.c index fec639c..86fc1dd 100644 --- a/components/ts_https/src/ts_https.c +++ b/components/ts_https/src/ts_https.c @@ -7,6 +7,9 @@ */ #include "ts_https.h" +#include "ts_cert_time.h" +#include "mbedtls/platform_util.h" +#include "freertos/FreeRTOS.h" #include "ts_https_internal.h" #include "ts_cert.h" #include "esp_https_server.h" @@ -43,6 +46,30 @@ static const char *TAG = "ts_https"; static httpd_handle_t s_server = NULL; static bool s_initialized = false; +static ts_cert_snapshot_t s_material; +static portMUX_TYPE s_runtime_lock = portMUX_INITIALIZER_UNLOCKED; +static ts_https_runtime_t s_runtime = {.port = 443, .require_client_cert = true}; +void ts_https_get_runtime(ts_https_runtime_t *out) +{ + if (!out) return; + portENTER_CRITICAL(&s_runtime_lock); *out = s_runtime; portEXIT_CRITICAL(&s_runtime_lock); +} +void ts_https_record_error(const char *stage, esp_err_t error) +{ + portENTER_CRITICAL(&s_runtime_lock); + s_runtime.last_error = error; + snprintf(s_runtime.last_error_stage, sizeof(s_runtime.last_error_stage), "%s", error == ESP_OK ? "" : stage); + portEXIT_CRITICAL(&s_runtime_lock); +} +static void publish_running(bool running) +{ + portENTER_CRITICAL(&s_runtime_lock); + s_runtime.running = running; + s_runtime.loaded_generation = running ? s_material.generation : 0; + snprintf(s_runtime.loaded_certificate_sha256, sizeof(s_runtime.loaded_certificate_sha256), + "%s", running ? s_material.certificate_sha256 : ""); + portEXIT_CRITICAL(&s_runtime_lock); +} static ts_https_config_t s_config; // Certificate buffers (loaded from ts_cert) @@ -81,22 +108,11 @@ esp_err_t ts_https_init(const ts_https_config_t *config) s_config = (ts_https_config_t)TS_HTTPS_CONFIG_DEFAULT(); } - // Check if PKI is ready - ts_cert_pki_status_t pki_status; - esp_err_t ret = ts_cert_get_status(&pki_status); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to get PKI status: %s", esp_err_to_name(ret)); - return ret; - } - - if (pki_status.status != TS_CERT_STATUS_ACTIVATED) { - ESP_LOGE(TAG, "PKI not activated (status=%d), cannot start HTTPS", - pki_status.status); - return ESP_ERR_INVALID_STATE; - } - - // Load certificates - ret = load_certificates(); + portENTER_CRITICAL(&s_runtime_lock); + s_runtime.port = s_config.port; + s_runtime.require_client_cert = s_config.require_client_cert; + portEXIT_CRITICAL(&s_runtime_lock); + esp_err_t ret = load_certificates(); if (ret != ESP_OK) { ESP_LOGE(TAG, "Failed to load certificates: %s", esp_err_to_name(ret)); return ret; @@ -114,7 +130,7 @@ esp_err_t ts_https_init(const ts_https_config_t *config) void ts_https_deinit(void) { if (s_server) { - ts_https_stop(); + if (ts_https_stop() != ESP_OK) return; } free_certificates(); @@ -130,74 +146,18 @@ void ts_https_deinit(void) static esp_err_t load_certificates(void) { - esp_err_t ret; - - // Allocate buffers - s_server_cert = heap_caps_malloc(TS_CERT_PEM_MAX_LEN, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - s_server_key = heap_caps_malloc(TS_CERT_KEY_MAX_LEN, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - s_ca_chain = heap_caps_malloc(TS_CERT_CA_CHAIN_MAX_LEN, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - - if (!s_server_cert || !s_server_key || !s_ca_chain) { - ESP_LOGE(TAG, "Failed to allocate certificate buffers"); - free_certificates(); - return ESP_ERR_NO_MEM; - } - - // Load server certificate - size_t cert_len = TS_CERT_PEM_MAX_LEN; - ret = ts_cert_get_certificate(s_server_cert, &cert_len); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to load server certificate: %s", esp_err_to_name(ret)); - free_certificates(); - return ret; - } - ESP_LOGI(TAG, "Server certificate loaded (%d bytes)", (int)cert_len); - - // Load private key - size_t key_len = TS_CERT_KEY_MAX_LEN; - ret = ts_cert_get_private_key(s_server_key, &key_len); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to load private key: %s", esp_err_to_name(ret)); - free_certificates(); - return ret; - } - ESP_LOGI(TAG, "Private key loaded (%d bytes)", (int)key_len); - - // Load CA chain (for client certificate verification) - size_t ca_len = TS_CERT_CA_CHAIN_MAX_LEN; - ret = ts_cert_get_ca_chain(s_ca_chain, &ca_len); - if (ret != ESP_OK) { - ESP_LOGW(TAG, "No CA chain loaded: %s", esp_err_to_name(ret)); - // This is okay if we don't require client certs - if (s_config.require_client_cert) { - ESP_LOGE(TAG, "CA chain required for mTLS but not available"); - free_certificates(); - return ret; - } - } else { - ESP_LOGI(TAG, "CA chain loaded (%d bytes)", (int)ca_len); - } - + esp_err_t ret = ts_cert_get_snapshot(s_config.require_client_cert, &s_material); + if (ret != ESP_OK) return ret; + s_server_cert = s_material.certificate; + s_server_key = s_material.key; + s_ca_chain = s_material.ca; return ESP_OK; } static void free_certificates(void) { - if (s_server_cert) { - // Clear sensitive data before freeing - memset(s_server_cert, 0, TS_CERT_PEM_MAX_LEN); - free(s_server_cert); - s_server_cert = NULL; - } - if (s_server_key) { - memset(s_server_key, 0, TS_CERT_KEY_MAX_LEN); - free(s_server_key); - s_server_key = NULL; - } - if (s_ca_chain) { - free(s_ca_chain); - s_ca_chain = NULL; - } + ts_cert_free_snapshot(&s_material); + s_server_cert = s_server_key = s_ca_chain = NULL; } /*===========================================================================*/ @@ -213,7 +173,7 @@ esp_err_t ts_https_start(void) if (s_server) { ESP_LOGW(TAG, "Server already running"); - return ESP_OK; + return ts_https_is_running() ? ESP_OK : ESP_ERR_INVALID_STATE; } // Configure HTTPS server @@ -253,7 +213,7 @@ esp_err_t ts_https_start(void) // Session tickets for faster reconnection config.httpd.enable_so_linger = false; - // Start server + // Retain a failed candidate handle if its stop fails, but do not publish it. esp_err_t ret = httpd_ssl_start(&s_server, &config); if (ret != ESP_OK) { ESP_LOGE(TAG, "Failed to start HTTPS server: %s", esp_err_to_name(ret)); @@ -268,9 +228,17 @@ esp_err_t ts_https_start(void) .handler = generic_handler, .user_ctx = &s_endpoints[i] }; - httpd_register_uri_handler(s_server, &uri_handler); + ret = httpd_register_uri_handler(s_server, &uri_handler); + if (ret != ESP_OK) { + ts_https_record_error("register_uri", ret); + esp_err_t stop = ts_https_stop(); + if (stop != ESP_OK) ts_https_record_error("cleanup", stop); + return ret; + } } + publish_running(true); + ts_https_record_error("", ESP_OK); ESP_LOGI(TAG, "HTTPS server started on port %d with %d endpoints", s_config.port, s_endpoint_count); @@ -284,7 +252,8 @@ esp_err_t ts_https_stop(void) } esp_err_t ret = httpd_ssl_stop(s_server); - s_server = NULL; + if (ret == ESP_OK) { s_server = NULL; publish_running(false); } + else ts_https_record_error("stop", ret); if (ret == ESP_OK) { ESP_LOGI(TAG, "HTTPS server stopped"); @@ -295,7 +264,9 @@ esp_err_t ts_https_stop(void) bool ts_https_is_running(void) { - return s_server != NULL; + ts_https_runtime_t runtime; + ts_https_get_runtime(&runtime); + return runtime.running; } httpd_handle_t ts_https_get_handle(void) @@ -489,22 +460,13 @@ static void extract_auth_from_cert(const mbedtls_x509_crt *cert, ts_https_auth_t ESP_LOGI(TAG, "Client cert OU='%s' -> role=%s", buf, ts_https_role_to_str(auth->role)); } - // 计算证书有效天数 - // mbedtls_x509_time 包含 year, mon, day, hour, min, sec - // 这里简单估算剩余天数 - time_t now; - time(&now); - struct tm *tm_now = gmtime(&now); - if (tm_now) { - int years_diff = cert->valid_to.year - (tm_now->tm_year + 1900); - int months_diff = cert->valid_to.mon - (tm_now->tm_mon + 1); - int days_diff = cert->valid_to.day - tm_now->tm_mday; - auth->cert_days_remaining = years_diff * 365 + months_diff * 30 + days_diff; - if (auth->cert_days_remaining < 0) { - auth->cert_days_remaining = 0; // 已过期 - } - } - + int64_t expiry; + time_t now = time(NULL); + auth->cert_days_remaining = 0; + if (now != (time_t)-1 && ts_cert_time_utc(cert->valid_to.year, cert->valid_to.mon, + cert->valid_to.day, cert->valid_to.hour, cert->valid_to.min, cert->valid_to.sec, &expiry)) + auth->cert_days_remaining = ts_cert_time_days(expiry - (int64_t)now); + auth->authenticated = true; } diff --git a/components/ts_https/src/ts_https_auth.c b/components/ts_https/src/ts_https_auth.c index b2b240d..18cb093 100644 --- a/components/ts_https/src/ts_https_auth.c +++ b/components/ts_https/src/ts_https_auth.c @@ -1,3 +1,4 @@ +#include "ts_cert_time.h" /** * @file ts_https_auth.c * @brief mTLS Authentication and Role Extraction @@ -134,25 +135,13 @@ esp_err_t ts_https_auth_from_cert(const mbedtls_x509_crt *cert, ts_https_auth_t ESP_LOGW(TAG, "No OU field in certificate, defaulting to viewer"); } - // Calculate days until expiry - // cert->valid_to is mbedtls_x509_time struct - // For simplicity, we'll use a rough calculation + int64_t expiry; time_t now = time(NULL); - struct tm cert_tm = { - .tm_year = cert->valid_to.year - 1900, - .tm_mon = cert->valid_to.mon - 1, - .tm_mday = cert->valid_to.day, - .tm_hour = cert->valid_to.hour, - .tm_min = cert->valid_to.min, - .tm_sec = cert->valid_to.sec - }; - time_t expiry = mktime(&cert_tm); - if (expiry > now) { - auth->cert_days_remaining = (int)((expiry - now) / (24 * 60 * 60)); - } else { - auth->cert_days_remaining = 0; - } - + auth->cert_days_remaining = 0; + if (now != (time_t)-1 && ts_cert_time_utc(cert->valid_to.year, cert->valid_to.mon, + cert->valid_to.day, cert->valid_to.hour, cert->valid_to.min, cert->valid_to.sec, &expiry)) + auth->cert_days_remaining = ts_cert_time_days(expiry - (int64_t)now); + ESP_LOGI(TAG, "Authenticated: %s (%s), role=%s, expires in %d days", auth->username, auth->organization, ts_https_role_to_str(auth->role), diff --git a/components/ts_net/src/ts_time_sync.c b/components/ts_net/src/ts_time_sync.c index f306a0f..df65c9b 100644 --- a/components/ts_net/src/ts_time_sync.c +++ b/components/ts_net/src/ts_time_sync.c @@ -31,6 +31,13 @@ static struct { .ntp_started = false, }; +static void notify_clock_updated(void) +{ + esp_err_t err = ts_event_post(TS_EVENT_BASE_TIME, TS_EVENT_TIME_SYNCED, + &s_time_sync.info, sizeof(s_time_sync.info), 0); + if (err != ESP_OK) ESP_LOGW(TAG, "Time notification lost: %s", esp_err_to_name(err)); +} + /* NTP 同步回调 */ static void time_sync_notification_cb(struct timeval *tv) { @@ -50,8 +57,7 @@ static void time_sync_notification_cb(struct timeval *tv) ESP_LOGI(TAG, "Local time: %s (%s)", strftime_buf, s_time_sync.timezone); /* 发布时间同步完成事件 */ - ts_event_post(TS_EVENT_BASE_TIME, TS_EVENT_TIME_SYNCED, - &s_time_sync.info, sizeof(s_time_sync.info), 0); + notify_clock_updated(); } esp_err_t ts_time_sync_init(const ts_time_sync_config_t *config) @@ -265,6 +271,7 @@ esp_err_t ts_time_sync_set_time(int64_t timestamp_ms, ts_time_source_t source) ESP_LOGI(TAG, "Time set from %s: %s (offset: %lld ms)", source_str, strftime_buf, (long long)(s_time_sync.info.offset_us / 1000)); + notify_clock_updated(); return ESP_OK; } @@ -306,7 +313,7 @@ bool ts_time_sync_needs_sync(void) time_t now; time(&now); struct tm timeinfo; - localtime_r(&now, &timeinfo); + if (now == (time_t)-1 || !gmtime_r(&now, &timeinfo)) return true; /* 如果年份 < 2025,说明系统时间无效(ESP32 默认 1970) */ return (timeinfo.tm_year + 1900) < TS_TIME_MIN_VALID_YEAR; diff --git a/components/ts_pki_client/src/ts_pki_client.c b/components/ts_pki_client/src/ts_pki_client.c index 4a7cad6..38583d5 100644 --- a/components/ts_pki_client/src/ts_pki_client.c +++ b/components/ts_pki_client/src/ts_pki_client.c @@ -11,6 +11,7 @@ * @copyright Copyright (c) 2026 TianShanOS Project */ +#include #include #include #include "freertos/FreeRTOS.h" @@ -39,8 +40,9 @@ static struct { char device_id[TS_CERT_DEVICE_ID_MAX_LEN]; int request_id; // CSR 提交后返回的请求 ID TaskHandle_t enroll_task; + _Atomic bool enroll_running; SemaphoreHandle_t mutex; - bool stop_requested; + _Atomic bool stop_requested; ts_pki_enroll_callback_t callback; void *callback_data; } s_client = {0}; @@ -144,6 +146,8 @@ void ts_pki_client_deinit(void) // 停止后台任务 ts_pki_client_stop_auto_enroll(); + if (s_client.enroll_running) { ESP_LOGW(TAG, "Enrollment still exiting; retaining resources"); return; } + // 释放资源 if (s_client.mutex) { vSemaphoreDelete(s_client.mutex); @@ -207,8 +211,9 @@ esp_err_t ts_pki_client_submit_csr(void) // 检查是否已有有效证书 ts_cert_pki_status_t cert_status; esp_err_t ret = ts_cert_get_status(&cert_status); - if (ret == ESP_OK && cert_status.status == TS_CERT_STATUS_ACTIVATED) { - ESP_LOGI(TAG, "Already have valid certificate"); + if (ret == ESP_OK && (cert_status.has_certificate && cert_status.has_private_key && + cert_status.cert_info.validity != TS_CERT_VALIDITY_EXPIRED)) { + ESP_LOGI(TAG, "Stored certificate retained; no automatic replacement"); return ESP_ERR_INVALID_STATE; } @@ -295,11 +300,17 @@ esp_err_t ts_pki_client_submit_csr(void) ESP_LOGI(TAG, "Certificate auto-issued!"); cJSON *ca_chain = cJSON_GetObjectItem(resp, "ca_chain"); // 安装证书 (mbedtls 需要包含 null 终止符) - ts_cert_install_certificate(cert->valuestring, strlen(cert->valuestring) + 1); + ret = ts_cert_install_certificate(cert->valuestring, strlen(cert->valuestring) + 1); // 安装 CA 链 - if (ca_chain && cJSON_IsString(ca_chain)) { - ts_cert_install_ca_chain(ca_chain->valuestring, strlen(ca_chain->valuestring) + 1); + if (ret == ESP_OK && ca_chain && cJSON_IsString(ca_chain)) { + ret = ts_cert_install_ca_chain(ca_chain->valuestring, strlen(ca_chain->valuestring) + 1); + } + if (ret == ESP_OK) { + ts_cert_pki_status_t installed; + ret = ts_cert_get_status(&installed); + if (ret == ESP_OK && (!installed.has_ca_chain || !installed.ca_valid)) ret = ESP_ERR_INVALID_STATE; } + if (ret != ESP_OK) { cJSON_Delete(resp); return ret; } } cJSON_Delete(resp); } @@ -443,11 +454,15 @@ esp_err_t ts_pki_client_install_certificate(void) // 安装 CA 链 if (ca_chain_str) { ret = ts_cert_install_ca_chain(ca_chain_str, strlen(ca_chain_str) + 1); - if (ret == ESP_OK) { - ESP_LOGI(TAG, "CA chain installed"); + if (ret != ESP_OK) { cJSON_Delete(root); return ret; } + } else { + ts_cert_pki_status_t installed; + ret = ts_cert_get_status(&installed); + if (ret != ESP_OK || (!installed.has_ca_chain || !installed.ca_valid)) { + cJSON_Delete(root); return ESP_ERR_INVALID_STATE; } } - + cJSON_Delete(root); ESP_LOGI(TAG, "Device certificate installed successfully"); @@ -522,7 +537,8 @@ esp_err_t ts_pki_client_start_auto_enroll(ts_pki_enroll_callback_t callback, return ESP_ERR_INVALID_STATE; } - if (s_client.enroll_task) { + bool expected = false; + if (!atomic_compare_exchange_strong(&s_client.enroll_running, &expected, true)) { ESP_LOGW(TAG, "Auto-enroll already running"); return ESP_OK; } @@ -537,6 +553,7 @@ esp_err_t ts_pki_client_start_auto_enroll(ts_pki_enroll_callback_t callback, BaseType_t ret = xTaskCreate(auto_enroll_task, "pki_enroll", 8192, NULL, 5, &s_client.enroll_task); if (ret != pdPASS) { + s_client.enroll_running = false; ESP_LOGE(TAG, "Failed to create enroll task"); return ESP_ERR_NO_MEM; } @@ -547,20 +564,19 @@ esp_err_t ts_pki_client_start_auto_enroll(ts_pki_enroll_callback_t callback, void ts_pki_client_stop_auto_enroll(void) { - if (!s_client.enroll_task) return; + if (!s_client.enroll_running) return; s_client.stop_requested = true; // 等待任务退出 for (int i = 0; i < 50; i++) { - if (!s_client.enroll_task) break; + if (!s_client.enroll_running) break; vTaskDelay(pdMS_TO_TICKS(100)); } - if (s_client.enroll_task) { - ESP_LOGW(TAG, "Force deleting enroll task"); - vTaskDelete(s_client.enroll_task); - s_client.enroll_task = NULL; + if (s_client.enroll_running) { + ESP_LOGW(TAG, "Enrollment cancellation pending; task retains its resources"); + return; } ESP_LOGI(TAG, "Auto-enrollment stopped"); @@ -568,7 +584,7 @@ void ts_pki_client_stop_auto_enroll(void) bool ts_pki_client_is_enrolling(void) { - return s_client.enroll_task != NULL; + return s_client.enroll_running; } /*===========================================================================*/ @@ -694,23 +710,35 @@ static esp_err_t do_http_request(const char *url, esp_http_client_method_t metho return ret; } +static void enroll_wait(uint32_t ms) +{ + while (ms && !s_client.stop_requested) { + uint32_t step = ms < 100 ? ms : 100; + vTaskDelay(pdMS_TO_TICKS(step)); ms -= step; + } +} + static void auto_enroll_task(void *arg) { ESP_LOGI(TAG, "Auto-enrollment task started"); // 等待网络就绪 - vTaskDelay(pdMS_TO_TICKS(5000)); + enroll_wait(5000); + if (s_client.stop_requested) goto done; + // 检查是否已有有效证书 ts_cert_pki_status_t cert_status; if (ts_cert_get_status(&cert_status) == ESP_OK && - cert_status.status == TS_CERT_STATUS_ACTIVATED) { - ESP_LOGI(TAG, "Already have valid certificate, exiting"); + (cert_status.has_certificate && cert_status.has_private_key && + cert_status.cert_info.validity != TS_CERT_VALIDITY_EXPIRED)) { + ESP_LOGI(TAG, "Stored certificate retained; checking readiness"); if (s_client.callback) { - s_client.callback(TS_PKI_ENROLL_APPROVED, "Already enrolled", + s_client.callback(ts_cert_prerequisites(&cert_status, true) ? TS_PKI_ENROLL_APPROVED : TS_PKI_ENROLL_PENDING, + "Credentials already stored; check time and CA readiness", s_client.callback_data); } - s_client.enroll_task = NULL; + s_client.enroll_running = false; vTaskDelete(NULL); return; } @@ -723,12 +751,12 @@ static void auto_enroll_task(void *arg) break; } ESP_LOGW(TAG, "PKI server not reachable, retrying..."); - vTaskDelay(pdMS_TO_TICKS(10000)); + enroll_wait(10000); retry++; } if (s_client.stop_requested) { - s_client.enroll_task = NULL; + s_client.enroll_running = false; vTaskDelete(NULL); return; } @@ -742,7 +770,7 @@ static void auto_enroll_task(void *arg) s_client.callback_data); } // 重试 - vTaskDelay(pdMS_TO_TICKS(60000)); + enroll_wait(60000); } if (s_client.callback) { @@ -765,8 +793,9 @@ static void auto_enroll_task(void *arg) break; } - vTaskDelay(pdMS_TO_TICKS(s_client.config.poll_interval_sec * 1000)); + enroll_wait(s_client.config.poll_interval_sec * 1000); + if (s_client.stop_requested) break; ret = ts_pki_client_check_status(&status); if (ret != ESP_OK) { ESP_LOGW(TAG, "Failed to check status, retrying..."); @@ -823,6 +852,6 @@ static void auto_enroll_task(void *arg) done: ESP_LOGI(TAG, "Auto-enrollment task finished"); - s_client.enroll_task = NULL; + s_client.enroll_running = false; vTaskDelete(NULL); } diff --git a/components/ts_security/CMakeLists.txt b/components/ts_security/CMakeLists.txt index e64f5a7..55e4244 100644 --- a/components/ts_security/CMakeLists.txt +++ b/components/ts_security/CMakeLists.txt @@ -13,6 +13,8 @@ idf_component_register( "src/ts_ssh_hosts_config.c" "src/ts_ssh_commands_config.c" "src/ts_ssh_log_watch.c" + "src/ts_ssh_probe.c" + "src/ts_ssh_service.c" INCLUDE_DIRS "include" REQUIRES diff --git a/components/ts_security/Kconfig b/components/ts_security/Kconfig index 29a7486..b3d15bd 100644 --- a/components/ts_security/Kconfig +++ b/components/ts_security/Kconfig @@ -29,4 +29,12 @@ menu "TianShanOS Security Configuration" default 4 depends on TS_SECURITY_ENABLE + config TS_SSH_LOG_WATCH_MAX + int "Maximum concurrent SSH log watchers" + range 1 32 + default 32 + help + Bounded control slots. Each active watcher uses the existing 8 KiB + task stack; no tasks are allocated for idle slots. + endmenu diff --git a/components/ts_security/include/ts_ssh_client.h b/components/ts_security/include/ts_ssh_client.h index 7cdc107..c26885f 100644 --- a/components/ts_security/include/ts_ssh_client.h +++ b/components/ts_security/include/ts_ssh_client.h @@ -51,6 +51,9 @@ typedef struct { } key; } auth; uint32_t timeout_ms; /**< Connection timeout in ms */ + bool (*cancelled)(void *context); /**< Optional owner cancellation callback */ + void *cancel_context; + size_t max_output_bytes; /**< Per-stream bound, default 64 KiB */ bool verify_host_key; /**< Verify server host key */ } ts_ssh_config_t; @@ -62,7 +65,7 @@ typedef struct { .auth_method = TS_SSH_AUTH_PASSWORD, \ .auth.password = NULL, \ .timeout_ms = 10000, \ - .verify_host_key = false \ + .verify_host_key = true \ } /** Command execution result */ @@ -114,6 +117,11 @@ esp_err_t ts_ssh_session_destroy(ts_ssh_session_t session); * @param session Session handle * @return esp_err_t ESP_OK on success */ +#define TS_SSH_ERR_HOST_UNKNOWN (ESP_ERR_INVALID_STATE + 0x400) +#define TS_SSH_ERR_HOST_CHANGED (ESP_ERR_INVALID_STATE + 0x401) +typedef esp_err_t (*ts_ssh_verify_cb_t)(ts_ssh_session_t session, void *context); +/* Callback is invoked after handshake and BEFORE any user authentication. */ +esp_err_t ts_ssh_connect_with_verifier(ts_ssh_session_t session, ts_ssh_verify_cb_t verify, void *context); esp_err_t ts_ssh_connect(ts_ssh_session_t session); /** diff --git a/components/ts_security/include/ts_ssh_log_watch.h b/components/ts_security/include/ts_ssh_log_watch.h index e1f2ce1..8c343a6 100644 --- a/components/ts_security/include/ts_ssh_log_watch.h +++ b/components/ts_security/include/ts_ssh_log_watch.h @@ -40,6 +40,9 @@ extern "C" { * @brief 日志监测配置 */ typedef struct { + uint32_t run_generation; + bool recovery_only; + char command_id[32]; char host_id[32]; /**< 主机 ID */ char log_file[256]; /**< 日志文件路径(如 /tmp/ts_nohup_xxx.log) */ char ready_pattern[128]; /**< 就绪匹配模式 */ @@ -52,7 +55,11 @@ typedef struct { /** * @brief 监测任务句柄(内部使用) */ -typedef void* ts_ssh_log_watch_handle_t; +typedef uint32_t ts_ssh_log_watch_handle_t; +esp_err_t ts_ssh_log_watch_init(void); +/* Stop requests are asynchronous; false means worker cleanup has completed. */ +bool ts_ssh_log_watch_pending(ts_ssh_log_watch_handle_t handle); +esp_err_t ts_ssh_log_watch_cancel_name(const char *var_name); /*===========================================================================*/ /* Public API */ diff --git a/components/ts_security/include/ts_ssh_probe.h b/components/ts_security/include/ts_ssh_probe.h new file mode 100644 index 0000000..924b4fa --- /dev/null +++ b/components/ts_security/include/ts_ssh_probe.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +/* Shell words are always single-quoted; inputs must be NUL terminated. */ +bool ts_ssh_shell_quote(const char *input, char *out, size_t capacity); +bool ts_ssh_log_probe_command(const char *path, const char *ready, const char *fail, + char *out, size_t capacity); +/* Exact protocol token, one optional LF/CRLF; no substring matching. */ +bool ts_ssh_probe_token(const char *output, const char *token); + +#ifdef __cplusplus +} +#endif diff --git a/components/ts_security/include/ts_ssh_service.h b/components/ts_security/include/ts_ssh_service.h new file mode 100644 index 0000000..84ef13a --- /dev/null +++ b/components/ts_security/include/ts_ssh_service.h @@ -0,0 +1,57 @@ +#pragma once +#include "ts_ssh_client.h" +#include "ts_ssh_commands_config.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char state[16], last_known[16], source[16]; + uint32_t generation; + int64_t confirmed_ms; + bool busy; +} ts_ssh_service_status_t; +esp_err_t ts_ssh_service_init(void); +void ts_ssh_service_safe_name(const ts_ssh_command_config_t *cmd, char out[32]); +/* reserve -> probe -> execute -> finish; network calls never hold registry lock */ +esp_err_t ts_ssh_service_begin(const ts_ssh_command_config_t *cmd, ts_ssh_session_t session, + uint32_t *generation); +bool ts_ssh_service_finish(const char *id, uint32_t generation, const char *receipt, ts_ssh_session_t session); +void ts_ssh_service_observe(const char *id, uint32_t generation, const char *state, const char *var_name); +esp_err_t ts_ssh_service_query(const char *id, ts_ssh_service_status_t *out); +esp_err_t ts_ssh_service_stop(const char *id, ts_ssh_service_status_t *out); +/* Conservative guard for mutation; unknown/active command bindings are protected. */ +bool ts_ssh_service_binding_busy(const char *id); +bool ts_ssh_service_launch_command(const ts_ssh_command_config_t *cmd, const char *expanded, + char *out, size_t capacity); + +void ts_ssh_binding_lock(void); +void ts_ssh_binding_unlock(void); +esp_err_t ts_ssh_service_pin(const ts_ssh_command_config_t *cmd, const char *host, uint16_t port, uint32_t *registration); +void ts_ssh_service_unpin(const char *id, uint32_t registration); +bool ts_ssh_service_start_admissible(const char *id); + +bool ts_ssh_service_command_protected(const char *id); +bool ts_ssh_service_host_protected(const char *host_id); + +void ts_ssh_service_cancel_observation(const char *id, uint32_t generation); +bool ts_ssh_service_any_in_use(void); +void ts_ssh_service_set_owner(const char *id, uint32_t registration, const char *rule); +bool ts_ssh_service_rule_protected(const char *rule); +/* Call deletion/forget while holding binding_gate; no network under that gate. */ +esp_err_t ts_ssh_service_delete_begin(const char *id, uint32_t *credential); +void ts_ssh_service_delete_finish(const char *id, uint32_t credential, bool removed); +void ts_ssh_service_forget_stopped(void); +esp_err_t ts_ssh_service_cached(const char *id, ts_ssh_service_status_t *out); +esp_err_t ts_ssh_service_verify_instance(const char *id, uint32_t generation, ts_ssh_session_t session); +bool ts_ssh_service_observation_valid(const char *id, uint32_t generation); +void ts_ssh_service_recovery_kick(const char *id); +bool ts_ssh_service_recover(const char *id, uint32_t generation); +void ts_ssh_service_recovery_done(const char *id, uint32_t generation); + +#ifdef __cplusplus +} +#endif diff --git a/components/ts_security/src/ts_security.c b/components/ts_security/src/ts_security.c index d3bdb02..e31c3b1 100644 --- a/components/ts_security/src/ts_security.c +++ b/components/ts_security/src/ts_security.c @@ -1,3 +1,5 @@ +#include "ts_ssh_log_watch.h" +#include "ts_ssh_service.h" /** * @file ts_security.c * @brief Security Subsystem Implementation @@ -54,6 +56,10 @@ esp_err_t ts_security_init(void) // 非致命错误,继续运行 } + ret = ts_ssh_service_init(); + if (ret != ESP_OK) return ret; + ret = ts_ssh_log_watch_init(); + if (ret != ESP_OK) return ret; s_initialized = true; TS_LOGI(TAG, "Security subsystem initialized"); return ESP_OK; diff --git a/components/ts_security/src/ts_ssh_client.c b/components/ts_security/src/ts_ssh_client.c index 82be18b..8a59d7e 100644 --- a/components/ts_security/src/ts_ssh_client.c +++ b/components/ts_security/src/ts_ssh_client.c @@ -4,31 +4,34 @@ * * This module provides SSH client functionality for TianShanOS, * using libssh2 library for full SSH2 protocol support. - * + * * 会话结构和缓冲区优先分配到 PSRAM */ #include "ts_ssh_client.h" -#include "ts_core.h" /* TS_MALLOC_PSRAM, TS_CALLOC_PSRAM */ #include "esp_log.h" +#include "esp_timer.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "ts_core.h" /* TS_MALLOC_PSRAM, TS_CALLOC_PSRAM */ +#include "ts_known_hosts.h" +#include #include #include -#include -#include #include -#include -#include -#include #include -#include +#include +#include +#include +#include #include +#include #include +#include #include -#include +#include static const char *TAG = "ts_ssh"; @@ -38,15 +41,16 @@ static const char *TAG = "ts_ssh"; /** SSH 会话内部结构 */ struct ts_ssh_session_s { - ts_ssh_config_t config; /**< 会话配置 */ - ts_ssh_state_t state; /**< 当前状态 */ - int sock; /**< Socket 文件描述符 */ - LIBSSH2_SESSION *session; /**< libssh2 会话句柄 */ - char error_msg[256]; /**< 最后的错误消息 */ - char *host_copy; /**< 主机地址副本 */ - char *username_copy; /**< 用户名副本 */ - char *password_copy; /**< 密码副本 */ - volatile bool abort_flag; /**< 中止标志 */ + ts_ssh_config_t config; /**< 会话配置 */ + ts_ssh_state_t state; /**< 当前状态 */ + int sock; /**< Socket 文件描述符 */ + LIBSSH2_SESSION *session; /**< libssh2 会话句柄 */ + char error_msg[256]; /**< 最后的错误消息 */ + char *host_copy; /**< 主机地址副本 */ + char *username_copy; /**< 用户名副本 */ + char *password_copy; /**< 密码副本 */ + atomic_bool abort_flag; + int64_t deadline_us; /**< 中止标志 */ }; /** 全局初始化标志 */ @@ -59,39 +63,45 @@ static bool s_initialized = false; /** * @brief 等待 socket 可读/可写 */ -static int wait_socket(int sock, LIBSSH2_SESSION *session, int timeout_ms) -{ - struct timeval timeout; - fd_set fd; - fd_set *readfd = NULL; - fd_set *writefd = NULL; - int dir; - - timeout.tv_sec = timeout_ms / 1000; - timeout.tv_usec = (timeout_ms % 1000) * 1000; - - FD_ZERO(&fd); - FD_SET(sock, &fd); - - /* 获取 libssh2 需要等待的方向 */ - dir = libssh2_session_block_directions(session); - - if (dir & LIBSSH2_SESSION_BLOCK_INBOUND) { - readfd = &fd; - } - - if (dir & LIBSSH2_SESSION_BLOCK_OUTBOUND) { - writefd = &fd; - } +static bool operation_expired(ts_ssh_session_t s) { + return atomic_load(&s->abort_flag) || + (s->config.cancelled && s->config.cancelled(s->config.cancel_context)) || + esp_timer_get_time() >= s->deadline_us; +} - return select(sock + 1, readfd, writefd, NULL, &timeout); +static int wait_socket(ts_ssh_session_t s) { + if (operation_expired(s)) + return -1; + int64_t left = s->deadline_us - esp_timer_get_time(); + if (left > 100000) + left = 100000; + if (left <= 0) + return -1; + struct timeval timeout = {.tv_sec = 0, .tv_usec = left}; + fd_set rd, wr; + FD_ZERO(&rd); + FD_ZERO(&wr); + int dir = + s->session ? libssh2_session_block_directions(s->session) : LIBSSH2_SESSION_BLOCK_OUTBOUND; + if (!dir) + dir = LIBSSH2_SESSION_BLOCK_INBOUND; + if (dir & LIBSSH2_SESSION_BLOCK_INBOUND) + FD_SET(s->sock, &rd); + if (dir & LIBSSH2_SESSION_BLOCK_OUTBOUND) + FD_SET(s->sock, &wr); + int rc = select(s->sock + 1, &rd, &wr, NULL, &timeout); + return (rc < 0 && errno != EINTR) || operation_expired(s) ? -1 : rc; } +/* Teardown cannot wait for a remote peer. These callbacks make all remaining + * libssh2 channel cleanup observe a disconnected transport (never EAGAIN). */ +static LIBSSH2_RECV_FUNC(closed_recv) { return 0; } +static LIBSSH2_SEND_FUNC(closed_send) { return -ENOTCONN; } + /** * @brief 设置错误消息 */ -static void set_error(ts_ssh_session_t session, const char *fmt, ...) -{ +static void set_error(ts_ssh_session_t session, const char *fmt, ...) { va_list args; va_start(args, fmt); vsnprintf(session->error_msg, sizeof(session->error_msg), fmt, args); @@ -102,8 +112,7 @@ static void set_error(ts_ssh_session_t session, const char *fmt, ...) /** * @brief 复制字符串 */ -static char *strdup_safe(const char *str) -{ +static char *strdup_safe(const char *str) { if (str == NULL) { return NULL; } @@ -118,8 +127,7 @@ static char *strdup_safe(const char *str) * 公开 API 实现 * ============================================================================ */ -esp_err_t ts_ssh_client_init(void) -{ +esp_err_t ts_ssh_client_init(void) { if (s_initialized) { return ESP_OK; } @@ -135,8 +143,7 @@ esp_err_t ts_ssh_client_init(void) return ESP_OK; } -esp_err_t ts_ssh_client_deinit(void) -{ +esp_err_t ts_ssh_client_deinit(void) { if (!s_initialized) { return ESP_OK; } @@ -147,8 +154,7 @@ esp_err_t ts_ssh_client_deinit(void) return ESP_OK; } -esp_err_t ts_ssh_session_create(const ts_ssh_config_t *config, ts_ssh_session_t *session_out) -{ +esp_err_t ts_ssh_session_create(const ts_ssh_config_t *config, ts_ssh_session_t *session_out) { if (!config || !session_out) { return ESP_ERR_INVALID_ARG; } @@ -176,7 +182,8 @@ esp_err_t ts_ssh_session_create(const ts_ssh_config_t *config, ts_ssh_session_t session->config = *config; session->config.port = config->port ? config->port : 22; session->config.timeout_ms = config->timeout_ms ? config->timeout_ms : 10000; - + + atomic_init(&session->abort_flag, false); /* 复制字符串(因为调用者可能释放原始字符串) */ session->host_copy = strdup_safe(config->host); session->username_copy = strdup_safe(config->username); @@ -188,19 +195,27 @@ esp_err_t ts_ssh_session_create(const ts_ssh_config_t *config, ts_ssh_session_t session->config.auth.password = session->password_copy; } + if (!session->host_copy || !session->username_copy || + (config->auth_method == TS_SSH_AUTH_PASSWORD && config->auth.password && + !session->password_copy)) { + free(session->host_copy); + free(session->username_copy); + free(session->password_copy); + free(session); + return ESP_ERR_NO_MEM; + } session->sock = -1; session->session = NULL; session->state = TS_SSH_STATE_DISCONNECTED; session->error_msg[0] = '\0'; *session_out = session; - ESP_LOGD(TAG, "Session created for %s@%s:%d", - session->config.username, session->config.host, session->config.port); + ESP_LOGD(TAG, "Session created for %s@%s:%d", session->config.username, session->config.host, + session->config.port); return ESP_OK; } -esp_err_t ts_ssh_session_destroy(ts_ssh_session_t session) -{ +esp_err_t ts_ssh_session_destroy(ts_ssh_session_t session) { if (!session) { return ESP_ERR_INVALID_ARG; } @@ -220,641 +235,260 @@ esp_err_t ts_ssh_session_destroy(ts_ssh_session_t session) return ESP_OK; } -esp_err_t ts_ssh_connect(ts_ssh_session_t session) -{ - if (!session) { - return ESP_ERR_INVALID_ARG; - } - - if (session->state == TS_SSH_STATE_CONNECTED) { - return ESP_OK; /* 已连接 */ - } - - session->state = TS_SSH_STATE_CONNECTING; - - /* 解析主机地址 */ - struct sockaddr_in sin; - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = htons(session->config.port); - sin.sin_addr.s_addr = inet_addr(session->config.host); - - /* 如果不是有效的 IP 地址,尝试 DNS 解析 */ - if (sin.sin_addr.s_addr == INADDR_NONE) { - struct hostent *hp = gethostbyname(session->config.host); - if (hp == NULL) { - set_error(session, "Failed to resolve host: %s", session->config.host); - session->state = TS_SSH_STATE_ERROR; - return ESP_FAIL; - } - memcpy(&sin.sin_addr, hp->h_addr, hp->h_length); - } +esp_err_t ts_ssh_connect(ts_ssh_session_t s) { return ts_ssh_connect_with_verifier(s, NULL, NULL); } - /* 创建 socket */ - session->sock = socket(AF_INET, SOCK_STREAM, 0); - if (session->sock < 0) { - set_error(session, "Failed to create socket: %s", strerror(errno)); - session->state = TS_SSH_STATE_ERROR; - return ESP_FAIL; - } - - /* 设置 socket 超时 */ - struct timeval tv; - tv.tv_sec = session->config.timeout_ms / 1000; - tv.tv_usec = (session->config.timeout_ms % 1000) * 1000; - setsockopt(session->sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - setsockopt(session->sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); - - /* 连接 */ - ESP_LOGI(TAG, "Connecting to %s:%d...", session->config.host, session->config.port); - if (connect(session->sock, (struct sockaddr *)&sin, sizeof(sin)) != 0) { - set_error(session, "Failed to connect: %s", strerror(errno)); - close(session->sock); - session->sock = -1; - session->state = TS_SSH_STATE_ERROR; - return ESP_FAIL; - } - - /* 创建 libssh2 会话 */ - session->session = libssh2_session_init(); - if (!session->session) { - set_error(session, "Failed to create SSH session"); - close(session->sock); - session->sock = -1; - session->state = TS_SSH_STATE_ERROR; - return ESP_FAIL; - } - - /* 设置非阻塞模式 */ - libssh2_session_set_blocking(session->session, 0); - - /* 执行 SSH 握手 */ - int rc; - while ((rc = libssh2_session_handshake(session->session, session->sock)) == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - } - - if (rc != 0) { - char *err_msg = NULL; - libssh2_session_last_error(session->session, &err_msg, NULL, 0); - set_error(session, "SSH handshake failed: %s (rc=%d)", err_msg ? err_msg : "unknown", rc); - libssh2_session_free(session->session); - session->session = NULL; - close(session->sock); - session->sock = -1; - session->state = TS_SSH_STATE_ERROR; - return ESP_FAIL; - } - - ESP_LOGD(TAG, "SSH handshake completed"); - session->state = TS_SSH_STATE_AUTHENTICATING; - - /* 执行认证 */ - if (session->config.auth_method == TS_SSH_AUTH_PASSWORD) { - /* 密码认证 */ - ESP_LOGD(TAG, "Authenticating with password..."); - while ((rc = libssh2_userauth_password(session->session, - session->config.username, - session->config.auth.password)) == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - } - } else { - /* 公钥认证 */ - - /* 首先检查服务器支持的认证方法(需要处理 EAGAIN) */ - char *userauthlist = NULL; - do { - userauthlist = libssh2_userauth_list(session->session, - session->config.username, - strlen(session->config.username)); - if (!userauthlist) { - int err = libssh2_session_last_errno(session->session); - if (err == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - continue; - } - /* 其他错误或已认证 */ - break; - } - } while (!userauthlist); - - if (userauthlist) { - ESP_LOGI(TAG, "Server authentication methods: %s", userauthlist); - if (!strstr(userauthlist, "publickey")) { - ESP_LOGW(TAG, "Server does not support publickey authentication!"); - } - } - - /* 优先使用文件路径方式(更可靠) */ - if (session->config.auth.key.private_key_path) { - const char *key_path = session->config.auth.key.private_key_path; - ESP_LOGI(TAG, "Authenticating with public key from file: %s", key_path); - - /* 验证文件存在且可读 */ - FILE *f = fopen(key_path, "r"); - if (!f) { - ESP_LOGE(TAG, "Cannot open private key file: %s (errno=%d)", key_path, errno); - set_error(session, "Cannot open private key file"); - libssh2_session_disconnect(session->session, "Key file error"); - libssh2_session_free(session->session); - session->session = NULL; - close(session->sock); - session->sock = -1; - session->state = TS_SSH_STATE_ERROR; - return ESP_ERR_NOT_FOUND; - } - - /* 读取并打印前 64 字节用于调试 */ - char header[65] = {0}; - size_t read_len = fread(header, 1, 64, f); - fseek(f, 0, SEEK_END); - long file_size = ftell(f); - fclose(f); - (void)read_len; /* 抑制未使用警告 */ - - ESP_LOGI(TAG, "Key file size: %ld bytes, header: %.40s...", file_size, header); - - /* 构造公钥文件路径 (私钥路径 + ".pub") */ - char pubkey_path[128]; - snprintf(pubkey_path, sizeof(pubkey_path), "%s.pub", key_path); - - /* 检查公钥文件是否存在 */ - const char *pubkey_ptr = NULL; - FILE *pub_f = fopen(pubkey_path, "r"); - if (pub_f) { - fclose(pub_f); - pubkey_ptr = pubkey_path; - ESP_LOGI(TAG, "Using public key file: %s", pubkey_path); - } else { - ESP_LOGW(TAG, "Public key file not found: %s (will derive from private key)", pubkey_path); - } - - /* 清除之前的错误状态 */ - libssh2_session_set_last_error(session->session, 0, NULL); - - while ((rc = libssh2_userauth_publickey_fromfile_ex( - session->session, - session->config.username, strlen(session->config.username), - pubkey_ptr, /* 公钥路径(如果存在) */ - key_path, - session->config.auth.key.passphrase)) == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - } - - if (rc != 0) { - char *err_msg = NULL; - int err_len = 0; - int err_code = libssh2_session_last_error(session->session, &err_msg, &err_len, 0); - ESP_LOGE(TAG, "libssh2_userauth_publickey_fromfile_ex failed: rc=%d, err_code=%d, err=%s", - rc, err_code, err_msg ? err_msg : "(null)"); - - /* 尝试使用 libssh2_userauth_publickey 回调方式 */ - ESP_LOGI(TAG, "Trying alternative authentication method..."); - } - } - /* 回退到内存方式 */ - else if (session->config.auth.key.private_key && - session->config.auth.key.private_key_len > 0) { - ESP_LOGI(TAG, "Authenticating with public key from memory (key_len=%zu)...", - session->config.auth.key.private_key_len); - - /* 打印私钥头部用于调试 */ - const char *key_data = (const char *)session->config.auth.key.private_key; - size_t key_len = session->config.auth.key.private_key_len; - ESP_LOGI(TAG, "Private key header: %.50s", key_data); - ESP_LOGI(TAG, "Private key length: %zu", key_len); - - /* 检查 PEM 格式 */ - if (strstr(key_data, "-----BEGIN RSA PRIVATE KEY-----")) { - ESP_LOGI(TAG, "Key type: RSA (PKCS#1)"); - } else if (strstr(key_data, "-----BEGIN EC PRIVATE KEY-----")) { - ESP_LOGI(TAG, "Key type: EC (ECDSA) - Note: libssh2 mbedTLS backend may not support ECDSA frommemory"); - } else if (strstr(key_data, "-----BEGIN PRIVATE KEY-----")) { - ESP_LOGI(TAG, "Key type: PKCS#8 - May require conversion to PKCS#1"); - } else if (strstr(key_data, "-----BEGIN OPENSSH PRIVATE KEY-----")) { - ESP_LOGE(TAG, "Key type: OpenSSH - NOT SUPPORTED! Please use PEM format (ssh-keygen -m PEM)"); - } else { - ESP_LOGW(TAG, "Key type: Unknown format"); - } - - /* - * libssh2_userauth_publickey_frommemory 内部需要获取认证方法列表 - * 如果之前没有调用过 libssh2_userauth_list,需要先调用一次 - * 确保 session 处于正确的状态 - */ - if (!userauthlist) { - do { - userauthlist = libssh2_userauth_list(session->session, - session->config.username, - strlen(session->config.username)); - if (!userauthlist) { - int err = libssh2_session_last_errno(session->session); - if (err == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - continue; - } - break; - } - } while (!userauthlist); - - if (userauthlist) { - ESP_LOGI(TAG, "Server authentication methods: %s", userauthlist); - } - } - - /* 清除之前的错误状态 */ - libssh2_session_set_last_error(session->session, 0, NULL); - - while ((rc = libssh2_userauth_publickey_frommemory( - session->session, - session->config.username, strlen(session->config.username), - NULL, 0, /* 公钥数据(可选) */ - (const char *)session->config.auth.key.private_key, - session->config.auth.key.private_key_len, - session->config.auth.key.passphrase)) == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - } - - if (rc != 0) { - char *err_msg = NULL; - int err_len = 0; - int err_code = libssh2_session_last_error(session->session, &err_msg, &err_len, 0); - ESP_LOGE(TAG, "libssh2_userauth_publickey_frommemory failed:"); - ESP_LOGE(TAG, " rc=%d, err_code=%d, err_msg=%s", - rc, err_code, err_msg ? err_msg : "(null)"); - - /* 提供更友好的错误提示 */ - if (rc == LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) { - ESP_LOGE(TAG, " Hint: Server rejected the public key. Check if key is authorized on server."); - } else if (rc == LIBSSH2_ERROR_FILE) { - ESP_LOGE(TAG, " Hint: Key format error. Make sure key is in PEM format (not OpenSSH format)."); - } else if (rc == LIBSSH2_ERROR_METHOD_NONE) { - ESP_LOGE(TAG, " Hint: No handler for this key type. Try RSA key instead of ECDSA."); - } else if (rc == -1 && (!err_msg || strlen(err_msg) == 0)) { - ESP_LOGE(TAG, " Hint: Unknown error (-1). Possible causes:"); - ESP_LOGE(TAG, " 1. Key format not supported (try RSA instead of ECDSA)"); - ESP_LOGE(TAG, " 2. Key parsing failed (check PEM format)"); - ESP_LOGE(TAG, " 3. mbedTLS backend limitation"); - } +esp_err_t ts_ssh_connect_with_verifier(ts_ssh_session_t s, ts_ssh_verify_cb_t verify, + void *context) { + if (!s) + return ESP_ERR_INVALID_ARG; + if (s->state == TS_SSH_STATE_CONNECTED) + return ESP_OK; + if (s->session || s->sock >= 0) + ts_ssh_disconnect(s); + s->deadline_us = esp_timer_get_time() + (int64_t)s->config.timeout_ms * 1000; + s->state = TS_SSH_STATE_CONNECTING; + esp_err_t ret = ESP_FAIL; + struct sockaddr_in addr = {.sin_family = AF_INET, .sin_port = htons(s->config.port)}; + if (inet_pton(AF_INET, s->config.host, &addr.sin_addr) != 1) { + /* lwIP DNS is synchronous; cancellation is observed immediately after + * its configured resolver timeout. No extra resolver task is created. */ + struct hostent *host = gethostbyname(s->config.host); + if (!host || host->h_length != sizeof(addr.sin_addr)) + goto failed; + memcpy(&addr.sin_addr, host->h_addr, sizeof(addr.sin_addr)); + } + if (operation_expired(s)) + goto timeout; + s->sock = socket(AF_INET, SOCK_STREAM, 0); + if (s->sock < 0 || fcntl(s->sock, F_SETFL, O_NONBLOCK) < 0) + goto failed; + int rc = connect(s->sock, (struct sockaddr *)&addr, sizeof(addr)); + if (rc && errno != EINPROGRESS) + goto failed; + while (rc) { + int ready = wait_socket(s); + if (ready < 0) + goto timeout; + if (!ready) + continue; + int error = 0; + socklen_t size = sizeof(error); + if (getsockopt(s->sock, SOL_SOCKET, SO_ERROR, &error, &size) || error) + goto failed; + break; + } + s->session = libssh2_session_init(); + if (!s->session) { + ret = ESP_ERR_NO_MEM; + goto failed; + } + libssh2_session_set_blocking(s->session, 0); + while ((rc = libssh2_session_handshake(s->session, s->sock)) == LIBSSH2_ERROR_EAGAIN) + if (wait_socket(s) < 0) + goto timeout; + if (rc) + goto failed; + if (verify) + ret = verify(s, context); + else { + ts_host_verify_result_t status; + ret = ts_known_hosts_verify(s, &status, NULL); + if (ret == ESP_OK && status != TS_HOST_VERIFY_OK) + ret = status == TS_HOST_VERIFY_NOT_FOUND ? TS_SSH_ERR_HOST_UNKNOWN + : status == TS_HOST_VERIFY_MISMATCH ? TS_SSH_ERR_HOST_CHANGED + : ESP_FAIL; + } + if (ret != ESP_OK) + goto failed; + if (operation_expired(s)) + goto timeout; + s->state = TS_SSH_STATE_AUTHENTICATING; + do { + if (s->config.auth_method == TS_SSH_AUTH_PASSWORD) { + if (!s->config.auth.password) { + ret = ESP_ERR_INVALID_ARG; + goto failed; } + rc = libssh2_userauth_password(s->session, s->config.username, s->config.auth.password); + } else if (s->config.auth.key.private_key_path) { + rc = libssh2_userauth_publickey_fromfile_ex( + s->session, s->config.username, strlen(s->config.username), NULL, + s->config.auth.key.private_key_path, s->config.auth.key.passphrase); + } else if (s->config.auth.key.private_key && s->config.auth.key.private_key_len) { + rc = libssh2_userauth_publickey_frommemory( + s->session, s->config.username, strlen(s->config.username), NULL, 0, + (const char *)s->config.auth.key.private_key, s->config.auth.key.private_key_len, + s->config.auth.key.passphrase); } else { - set_error(session, "No private key provided (path or memory)"); - libssh2_session_disconnect(session->session, "No key data"); - libssh2_session_free(session->session); - session->session = NULL; - close(session->sock); - session->sock = -1; - session->state = TS_SSH_STATE_ERROR; - return ESP_ERR_INVALID_ARG; + ret = ESP_ERR_INVALID_ARG; + goto failed; } - } - - if (rc != 0) { - char *err_msg = NULL; - libssh2_session_last_error(session->session, &err_msg, NULL, 0); - set_error(session, "Authentication failed: %s (rc=%d)", err_msg ? err_msg : "unknown", rc); - libssh2_session_disconnect(session->session, "Authentication failed"); - libssh2_session_free(session->session); - session->session = NULL; - close(session->sock); - session->sock = -1; - session->state = TS_SSH_STATE_ERROR; - return ESP_ERR_INVALID_STATE; - } - - ESP_LOGI(TAG, "Connected and authenticated to %s@%s", - session->config.username, session->config.host); - session->state = TS_SSH_STATE_CONNECTED; + if (rc == LIBSSH2_ERROR_EAGAIN && wait_socket(s) < 0) + goto timeout; + } while (rc == LIBSSH2_ERROR_EAGAIN); + if (rc) { + ret = ESP_ERR_INVALID_STATE; + goto failed; + } + if (operation_expired(s)) + goto timeout; + s->state = TS_SSH_STATE_CONNECTED; return ESP_OK; +timeout: + ret = ESP_ERR_TIMEOUT; +failed: + if (ret == ESP_OK) + ret = ESP_FAIL; + set_error(s, "SSH connection failed (code=%d)", ret); + ts_ssh_disconnect(s); + s->state = TS_SSH_STATE_ERROR; + return ret; } -esp_err_t ts_ssh_disconnect(ts_ssh_session_t session) -{ - if (!session) { +esp_err_t ts_ssh_disconnect(ts_ssh_session_t s) { + if (!s) return ESP_ERR_INVALID_ARG; + if (s->session) { + libssh2_session_callback_set(s->session, LIBSSH2_CALLBACK_RECV, (void *)closed_recv); + libssh2_session_callback_set(s->session, LIBSSH2_CALLBACK_SEND, (void *)closed_send); + libssh2_session_free(s->session); + s->session = NULL; } - - if (session->session) { - libssh2_session_disconnect(session->session, "Normal shutdown"); - libssh2_session_free(session->session); - session->session = NULL; - } - - if (session->sock >= 0) { - close(session->sock); - session->sock = -1; + if (s->sock >= 0) { + close(s->sock); + s->sock = -1; } - - session->state = TS_SSH_STATE_DISCONNECTED; - ESP_LOGD(TAG, "Disconnected"); + s->state = TS_SSH_STATE_DISCONNECTED; return ESP_OK; } -bool ts_ssh_is_connected(ts_ssh_session_t session) -{ +bool ts_ssh_is_connected(ts_ssh_session_t session) { return session && session->state == TS_SSH_STATE_CONNECTED; } -ts_ssh_state_t ts_ssh_get_state(ts_ssh_session_t session) -{ +ts_ssh_state_t ts_ssh_get_state(ts_ssh_session_t session) { return session ? session->state : TS_SSH_STATE_DISCONNECTED; } -esp_err_t ts_ssh_exec(ts_ssh_session_t session, const char *command, ts_ssh_exec_result_t *result) -{ - if (!session || !command || !result) { +static esp_err_t exec_command(ts_ssh_session_t s, const char *command, ts_ssh_output_cb_t callback, + void *context, ts_ssh_exec_result_t *result, int *exit_code) { + if (!s || !command || (!callback && !result)) return ESP_ERR_INVALID_ARG; - } - - if (session->state != TS_SSH_STATE_CONNECTED) { - set_error(session, "Not connected"); + if (!ts_ssh_is_connected(s)) return ESP_ERR_INVALID_STATE; + if (result) { + memset(result, 0, sizeof(*result)); + result->exit_code = -1; } - - memset(result, 0, sizeof(ts_ssh_exec_result_t)); - result->exit_code = -1; - - /* 打开通道 */ + if (exit_code) + *exit_code = -1; + s->deadline_us = esp_timer_get_time() + (int64_t)s->config.timeout_ms * 1000; + esp_err_t ret = ESP_FAIL; LIBSSH2_CHANNEL *channel = NULL; int rc; - - while ((channel = libssh2_channel_open_session(session->session)) == NULL && - libssh2_session_last_error(session->session, NULL, NULL, 0) == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - } - - if (!channel) { - char *err_msg = NULL; - libssh2_session_last_error(session->session, &err_msg, NULL, 0); - set_error(session, "Failed to open channel: %s", err_msg ? err_msg : "unknown"); - return ESP_FAIL; - } - - /* 执行命令 */ - ESP_LOGD(TAG, "Executing: %s", command); - while ((rc = libssh2_channel_exec(channel, command)) == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - } - - if (rc != 0) { - set_error(session, "Failed to exec command: rc=%d", rc); - libssh2_channel_free(channel); - return ESP_FAIL; - } - - /* 读取输出 */ - size_t stdout_capacity = 4096; - size_t stderr_capacity = 1024; - result->stdout_data = TS_MALLOC_PSRAM(stdout_capacity); - result->stderr_data = TS_MALLOC_PSRAM(stderr_capacity); - - if (!result->stdout_data || !result->stderr_data) { - free(result->stdout_data); - free(result->stderr_data); - result->stdout_data = NULL; - result->stderr_data = NULL; - libssh2_channel_free(channel); - return ESP_ERR_NO_MEM; - } - - result->stdout_len = 0; - result->stderr_len = 0; - - /* 循环读取直到 channel EOF。 - * 内层 do-while 批量 drain 当前所有可用数据(rc > 0 时持续读)。 - * 外层用 libssh2_channel_eof() 判断是否结束。 - * 原来的 bug:drain 后 rc==0,走 else break 过早退出,丢失后续数据。 - * 安全措施:非 EAGAIN 错误立即返回,防止无限循环;最多等 300 轮(约 5 分钟)。 */ - int wait_rounds = 0; + while (!operation_expired(s)) { + channel = libssh2_channel_open_session(s->session); + if (channel) + break; + if (libssh2_session_last_errno(s->session) != LIBSSH2_ERROR_EAGAIN) + goto failed; + if (wait_socket(s) < 0) + goto timeout; + } + if (!channel || operation_expired(s)) + goto timeout; + while ((rc = libssh2_channel_exec(channel, command)) == LIBSSH2_ERROR_EAGAIN) + if (wait_socket(s) < 0) + goto timeout; + if (rc) + goto failed; + size_t capacity[2] = {0, 0}; + size_t limit = s->config.max_output_bytes ? s->config.max_output_bytes : 65536; for (;;) { - char buffer[512]; - int got_data = 0; - - /* Drain stdout —— 一次性读完当前所有可用数据 */ - do { - rc = libssh2_channel_read(channel, buffer, sizeof(buffer)); + bool got_data = false; + for (int stream = 0; stream < 2; stream++) { + /* One bounded chunk per stream prevents stdout starving stderr/cancel. */ + if (operation_expired(s)) + goto timeout; + char buffer[512]; + rc = libssh2_channel_read_ex(channel, stream ? SSH_EXTENDED_DATA_STDERR : 0, buffer, + sizeof(buffer)); + if (rc < 0 && rc != LIBSSH2_ERROR_EAGAIN) + goto failed; if (rc > 0) { - got_data = 1; - while (result->stdout_len + rc >= stdout_capacity) { - stdout_capacity *= 2; - char *new_buf = TS_REALLOC_PSRAM(result->stdout_data, stdout_capacity); - if (!new_buf) { - set_error(session, "Out of memory"); - ts_ssh_exec_result_free(result); - libssh2_channel_free(channel); - return ESP_ERR_NO_MEM; + got_data = true; + if (callback) + callback(buffer, rc, stream != 0, context); + if (result) { + char **data = stream ? &result->stderr_data : &result->stdout_data; + size_t *len = stream ? &result->stderr_len : &result->stdout_len; + if ((size_t)rc > limit - *len) { + ret = ESP_ERR_INVALID_SIZE; + goto failed; } - result->stdout_data = new_buf; - } - memcpy(result->stdout_data + result->stdout_len, buffer, rc); - result->stdout_len += rc; - } else if (rc < 0 && rc != LIBSSH2_ERROR_EAGAIN) { - set_error(session, "Channel read error: %d", rc); - ts_ssh_exec_result_free(result); - libssh2_channel_free(channel); - return ESP_FAIL; - } - } while (rc > 0); - - /* Drain stderr —— 同理 */ - do { - rc = libssh2_channel_read_stderr(channel, buffer, sizeof(buffer)); - if (rc > 0) { - got_data = 1; - while (result->stderr_len + rc >= stderr_capacity) { - stderr_capacity *= 2; - char *new_buf = TS_REALLOC_PSRAM(result->stderr_data, stderr_capacity); - if (!new_buf) { - set_error(session, "Out of memory"); - ts_ssh_exec_result_free(result); - libssh2_channel_free(channel); - return ESP_ERR_NO_MEM; + if (*len + rc + 1 > capacity[stream]) { + size_t next = capacity[stream] ? capacity[stream] * 2 : 1024; + if (next > limit + 1) + next = limit + 1; + char *grown = TS_REALLOC_PSRAM(*data, next); + if (!grown) { + ret = ESP_ERR_NO_MEM; + goto failed; + } + *data = grown; + capacity[stream] = next; } - result->stderr_data = new_buf; + memcpy(*data + *len, buffer, rc); + *len += rc; + (*data)[*len] = 0; } - memcpy(result->stderr_data + result->stderr_len, buffer, rc); - result->stderr_len += rc; - } else if (rc < 0 && rc != LIBSSH2_ERROR_EAGAIN) { - set_error(session, "Channel stderr read error: %d", rc); - ts_ssh_exec_result_free(result); - libssh2_channel_free(channel); - return ESP_FAIL; } - } while (rc > 0); - - /* 用 channel EOF 判断是否结束(不再依赖 rc 的值) */ - if (libssh2_channel_eof(channel)) { - break; } - - /* 收到数据则重置等待计数;无数据则累计,超过 300 轮(~5 分钟)视为超时 */ - if (got_data) { - wait_rounds = 0; - } else { - wait_rounds++; - if (wait_rounds > 300) { - set_error(session, "Read timeout: no EOF after %d wait rounds", wait_rounds); - break; /* 不返回错误,保留已读数据 */ - } - } - - /* 未 EOF:等待更多数据到达后再循环 */ - wait_socket(session->sock, session->session, 1000); - } - - /* 添加字符串终止符 */ - result->stdout_data[result->stdout_len] = '\0'; - result->stderr_data[result->stderr_len] = '\0'; - - /* 关闭通道并获取退出码 */ - while ((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 1000); - } - - if (rc == 0) { - result->exit_code = libssh2_channel_get_exit_status(channel); - } - + /* Drain buffered bytes even when EOF arrived with the last packet. */ + if (!got_data && libssh2_channel_eof(channel)) + break; + if (!got_data && wait_socket(s) < 0) + goto timeout; + } + while ((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) + if (wait_socket(s) < 0) + goto timeout; + if (rc) + goto failed; + int status = libssh2_channel_get_exit_status(channel); + if (exit_code) + *exit_code = status; + if (result) + result->exit_code = status; libssh2_channel_free(channel); - - ESP_LOGD(TAG, "Command completed: exit_code=%d, stdout_len=%zu, stderr_len=%zu", - result->exit_code, result->stdout_len, result->stderr_len); return ESP_OK; +timeout: + ret = ESP_ERR_TIMEOUT; +failed: + /* A timed-out command has an unknown remote outcome. Dispose the transport + * and all its channels once; never return partial output as success. */ + ts_ssh_disconnect(s); + if (result) + ts_ssh_exec_result_free(result); + return ret; } -esp_err_t ts_ssh_exec_stream(ts_ssh_session_t session, const char *command, - ts_ssh_output_cb_t callback, void *user_data, - int *exit_code) -{ - if (!session || !command || !callback) { - return ESP_ERR_INVALID_ARG; - } - - if (session->state != TS_SSH_STATE_CONNECTED) { - set_error(session, "Not connected"); - return ESP_ERR_INVALID_STATE; - } - - /* 清除中止标志 */ - session->abort_flag = false; - - /* 打开通道 */ - LIBSSH2_CHANNEL *channel = NULL; - int rc; - - while ((channel = libssh2_channel_open_session(session->session)) == NULL && - libssh2_session_last_error(session->session, NULL, NULL, 0) == LIBSSH2_ERROR_EAGAIN) { - if (session->abort_flag) { - set_error(session, "Aborted by user"); - return ESP_ERR_TIMEOUT; - } - wait_socket(session->sock, session->session, 1000); - } - - if (!channel) { - char *err_msg = NULL; - libssh2_session_last_error(session->session, &err_msg, NULL, 0); - set_error(session, "Failed to open channel: %s", err_msg ? err_msg : "unknown"); - return ESP_FAIL; - } - - /* 执行命令 */ - while ((rc = libssh2_channel_exec(channel, command)) == LIBSSH2_ERROR_EAGAIN) { - if (session->abort_flag) { - libssh2_channel_free(channel); - set_error(session, "Aborted by user"); - return ESP_ERR_TIMEOUT; - } - wait_socket(session->sock, session->session, 1000); - } - - if (rc != 0) { - set_error(session, "Failed to exec command: rc=%d", rc); - libssh2_channel_free(channel); - return ESP_FAIL; - } - - /* 流式读取输出 */ - char buffer[512]; - bool aborted = false; - for (;;) { - /* 检查中止标志 */ - if (session->abort_flag) { - aborted = true; - break; - } - - /* 读取 stdout */ - do { - rc = libssh2_channel_read(channel, buffer, sizeof(buffer)); - if (rc > 0) { - callback(buffer, rc, false, user_data); - } - if (session->abort_flag) { - aborted = true; - break; - } - } while (rc > 0); - - if (aborted) break; - - /* 读取 stderr */ - do { - rc = libssh2_channel_read_stderr(channel, buffer, sizeof(buffer)); - if (rc > 0) { - callback(buffer, rc, true, user_data); - } - if (session->abort_flag) { - aborted = true; - break; - } - } while (rc > 0); - - if (aborted) break; - - /* 检查 channel 是否已经结束(远程命令退出)*/ - if (libssh2_channel_eof(channel)) { - break; /* 命令已完成,退出循环 */ - } - - if (rc == LIBSSH2_ERROR_EAGAIN) { - wait_socket(session->sock, session->session, 100); /* 减少等待时间以便更快响应中断 */ - } else if (rc == 0) { - /* 没有数据但 channel 未结束,短暂等待后继续 */ - wait_socket(session->sock, session->session, 50); - } else { - break; - } - } - - /* 关闭通道 */ - while ((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) { - if (session->abort_flag) break; /* 中止时也要快速退出 */ - wait_socket(session->sock, session->session, 100); - } - - if (exit_code) { - *exit_code = aborted ? -1 : ((rc == 0) ? libssh2_channel_get_exit_status(channel) : -1); - } +esp_err_t ts_ssh_exec(ts_ssh_session_t s, const char *command, ts_ssh_exec_result_t *result) { + return exec_command(s, command, NULL, NULL, result, NULL); +} - libssh2_channel_free(channel); - - if (aborted) { - set_error(session, "Aborted by user"); - return ESP_ERR_TIMEOUT; - } - return ESP_OK; +esp_err_t ts_ssh_exec_stream(ts_ssh_session_t s, const char *command, ts_ssh_output_cb_t callback, + void *context, int *exit_code) { + return exec_command(s, command, callback, context, NULL, exit_code); } -void ts_ssh_abort(ts_ssh_session_t session) -{ +void ts_ssh_abort(ts_ssh_session_t session) { if (session) { session->abort_flag = true; } } -void ts_ssh_exec_result_free(ts_ssh_exec_result_t *result) -{ +void ts_ssh_exec_result_free(ts_ssh_exec_result_t *result) { if (result) { free(result->stdout_data); free(result->stderr_data); @@ -865,14 +499,12 @@ void ts_ssh_exec_result_free(ts_ssh_exec_result_t *result) } } -const char *ts_ssh_get_error(ts_ssh_session_t session) -{ +const char *ts_ssh_get_error(ts_ssh_session_t session) { return session ? session->error_msg : "Invalid session"; } esp_err_t ts_ssh_exec_simple(const ts_ssh_config_t *config, const char *command, - ts_ssh_exec_result_t *result) -{ + ts_ssh_exec_result_t *result) { ts_ssh_session_t session = NULL; esp_err_t ret; @@ -888,10 +520,10 @@ esp_err_t ts_ssh_exec_simple(const ts_ssh_config_t *config, const char *command, } ret = ts_ssh_exec(session, command, result); - + ts_ssh_disconnect(session); ts_ssh_session_destroy(session); - + return ret; } @@ -902,31 +534,23 @@ esp_err_t ts_ssh_exec_simple(const ts_ssh_config_t *config, const char *command, /** * @brief 获取内部 libssh2 会话句柄 */ -LIBSSH2_SESSION *ts_ssh_get_libssh2_session(ts_ssh_session_t session) -{ +LIBSSH2_SESSION *ts_ssh_get_libssh2_session(ts_ssh_session_t session) { return session ? session->session : NULL; } /** * @brief 获取 socket 文件描述符 */ -int ts_ssh_get_socket(ts_ssh_session_t session) -{ - return session ? session->sock : -1; -} +int ts_ssh_get_socket(ts_ssh_session_t session) { return session ? session->sock : -1; } /** * @brief 获取远程主机地址 */ -const char *ts_ssh_get_host(ts_ssh_session_t session) -{ +const char *ts_ssh_get_host(ts_ssh_session_t session) { return session ? session->host_copy : NULL; } /** * @brief 获取远程端口 */ -uint16_t ts_ssh_get_port(ts_ssh_session_t session) -{ - return session ? session->config.port : 0; -} \ No newline at end of file +uint16_t ts_ssh_get_port(ts_ssh_session_t session) { return session ? session->config.port : 0; } \ No newline at end of file diff --git a/components/ts_security/src/ts_ssh_commands_config.c b/components/ts_security/src/ts_ssh_commands_config.c index c9d9e5f..60f530c 100644 --- a/components/ts_security/src/ts_ssh_commands_config.c +++ b/components/ts_security/src/ts_ssh_commands_config.c @@ -1,3 +1,4 @@ +#include "ts_ssh_service.h" /** * @file ts_ssh_commands_config.c * @brief SSH Command Configuration Storage Implementation @@ -219,6 +220,7 @@ static bool s_pending_export = false; /** 正在从 SD 卡加载中(禁止触发同步) */ static bool s_loading_from_sdcard = false; +static TaskHandle_t initial_loader; /** * @brief 延迟加载/导出任务 - 在独立任务中处理 SD 卡操作(避免 main 任务栈溢出) @@ -228,9 +230,11 @@ static bool s_loading_from_sdcard = false; static void deferred_export_task(void *arg) { (void)arg; + initial_loader = xTaskGetCurrentTaskHandle(); vTaskDelay(pdMS_TO_TICKS(2000)); /* 等待系统稳定、SD 卡挂载完成 */ if (!s_state.initialized) { + initial_loader = NULL; vTaskDelete(NULL); return; } @@ -265,8 +269,14 @@ static void deferred_export_task(void *arg) if (sdcard_has_config) { /* SD 卡有配置,清空 NVS 后导入(SD 卡为权威来源) */ ESP_LOGI(TAG, "SD card has config, clearing NVS and importing..."); - ts_ssh_commands_config_clear(); - + esp_err_t cleared = ts_ssh_commands_config_clear(); + if (cleared != ESP_OK) { + s_loading_from_sdcard = false; + initial_loader = NULL; + vTaskDelete(NULL); + return; + } + esp_err_t import_ret = ts_ssh_commands_config_import_from_sdcard(false); size_t count = ts_ssh_commands_config_count(); @@ -286,6 +296,7 @@ static void deferred_export_task(void *arg) } s_pending_export = false; + initial_loader = NULL; vTaskDelete(NULL); } @@ -356,9 +367,8 @@ bool ts_ssh_commands_config_is_initialized(void) /* CRUD Operations */ /*===========================================================================*/ -esp_err_t ts_ssh_commands_config_add(const ts_ssh_command_config_t *config, - char *out_id, size_t out_id_size) -{ +static esp_err_t command_add_impl(const ts_ssh_command_config_t *config, char *out_id, + size_t out_id_size) { /* 强制要求 ID:前端必须提供格式正确的语义化 ID */ if (!s_state.initialized || !config || !config->id[0] || !config->host_id[0] || !config->name[0]) { @@ -466,8 +476,7 @@ esp_err_t ts_ssh_commands_config_add(const ts_ssh_command_config_t *config, return ret; } -esp_err_t ts_ssh_commands_config_remove(const char *id) -{ +static esp_err_t command_remove_impl(const char *id) { if (!s_state.initialized || !id || !id[0]) { return ESP_ERR_INVALID_ARG; } @@ -486,7 +495,7 @@ esp_err_t ts_ssh_commands_config_remove(const char *id) if (strcmp(entry.id, id) == 0) { ret = nvs_erase_key(s_state.nvs, key); if (ret == ESP_OK) { - nvs_commit(s_state.nvs); + ret = nvs_commit(s_state.nvs); ESP_LOGI(TAG, "Removed SSH command: %s (%s)", entry.name, id); } break; @@ -685,8 +694,7 @@ size_t ts_ssh_commands_config_count(void) return count; } -esp_err_t ts_ssh_commands_config_clear(void) -{ +static esp_err_t command_clear_impl(void) { if (!s_state.initialized) { return ESP_ERR_INVALID_STATE; } @@ -1379,7 +1387,11 @@ esp_err_t ts_ssh_commands_config_import_from_sdcard(bool merge) /* 如果不是合并模式,先清空现有配置 */ if (!merge) { - ts_ssh_commands_config_clear(); + esp_err_t cleared = ts_ssh_commands_config_clear(); + if (cleared != ESP_OK) { + s_loading_from_sdcard = false; + return cleared; + } } /* 只从目录加载独立文件(.tscfg 优先于 .json) */ @@ -1413,3 +1425,50 @@ void ts_ssh_commands_config_sync_to_sdcard(void) * 必须使用 DRAM 栈,因为内部会访问 NVS */ xTaskCreate(async_sync_task, "ssh_cmd_sync", 8192, NULL, 2, NULL); } + +esp_err_t ts_ssh_commands_config_add(const ts_ssh_command_config_t *cfg, char *out, size_t size) { + if (!cfg) + return ESP_ERR_INVALID_ARG; + ts_ssh_binding_lock(); + ts_ssh_command_config_t *old = + heap_caps_malloc(sizeof(*old), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!old) { + ts_ssh_binding_unlock(); + return ESP_ERR_NO_MEM; + } + esp_err_t got = ts_ssh_commands_config_get(cfg->id, old); + bool changed = got == ESP_OK && + (strcmp(old->host_id, cfg->host_id) || strcmp(old->name, cfg->name) || + strcmp(old->command, cfg->command) || strcmp(old->var_name, cfg->var_name) || + old->nohup != cfg->nohup || old->service_mode != cfg->service_mode); + bool busy = (changed || got == ESP_ERR_NOT_FOUND) && ts_ssh_service_command_protected(cfg->id); + free(old); + esp_err_t ret = busy ? ESP_ERR_INVALID_STATE : command_add_impl(cfg, out, size); + ts_ssh_binding_unlock(); + return ret; +} +esp_err_t ts_ssh_commands_config_remove(const char *id) { + if (!id) + return ESP_ERR_INVALID_ARG; + ts_ssh_binding_lock(); + uint32_t credential = 0; + esp_err_t ret = ts_ssh_service_command_protected(id) ? ESP_ERR_INVALID_STATE + : ts_ssh_service_delete_begin(id, &credential); + if (ret == ESP_OK) { + ret = command_remove_impl(id); + ts_ssh_service_delete_finish(id, credential, ret == ESP_OK); + } + ts_ssh_binding_unlock(); + return ret; +} +esp_err_t ts_ssh_commands_config_clear(void) { + ts_ssh_binding_lock(); + esp_err_t ret = + (xTaskGetCurrentTaskHandle() == initial_loader ? ts_ssh_service_any_in_use() + : ts_ssh_service_host_protected(NULL)) + ? ESP_ERR_INVALID_STATE + : command_clear_impl(); + if (ret == ESP_OK) ts_ssh_service_forget_stopped(); + ts_ssh_binding_unlock(); + return ret; +} diff --git a/components/ts_security/src/ts_ssh_hosts_config.c b/components/ts_security/src/ts_ssh_hosts_config.c index 346c09b..40b399f 100644 --- a/components/ts_security/src/ts_ssh_hosts_config.c +++ b/components/ts_security/src/ts_ssh_hosts_config.c @@ -1,3 +1,4 @@ +#include "ts_ssh_service.h" /** * @file ts_ssh_hosts_config.c * @brief SSH Host Configuration Storage Implementation @@ -85,6 +86,7 @@ static bool s_hosts_pending_export = false; /** 正在从 SD 卡加载中(禁止触发同步) */ static bool s_loading_from_sdcard = false; +static TaskHandle_t initial_loader; /** * @brief 延迟加载/导出任务 - 在独立任务中处理 SD 卡操作(避免 main 任务栈溢出) @@ -94,9 +96,11 @@ static bool s_loading_from_sdcard = false; static void hosts_deferred_export_task(void *arg) { (void)arg; + initial_loader = xTaskGetCurrentTaskHandle(); vTaskDelay(pdMS_TO_TICKS(2500)); /* 等待系统稳定,错开 commands 加载 */ if (!s_state.initialized) { + initial_loader = NULL; vTaskDelete(NULL); return; } @@ -131,8 +135,14 @@ static void hosts_deferred_export_task(void *arg) if (sdcard_has_config) { /* SD 卡有配置,清空 NVS 后导入(SD 卡为权威来源) */ ESP_LOGI(TAG, "SD card has config, clearing NVS and importing..."); - ts_ssh_hosts_config_clear(); - + esp_err_t cleared = ts_ssh_hosts_config_clear(); + if (cleared != ESP_OK) { + s_loading_from_sdcard = false; + initial_loader = NULL; + vTaskDelete(NULL); + return; + } + esp_err_t import_ret = ts_ssh_hosts_config_import_from_sdcard(false); size_t count = ts_ssh_hosts_config_count(); @@ -152,6 +162,7 @@ static void hosts_deferred_export_task(void *arg) } s_hosts_pending_export = false; + initial_loader = NULL; vTaskDelete(NULL); } @@ -217,8 +228,7 @@ bool ts_ssh_hosts_config_is_initialized(void) /* CRUD Operations */ /*===========================================================================*/ -esp_err_t ts_ssh_hosts_config_add(const ts_ssh_host_config_t *config) -{ +static esp_err_t host_add_impl(const ts_ssh_host_config_t *config) { if (!s_state.initialized || !config || !config->id[0] || !config->host[0]) { return ESP_ERR_INVALID_ARG; } @@ -289,8 +299,7 @@ esp_err_t ts_ssh_hosts_config_add(const ts_ssh_host_config_t *config) return ret; } -esp_err_t ts_ssh_hosts_config_remove(const char *id) -{ +static esp_err_t host_remove_impl(const char *id) { if (!s_state.initialized || !id || !id[0]) { return ESP_ERR_INVALID_ARG; } @@ -505,8 +514,7 @@ esp_err_t ts_ssh_hosts_config_touch(const char *id) return ret; } -esp_err_t ts_ssh_hosts_config_clear(void) -{ +static esp_err_t host_clear_impl(void) { if (!s_state.initialized) { return ESP_ERR_INVALID_STATE; } @@ -1046,7 +1054,11 @@ esp_err_t ts_ssh_hosts_config_import_from_sdcard(bool merge) /* 如果不是合并模式,先清空现有配置 */ if (!merge) { - ts_ssh_hosts_config_clear(); + esp_err_t cleared = ts_ssh_hosts_config_clear(); + if (cleared != ESP_OK) { + s_loading_from_sdcard = false; + return cleared; + } } /* 只从目录加载独立文件(.tscfg 优先于 .json) */ @@ -1080,3 +1092,38 @@ void ts_ssh_hosts_config_sync_to_sdcard(void) * 必须使用 DRAM 栈,因为内部会访问 NVS */ xTaskCreate(hosts_async_sync_task, "ssh_host_sync", 8192, NULL, 2, NULL); } + +esp_err_t ts_ssh_hosts_config_add(const ts_ssh_host_config_t *cfg) { + if (!cfg) + return ESP_ERR_INVALID_ARG; + ts_ssh_binding_lock(); + ts_ssh_host_config_t old; + esp_err_t got = ts_ssh_hosts_config_get(cfg->id, &old); + bool changed = + got == ESP_OK && (strcmp(old.host, cfg->host) || old.port != cfg->port || + strcmp(old.username, cfg->username) || strcmp(old.keyid, cfg->keyid) || + old.auth_type != cfg->auth_type); + esp_err_t ret = (changed || got == ESP_ERR_NOT_FOUND) && ts_ssh_service_host_protected(cfg->id) ? ESP_ERR_INVALID_STATE + : host_add_impl(cfg); + ts_ssh_binding_unlock(); + return ret; +} +esp_err_t ts_ssh_hosts_config_remove(const char *id) { + if (!id) + return ESP_ERR_INVALID_ARG; + ts_ssh_binding_lock(); + esp_err_t ret = + ts_ssh_service_host_protected(id) ? ESP_ERR_INVALID_STATE : host_remove_impl(id); + ts_ssh_binding_unlock(); + return ret; +} +esp_err_t ts_ssh_hosts_config_clear(void) { + ts_ssh_binding_lock(); + esp_err_t ret = + (xTaskGetCurrentTaskHandle() == initial_loader ? ts_ssh_service_any_in_use() + : ts_ssh_service_host_protected(NULL)) + ? ESP_ERR_INVALID_STATE + : host_clear_impl(); + ts_ssh_binding_unlock(); + return ret; +} diff --git a/components/ts_security/src/ts_ssh_log_watch.c b/components/ts_security/src/ts_ssh_log_watch.c index 4718822..635010f 100644 --- a/components/ts_security/src/ts_ssh_log_watch.c +++ b/components/ts_security/src/ts_ssh_log_watch.c @@ -1,548 +1,301 @@ -/** - * @file ts_ssh_log_watch.c - * @brief SSH Service Log Watcher Implementation - * - * Uses a dedicated task with large stack (8KB) for SSH operations - * instead of running in esp_timer callback to avoid stack overflow. - */ - #include "ts_ssh_log_watch.h" -#include "ts_ssh_client.h" -#include "ts_ssh_hosts_config.h" -#include "ts_keystore.h" -#include "ts_variable.h" +#include "esp_heap_caps.h" #include "esp_log.h" #include "esp_timer.h" #include "freertos/FreeRTOS.h" -#include "freertos/task.h" #include "freertos/semphr.h" -#include "freertos/queue.h" -#include "esp_heap_caps.h" +#include "freertos/task.h" +#include "ts_keystore.h" +#include "ts_ssh_client.h" +#include "ts_ssh_hosts_config.h" +#include "ts_ssh_probe.h" +#include "ts_ssh_service.h" +#include "ts_variable.h" +#include +#include +#include #include -#include - -static const char *TAG = "ssh_log_watch"; -/* Task stack size - SSH operations need large stack */ -#define LOG_WATCH_TASK_STACK_SIZE (8 * 1024) -#define LOG_WATCH_TASK_PRIORITY 5 +#ifndef CONFIG_TS_SSH_LOG_WATCH_MAX +#define CONFIG_TS_SSH_LOG_WATCH_MAX 32 +#endif +#define LOG_WATCH_TASK_STACK_SIZE (8 * 1024) +#define LOG_WATCH_TASK_PRIORITY 5 -/*===========================================================================*/ -/* Internal Types */ -/*===========================================================================*/ - -typedef struct ts_ssh_log_watch_task { - ts_ssh_log_watch_config_t config; - uint32_t start_time; - bool is_running; - bool stop_requested; - TaskHandle_t task_handle; - struct ts_ssh_log_watch_task *next; -} ts_ssh_log_watch_task_t; - -/*===========================================================================*/ -/* Static Variables */ -/*===========================================================================*/ - -static ts_ssh_log_watch_task_t *s_task_list = NULL; -static SemaphoreHandle_t s_mutex = NULL; - -/*===========================================================================*/ -/* Helper Functions */ -/*===========================================================================*/ +typedef struct { + ts_ssh_log_watch_config_t *config; + TaskHandle_t task; + uint32_t generation; + atomic_bool cancel; + int64_t deadline; +} watch_slot_t; +static watch_slot_t slots[CONFIG_TS_SSH_LOG_WATCH_MAX]; +static SemaphoreHandle_t mutex; +static const char *TAG = "ssh_log_watch"; -/** - * @brief 初始化互斥锁 - */ -static void ensure_mutex_init(void) { - if (!s_mutex) { - s_mutex = xSemaphoreCreateMutex(); - } +/* Initialized by the security service before API/rule execution starts. */ +esp_err_t ts_ssh_log_watch_init(void) { + if (!mutex) + mutex = xSemaphoreCreateMutex(); + return mutex ? ESP_OK : ESP_ERR_NO_MEM; } -/** - * @brief 更新变量状态 - */ -static void update_status_var(const char *var_name, const char *status) { - char full_name[64]; - snprintf(full_name, sizeof(full_name), "%s.status", var_name); - - esp_err_t ret = ts_variable_set_string(full_name, status); - if (ret != ESP_OK) { - ESP_LOGW(TAG, "Failed to set variable %s: %s", full_name, esp_err_to_name(ret)); - } else { - ESP_LOGI(TAG, "Variable %s = %s", full_name, status); - } +static bool cancelled(void *context) { + watch_slot_t *slot = context; + return atomic_load(&slot->cancel) || esp_timer_get_time() >= slot->deadline; } -/** - * @brief 更新就绪时间 - */ -static void update_ready_time(const char *var_name) { - char full_name[64]; - snprintf(full_name, sizeof(full_name), "%s.ready_time", var_name); - - time_t now = time(NULL); - ts_variable_set_int(full_name, (int32_t)now); +static void publish(watch_slot_t *slot, const char *status) { + const ts_ssh_log_watch_config_t *cfg = slot->config; + /* Generation/state is checked atomically with publication by service registry. + * Cancellation alone never declares the remote process stopped. */ + if (!atomic_load(&slot->cancel)) + ts_ssh_service_observe(cfg->command_id, cfg->run_generation, status, cfg->var_name); } -/** - * @brief 执行 SSH 命令读取日志(改用 grep 在远程搜索模式) - * @param host_id 主机 ID - * @param log_file 日志文件路径 - * @param ready_pattern 就绪模式(为空则跳过检查) - * @param fail_pattern 失败模式(为空则跳过检查) - * @param result 输出:0=未找到, 1=找到ready, -1=找到fail, -2=文件不存在 - */ -static esp_err_t check_log_pattern_via_ssh(const char *host_id, const char *log_file, - const char *ready_pattern, const char *fail_pattern, - int *result) { - ESP_LOGI(TAG, "Checking log: host_id='%s', log_file='%s'", host_id, log_file); - *result = 0; - - // 获取主机配置 - ts_ssh_host_config_t host_cfg; - esp_err_t ret = ts_ssh_hosts_config_get(host_id, &host_cfg); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Host '%s' not found: %s", host_id, esp_err_to_name(ret)); - return ret; - } - - // 加载私钥 - char *key_data = NULL; +static esp_err_t check_log(watch_slot_t *slot, const char *command, int *match) { + ts_ssh_host_config_t host; + ts_ssh_session_t session = NULL; + ts_ssh_exec_result_t result = {0}; + char *key = NULL; size_t key_len = 0; - if (host_cfg.keyid[0]) { - ret = ts_keystore_load_private_key(host_cfg.keyid, &key_data, &key_len); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to load key '%s': %s", host_cfg.keyid, esp_err_to_name(ret)); - return ret; - } - } else { - ESP_LOGE(TAG, "Host %s has no key configured", host_id); - return ESP_ERR_INVALID_STATE; - } - - // 构建检查命令:先检查文件是否存在,再用 grep 搜索模式 - // grep -q 静默模式,找到返回 0,未找到返回 1 - // 输出格式: "EXISTS:READY:FAIL" (1/0 表示是否匹配) - char cmd[1024]; - - // 转义 pattern 中的单引号(简单替换为 '\'') - char escaped_ready[256] = {0}; - char escaped_fail[256] = {0}; - - // 简单复制,实际使用时 pattern 不应包含单引号 - if (ready_pattern && ready_pattern[0]) { - strncpy(escaped_ready, ready_pattern, sizeof(escaped_ready) - 1); + esp_err_t ret = ts_ssh_hosts_config_get(slot->config->host_id, &host); + if (ret != ESP_OK) + goto done; + if (!host.keyid[0]) { + ret = ESP_ERR_INVALID_STATE; + goto done; } - if (fail_pattern && fail_pattern[0]) { - strncpy(escaped_fail, fail_pattern, sizeof(escaped_fail) - 1); + ret = ts_keystore_load_private_key(host.keyid, &key, &key_len); + if (ret != ESP_OK) + goto done; + ts_ssh_config_t cfg = TS_SSH_DEFAULT_CONFIG(); + cfg.host = host.host; + cfg.port = host.port; + cfg.username = host.username; + cfg.auth_method = TS_SSH_AUTH_PUBLICKEY; + cfg.auth.key.private_key = (const uint8_t *)key; + cfg.auth.key.private_key_len = key_len; + cfg.timeout_ms = 5000; + cfg.cancelled = cancelled; + cfg.cancel_context = slot; + cfg.max_output_bytes = 128; + ret = ts_ssh_session_create(&cfg, &session); + if (ret == ESP_OK) + ret = ts_ssh_connect(session); + if (ret == ESP_OK) + ret = ts_ssh_service_verify_instance(slot->config->command_id, slot->config->run_generation, session); + if (ret == ESP_OK) + ret = ts_ssh_exec(session, command, &result); + if (ret == ESP_OK) + ret = ts_ssh_service_verify_instance(slot->config->command_id, slot->config->run_generation, session); + if (ret == ESP_OK) { + if (result.exit_code != 0) + ret = ESP_FAIL; + else if (ts_ssh_probe_token(result.stdout_data, "FAIL")) + *match = -1; + else if (ts_ssh_probe_token(result.stdout_data, "READY")) + *match = 1; + else if (ts_ssh_probe_token(result.stdout_data, "WAITING") || + ts_ssh_probe_token(result.stdout_data, "NOTFOUND")) + *match = 0; + else + ret = ESP_ERR_INVALID_RESPONSE; } - - // 构建命令:检查文件存在、grep ready pattern、grep fail pattern - // 使用 grep -F 进行固定字符串匹配(不解释正则) - if (escaped_fail[0] && escaped_ready[0]) { - snprintf(cmd, sizeof(cmd), - "if [ ! -f '%s' ]; then echo 'NOTFOUND'; " - "elif grep -qF '%s' '%s' 2>/dev/null; then echo 'FAIL'; " - "elif grep -qF '%s' '%s' 2>/dev/null; then echo 'READY'; " - "else echo 'WAITING'; fi", - log_file, escaped_fail, log_file, escaped_ready, log_file); - } else if (escaped_ready[0]) { - snprintf(cmd, sizeof(cmd), - "if [ ! -f '%s' ]; then echo 'NOTFOUND'; " - "elif grep -qF '%s' '%s' 2>/dev/null; then echo 'READY'; " - "else echo 'WAITING'; fi", - log_file, escaped_ready, log_file); - } else { - // 没有 pattern,只检查文件是否存在 - snprintf(cmd, sizeof(cmd), - "[ -f '%s' ] && echo 'EXISTS' || echo 'NOTFOUND'", log_file); - } - - ESP_LOGD(TAG, "Check command: %s", cmd); - - // 配置 SSH 连接 - ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); - config.host = host_cfg.host; - config.port = host_cfg.port; - config.username = host_cfg.username; - config.timeout_ms = 5000; - config.auth_method = TS_SSH_AUTH_PUBLICKEY; - config.auth.key.private_key = (const uint8_t *)key_data; - config.auth.key.private_key_len = key_len; - - // 创建 SSH 会话 - ts_ssh_session_t session = NULL; - ret = ts_ssh_session_create(&config, &session); - if (ret != ESP_OK || !session) { - ESP_LOGE(TAG, "Failed to create SSH session: %s", esp_err_to_name(ret)); - free(key_data); - return ret != ESP_OK ? ret : ESP_ERR_NO_MEM; - } - - // 连接 - ret = ts_ssh_connect(session); - if (ret != ESP_OK) { - ESP_LOGW(TAG, "SSH connect failed: %s", esp_err_to_name(ret)); +done: + ts_ssh_exec_result_free(&result); + if (session) ts_ssh_session_destroy(session); - free(key_data); - return ret; - } - - // 执行命令 - ts_ssh_exec_result_t exec_result = {0}; - ret = ts_ssh_exec(session, cmd, &exec_result); - - if (ret == ESP_OK && exec_result.stdout_data) { - // 解析输出结果 - const char *output = exec_result.stdout_data; - ESP_LOGI(TAG, "Check result: '%s'", output); - - if (strstr(output, "NOTFOUND")) { - *result = -2; // 文件不存在 - } else if (strstr(output, "FAIL")) { - *result = -1; // 找到失败模式 - } else if (strstr(output, "READY")) { - *result = 1; // 找到就绪模式 - } else { - *result = 0; // 等待中 - } - - free(exec_result.stdout_data); - if (exec_result.stderr_data) free(exec_result.stderr_data); - } else { - ESP_LOGW(TAG, "SSH exec failed: %s", esp_err_to_name(ret)); - } - - ts_ssh_disconnect(session); - ts_ssh_session_destroy(session); - free(key_data); - + free(key); return ret; } -/** - * @brief Log watch task - runs SSH operations in dedicated task with large stack - */ -static void log_watch_task(void *arg) { - ts_ssh_log_watch_task_t *task = (ts_ssh_log_watch_task_t *)arg; - - ESP_LOGI(TAG, "========================================"); - ESP_LOGI(TAG, "Log watch task started:"); - ESP_LOGI(TAG, " var_name: '%s'", task->config.var_name); - ESP_LOGI(TAG, " host_id: '%s'", task->config.host_id); - ESP_LOGI(TAG, " log_file: '%s'", task->config.log_file); - ESP_LOGI(TAG, " ready_pattern: '%s'", task->config.ready_pattern); - ESP_LOGI(TAG, " fail_pattern: '%s'", task->config.fail_pattern); - ESP_LOGI(TAG, " timeout: %u sec, interval: %u ms", task->config.timeout_sec, task->config.check_interval_ms); - ESP_LOGI(TAG, "========================================"); - - while (task->is_running && !task->stop_requested) { - // 检查超时 - uint32_t elapsed = (xTaskGetTickCount() * portTICK_PERIOD_MS) / 1000 - task->start_time; - if (elapsed >= task->config.timeout_sec) { - ESP_LOGW(TAG, "Log watch timeout for %s after %u seconds", - task->config.var_name, elapsed); - update_status_var(task->config.var_name, "timeout"); - break; +static void worker(void *context) { + watch_slot_t *slot = context; + /* Creator registers the task handle and initial state before releasing gate. */ + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + char *command = NULL; + if (slot->config->recovery_only) { + while (!cancelled(slot)) { + if (!ts_ssh_service_recover(slot->config->command_id, slot->config->run_generation)) break; + ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(slot->config->check_interval_ms)); } - - // 使用 grep 在远程检查模式 - int check_result = 0; - esp_err_t ret = check_log_pattern_via_ssh( - task->config.host_id, - task->config.log_file, - task->config.ready_pattern, - task->config.fail_pattern, - &check_result - ); - - if (ret == ESP_OK) { - switch (check_result) { - case 1: // READY - ESP_LOGI(TAG, "✅ Service ready: pattern '%s' found in log", - task->config.ready_pattern); - update_status_var(task->config.var_name, "ready"); - update_ready_time(task->config.var_name); - goto task_done; - - case -1: // FAIL - ESP_LOGE(TAG, "❌ Service failed: pattern '%s' found in log", - task->config.fail_pattern); - update_status_var(task->config.var_name, "failed"); - goto task_done; - - case -2: // NOTFOUND - ESP_LOGD(TAG, "Log file not found yet, waiting... (elapsed=%us)", elapsed); - break; - - default: // WAITING - ESP_LOGI(TAG, "Waiting for pattern '%s' (elapsed=%us/%us)", - task->config.ready_pattern, elapsed, task->config.timeout_sec); - break; - } - } else { - ESP_LOGW(TAG, "Check failed (will retry): %s", esp_err_to_name(ret)); - } - - // 等待下次检查 - vTaskDelay(pdMS_TO_TICKS(task->config.check_interval_ms)); + goto done; + } + command = heap_caps_malloc(3072, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!command || !ts_ssh_log_probe_command(slot->config->log_file, slot->config->ready_pattern, + slot->config->fail_pattern, command, 3072)) { + publish(slot, "unknown"); + goto done; } - -task_done: - task->is_running = false; - - ESP_LOGI(TAG, "Log watch task finished for %s", task->config.var_name); - - // 自动清理:从链表移除 - if (s_mutex) { - xSemaphoreTake(s_mutex, portMAX_DELAY); - ts_ssh_log_watch_task_t **pp = &s_task_list; - while (*pp) { - if (*pp == task) { - *pp = task->next; - break; - } - pp = &(*pp)->next; + while (!cancelled(slot)) { + int match = 0; + esp_err_t ret = check_log(slot, command, &match); + if (cancelled(slot)) + break; + if (ret == ESP_OK && match) { + publish(slot, match > 0 ? "ready" : "failed"); + goto done; + } + if (ret != ESP_OK) { + publish(slot, "unknown"); + if (ret == TS_SSH_ERR_HOST_UNKNOWN || ret == TS_SSH_ERR_HOST_CHANGED || + ret == ESP_ERR_INVALID_STATE) + goto done; } - xSemaphoreGive(s_mutex); + ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(slot->config->check_interval_ms)); } - - free(task); - vTaskDelete(NULL); + if (!atomic_load(&slot->cancel)) + publish(slot, "timeout"); +done: + free(command); + xSemaphoreTake(mutex, portMAX_DELAY); + ts_ssh_log_watch_config_t *cfg = slot->config; + slot->config = NULL; + slot->task = NULL; + xSemaphoreGive(mutex); + if (cfg->recovery_only) + ts_ssh_service_recovery_done(cfg->command_id, cfg->run_generation); + else + ts_ssh_service_recovery_kick(cfg->command_id); + free(cfg); + vTaskDelete(NULL); /* Only the resource-owning task deletes itself. */ } -/*===========================================================================*/ -/* Public API */ -/*===========================================================================*/ - -esp_err_t ts_ssh_log_watch_start(const ts_ssh_log_watch_config_t *config, - ts_ssh_log_watch_handle_t *out_handle) { - if (!config || !config->host_id[0] || !config->log_file[0] || - !config->ready_pattern[0] || !config->var_name[0]) { +esp_err_t ts_ssh_log_watch_start(const ts_ssh_log_watch_config_t *cfg, + ts_ssh_log_watch_handle_t *out) { + if (out) + *out = 0; + if (!mutex) + return ESP_ERR_INVALID_STATE; + if (!cfg || !cfg->host_id[0] || (!cfg->recovery_only && (!cfg->log_file[0] || !cfg->ready_pattern[0])) || + !cfg->var_name[0] || !cfg->command_id[0] || !cfg->run_generation || !cfg->timeout_sec || + !cfg->check_interval_ms) return ESP_ERR_INVALID_ARG; - } - - ensure_mutex_init(); - - // 检查是否已有同名变量的监控任务运行中 - xSemaphoreTake(s_mutex, portMAX_DELAY); - ts_ssh_log_watch_task_t *existing = s_task_list; - while (existing) { - if (strcmp(existing->config.var_name, config->var_name) == 0 && existing->is_running) { - xSemaphoreGive(s_mutex); - ESP_LOGW(TAG, "Log watch for '%s' already running, stopping old one first", config->var_name); - // 停止旧任务 - existing->stop_requested = true; - // 等待旧任务结束(最多等 2 秒) - for (int i = 0; i < 20 && existing->is_running; i++) { - vTaskDelay(pdMS_TO_TICKS(100)); - } - xSemaphoreTake(s_mutex, portMAX_DELAY); - break; + if (!ts_ssh_service_observation_valid(cfg->command_id, cfg->run_generation)) + return ESP_ERR_INVALID_STATE; + ts_ssh_log_watch_config_t *copy = + heap_caps_malloc(sizeof(*copy), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!copy) + return ESP_ERR_NO_MEM; + *copy = *cfg; + xSemaphoreTake(mutex, portMAX_DELAY); + int index = -1; + for (int i = 0; i < CONFIG_TS_SSH_LOG_WATCH_MAX; i++) { + if (slots[i].config && (!strcmp(slots[i].config->var_name, cfg->var_name) || + !strcmp(slots[i].config->command_id, cfg->command_id))) { + xSemaphoreGive(mutex); + free(copy); + return ESP_ERR_INVALID_STATE; } - existing = existing->next; + if (!slots[i].config && slots[i].generation < 0xffffff && index < 0) + index = i; } - xSemaphoreGive(s_mutex); - - // 分配任务结构(使用 PSRAM) - ts_ssh_log_watch_task_t *task = heap_caps_calloc(1, sizeof(ts_ssh_log_watch_task_t), - MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (!task) { - task = calloc(1, sizeof(ts_ssh_log_watch_task_t)); // Fallback to DRAM - if (!task) { - ESP_LOGE(TAG, "Failed to allocate task"); - return ESP_ERR_NO_MEM; - } + if (index < 0) { + xSemaphoreGive(mutex); + free(copy); + return ESP_ERR_NO_MEM; } - - // 复制配置 - memcpy(&task->config, config, sizeof(ts_ssh_log_watch_config_t)); - task->start_time = (xTaskGetTickCount() * portTICK_PERIOD_MS) / 1000; - task->is_running = true; - task->stop_requested = false; - - // 设置初始状态 - update_status_var(config->var_name, "checking"); - - // 创建专用任务(使用较大的栈) - // 任务名包含变量名前缀以便调试识别 - char task_name[16]; - snprintf(task_name, sizeof(task_name), "lw_%.11s", config->var_name); - - BaseType_t ret = xTaskCreatePinnedToCore( - log_watch_task, - task_name, - LOG_WATCH_TASK_STACK_SIZE, - task, - LOG_WATCH_TASK_PRIORITY, - &task->task_handle, - 1 // Pin to core 1 to avoid blocking core 0 - ); - + watch_slot_t *slot = &slots[index]; + slot->config = copy; + ++slot->generation; + atomic_store(&slot->cancel, false); + slot->deadline = esp_timer_get_time() + (int64_t)cfg->timeout_sec * 1000000; + BaseType_t ret = xTaskCreatePinnedToCore(worker, "ssh_log_watch", LOG_WATCH_TASK_STACK_SIZE, + slot, LOG_WATCH_TASK_PRIORITY, &slot->task, 1); if (ret != pdPASS) { - ESP_LOGE(TAG, "Failed to create log watch task"); - free(task); + slot->config = NULL; + slot->task = NULL; + xSemaphoreGive(mutex); + free(copy); return ESP_ERR_NO_MEM; } - - // 加入任务链表 - xSemaphoreTake(s_mutex, portMAX_DELAY); - task->next = s_task_list; - s_task_list = task; - xSemaphoreGive(s_mutex); - - ESP_LOGI(TAG, "Started log watch: var=%s, pattern='%s', timeout=%us, interval=%ums", - config->var_name, config->ready_pattern, - config->timeout_sec, config->check_interval_ms); - - if (out_handle) { - *out_handle = task; - } - + if (out) + *out = (slot->generation << 8) | (index + 1); + /* Publication before gate; worker never uses a partly registered slot. */ + if (!cfg->recovery_only) publish(slot, "checking"); + xTaskNotifyGive(slot->task); + xSemaphoreGive(mutex); return ESP_OK; } +static watch_slot_t *find_handle(ts_ssh_log_watch_handle_t handle) { + unsigned index = (handle & 255); + if (!index || index > CONFIG_TS_SSH_LOG_WATCH_MAX) + return NULL; + watch_slot_t *slot = &slots[index - 1]; + return slot->config && slot->generation == (handle >> 8) ? slot : NULL; +} esp_err_t ts_ssh_log_watch_stop(ts_ssh_log_watch_handle_t handle) { - if (!handle) { - return ESP_ERR_INVALID_ARG; - } - - ts_ssh_log_watch_task_t *task = (ts_ssh_log_watch_task_t *)handle; - - // 请求任务停止 - task->stop_requested = true; - - // 等待任务自行退出(最多等待 2 秒) - int wait_count = 0; - while (task->is_running && wait_count < 20) { - vTaskDelay(pdMS_TO_TICKS(100)); - wait_count++; - } - - // 如果任务还在运行,强制删除 - if (task->is_running && task->task_handle) { - ESP_LOGW(TAG, "Force deleting log watch task"); - vTaskDelete(task->task_handle); - - // 从链表移除 - xSemaphoreTake(s_mutex, portMAX_DELAY); - ts_ssh_log_watch_task_t **pp = &s_task_list; - while (*pp) { - if (*pp == task) { - *pp = task->next; - break; - } - pp = &(*pp)->next; - } - xSemaphoreGive(s_mutex); - - free(task); + if (!mutex) + return ESP_ERR_INVALID_STATE; + xSemaphoreTake(mutex, portMAX_DELAY); + watch_slot_t *slot = find_handle(handle); + if (slot) { + atomic_store(&slot->cancel, true); + ts_ssh_service_cancel_observation(slot->config->command_id, slot->config->run_generation); + xTaskNotifyGive(slot->task); } - - ESP_LOGI(TAG, "Stopped log watch task"); - return ESP_OK; + xSemaphoreGive(mutex); + return slot ? ESP_OK : ESP_ERR_NOT_FOUND; } - -bool ts_ssh_log_watch_is_running(const char *var_name) { - if (!var_name || !s_mutex) { +bool ts_ssh_log_watch_pending(ts_ssh_log_watch_handle_t handle) { + if (!mutex) return false; - } - - xSemaphoreTake(s_mutex, portMAX_DELAY); - - ts_ssh_log_watch_task_t *task = s_task_list; - while (task) { - if (strcmp(task->config.var_name, var_name) == 0 && task->is_running) { - xSemaphoreGive(s_mutex); - return true; + xSemaphoreTake(mutex, portMAX_DELAY); + bool found = find_handle(handle) != NULL; + xSemaphoreGive(mutex); + return found; +} +bool ts_ssh_log_watch_is_running(const char *name) { + if (!mutex || !name) + return false; + bool found = false; + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < CONFIG_TS_SSH_LOG_WATCH_MAX; i++) + if (slots[i].config && !strcmp(slots[i].config->var_name, name)) + found = true; + xSemaphoreGive(mutex); + return found; +} +esp_err_t ts_ssh_log_watch_cancel_name(const char *name) { + if (!mutex || !name) + return ESP_ERR_INVALID_ARG; + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < CONFIG_TS_SSH_LOG_WATCH_MAX; i++) + if (slots[i].config && !strcmp(slots[i].config->var_name, name)) { + atomic_store(&slots[i].cancel, true); + ts_ssh_service_cancel_observation(slots[i].config->command_id, + slots[i].config->run_generation); + xTaskNotifyGive(slots[i].task); } - task = task->next; - } - - xSemaphoreGive(s_mutex); - return false; + xSemaphoreGive(mutex); + return ESP_OK; } - void ts_ssh_log_watch_stop_all(void) { - if (!s_mutex) { + if (!mutex) return; - } - - xSemaphoreTake(s_mutex, portMAX_DELAY); - - ts_ssh_log_watch_task_t *task = s_task_list; - while (task) { - ts_ssh_log_watch_task_t *next = task->next; - - task->stop_requested = true; - - // 等待一小段时间让任务退出 - xSemaphoreGive(s_mutex); - vTaskDelay(pdMS_TO_TICKS(200)); - xSemaphoreTake(s_mutex, portMAX_DELAY); - - if (task->is_running && task->task_handle) { - vTaskDelete(task->task_handle); - free(task); + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < CONFIG_TS_SSH_LOG_WATCH_MAX; i++) + if (slots[i].config) { + atomic_store(&slots[i].cancel, true); + ts_ssh_service_cancel_observation(slots[i].config->command_id, + slots[i].config->run_generation); + xTaskNotifyGive(slots[i].task); } - - task = next; - } - - s_task_list = NULL; - xSemaphoreGive(s_mutex); - - ESP_LOGI(TAG, "Stopped all log watch tasks"); + xSemaphoreGive(mutex); } - int ts_ssh_log_watch_get_active_count(void) { - if (!s_mutex) { + if (!mutex) return 0; - } - int count = 0; - xSemaphoreTake(s_mutex, portMAX_DELAY); - - ts_ssh_log_watch_task_t *task = s_task_list; - while (task) { - if (task->is_running) { - count++; - } - task = task->next; - } - - xSemaphoreGive(s_mutex); + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < CONFIG_TS_SSH_LOG_WATCH_MAX; i++) + count += slots[i].config != NULL; + xSemaphoreGive(mutex); return count; } - void ts_ssh_log_watch_list(void) { - if (!s_mutex) { - ESP_LOGI(TAG, "No active log watch tasks"); - return; - } - - xSemaphoreTake(s_mutex, portMAX_DELAY); - - int count = 0; - ts_ssh_log_watch_task_t *task = s_task_list; - - ESP_LOGI(TAG, "=== Active Log Watch Tasks ==="); - while (task) { - if (task->is_running) { - uint32_t elapsed = (xTaskGetTickCount() * portTICK_PERIOD_MS) / 1000 - task->start_time; - ESP_LOGI(TAG, " [%d] var=%s, pattern='%s', elapsed=%us/%us, log=%s", - ++count, task->config.var_name, task->config.ready_pattern, - elapsed, task->config.timeout_sec, task->config.log_file); - } - task = task->next; - } - - if (count == 0) { - ESP_LOGI(TAG, " (none)"); - } - ESP_LOGI(TAG, "=============================="); - - xSemaphoreGive(s_mutex); + ESP_LOGI(TAG, "Active watchers (including cancelling): %d", + ts_ssh_log_watch_get_active_count()); } diff --git a/components/ts_security/src/ts_ssh_probe.c b/components/ts_security/src/ts_ssh_probe.c new file mode 100644 index 0000000..3960c4f --- /dev/null +++ b/components/ts_security/src/ts_ssh_probe.c @@ -0,0 +1,63 @@ +#include "ts_ssh_probe.h" +#include +#include + +bool ts_ssh_shell_quote(const char *input, char *out, size_t cap) { + if (!input || !out || cap < 3) + return false; + size_t n = 0; + out[n++] = '\''; + for (; *input; input++) { + const char *part = *input == '\'' ? "'\\''" : input; + size_t len = *input == '\'' ? 4 : 1; + if (len + 2 >= cap - n) + return false; + memcpy(out + n, part, len); + n += len; + } + out[n++] = '\''; + out[n] = 0; + return true; +} + +bool ts_ssh_log_probe_command(const char *path, const char *ready, const char *fail, char *out, + size_t cap) { + /* Build each quoted value directly in the bounded output, without scratch + * arrays on the 8 KiB SSH worker stack. */ + if (!path || !ready || !fail || cap < 32) + return false; + size_t n = 0; + const char *keys[] = {"p=", "; r=", "; f="}; + const char *values[] = {path, ready, fail}; + for (unsigned i = 0; i < 3; i++) { + size_t len = strlen(keys[i]); + if (len >= cap - n) + return false; + memcpy(out + n, keys[i], len); + n += len; + if (!ts_ssh_shell_quote(values[i], out + n, cap - n)) + return false; + n += strlen(out + n); + } + const char *script = "; if [ ! -f \"$p\" ]; then echo NOTFOUND; " + "elif [ ! -r \"$p\" ]; then exit 2; " + "else if [ -n \"$f\" ]; then grep -qF -- \"$f\" \"$p\"; x=$?; " + "if [ $x -eq 0 ]; then echo FAIL; exit 0; fi; [ $x -eq 1 ] || exit 2; fi; " + "grep -qF -- \"$r\" \"$p\"; x=$?; " + "if [ $x -eq 0 ]; then echo READY; elif [ $x -eq 1 ]; then echo WAITING; " + "else exit 2; fi; fi"; + size_t len = strlen(script); + if (len >= cap - n) + return false; + memcpy(out + n, script, len + 1); + return true; +} + +bool ts_ssh_probe_token(const char *out, const char *token) { + if (!out || !token) + return false; + size_t n = strlen(token); + if (strncmp(out, token, n)) + return false; + return !out[n] || !strcmp(out + n, "\n") || !strcmp(out + n, "\r\n"); +} diff --git a/components/ts_security/src/ts_ssh_service.c b/components/ts_security/src/ts_ssh_service.c new file mode 100644 index 0000000..f1532ad --- /dev/null +++ b/components/ts_security/src/ts_ssh_service.c @@ -0,0 +1,646 @@ +#include "ts_ssh_service.h" +#include "esp_heap_caps.h" +#include "esp_timer.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "ts_keystore.h" +#include "ts_ssh_hosts_config.h" +#include "ts_ssh_log_watch.h" +#include "ts_ssh_probe.h" +#include "ts_variable.h" +#include +#include +#include +#include + +/* Configuration supports 64 commands; preserve that capacity without 64 tasks. */ +typedef struct { + char id[32], host[64], host_id[32], name[32], variable[32]; + char owner_rule[32]; + char instance[96]; /* boot ID + PID + /proc start ticks */ + uint32_t registration, operation; + unsigned recovery_left; + bool deleting, ready_evidence, recovery_worker; + uint16_t port; + unsigned pins; + ts_ssh_service_status_t status; +} service_t; +static service_t *services; /* PSRAM; no allocation in normal rule evaluation */ +static SemaphoreHandle_t mutex, binding_gate; +/* Unique for this boot, fail closed on exhaustion. Never reuse a retired ticket. */ +static uint32_t serial; +static uint32_t ticket(void) { return serial == UINT32_MAX ? 0 : ++serial; } +static bool occupied(const service_t *s) { + return s->deleting || s->pins || s->status.busy || strcmp(s->status.state, "stopped"); +} +static bool complete(service_t *s, uint32_t registration, uint32_t operation) { + if (!s || s->registration != registration || s->operation != operation || !operation) + return false; + s->operation = 0; + s->status.busy = false; + return true; +} +void ts_ssh_binding_lock(void) { + if (binding_gate) + xSemaphoreTake(binding_gate, portMAX_DELAY); +} +void ts_ssh_binding_unlock(void) { + if (binding_gate) + xSemaphoreGive(binding_gate); +} + +esp_err_t ts_ssh_service_init(void) { + if (!binding_gate) + binding_gate = xSemaphoreCreateMutex(); + if (!mutex) + mutex = xSemaphoreCreateMutex(); + if (!services) + services = heap_caps_calloc(TS_SSH_COMMANDS_MAX, sizeof(*services), + MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + return binding_gate && mutex && services ? ESP_OK : ESP_ERR_NO_MEM; +} +void ts_ssh_service_safe_name(const ts_ssh_command_config_t *cmd, char out[32]) { + unsigned n = 0; + const char *src = cmd->name; + for (unsigned pass = 0; pass < 2 && !n; pass++, src = cmd->id) + for (unsigned i = 0; src[i] && n < 20; i++) + if ((src[i] >= 'a' && src[i] <= 'z') || (src[i] >= 'A' && src[i] <= 'Z') || + (src[i] >= '0' && src[i] <= '9')) + out[n++] = src[i]; + if (!n) { + strcpy(out, "cmd"); + return; + } + out[n] = 0; +} +static service_t *find(const char *id) { + for (unsigned i = 0; i < TS_SSH_COMMANDS_MAX; i++) + if (!strcmp(services[i].id, id)) + return &services[i]; + return NULL; +} +/* Caller holds mutex. Command id plus actual configured target is authoritative; + * a legacy PID-path collision between different ids is rejected. */ +static service_t *register_service(const ts_ssh_command_config_t *cmd, const char *host, + uint16_t port) { + service_t *entry = find(cmd->id), *empty = NULL; + char name[32]; + ts_ssh_service_safe_name(cmd, name); + for (unsigned i = 0; i < TS_SSH_COMMANDS_MAX; i++) { + service_t *s = &services[i]; + if (!s->id[0] && !empty) + empty = s; + if (s != entry && s->id[0] && !strcmp(s->host, host) && s->port == port && + !strcmp(s->name, name)) + return NULL; + } + if (!entry) + entry = empty; + if (!entry) + return NULL; + bool changed = + entry->id[0] && (strcmp(entry->host, host) || entry->port != port || + strcmp(entry->name, name) || strcmp(entry->variable, cmd->var_name)); + if (changed) { + if (occupied(entry)) + return NULL; + memset(entry, 0, sizeof(*entry)); + } + if (entry->deleting) + return NULL; + if (!entry->id[0]) { + entry->registration = ticket(); + if (!entry->registration) return NULL; + entry->status.generation = entry->registration; + strcpy(entry->host_id, cmd->host_id); + snprintf(entry->id, sizeof(entry->id), "%s", cmd->id); + snprintf(entry->host, sizeof(entry->host), "%s", host); + strcpy(entry->name, name); + entry->port = port; + strcpy(entry->variable, cmd->var_name); + strcpy(entry->status.state, "unknown"); + strcpy(entry->status.source, "none"); + } + return entry; +} +esp_err_t ts_ssh_service_pin(const ts_ssh_command_config_t *cmd, const char *host, uint16_t port, uint32_t *registration) { + if (!registration || !mutex || !services) + return ESP_ERR_INVALID_STATE; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = register_service(cmd, host, port ? port : 22); + if (s) { + ++s->pins; + *registration = s->registration; + } + xSemaphoreGive(mutex); + return s ? ESP_OK : ESP_ERR_INVALID_STATE; +} +void ts_ssh_service_unpin(const char *id, uint32_t registration) { + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + if (s && s->registration == registration && s->pins) + --s->pins; + xSemaphoreGive(mutex); +} +bool ts_ssh_service_start_admissible(const char *id) { + if (!mutex || !services) + return false; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + bool allowed = + !s || (!s->deleting && !s->pins && !s->status.busy && + (!strcmp(s->status.state, "stopped") || + (s->status.generation != UINT32_MAX && !strcmp(s->status.source, "none")))); + xSemaphoreGive(mutex); + return allowed; +} +static void state_set(service_t *s, const char *state, const char *source) { + if (strcmp(s->status.state, "unknown") && strcmp(s->status.state, state)) + strcpy(s->status.last_known, s->status.state); + snprintf(s->status.state, sizeof(s->status.state), "%s", state); + snprintf(s->status.source, sizeof(s->status.source), "%s", source); + s->status.confirmed_ms = esp_timer_get_time() / 1000; + /* ts_variable_set is local, synchronous and has no callbacks (notify_change + * currently only logs). Lock order: service -> variable; never inverse. */ + if (s->variable[0]) { + char key[64]; + snprintf(key, sizeof(key), "%s.status", s->variable); + ts_variable_set_string(key, state); + if (!strcmp(state, "ready")) { + snprintf(key, sizeof(key), "%s.ready_time", s->variable); + ts_variable_set_int(key, (int32_t)time(NULL)); + } + } +} +static bool instance_receipt(const char *text, const char *prefix, char out[96]) { + if (!text || strncmp(text, prefix, strlen(prefix))) return false; + const char *v = text + strlen(prefix); + size_t len = strcspn(v, "\r\n"); + if (!len || len >= 96 || strspn(v, "0123456789abcdefABCDEF-:") != len || + (v[len] && strcmp(v + len, "\n") && strcmp(v + len, "\r\n"))) return false; + unsigned separators = 0; + for (size_t i = 0; i < len; ++i) separators += v[i] == ':'; + if (separators != 2) return false; + if (out) { memcpy(out, v, len); out[len] = 0; } + return true; +} +static esp_err_t probe(ts_ssh_session_t session, const char *name, bool stop, bool *running, char instance[96]) { + /* PID file v2 contains exact session leader PID + /proc start time. Group + * signals are used only after both are verified, never PID arithmetic. */ + char *command = heap_caps_malloc(2048, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!command) + return ESP_ERR_NO_MEM; + int n = snprintf(command, 2048, + "d=/tmp/ts_nohup_%s.lock; f=$d/pid; " + "if [ -d \"$d\" ]; then [ -f \"$f\" ] || exit 2; else f=${d%%.lock}.pid; fi; " + "if [ ! -f \"$f\" ]; then echo STOPPED; exit 0; fi; " + "read p stamp < \"$f\" || exit 2; case $p in ''|*[!0-9]*) exit 2;; esac; " + "[ \"$p\" -gt 1 ] || exit 2; " + "if [ ! -r /proc/$p/stat ]; then if kill -0 -- -$p 2>/dev/null; then exit 2; " + "else rm -f -- \"$f\"; [ ! -d \"$d\" ] || rmdir -- \"$d\" || exit 2; echo " + "STOPPED; exit 0; fi; fi; " + "info=$(sed 's/^.*) //' /proc/$p/stat) || exit 2; set -- $info; " + "pg=$3; shift 19; actual=$1; ", + name); + if (n < 0 || n >= 2048) { + free(command); + return ESP_ERR_INVALID_SIZE; + } + const char *tail = stop ? "[ -n \"$stamp\" ] && [ \"$stamp\" = \"$actual\" ] && [ \"$pg\" = " + "\"$p\" ] || exit 2; " + "kill -TERM -- -$p || exit 2; i=0; while [ $i -lt 30 ]; do " + "if ! kill -0 -- -$p 2>/dev/null; then rm -f -- \"$f\"; [ ! -d " + "\"$d\" ] || rmdir -- \"$d\" || exit 2; echo STOPPED; exit 0; fi; " + "sleep 0.1; i=$((i+1)); done; exit 3" + : "if [ -n \"$stamp\" ] && [ \"$stamp\" != \"$actual\" ]; then exit 2; " + "fi; boot=$(cat /proc/sys/kernel/random/boot_id) || exit 2; " + "printf 'RUNNING %s:%s:%s\\n' \"$boot\" \"$p\" \"$actual\""; + if (strlen(tail) >= 2048 - n) { + free(command); + return ESP_ERR_INVALID_SIZE; + } + strcpy(command + n, tail); + ts_ssh_exec_result_t result = {0}; + esp_err_t ret = ts_ssh_exec(session, command, &result); + free(command); + if (ret == ESP_OK) { + if (result.exit_code == 0 && ts_ssh_probe_token(result.stdout_data, "STOPPED")) + *running = false; + else if (!stop && result.exit_code == 0 && instance_receipt(result.stdout_data, "RUNNING ", instance)) + *running = true; + else + ret = ESP_ERR_INVALID_RESPONSE; + } + ts_ssh_exec_result_free(&result); + return ret; +} +esp_err_t ts_ssh_service_begin(const ts_ssh_command_config_t *cmd, ts_ssh_session_t session, + uint32_t *generation) { + if (!services || !mutex || !cmd || !session || !generation) + return ESP_ERR_INVALID_STATE; + *generation = 0; + ts_ssh_binding_lock(); + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = register_service(cmd, ts_ssh_get_host(session), ts_ssh_get_port(session)); + if (!s || s->status.busy || s->status.generation == UINT32_MAX || + !strcmp(s->status.state, "checking") || !strcmp(s->status.state, "starting") || + !strcmp(s->status.state, "stopping")) { + xSemaphoreGive(mutex); + ts_ssh_binding_unlock(); + return ESP_ERR_INVALID_STATE; + } + uint32_t operation = ticket(), registration = s->registration; + if (!operation) { xSemaphoreGive(mutex); ts_ssh_binding_unlock(); return ESP_ERR_INVALID_STATE; } + s->operation = operation; + s->status.busy = true; + s->status.generation = operation; + s->ready_evidence = false; + s->instance[0] = 0; + s->recovery_left = 3; + s->recovery_worker = false; + xSemaphoreGive(mutex); + ts_ssh_binding_unlock(); + bool running = true; + esp_err_t ret = probe(session, s->name, false, &running, NULL); + xSemaphoreTake(mutex, portMAX_DELAY); + if (ret == ESP_OK && !running && s->status.generation == operation) { + *generation = s->status.generation; + state_set(s, "starting", "pid"); + } else { + complete(s, registration, operation); + state_set(s, ret == ESP_OK ? "running" : "unknown", "pid"); + if (ret == ESP_OK) + ret = ESP_ERR_INVALID_STATE; + } + xSemaphoreGive(mutex); + return ret; +} +bool ts_ssh_service_finish(const char *id, uint32_t generation, const char *receipt, + ts_ssh_session_t session) { + char launched_instance[96]; + bool launched = instance_receipt(receipt, "STARTED ", launched_instance); + char identity[96] = {0}, name[32] = {0}; + uint32_t registration = 0; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + if (s && s->operation == generation) { + registration = s->registration; + strcpy(name, s->name); + } + xSemaphoreGive(mutex); + if (!registration) return false; + bool running = false; + if (launched) + launched = probe(session, name, false, &running, identity) == ESP_OK && running && + !strcmp(identity, launched_instance); + xSemaphoreTake(mutex, portMAX_DELAY); + s = find(id); + bool current = complete(s, registration, generation) && s->status.generation == generation; + if (current) { + if (launched) strcpy(s->instance, identity); + state_set(s, launched ? "starting" : "unknown", "launch"); + } + xSemaphoreGive(mutex); + return current && launched; +} +/* A log result must bracket its read with verification of the captured instance. */ +esp_err_t ts_ssh_service_verify_instance(const char *id, uint32_t generation, + ts_ssh_session_t session) { + char name[32], expected[96], actual[96] = {0}; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + bool valid = s && s->status.generation == generation && s->instance[0] && + !s->deleting && strcmp(s->status.state, "stopped") && + strcmp(s->status.state, "stopping") && strcmp(s->status.source, "cancelled"); + if (valid) { strcpy(name, s->name); strcpy(expected, s->instance); } + xSemaphoreGive(mutex); + if (!valid) return ESP_ERR_INVALID_STATE; + bool running = false; + esp_err_t ret = probe(session, name, false, &running, actual); + if (ret == ESP_OK && (!running || strcmp(actual, expected))) ret = ESP_ERR_INVALID_STATE; + return ret; +} +bool ts_ssh_service_observation_valid(const char *id, uint32_t generation) { + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + bool valid = s && s->status.generation == generation && s->instance[0] && + !s->deleting && strcmp(s->status.source, "cancelled") && + strcmp(s->status.state, "stopped") && strcmp(s->status.state, "stopping"); + xSemaphoreGive(mutex); + return valid; +} +void ts_ssh_service_observe(const char *id, uint32_t generation, const char *state, + const char *var_name) { + if (!mutex || !services || !id) + return; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + if (s && generation == s->status.generation && strcmp(s->status.state, "stopping") && + strcmp(s->status.state, "stopped") && strcmp(s->status.source, "cancelled") && s->instance[0]) { + if (!strcmp(state, "ready")) s->ready_evidence = true; + state_set(s, state, "log"); + } + xSemaphoreGive(mutex); +} +static esp_err_t connect_host(const ts_ssh_host_config_t *snapshot, ts_ssh_session_t *session, char **key) { + const ts_ssh_host_config_t host = *snapshot; + esp_err_t ret; + size_t len = 0; + if (!host.keyid[0]) + return ESP_ERR_INVALID_STATE; + ret = ts_keystore_load_private_key(host.keyid, key, &len); + if (ret != ESP_OK) + return ret; + ts_ssh_config_t cfg = TS_SSH_DEFAULT_CONFIG(); + cfg.host = host.host; + cfg.port = host.port; + cfg.username = host.username; + cfg.auth_method = TS_SSH_AUTH_PUBLICKEY; + cfg.auth.key.private_key = (const uint8_t *)*key; + cfg.auth.key.private_key_len = len; + cfg.timeout_ms = 5000; + cfg.max_output_bytes = 128; + ret = ts_ssh_session_create(&cfg, session); + return ret == ESP_OK ? ts_ssh_connect(*session) : ret; +} +static esp_err_t inspect(const char *id, bool stop, uint32_t recovery, ts_ssh_service_status_t *out) { + if (!mutex || !services || !id || !out) + return ESP_ERR_INVALID_ARG; + ts_ssh_command_config_t *cmd = + heap_caps_malloc(sizeof(*cmd), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!cmd) + return ESP_ERR_NO_MEM; + ts_ssh_binding_lock(); + esp_err_t ret = ts_ssh_commands_config_get(id, cmd); + ts_ssh_host_config_t host; + if (ret == ESP_OK && (!cmd->nohup || !cmd->service_mode)) + ret = ESP_ERR_INVALID_STATE; + if (ret == ESP_OK) + ret = ts_ssh_hosts_config_get(cmd->host_id, &host); + if (ret != ESP_OK) { + ts_ssh_binding_unlock(); + free(cmd); + return ret; + } + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = register_service(cmd, host.host, host.port ? host.port : 22); + if (!s) { + xSemaphoreGive(mutex); + ts_ssh_binding_unlock(); + free(cmd); + return ESP_ERR_INVALID_STATE; + } + if (s->deleting || s->status.busy || serial == UINT32_MAX || + (recovery && (s->status.generation != recovery || !s->ready_evidence || + !s->recovery_left || strcmp(s->status.state, "unknown")))) { + *out = s->status; + xSemaphoreGive(mutex); + ts_ssh_binding_unlock(); + free(cmd); + return ESP_ERR_INVALID_STATE; + } + uint32_t operation = ticket(), registration = s->registration; + s->operation = operation; + s->status.busy = true; + if (recovery) --s->recovery_left; + if (stop) { + s->status.generation = operation; + s->ready_evidence = false; + s->recovery_left = 0; + state_set(s, "stopping", "request"); + } + uint32_t generation = s->status.generation; + xSemaphoreGive(mutex); + ts_ssh_binding_unlock(); + if (stop) + ts_ssh_log_watch_cancel_name(cmd->var_name); + ts_ssh_session_t session = NULL; + char *key = NULL; + bool running = true; + char identity[96] = {0}; + ret = connect_host(&host, &session, &key); + if (ret == ESP_OK) + ret = probe(session, s->name, stop, &running, identity); + if (session) + ts_ssh_session_destroy(session); + free(key); + free(cmd); + xSemaphoreTake(mutex, portMAX_DELAY); + if (complete(s, registration, operation) && s->status.generation == generation) { + if (ret != ESP_OK) + state_set(s, "unknown", "pid"); + else if (!running) { + s->ready_evidence = false; + s->instance[0] = 0; + state_set(s, "stopped", "pid"); + } else if (s->ready_evidence && !strcmp(identity, s->instance)) + state_set(s, "ready", "pid+log"); + else if (strcmp(identity, s->instance)) { + s->ready_evidence = false; + s->instance[0] = 0; + state_set(s, "running", "pid"); + } else if (strcmp(s->status.state, "checking") && strcmp(s->status.state, "ready")) + state_set(s, "running", "pid"); + else { + strcpy(s->status.source, "pid"); + s->status.confirmed_ms = esp_timer_get_time() / 1000; + } + } + *out = s->status; + xSemaphoreGive(mutex); + return ret; +} +esp_err_t ts_ssh_service_query(const char *id, ts_ssh_service_status_t *out) { + esp_err_t ret = inspect(id, false, 0, out); + ts_ssh_service_recovery_kick(id); + return ret; +} +esp_err_t ts_ssh_service_stop(const char *id, ts_ssh_service_status_t *out) { + return inspect(id, true, 0, out); +} +bool ts_ssh_service_binding_busy(const char *id) { + if (!mutex || !services) + return true; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + bool busy = !s || occupied(s); + xSemaphoreGive(mutex); + return busy; +} +bool ts_ssh_service_launch_command(const ts_ssh_command_config_t *cmd, const char *expanded, + char *out, size_t cap) { + char name[32]; + ts_ssh_service_safe_name(cmd, name); + int n = snprintf(out, cap, "mkdir /tmp/ts_nohup_%s.lock || exit 2; nohup setsid sh -c ", name); + if (n < 0 || (size_t)n >= cap || !ts_ssh_shell_quote(expanded, out + n, cap - n)) + return false; + n += strlen(out + n); + int more = snprintf( + out + n, cap - n, + " > /tmp/ts_nohup_%s.log 2>&1 < /dev/null & p=$!; " + "sleep 0.1; info=$(sed 's/^.*) //' /proc/$p/stat) || exit 2; " + "set -- $info; [ \"$3\" = \"$p\" ] || exit 2; shift 19; " + "printf '%%s %%s\\n' \"$p\" \"$1\" > /tmp/ts_nohup_%s.lock/pid || exit 2; " + "boot=$(cat /proc/sys/kernel/random/boot_id) || exit 2; " + "printf 'STARTED %%s:%%s:%%s\\n' \"$boot\" \"$p\" \"$1\"", + name, name); + return more >= 0 && (size_t)more < cap - n; +} + +bool ts_ssh_service_command_protected(const char *id) { + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + bool protected = s && occupied(s); + xSemaphoreGive(mutex); + if (protected) return true; + ts_ssh_command_config_t *cmd = + heap_caps_malloc(sizeof(*cmd), MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (!cmd) + return true; + esp_err_t ret = ts_ssh_commands_config_get(id, cmd); + bool busy = ret == ESP_OK && cmd->nohup && cmd->service_mode && ts_ssh_service_binding_busy(id); + free(cmd); + return ret != ESP_OK && ret != ESP_ERR_NOT_FOUND ? true : busy; +} +static bool protect_host(const ts_ssh_command_config_t *cmd, size_t index, void *context) { + bool *busy = context; + if (cmd->nohup && cmd->service_mode && ts_ssh_service_binding_busy(cmd->id)) + *busy = true; + return !*busy; +} +bool ts_ssh_service_host_protected(const char *host_id) { + bool busy = false; + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < TS_SSH_COMMANDS_MAX; ++i) + if (services[i].id[0] && (!host_id || !strcmp(services[i].host_id, host_id)) && occupied(&services[i])) + busy = true; + xSemaphoreGive(mutex); + if (busy) return true; + esp_err_t ret = + host_id ? ts_ssh_commands_config_iterate_by_host(host_id, protect_host, &busy, 0, 0, NULL) + : ts_ssh_commands_config_iterate(protect_host, &busy, 0, 0, NULL); + return busy || ret != ESP_OK; +} + +void ts_ssh_service_cancel_observation(const char *id, uint32_t generation) { + if (!mutex || !services) + return; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + if (s && s->status.generation == generation && strcmp(s->status.state, "stopping")) { + s->status.generation = ticket(); + s->ready_evidence = false; + s->recovery_left = 0; + state_set(s, "unknown", "cancelled"); + } + xSemaphoreGive(mutex); +} +bool ts_ssh_service_any_in_use(void) { + if (!mutex || !services) + return false; + bool busy = false; + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < TS_SSH_COMMANDS_MAX; i++) { + service_t *s = &services[i]; + if (s->id[0] && (s->pins || s->status.busy || + (strcmp(s->status.source, "none") && strcmp(s->status.state, "stopped")))) + busy = true; + } + xSemaphoreGive(mutex); + return busy; +} + +/* Called with binding_gate held: deletion is an admission barrier through storage I/O. */ +esp_err_t ts_ssh_service_delete_begin(const char *id, uint32_t *credential) { + *credential = 0; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + esp_err_t ret = ESP_OK; + if (s && occupied(s)) ret = ESP_ERR_INVALID_STATE; + else if (s) { + *credential = ticket(); + if (!*credential) ret = ESP_ERR_INVALID_STATE; + else { s->deleting = true; s->operation = *credential; } + } + xSemaphoreGive(mutex); + return ret; +} +void ts_ssh_service_delete_finish(const char *id, uint32_t credential, bool removed) { + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + if (s && s->deleting && complete(s, s->registration, credential)) { + if (removed) memset(s, 0, sizeof(*s)); + else s->deleting = false; + } + xSemaphoreGive(mutex); +} +void ts_ssh_service_forget_stopped(void) { + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < TS_SSH_COMMANDS_MAX; ++i) + if (services[i].id[0] && !occupied(&services[i])) memset(&services[i], 0, sizeof(services[i])); + xSemaphoreGive(mutex); +} +esp_err_t ts_ssh_service_cached(const char *id, ts_ssh_service_status_t *out) { + if (!mutex || !id || !out) return ESP_ERR_INVALID_ARG; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + memset(out, 0, sizeof(*out)); + if (s) *out = s->status; + else { strcpy(out->state, "unknown"); strcpy(out->source, "none"); } + xSemaphoreGive(mutex); + return ESP_OK; +} +/* Three retries per launch, never replenished by query, UI, or recovery success. */ +void ts_ssh_service_recovery_kick(const char *id) { + ts_ssh_log_watch_config_t cfg = {.recovery_only = true, .timeout_sec = 20, .check_interval_ms = 5000}; + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + bool start = s && !s->recovery_worker && !s->deleting && !s->status.busy && + s->ready_evidence && s->recovery_left && !strcmp(s->status.state, "unknown"); + if (start) { + s->recovery_worker = true; + cfg.run_generation = s->status.generation; + strcpy(cfg.command_id, s->id); strcpy(cfg.host_id, s->host_id); strcpy(cfg.var_name, s->variable); + } + xSemaphoreGive(mutex); + if (start && ts_ssh_log_watch_start(&cfg, NULL) != ESP_OK) { + xSemaphoreTake(mutex, portMAX_DELAY); + s = find(id); + if (s && s->status.generation == cfg.run_generation) s->recovery_worker = false; + xSemaphoreGive(mutex); + } +} +bool ts_ssh_service_recover(const char *id, uint32_t generation) { + ts_ssh_service_status_t status; + inspect(id, false, generation, &status); + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + bool again = s && s->status.generation == generation && s->ready_evidence && + s->recovery_left && !strcmp(s->status.state, "unknown"); + xSemaphoreGive(mutex); + return again; +} +void ts_ssh_service_recovery_done(const char *id, uint32_t generation) { + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + if (s && s->status.generation == generation) s->recovery_worker = false; + xSemaphoreGive(mutex); +} + +/* Rule ownership survives queue completion and even missing/replaced templates. */ +void ts_ssh_service_set_owner(const char *id, uint32_t registration, const char *rule) { + xSemaphoreTake(mutex, portMAX_DELAY); + service_t *s = find(id); + if (s && s->registration == registration && s->pins) + snprintf(s->owner_rule, sizeof(s->owner_rule), "%s", rule); + xSemaphoreGive(mutex); +} +bool ts_ssh_service_rule_protected(const char *rule) { + bool busy = false; + xSemaphoreTake(mutex, portMAX_DELAY); + for (unsigned i = 0; i < TS_SSH_COMMANDS_MAX; ++i) + if (services[i].id[0] && !strcmp(services[i].owner_rule, rule) && occupied(&services[i])) + busy = true; + xSemaphoreGive(mutex); + return busy; +} diff --git a/components/ts_webui/CMakeLists.txt b/components/ts_webui/CMakeLists.txt index 1e10d88..b9383bd 100644 --- a/components/ts_webui/CMakeLists.txt +++ b/components/ts_webui/CMakeLists.txt @@ -66,6 +66,6 @@ if(EXISTS "${WEB_SRC_DIR}") add_custom_target(optimize_web ALL DEPENDS ${FINAL_STAMP}) # 从优化后的构建目录创建 SPIFFS 镜像 - spiffs_create_partition_image(www ${WEB_BUILD_DIR} FLASH_IN_PROJECT) + spiffs_create_partition_image(www ${WEB_BUILD_DIR} FLASH_IN_PROJECT DEPENDS optimize_web) endif() diff --git a/components/ts_webui/src/ts_webui_ws.c b/components/ts_webui/src/ts_webui_ws.c index d0a1abd..96a44dc 100644 --- a/components/ts_webui/src/ts_webui_ws.c +++ b/components/ts_webui/src/ts_webui_ws.c @@ -581,7 +581,7 @@ static void handle_terminal_command(httpd_req_t *req, const char *command) return; } - TS_LOGD(TAG, "Terminal exec: %s", command); + TS_LOGD(TAG, "Terminal exec (%u bytes)", (unsigned)strlen(command)); // 清空输出缓冲区 if (s_output_mutex && xSemaphoreTake(s_output_mutex, pdMS_TO_TICKS(100)) == pdTRUE) { diff --git a/components/ts_webui/web/index.html b/components/ts_webui/web/index.html index 78583e4..25eb98c 100644 --- a/components/ts_webui/web/index.html +++ b/components/ts_webui/web/index.html @@ -41,9 +41,9 @@ .modal-content{background:var(--bg-card);border-radius:var(--radius-lg);max-width:600px;width:95%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg)} - - - + + + @@ -77,7 +77,7 @@ 安全

    -
    +
    未登录
    @@ -247,38 +247,46 @@

    电压保护设置

    - - - - - + + + + + diff --git a/components/ts_webui/web/js/api.js b/components/ts_webui/web/js/api.js index 79dd483..db9f9e4 100644 --- a/components/ts_webui/web/js/api.js +++ b/components/ts_webui/web/js/api.js @@ -37,6 +37,55 @@ function getApiUrl(endpoint) { return `${API_BASE}${endpoint}`; } +// Keep REST business failures as returned envelopes. Strict consumers opt in below. +function apiErrorReason(result) { + for (const value of [result?.rawMessage, result?.error, result?.message]) { + if (typeof value === 'string' && value.trim()) return value.trim(); + } + return ''; +} +function apiErrorMessage(result, operation = '') { + const raw = apiErrorReason(result); + const reasons = { + 'Invalid credentials': 'credentials', 'Invalid username or password': 'credentials', 'Old password is incorrect': 'oldPassword', + 'SD card not mounted': 'sdUnavailable', 'SD card already mounted': 'sdMounted', + 'File not found': 'fileMissing', 'Directory not found': 'directoryMissing', + 'Source file not found': 'fileMissing', 'Cannot delete root directory': 'rootDirectory', + 'Failed to stat file': 'fileInfo', 'Memory allocation failed': 'memory', + 'Request timeout': 'timeout', 'Failed to fetch': 'connection' + }; + const codes = ['unknownError', 'invalidInput', 'notFound', 'permission', 'busy', 'timeout', + 'memory', 'internal', 'unsupported', 'hardware', 'connection', 'auth']; + const names = {INVALID_ARG:1, NOT_FOUND:2, NO_PERMISSION:3, BUSY:4, TIMEOUT:5, + NO_MEM:6, INTERNAL:7, NOT_SUPPORTED:8, HARDWARE:9, CONNECTION:10, AUTH:11}; + const code = typeof result?.code === 'number' ? result.code : names[result?.code]; + const key = result?.kind === 'timeout' ? (result.uncertain ? 'resultUnknown' : 'timeout') + : result?.kind === 'network' ? (result.uncertain ? 'resultUnknown' : 'connection') + : result?.kind === 'format' ? (result.uncertain ? 'resultUnknown' : 'invalidResponse') + : reasons[raw] || codes[code] || 'unknownError'; + const message = t('promptRepair.' + key); + // Unknown backend text remains diagnostic detail, not the entire user explanation. + const detail = raw && !reasons[raw] ? '\n' + t('promptRepair.details', {detail: raw}) : ''; + return message + detail; +} +class ApiOperationError extends Error { + constructor(result, operation = '', metadata = {}) { + super(apiErrorMessage({...result, ...metadata}, operation)); + this.name = 'ApiOperationError'; + this.code = result?.code; + this.rawMessage = apiErrorReason(result); + this.operation = operation; + this.httpStatus = result?.httpStatus; + Object.assign(this, metadata); + } +} +function requireApiSuccess(result, operation = '') { + if (!result || result.code !== 0 || (result.httpStatus && result.httpStatus >= 400)) { + throw new ApiOperationError(result, operation); + } + return result; +} + class TianShanAPI { constructor() { // 从 localStorage 恢复 token(注意 key 是 ts_token) @@ -92,14 +141,16 @@ class TianShanAPI { console.debug(`API ${method} ${endpoint}: body size = ${options.body.length} bytes`); } + let httpStatus; try { const response = await fetch(getApiUrl(endpoint), options); - clearTimeout(timeoutId); + httpStatus = response.status; const text = await response.text(); let json; try { json = JSON.parse(text); } catch (parseErr) { + if (!response.ok) throw new ApiOperationError({error: text}, endpoint, {httpStatus: response.status}); // 响应可能被 WebSocket 等数据污染(如 ~{"type"...),尝试从某处解析出带 code 的 API 格式 if (parseErr instanceof SyntaxError && text) { let idx = 0; @@ -120,8 +171,16 @@ class TianShanAPI { } // 返回 JSON 响应,即使是错误码也返回(让调用者决定如何处理) - if (!response.ok && !json.code) { - throw new Error(json.message || json.error || 'Request failed'); + if (!response.ok) throw new ApiOperationError(json, endpoint, {httpStatus: response.status}); + const logoutResponse = endpoint === '/auth/logout' && method === 'POST'; + if (!json || typeof json !== 'object' || Array.isArray(json) || + (logoutResponse ? json.success !== true : !('code' in json))) { + throw new ApiOperationError({}, endpoint, {kind: 'format', uncertain: method !== 'GET', httpStatus: response.status}); + } + json.httpStatus = response.status; + if (!logoutResponse && json.code !== 0) { + json.rawMessage = apiErrorReason(json); + json.message = apiErrorMessage(json, endpoint); } const isAuthEndpoint = endpoint === '/auth/login' || endpoint === '/auth/logout'; @@ -136,13 +195,11 @@ class TianShanAPI { return json; } catch (error) { + if (error instanceof ApiOperationError) throw error; + const kind = controller.signal.aborted ? 'timeout' : error instanceof SyntaxError ? 'format' : 'network'; + throw new ApiOperationError({message: error.message}, endpoint, {kind, uncertain: method !== 'GET', httpStatus}); + } finally { clearTimeout(timeoutId); - if (error.name === 'AbortError') { - console.error(`API Timeout: ${endpoint} (>${timeout}ms)`); - throw new Error('Request timeout'); - } - console.error(`API Error: ${endpoint}`, error); - throw error; } } @@ -186,7 +243,10 @@ class TianShanAPI { async login(username, password) { const result = await this.call('auth.login', { username, password }, 'POST'); - if ((result.success || result.code === 0 || result.code === 'OK') && result.data?.token) { + if (result.code === 0 && (typeof result.data?.token !== 'string' || !result.data.token)) { + throw new ApiOperationError({}, 'auth.login', {kind: 'format'}); + } + if (result.code === 0 && result.data?.token) { this.token = result.data.token; this.username = result.data.username; this.level = result.data.level; @@ -200,15 +260,20 @@ class TianShanAPI { } async logout() { + // request() captures Authorization before local credentials are cleared. + const pending = this.token ? this.call('auth.logout', {token: this.token}, 'POST') : null; + this.clearAuth(); try { - if (this.token) { - await this.call('auth.logout', { token: this.token }, 'POST'); + if (pending) { + await pending; + return {localCleared: true, serverConfirmed: true}; } - } finally { - this.clearAuth(); + return {localCleared: true, serverConfirmed: false}; + } catch (error) { + return {localCleared: true, serverConfirmed: false, error}; } } - + async checkAuthStatus() { if (!this.token) return { valid: false }; const result = await this.call('auth.status', { token: this.token }, 'POST'); @@ -467,7 +532,7 @@ class TianShanAPI { }); if (!response.ok) { const error = await response.json().catch(() => ({ message: 'Download failed' })); - throw new Error(error.message); + throw new ApiOperationError(error, 'file.download', {httpStatus: response.status}); } return response.blob(); } @@ -486,8 +551,8 @@ class TianShanAPI { body: content }); const json = await response.json(); - if (!response.ok) { - throw new Error(json.message || 'Upload failed'); + if (!response.ok || json.status !== 'uploaded' || (json.code !== undefined && json.code !== 0)) { + throw new ApiOperationError(json, 'file.upload', {httpStatus: response.status}); } return json; } @@ -512,7 +577,8 @@ class TianShanAPI { params.keyid = auth.keyid; } // 主机指纹验证参数 - params.trust_new = options.trust_new ?? true; // 新主机自动信任(默认 true) + params.trust_new = options.trust_new ?? false; // 新主机必须明确确认指纹 + params.confirmed_fingerprint = options.confirmed_fingerprint; params.accept_changed = options.accept_changed ?? false; // 指纹变化是否接受(默认 false) return this.call('ssh.test', params, 'POST'); } @@ -529,7 +595,8 @@ class TianShanAPI { params.keyid = auth.keyid; } // 主机指纹验证参数 - params.trust_new = options.trust_new ?? true; + params.trust_new = options.trust_new ?? false; + params.confirmed_fingerprint = options.confirmed_fingerprint; params.accept_changed = options.accept_changed ?? false; return this.call('ssh.exec', params, 'POST'); } @@ -538,7 +605,8 @@ class TianShanAPI { async sshCopyid(host, user, password, keyid, port = 22, verify = true, options = {}) { return this.call('ssh.copyid', { host, user, password, keyid, port, verify, - trust_new: options.trust_new ?? true, + trust_new: options.trust_new ?? false, + confirmed_fingerprint: options.confirmed_fingerprint, accept_changed: options.accept_changed ?? false }, 'POST'); } @@ -547,7 +615,8 @@ class TianShanAPI { async sshRevoke(host, user, password, keyid, port = 22, options = {}) { return this.call('ssh.revoke', { host, user, password, keyid, port, - trust_new: options.trust_new ?? true, + trust_new: options.trust_new ?? false, + confirmed_fingerprint: options.confirmed_fingerprint, accept_changed: options.accept_changed ?? false }, 'POST'); } diff --git a/components/ts_webui/web/js/app.js b/components/ts_webui/web/js/app.js index 77e01be..9def959 100644 --- a/components/ts_webui/web/js/app.js +++ b/components/ts_webui/web/js/app.js @@ -1,3 +1,18 @@ + +function runtimeText(key) { + const translated = typeof t === 'function' ? t('runtimeRepair.' + key) : ''; + return translated && translated !== 'runtimeRepair.' + key ? translated : key; +} +function runtimeSaveError(result) { + const code = result.data?.error_code || result.rawMessage || result.error || result.message; + const known = ['revision_conflict', 'source_read_only', 'recovery_required', 'commit_unknown', 'execution_busy', 'service_busy', 'busy_retired_config']; + return known.includes(code) ? runtimeText(code) : (typeof code === 'string' ? code : runtimeText('saveFailed')); +} +async function ruleWriteWithRevision(method, id) { + const current = await api.call('automation.rules.get', { id }); + if (current.code !== 0 || !Number.isInteger(current.data?.revision)) return current; + return api.call(method, { id, expected_revision: current.data.revision }); +} /** * TianshanOS Web App - Main Application */ @@ -7,6 +22,14 @@ if (typeof window.t === 'undefined') window.t = function(k) { return k; }; // 全局状态 // ========================================================================= +// Capture once at entry; do not ask which page is current after an await. +function capturePageValidity() { + const navigation = typeof router !== 'undefined' ? router.navigation : null; + const content = document.getElementById('page-content'); + return () => (typeof router === 'undefined' || router.navigation === navigation) && + (!navigation || navigation.isCurrent()) && document.getElementById('page-content') === content; +} + let ws = null; let refreshInterval = null; let subscriptionManager = null; // WebSocket 订阅管理器 @@ -169,15 +192,13 @@ document.addEventListener('DOMContentLoaded', () => { router.register('/automation', loadAutomationPage); // 语言切换时重新渲染当前页,使主内容使用新语言;下一帧恢复右上角登录态(避免 translateDOM 覆盖 #user-name) - window.addEventListener('languageChanged', () => { - if (typeof stopSystemPageTimers === 'function') { - stopSystemPageTimers(); - } - const loader = router.getCurrentLoader(); - if (loader) loader(); + window.addEventListener('languageChanged', (event) => { + if (event.detail?.initial) return; + router.navigate(); setTimeout(() => updateAuthUI(), 0); }); + window.dispatchEvent(new CustomEvent('appReady')); // 启动 WebSocket setupWebSocket(); @@ -303,12 +324,12 @@ document.getElementById('login-form')?.addEventListener('submit', async (e) => { async function logout() { try { - await api.logout(); - showToast(t('toast.loggedOut'), 'info'); + const result = await api.logout(); + if (api.token) return; // A newer sign-in owns the UI now. + showToast(t(result.serverConfirmed ? 'promptRepair.logoutConfirmed' : 'promptRepair.logoutLocal'), result.serverConfirmed ? 'info' : 'warning', 7000); } finally { updateAuthUI(); - window.location.hash = '/'; // 重定向到首页 - router.navigate(); + if (!api.token) router.navigate('/'); } } @@ -411,11 +432,29 @@ async function updateFooterVersion() { // WebSocket // ========================================================================= +let webSocketConnected = false; +function renderWsStatus(connected = webSocketConnected) { + webSocketConnected = connected; + const el = document.getElementById('ws-status'); + if (!el) return; + el.classList.toggle('connected', connected); + el.setAttribute('data-i18n-title', connected ? 'network.connected' : 'network.disconnected'); + el.title = t(connected ? 'network.connected' : 'network.disconnected'); + el.setAttribute('aria-label', el.title); +} +window.addEventListener('languageChanged', () => { + renderWsStatus(); + const toast = document.getElementById('toast'); + if (toast) { clearTimeout(toastTimer); toast.classList.remove('show'); toastDeadline = 0; } + if (lastPowerEvent) renderPowerNotice(lastPowerEvent); + updateModalWsStatus(webSocketConnected); +}); + function setupWebSocket() { ws = new TianShanWS( (msg) => handleEvent(msg), - () => document.getElementById('ws-status')?.classList.add('connected'), - () => document.getElementById('ws-status')?.classList.remove('connected') + () => renderWsStatus(true), + () => renderWsStatus(false) ); ws.connect(); @@ -511,18 +550,34 @@ function handleEvent(msg) { } // 处理电压保护事件 +let lastPowerEvent = null; +function renderPowerNotice(msg) { + let notice = document.getElementById('power-notice'); + if (!notice) { + notice = document.createElement('div'); notice.id = 'power-notice'; + notice.setAttribute('role', 'alert'); + notice.style.cssText = 'position:fixed;bottom:20px;left:20px;z-index:1100;background:#fff;padding:12px;border:2px solid #e11d48;white-space:pre-wrap'; + document.body.appendChild(notice); + } + const key = msg.state === 'PROTECTED' ? 'toast.voltageProtectionTriggered' : msg.state === 'RECOVERY' ? 'toast.voltageRecovering' : 'toast.lowVoltageWarning'; + notice.textContent = t(key, {voltage: msg.voltage?.toFixed(2) || '?', countdown: msg.countdown || 0}); + notice.hidden = !['LOW_VOLTAGE', 'SHUTDOWN', 'PROTECTED', 'RECOVERY'].includes(msg.state); +} + function handlePowerEvent(msg) { + lastPowerEvent = msg; + renderPowerNotice(msg); const state = msg.state; const voltage = msg.voltage?.toFixed(2) || '?'; const countdown = msg.countdown || 0; // 显示警告 if (state === 'LOW_VOLTAGE' || state === 'SHUTDOWN') { - showToast(typeof t === 'function' ? t('system.lowVoltageWarning', { voltage, countdown }) : `低电压警告: ${voltage}V (${countdown}s)`, 'warning', 5000); + showToast(typeof t === 'function' ? t('toast.lowVoltageWarning', { voltage, countdown }) : `低电压警告: ${voltage}V (${countdown}s)`, 'warning', 5000); } else if (state === 'PROTECTED') { - showToast(typeof t === 'function' ? t('system.voltageProtectionTriggered') : '电压保护已触发', 'error', 10000); + showToast(typeof t === 'function' ? t('toast.voltageProtectionTriggered') : '电压保护已触发', 'error', 10000); } else if (state === 'RECOVERY') { - showToast(typeof t === 'function' ? t('system.voltageRecovering', { voltage }) : `电压恢复中: ${voltage}V`, 'info', 3000); + showToast(typeof t === 'function' ? t('toast.voltageRecovering', { voltage }) : `电压恢复中: ${voltage}V`, 'info', 3000); } } @@ -531,6 +586,7 @@ function handlePowerEvent(msg) { // ========================================================================= async function loadSystemPage() { + const pageCurrent = capturePageValidity(); clearInterval(refreshInterval); // 取消之前设置的快捷操作刷新定时器(防止切换到其他页后仍触发) @@ -539,16 +595,6 @@ async function loadSystemPage() { quickActionsTimeoutId = null; } - // 取消之前的订阅 - if (subscriptionManager) { - subscriptionManager.unsubscribe('system.dashboard'); // 取消聚合订阅 - subscriptionManager.unsubscribe('system.memory'); - subscriptionManager.unsubscribe('system.cpu'); - subscriptionManager.unsubscribe('network.status'); - subscriptionManager.unsubscribe('power.status'); - subscriptionManager.unsubscribe('fan.status'); - subscriptionManager.unsubscribe('service.list'); - } // 停止 uptime 计算 if (window.systemUptimeInterval) { @@ -760,19 +806,23 @@ async function loadSystemPage() { // 初始加载(不含快捷操作,避免 ssh.commands.list 慢响应阻塞) await refreshSystemPageOnce(); + if (!pageCurrent()) return; // 加载数据监控面板(优先执行,确保组件能实时获取变量数据) await initDataWidgets(); + if (!pageCurrent()) return; // 快捷操作延迟 2 秒后台加载,避免与 initDataWidgets 的首次变量刷新竞争 API quickActionsTimeoutId = setTimeout(() => { + if (!pageCurrent()) return; quickActionsTimeoutId = null; void refreshQuickActions(); }, 2000); // 订阅 WebSocket 实时更新 - 使用聚合订阅(system.dashboard) if (subscriptionManager) { - subscriptionManager.subscribe('system.dashboard', (msg) => { + const dashboardCallback = (msg) => { + if (!pageCurrent()) return; console.log('[System Page] Received dashboard:', msg); if (!msg.data) return; @@ -786,7 +836,10 @@ async function loadSystemPage() { if (data.power) updatePowerInfo(data.power); if (data.fan) updateFanInfo(data.fan); if (data.services) updateServiceList(data.services); - }, { interval: 1000 }); // 1秒更新所有数据 + }; + const manager = subscriptionManager; + manager.subscribe('system.dashboard', dashboardCallback, {interval: 1000}); + if (typeof router !== 'undefined') router.navigation?.onDispose(() => manager.unsubscribe('system.dashboard', dashboardCallback)); } // 启动浏览器本地时间更新定时器 @@ -831,37 +884,46 @@ async function loadSystemPage() { // 单次刷新(初始加载);refreshSystemPage 为别名,供时区/服务操作等调用 async function refreshSystemPageOnce() { + const pageCurrent = capturePageValidity(); // 系统信息 try { const info = await api.getSystemInfo(); + if (!pageCurrent()) return; if (info.data) { updateSystemInfo(info.data); } - } catch (e) { console.log('System info error:', e); } + } catch (e) { + if (!pageCurrent()) return; console.log('System info error:', e); } // 时间信息 try { const time = await api.timeInfo(); + if (!pageCurrent()) return; if (time.data) { updateTimeInfo(time.data); } - } catch (e) { console.log('Time info error:', e); } + } catch (e) { + if (!pageCurrent()) return; console.log('Time info error:', e); } // 内存 try { const mem = await api.getMemoryInfo(); + if (!pageCurrent()) return; if (mem.data) { updateMemoryInfo(mem.data); } - } catch (e) { console.log('Memory info error:', e); } + } catch (e) { + if (!pageCurrent()) return; console.log('Memory info error:', e); } // 网络 try { const netStatus = await api.networkStatus(); + if (!pageCurrent()) return; if (netStatus.data) { updateNetworkInfo(netStatus.data); } } catch (e) { + if (!pageCurrent()) return; document.getElementById('eth-status').textContent = '-'; document.getElementById('wifi-status').textContent = '-'; } @@ -869,15 +931,18 @@ async function refreshSystemPageOnce() { // 电源 try { const powerStatus = await api.powerStatus(); + if (!pageCurrent()) return; if (powerStatus.data) { updatePowerInfo(powerStatus.data); } const protStatus = await api.powerProtectionStatus(); + if (!pageCurrent()) return; if (protStatus.data) { const running = protStatus.data.running || protStatus.data.initialized; updateProtectionUI(running); } - } catch (e) { + } catch (e) { + if (!pageCurrent()) return; document.getElementById('voltage').textContent = '-'; document.getElementById('current').textContent = '-'; document.getElementById('power-watts').textContent = '-'; @@ -886,32 +951,40 @@ async function refreshSystemPageOnce() { // 风扇 try { const fans = await api.fanStatus(); + if (!pageCurrent()) return; updateFanInfo(fans.data); - } catch (e) { + } catch (e) { + if (!pageCurrent()) return; document.getElementById('fans-grid').innerHTML = '

    ' + t('fan.statusUnavailable') + '

    '; } // 服务列表 try { const services = await api.serviceList(); + if (!pageCurrent()) return; updateServiceList(services.data); } catch (e) { + if (!pageCurrent()) return; console.log('Services error:', e); } // LED 设备 await refreshSystemLeds(); + if (!pageCurrent()) return; // 快捷操作已移至 loadSystemPage 末尾后台执行,避免阻塞 initDataWidgets // USB Mux 状态 await refreshUsbMuxStatus(); + if (!pageCurrent()) return; // AGX 电源状态 await refreshAgxPowerState(); + if (!pageCurrent()) return; // LPMU 状态检测 await refreshLpmuState(); + if (!pageCurrent()) return; } const refreshSystemPage = refreshSystemPageOnce; @@ -926,14 +999,17 @@ const USB_MUX_DISPLAY = { 'esp32': 'ESP', 'agx': 'AGX', 'lpmu': 'LPMU' }; const USB_MUX_COLORS = { 'esp32': '', 'agx': 'btn-service-style', 'lpmu': 'btn-success' }; async function refreshUsbMuxStatus() { + const pageCurrent = capturePageValidity(); try { const result = await api.call('device.usb.status'); + if (!pageCurrent()) return; if (result.code === 0 && result.data) { usbMuxConfigured = result.data.configured !== false; usbMuxTarget = result.data.target || 'esp32'; updateUsbMuxButton(); } } catch (e) { + if (!pageCurrent()) return; console.warn('USB Mux status unavailable:', e.message); usbMuxConfigured = false; updateUsbMuxButton(); @@ -1054,13 +1130,16 @@ async function toggleUsbMux() { let agxPowerState = false; // false=断电(HIGH), true=上电(LOW) async function refreshAgxPowerState() { + const pageCurrent = capturePageValidity(); try { const result = await api.call('device.status', { device: 'agx' }); + if (!pageCurrent()) return; if (result.code === 0 && result.data) { agxPowerState = result.data.state === 'on' || result.data.state === 'booting'; updateAgxPowerButton(); } } catch (e) { + if (!pageCurrent()) return; console.warn('AGX status unavailable:', e.message); } } @@ -1110,7 +1189,7 @@ let lpmuPollingStartTime = 0; let lpmuPollingMode = 'startup'; // 'startup' | 'shutdown' async function toggleLpmuPower() { - if (!confirm(t('system.lpmuTriggerConfirm'))) { + if (!confirmAction(t('system.lpmuTriggerConfirm'))) { return; } @@ -1135,71 +1214,43 @@ async function toggleLpmuPower() { } // 启动 LPMU 状态轮询(触发电源后调用) +let lpmuPollGeneration = 0; function startLpmuStatePolling(wasOnline = false) { stopLpmuStatePolling(); - + const generation = lpmuPollGeneration; lpmuState = 'detecting'; lpmuPollingMode = wasOnline ? 'shutdown' : 'startup'; updateLpmuPowerButton(); - lpmuPollingStartTime = Date.now(); - const minWaitSec = wasOnline ? 40 : 0; const maxWaitSec = wasOnline ? 60 : 80; - + let pending = false; lpmuPollingInterval = setInterval(async () => { - const elapsed = (Date.now() - lpmuPollingStartTime) / 1000; - const remaining = Math.round(maxWaitSec - elapsed); - - let isReachable = false; + if (pending) return; + pending = true; + let reachable = null; try { - const result = await api.call('device.ping', { host: '10.10.99.99', timeout: 1000 }); - isReachable = result.code === 0 && result.data && result.data.reachable; - } catch (e) {} - - if (lpmuPollingMode === 'startup') { - if (isReachable) { - lpmuState = 'online'; - updateLpmuPowerButton(); - stopLpmuStatePolling(); - showToast(t('system.lpmuOnlineSuccess') + ' (' + Math.round(elapsed) + (getLanguage() === 'zh-CN' ? '秒' : 's') + ')', 'success'); - return; - } - updateLpmuPowerButton(remaining); - if (elapsed >= maxWaitSec) { - lpmuState = 'offline'; - updateLpmuPowerButton(); - stopLpmuStatePolling(); - showToast(t('system.lpmuStartupTimeout'), 'warning'); - } - } else { - if (elapsed < minWaitSec) { - updateLpmuPowerButton(remaining); - return; - } - if (!isReachable) { - lpmuState = 'offline'; - updateLpmuPowerButton(); - stopLpmuStatePolling(); - showToast(t('system.lpmuOfflineSuccess') + ' (' + Math.round(elapsed) + (getLanguage() === 'zh-CN' ? '秒' : 's') + ')', 'success'); - return; - } - updateLpmuPowerButton(remaining); - if (elapsed >= maxWaitSec) { - lpmuState = 'online'; - updateLpmuPowerButton(); - stopLpmuStatePolling(); - showToast(t('system.lpmuShutdownTimeout'), 'warning'); - } - } + const result = requireApiSuccess(await api.call('device.ping', {host: '10.10.99.99', timeout: 1000}), 'device.ping'); + if (typeof result.data?.reachable === 'boolean') reachable = result.data.reachable; + } catch (error) { console.warn('LPMU reachability check failed', error); } + finally { pending = false; } + if (generation !== lpmuPollGeneration) return; + const elapsed = (Date.now() - lpmuPollingStartTime) / 1000; + const reachedTarget = elapsed >= minWaitSec && reachable === !wasOnline; + if (reachedTarget || elapsed >= maxWaitSec) { + lpmuState = reachable === null ? 'unknown' : reachable ? 'online' : 'offline'; + stopLpmuStatePolling(); + updateLpmuPowerButton(); + const key = reachable === null ? 'lpmuProbeFailed' : reachable ? 'lpmuReachable' : 'lpmuUnreachable'; + showToast(t('promptRepair.' + key), 'info', 7000); + } else updateLpmuPowerButton(Math.max(0, Math.ceil(maxWaitSec - elapsed))); }, 5000); } function stopLpmuStatePolling() { - if (lpmuPollingInterval) { - clearInterval(lpmuPollingInterval); - lpmuPollingInterval = null; - } + lpmuPollGeneration++; + if (lpmuPollingInterval) clearInterval(lpmuPollingInterval); + lpmuPollingInterval = null; } function startDeviceStateMonitor() { @@ -1227,16 +1278,19 @@ function stopDeviceStateMonitor() { } async function refreshLpmuState() { + const pageCurrent = capturePageValidity(); if (lpmuPollingInterval) return; try { const result = await api.call('device.ping', { host: '10.10.99.99', timeout: 1000 }); - if (result.code === 0 && result.data) { + if (!pageCurrent()) return; + if (result.code === 0 && typeof result.data?.reachable === 'boolean') { lpmuState = result.data.reachable ? 'online' : 'offline'; } else { lpmuState = 'unknown'; } } catch (e) { + if (!pageCurrent()) return; lpmuState = 'unknown'; } updateLpmuPowerButton(); @@ -1370,7 +1424,7 @@ function updateMemoryInfo(data) { document.getElementById('psram-text').textContent = `${formatBytes(psramUsed)} / ${formatBytes(psramTotal)} (${psramPercent}%)`; } else { - document.getElementById('psram-text').textContent = typeof t === 'function' ? t('otaPage.psramUnavailable') : '不可用'; + document.getElementById('psram-text').textContent = typeof t === 'function' ? t('ui.psramUnavailable') : '不可用'; } } @@ -1654,8 +1708,8 @@ function updateServiceList(data) { svc.state === 'ERROR' ? 'status-error' : 'status-warn'; tr.innerHTML = ` ${svc.name} - ${svc.state} - ${svc.phase} + ${userStateLabel(svc.state)} + ${servicePhaseLabel(svc.phase)} ${svc.healthy ? '' : ''} @@ -1729,15 +1783,15 @@ function hideServicesModal() { async function setFanSpeed(id, speed) { try { - await api.fanSet(id, parseInt(speed)); + requireApiSuccess(await api.fanSet(id, parseInt(speed)), 'fanSet'); showToast(typeof t === 'function' ? t('fan.speedSet', { id, speed }) : `风扇 ${id} 速度已设置为 ${speed}%`, 'success'); } catch (e) { showToast((typeof t === 'function' ? t('fan.setFanFailed', { msg: e.message }) : '设置风扇失败: ' + e.message), 'error'); } } async function setFanMode(id, mode) { try { - await api.call('fan.mode', { id: id, mode: mode }); - showToast(typeof t === 'function' ? t('fan.modeSwitch', { id, mode }) : `风扇 ${id} 模式已切换为 ${mode}`, 'success'); + requireApiSuccess(await api.call('fan.mode', { id: id, mode: mode }), 'call'); + showToast(typeof t === 'function' ? t('fan.modeSwitch', { id, mode: t({off:'common.disabled', manual:'common.manual', auto:'common.auto', curve:'fan.curve'}[mode] || 'common.unknown') }) : `风扇 ${id} 模式已切换为 ${mode}`, 'success'); await refreshFans(); } catch (e) { showToast((typeof t === 'function' ? t('fan.setFanModeFailed', { msg: e.message }) : '设置风扇模式失败: ' + e.message), 'error'); } } @@ -1962,14 +2016,14 @@ function buildVarSelectOptions(selectedName) { let html = ''; if (priorityVars.length > 0) { - html += ``; + html += ``; priorityVars.forEach(v => { html += renderOption(v); }); html += ``; } if (otherVars.length > 0) { - html += ``; + html += ``; otherVars.forEach(v => { html += renderOption(v); }); @@ -1979,7 +2033,7 @@ function buildVarSelectOptions(selectedName) { /* 如果已选变量不在列表中,追加显示 */ if (selectedName && !availableTempVars.find(v => v.name === selectedName)) { const safeName = typeof escapeHtml === 'function' ? escapeHtml(selectedName) : selectedName; - html += ``; + html += ``; } return html; @@ -2474,7 +2528,7 @@ async function bindTempVariable() { const result = await api.call('temp.bind', { variables }); if (result.code === 0) { - await api.call('temp.select', { source: 'variable' }); + requireApiSuccess(await api.call('temp.select', { source: 'variable' }), 'call'); showToast(t('fanPage.tempBoundWeighted', { count: variables.length }), 'success'); @@ -2561,7 +2615,7 @@ async function applyFanCurve() { }); if (limitsResult.code !== 0) { - throw new Error(limitsResult.message || '设置占空比限制失败'); + throw new Error(limitsResult.message || t('dataWidget.setDutyLimitFailed')); } // 2. 设置曲线(同时传递 hysteresis 和 min_interval,会自动保存到 NVS) @@ -2573,7 +2627,7 @@ async function applyFanCurve() { }); if (curveResult.code !== 0) { - throw new Error(curveResult.message || '设置曲线失败'); + throw new Error(curveResult.message || t('dataWidget.setCurveFailed')); } // 3. 切换到曲线模式 @@ -2583,7 +2637,7 @@ async function applyFanCurve() { }); if (modeResult.code !== 0) { - throw new Error(modeResult.message || '切换模式失败'); + throw new Error(modeResult.message || t('promptRepair.modeFailed')); } showToast(typeof t === 'function' ? t('fanPage.curveApplied', { id: fanId }) : `风扇 ${fanId} 曲线已应用并保存`, 'success'); @@ -2758,10 +2812,10 @@ async function updateFanCurvePreview() { async function serviceAction(name, action) { try { - if (action === 'restart') await api.serviceRestart(name); - else if (action === 'start') await api.serviceStart(name); - else if (action === 'stop') await api.serviceStop(name); - showToast(typeof t === 'function' ? t('toast.serviceSuccess', { name, action }) : `服务 ${name} ${action} 成功`, 'success'); + if (action === 'restart') requireApiSuccess(await api.serviceRestart(name), 'service.restart'); + else if (action === 'start') requireApiSuccess(await api.serviceStart(name), 'service.start'); + else if (action === 'stop') requireApiSuccess(await api.serviceStop(name), 'service.stop'); + showToast(typeof t === 'function' ? t({start:'promptRepair.serviceStarted', stop:'promptRepair.serviceStopped', restart:'promptRepair.serviceRestarted'}[action], {name}) : `服务 ${name} ${action} 成功`, 'success'); await refreshSystemPage(); } catch (e) { showToast(typeof t === 'function' ? t('toast.operationFailedMsg', { msg: e.message }) : `操作失败: ${e.message}`, 'error'); @@ -2769,11 +2823,11 @@ async function serviceAction(name, action) { } function confirmReboot() { - if (confirm(t('system.rebootConfirm'))) { + if (confirmAction(t('system.rebootConfirm'))) { showToast(t('system.rebootSending'), 'info'); api.reboot(500) .then((result) => { - console.log('Reboot response:', result); + requireApiSuccess(result, 'system.reboot'); showToast(t('system.rebootingPleaseWait'), 'success'); }) .catch((err) => { @@ -2786,11 +2840,13 @@ function confirmReboot() { // LED 控制(系统页面内嵌版) async function refreshSystemLeds() { + const pageCurrent = capturePageValidity(); const container = document.getElementById('system-led-devices-grid'); if (!container) return; try { const result = await api.ledList(); + if (!pageCurrent()) return; if (result.data && result.data.devices && result.data.devices.length > 0) { // 存储设备信息 @@ -2820,14 +2876,15 @@ async function refreshSystemLeds() { container.innerHTML = `
    -

    未找到 LED 设备

    -

    LED 设备可能尚未启动

    +

    ${t('ledPage.ledNotFound')}

    +

    ${t('ledPage.ledNotStarted')}

    `; } } catch (e) { + if (!pageCurrent()) return; console.error('LED list error:', e); - container.innerHTML = `
    ${typeof t === 'function' ? t('common.loadFailedMsg', { msg: e.message }) : '加载失败: ' + e.message}
    `; + container.innerHTML = `
    ${escapeHtml(typeof t === 'function' ? t('common.loadFailedMsg', { msg: e.message }) : '加载失败: ' + e.message)}
    `; } } @@ -2838,69 +2895,69 @@ async function refreshSystemLeds() { */ const WIDGET_TYPES = { ring: { - name: '环形进度', + get name() { return t('dataWidget.typeRing'); }, icon: '', - description: '圆环百分比,适合 CPU/内存/磁盘使用率', + get description() { return t('dataWidget.typeRingDesc'); }, defaultConfig: { min: 0, max: 100, unit: '%', color: '#4dabf7', decimals: 0 } }, gauge: { - name: '仪表盘', + get name() { return t('dataWidget.typeGauge'); }, icon: '', - description: '半圆仪表,适合带刻度的数值', + get description() { return t('dataWidget.typeGaugeDesc'); }, defaultConfig: { min: 0, max: 100, unit: '', color: '#69db7c', decimals: 1 } }, temp: { - name: '温度计', + get name() { return t('dataWidget.typeTemp'); }, icon: '', - description: '垂直温度条,颜色随温度变化', + get description() { return t('dataWidget.typeTempDesc'); }, defaultConfig: { min: 0, max: 100, unit: '°C', color: '#ff8787', decimals: 0 } }, number: { - name: '数字', + get name() { return t('dataWidget.typeNumber'); }, icon: '', - description: '大号数字显示,适合功率/电压/电流', + get description() { return t('dataWidget.typeNumberDesc'); }, defaultConfig: { unit: 'W', color: '#74c0fc', icon: '', decimals: 1 } }, bar: { - name: '进度条', + get name() { return t('dataWidget.typeBar'); }, icon: '', - description: '水平进度条', + get description() { return t('dataWidget.typeBarDesc'); }, defaultConfig: { min: 0, max: 100, unit: '%', color: '#ffd43b', decimals: 1 } }, text: { - name: '文本', + get name() { return t('led.text'); }, icon: '', - description: '显示文本或格式化字符串', + get description() { return t('dataWidget.typeTextDesc'); }, defaultConfig: { unit: '', color: '#9ca3af' } }, status: { - name: '状态灯', + get name() { return t('dataWidget.typeStatus'); }, icon: '', - description: '根据值显示不同颜色状态', + get description() { return t('dataWidget.typeStatusDesc'); }, defaultConfig: { thresholds: [0, 50, 80], colors: ['#40c057', '#fab005', '#fa5252'] } }, icon: { - name: '图标状态', + get name() { return t('dataWidget.typeIcon'); }, icon: '', - description: '根据值显示不同图标', + get description() { return t('dataWidget.typeIconDesc'); }, defaultConfig: { icons: { '0': '', '1': '', 'default': '' } } }, dual: { - name: '双数值', + get name() { return t('dataWidget.typeDual'); }, icon: '', - description: '主值+副值,适合显示当前/最大等', + get description() { return t('dataWidget.typeDualDesc'); }, defaultConfig: { unit: '', color: '#74c0fc', decimals: 1 } }, percent: { - name: '百分比', + get name() { return t('dataWidget.typePercent'); }, icon: '', - description: '大号百分比数字', + get description() { return t('dataWidget.typePercentDesc'); }, defaultConfig: { min: 0, max: 100, color: '#4dabf7', decimals: 0 } }, log: { - name: '日志流', + get name() { return t('dataWidget.typeLog'); }, icon: '', - description: '从变量读取日志文本流,支持手动刷新', + get description() { return t('dataWidget.typeLogDesc'); }, defaultConfig: { maxLines: 15, color: '#495057', fullWidth: true } } }; @@ -2910,11 +2967,11 @@ const WIDGET_TYPES = { */ const LAYOUT_OPTIONS = { width: [ - { value: 'auto', label: '自动', desc: '根据内容自适应' }, - { value: 'small', label: '小', desc: '1/4 宽度' }, - { value: 'medium', label: '中', desc: '1/2 宽度' }, - { value: 'large', label: '大', desc: '3/4 宽度' }, - { value: 'full', label: '整行', desc: '独占一整行' } + { value: 'auto', get label() { return t('runtimeRepair.automatic'); }, get desc() { return t('dataWidget.layoutAutoDesc'); } }, + { value: 'small', get label() { return t('dataWidget.layoutSmall'); }, get desc() { return t('dataWidget.layoutSmallDesc'); } }, + { value: 'medium', get label() { return t('dataWidget.layoutMedium'); }, get desc() { return t('dataWidget.layoutMediumDesc'); } }, + { value: 'large', get label() { return t('dataWidget.layoutLarge'); }, get desc() { return t('dataWidget.layoutLargeDesc'); } }, + { value: 'full', get label() { return t('dataWidget.layoutFull'); }, get desc() { return t('dataWidget.layoutFullDesc'); } } ] }; @@ -2923,17 +2980,17 @@ const LAYOUT_OPTIONS = { */ const WIDGET_PRESETS = [ { id: 'cpu', label: 'CPU', type: 'ring', icon: '', color: '#4dabf7', unit: '%' }, - { id: 'mem', label: '内存', type: 'ring', icon: '', color: '#69db7c', unit: '%' }, - { id: 'disk', label: '硬盘', type: 'ring', icon: '', color: '#ffd43b', unit: '%' }, - { id: 'temp', label: '温度', type: 'temp', icon: '', color: '#ff8787', unit: '°C' }, + { id: 'mem', get label() { return t('system.memory'); }, type: 'ring', icon: '', color: '#69db7c', unit: '%' }, + { id: 'disk', get label() { return t('dataWidget.presetDisk'); }, type: 'ring', icon: '', color: '#ffd43b', unit: '%' }, + { id: 'temp', get label() { return t('fan.temperature'); }, type: 'temp', icon: '', color: '#ff8787', unit: '°C' }, { id: 'gpu', label: 'GPU', type: 'ring', icon: '', color: '#da77f2', unit: '%' }, - { id: 'power', label: '功耗', type: 'number', icon: '', color: '#74c0fc', unit: 'W' }, - { id: 'voltage', label: '电压', type: 'number', icon: '', color: '#ffa94d', unit: 'V' }, - { id: 'current', label: '电流', type: 'number', icon: '', color: '#ff6b6b', unit: 'A' }, - { id: 'network', label: '网速', type: 'bar', icon: '', color: '#38d9a9', unit: 'Mbps' }, - { id: 'status', label: '状态', type: 'status', icon: '', color: '#40c057', unit: '' }, - { id: 'uptime', label: '运行时间', type: 'text', icon: '', color: '#9ca3af', unit: '' }, - { id: 'log', label: '日志流', type: 'log', icon: '', color: '#495057', maxLines: 15, layout: 'full' }, + { id: 'power', get label() { return t('dataWidget.presetPower'); }, type: 'number', icon: '', color: '#74c0fc', unit: 'W' }, + { id: 'voltage', get label() { return t('system.voltage'); }, type: 'number', icon: '', color: '#ffa94d', unit: 'V' }, + { id: 'current', get label() { return t('system.current'); }, type: 'number', icon: '', color: '#ff6b6b', unit: 'A' }, + { id: 'network', get label() { return t('dataWidget.presetNetwork'); }, type: 'bar', icon: '', color: '#38d9a9', unit: 'Mbps' }, + { id: 'status', get label() { return t('common.status'); }, type: 'status', icon: '', color: '#40c057', unit: '' }, + { id: 'uptime', get label() { return t('system.uptime'); }, type: 'text', icon: '', color: '#9ca3af', unit: '' }, + { id: 'log', get label() { return t('dataWidget.typeLog'); }, type: 'log', icon: '', color: '#495057', maxLines: 15, layout: 'full' }, ]; // 当前配置的组件列表 @@ -2954,9 +3011,11 @@ let dataWidgetsRefreshing = false; * 优先级:后端 API (SD卡/NVS) > localStorage (兼容旧版) */ async function loadDataWidgets() { + const pageCurrent = capturePageValidity(); try { // 1. 尝试从后端加载 const response = await api.call('ui.widgets.get'); + if (!pageCurrent()) return; // API 响应格式: {code: 0, data: {widgets: [...], refresh_interval: 5000, source: "sdcard"}} if (response && response.code === 0 && response.data && response.data.widgets) { const result = response.data; @@ -2972,6 +3031,7 @@ async function loadDataWidgets() { console.log(`从 localStorage 迁移 ${localData.length} 个组件到后端`); // 保存到后端 await saveDataWidgets(); + if (!pageCurrent()) return; } } // 修复已损坏的图标数据 @@ -2979,6 +3039,7 @@ async function loadDataWidgets() { return; } } catch (e) { + if (!pageCurrent()) return; console.warn('从后端加载数据组件配置失败:', e); } @@ -3121,6 +3182,7 @@ function startDataWidgetsAutoRefresh() { * 停止自动刷新 */ function stopDataWidgetsAutoRefresh() { + dataWidgetsRefreshing = false; if (dataWidgetsIntervalId) { clearInterval(dataWidgetsIntervalId); dataWidgetsIntervalId = null; @@ -3513,10 +3575,13 @@ function updateWidgetValue(widget, value) { * 初始化数据组件面板 */ async function initDataWidgets() { - await loadDataWidgets(); // 异步加载(优先后端 API) + const pageCurrent = capturePageValidity(); + await loadDataWidgets(); + if (!pageCurrent()) return; // 异步加载(优先后端 API) loadDataWidgetsRefreshInterval(); // 兼容性保留 renderDataWidgets(); await refreshDataWidgets(); + if (!pageCurrent()) return; startDataWidgetsAutoRefresh(); } @@ -3525,6 +3590,7 @@ async function initDataWidgets() { * 使用 automation.variables.list 一次获取全部变量,避免 N 次 get 串行调用 */ async function refreshDataWidgets() { + const pageCurrent = capturePageValidity(); if (dataWidgetsRefreshing) return; dataWidgetsRefreshing = true; @@ -3551,6 +3617,7 @@ async function refreshDataWidgets() { if (varNames.size > 0) { try { const resp = await api.call('automation.variables.list', { include_meta: false }); + if (!pageCurrent()) return; if (resp.code === 0 && resp.data?.variables) { for (const v of resp.data.variables) { if (varNames.has(v.name) && v.value !== undefined) { @@ -3559,6 +3626,7 @@ async function refreshDataWidgets() { } } } catch (e) { + if (!pageCurrent()) return; console.warn('获取变量列表失败:', e); } } @@ -3578,7 +3646,7 @@ async function refreshDataWidgets() { } } } finally { - dataWidgetsRefreshing = false; + if (pageCurrent()) dataWidgetsRefreshing = false; } } @@ -3717,6 +3785,7 @@ function updateLogToggleButton(widgetId, isReading) { * 刷新日志组件一次(从变量读取) */ async function refreshLogOnce(widgetId) { + const pageCurrent = capturePageValidity(); const widget = dataWidgets.find(w => w.id === widgetId); if (!widget) return; @@ -3738,6 +3807,7 @@ async function refreshLogOnce(widgetId) { const varName = varMatch[1].trim(); const result = await api.call('automation.variables.get', { name: varName }); + if (!pageCurrent()) return; if (result.code !== 0 || result.data?.value === undefined) { container.innerHTML = '
    ' + (typeof t === 'function' ? t('fanPage.variableNoData') : '变量不存在或无数据') + '
    '; @@ -3748,6 +3818,7 @@ async function refreshLogOnce(widgetId) { appendLogToWidget(widget.id, logText, widget.maxLines || 15); } catch (e) { + if (!pageCurrent()) return; console.warn('获取日志变量失败:', e); container.innerHTML = '
    ' + (typeof t === 'function' ? t('fanPage.readFailed') : '读取失败') + '
    '; } @@ -4116,7 +4187,7 @@ function showWidgetEditPanel(widgetId) { main.innerHTML = `
    - ${typeConfig.icon || ''} ${typeof t === 'function' ? (t('dataWidget.widgetType' + (widget.type ? widget.type.charAt(0).toUpperCase() + widget.type.slice(1) : '')) || typeConfig.name) : (typeConfig.name || widget.type)} + ${typeConfig.icon || ''} ${typeof t === 'function' ? (typeConfig.name || t('common.unknown')) : (typeConfig.name || widget.type)}
    @@ -4290,7 +4361,7 @@ function deleteDataWidget(widgetId) { const widget = dataWidgets[idx]; - if (!confirm(typeof t === 'function' ? t('ui.confirmDeleteWidget', { label: widget.label }) : `确定要删除"${widget.label}"组件吗?`)) return; + if (!confirmAction(typeof t === 'function' ? t('ui.confirmDeleteWidget', { label: widget.label }) : `确定要删除"${widget.label}"组件吗?`)) return; dataWidgets.splice(idx, 1); saveDataWidgets(); @@ -4319,6 +4390,7 @@ let _sshExecCircuitBreaker = { failUntil: 0, failCount: 0 }; * 刷新快捷操作面板 */ async function refreshQuickActions() { + const pageCurrent = capturePageValidity(); const container = document.getElementById('quick-actions-grid'); if (!container) { return; @@ -4328,17 +4400,23 @@ async function refreshQuickActions() { // 确保 SSH 主机数据已加载(用于 nohup 按钮) if (!window._sshHostsData || Object.keys(window._sshHostsData).length === 0) { await loadSshHostsData(); + if (!pageCurrent()) return; } // 强制刷新 SSH 命令缓存,确保 nohup/serviceMode 等字段为最新 await loadSshCommands(); + if (!pageCurrent()) return; const result = await api.call('automation.rules.list'); + if (!pageCurrent()) return; if (result.code === 0 && result.data && result.data.rules) { // 过滤出启用且标记为可手动触发的规则 + if (!result.data.loaded || result.data.recovery_required) { + container.textContent = runtimeText(result.data.recovery_required ? 'recovery_required' : 'configLoading'); return; + } const allRules = result.data.rules; - const manualRules = allRules.filter(r => r.enabled && r.manual_trigger); + const manualRules = allRules.filter(r => r.show_on_dashboard === true); // 按 localStorage 保存的顺序排列快捷操作 let savedOrder = []; @@ -4348,7 +4426,8 @@ async function refreshQuickActions() { savedOrder = JSON.parse(raw); if (!Array.isArray(savedOrder)) savedOrder = []; } - } catch (e) { savedOrder = []; } + } catch (e) { + if (!pageCurrent()) return; savedOrder = []; } if (savedOrder.length > 0) { manualRules.sort((a, b) => { const ia = savedOrder.indexOf(a.id); @@ -4375,80 +4454,33 @@ async function refreshQuickActions() { } const nohupInfo = await checkRuleHasNohupSsh(rule); + if (!pageCurrent()) return; let nohupBtns = ''; let isRunning = false; - if (nohupInfo) { - const cbOpen = Date.now() < _sshExecCircuitBreaker.failUntil; - if (cbOpen) { - console.info('[SSH CircuitBreaker] Skipping ssh.exec check for', rule.id, - '(cooldown', Math.round((_sshExecCircuitBreaker.failUntil - Date.now()) / 1000), 's)'); - isRunning = false; - } else try { - const host = window._sshHostsData?.[nohupInfo.hostId]; - if (host) { - const checkResult = await api.call('ssh.exec', { - host: host.host, - port: host.port, - user: host.username, - keyid: host.keyid, - command: nohupInfo.checkCmd, - timeout_ms: 5000 - }); - const stdout = (checkResult.data?.stdout || '').trim(); - isRunning = stdout.includes('running'); - _sshExecCircuitBreaker.failCount = 0; - _sshExecCircuitBreaker.failUntil = 0; - } - } catch (e) { - console.warn('Check process status failed for rule', rule.id, e); - isRunning = false; - _sshExecCircuitBreaker.failCount++; - const backoff = Math.min(60, 15 * _sshExecCircuitBreaker.failCount); - _sshExecCircuitBreaker.failUntil = Date.now() + backoff * 1000; - console.warn(`[SSH CircuitBreaker] SSH exec failed ${_sshExecCircuitBreaker.failCount}x, cooling down ${backoff}s`); - } - - const statusIcon = isRunning ? '' : ''; - const statusTitle = isRunning ? (typeof t === 'function' ? t('automationPage.processRunning') : '进程运行中') : (typeof t === 'function' ? t('automationPage.processNotRunning') : '进程未运行'); - let serviceStatusHtml = ''; - if (nohupInfo.serviceMode && nohupInfo.varName && isRunning) { - serviceStatusHtml = ` -
    - ... -
    - `; - } - const viewLogText = typeof t === 'function' ? t('automationPage.logTitle') : '日志'; - const stopText = typeof t === 'function' ? t('automationPage.stopProcess') : '停止'; - const viewLogTitle = typeof t === 'function' ? t('automationPage.viewLog') : '查看日志'; - const stopTitle = typeof t === 'function' ? t('ssh.stopProcess') : '终止进程'; + if (nohupInfo?.serviceMode) { nohupBtns = ` - ${statusIcon} - ${serviceStatusHtml} -
    - - +
    + ${runtimeText('unknown')}
    - `; +
    + + +
    `; } - - const processRunningMsg = typeof t === 'function' ? t('toast.processRunning') : '进程正在运行中,请先停止'; - const cardOnClick = (nohupInfo && isRunning) - ? `showToast(${JSON.stringify(processRunningMsg)}, 'warning')` - : `triggerQuickAction('${escapeHtml(rule.id)}')`; + const cardOnClick = `triggerQuickAction('${escapeHtml(rule.id)}')`; const cleanName = rule.name.replace(/^[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{FE00}-\u{FE0F}\u{1F1E0}-\u{1F1FF}\u200D]+\s*/gu, '').trim(); cardsHtml.push(`
    ${iconHtml}
    ${escapeHtml(cleanName)}
    + ${runtimeText(!rule.enabled ? 'disabled' : rule.manual_trigger ? 'manual' : 'automatic')}${(rule.reference_unresolved || nohupInfo?.unresolved) ? ' · ' + runtimeText('referenceUnresolved') : ''} ${nohupBtns}
    `); @@ -4473,6 +4505,7 @@ async function refreshQuickActions() { container.innerHTML = '

    ' + (typeof t === 'function' ? (t('automationPage.loadQuickActionsFailed') || '无法加载快捷操作') : '无法加载快捷操作') + '

    '; } } catch (e) { + if (!pageCurrent()) return; console.error('Quick actions error:', e); container.innerHTML = '

    ' + (typeof t === 'function' ? t('filePage.loadFailed') : '加载失败') + '

    '; } @@ -4505,42 +4538,33 @@ function stopServiceStatusRefresh() { } } +let serviceStatusInFlight = false; async function updateQuickActionServiceStatus() { - const statusContainers = document.querySelectorAll('.quick-action-service-status'); - if (statusContainers.length === 0) return; - - for (const container of statusContainers) { - const varName = container.dataset.var; - if (!varName) continue; - - const valueEl = container.querySelector('.service-value'); - if (!valueEl) continue; - - // 检查进程是否运行(通过 data-running 属性) - const isRunning = container.dataset.running === 'true'; - - // 如果进程未运行,始终显示"未启动" - if (!isRunning) { - valueEl.textContent = (typeof t === 'function' ? t('sshPage.statusIdle') : '未启动'); - container.className = 'quick-action-service-status status-idle'; - continue; - } - - try { - const result = await api.call('automation.variables.get', { name: `${varName}.status` }); - if (result && result.data && result.data.value !== undefined) { - const status = result.data.value; - valueEl.textContent = getServiceStatusLabel(status); - container.className = `quick-action-service-status status-${status}`; - } else { - valueEl.textContent = (typeof t === 'function' ? t('sshPage.statusChecking') : '检测中'); - container.className = 'quick-action-service-status status-checking'; + if (document.hidden || serviceStatusInFlight) return; + serviceStatusInFlight = true; + try { + for (const container of document.querySelectorAll('.quick-action-service-status')) { + if (!container.isConnected || document.hidden) break; + const card = container.closest('.quick-action-card'); + const commandId = container.dataset.command; + try { + const response = await api.call('automation.services.status', { command_id: commandId }); + if (!container.isConnected || container.dataset.command !== commandId) continue; + const data = response.data || {}; + const state = response.code === 0 ? data.state : 'unknown'; + card.dataset.state = state; + container.querySelector('.service-value').textContent = runtimeText(state) + + (data.last_known && state === 'unknown' ? ' · ' + runtimeText('lastKnown') + ': ' + runtimeText(data.last_known) : '') + + (data.confirmed_ms ? ' · ' + runtimeText('confirmedAt') + ' ' + Math.floor(data.confirmed_ms / 1000) + 's' : ''); + container.title = runtimeText('stateEvidence') + ': ' + (data.source || 'none'); + } catch (_) { + if (container.isConnected) { + card.dataset.state = 'unknown'; + container.querySelector('.service-value').textContent = runtimeText('unknown'); + } } - } catch (e) { - valueEl.textContent = (typeof t === 'function' ? t('sshPage.statusUnknown') : '未知'); - container.className = 'quick-action-service-status status-unknown'; } - } + } finally { serviceStatusInFlight = false; } } // 触发快捷操作后的冷却时间(毫秒),避免连续触发导致后端只执行最后一个 @@ -4550,6 +4574,15 @@ let quickActionsTimeoutId = null; // 用于导航时取消,避免 quick-actio /** 供 router 在页面切换时取消快捷操作定时器,并销毁拖拽排序(防止 ghost 残留) */ window.stopSystemPageTimers = function() { + clearInterval(refreshInterval); + refreshInterval = null; + clearInterval(localTimeInterval); + localTimeInterval = null; + clearInterval(window.systemUptimeInterval); + window.systemUptimeInterval = null; + stopLpmuStatePolling(); + for (const id of Object.keys(logWidgetTimers)) stopLogReading(id); + stopServiceStatusRefresh(); if (quickActionsTimeoutId) { clearTimeout(quickActionsTimeoutId); quickActionsTimeoutId = null; @@ -4569,13 +4602,23 @@ window.stopSystemPageTimers = function() { * @param {string} ruleId - 规则 ID */ async function triggerQuickAction(ruleId) { - const card = event?.currentTarget || document.getElementById(`quick-action-${ruleId}`); + const card = document.getElementById(`quick-action-${ruleId}`); if (!card) { console.error('triggerQuickAction: card not found for ruleId=', ruleId); showToast((typeof t === 'function' ? t('toast.cardNotFound') : '无法找到操作卡片'), 'error'); return; } + // A user start request may verify unknown state. Periodic refresh remains local. + if (card.dataset.allowed === 'true' && card.dataset.service && card.dataset.state === 'unknown') { + try { + const checked = await api.call('automation.services.status', { command_id: card.dataset.service, verify: true }); + card.dataset.state = checked.code === 0 ? checked.data?.state || 'unknown' : 'unknown'; + } catch (_) { card.dataset.state = 'unknown'; } + } + if (card.dataset.allowed !== 'true' || (card.dataset.service && card.dataset.state !== 'stopped')) { + showToast(runtimeText('startBlocked'), 'warning'); return; + } if (card.classList.contains('triggering')) { showToast(typeof t === 'function' ? t('toast.processing') : 'Operation in progress...', 'warning'); return; @@ -4590,6 +4633,7 @@ async function triggerQuickAction(ruleId) { try { // 添加按下效果并禁用点击 card.classList.add('triggering'); + if (card.dataset.service) card.dataset.state = 'starting'; card.style.pointerEvents = 'none'; // 禁用点击防止重复 // 更新图标显示加载状态 @@ -4620,7 +4664,8 @@ async function triggerQuickAction(ruleId) { card.classList.remove('triggering'); } catch (e) { console.error('triggerQuickAction error:', e); - showToast((typeof t === 'function' ? t('toast.execFailedMsg', { msg: e.message }) : '执行失败: ' + e.message), 'error'); + showToast(runtimeText('outcomeUnknown'), 'error'); + if (card?.dataset.service) card.dataset.state = 'unknown'; if (card) { card.classList.remove('triggering'); card.style.pointerEvents = ''; @@ -4643,7 +4688,7 @@ async function checkRuleHasNohupSsh(rule) { try { const detailResult = await api.call('automation.rules.get', { id: rule.id }); if (detailResult.code !== 0 || !detailResult.data || !detailResult.data.actions) { - return null; + return { unresolved: true }; } const actions = detailResult.data.actions; @@ -4659,7 +4704,7 @@ async function checkRuleHasNohupSsh(rule) { // 方式1: 动作本身是 ssh_cmd_ref 类型(兼容两种 API 返回格式) // rules.get 返回 action.cmd_id(直接字段),actions.get 返回 action.ssh_ref.cmd_id(嵌套) - if (action.type === 'ssh_cmd_ref' && (action.ssh_ref?.cmd_id || action.cmd_id)) { + if (!action.template_id && action.type === 'ssh_cmd_ref' && (action.ssh_ref?.cmd_id || action.cmd_id)) { sshCmdId = action.ssh_ref?.cmd_id || action.cmd_id; } // 方式2: 动作有 template_id,需要查询模板获取实际类型 @@ -4667,21 +4712,23 @@ async function checkRuleHasNohupSsh(rule) { try { const tplResult = await api.call('automation.actions.get', { id: action.template_id }); if (tplResult.code === 0 && tplResult.data) { - if (tplResult.data.type === 'ssh_cmd_ref' && tplResult.data.ssh_ref?.cmd_id) { - sshCmdId = tplResult.data.ssh_ref.cmd_id; + if (tplResult.data.type === 'ssh_cmd_ref' && (tplResult.data.ssh_ref?.cmd_id || tplResult.data.cmd_id)) { + sshCmdId = tplResult.data.ssh_ref?.cmd_id || tplResult.data.cmd_id; } - } + } else return { unresolved: true }; } catch (e) { - // template fetch failed, skip + return { unresolved: true }; } } if (sshCmdId) { const cmdId = String(sshCmdId); + let foundCommand = false; // 在所有主机的命令中查找 for (const [hostId, cmds] of Object.entries(sshCommands)) { const cmd = cmds.find(c => String(c.id) === cmdId); if (cmd) { + foundCommand = true; if (cmd.nohup) { // 找到了 nohup 命令 // safeName:优先从 cmd.name 提取英文数字,fallback 到 cmd.id @@ -4691,12 +4738,6 @@ async function checkRuleHasNohupSsh(rule) { const pidFile = `/tmp/ts_nohup_${safeName}.pid`; const varName = cmd.varName || ''; // 服务模式变量名 - // 检测进程状态:多重 fallback 策略 - // 问题:nohup cmd & 的 $! 获取到的 PID 可能是中间 shell 进程, - // 真实主进程 PID 往往是 $! - 1(如 vLLM 等多进程服务) - // 策略:1) kill -0 PID 2) kill -0 PID-1 3) pgrep 按日志文件名兜底 - const checkCmd = `if [ -f ${pidFile} ]; then PID=$(cat ${pidFile}); if kill -0 $PID 2>/dev/null; then echo running; elif kill -0 $((PID-1)) 2>/dev/null; then echo running; else echo stopped; fi; else echo stopped; fi`; - return { logFile: logFile, pidFile: pidFile, @@ -4704,7 +4745,7 @@ async function checkRuleHasNohupSsh(rule) { progName: safeName, hostId: hostId, cmdName: cmd.name, - checkCmd: checkCmd, + commandId: cmdId, // 服务模式信息 serviceMode: cmd.serviceMode || false, varName: varName, @@ -4714,10 +4755,12 @@ async function checkRuleHasNohupSsh(rule) { } } } + if (!foundCommand) return { unresolved: true }; } } } catch (e) { console.error('checkRuleHasNohupSsh error:', e); + return { unresolved: true }; } return null; } @@ -4799,7 +4842,8 @@ async function quickActionRefreshLog(logFile, hostId) { if (!host) return; const contentEl = document.getElementById('quick-log-content'); - if (!contentEl) return; + if (!contentEl || document.hidden || contentEl.dataset.loading === 'true') return; + contentEl.dataset.loading = 'true'; try { const result = await api.call('ssh.exec', { @@ -4807,9 +4851,10 @@ async function quickActionRefreshLog(logFile, hostId) { port: host.port, user: host.username, keyid: host.keyid, - command: `if [ -f ${logFile} ]; then cat ${logFile}; else echo '${typeof t === 'function' ? t('automationPage.logFileEmptyBracket') : '[日志文件不存在或为空]'}'; fi`, + command: `if [ -f ${logFile} ]; then tail -c 60000 -- ${logFile}; else echo '${typeof t === 'function' ? t('automationPage.logFileEmptyBracket') : '[日志文件不存在或为空]'}'; fi`, timeout_ms: 15000 }); + if (!contentEl.isConnected || document.getElementById('quick-log-content') !== contentEl) return; if (result.code !== 0 || !result.data) { contentEl.textContent = (typeof t === 'function' ? t('automationPage.logFetchFailed') : '[获取失败]') + ' ' + (result.message || 'code=' + result.code); return; @@ -4822,9 +4867,12 @@ async function quickActionRefreshLog(logFile, hostId) { quickActionLastContent = output; } } catch (e) { + if (!contentEl.isConnected || document.getElementById('quick-log-content') !== contentEl) return; const _err = typeof t === 'function' ? t('automationPage.logError') : '[错误]'; const _retry = typeof t === 'function' ? t('automationPage.deviceBusyRetry') : '若设备繁忙可稍后重试。'; contentEl.textContent = _err + ' ' + e.message + '\n\n' + _retry; + } finally { + contentEl.dataset.loading = 'false'; } } @@ -4945,86 +4993,19 @@ function closeQuickLogModal() { * 快捷操作 - 终止进程(基于 PID 文件精确停止) * 支持杀进程组(vLLM 等多进程服务),SIGTERM → 等待 → SIGKILL 回退 */ -async function quickActionStopProcess(pidFile, hostId, cmdName, varName) { - const host = window._sshHostsData?.[hostId]; - if (!host) { - showToast((typeof t === 'function' ? t('sshPage.hostNotExistShort') : '主机不存在'), 'error'); - return; - } - - const confirmMsg = typeof t === 'function' ? t('toast.confirmTerminateCmd', { cmdName }) : `确定要终止 "${cmdName}" 吗?`; - if (!confirm(confirmMsg)) { - return; - } - +const serviceStopInFlight = new Set(); +async function quickActionStopProcess(commandId, automatic) { + if (serviceStopInFlight.has(commandId)) return; + if (!confirmAction(runtimeText(automatic ? 'confirmStopAutomatic' : 'confirmStop'))) return; + serviceStopInFlight.add(commandId); + for (const card of document.querySelectorAll('.quick-action-card')) + if (card.dataset.service === commandId) card.dataset.state = 'stopping'; try { - showToast((typeof t === 'function' ? t('toast.terminatingProcess') : '正在终止进程...'), 'info'); - - // 终止进程:支持 PID 和 PID-1 双重检测 - // 原因:nohup cmd & 的 $! 可能记录了中间 shell PID,真实主进程 PID = $! - 1 - // 逻辑:读取 PID 文件 → 找到活着的真实 PID → SIGTERM 进程组 → 等待 → SIGKILL 回退 - const killCmd = `if [ -f ${pidFile} ]; then ` + - `RAW_PID=$(cat ${pidFile}); ` + - // 确定真实 PID:先检查 RAW_PID,再检查 RAW_PID-1 - `if kill -0 $RAW_PID 2>/dev/null; then PID=$RAW_PID; ` + - `elif kill -0 $((RAW_PID-1)) 2>/dev/null; then PID=$((RAW_PID-1)); ` + - `else rm -f ${pidFile}; echo "ALREADY_STOPPED"; exit 0; fi; ` + - // 先尝试 SIGTERM 进程组(kill 负 PID),回退到单进程 kill - `kill -- -$PID 2>/dev/null; kill $PID 2>/dev/null; ` + - // 等待最多 3 秒 - `for i in 1 2 3 4 5 6; do sleep 0.5; kill -0 $PID 2>/dev/null || break; done; ` + - // 检查是否还活着 - `if kill -0 $PID 2>/dev/null; then ` + - // 仍在运行,SIGKILL 进程组 - `kill -9 -- -$PID 2>/dev/null; kill -9 $PID 2>/dev/null; ` + - `sleep 0.5; ` + - `if kill -0 $PID 2>/dev/null; then ` + - `echo "STILL_RUNNING"; ` + - `else ` + - `rm -f ${pidFile}; echo "FORCE_KILLED"; ` + - `fi; ` + - `else ` + - `rm -f ${pidFile}; echo "TERMINATED"; ` + - `fi; ` + - `else echo "NO_PID_FILE"; fi`; - - const result = await api.call('ssh.exec', { - host: host.host, - port: host.port, - user: host.username, - keyid: host.keyid, - command: killCmd, - timeout_ms: 15000 - }); - - if (result.code === 0 && result.data) { - const output = (result.data.stdout || '').trim(); - const msgMap = { - 'TERMINATED': typeof t === 'function' ? t('toast.terminateTERMINATED') : '服务已停止', - 'FORCE_KILLED': typeof t === 'function' ? t('toast.terminateFORCE_KILLED') : '服务已强制终止', - 'ALREADY_STOPPED': typeof t === 'function' ? t('toast.terminateALREADY_STOPPED') : '进程已不在运行,已清理 PID 文件', - 'NO_PID_FILE': typeof t === 'function' ? t('toast.terminateNO_PID_FILE') : 'PID 文件不存在', - 'STILL_RUNNING': typeof t === 'function' ? t('toast.terminateSTILL_RUNNING') : '无法终止进程,请手动处理' - }; - const msg = msgMap[output] || (output || (typeof t === 'function' ? t('toast.terminateDefault') : '操作完成')); - const isSuccess = ['TERMINATED', 'FORCE_KILLED', 'ALREADY_STOPPED'].includes(output); - showToast(msg, isSuccess ? 'success' : (output === 'STILL_RUNNING' ? 'error' : 'info')); - // 停止成功后,清除服务模式状态变量(否则"就绪"标签会残留) - if (isSuccess && varName) { - try { - await api.call('automation.variables.set', { name: `${varName}.status`, value: 'stopped' }); - } catch (e) { - console.warn('Failed to clear service status variable:', e); - } - } - // 刷新状态 - setTimeout(() => refreshQuickActions(), 1500); - } else { - showToast((result.message || (typeof t === 'function' ? t('common.operationFailed') : '操作失败')), 'error'); - } - } catch (e) { - showToast((typeof t === 'function' ? t('toast.errorMsg', { msg: e.message }) : '错误: ' + e.message), 'error'); - } + const result = await api.call('automation.services.stop', { command_id: commandId }); + const stopped = result.code === 0 && result.data?.state === 'stopped'; + showToast(runtimeText(stopped ? 'stopped' : 'outcomeUnknown'), stopped ? 'success' : 'warning'); + } catch (_) { showToast(runtimeText('outcomeUnknown'), 'warning'); } + finally { serviceStopInFlight.delete(commandId); await updateQuickActionServiceStatus(); } } // 时间同步功能 @@ -5139,18 +5120,15 @@ async function loadLedPage() { clearInterval(refreshInterval); // 取消系统页面的订阅 - if (subscriptionManager) { - subscriptionManager.unsubscribe('system.dashboard'); - } const content = document.getElementById('page-content'); content.innerHTML = `
    -

    LED 控制

    +

    ${t('nav.led')}

    - - + +
    @@ -5197,18 +5175,18 @@ async function refreshLedPage() { container.innerHTML = `
    -

    未找到 LED 设备

    -

    LED 设备可能尚未启动,请检查:

    +

    ${t('ledPage.ledNotFound')}

    +

    ${t('ledPage.ledNotStartedHint')}

      -
    • LED 服务状态 (service --status)
    • -
    • GPIO 引脚配置
    • +
    • ${t('promptRepair.ledServiceStatus')} (service --status)
    • +
    • ${t('ledPage.checkGpioConfig')}
    `; } } catch (e) { console.error('LED list error:', e); - container.innerHTML = `
    ${typeof t === 'function' ? t('common.loadFailedMsg', { msg: e.message }) : '加载失败: ' + e.message}
    `; + container.innerHTML = `
    ${escapeHtml(typeof t === 'function' ? t('common.loadFailedMsg', { msg: e.message }) : '加载失败: ' + e.message)}
    `; } } @@ -5265,7 +5243,7 @@ function generateLedDeviceCard(dev) { ${dev.name} ${description}
    -
    ${statusText}
    +
    ${escapeHtml(statusText)}
    @@ -5284,7 +5262,7 @@ function generateLedDeviceCard(dev) {
    -
    +
    - - - - - - - - - - + + + + + + + + + +
    @@ -5318,7 +5296,7 @@ function generateLedDeviceCard(dev) { ${matrixFooterBtns} -
    @@ -5341,10 +5319,10 @@ function updateBrightnessDisplay(device, value) { async function fillColorFromPicker(device, color) { try { - await api.ledFill(device, color); + requireApiSuccess(await api.ledFill(device, color), 'ledFill'); ledStates[device] = true; updateLedCardState(device, true); - showToast(typeof t === 'function' ? t('toast.ledFilled', { device, color }) : `${device} 已填充 ${color}`, 'success'); + showToast(typeof t === 'function' ? t('toast.ledFilled', { device: getDeviceDescription(device), color }) : `${device} 已填充 ${color}`, 'success'); } catch (e) { showToast(typeof t === 'function' ? t('toast.ledFillFailed') + ': ' + e.message : `填充失败: ${e.message}`, 'error'); } @@ -5354,10 +5332,10 @@ async function quickFillColor(device, color) { const picker = document.getElementById(`color-picker-${device}`); if (picker) picker.value = color; try { - await api.ledFill(device, color); + requireApiSuccess(await api.ledFill(device, color), 'ledFill'); ledStates[device] = true; updateLedCardState(device, true, null); - showToast(typeof t === 'function' ? t('toast.ledFilled', { device, color }) : `${device} → ${color}`, 'success'); + showToast(typeof t === 'function' ? t('toast.ledFilled', { device: getDeviceDescription(device), color }) : `${device} → ${color}`, 'success'); } catch (e) { showToast(typeof t === 'function' ? t('toast.ledFillFailed') + ': ' + e.message : `填充失败: ${e.message}`, 'error'); } @@ -5365,11 +5343,11 @@ async function quickFillColor(device, color) { async function quickStartEffect(device, effect) { try { - await api.ledEffectStart(device, effect, { speed: 50 }); + requireApiSuccess(await api.ledEffectStart(device, effect, { speed: 50 }), 'ledEffectStart'); selectedEffects[device] = effect; ledStates[device] = true; updateLedCardState(device, true, effect); - showToast(typeof t === 'function' ? t('toast.ledEffectStarted', { device, effect }) : `${device}: ${effect}`, 'success'); + showToast(typeof t === 'function' ? t('toast.ledEffectStarted', { device: getDeviceDescription(device), effect }) : `${device}: ${effect}`, 'success'); } catch (e) { showToast(typeof t === 'function' ? t('toast.ledEffectStartFailed') + ': ' + e.message : `启动失败: ${e.message}`, 'error'); } @@ -5377,16 +5355,18 @@ async function quickStartEffect(device, effect) { async function allLedsOff() { const devices = window.ledDevicesCache || []; + let success = 0; const failures = []; for (const dev of devices) { try { - await api.ledClear(dev.name); + requireApiSuccess(await api.ledClear(dev.name), 'ledClear'); + success++; ledStates[dev.name] = false; updateLedCardState(dev.name, false); } catch (e) { - console.error(`关闭 ${dev.name} 失败:`, e); + failures.push({path: dev.name, message: e.message}); } } - showToast((typeof t === 'function' ? t('toast.allLedsOff') : '全部 LED 已关闭'), 'success'); + showOperationSummary('promptRepair.ledSummary', success, failures); } function updateLedCardState(device, isOn, effect = undefined) { @@ -5421,13 +5401,13 @@ function updateLedCardState(device, isOn, effect = undefined) { const powerIcon = powerBtn.querySelector('.power-icon'); if (isOn) { powerBtn.classList.add('on'); - powerBtn.title = '点击关闭'; + powerBtn.title = t('ledPage.clickOff'); if (powerIcon) { powerIcon.className = 'power-icon ri-lightbulb-fill'; } } else { powerBtn.classList.remove('on'); - powerBtn.title = '点击开启'; + powerBtn.title = t('ledPage.clickOn'); if (powerIcon) { powerIcon.className = 'power-icon ri-lightbulb-line'; } @@ -5459,7 +5439,7 @@ function openColorModal(device) { const title = document.getElementById('led-modal-title'); const body = document.getElementById('led-modal-body'); - title.textContent = `${device} - ${typeof t === 'function' ? t('ledPage.colorSettings') : '颜色设置'}`; + title.textContent = `${device} - ${typeof t === 'function' ? t('ui.colorSettings') : '颜色设置'}`; body.innerHTML = ` -
    ${client.is_static ? '静态' : '动态'}
    +
    ${client.is_static ? t('networkPage.static') : t('networkPage.dynamic')}
    `).join(''); } } catch (e) { - container.innerHTML = `
    获取失败: ${e.message}
    `; + if (!pageCurrent()) return; + container.innerHTML = `
    ${t('toast.fetchFailed')}: ${escapeHtml(e.message)}
    `; } } @@ -8125,10 +8124,10 @@ async function toggleNat() { try { const status = await api.natStatus(); if (status.data?.enabled) { - await api.natDisable(); + requireApiSuccess(await api.natDisable(), 'natDisable'); showToast(typeof t === 'function' ? t('toast.natDisabled') : 'NAT 已禁用', 'success'); } else { - await api.natEnable(); + requireApiSuccess(await api.natEnable(), 'natEnable'); showToast(typeof t === 'function' ? t('toast.natEnabled') : 'NAT 已启用', 'success'); } await refreshNetworkPage(); @@ -8139,7 +8138,7 @@ async function toggleNat() { async function saveNatConfig() { try { - await api.natSave(); + requireApiSuccess(await api.natSave(), 'natSave'); showToast(typeof t === 'function' ? t('toast.natConfigSaved') : 'NAT 配置已保存', 'success'); } catch (e) { showToast((typeof t === 'function' ? t('toast.saveFailed') : '保存失败') + ': ' + e.message, 'error'); @@ -8153,12 +8152,10 @@ async function saveNatConfig() { let currentFilePath = '/sdcard'; async function loadFilesPage() { + const pageCurrent = capturePageValidity(); clearInterval(refreshInterval); // 取消系统页面的订阅 - if (subscriptionManager) { - subscriptionManager.unsubscribe('system.dashboard'); - } const content = document.getElementById('page-content'); content.innerHTML = ` @@ -8258,6 +8255,7 @@ async function loadFilesPage() { selectedFiles.clear(); await refreshFilesPage(); + if (!pageCurrent()) return; } // 批量选择相关 @@ -8315,6 +8313,21 @@ function clearSelection() { updateSelectionUI(); } +function showOperationSummary(key, success, failures, extra = {}) { + const message = t(key, {success, fail: failures.length, ...extra}); + showToast(message, failures.length ? (success ? 'warning' : 'error') : extra.invalid ? 'warning' : 'success', 7000); + let panel = document.getElementById('operation-summary'); + if (!panel) { + panel = document.createElement('div'); + panel.id = 'operation-summary'; + panel.setAttribute('role', 'status'); + document.querySelector('main').appendChild(panel); + } + panel.style.whiteSpace = 'pre-wrap'; + panel.textContent = message + (failures.length ? '\n' + failures.map(f => f.path + ': ' + f.message).join('\n') : ''); + return {success, failures}; +} + async function batchDelete() { if (selectedFiles.size === 0) { showToast((typeof t === 'function' ? t('toast.selectFileToDelete') : '请先选择要删除的文件'), 'warning'); @@ -8322,34 +8335,28 @@ async function batchDelete() { } const count = selectedFiles.size; - if (!confirm(typeof t === 'function' ? t('ui.confirmDeleteFiles', { count }) : `确定要删除选中的 ${count} 个文件/文件夹吗?此操作不可撤销!`)) { + if (!confirmAction(typeof t === 'function' ? t('ui.confirmDeleteFiles', { count }) : `确定要删除选中的 ${count} 个文件/文件夹吗?此操作不可撤销!`)) { return; } - showToast(typeof t === 'function' ? t('files.deletingItems', { count }) : `正在删除 ${count} 个项目...`, 'info'); + showToast(typeof t === 'function' ? t('toast.deletingItems', { count }) : `正在删除 ${count} 个项目...`, 'info'); let successCount = 0; - let failCount = 0; + const failures = []; for (const path of selectedFiles) { try { - await api.storageDelete(path); + requireApiSuccess(await api.storageDelete(path), 'storageDelete'); successCount++; } catch (e) { console.error('Delete failed:', path, e); - failCount++; + failures.push({path, message: e.message}); } } selectedFiles.clear(); - - if (failCount === 0) { - showToast(typeof t === 'function' ? t('files.deleteSuccessCount', { count: successCount }) : `成功删除 ${successCount} 个项目`, 'success'); - } else { - showToast(typeof t === 'function' ? t('files.deletePartial', { success: successCount, fail: failCount }) : `删除完成: ${successCount} 成功, ${failCount} 失败`, 'warning'); - } - await refreshFilesPage(); + return showOperationSummary('promptRepair.deleteSummary', successCount, failures); } async function batchDownload() { @@ -8372,27 +8379,23 @@ async function batchDownload() { return; } - showToast(typeof t === 'function' ? t('files.downloadingFiles', { count: filesToDownload.length }) : `正在下载 ${filesToDownload.length} 个文件...`, 'info'); + showToast(typeof t === 'function' ? t('toast.downloadingFiles', { count: filesToDownload.length }) : `正在下载 ${filesToDownload.length} 个文件...`, 'info'); - // 逐个下载文件 + let success = 0; + const failures = []; for (const path of filesToDownload) { - try { - await downloadFile(path); - // 添加短暂延迟,避免浏览器阻止多个下载 - await new Promise(resolve => setTimeout(resolve, 300)); - } catch (e) { - console.error('Download failed:', path, e); - } + const result = await downloadFile(path, true); + if (result.started) success++; + else failures.push({path, message: result.error.message}); } - - showToast((typeof t === 'function' ? t('toast.batchDownloadComplete') : '批量下载完成'), 'success'); + return showOperationSummary('promptRepair.downloadSummary', success, failures); } // SD 卡挂载/卸载 async function mountSdCard() { try { showToast(typeof t === 'function' ? t('filePage.mountingSd') : '正在挂载 SD 卡...', 'info'); - await api.storageMount(); + requireApiSuccess(await api.storageMount(), 'storageMount'); showToast(typeof t === 'function' ? t('filePage.mountSdSuccess') : 'SD 卡挂载成功', 'success'); await refreshFilesPage(); } catch (e) { @@ -8401,13 +8404,13 @@ async function mountSdCard() { } async function unmountSdCard() { - if (!confirm(typeof t === 'function' ? t('filePage.confirmUnmountSd') : '确定要卸载 SD 卡吗?\n\n卸载后将无法访问 SD 卡上的文件。')) { + if (!confirmAction(typeof t === 'function' ? t('filePage.confirmUnmountSd') : '确定要卸载 SD 卡吗?\n\n卸载后将无法访问 SD 卡上的文件。')) { return; } try { showToast(typeof t === 'function' ? t('filePage.unmountingSd') : '正在卸载 SD 卡...', 'info'); - await api.storageUnmount(); + requireApiSuccess(await api.storageUnmount(), 'storageUnmount'); showToast(typeof t === 'function' ? t('filePage.unmountSdSuccess') : 'SD 卡已卸载', 'success'); if (currentFilePath.startsWith('/sdcard')) { currentFilePath = '/spiffs'; @@ -8419,14 +8422,23 @@ async function unmountSdCard() { } async function refreshFilesPage() { - await loadDirectory(currentFilePath); + const pageCurrent = capturePageValidity(); + const result = await loadDirectory(currentFilePath); + if (!pageCurrent()) return; + if (result?.stale) return result; await loadStorageStatus(); + if (!pageCurrent()) return; + return result; } +let directoryGeneration = 0; async function loadDirectory(path) { + const generation = ++directoryGeneration; currentFilePath = path; const listContainer = document.getElementById('file-list'); + const current = () => generation === directoryGeneration && currentFilePath === path && document.getElementById('file-list') === listContainer; + if (!listContainer) return {stale: true}; // 移除旧的事件监听器 listContainer.removeEventListener('click', handleFileListClick); @@ -8435,7 +8447,8 @@ async function loadDirectory(path) { // 如果是 SD 卡路径,先检查挂载状态,避免不必要的错误请求 if (path.startsWith('/sdcard')) { try { - const status = await api.storageStatus(); + const status = requireApiSuccess(await api.storageStatus(), 'storage.status'); + if (!current()) return {stale: true}; if (!status.data?.sd?.mounted) { console.log('SD card not mounted, showing mount prompt'); listContainer.innerHTML = ` @@ -8448,13 +8461,15 @@ async function loadDirectory(path) { return; } } catch (e) { + if (!current()) return {stale: true}; console.warn('Failed to check storage status:', e.message); // 继续尝试加载目录,让后续逻辑处理错误 } } try { - const result = await api.storageList(path); + const result = requireApiSuccess(await api.storageList(path), 'storage.list'); + if (!current()) return {stale: true}; console.log('storageList result:', result); const entries = result.data?.entries || []; @@ -8512,7 +8527,7 @@ async function loadDirectory(path) { ${entry.name} ${size} - ${entry.type !== 'dir' ? `` : ''} + ${entry.type !== 'dir' ? `` : ''} `; }).join('')} @@ -8523,11 +8538,12 @@ async function loadDirectory(path) { // 使用事件委托处理点击 listContainer.addEventListener('click', handleFileListClick); } catch (e) { + if (!current()) return {stale: true}; console.error('loadDirectory error:', e); // 检查是否是 SD 卡未挂载(后端返回 'SD card not mounted' 或 'Directory not found') const isUnmounted = path.startsWith('/sdcard') && - (e.message.includes('not mounted') || e.message.includes('未挂载') || e.message.includes('Directory not found')); + (e.message.includes('not mounted') || e.message.includes(t('filePage.notMounted')) || e.message.includes('Directory not found')); if (isUnmounted) { listContainer.innerHTML = ` @@ -8537,9 +8553,11 @@ async function loadDirectory(path) {
    `; } else { - listContainer.innerHTML = '
    ' + (typeof t === 'function' ? t('filePage.loadFailed') : '加载失败') + ': ' + e.message + '
    '; + listContainer.textContent = t('promptRepair.listRefreshFailed') + '\n' + e.message; } + return {error: e}; } + return {refreshed: true}; } // 事件委托处理文件列表点击 @@ -8576,9 +8594,13 @@ function handleFileListClick(e) { } } +let storageStatusGeneration = 0; async function loadStorageStatus() { + const generation = ++storageStatusGeneration; + const pageCurrent = capturePageValidity(); try { const status = await api.storageStatus(); + if (!pageCurrent() || generation !== storageStatusGeneration) return; const container = document.getElementById('storage-status'); const controlsContainer = document.getElementById('storage-controls'); @@ -8613,6 +8635,7 @@ async function loadStorageStatus() { } } } catch (e) { + if (!pageCurrent() || generation !== storageStatusGeneration) return; console.log('Storage status error:', e); } } @@ -8652,8 +8675,12 @@ function formatFileSize(bytes) { // 上传相关 let filesToUpload = []; +let uploadGeneration = 0; +const uploadPathVersions = new Map(); +const uploadPendingPaths = new Map(); function showUploadDialog() { + uploadGeneration++; filesToUpload = []; document.getElementById('upload-list').innerHTML = ''; document.getElementById('upload-modal').classList.remove('hidden'); @@ -8690,13 +8717,16 @@ function handleFileSelect(event) { filesToUpload = filesToUpload.concat(files); const listContainer = document.getElementById('upload-list'); - listContainer.innerHTML = filesToUpload.map((f, i) => ` -
    - ${f.name} - ${formatFileSize(f.size)} - -
    - `).join(''); + listContainer.replaceChildren(); + filesToUpload.forEach((file, index) => { + const row = document.createElement('div'); row.className = 'upload-item'; + const name = document.createElement('span'); name.textContent = file.name; + const state = document.createElement('span'); state.textContent = formatFileSize(file.size); + const remove = document.createElement('button'); remove.className = 'btn btn-sm'; + remove.textContent = '×'; remove.setAttribute('aria-label', t('common.delete')); + remove.onclick = () => removeUploadFile(index); + row.append(name, state, remove); listContainer.appendChild(row); + }); } function removeUploadFile(index) { @@ -8705,60 +8735,73 @@ function removeUploadFile(index) { } async function uploadFiles() { - if (filesToUpload.length === 0) { - showToast((typeof t === 'function' ? t('toast.selectFileToUpload') : '请选择要上传的文件'), 'warning'); - return; - } - - const listContainer = document.getElementById('upload-list'); - - for (let i = 0; i < filesToUpload.length; i++) { - const file = filesToUpload[i]; - const targetPath = currentFilePath + '/' + file.name; - - // 更新状态 - const items = listContainer.querySelectorAll('.upload-item'); - if (items[i]) { - items[i].innerHTML = `${file.name}${typeof t === 'function' ? t('common.uploading') : '上传中...'}`; - } - + if (!filesToUpload.length) { showToast(t('toast.selectFileToUpload'), 'warning'); return; } + const generation = ++uploadGeneration; + const destination = currentFilePath; + const pageCurrent = capturePageValidity(); + const list = document.getElementById('upload-list'); + const page = document.getElementById('page-content'); + const files = [...filesToUpload]; + const items = [...list.querySelectorAll('.upload-item')]; + const failures = []; + let success = 0, invalid = 0; + // Invalidate every old entry before starting the first request. + for (const row of items) while (row.children.length > 3) row.children[3].remove(); + const versions = files.map(file => { + const path = destination + '/' + file.name; + const version = {contended: false}; + uploadPathVersions.set(path, version); + return version; + }); + for (const [index, file] of files.entries()) { + const path = destination + '/' + file.name; + const row = items[index]; + const current = () => generation === uploadGeneration && + document.getElementById('upload-list') === list && [...list.children].includes(row) && + uploadPathVersions.get(path) === versions[index]; + const state = row?.children[1]; + if (current() && state) state.textContent = t('files.uploading'); + const pending = uploadPendingPaths.get(path) || new Set(); + if (pending.size) { + versions[index].contended = true; + for (const version of pending) version.contended = true; + } + pending.add(versions[index]); uploadPendingPaths.set(path, pending); try { - console.log('Uploading file:', targetPath); - const result = await api.fileUpload(targetPath, file); - console.log('Upload result:', result); - if (items[i]) { - items[i].innerHTML = `${file.name}${typeof t === 'function' ? t('fileManager.uploadComplete') : '完成'}`; - } - - // 检查是否是配置包上传,显示验证结果 - if (result.config_pack) { - const pack = result.config_pack; - if (pack.valid) { - const signer = pack.signature?.signer_cn || '未知'; - const isOfficial = pack.signature?.is_official ? '(官方)' : ''; - showToast(typeof t === 'function' ? t('toast.configPackVerifySuccess', { signer, isOfficial }) : `配置包验证成功\n签名者: ${signer} ${isOfficial}`, 'success', 5000); - - // 显示应用确认对话框 - setTimeout(() => { - showConfigPackApplyConfirm(targetPath, pack); - }, 500); - } else { - showToast(typeof t === 'function' ? t('toast.configPackVerifyFailed', { msg: pack.result_message }) : `配置包验证失败: ${pack.result_message}`, 'error', 5000); - } - } - } catch (e) { - console.error('Upload error:', e); - if (items[i]) { - items[i].innerHTML = `${file.name}${typeof t === 'function' ? t('common.uploadFailedMsg', { msg: e.message }) : '失败: ' + e.message}`; + const result = await api.fileUpload(path, file); + success++; + const pack = result.config_pack; + if (pack && pack.valid !== true) invalid++; + if (!current()) continue; + if (state) state.textContent = t('promptRepair.uploaded'); + if (pack?.valid === true && versions[index].contended) { + invalid++; + if (state) state.textContent = t('promptRepair.packRevalidate'); + } else if (pack?.valid === true) { + if (state) state.textContent = t('promptRepair.packVerified'); + const apply = document.createElement('button'); + apply.className = 'btn'; apply.textContent = t('common.apply'); + const verified = () => current() && !versions[index].contended; + apply.onclick = () => { if (verified()) showConfigPackApplyConfirm(path, pack, verified); }; + row.appendChild(apply); + } else if (pack && state) { + state.textContent = t('promptRepair.packInvalid') + '\n' + apiErrorMessage({error: pack.result_message}); } - } + } catch (error) { + failures.push({path, message: error.message}); + if (current() && state) state.textContent = error.message; + } finally { + pending.delete(versions[index]); + if (!pending.size) uploadPendingPaths.delete(path); + } + } + if (generation !== uploadGeneration) return {success, failures}; + const summary = showOperationSummary('promptRepair.uploadSummary', success, failures, {invalid}); + // Refresh is a separate read: its failure must never change confirmed upload results. + if (success && pageCurrent() && document.getElementById('page-content') === page && currentFilePath === destination && document.getElementById('file-list')) { + await refreshFilesPage(); } - - showToast((typeof t === 'function' ? t('toast.uploadComplete') : '上传完成'), 'success'); - setTimeout(() => { - closeUploadDialog(); - refreshFilesPage(); - }, 1000); + return summary; } // 新建文件夹 @@ -8780,7 +8823,7 @@ async function createNewFolder() { const path = currentFilePath + '/' + name; try { - await api.storageMkdir(path); + requireApiSuccess(await api.storageMkdir(path), 'storageMkdir'); showToast((typeof t === 'function' ? t('toast.folderCreated') : '文件夹创建成功'), 'success'); closeNewFolderDialog(); refreshFilesPage(); @@ -8815,7 +8858,7 @@ async function doRename() { const newPath = pathParts.join('/') + '/' + newName; try { - await api.storageRename(originalPath, newPath); + requireApiSuccess(await api.storageRename(originalPath, newPath), 'storageRename'); showToast((typeof t === 'function' ? t('toast.renameSuccess') : '重命名成功'), 'success'); closeRenameDialog(); refreshFilesPage(); @@ -8825,39 +8868,37 @@ async function doRename() { } // 下载文件 -async function downloadFile(path) { - console.log('Downloading file:', path); +async function downloadFile(path, silent = false) { + let url; + let anchor; try { const blob = await api.fileDownload(path); - console.log('Download blob:', blob); - const filename = path.split('/').pop(); - - // 创建下载链接 - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); - - showToast((typeof t === 'function' ? t('toast.downloadStart') : '下载开始'), 'success'); - } catch (e) { - console.error('Download error:', e); - showToast((typeof t === 'function' ? t('toast.downloadFailedMsg', { msg: e.message }) : '下载失败: ' + e.message), 'error'); + url = URL.createObjectURL(blob); + anchor = document.createElement('a'); + anchor.href = url; + anchor.download = path.split('/').pop(); + document.body.appendChild(anchor); + anchor.click(); + if (!silent) showToast(t('promptRepair.downloadStarted'), 'success'); + return {started: true}; + } catch (error) { + if (!silent) showToast(t('toast.downloadFailedMsg', {msg: error.message}), 'error'); + return {started: false, error}; + } finally { + if (anchor) anchor.remove(); + if (url) setTimeout(() => URL.revokeObjectURL(url), 1000); } } // 删除文件 async function deleteFile(path) { const name = path.split('/').pop(); - if (!confirm(typeof t === 'function' ? t('ui.confirmDeleteItem', { name }) : `确定要删除 "${name}" 吗?`)) { + if (!confirmAction(typeof t === 'function' ? t('common.confirmDeleteItem', { name }) : `确定要删除 "${name}" 吗?`)) { return; } try { - await api.storageDelete(path); + requireApiSuccess(await api.storageDelete(path), 'storageDelete'); showToast((typeof t === 'function' ? t('toast.deleteSuccess') : '删除成功'), 'success'); refreshFilesPage(); } catch (e) { @@ -8871,58 +8912,58 @@ async function deleteFile(path) { // 模块描述信息 const CONFIG_MODULE_INFO = { - net: { name: '网络', icon: 'ri-global-line', description: '以太网和主机名配置' }, - dhcp: { name: 'DHCP', icon: 'ri-router-line', description: 'DHCP 服务器配置' }, - wifi: { name: 'WiFi', icon: 'ri-wifi-line', description: 'WiFi AP 配置' }, - led: { name: 'LED', icon: 'ri-lightbulb-line', description: 'LED 亮度和效果配置' }, - fan: { name: '风扇', icon: 'ri-tornado-line', description: '风扇控制配置' }, - device: { name: '设备', icon: 'ri-computer-line', description: 'AGX 设备控制配置' }, - system: { name: '系统', icon: 'ri-settings-line', description: '系统和控制台配置' } + net: { get name() { return t('nav.network'); }, icon: 'ri-global-line', get description() { return t('configPage.moduleNetDesc'); } }, + dhcp: { name: 'DHCP', icon: 'ri-router-line', get description() { return t('configPage.moduleDhcpDesc'); } }, + wifi: { name: 'WiFi', icon: 'ri-wifi-line', get description() { return t('configPage.moduleWifiDesc'); } }, + led: { name: 'LED', icon: 'ri-lightbulb-line', get description() { return t('configPage.moduleLedDesc'); } }, + fan: { get name() { return t('automation.fan'); }, icon: 'ri-tornado-line', get description() { return t('configPage.moduleFanDesc'); } }, + device: { get name() { return t('common.devices'); }, icon: 'ri-computer-line', get description() { return t('configPage.moduleDeviceDesc'); } }, + system: { get name() { return t('nav.system'); }, icon: 'ri-settings-line', get description() { return t('configPage.moduleSystemDesc'); } } }; // 配置项的用户友好描述 const CONFIG_KEY_LABELS = { // net - 'eth.enabled': { label: '以太网启用', type: 'bool' }, - 'eth.dhcp': { label: 'DHCP 客户端', type: 'bool' }, - 'eth.ip': { label: 'IP 地址', type: 'ip' }, - 'eth.netmask': { label: '子网掩码', type: 'ip' }, - 'eth.gateway': { label: '网关', type: 'ip' }, - 'hostname': { label: '主机名', type: 'string' }, + 'eth.enabled': { get label() { return t('configPage.ethEnabled'); }, type: 'bool' }, + 'eth.dhcp': { get label() { return t('network.dhcpClients'); }, type: 'bool' }, + 'eth.ip': { get label() { return t('system.ipAddress'); }, type: 'ip' }, + 'eth.netmask': { get label() { return t('network.subnetMask'); }, type: 'ip' }, + 'eth.gateway': { get label() { return t('network.gateway'); }, type: 'ip' }, + 'hostname': { get label() { return t('network.hostname'); }, type: 'string' }, // dhcp - 'enabled': { label: '启用', type: 'bool' }, - 'start_ip': { label: '起始 IP', type: 'ip' }, - 'end_ip': { label: '结束 IP', type: 'ip' }, - 'lease_time': { label: '租约时间 (秒)', type: 'number' }, + 'enabled': { get label() { return t('common.enable'); }, type: 'bool' }, + 'start_ip': { get label() { return t('configPage.startIp'); }, type: 'ip' }, + 'end_ip': { get label() { return t('configPage.endIp'); }, type: 'ip' }, + 'lease_time': { get label() { return t('configPage.leaseTime'); }, type: 'number' }, // wifi - 'mode': { label: '模式', type: 'select', options: ['off', 'ap', 'sta', 'apsta'] }, + 'mode': { get label() { return t('network.mode'); }, type: 'select', options: ['off', 'ap', 'sta', 'apsta'] }, 'ap.ssid': { label: 'AP SSID', type: 'string' }, - 'ap.password': { label: 'AP 密码', type: 'password' }, - 'ap.channel': { label: 'AP 信道', type: 'number', min: 1, max: 13 }, - 'ap.max_conn': { label: '最大连接数', type: 'number', min: 1, max: 10 }, - 'ap.hidden': { label: '隐藏 SSID', type: 'bool' }, + 'ap.password': { get label() { return t('configPage.apPassword'); }, type: 'password' }, + 'ap.channel': { get label() { return t('configPage.apChannel'); }, type: 'number', min: 1, max: 13 }, + 'ap.max_conn': { get label() { return t('network.maxConnections'); }, type: 'number', min: 1, max: 10 }, + 'ap.hidden': { get label() { return t('networkPage.hideSSID'); }, type: 'bool' }, // led - 'brightness': { label: '亮度', type: 'number', min: 0, max: 255 }, - 'effect_speed': { label: '效果速度', type: 'number', min: 1, max: 100 }, - 'power_on_effect': { label: '开机效果', type: 'string' }, - 'idle_effect': { label: '待机效果', type: 'string' }, + 'brightness': { get label() { return t('led.brightness'); }, type: 'number', min: 0, max: 255 }, + 'effect_speed': { get label() { return t('configPage.effectSpeed'); }, type: 'number', min: 1, max: 100 }, + 'power_on_effect': { get label() { return t('configPage.powerOnEffect'); }, type: 'string' }, + 'idle_effect': { get label() { return t('configPage.idleEffect'); }, type: 'string' }, // fan - 'min_duty': { label: '最小占空比 (%)', type: 'number', min: 0, max: 100 }, - 'max_duty': { label: '最大占空比 (%)', type: 'number', min: 0, max: 100 }, - 'target_temp': { label: '目标温度 (°C)', type: 'number', min: 20, max: 80 }, + 'min_duty': { get label() { return t('configPage.minDuty'); }, type: 'number', min: 0, max: 100 }, + 'max_duty': { get label() { return t('configPage.maxDuty'); }, type: 'number', min: 0, max: 100 }, + 'target_temp': { get label() { return t('configPage.targetTemp'); }, type: 'number', min: 20, max: 80 }, // device - 'agx.auto_power_on': { label: 'AGX 自动开机', type: 'bool' }, - 'agx.power_on_delay': { label: '开机延迟 (ms)', type: 'number' }, - 'agx.force_off_timeout': { label: '强制关机超时 (ms)', type: 'number' }, - 'monitor.enabled': { label: '监控启用', type: 'bool' }, - 'monitor.interval': { label: '监控间隔 (ms)', type: 'number' }, + 'agx.auto_power_on': { get label() { return t('configPage.agxAutoPowerOn'); }, type: 'bool' }, + 'agx.power_on_delay': { get label() { return t('configPage.powerOnDelay'); }, type: 'number' }, + 'agx.force_off_timeout': { get label() { return t('configPage.forceOffTimeout'); }, type: 'number' }, + 'monitor.enabled': { get label() { return t('configPage.monitorEnabled'); }, type: 'bool' }, + 'monitor.interval': { get label() { return t('configPage.monitorInterval'); }, type: 'number' }, // system - 'timezone': { label: '时区', type: 'string' }, - 'log_level': { label: '日志级别', type: 'select', options: ['none', 'error', 'warn', 'info', 'debug', 'verbose'] }, - 'console.enabled': { label: '控制台启用', type: 'bool' }, - 'console.baudrate': { label: '波特率', type: 'select', options: [9600, 115200, 460800, 921600] }, - 'webui.enabled': { label: 'WebUI 启用', type: 'bool' }, - 'webui.port': { label: 'WebUI 端口', type: 'number', min: 1, max: 65535 } + 'timezone': { get label() { return t('common.timezone'); }, type: 'string' }, + 'log_level': { get label() { return t('configPage.logLevel'); }, type: 'select', options: ['none', 'error', 'warn', 'info', 'debug', 'verbose'] }, + 'console.enabled': { get label() { return t('configPage.consoleEnabled'); }, type: 'bool' }, + 'console.baudrate': { get label() { return t('configPage.baudrate'); }, type: 'select', options: [9600, 115200, 460800, 921600] }, + 'webui.enabled': { get label() { return t('configPage.webuiEnabled'); }, type: 'bool' }, + 'webui.port': { get label() { return t('configPage.webuiPort'); }, type: 'number', min: 1, max: 65535 } }; // ========================================================================= @@ -8941,8 +8982,10 @@ let sshCommands = {}; * - 旧格式(兼容): "cmd_xxxxxxxx" (随机 hex) */ async function loadSshCommands() { + const pageCurrent = capturePageValidity(); try { const result = await api.call('ssh.commands.list', {}); + if (!pageCurrent()) return; if (result && result.data && result.data.commands) { // 按 host_id 组织 sshCommands = {}; @@ -9009,6 +9052,7 @@ async function loadSshCommands() { } } } catch (e) { + if (!pageCurrent()) return; console.error('Failed to load SSH commands from backend:', e); sshCommands = {}; } @@ -9049,7 +9093,7 @@ async function saveSshCommandToBackend(hostId, cmdData, cmdId) { if (result && result.code === 0 && result.data && result.data.id) { return result.data.id; } - throw new Error(result?.message || 'Failed to save command'); + throw new ApiOperationError(result, 'ssh.commands.add'); } /** @@ -9057,7 +9101,7 @@ async function saveSshCommandToBackend(hostId, cmdData, cmdId) { * @param {string} cmdId - 指令 ID(如 "AGX_Power_On" 或 "cmd_xxxxxxxx") */ async function deleteSshCommandFromBackend(cmdId) { - await api.call('ssh.commands.remove', { id: cmdId }); + requireApiSuccess(await api.call('ssh.commands.remove', { id: cmdId }), 'call'); } /** @@ -9068,7 +9112,7 @@ async function deleteSshCommandFromBackend(cmdId) { async function preCreateCommandVariables(varName) { // 后端 ssh.commands.add API 在保存时已自动创建变量 // 此函数保留作为兼容占位符 - console.debug(`Variables for ${varName}.* are managed by backend`); + console.debug(`Variables for ${escapeHtml(varName)}.* are managed by backend`); } /** @@ -9082,18 +9126,17 @@ async function ensureAllCommandVariables() { } async function loadCommandsPage() { + const pageCurrent = capturePageValidity(); clearInterval(refreshInterval); stopServiceStatusRefresh(); - if (subscriptionManager) { - subscriptionManager.unsubscribe('system.dashboard'); - } // 重置执行状态(防止页面切换后状态残留) currentExecSessionId = null; // 加载已保存的指令(从后端) await loadSshCommands(); + if (!pageCurrent()) return; const content = document.getElementById('page-content'); content.innerHTML = ` @@ -9108,7 +9151,7 @@ async function loadCommandsPage() {
    -
    ${t('ssh.loadingHosts')}
    +
    ${t('sshPage.loadingHosts')}
    @@ -9123,7 +9166,7 @@ async function loadCommandsPage() { `; } @@ -9771,7 +9817,8 @@ async function loadHostSelector() { refreshCommandsList(); } catch (e) { - container.innerHTML = `
    加载失败: ${e.message}
    `; + if (!pageCurrent()) return; + container.innerHTML = `
    ${t('common.loadFailed')}: ${escapeHtml(e.message)}
    `; } } @@ -9810,7 +9857,7 @@ function refreshCommandsList() { const isOrphan = cmd.orphan === true; const orphanWarningHtml = isOrphan ? `
    - 主机 "${escapeHtml(cmd.originalHostId || '?')}" 不存在,请删除或重新关联 + ${escapeHtml(t('promptRepair.orphanHost', {id: cmd.originalHostId || '?'}))}
    ` : ''; @@ -9818,9 +9865,9 @@ function refreshCommandsList() { const hasPatternsConfig = cmd.expectPattern || cmd.failPattern || cmd.extractPattern; const patternsHtml = hasPatternsConfig ? `
    - ${cmd.expectPattern ? '' : ''} - ${cmd.failPattern ? '' : ''} - ${cmd.extractPattern ? '' : ''} + ${cmd.expectPattern ? '' : ''} + ${cmd.failPattern ? '' : ''} + ${cmd.extractPattern ? '' : ''}
    ` : ''; @@ -9831,20 +9878,20 @@ function refreshCommandsList() { // 服务模式:显示服务状态标签(无色块背景) // 使用 cmd.id 作为唯一标识,避免多个服务时 ID 冲突 const statusId = `service-status-${cmd.id || idx}`; - nohupHtml = `...`; + nohupHtml = `...`; } else { - nohupHtml = ''; + nohupHtml = (""); } } // 变量按钮(仅当设置了 varName 时显示) - const varBtnHtml = cmd.varName ? `` : ''; + const varBtnHtml = cmd.varName ? `` : ''; // 服务模式按钮(日志、停止) const safeName = cmd.name.replace(/[^a-zA-Z0-9]/g, '').slice(0, 20) || String(cmd.id).replace(/[^a-zA-Z0-9]/g, '').slice(0, 20) || 'cmd'; const serviceActionsHtml = (cmd.nohup && cmd.serviceMode) ? ` - - + + ` : ''; // 图标显示:支持 RemixIcon 类名、图片路径或旧版 Emoji @@ -9905,7 +9952,7 @@ async function updateServiceStatusInList() { } try { - const result = await api.call('automation.variables.get', { name: `${varName}.status` }); + const result = await api.call('automation.variables.get', { name: `${escapeHtml(varName)}.status` }); if (result && result.data && result.data.value !== undefined) { const status = result.data.value; @@ -9916,7 +9963,7 @@ async function updateServiceStatusInList() { statusEl.className = 'service-status status-idle'; } } catch (e) { - console.error(`[ServiceStatus] Error getting ${varName}.status:`, e); + console.error(`[ServiceStatus] Error getting ${escapeHtml(varName)}.status:`, e); statusEl.textContent = (typeof t === 'function' ? t('sshPage.statusUnknown') : '未知'); statusEl.className = 'service-status status-unknown'; } @@ -9927,13 +9974,9 @@ async function updateServiceStatusInList() { * 获取服务状态显示文本 */ function getServiceStatusLabel(status) { - if (typeof t !== 'function') { - const labels = { 'ready': '就绪', 'checking': '检测中', 'timeout': '超时', 'failed': '失败', 'idle': '未启动', 'stopped': '已停止' }; - return labels[status] || status; - } const keyMap = { 'ready': 'sshPage.statusReady', 'checking': 'sshPage.statusChecking', 'timeout': 'sshPage.statusTimeout', 'failed': 'sshPage.statusFailed', 'idle': 'sshPage.statusIdle', 'stopped': 'sshPage.statusStopped' }; const key = keyMap[status]; - return key ? t(key) : status; + return key ? t(key) : t('common.unknown'); } function showAddCommandModal() { @@ -10018,14 +10061,14 @@ async function showCommandVariables(varName) { // 更新标题 const header = modal.querySelector('.modal-header h2'); - if (header) header.textContent = typeof t === 'function' ? t('ui.commandVariablesWithName', { varName }) : `指令变量: ${varName}.*`; + if (header) header.textContent = typeof t === 'function' ? t('ui.commandVariablesWithName', { varName }) : `指令变量: ${escapeHtml(varName)}.*`; body.innerHTML = '
    ' + t('common.loading') + '
    '; modal.classList.remove('hidden'); try { const result = await api.call('automation.variables.list', { - prefix: `${varName}.`, + prefix: `${escapeHtml(varName)}.`, include_meta: true }); if (result.code === 0 && result.data && result.data.variables) { @@ -10063,10 +10106,10 @@ async function showCommandVariables(varName) { `; } else { - body.innerHTML = `

    ${result.message || (typeof t === 'function' ? t('sshPage.getVarFailed') : '获取变量失败')}

    `; + body.innerHTML = `

    ${escapeHtml(result.message || (typeof t === 'function' ? t('sshPage.getVarFailed') : '获取变量失败'))}

    `; } } catch (error) { - body.innerHTML = `

    ${error.message}

    `; + body.innerHTML = `

    ${escapeHtml(error.message)}

    `; } } @@ -10172,7 +10215,7 @@ function switchCmdIconType(type) { // 更新 Tab 状态 document.querySelectorAll('.icon-type-tabs .icon-tab').forEach(tab => { - tab.classList.toggle('active', (type === 'emoji' && tab.textContent.includes('图标')) || (type === 'image' && tab.textContent.includes('图片'))); + tab.classList.toggle('active', (type === 'emoji' && tab.textContent.includes(t('automation.iconLabel'))) || (type === 'image' && tab.textContent.includes(t('automation.imageTab')))); }); // 切换面板显示 @@ -10258,13 +10301,13 @@ function validateCommandId(input) { let errorMsg = ''; if (hasInvalidChars) { - errorMsg = '只允许字母、数字、下划线、连字符'; + errorMsg = t('sshPage.idValidCharsOnly'); } else if (startsWithInvalid) { - errorMsg = '不能以 _ 或 - 开头'; + errorMsg = t('sshPage.idNoStartUnderscore'); } else if (endsWithInvalid) { - errorMsg = '不能以 _ 或 - 结尾'; + errorMsg = t('sshPage.idNoEndUnderscore'); } else if (value.length > 31) { - errorMsg = 'ID 过长(最多 31 个字符)'; + errorMsg = t('sshPage.idTooLong'); } if (errorMsg) { @@ -10403,7 +10446,7 @@ function editCommand(idx) { const cmd = sshCommands[selectedHostId]?.[idx]; if (!cmd) return; - document.getElementById('command-modal-title').textContent = typeof t === 'function' ? t('otaPage.editCommand') : '编辑指令'; + document.getElementById('command-modal-title').textContent = typeof t === 'function' ? t('ssh.editCommand') : '编辑指令'; /* 编辑模式:设置 ID 并标记为只读 */ const idInput = document.getElementById('cmd-edit-id'); @@ -10506,7 +10549,7 @@ async function exportSshCommand(cmdId) { showExportSshCommandModal(cmdId); } else { // 非开发机:直接使用设备证书加密,询问是否包含主机 - const includeHost = confirm(typeof t === 'function' ? t('automation.confirmExportWithHost') : '是否同时导出该指令依赖的主机配置?\n\n点击「确定」将主机配置一起打包(推荐),点击「取消」仅导出指令。'); + const includeHost = confirmAction(typeof t === 'function' ? t('ui.confirmExportWithHost') : '是否同时导出该指令依赖的主机配置?\n\n点击「确定」将主机配置一起打包(推荐),点击「取消」仅导出指令。'); await doExportSshCommand(cmdId, null, includeHost); } } @@ -10525,8 +10568,8 @@ function showExportSshCommandModal(cmdId) { modal.innerHTML = ` @@ -12288,9 +12324,11 @@ async function loadSecurityPage() { `; await refreshSecurityPage(); + if (!pageCurrent()) return; } async function refreshSecurityPage() { + const pageCurrent = capturePageValidity(); // 密钥列表 const tbody = document.getElementById('keys-table-body'); let allKeysHtml = ''; @@ -12299,6 +12337,7 @@ async function refreshSecurityPage() { // 1. 加载 SSH 密钥 try { const keys = await api.keyList(); + if (!pageCurrent()) return; const sshKeySelect = document.getElementById('ssh-keyid'); // 更新 SSH 测试的密钥下拉列表 @@ -12310,7 +12349,7 @@ async function refreshSecurityPage() { option.value = key.id; // 隐藏密钥显示别名或掩码 ID,否则显示真实 ID const displayName = (key.hidden && key.alias) ? key.alias : key.id; - option.textContent = `${key.hidden ? '[隐藏] ' : ''}${displayName} (${key.type_desc || key.type})`; + option.textContent = `${key.hidden ? t('promptRepair.hiddenPrefix') : ''}${displayName} (${key.type_desc || key.type})`; sshKeySelect.appendChild(option); }); } @@ -12345,12 +12384,14 @@ async function refreshSecurityPage() { }).join(''); } } catch (e) { + if (!pageCurrent()) return; console.error('加载 SSH 密钥失败:', e); } // 2. 加载 HTTPS 密钥(来自 ts_cert) try { const certStatus = await api.certStatus(); + if (!pageCurrent()) return; console.log('HTTPS cert status:', certStatus); if (certStatus.code === 0) { @@ -12400,6 +12441,7 @@ async function refreshSecurityPage() { } } } catch (e) { + if (!pageCurrent()) return; console.error('加载 HTTPS 密钥状态失败:', e); } @@ -12412,15 +12454,19 @@ async function refreshSecurityPage() { // SSH 已部署主机列表(加载数据并渲染到 DOM) await refreshSshHostsList(); + if (!pageCurrent()) return; // 已知主机指纹列表 await refreshKnownHostsList(); + if (!pageCurrent()) return; // HTTPS 证书状态 await refreshCertStatus(); + if (!pageCurrent()) return; // Config Pack 状态 await refreshConfigPackStatus(); + if (!pageCurrent()) return; } /** @@ -12430,21 +12476,26 @@ async function refreshSecurityPage() { * 仅加载 SSH hosts 数据到 window._sshHostsData(不渲染 DOM) */ async function loadSshHostsData() { + const pageCurrent = capturePageValidity(); try { const result = await api.call('ssh.hosts.list', {}); + if (!pageCurrent()) return; const hosts = result.data?.hosts || []; window._sshHostsData = {}; hosts.forEach(h => { window._sshHostsData[h.id] = h; }); console.log('loadSshHostsData: loaded', Object.keys(window._sshHostsData).length, 'hosts'); } catch (e) { + if (!pageCurrent()) return; console.error('loadSshHostsData error:', e); window._sshHostsData = {}; } } async function refreshSshHostsList() { + const pageCurrent = capturePageValidity(); // 首先加载 SSH hosts 数据(无需 DOM) await loadSshHostsData(); + if (!pageCurrent()) return; const tbody = document.getElementById('ssh-hosts-table-body'); if (!tbody) return; // DOM 渲染部分可选 @@ -12476,6 +12527,7 @@ async function refreshSshHostsList() { // 存储主机列表供索引访问 window._sshHostsList = hosts; } catch (e) { + if (!pageCurrent()) return; console.error('Refresh SSH hosts error:', e); tbody.innerHTML = `${typeof t === 'function' ? t('common.loadFailed') : '加载失败'}`; } @@ -12485,11 +12537,13 @@ async function refreshSshHostsList() { * 刷新已知主机指纹列表 */ async function refreshKnownHostsList() { + const pageCurrent = capturePageValidity(); const tbody = document.getElementById('known-hosts-table-body'); if (!tbody) return; try { const result = await api.call('hosts.list', {}); + if (!pageCurrent()) return; const hosts = result.data?.hosts || []; if (hosts.length === 0) { @@ -12514,6 +12568,7 @@ async function refreshKnownHostsList() { `).join(''); } catch (e) { + if (!pageCurrent()) return; console.error('Refresh known hosts error:', e); tbody.innerHTML = `${typeof t === 'function' ? t('common.loadFailed') : 'Load failed'}`; } @@ -12536,7 +12591,7 @@ async function removeKnownHost(index) { const host = window._knownHostsList?.[index]; if (!host) return; - if (!confirm(typeof t === 'function' ? t('ui.confirmDeleteFingerprint', { host: host.host, port: host.port }) : `确定要删除主机 ${host.host}:${host.port} 的指纹记录吗?\n\n删除后下次连接将重新验证服务器指纹。`)) return; + if (!confirmAction(typeof t === 'function' ? t('ui.confirmDeleteFingerprint', { host: host.host, port: host.port }) : `确定要删除主机 ${host.host}:${host.port} 的指纹记录吗?\n\n删除后下次连接将重新验证服务器指纹。`)) return; try { const result = await api.call('hosts.remove', { host: host.host, port: host.port }); @@ -12607,14 +12662,24 @@ async function testSshHostByIndex(index) { showToast(typeof t === 'function' ? t('toast.testingConnection', { host: host.id }) : `正在测试连接 ${host.id}...`, 'info'); try { - const execResult = await api.call('ssh.exec', { + const params = { host: host.host, port: host.port, user: host.username, // API 需要 'user' 而不是 'username' keyid: host.keyid || 'default', command: 'echo "TianshanOS SSH Test OK"', - trust_new: true - }); + trust_new: false + }; + let execResult = await api.call('ssh.exec', params); + if ([1001, 1002].includes(execResult.code)) { + const fingerprint = execResult.data?.fingerprint || execResult.data?.current_fingerprint; + if (fingerprint && confirm(runtimeText('confirmFingerprint') + '\n' + host.host + ':' + host.port + '\n' + fingerprint)) { + params.confirmed_fingerprint = fingerprint; + params.trust_new = execResult.code === 1002; + params.accept_changed = execResult.code === 1001; + execResult = await api.call('ssh.exec', params); + } + } if (execResult.code === 0) { showToast(typeof t === 'function' ? t('toast.connectionSuccess', { host: host.id }) : `连接 ${host.id} 成功!`, 'success'); @@ -12733,12 +12798,12 @@ async function doExportSshHost(hostId, recipientCert) { const result = await api.call('ssh.hosts.export', params); if (result.code !== 0) { - throw new Error(result.message || '导出失败'); + throw new Error(result.message || t('toast.exportFailed')); } const data = result.data; if (!data?.tscfg) { - throw new Error('无效的响应数据'); + throw new Error(t('toast.invalidResponse')); } // 下载文件 @@ -12752,7 +12817,7 @@ async function doExportSshHost(hostId, recipientCert) { document.body.removeChild(a); URL.revokeObjectURL(url); - showToast(typeof t === 'function' ? t('sshPage.hostConfigExported', { filename: data.filename }) : '已导出主机配置: ' + data.filename, 'success'); + showToast(typeof t === 'function' ? t('toast.hostConfigExported', { filename: data.filename }) : '已导出主机配置: ' + data.filename, 'success'); } /** @@ -12949,7 +13014,7 @@ async function removeHostByIndex(index) { return; } - if (!confirm(typeof t === 'function' ? t('ui.confirmRemoveHostLocal', { id: host.id }) : `确定要从列表中移除主机 "${host.id}" 吗?\n\n注意:这只会移除本地记录,不会删除已部署到服务器上的公钥。如需撤销公钥,请点击「撤销」按钮。`)) return; + if (!confirmAction(typeof t === 'function' ? t('ui.confirmRemoveHostLocal', { id: host.id }) : `确定要从列表中移除主机 "${host.id}" 吗?\n\n注意:这只会移除本地记录,不会删除已部署到服务器上的公钥。如需撤销公钥,请点击「撤销」按钮。`)) return; try { const result = await api.call('ssh.hosts.remove', { id: host.id }); @@ -13034,12 +13099,12 @@ async function doRevokeFromHost(index) { try { const result = await api.sshRevoke(host.host, host.username, password, host.keyid || 'default', host.port); - if (result.data?.revoked) { + if (result.data?.revoked === true) { resultBox.textContent = typeof t === 'function' ? t('securityPage.revokeSuccess', {count: result.data.removed_count || 1}) : `Revoked! Removed ${result.data.removed_count || 1} matching public key(s)`; resultBox.classList.add('success'); // 自动移除本地记录 - await api.call('ssh.hosts.remove', { id: host.id }); + requireApiSuccess(await api.call('ssh.hosts.remove', { id: host.id }), 'call'); showToast(typeof t === 'function' ? t('securityPage.revokedAndRemoved') : 'Revoked public key and removed host record', 'success'); setTimeout(() => { @@ -13053,7 +13118,7 @@ async function doRevokeFromHost(index) { // 提供移除本地记录的选项 revokeBtn.innerHTML = ' ' + (typeof t === 'function' ? t('securityPage.removeLocalRecord') : 'Remove Local Record Only'); revokeBtn.onclick = async () => { - await api.call('ssh.hosts.remove', { id: host.id }); + requireApiSuccess(await api.call('ssh.hosts.remove', { id: host.id }), 'call'); showToast(typeof t === 'function' ? t('securityPage.removedLocalRecord') : 'Removed local host record', 'success'); hideRevokeHostModal(); refreshSshHostsList(); @@ -13075,7 +13140,7 @@ async function doRevokeFromHost(index) { * 从安全页面删除 SSH 主机(保留兼容性) */ async function deleteSshHostFromSecurity(id) { - if (!confirm(typeof t === 'function' ? t('ui.confirmRemoveHostLocal2', { id }) : `确定要从列表中移除主机 "${id}" 吗?\n\n注意:这只会移除本地记录,不会删除已部署到服务器上的公钥。如需撤销公钥,请使用密钥管理中的「撤销」功能。`)) return; + if (!confirmAction(typeof t === 'function' ? t('ui.confirmRemoveHostLocal2', { id }) : `确定要从列表中移除主机 "${id}" 吗?\n\n注意:这只会移除本地记录,不会删除已部署到服务器上的公钥。如需撤销公钥,请使用密钥管理中的「撤销」功能。`)) return; try { const result = await api.call('ssh.hosts.remove', { id }); @@ -13091,9 +13156,9 @@ async function deleteSshHostFromSecurity(id) { } async function deleteKey(id) { - if (confirm(typeof t === 'function' ? t('ui.confirmDeleteKey', { id }) : `确定要删除密钥 "${id}" 吗?此操作不可撤销!`)) { + if (confirmAction(typeof t === 'function' ? t('ui.confirmDeleteKey', { id }) : `确定要删除密钥 "${id}" 吗?此操作不可撤销!`)) { try { - await api.keyDelete(id); + requireApiSuccess(await api.keyDelete(id), 'keyDelete'); showToast((typeof t === 'function' ? t('toast.keyDeleted') : '密钥已删除'), 'success'); await refreshSecurityPage(); } catch (e) { @@ -13118,7 +13183,7 @@ async function exportKey(id) { async function exportPrivateKey(id) { // 安全确认 - if (!confirm(typeof t === 'function' ? t('ui.confirmExportPrivateKey', { id }) : `安全警告\n\n您正在导出私钥 "${id}"。\n\n私钥是高度敏感的安全凭证,请确保:\n• 不要在公共网络传输\n• 不要分享给他人\n• 安全存储在本地\n\n确定要继续吗?`)) { + if (!confirmAction(typeof t === 'function' ? t('ui.confirmExportPrivateKey', { id }) : `安全警告\n\n您正在导出私钥 "${id}"。\n\n私钥是高度敏感的安全凭证,请确保:\n• 不要在公共网络传输\n• 不要分享给他人\n• 安全存储在本地\n\n确定要继续吗?`)) { return; } @@ -13159,7 +13224,7 @@ function showPubkeyModal(id, pubkey, type, comment) { @@ -13192,12 +13257,12 @@ function showPrivkeyModal(id, privkey, type, comment) {

    ${typeof t === 'function' ? t('securityPage.keyTypeLabel') : 'Type'}: ${escapeHtml(type)}${comment ? ' | ' + (typeof t === 'function' ? t('securityPage.commentLabel') : 'Comment') + ': ' + escapeHtml(comment) : ''}

    - ${typeof t === 'function' ? t('securityPage.privkeyHint') : 'Save as ~/.ssh/' + escapeHtml(id) + ' and set permissions chmod 600'} + ${typeof t === 'function' ? t('securityPage.privkeyHint', {id}) : 'Save as ~/.ssh/' + escapeHtml(id) + ' and set permissions chmod 600'}

    - +
    `; @@ -13309,30 +13374,25 @@ async function deployKey() { const deployBtn = document.getElementById('deploy-btn'); resultBox.classList.remove('hidden', 'success', 'error'); - resultBox.textContent = typeof t === 'function' ? t('securityPage.deployingKey') : '正在部署密钥...'; + resultBox.textContent = typeof t === 'function' ? t('sshPage.deployingKey') : '正在部署密钥...'; deployBtn.disabled = true; try { // 调用 ssh.copyid API(与 CLI 逻辑一致) - const result = await api.sshCopyid(host, user, password, currentDeployKeyId, port, true); + const result = requireApiSuccess(await api.sshCopyid(host, user, password, currentDeployKeyId, port, true), 'ssh.copyid'); - if (result.data?.deployed) { - let msg = `部署成功!现在可以使用密钥 "${currentDeployKeyId}" 免密登录 ${user}@${host}`; - if (result.data.verified) { - msg += '\n公钥认证已验证'; - } else { - msg += '\n公钥认证验证跳过'; - } - resultBox.textContent = msg; - resultBox.classList.add('success'); - showToast((typeof t === 'function' ? t('toast.keyDeployed') : '密钥部署成功'), 'success'); + if (result.data?.deployed === true) { + const verified = result.data.verified === true; + resultBox.textContent = t(verified ? 'promptRepair.keyVerified' : 'promptRepair.keyUnverified', {id: currentDeployKeyId, target: `${user}@${host}`}); + resultBox.classList.add(verified ? 'success' : 'warning'); + showToast(resultBox.textContent, verified ? 'success' : 'warning', 6000); // 刷新已部署主机列表(后端 ssh.copyid 会自动注册主机) await loadSshHostsData(); } else { - throw new Error('部署失败'); + throw new Error(t('promptRepair.resultUnknown')); } } catch (e) { - resultBox.textContent = (typeof t === 'function' ? t('securityPage.deployFailedMsg', { msg: e.message }) : '部署失败: ' + e.message); + resultBox.textContent = (typeof t === 'function' ? t('pkiPage.deployFailedMsg', { msg: e.message }) : '部署失败: ' + e.message); resultBox.classList.add('error'); } finally { deployBtn.disabled = false; @@ -13384,9 +13444,9 @@ async function revokeKey() { try { // 调用 ssh.revoke API(与 CLI 逻辑一致) - const result = await api.sshRevoke(host, user, password, currentRevokeKeyId, port); + const result = requireApiSuccess(await api.sshRevoke(host, user, password, currentRevokeKeyId, port), 'ssh.revoke'); - if (result.data?.revoked) { + if (result.data?.revoked === true) { resultBox.textContent = typeof t === 'function' ? t('sshPage.revokeSuccess', { target: `${user}@${host}`, count: result.data.removed_count || 1 }) : `撤销成功!已从 ${user}@${host} 移除 ${result.data.removed_count || 1} 个匹配的公钥`; resultBox.classList.add('success'); showToast((typeof t === 'function' ? t('toast.keyRevoked') : '密钥撤销成功'), 'success'); @@ -13395,10 +13455,10 @@ async function revokeKey() { resultBox.classList.add('warning'); showToast((typeof t === 'function' ? t('toast.publicKeyNotFound') : '公钥未找到'), 'warning'); } else { - throw new Error('撤销失败'); + throw new Error(t('securityPage.revokeFailed')); } } catch (e) { - resultBox.textContent = (typeof t === 'function' ? t('securityPage.revokeFailedMsg', { msg: e.message }) : '撤销失败: ' + e.message); + resultBox.textContent = (typeof t === 'function' ? t('pkiPage.revokeFailedMsg', { msg: e.message }) : '撤销失败: ' + e.message); resultBox.classList.add('error'); } finally { revokeBtn.disabled = false; @@ -13412,8 +13472,8 @@ let currentMismatchInfo = null; function showHostMismatchModal(info) { currentMismatchInfo = info; document.getElementById('mismatch-host').value = `${info.host}:${info.port || 22}`; - document.getElementById('mismatch-stored-fp').value = info.stored_fingerprint || '未知'; - document.getElementById('mismatch-current-fp').value = info.current_fingerprint || '未知'; + document.getElementById('mismatch-stored-fp').value = info.stored_fingerprint || t('common.unknown'); + document.getElementById('mismatch-current-fp').value = info.current_fingerprint || t('common.unknown'); document.getElementById('host-mismatch-modal').classList.remove('hidden'); } @@ -13427,7 +13487,7 @@ async function removeAndRetry() { try { // 使用新的 hosts.update API 更新主机密钥 - await api.hostsUpdate(currentMismatchInfo.host, currentMismatchInfo.port || 22); + requireApiSuccess(await api.hostsUpdate(currentMismatchInfo.host, currentMismatchInfo.port || 22), 'hostsUpdate'); showToast((typeof t === 'function' ? t('toast.oldHostKeyRemoved') : '旧主机密钥已移除,请重新连接以信任新密钥'), 'success'); hideHostMismatchModal(); await refreshSecurityPage(); @@ -13437,9 +13497,9 @@ async function removeAndRetry() { } async function removeHost(host, port) { - if (confirm(typeof t === 'function' ? t('ui.confirmRemoveKnownHost', { host, port }) : `确定要移除主机 "${host}:${port}" 的记录吗?`)) { + if (confirmAction(typeof t === 'function' ? t('ui.confirmRemoveKnownHost', { host, port }) : `确定要移除主机 "${host}:${port}" 的记录吗?`)) { try { - await api.hostsRemove(host, port); + requireApiSuccess(await api.hostsRemove(host, port), 'hostsRemove'); showToast((typeof t === 'function' ? t('toast.hostRemoved') : '主机已移除'), 'success'); await refreshSecurityPage(); } catch (e) { @@ -13449,9 +13509,9 @@ async function removeHost(host, port) { } async function clearAllHosts() { - if (confirm(typeof t === 'function' ? t('automation.confirmClearKnownHosts') : '确定要清除所有已知主机记录吗?此操作不可撤销!')) { + if (confirmAction(typeof t === 'function' ? t('ui.confirmClearKnownHosts') : '确定要清除所有已知主机记录吗?此操作不可撤销!')) { try { - await api.hostsClear(); + requireApiSuccess(await api.hostsClear(), 'hostsClear'); showToast((typeof t === 'function' ? t('toast.allHostsCleared') : '已清除所有已知主机'), 'success'); await refreshSecurityPage(); } catch (e) { @@ -13468,6 +13528,7 @@ async function clearAllHosts() { * 刷新配置包状态卡片 */ async function refreshConfigPackStatus() { + const pageCurrent = capturePageValidity(); const statusIcon = document.getElementById('pack-status-icon'); const statusText = document.getElementById('pack-status-text'); const deviceTypeBadge = document.getElementById('pack-device-type-badge'); @@ -13478,9 +13539,10 @@ async function refreshConfigPackStatus() { try { const result = await api.configPackInfo(); + if (!pageCurrent()) return; const data = result.data; - if (!data) throw new Error('无响应数据'); + if (!data) throw new Error(t('promptRepair.noResponse')); // 存储状态供弹窗使用 window._configPackStatus = data; @@ -13513,6 +13575,7 @@ async function refreshConfigPackStatus() { } } catch (e) { + if (!pageCurrent()) return; console.error('Refresh config pack status error:', e); statusIcon.innerHTML = ''; statusText.textContent = (typeof t === 'function' ? t('common.loadFailed') : '加载失败'); @@ -13550,7 +13613,7 @@ async function loadConfigPackCert() { loading.style.display = 'none'; content.classList.remove('hidden'); } catch (e) { - loading.textContent = typeof t === 'function' ? t('securityPage.loadFailedMsg', { msg: e.message }) : '加载失败: ' + e.message; + loading.textContent = typeof t === 'function' ? t('pkiPage.loadFailedMsg', { msg: e.message }) : '加载失败: ' + e.message; } } @@ -13598,13 +13661,13 @@ async function verifyConfigPack() { if (!content) { resultBox.className = 'result-box error'; - resultBox.textContent = typeof t === 'function' ? t('securityPage.uploadOrPasteContent') : '请上传文件或粘贴配置包内容'; + resultBox.textContent = typeof t === 'function' ? t('pkiPage.uploadOrPasteContent') : '请上传文件或粘贴配置包内容'; resultBox.classList.remove('hidden'); return; } resultBox.className = 'result-box'; - resultBox.textContent = typeof t === 'function' ? t('securityPage.verifying') : '验证中...'; + resultBox.textContent = typeof t === 'function' ? t('pkiPage.verifying') : '验证中...'; resultBox.classList.remove('hidden'); preview.classList.add('hidden'); @@ -13622,21 +13685,21 @@ async function verifyConfigPack() { const sig = data.signature; document.getElementById('pack-preview-content').innerHTML = `
    -
    签名者:${sig.signer_cn || '-'}
    -
    组织:${sig.signer_ou || '-'}
    -
    官方签名:${sig.is_official ? '是' : '否'}
    -
    签名时间:${sig.signed_at ? formatTimestamp(sig.signed_at) : '-'}
    +
    ${t('ssh.signer')}: ${sig.signer_cn || '-'}
    +
    ${t('promptRepair.organization')}: ${sig.signer_ou || '-'}
    +
    ${t('securityPage.officialSignature')}: ${sig.is_official ? t('common.yes') : t('common.no')}
    +
    ${t('securityPage.signedAt')}: ${sig.signed_at ? formatTimestamp(sig.signed_at) : '-'}
    `; preview.classList.remove('hidden'); } } else { resultBox.className = 'result-box error'; - resultBox.textContent = (typeof t === 'function' ? t('securityPage.verifyFailed') : '验证失败') + ': ' + (data.result_message || (typeof t === 'function' ? t('securityPage.signatureInvalid') : '签名无效')); + resultBox.textContent = (typeof t === 'function' ? t('pkiPage.verifyFailed') : '验证失败') + ': ' + (data.result_message || (typeof t === 'function' ? t('pkiPage.signatureInvalid') : '签名无效')); } } catch (e) { resultBox.className = 'result-box error'; - resultBox.textContent = (typeof t === 'function' ? t('securityPage.verifyFailed') : '验证失败') + ': ' + e.message; + resultBox.textContent = (typeof t === 'function' ? t('pkiPage.verifyFailed') : '验证失败') + ': ' + e.message; } } @@ -13647,13 +13710,13 @@ async function importConfigPack() { if (!content) { resultBox.className = 'result-box error'; - resultBox.textContent = typeof t === 'function' ? t('securityPage.uploadOrPasteContent') : '请上传文件或粘贴配置包内容'; + resultBox.textContent = typeof t === 'function' ? t('pkiPage.uploadOrPasteContent') : '请上传文件或粘贴配置包内容'; resultBox.classList.remove('hidden'); return; } resultBox.className = 'result-box'; - resultBox.textContent = typeof t === 'function' ? t('securityPage.importing') : '导入中...'; + resultBox.textContent = typeof t === 'function' ? t('pkiPage.importing') : '导入中...'; resultBox.classList.remove('hidden'); try { @@ -13695,9 +13758,12 @@ async function importConfigPack() { * 显示配置包应用确认对话框 * 当通过文件管理上传 .tscfg 文件并验证成功后调用 */ -function showConfigPackApplyConfirm(path, packInfo) { +function showConfigPackApplyConfirm(path, packInfo, verificationCurrent = () => true) { + if (packInfo?.valid !== true) { showToast(t('promptRepair.packInvalid'), 'error'); return; } + if (!i18n.complete('securityPage.configPackSavedApplyNow')) return; + closeConfigPackApplyConfirm(); const sig = packInfo.signature || {}; - const signerInfo = sig.signer_cn ? `${sig.signer_cn}${sig.is_official ? ' (官方)' : ''}` : '未知'; + const signerInfo = sig.signer_cn ? `${sig.signer_cn}${sig.is_official ? t('promptRepair.officialSuffix') : ''}` : t('common.unknown'); // 创建确认对话框 const dialog = document.createElement('div'); @@ -13712,8 +13778,8 @@ function showConfigPackApplyConfirm(path, packInfo) {
    ${typeof t === 'function' ? t('securityPage.verifySuccess') : 'Verification Successful'}
    -
    ${typeof t === 'function' ? t('securityPage.fileName') : 'File'}: ${path.split('/').pop()}
    -
    ${typeof t === 'function' ? t('securityPage.signer') : 'Signer'}: ${signerInfo}
    +
    ${typeof t === 'function' ? t('securityPage.fileName') : 'File'}: ${escapeHtml(path.split('/').pop())}
    +
    ${typeof t === 'function' ? t('securityPage.signer') : 'Signer'}: ${escapeHtml(signerInfo)}
    ${sig.is_official ? '
    ' + (typeof t === 'function' ? t('securityPage.officialSignature') : 'Official Signature') + '
    ' : ''}
    @@ -13723,12 +13789,14 @@ function showConfigPackApplyConfirm(path, packInfo) { `; document.body.appendChild(dialog); + dialog.verificationCurrent = verificationCurrent; + document.getElementById('config-pack-apply-button').onclick = () => applyConfigPackFromPath(path); } function closeConfigPackApplyConfirm() { @@ -13741,27 +13809,45 @@ function closeConfigPackApplyConfirm() { /** * 应用指定路径的配置包 */ +let configPackAttempt = 0; async function applyConfigPackFromPath(path) { - closeConfigPackApplyConfirm(); - showToast(typeof t === 'function' ? t('toast.applyingConfig') : '正在应用配置...', 'info'); - + const dialog = document.getElementById('config-pack-apply-confirm'); + const button = document.getElementById('config-pack-apply-button'); + if (button?.disabled || !i18n.complete('securityPage.configPackSavedApplyNow')) return; + if (dialog?.verificationCurrent && !dialog.verificationCurrent()) { + showToast(t('promptRepair.packRevalidate'), 'warning'); return; + } + const attempt = ++configPackAttempt; + const current = () => attempt === configPackAttempt && document.getElementById('config-pack-apply-confirm') === dialog; + if (button) button.disabled = true; + // Keep a per-task result outside the modal, including after the modal is closed. + let results = document.getElementById('config-pack-task-results'); + if (!results) { + results = document.createElement('div'); results.id = 'config-pack-task-results'; + results.setAttribute('role', 'status'); + const heading = document.createElement('h3'); heading.textContent = t('promptRepair.taskResults'); + results.appendChild(heading); document.querySelector('main').appendChild(results); + } + const row = document.createElement('div'); results.appendChild(row); + const record = message => { row.textContent = t('promptRepair.taskAttempt', {path, attempt}) + ' — ' + message; }; + record(t('toast.applyingConfig')); + showToast(path + ': ' + t('toast.applyingConfig'), 'info', 3000, {isCurrent: current}); try { - const result = await api.call('config.pack.apply', { path }, 'POST'); - if (result.code !== 0) { - throw new Error(result.message || result.data?.result_message || '应用失败'); - } - + const result = requireApiSuccess(await api.call('config.pack.apply', { path }, 'POST'), 'config.pack.apply'); const data = result.data; - if (data.success) { - const modules = data.applied_modules || []; - const moduleList = modules.length > 0 ? modules.join(', ') : '无'; - showToast(typeof t === 'function' ? t('toast.configApplied', { modules: moduleList }) : `配置已应用\n模块: ${moduleList}`, 'success', 5000); - } else { - showToast(typeof t === 'function' ? t('toast.applyFailedMsg', { msg: data.result_message }) : `应用失败: ${data.result_message}`, 'error'); + if (data?.success !== true) throw new ApiOperationError({message: data?.result_message}, 'config.pack.apply'); + const message = t('promptRepair.packApplied') + (data.applied_modules?.length ? '\n' + t('promptRepair.details', {detail: data.applied_modules.join(', ')}) : ''); + record(message); + if (current()) { + showToast(path + ': ' + message, 'success', 5000, {isCurrent: current}); + dialog?.remove(); } } catch (e) { - console.error('Apply config pack error:', e); - showToast(typeof t === 'function' ? t('toast.applyFailedMsg', { msg: e.message }) : '应用失败: ' + e.message, 'error'); + const message = e.uncertain ? e.message : t('toast.applyFailedMsg', {msg: e.message}); + record(message); + if (current()) showToast(path + ': ' + message, 'error', 8000, {isCurrent: current}); + } finally { + if (current() && button) button.disabled = false; } } @@ -13834,7 +13920,7 @@ async function packExportBrowseRefresh() { packExportCurrentEntries = filteredEntries; if (filteredEntries.length === 0) { - fileList.innerHTML = '
    没有配置文件 (.json)
    '; + fileList.innerHTML = ("
    " + t('pkiPage.noConfigFiles') + "
    "); return; } @@ -13874,7 +13960,7 @@ async function packExportBrowseRefresh() { packExportUpdateSelectedDisplay(); } catch (e) { - fileList.innerHTML = `
    加载失败: ${e.message}
    `; + fileList.innerHTML = `
    ${t('common.loadFailed')}: ${escapeHtml(e.message)}
    `; } } @@ -13919,7 +14005,7 @@ async function packExportToggleFile(fileName, checked) { if (result.code !== 0) throw new Error(result.message); const rawContent = result.data?.content; - if (rawContent === undefined || rawContent === null) throw new Error('文件内容为空'); + if (rawContent === undefined || rawContent === null) throw new Error(t('toast.fileContentEmpty')); // 后端 storage.read 会自动解析 JSON let contentStr; @@ -13959,13 +14045,13 @@ function packExportUpdateSelectedDisplay() { selectedDiv.style.display = 'block'; - let text = `已选择 ${files.length} 个文件`; + let text = t('promptRepair.filesSelected', {count: files.length}); if (loadingFiles.length > 0) { - text += ` (${loadingFiles.length} ${t('security.filesLoading')})`; + text += ` (${loadingFiles.length} ${t('securityPage.filesLoading')})`; selectedDiv.style.background = 'rgba(245, 158, 11, 0.06)'; generateBtn.disabled = true; } else if (errorFiles.length > 0) { - text += ` (${errorFiles.length} 个错误: ${errorFiles[0][1].error})`; + text += '\n' + t('promptRepair.fileErrors', {count: errorFiles.length, message: errorFiles[0][1].error}); selectedDiv.style.background = 'rgba(244, 63, 94, 0.06)'; generateBtn.disabled = errorFiles.length === files.length; // 全部错误则禁用 } else { @@ -14037,7 +14123,7 @@ async function exportConfigPack() { if (!name) { resultBox.className = 'result-box error'; resultBox.style.visibility = 'visible'; - resultBox.textContent = typeof t === 'function' ? t('securityPage.enterConfigName') : '请输入配置名称'; + resultBox.textContent = typeof t === 'function' ? t('pkiPage.enterConfigName') : '请输入配置名称'; return; } @@ -14046,7 +14132,7 @@ async function exportConfigPack() { if (okFiles.length === 0) { resultBox.className = 'result-box error'; resultBox.style.visibility = 'visible'; - resultBox.textContent = typeof t === 'function' ? t('securityPage.selectConfigFile') : '请选择配置文件'; + resultBox.textContent = typeof t === 'function' ? t('pkiPage.selectConfigFile') : '请选择配置文件'; return; } @@ -14074,13 +14160,13 @@ async function exportConfigPack() { } catch (e) { resultBox.className = 'result-box error'; resultBox.style.visibility = 'visible'; - resultBox.textContent = (typeof t === 'function' ? t('securityPage.invalidJsonConfigMsg', { msg: e.message }) : '配置文件不是有效的 JSON: ' + e.message); + resultBox.textContent = (typeof t === 'function' ? t('pkiPage.invalidJsonConfigMsg', { msg: e.message }) : '配置文件不是有效的 JSON: ' + e.message); return; } resultBox.className = 'result-box'; resultBox.style.visibility = 'visible'; - resultBox.textContent = typeof t === 'function' ? t('securityPage.generatingPackWithCount', { count: okFiles.length }) : `生成配置包中 (${okFiles.length} 个文件)...`; + resultBox.textContent = typeof t === 'function' ? t('pkiPage.generatingPackWithCount', { count: okFiles.length }) : `生成配置包中 (${okFiles.length} 个文件)...`; document.getElementById('pack-export-tscfg').value = ''; try { @@ -14097,12 +14183,10 @@ async function exportConfigPack() { const savedPath = data.saved_path || ''; resultBox.className = 'result-box success'; - let resultHtml = `配置包已生成
    文件名: ${fileName}
    大小: ${fileSize} 字节 (${okFiles.length} 个配置文件)`; - if (savedPath) { - resultHtml += `
    已保存到: ${savedPath}`; - } - resultBox.innerHTML = resultHtml; - + resultBox.style.whiteSpace = 'pre-wrap'; + resultBox.textContent = t('promptRepair.packGenerated', {name: fileName, size: fileSize, count: okFiles.length}); + if (savedPath) resultBox.textContent += '\n' + t('securityPage.savedTo') + ': ' + savedPath; + // 显示输出 const tscfgTextarea = document.getElementById('pack-export-tscfg'); tscfgTextarea.value = tscfgContent; @@ -14117,7 +14201,7 @@ async function exportConfigPack() { // 显示保存路径 const savedPathSpan = document.getElementById('pack-export-saved-path'); if (savedPath && savedPathSpan) { - savedPathSpan.textContent = typeof t === 'function' ? t('securityPage.savedToDevice') : '已保存到设备'; + savedPathSpan.textContent = typeof t === 'function' ? t('pkiPage.savedToDevice') : '已保存到设备'; savedPathSpan.style.display = 'inline'; } @@ -14126,13 +14210,13 @@ async function exportConfigPack() { if (!tscfgContent) { console.warn('[ConfigPack] tscfg content is empty!'); - resultBox.innerHTML += '
    警告: 配置包内容为空'; + resultBox.textContent += '\n' + t('pkiPage.contentEmpty'); } } catch (e) { console.error('[ConfigPack] Export error:', e); resultBox.className = 'result-box error'; - resultBox.textContent = (typeof t === 'function' ? t('securityPage.generationFailedMsg', { msg: e.message }) : '生成失败: ' + e.message); + resultBox.textContent = (typeof t === 'function' ? t('pkiPage.generationFailedMsg', { msg: e.message }) : '生成失败: ' + e.message); } } @@ -14159,7 +14243,7 @@ function downloadPackTscfg() { document.body.removeChild(a); URL.revokeObjectURL(url); - showToast(typeof t === 'function' ? t('toast.configPackDownloaded', { filename }) : '配置包已下载: ' + filename, 'success'); + showToast(t('promptRepair.downloadStarted'), 'info'); } // 配置包:列表弹窗 @@ -14173,6 +14257,7 @@ function hideConfigPackListModal() { } async function refreshConfigPackList() { + const pageCurrent = capturePageValidity(); const path = document.getElementById('pack-list-path').value.trim() || '/sdcard/config'; const loading = document.getElementById('pack-list-loading'); const table = document.getElementById('pack-list-table'); @@ -14183,6 +14268,7 @@ async function refreshConfigPackList() { try { const result = await api.configPackList(path); + if (!pageCurrent()) return; if (result.code !== 0) throw new Error(result.message || result.error); const data = result.data; @@ -14219,13 +14305,14 @@ async function refreshConfigPackList() { table.classList.remove('hidden'); } catch (e) { + if (!pageCurrent()) return; loading.textContent = (typeof t === 'function' ? t('securityPage.packListLoadFailed') : '加载失败') + ': ' + e.message; } } async function importPackFromList(filePath) { const msg = typeof t === 'function' ? t('securityPage.confirmImportPack', { path: filePath }) : '确定要导入配置包: ' + filePath + ' ?'; - if (!confirm(msg)) return; + if (!confirmAction(msg)) return; try { const result = await api.configPackImport(null, filePath, false); @@ -14254,135 +14341,112 @@ function formatBytes(bytes) { /** * 刷新证书状态卡片 */ +// Certificate UI helpers intentionally leave the global API protocol unchanged. +function certText(key, fallback, params = {}) { + const value = typeof t === 'function' ? t(key, params) : key; + return typeof value === 'string' && value !== key ? value : fallback; +} +function certError(result, fallback) { + for (const value of [result?.message, result?.error]) { + if (typeof value === 'string' && value.trim()) return value; + } + return fallback; +} +function certValidity(value) { + const labels = {none: 'No certificate', invalid: 'Certificate cannot be parsed', + time_unverified: 'Awaiting device time', not_yet_valid: 'Not yet valid', + valid: 'Within validity period', expired: 'Expired'}; + return certText('pkiRepair.' + (labels[value] ? value : 'unknown'), labels[value] || 'Unknown / unconfirmed'); +} +function certExpiry(info) { + const seconds = info?.seconds_until_expiry; + if (!['valid', 'expired'].includes(info?.validity) || typeof seconds !== 'number') return ''; + if (seconds >= 0 && seconds < 86400) return certText('pkiRepair.lessDay', 'Expires in less than a day'); + if (seconds < 0 && seconds > -86400) return certText('pkiRepair.expiredLessDay', 'Expired less than a day ago'); + const days = Math.floor(Math.abs(seconds) / 86400); + return seconds < 0 ? certText('pkiPage.expiredDays', `Expired ${days} days ago`, {days}) : + certText('pkiPage.remainingDays', `${days} days remaining`, {days}); +} async function refreshCertStatus() { - const statusIcon = document.getElementById('cert-status-icon'); - const statusText = document.getElementById('cert-status-text'); - const expiryBadge = document.getElementById('cert-expiry-badge'); - const infoDetails = document.getElementById('cert-info-details'); - const noKeyHint = document.getElementById('cert-no-key-hint'); - - // 按钮引用 - const btnGenKey = document.getElementById('btn-cert-gen-key'); - const btnGenCSR = document.getElementById('btn-cert-gen-csr'); - const btnInstall = document.getElementById('btn-cert-install'); - const btnInstallCA = document.getElementById('btn-cert-install-ca'); - const btnView = document.getElementById('btn-cert-view'); - const btnDelete = document.getElementById('btn-cert-delete'); - - if (!statusIcon) return; // 不在安全页面 - + const pageCurrent = capturePageValidity(); + if (!document.getElementById('cert-status-icon')) return; try { const result = await api.certStatus(); + if (!pageCurrent()) return; + if (result.code !== 0 || !result.data) throw new Error(certError(result, 'Status unavailable')); const data = result.data; - - if (!data) throw new Error('无响应数据'); - - // 存储状态供弹窗使用 window._certPkiStatus = data; - - // 根据状态更新 UI - const hasKey = data.has_private_key; - const hasCert = data.has_certificate; - const hasCa = data.has_ca_chain; - - // 更新按钮状态 - btnGenKey.disabled = false; - btnGenCSR.disabled = !hasKey; - btnInstall.disabled = !hasKey; - btnInstallCA.disabled = !hasKey; - btnView.disabled = !hasCert; - btnDelete.disabled = !hasKey && !hasCert && !hasCa; - - // 状态显示 - switch (data.status) { - case 'not_initialized': - statusIcon.innerHTML = ''; - statusText.textContent = typeof t === 'function' ? t('securityPage.notInitialized') : 'Not Initialized'; - noKeyHint.style.display = 'block'; - infoDetails.style.display = 'none'; - expiryBadge.style.display = 'none'; - break; - case 'key_generated': - statusIcon.innerHTML = ''; - statusText.textContent = typeof t === 'function' ? t('securityPage.keyGeneratedAwaitCsr') : 'Key Generated, Awaiting CSR'; - noKeyHint.style.display = 'none'; - infoDetails.style.display = 'none'; - expiryBadge.style.display = 'none'; - break; - case 'csr_pending': - statusIcon.innerHTML = ''; - statusText.textContent = typeof t === 'function' ? t('securityPage.csrPendingSign') : 'CSR Generated, Awaiting Signing'; - noKeyHint.style.display = 'none'; - infoDetails.style.display = 'none'; - expiryBadge.style.display = 'none'; - break; - case 'activated': - statusIcon.innerHTML = ''; - statusText.textContent = typeof t === 'function' ? t('securityPage.activated') : 'Activated'; - noKeyHint.style.display = 'none'; - infoDetails.style.display = 'block'; - updateCertInfoDetails(data.cert_info); - break; - case 'expired': - statusIcon.innerHTML = ''; - statusText.textContent = typeof t === 'function' ? t('securityPage.expired') : 'Expired'; - noKeyHint.style.display = 'none'; - infoDetails.style.display = 'block'; - updateCertInfoDetails(data.cert_info); - break; - case 'error': - statusIcon.innerHTML = ''; - statusText.textContent = typeof t === 'function' ? t('common.error') : 'Error'; - noKeyHint.style.display = 'none'; - infoDetails.style.display = 'none'; - expiryBadge.style.display = 'none'; - break; - default: - statusIcon.innerHTML = ''; - statusText.textContent = data.status_display || data.status; + for (const [id, disabled] of Object.entries({ + 'btn-cert-gen-key': false, 'btn-cert-gen-csr': !data.has_private_key, + 'btn-cert-install': !data.has_private_key, 'btn-cert-install-ca': false, + 'btn-cert-view': !data.has_certificate, + 'btn-cert-delete': !data.has_private_key && !data.has_certificate && !data.has_ca_chain + })) document.getElementById(id).disabled = disabled; + document.getElementById('cert-status-icon').textContent = ''; + document.getElementById('cert-status-text').textContent = certValidity(data.validity); + const stored = certText('pkiRepair.stored', 'Saved'); + const missing = certText('pkiRepair.missing', 'Missing'); + document.getElementById('cert-material-state').textContent = + `${certText('pkiRepair.key', 'Key')}: ${data.has_private_key ? stored : missing} · ` + + `${certText('pkiRepair.certificate', 'Certificate')}: ${data.has_certificate ? stored : missing} · ` + + `${certText('pkiRepair.clientCa', 'Client verification CA')}: ${data.has_ca_chain ? stored : missing}`; + const https = data.https; + document.getElementById('cert-https-state').textContent = 'HTTPS: ' + + (typeof https?.running !== 'boolean' ? certValidity() : + certText(https.running ? 'pkiRepair.running' : 'pkiRepair.stopped', https.running ? 'Running' : 'Not running')) + + (https?.port ? ` (${https.port})` : '') + + (https?.last_error ? ` — ${https.last_error_stage}: ${https.last_error}` : ''); + document.getElementById('cert-blocked-state').textContent = (data.blocked_by || []).map( + reason => certText('pkiRepair.block_' + reason, reason)).join(' · '); + document.getElementById('cert-restart-state').textContent = data.restart_required ? + certText('pkiRepair.restart', 'Stored materials changed. The running service still uses the previous materials. Restart the device to apply; startup conditions must be met.') : ''; + document.getElementById('cert-active-fingerprint').textContent = https?.loaded_certificate_sha256 ? + `${certText('pkiRepair.activeFingerprint', 'Active certificate SHA-256')}: ${https.loaded_certificate_sha256}` : ''; + document.getElementById('cert-no-key-hint').style.display = data.has_private_key ? 'none' : 'block'; + document.getElementById('cert-info-details').style.display = data.has_certificate ? 'block' : 'none'; + updateCertInfoDetails(data.cert_info); + // Read the device clock, never display the browser's clock as device evidence. + try { + const time = await api.timeInfo(); + if (!pageCurrent()) return; + if (time.code !== 0 || !time.data) throw new Error('Time unavailable'); + document.getElementById('cert-device-time').textContent = + `${certText('pkiRepair.deviceTime', 'Device time')}: ${time.data.datetime || '—'} · ${time.data.source || '—'} · ` + + certText(time.data.synced ? 'pkiRepair.synced' : 'pkiRepair.unsynced', time.data.synced ? 'Synchronized' : 'Not synchronized'); + } catch (_) { + if (!pageCurrent()) return; + document.getElementById('cert-device-time').textContent = certText('pkiRepair.timeUnknown', 'Device time unavailable; retry refresh'); } - } catch (e) { - console.error('Refresh cert status error:', e); - statusIcon.innerHTML = ''; - statusText.textContent = typeof t === 'function' ? t('common.loadFailed') : 'Load Failed'; - if (noKeyHint) noKeyHint.style.display = 'none'; - if (infoDetails) infoDetails.style.display = 'none'; - if (expiryBadge) expiryBadge.style.display = 'none'; - } -} - -function updateCertInfoDetails(certInfo) { - if (!certInfo) return; - - document.getElementById('cert-subject-cn').textContent = certInfo.subject_cn || '-'; - document.getElementById('cert-issuer-cn').textContent = certInfo.issuer_cn || '-'; - document.getElementById('cert-not-before').textContent = certInfo.not_before ? formatTimestamp(certInfo.not_before) : '-'; - document.getElementById('cert-not-after').textContent = certInfo.not_after ? formatTimestamp(certInfo.not_after) : '-'; - document.getElementById('cert-serial').textContent = certInfo.serial || '-'; - document.getElementById('cert-valid-status').textContent = certInfo.is_valid ? (typeof t === 'function' ? t('securityPage.valid') : 'Valid') : (typeof t === 'function' ? t('securityPage.invalid') : 'Invalid'); - - // 更新过期徽章 - const expiryBadge = document.getElementById('cert-expiry-badge'); - if (certInfo.days_until_expiry !== undefined) { - expiryBadge.style.display = 'inline-block'; - if (certInfo.days_until_expiry < 0) { - expiryBadge.textContent = (typeof t === 'function' ? t('securityPage.expiredDays', {days: Math.abs(certInfo.days_until_expiry)}) : `已过期 ${Math.abs(certInfo.days_until_expiry)} 天`); - expiryBadge.className = 'badge badge-danger'; - } else if (certInfo.days_until_expiry < 30) { - expiryBadge.textContent = (typeof t === 'function' ? t('securityPage.expiringDays', {days: certInfo.days_until_expiry}) : `${certInfo.days_until_expiry} 天后过期`); - expiryBadge.className = 'badge badge-warning'; - } else { - expiryBadge.textContent = (typeof t === 'function' ? t('securityPage.remainingDays', {days: certInfo.days_until_expiry}) : `剩余 ${certInfo.days_until_expiry} 天`); - expiryBadge.className = 'badge badge-service-style'; - } - } else { - expiryBadge.style.display = 'none'; - } + if (!pageCurrent()) return; + document.getElementById('cert-status-text').textContent = certText('pkiPage.statusLoadFailed', 'Status refresh failed'); + } +} +function updateCertInfoDetails(info) { + const badge = document.getElementById('cert-expiry-badge'); + badge.textContent = certExpiry(info); + badge.style.display = badge.textContent ? 'inline-block' : 'none'; + if (!info) return; + for (const [id, value] of Object.entries({ + 'cert-subject-cn': info.subject_cn, 'cert-issuer-cn': info.issuer_cn, + 'cert-not-before': info.validity !== 'invalid' && info.not_before ? formatTimestamp(info.not_before) : '-', + 'cert-not-after': info.validity !== 'invalid' && info.not_after ? formatTimestamp(info.not_after) : '-', + 'cert-serial': (info.serial || '-') + (info.serial_truncated ? '…' : ''), + 'cert-valid-status': certValidity(info.validity) + })) document.getElementById(id).textContent = value || '-'; +} +async function syncCertificateTime() { + const button = document.getElementById('cert-time-sync'); + button.disabled = true; + try { + const result = await api.timeSync(Date.now()); + if (result.code !== 0) throw new Error(certError(result, 'Time update failed')); + await refreshCertStatus(); + } catch (e) { + document.getElementById('cert-device-time').textContent = certError(e, 'Time update failed'); + } finally { button.disabled = false; } } -// ====== 证书管理弹窗 ====== - function showCertGenKeyModal() { const modal = document.getElementById('cert-genkey-modal'); const warningBox = document.getElementById('cert-genkey-existing-warning'); @@ -14410,25 +14474,25 @@ async function generateCertKeypair() { const force = window._certPkiStatus?.has_private_key; resultBox.classList.remove('hidden', 'success', 'error'); - resultBox.textContent = typeof t === 'function' ? t('securityPage.generatingKeyPair') : '正在生成密钥对...'; + resultBox.textContent = certText('pkiPage.generatingKeyPair', '正在生成密钥对...'); btn.disabled = true; try { const result = await api.certGenerateKeypair(force); - if (result.code === 0 || result.data?.success) { - resultBox.textContent = typeof t === 'function' ? t('securityPage.ecdsaKeyPairSuccess') : 'ECDSA P-256 密钥对生成成功!'; + if (result.code === 0) { + resultBox.textContent = certText('pkiPage.ecdsaKeyPairSuccess', 'ECDSA P-256 密钥对生成成功!'); resultBox.classList.add('success'); - showToast(typeof t === 'function' ? t('toast.keypairGenerated') : '密钥对生成成功', 'success'); + showToast(certText('toast.keypairGenerated', '密钥对生成成功'), 'success'); setTimeout(() => { hideCertGenKeyModal(); refreshCertStatus(); }, 1000); } else { - throw new Error(result.message || '生成失败'); + throw new Error(certError(result, t('toast.generateFailed'))); } } catch (e) { - resultBox.textContent = (typeof t === 'function' ? t('securityPage.generationFailedMsg', { msg: e.message }) : '生成失败: ' + e.message); + resultBox.textContent = (certText('pkiPage.generationFailedMsg', '生成失败: ' + e.message, { msg: e.message })); resultBox.classList.add('error'); } finally { btn.disabled = false; @@ -14457,7 +14521,7 @@ async function generateCSR() { const btn = document.getElementById('csr-gen-btn'); resultBox.classList.remove('hidden', 'success', 'error'); - resultBox.textContent = typeof t === 'function' ? t('securityPage.generatingCsr') : '正在生成 CSR...'; + resultBox.textContent = certText('pkiPage.generatingCsr', '正在生成 CSR...'); btn.disabled = true; try { @@ -14471,12 +14535,12 @@ async function generateCSR() { resultBox.classList.add('hidden'); csrResultBox.classList.remove('hidden'); document.getElementById('csr-pem-output').value = result.data.csr_pem; - showToast(typeof t === 'function' ? t('toast.csrGenerated') : 'CSR 生成成功', 'success'); + showToast(certText('toast.csrGenerated', 'CSR 生成成功'), 'success'); } else { - throw new Error(result.message || '生成失败'); + throw new Error(certError(result, t('toast.generateFailed'))); } } catch (e) { - resultBox.textContent = (typeof t === 'function' ? t('securityPage.generationFailedMsg', { msg: e.message }) : '生成失败: ' + e.message); + resultBox.textContent = (certText('pkiPage.generationFailedMsg', '生成失败: ' + e.message, { msg: e.message })); resultBox.classList.add('error'); } finally { btn.disabled = false; @@ -14486,9 +14550,9 @@ async function generateCSR() { function copyCSRToClipboard() { const csr = document.getElementById('csr-pem-output').value; navigator.clipboard.writeText(csr).then(() => { - showToast(typeof t === 'function' ? t('toast.csrCopied') : 'CSR 已复制到剪贴板', 'success'); + showToast(certText('toast.csrCopied', 'CSR 已复制到剪贴板'), 'success'); }).catch(e => { - showToast(typeof t === 'function' ? t('toast.copyFailedMsg', { msg: e.message }) : '复制失败: ' + e.message, 'error'); + showToast(certText('toast.copyFailedMsg', '复制失败: ' + e.message, { msg: e.message }), 'error'); }); } @@ -14503,34 +14567,40 @@ function hideCertInstallModal() { document.getElementById('cert-install-modal').classList.add('hidden'); } -async function installCertificate() { - const certPem = document.getElementById('cert-pem-input').value.trim(); - if (!certPem) { - showToast(typeof t === 'function' ? t('toast.enterCertPem') : '请输入证书 PEM', 'error'); - return; - } - - const resultBox = document.getElementById('cert-install-result'); +async function installCertificate() { await installCertMaterial(false); } +async function installCertMaterial(ca) { + const pem = document.getElementById(ca ? 'ca-pem-input' : 'cert-pem-input').value.trim(); + const resultBox = document.getElementById(ca ? 'ca-install-result' : 'cert-install-result'); + const button = document.getElementById(ca ? 'cert-ca-submit' : 'cert-install-submit'); + if (button.disabled) return; resultBox.classList.remove('hidden', 'success', 'error'); - resultBox.textContent = typeof t === 'function' ? t('securityPage.installingCert') : '正在安装证书...'; - + if (!pem) { + resultBox.textContent = certText('pkiRepair.empty', 'Provide PEM text'); + resultBox.classList.add('error'); return; + } + button.disabled = true; + resultBox.textContent = certText('pkiPage.installingCert', 'Saving certificate materials…'); + let saved = false; try { - const result = await api.certInstall(certPem); - if (result.code === 0 || result.data?.success) { - resultBox.textContent = typeof t === 'function' ? t('securityPage.certInstalledSuccess') : '证书安装成功!'; + const result = ca ? await api.certInstallCA(pem) : await api.certInstall(pem); + saved = result.code === 0; + if (saved) { + resultBox.textContent = certText('pkiRepair.saved', 'Saved. Check validity and HTTPS status below.'); resultBox.classList.add('success'); - showToast(typeof t === 'function' ? t('toast.certInstalled') : '证书安装成功', 'success'); - - setTimeout(() => { - hideCertInstallModal(); - refreshCertStatus(); - }, 1000); } else { - throw new Error(result.message || '安装失败'); + const msg = certError(result, certText('pkiPage.installFailed', 'Installation failed')); + resultBox.textContent = certText('pkiPage.installFailedMsg', `Installation failed: ${msg}`, {msg}); + resultBox.classList.add('error'); } - } catch (e) { - resultBox.textContent = (typeof t === 'function' ? t('securityPage.installFailedMsg', { msg: e.message }) : '安装失败: ' + e.message); + } catch (_) { + // A lost response is not proof that the server did not persist the request. + resultBox.textContent = certText('pkiRepair.unconfirmed', 'Installation result unconfirmed. Refresh status to check before retrying.'); resultBox.classList.add('error'); + } finally { button.disabled = false; } + if (saved) { + try { await refreshCertStatus(); } catch (_) { /* Saved result remains authoritative. */ } + // Observe the asynchronous coordinator without reposting or starting HTTPS from UI. + setTimeout(() => refreshCertStatus().catch(() => {}), 5500); } } @@ -14545,36 +14615,7 @@ function hideCertInstallCAModal() { document.getElementById('cert-ca-modal').classList.add('hidden'); } -async function installCAChain() { - const caPem = document.getElementById('ca-pem-input').value.trim(); - if (!caPem) { - showToast(typeof t === 'function' ? t('toast.enterCaPem') : '请输入 CA 证书链 PEM', 'error'); - return; - } - - const resultBox = document.getElementById('ca-install-result'); - resultBox.classList.remove('hidden', 'success', 'error'); - resultBox.textContent = typeof t === 'function' ? t('securityPage.installingCaCert') : '正在安装 CA 证书链...'; - - try { - const result = await api.certInstallCA(caPem); - if (result.code === 0 || result.data?.success) { - resultBox.textContent = typeof t === 'function' ? t('securityPage.caCertInstalledSuccess') : 'CA 证书链安装成功!'; - resultBox.classList.add('success'); - showToast(typeof t === 'function' ? t('toast.caInstalled') : 'CA 证书链安装成功', 'success'); - - setTimeout(() => { - hideCertInstallCAModal(); - refreshCertStatus(); - }, 1000); - } else { - throw new Error(result.message || '安装失败'); - } - } catch (e) { - resultBox.textContent = (typeof t === 'function' ? t('securityPage.installFailedMsg', { msg: e.message }) : '安装失败: ' + e.message); - resultBox.classList.add('error'); - } -} +async function installCAChain() { await installCertMaterial(true); } async function showCertViewModal() { const modal = document.getElementById('cert-view-modal'); @@ -14592,10 +14633,10 @@ async function showCertViewModal() { loading.style.display = 'none'; content.classList.remove('hidden'); } else { - throw new Error(result.message || '获取证书失败'); + throw new Error(certError(result, t('toast.getCertFailed'))); } } catch (e) { - loading.textContent = typeof t === 'function' ? t('securityPage.loadFailedMsg', { msg: e.message }) : '加载失败: ' + e.message; + loading.textContent = certText('pkiPage.loadFailedMsg', '加载失败: ' + e.message, { msg: e.message }); } } @@ -14606,27 +14647,27 @@ function hideCertViewModal() { function copyCertToClipboard() { const cert = document.getElementById('cert-view-pem').value; navigator.clipboard.writeText(cert).then(() => { - showToast(typeof t === 'function' ? t('toast.certCopied') : '证书已复制到剪贴板', 'success'); + showToast(certText('toast.certCopied', '证书已复制到剪贴板'), 'success'); }).catch(e => { - showToast(typeof t === 'function' ? t('toast.copyFailedMsg', { msg: e.message }) : '复制失败: ' + e.message, 'error'); + showToast(certText('toast.copyFailedMsg', '复制失败: ' + e.message, { msg: e.message }), 'error'); }); } async function deleteCertCredentials() { - if (!confirm(typeof t === 'function' ? t('automation.confirmDeletePKI') : '确定要删除所有 PKI 凭证吗?\n\n这将删除:\n• 私钥\n• 设备证书\n• CA 证书链\n\n此操作不可撤销!')) { + if (!confirmAction(certText('ui.confirmDeletePKI', '确定要删除所有 PKI 凭证吗?\n\n这将删除:\n• 私钥\n• 设备证书\n• CA 证书链\n\n此操作不可撤销!'))) { return; } try { const result = await api.certDelete(); - if (result.code === 0 || result.data?.success) { - showToast(typeof t === 'function' ? t('toast.pkiDeleted') : 'PKI 凭证已删除', 'success'); + if (result.code === 0) { + showToast(certText('toast.pkiDeleted', 'PKI 凭证已删除'), 'success'); await refreshCertStatus(); } else { - throw new Error(result.message || '删除失败'); + throw new Error(certError(result, t('errors.deleteFailed'))); } } catch (e) { - showToast((typeof t === 'function' ? t('toast.deleteFailedMsg', { msg: e.message }) : '删除失败: ' + e.message), 'error'); + showToast((certText('toast.deleteFailedMsg', '删除失败: ' + e.message, { msg: e.message })), 'error'); } } @@ -14657,7 +14698,7 @@ async function generateKey() { try { showToast(typeof t === 'function' ? t('toast.generatingKey') : '正在生成密钥...', 'info'); - await api.keyGenerate(id, type, comment, exportable, alias, hidden); + requireApiSuccess(await api.keyGenerate(id, type, comment, exportable, alias, hidden), 'keyGenerate'); hideGenerateKeyModal(); showToast(typeof t === 'function' ? t('toast.keyGenerated', { name: alias || id }) : `密钥 "${alias || id}" 生成成功`, 'success'); await refreshSecurityPage(); @@ -14701,22 +14742,36 @@ function formatBytes(bytes) { return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; } -function showToast(message, type = 'info', duration = 3000) { - // 创建 toast 元素 +function confirmAction(message) { + if (!window.i18n?.isReady() || !message || message.includes(i18n.unavailable())) { + showToast(i18n.unavailable(), 'error'); + return false; + } + return window.confirm(message); +} + +let toastTimer = null; +let toastDeadline = 0; +let toastPriority = 0; +function showToast(message, type = 'info', duration = 3000, attempt = null) { + if (attempt && !attempt.isCurrent()) return; let toast = document.getElementById('toast'); if (!toast) { toast = document.createElement('div'); toast.id = 'toast'; document.body.appendChild(toast); } - - // 支持多行文本(将 \n 转为
    ) - toast.innerHTML = message.replace(/\n/g, '
    '); + const priority = type === 'error' ? 2 : type === 'warning' ? 1 : 0; + // A routine success must not erase an active long warning. + if (!attempt && Date.now() < toastDeadline && toastPriority > priority && toastDeadline - Date.now() > duration) return; + clearTimeout(toastTimer); + toast.textContent = String(message ?? ''); + toast.style.whiteSpace = 'pre-wrap'; + toast.setAttribute('role', priority ? 'alert' : 'status'); toast.className = `toast toast-${type} show`; - - setTimeout(() => { - toast.classList.remove('show'); - }, duration); + toastPriority = priority; + toastDeadline = Date.now() + duration; + toastTimer = setTimeout(() => { toast.classList.remove('show'); toastDeadline = 0; }, duration); } // ========================================================================= @@ -14724,10 +14779,8 @@ function showToast(message, type = 'info', duration = 3000) { // ========================================================================= async function loadTerminalPage() { + const pageCurrent = capturePageValidity(); // 取消系统页面的订阅 - if (subscriptionManager) { - subscriptionManager.unsubscribe('system.dashboard'); - } // 清理之前的终端实例 if (webTerminal) { @@ -14984,16 +15037,20 @@ async function loadTerminalPage() { // 初始化终端(标签页可见时才连接,避免后台标签抢占当前会话导致 session_closed) webTerminal = new WebTerminal('terminal-container'); - const ok = await webTerminal.init(); + const terminal = webTerminal; + const ok = await terminal.init(); + if (!pageCurrent()) return; if (ok) { function doConnect() { + if (!pageCurrent()) return; if (document.visibilityState === 'visible') { - webTerminal.connect(); + terminal.connect(); } else { document.addEventListener('visibilitychange', function handler() { + if (!pageCurrent()) { document.removeEventListener('visibilitychange', handler); return; } if (document.visibilityState === 'visible') { document.removeEventListener('visibilitychange', handler); - webTerminal.connect(); + terminal.connect(); } }); } @@ -15089,10 +15146,10 @@ function updateModalWsStatus(connected) { if (statusEl) { if (connected) { statusEl.className = 'ws-status connected'; - statusEl.title = 'WebSocket 已连接 - 实时日志'; + statusEl.title = t('promptRepair.logConnected'); } else { statusEl.className = 'ws-status connecting'; - statusEl.title = 'WebSocket 连接中...'; + statusEl.title = t('promptRepair.logDisconnected'); } } } @@ -15427,12 +15484,10 @@ document.addEventListener('DOMContentLoaded', function() { // ========================================================================= async function loadOtaPage() { + const pageCurrent = capturePageValidity(); clearInterval(refreshInterval); // 取消系统页面的订阅 - if (subscriptionManager) { - subscriptionManager.unsubscribe('system.dashboard'); - } const content = document.getElementById('page-content'); content.innerHTML = ` @@ -15892,24 +15947,28 @@ async function loadOtaPage() { // 加载数据 await loadOtaData(); + if (!pageCurrent()) return; // 设置定时刷新进度 refreshInterval = setInterval(refreshOtaProgress, 1000); } async function loadOtaData() { + const pageCurrent = capturePageValidity(); try { // 1. 加载 OTA 服务器地址 const serverResult = await api.call('ota.server.get'); + if (!pageCurrent()) return; if (serverResult?.code === 0 && serverResult.data?.url) { document.getElementById('ota-server-input').value = serverResult.data.url; } // 2. 加载版本信息 const versionResult = await api.call('ota.version'); + if (!pageCurrent()) return; if (versionResult?.code === 0 && versionResult.data) { const v = versionResult.data; - document.getElementById('ota-current-version').textContent = v.version || '未知'; + document.getElementById('ota-current-version').textContent = v.version || t('common.unknown'); document.getElementById('ota-version-meta').textContent = `${v.project || 'TianshanOS'} · ${v.compile_date || ''} ${v.compile_time || ''} · IDF ${v.idf_version || ''}`; currentFirmwareVersion = v; @@ -15917,14 +15976,17 @@ async function loadOtaData() { // 3. 加载分区信息 const partResult = await api.call('ota.partitions'); + if (!pageCurrent()) return; if (partResult?.code === 0 && partResult.data) { displayPartitionsCompact(partResult.data); } // 4. 检查当前升级状态 await refreshOtaProgress(); + if (!pageCurrent()) return; } catch (error) { + if (!pageCurrent()) return; console.error('Failed to load OTA data:', error); } } @@ -15967,7 +16029,7 @@ function displayPartitionsCompact(data) { ${p.label} ${p.is_bootable ? t('ota.partitionBootable') : t('ota.partitionIdle')} -
    ${hasVersion ? p.version : (p.is_bootable ? '上一版本' : '无固件')}
    +
    ${hasVersion ? p.version : (p.is_bootable ? t('otaPage.prevVersion') : t('otaPage.noFirmware'))}
    0x${p.address.toString(16).toUpperCase().padStart(8,'0')} · ${formatSize(p.size)}
    @@ -15981,7 +16043,7 @@ function displayPartitionsCompact(data) { ` : `
    - ${p.is_bootable ? '此分区固件无法回滚(可能已损坏)' : '此分区为空,升级后将写入新固件'} + ${p.is_bootable ? t('otaPage.cannotRollback') : t('otaPage.partitionEmpty')}
    `} @@ -15993,7 +16055,9 @@ function displayPartitionsCompact(data) { } async function refreshOtaInfo() { + const pageCurrent = capturePageValidity(); await loadOtaData(); + if (!pageCurrent()) return; } // OTA 两步升级状态 @@ -16012,7 +16076,7 @@ function inferSdcardWwwPath(source) { async function resolveSdcardOtaPaths(input, includeWww) { const source = input.trim(); if (!source) { - throw new Error('请输入文件或目录路径'); + throw new Error(t('promptRepair.enterOtaPath')); } if (source.match(/\.bin$/i)) { @@ -16028,14 +16092,14 @@ async function resolveSdcardOtaPaths(input, includeWww) { const firmwareInfo = await api.storageInfo(source); if (firmwareInfo.code !== 0 || firmwareInfo.data?.type !== 'file') { - throw new Error(`未找到固件文件: ${source}`); + throw new Error(t('promptRepair.firmwareMissing', {path: source})); } const wwwPath = inferSdcardWwwPath(source); if (includeWww) { const wwwInfo = await api.storageInfo(wwwPath); if (wwwInfo.code !== 0 || wwwInfo.data?.type !== 'file') { - throw new Error(`未找到 WebUI 文件: ${wwwPath}`); + throw new Error(t('promptRepair.wwwMissing', {path: wwwPath})); } } @@ -16045,7 +16109,7 @@ async function resolveSdcardOtaPaths(input, includeWww) { const dir = source.replace(/\/+$/, '') || '/sdcard'; const list = await api.storageList(dir); if (list.code !== 0 || !Array.isArray(list.data?.entries)) { - throw new Error(`无法读取目录: ${dir}`); + throw new Error(t('promptRepair.directoryUnreadable', {path: dir})); } const files = list.data.entries.filter(entry => entry.type === 'file'); @@ -16054,14 +16118,14 @@ async function resolveSdcardOtaPaths(input, includeWww) { files.find(entry => entry.name.toLowerCase().endsWith('.bin') && entry.name.toLowerCase() !== 'www.bin'); if (!firmware) { - throw new Error(`目录中未找到固件 .bin: ${dir}`); + throw new Error(t('promptRepair.firmwareDirMissing', {path: dir})); } let wwwPath = ''; if (includeWww) { const www = files.find(entry => entry.name.toLowerCase() === 'www.bin'); if (!www) { - throw new Error(`目录中未找到 WebUI 文件: ${dir}/www.bin`); + throw new Error(t('promptRepair.wwwDirMissing', {path: dir})); } wwwPath = `${dir}/${www.name}`; } @@ -16070,13 +16134,16 @@ async function resolveSdcardOtaPaths(input, includeWww) { } async function refreshOtaProgress() { + const pageCurrent = capturePageValidity(); try { // 根据当前步骤获取不同的进度 let result; if (otaStep === 'www') { result = await api.call('ota.www.progress'); + if (!pageCurrent()) return; } else { result = await api.call('ota.progress'); + if (!pageCurrent()) return; } if (result.code === 0 && result.data) { @@ -16089,14 +16156,14 @@ async function refreshOtaProgress() { // 更新状态文本 const stateMap = { - 'idle': '空闲', - 'checking': '检查更新中...', - 'downloading': otaStep === 'www' ? '下载 WebUI...' : '下载固件...', - 'verifying': '验证中...', - 'writing': otaStep === 'www' ? '写入 WebUI...' : '写入闪存...', - 'pending_reboot': '等待重启', - 'completed': otaStep === 'www' ? 'WebUI 完成' : '固件完成', - 'error': '错误' + 'idle': t('status.idle'), + 'checking': t('otaPage.stateChecking'), + 'downloading': otaStep === 'www' ? t('otaPage.downloadingWebUI') : t('otaPage.downloadingFirmware'), + 'verifying': t('otaPage.stateVerifying'), + 'writing': otaStep === 'www' ? t('otaPage.writingWebUI') : t('otaPage.writingFlash'), + 'pending_reboot': t('otaPage.statePendingReboot'), + 'completed': otaStep === 'www' ? t('otaPage.completedWebUI') : t('otaPage.completedFirmware'), + 'error': t('common.error') }; const stateEl = document.getElementById('ota-state-text'); @@ -16106,7 +16173,7 @@ async function refreshOtaProgress() { if (!stateEl || !progressSection) return; // 显示当前步骤 - const stepText = otaStep === 'www' ? '[2/2] WebUI ' : (wwwOtaEnabled ? '[1/2] 固件 ' : ''); + const stepText = otaStep === 'www' ? '[2/2] WebUI ' : (wwwOtaEnabled ? t('promptRepair.firmwareStep') : ''); stateEl.textContent = stepText + (stateMap[state] || state); if (state !== 'idle') { @@ -16130,8 +16197,9 @@ async function refreshOtaProgress() { // 处理 App OTA 完成 - 开始 WWW OTA if (otaStep === 'app' && (state === 'pending_reboot' || state === 'completed') && wwwOtaEnabled) { - stateEl.textContent = typeof t === 'function' ? t('otaPage.firmwareUpgradeComplete') : '固件升级完成,准备升级 WebUI...'; + stateEl.textContent = typeof t === 'function' ? t('ui.firmwareUpgradeComplete') : '固件升级完成,准备升级 WebUI...'; await startWwwOta(); + if (!pageCurrent()) return; return; } @@ -16143,19 +16211,21 @@ async function refreshOtaProgress() { otaStep = 'idle'; // 显示重启倒计时 - stateEl.textContent = typeof t === 'function' ? t('otaPage.allUpgradeComplete') : '全部升级完成'; + stateEl.textContent = typeof t === 'function' ? t('ui.allUpgradeComplete') : '全部升级完成'; document.getElementById('ota-message').innerHTML = `
    -

    固件和 WebUI 升级完成,设备正在重启...

    -

    正在触发重启...

    +

    ${t('otaPage.upgradeCompleteRebooting')}

    +

    ${t('otaPage.triggeringReboot')}

    `; // 触发设备重启 try { - await api.call('system.reboot', { delay: 1 }); + requireApiSuccess(await api.call('system.reboot', { delay: 1 }), 'call'); + if (!pageCurrent()) return; } catch (e) { - console.log('Reboot triggered (connection may have closed)'); + if (!pageCurrent()) return; + showToast(t('promptRepair.rebootUnknown'), 'warning', 10000); } // 开始检测设备重启 @@ -16174,6 +16244,7 @@ async function refreshOtaProgress() { } } } catch (error) { + if (!pageCurrent()) return; console.error('Failed to get OTA status:', error); } } @@ -16218,7 +16289,7 @@ async function startWwwOta() { otaStep = 'www'; - document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.step2Webui') : '[2/2] 开始升级 WebUI...'; + document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('ui.step2Webui') : '[2/2] 开始升级 WebUI...'; document.getElementById('ota-progress-bar').style.width = '0%'; document.getElementById('ota-progress-percent').textContent = '0%'; document.getElementById('ota-message').textContent = wwwSource; @@ -16247,9 +16318,9 @@ async function startWwwOta() { document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.stateError') : '错误'; document.getElementById('ota-message').innerHTML = `
    -

    固件已写入,但 WebUI 升级失败,已停止重启。

    -

    ${result.message || '请确认 www.bin 与固件在同一目录后重试'}

    - +

    ${t('promptRepair.wwwPartial')}

    +

    ${escapeHtml(result.message || t('promptRepair.wwwSibling'))}

    +
    `; document.getElementById('ota-abort-btn').style.display = 'none'; @@ -16266,7 +16337,7 @@ async function startWwwOta() { console.error('Failed to start WWW OTA:', error); otaStep = 'idle'; document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.stateError') : '错误'; - document.getElementById('ota-message').textContent = error.message || 'WebUI 升级启动失败'; + document.getElementById('ota-message').textContent = error.message || t('toast.webuiUpgradeStartFailed'); document.getElementById('ota-abort-btn').style.display = 'none'; } } @@ -16297,12 +16368,12 @@ function startRebootDetection() { clearInterval(rebootCheckInterval); rebootCheckInterval = null; - const newVersion = result.data?.version || '未知'; + const newVersion = result.data?.version || t('common.unknown'); if (countdownEl) { countdownEl.innerHTML = ` - 设备已恢复! -
    当前版本: ${newVersion} + ${t('otaPage.deviceRecovered')} +
    ${t('ota.currentVersion')}: ${newVersion} `; } @@ -16386,13 +16457,13 @@ async function otaFromUrl() { showToast(typeof t === 'function' ? t('toast.upgradeStartFailedMsg', { msg: result.message }) : '启动升级失败: ' + result.message, 'error'); // 显示错误状态 document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.stateError') : '错误'; - document.getElementById('ota-message').textContent = result.message || '启动失败'; + document.getElementById('ota-message').textContent = result.message || t('promptRepair.startFailed'); document.getElementById('ota-abort-btn').style.display = 'none'; } } catch (error) { showToast(typeof t === 'function' ? t('toast.upgradeStartFailedMsg', { msg: error.message }) : '启动升级失败: ' + error.message, 'error'); document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.stateError') : '错误'; - document.getElementById('ota-message').textContent = error.message || '网络错误'; + document.getElementById('ota-message').textContent = error.message || t('login.networkError'); document.getElementById('ota-abort-btn').style.display = 'none'; } } @@ -16410,7 +16481,7 @@ async function otaFromFile() { try { paths = await resolveSdcardOtaPaths(inputPath, includeWww); } catch (error) { - showToast(error.message || '无法解析 SD 卡升级文件', 'error'); + showToast(error.message || t('promptRepair.otaPathFailed'), 'error'); return; } @@ -16451,19 +16522,19 @@ async function otaFromFile() { } else { showToast(typeof t === 'function' ? t('toast.upgradeStartFailedMsg', { msg: result.message }) : '启动升级失败: ' + result.message, 'error'); document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.stateError') : '错误'; - document.getElementById('ota-message').textContent = result.message || '启动失败'; + document.getElementById('ota-message').textContent = result.message || t('promptRepair.startFailed'); document.getElementById('ota-abort-btn').style.display = 'none'; } } catch (error) { showToast(typeof t === 'function' ? t('toast.upgradeStartFailedMsg', { msg: error.message }) : '启动升级失败: ' + error.message, 'error'); document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.stateError') : '错误'; - document.getElementById('ota-message').textContent = error.message || '网络错误'; + document.getElementById('ota-message').textContent = error.message || t('login.networkError'); document.getElementById('ota-abort-btn').style.display = 'none'; } } async function validateOta() { - if (!confirm(typeof t === 'function' ? t('automation.confirmMarkFirmwareValid') : '确认将当前固件标记为有效?\n这将取消自动回滚保护。')) { + if (!confirmAction(typeof t === 'function' ? t('ui.confirmMarkFirmwareValid') : '确认将当前固件标记为有效?\n这将取消自动回滚保护。')) { return; } @@ -16482,7 +16553,7 @@ async function validateOta() { } function confirmRollback() { - if (!confirm(typeof t === 'function' ? t('automation.confirmRollback') : '确认回滚到上一版本固件?\n\n系统将立即重启并加载上一个分区的固件。\n请确保上一版本固件可用!')) { + if (!confirmAction(typeof t === 'function' ? t('ui.confirmRollback') : '确认回滚到上一版本固件?\n\n系统将立即重启并加载上一个分区的固件。\n请确保上一版本固件可用!')) { return; } @@ -16506,7 +16577,7 @@ async function rollbackOta() { } async function abortOta() { - if (!confirm(typeof t === 'function' ? t('automation.confirmAbortUpgrade') : '确认中止当前升级?')) { + if (!confirmAction(typeof t === 'function' ? t('ui.confirmAbortUpgrade') : '确认中止当前升级?')) { return; } @@ -16663,7 +16734,7 @@ async function checkForUpdates() { const statusDiv = document.getElementById('ota-update-status'); statusDiv.style.display = 'block'; statusDiv.className = 'ota-update-status'; - statusDiv.innerHTML = '

    正在检查更新...

    '; + statusDiv.innerHTML = ("

    " + t('otaPage.checking') + "

    "); try { // 尝试通过设备测试连接(如果 API 存在) @@ -16675,13 +16746,13 @@ async function checkForUpdates() { console.log('Device connection test result:', testData); if (!testData.dns_ok) { - throw new Error(`设备 DNS 解析失败: ${testData.host}`); + throw new Error(t('promptRepair.dnsFailed', {host: testData.host})); } if (!testData.tcp_ok) { - throw new Error(`设备 TCP 连接失败: ${testData.resolved_ip}:${testData.port}`); + throw new Error(t('promptRepair.tcpFailed', {host: testData.resolved_ip, port: testData.port})); } if (!testData.http_ok) { - throw new Error(`设备 HTTP 请求失败: ${testData.http_error || '无响应'}`); + throw new Error(t('promptRepair.httpFailed', {message: testData.http_error || t('common.noResponse')})); } console.log(`Device connectivity OK: DNS=${testData.dns_time_ms}ms, TCP=${testData.tcp_time_ms}ms, HTTP=${testData.http_time_ms}ms`); } @@ -16696,7 +16767,7 @@ async function checkForUpdates() { const response = await fetch(versionUrl); if (!response.ok) { - throw new Error(`服务器响应错误: ${response.status}`); + throw new Error(t('promptRepair.httpStatus', {status: response.status})); } const serverInfo = await response.json(); @@ -16752,7 +16823,7 @@ async function checkForUpdates() { `; @@ -16767,7 +16838,7 @@ async function checkForUpdates() { `; @@ -16787,7 +16858,7 @@ async function checkForUpdates() { statusDiv.innerHTML = `
    ${typeof t === 'function' ? t('otaPage.checkUpdateFailed') : '检查更新失败'} -
    ${error.message}
    +
    ${escapeHtml(error.message)}
    `; } @@ -16803,10 +16874,10 @@ async function upgradeFromServer() { // 立即显示进度区域,给用户即时反馈 const progressSection = document.getElementById('ota-progress-section'); progressSection.style.display = 'block'; - document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('otaPage.preparingUpgrade') : 'Preparing upgrade...'; + document.getElementById('ota-state-text').textContent = typeof t === 'function' ? t('ui.preparingUpgrade') : 'Preparing upgrade...'; document.getElementById('ota-progress-bar').style.width = '0%'; document.getElementById('ota-progress-percent').textContent = ''; - document.getElementById('ota-progress-size').textContent = typeof t === 'function' ? t('otaPage.initializing') : '正在初始化...'; + document.getElementById('ota-progress-size').textContent = typeof t === 'function' ? t('ui.initializing') : '正在初始化...'; document.getElementById('ota-message').textContent = serverUrl; document.getElementById('ota-abort-btn').style.display = 'none'; @@ -16851,12 +16922,12 @@ async function upgradeViaProxy(serverUrl) { try { // ===== 第一步:浏览器下载固件 ===== - updateStep(1, '下载固件中...'); + updateStep(1, t('promptRepair.firmwareDownloading')); const firmwareUrl = serverUrl.replace(/\/$/, '') + '/firmware'; - messageEl.textContent = typeof t === 'function' ? t('otaPage.downloadingFromServer') : '从 OTA 服务器下载'; + messageEl.textContent = typeof t === 'function' ? t('ui.downloadingFromServer') : '从 OTA 服务器下载'; progressBar.style.width = '0%'; progressPercent.textContent = '0%'; - progressSize.textContent = typeof t === 'function' ? t('otaPage.connectingServer') : '正在连接服务器...'; + progressSize.textContent = typeof t === 'function' ? t('ui.connectingServer') : '正在连接服务器...'; abortBtn.style.display = 'none'; // 浏览器下载阶段暂不支持中止 console.log('Proxy OTA: Downloading firmware from', firmwareUrl); @@ -16873,7 +16944,7 @@ async function upgradeViaProxy(serverUrl) { showToast(typeof t === 'function' ? t('ota.firmwareDownloadComplete', { size: formatSize(firmwareData.byteLength) }) : `固件下载完成 (${formatSize(firmwareData.byteLength)})`, 'success'); // ===== 第二步:上传固件到 ESP32 ===== - updateStep(2, '上传固件到设备...'); + updateStep(2, t('otaPage.uploadingFirmware')); messageEl.textContent = typeof t === 'function' ? t('ui.firmwareSize') + ': ' + formatSize(firmwareData.byteLength) : `固件大小: ${formatSize(firmwareData.byteLength)}`; progressBar.style.width = '0%'; progressPercent.textContent = ''; @@ -16884,7 +16955,7 @@ async function upgradeViaProxy(serverUrl) { const uploadResult = await uploadFirmwareToDevice(firmwareData, false); if (!uploadResult.success) { - throw new Error(uploadResult.error || '上传固件失败'); + throw new Error(uploadResult.error || t('otaPage.uploadFirmwareFailed')); } console.log('Proxy OTA: Firmware uploaded to device'); @@ -16894,9 +16965,9 @@ async function upgradeViaProxy(serverUrl) { // ===== 第三步:处理 WebUI(如果启用)===== if (includeWww) { - updateStep(3, '下载 WebUI...'); + updateStep(3, t('otaPage.downloadingWebUI')); const wwwUrl = serverUrl.replace(/\/$/, '') + '/www.bin'; - messageEl.textContent = typeof t === 'function' ? t('otaPage.downloadingFromServer') : '从 OTA 服务器下载'; + messageEl.textContent = typeof t === 'function' ? t('ui.downloadingFromServer') : '从 OTA 服务器下载'; progressBar.style.width = '0%'; progressPercent.textContent = '0%'; progressSize.textContent = typeof t === 'function' ? t('otaPage.connecting') : '正在连接...'; @@ -16914,16 +16985,16 @@ async function upgradeViaProxy(serverUrl) { showToast(typeof t === 'function' ? t('ota.webuiDownloadComplete', { size: formatSize(wwwData.byteLength) }) : `WebUI 下载完成 (${formatSize(wwwData.byteLength)})`, 'success'); // 上传 www.bin - updateStep(4, '上传 WebUI 到设备...'); + updateStep(4, t('otaPage.uploadingWebUI')); messageEl.textContent = typeof t === 'function' ? t('ui.webuiSize') + ': ' + formatSize(wwwData.byteLength) : `WebUI 大小: ${formatSize(wwwData.byteLength)}`; progressBar.style.width = '0%'; progressPercent.textContent = ''; - progressSize.textContent = typeof t === 'function' ? t('otaPage.writingSpiffs') : '正在写入 SPIFFS...'; + progressSize.textContent = typeof t === 'function' ? t('ui.writingSpiffs') : '正在写入 SPIFFS...'; const wwwResult = await uploadWwwToDevice(wwwData); if (!wwwResult.success) { - throw new Error(wwwResult.error || 'WebUI 上传失败'); + throw new Error(wwwResult.error || t('promptRepair.webUploadFailed')); } console.log('Proxy OTA: WWW uploaded to device'); @@ -16932,19 +17003,19 @@ async function upgradeViaProxy(serverUrl) { progressPercent.textContent = ''; } catch (wwwError) { console.warn('WWW download/upload failed:', wwwError); - throw new Error('WebUI 升级失败: ' + (wwwError.message || wwwError)); + throw new Error(t('promptRepair.webUpgradeFailed') + (wwwError.message || wwwError)); } } // ===== 最终步骤:升级完成,触发重启 ===== - stateEl.textContent = typeof t === 'function' ? t('otaPage.allUpgradeComplete') : '全部升级完成'; + stateEl.textContent = typeof t === 'function' ? t('ui.allUpgradeComplete') : '全部升级完成'; progressBar.style.width = '100%'; progressBar.style.background = 'linear-gradient(90deg, #059669, #10b981)'; progressPercent.textContent = ''; messageEl.innerHTML = `
    -

    固件${includeWww ? '和 WebUI ' : ''}升级完成,设备正在重启...

    -

    正在触发重启...

    +

    ${t('promptRepair.upgradeWritten')}

    +

    ${t('otaPage.triggeringReboot')}

    `; @@ -16952,9 +17023,9 @@ async function upgradeViaProxy(serverUrl) { // 触发设备重启 try { - await api.call('system.reboot', { delay: 1 }); + requireApiSuccess(await api.call('system.reboot', { delay: 1 }), 'call'); } catch (e) { - console.log('Reboot triggered (connection may have closed)'); + showToast(t('promptRepair.rebootUnknown'), 'warning', 10000); } // 检测设备重启 @@ -16962,7 +17033,7 @@ async function upgradeViaProxy(serverUrl) { } catch (error) { console.error('Proxy OTA failed:', error); - stateEl.textContent = typeof t === 'function' ? t('otaPage.upgradeFailed') : '升级失败'; + stateEl.textContent = typeof t === 'function' ? t('ui.upgradeFailed') : '升级失败'; messageEl.textContent = error.message; progressBar.style.width = '0%'; progressPercent.textContent = ''; @@ -16977,7 +17048,7 @@ async function upgradeViaProxy(serverUrl) { async function downloadWithProgress(url, onProgress) { const response = await fetch(url); if (!response.ok) { - throw new Error(`下载失败: HTTP ${response.status}`); + throw new Error(t('promptRepair.downloadHttpStatus', {status: response.status})); } const contentLength = response.headers.get('content-length'); @@ -17030,7 +17101,7 @@ async function uploadFirmwareToDevice(firmwareData, autoReboot = false) { if (response.ok && result.status === 'success') { return { success: true, data: result }; } else { - return { success: false, error: result.message || result.error || '上传失败' }; + return { success: false, error: result.message || result.error || t('files.uploadFailed') }; } } catch (error) { return { success: false, error: error.message }; @@ -17057,7 +17128,7 @@ async function uploadWwwToDevice(wwwData) { if (response.ok && result.status === 'success') { return { success: true, data: result }; } else { - return { success: false, error: result.message || result.error || '上传失败' }; + return { success: false, error: result.message || result.error || t('files.uploadFailed') }; } } catch (error) { return { success: false, error: error.message }; @@ -17100,6 +17171,15 @@ let cachedTasksData = []; // 缓存任务数据用于排序 /** * 渲染任务行 HTML */ +function servicePhaseLabel(phase) { + return ["PLATFORM", "CORE", "HAL", "DRIVER", "NETWORK", "SECURITY", "SERVICE", "UI"].includes(phase) ? t('promptRepair.phase_' + phase) : t('common.unknown'); +} + +function userStateLabel(state) { + const known = ["UNREGISTERED", "REGISTERED", "STARTING", "RUNNING", "STOPPING", "STOPPED", "ERROR", "Running", "Ready", "Blocked", "Suspended", "Deleted"]; + return known.includes(state) ? t('promptRepair.state_' + state) : t('common.unknown'); +} + function renderTaskRows(tasks, formatBytes) { return tasks.map(task => { const hwm = task.stack_hwm || 0; @@ -17123,7 +17203,7 @@ function renderTaskRows(tasks, formatBytes) { ${formatBytes(hwm)} ${usagePct}% ${task.priority} - ${stateIcon} ${task.state} + ${stateIcon} ${userStateLabel(task.state)} ${task.cpu_percent !== undefined ? `${task.cpu_percent}%` : ''} `; @@ -17590,7 +17670,7 @@ async function refreshMemoryDetail() { body.innerHTML = `

    ${typeof t === 'function' ? t('memoryPage.loadFailed') : '获取内存详情失败'}

    -

    ${error.message}

    +

    ${escapeHtml(error.message)}

    `; } @@ -17619,10 +17699,8 @@ window.refreshMemoryDetail = refreshMemoryDetail; * 加载自动化引擎测试页面 */ async function loadAutomationPage() { + const pageCurrent = capturePageValidity(); // 取消之前的订阅 - if (subscriptionManager) { - subscriptionManager.unsubscribe('system.dashboard'); - } stopServiceStatusRefresh(); const content = document.getElementById('page-content'); @@ -17648,7 +17726,7 @@ async function loadAutomationPage() {

    ${t('automation.sources')}

    - +
    @@ -17665,7 +17743,7 @@ async function loadAutomationPage() {

    ${t('automation.rules')}

    - +
    @@ -17682,7 +17760,7 @@ async function loadAutomationPage() {

    ${t('automation.actions')}

    - +
    @@ -17702,17 +17780,20 @@ async function loadAutomationPage() { refreshSources(), refreshActions() ]); + if (!pageCurrent()) return; } /** * 刷新自动化引擎状态 */ async function refreshAutomationStatus() { + const pageCurrent = capturePageValidity(); const container = document.getElementById('automation-status'); if (!container) return; try { const result = await api.call('automation.status'); + if (!pageCurrent()) return; if (result.code === 0 && result.data) { const d = result.data; const stateClass = d.state === 'running' ? 'running' : d.state === 'paused' ? 'paused' : 'stopped'; @@ -17763,6 +17844,7 @@ async function refreshAutomationStatus() { container.innerHTML = '
    ' + (result.message || (typeof t === 'function' ? t('automationPage.getStatusFailed') : '获取状态失败')) + '
    '; } } catch (error) { + if (!pageCurrent()) return; const isNetworkError = error.message.includes('fetch') || error.message.includes('network'); container.innerHTML = '
    ' + (isNetworkError && typeof t === 'function' ? t('automationPage.networkFailed') : error.message) + '
    '; } @@ -17779,11 +17861,11 @@ function formatUptimeSec(seconds) { const m = Math.floor((seconds % 3600) / 60); return t('automationPage.uptimeHrMin', { h, m }); } - if (seconds < 60) return seconds + '秒'; - if (seconds < 3600) return Math.floor(seconds / 60) + '分' + (seconds % 60) + '秒'; + if (seconds < 60) return seconds + t('common.seconds'); + if (seconds < 3600) return Math.floor(seconds / 60) + t('common.minutesShort') + (seconds % 60) + t('common.seconds'); const h = Math.floor(seconds / 3600); const m = Math.floor((seconds % 3600) / 60); - return h + '时' + m + '分'; + return h + t('common.hoursShort') + m + t('common.minutesShort'); } /** @@ -17805,11 +17887,13 @@ async function automationControl(action) { * 刷新规则列表 */ async function refreshRules() { + const pageCurrent = capturePageValidity(); const container = document.getElementById('rules-list'); if (!container) return; try { const result = await api.call('automation.rules.list'); + if (!pageCurrent()) return; if (result.code === 0 && result.data && result.data.rules) { const rules = result.data.rules; if (rules.length === 0) { @@ -17824,12 +17908,12 @@ async function refreshRules() { ID - ${ap('automationPage.ruleNameHeader') || '名称'} - ${ap('automationPage.statusHeader') || '状态'} - ${ap('automationPage.conditionHeader') || '条件'} - ${ap('automationPage.actionHeader') || '动作'} - ${ap('automationPage.triggerHeader') || '触发次数'} - ${ap('automationPage.operationHeader') || '操作'} + ${ap('automationPage.ruleNameHeader') || t('common.name')} + ${ap('automationPage.statusHeader') || t('common.status')} + ${ap('automationPage.conditionHeader') || t('automationPage.conditionHeader')} + ${ap('automationPage.actionHeader') || t('automationPage.actionHeader')} + ${ap('automationPage.triggerHeader') || t('automation.triggerCount')} + ${ap('automationPage.operationHeader') || t('common.actions')} @@ -17871,6 +17955,7 @@ async function refreshRules() { container.innerHTML = '

    ' + (result.message || (typeof t === 'function' ? t('automationPage.getRulesFailed') : '获取规则失败')) + '

    '; } } catch (error) { + if (!pageCurrent()) return; const isNetworkError = error.message.includes('fetch') || error.message.includes('network'); container.innerHTML = '

    ' + (isNetworkError && typeof t === 'function' ? t('automationPage.networkFailed') : error.message) + '

    '; } @@ -17882,7 +17967,7 @@ async function refreshRules() { async function toggleRule(id, enable) { try { const action = enable ? 'automation.rules.enable' : 'automation.rules.disable'; - const result = await api.call(action, { id }); + const result = await ruleWriteWithRevision(action, id); showToast(typeof t === 'function' ? t('toast.ruleToggled', { id, state: enable ? t('status.enabled') : t('status.disabled') }) + ': ' + (result.message || 'OK') : `规则 ${id} ${enable ? '启用' : '禁用'}: ${result.message || 'OK'}`, result.code === 0 ? 'success' : 'error'); if (result.code === 0) { await refreshRules(); @@ -17908,11 +17993,13 @@ async function triggerRule(id) { * 刷新数据源列表 */ async function refreshSources() { + const pageCurrent = capturePageValidity(); const container = document.getElementById('sources-list'); if (!container) return; try { const result = await api.call('automation.sources.list'); + if (!pageCurrent()) return; if (result.code === 0 && result.data && result.data.sources) { const sources = result.data.sources; if (sources.length === 0) { @@ -17958,6 +18045,7 @@ async function refreshSources() { container.innerHTML = '

    ' + (result.message || (typeof t === 'function' ? t('automationPage.getSourcesFailed') : '获取数据源失败')) + '

    '; } } catch (error) { + if (!pageCurrent()) return; const isNetworkError = error.message.includes('fetch') || error.message.includes('network'); container.innerHTML = '

    ' + (isNetworkError && typeof t === 'function' ? t('automationPage.networkFailed') : error.message) + '

    '; } @@ -17970,6 +18058,7 @@ let allVariables = []; * 刷新变量列表 */ async function refreshVariables() { + const pageCurrent = capturePageValidity(); const container = document.getElementById('variables-list'); const countBadge = document.getElementById('variables-count'); if (!container) return; @@ -17978,15 +18067,17 @@ async function refreshVariables() { try { const result = await api.call('automation.variables.list', { include_meta: true }); + if (!pageCurrent()) return; if (result.code === 0 && result.data && result.data.variables) { allVariables = result.data.variables; if (countBadge) countBadge.textContent = allVariables.length; renderVariables(allVariables); } else { - container.innerHTML = `

    ${result.message || (typeof t === 'function' ? t('sshPage.getVarFailed') : '获取变量失败')}

    `; + container.innerHTML = `

    ${escapeHtml(result.message || (typeof t === 'function' ? t('sshPage.getVarFailed') : '获取变量失败'))}

    `; } } catch (error) { - container.innerHTML = `

    ${error.message}

    `; + if (!pageCurrent()) return; + container.innerHTML = `

    ${escapeHtml(error.message)}

    `; } } @@ -18032,7 +18123,7 @@ function renderVariables(variables) {
    ${source} - ${vars.length} 个变量 + ${t('promptRepair.variableCount', {count: vars.length})}
    @@ -18140,11 +18231,13 @@ function escapeHtml(text) { * 刷新动作模板列表 */ async function refreshActions() { + const pageCurrent = capturePageValidity(); const container = document.getElementById('actions-list'); if (!container) return; try { const result = await api.call('automation.actions.list', {}); + if (!pageCurrent()) return; const actions = result.data?.templates || []; if (actions.length === 0) { @@ -18185,6 +18278,7 @@ async function refreshActions() { `; } } catch (error) { + if (!pageCurrent()) return; container.innerHTML = '

    ' + (typeof t === 'function' ? t('filePage.loadFailed') : '加载失败') + ': ' + error.message + '

    '; } } @@ -18198,9 +18292,9 @@ function getActionTypeLabel(type) { 'ssh_cmd': 'SSH', 'gpio': 'GPIO', 'webhook': 'Webhook', - 'log': '日志', - 'set_var': '变量', - 'device_ctrl': '设备' + 'log': t('common.log'), + 'set_var': t('common.variable'), + 'device_ctrl': t('common.devices') }; return labels[type] || type; } @@ -18323,7 +18417,7 @@ function showAddActionModal() { `; @@ -18358,14 +18452,14 @@ function updateActionTypeFields() { ${typeof t === 'function' ? t('automation.cliConfig') : 'CLI 命令配置'}
    - + ${typeof t === 'function' ? t('automation.cliCmdHint') : '支持所有控制台命令: gpio, device, fan, led, net 等'}
    ${typeof t === 'function' ? t('automation.quickCommands') : '快捷命令:'} - + @@ -18396,16 +18490,16 @@ function updateActionTypeFields() { ${typeof t === 'function' ? t('automation.sshCmdConfig') : 'SSH 命令配置'}
    - + ${typeof t === 'function' ? t('automation.sshCmdHint') : '选择已在 SSH 管理页面配置的命令'}
    - + ${typeof t === 'function' ? t('automation.selectLedDeviceHint') : '选择要控制的 LED 设备'}
    @@ -18462,11 +18556,11 @@ function updateActionTypeFields() {
    - ${typeof t === 'function' ? t('automation.logConfig') : '日志配置'} + ${typeof t === 'function' ? t('automationPage.logConfig') : '日志配置'}
    - + - ${typeof t === 'function' ? t('automation.logMsgHint') : '支持变量: ${变量名}'} + + + ${typeof t === 'function' ? t('automationPage.logMsgHint') : '支持变量: ${变量名}'}
    `, @@ -18486,16 +18580,16 @@ function updateActionTypeFields() {
    - ${typeof t === 'function' ? t('automation.varConfig') : '变量配置'} + ${typeof t === 'function' ? t('automationPage.varConfig') : '变量配置'}
    - - + +
    - - - 示例: true, 123, \${other_var} + + + ${t('promptRepair.valueExample')}
    `, @@ -18503,7 +18597,7 @@ function updateActionTypeFields() {
    - Webhook 配置 + ${t('promptRepair.webhookConfig')}
    @@ -18511,7 +18605,7 @@ function updateActionTypeFields() {
    - + - JSON 格式,支持变量 + ${t('automationPage.requestBodyHint')}
    ` @@ -18758,7 +18852,7 @@ async function loadSshHostsForAction() { if (!select) return; const result = await api.call('ssh.hosts.list', {}); - select.innerHTML = ''; + select.innerHTML = (""); if (result.code === 0 && result.data?.hosts) { result.data.hosts.forEach(host => { @@ -18771,7 +18865,7 @@ async function loadSshHostsForAction() { if (select.options.length === 1) { // 没有配置主机,提示用户 - select.innerHTML = ''; + select.innerHTML = (""); } } catch (e) { console.error('加载 SSH 主机列表失败:', e); @@ -18791,7 +18885,7 @@ async function loadSshCommandsForAction() { if (!select) return; const result = await api.call('ssh.commands.list', {}); - select.innerHTML = ''; + select.innerHTML = (""); if (result.code === 0 && result.data?.commands) { result.data.commands.forEach(cmd => { @@ -18834,7 +18928,7 @@ async function updateSshCmdRefPreview() { document.getElementById('preview-cmd').textContent = cmd.command || '-'; // varName 字段只在配置了变量名时才存在 const varName = cmd.varName || cmd.var_name || ''; - document.getElementById('preview-var').textContent = varName || '(未配置)'; + document.getElementById('preview-var').textContent = varName || t('ui.configNotSet'); preview.style.display = 'block'; } else { preview.style.display = 'none'; @@ -18855,7 +18949,7 @@ async function loadLedDevicesForAction() { if (!select) return; const result = await api.ledList(); - select.innerHTML = ''; + select.innerHTML = (""); if (result.data?.devices) { result.data.devices.forEach(dev => { @@ -18953,8 +19047,8 @@ function updateActionLedTypeFields() {
    - - + +
    `; @@ -18998,24 +19092,24 @@ function updateActionLedTypeFields() { break; case 'off': - html = `
    ${typeof t === 'function' ? t('automation.ledOffHint') : '关闭 LED 设备,无需额外参数'}
    `; + html = `
    ${typeof t === 'function' ? t('automationPage.ledOffHint') : '关闭 LED 设备,无需额外参数'}
    `; break; case 'filter_stop': - html = `
    ${typeof t === 'function' ? t('automation.filterStopHint') : '停止当前运行的滤镜效果,无需额外参数'}
    `; + html = `
    ${typeof t === 'function' ? t('automationPage.filterStopHint') : '停止当前运行的滤镜效果,无需额外参数'}
    `; break; case 'text_stop': - html = `
    ${typeof t === 'function' ? t('automation.textStopHint') : '停止当前运行的文本覆盖层,无需额外参数'}
    `; + html = `
    ${typeof t === 'function' ? t('automationPage.textStopHint') : '停止当前运行的文本覆盖层,无需额外参数'}
    `; break; case 'text': html = `
    - +
    - - + +
    @@ -19026,7 +19120,7 @@ function updateActionLedTypeFields() {
    - +
    @@ -19040,13 +19134,13 @@ function updateActionLedTypeFields() {
    - +
    @@ -19060,8 +19154,8 @@ function updateActionLedTypeFields() {
    - - + +
    @@ -19070,8 +19164,8 @@ function updateActionLedTypeFields() {
    - - + +
    `; @@ -19082,16 +19176,16 @@ function updateActionLedTypeFields() { case 'image': html = `
    - +
    - + - +
    - ${typeof t === 'function' ? t('automation.imagePathHint') : '支持 PNG、JPG、BMP、GIF 格式,路径支持变量'} + ${typeof t === 'function' ? t('automationPage.imagePathHint') : '支持 PNG、JPG、BMP、GIF 格式,路径支持变量'}
    - +
    `; break; @@ -19099,15 +19193,15 @@ function updateActionLedTypeFields() { case 'qrcode': html = `
    - +
    - - + +
    - +
    - +
    - +
    - + - +
    `; @@ -19134,22 +19228,22 @@ function updateActionLedTypeFields() { case 'filter': html = `
    - +
    @@ -19227,8 +19321,8 @@ async function showImageSelectModal(title, onSelect) { @@ -19288,8 +19382,8 @@ async function showImageSelectModal(title, onSelect) { console.error('加载图像列表失败:', e); document.getElementById('image-select-loading').innerHTML = `
    -

    加载失败: ${e.message}

    - +

    ${t('common.loadFailed')}: ${escapeHtml(e.message)}

    +
    `; } @@ -19322,7 +19416,7 @@ function selectImageItem(el, path) { * 浏览图像文件 (动作模板用) */ async function browseActionImages() { - showImageSelectModal('选择图像文件', (path) => { + showImageSelectModal(t('dataSource.selectImageFile'), (path) => { document.getElementById('action-led-image-path').value = path; }); } @@ -19331,7 +19425,7 @@ async function browseActionImages() { * 浏览 QR 背景图 (动作模板用) */ async function browseActionQrBg() { - showImageSelectModal('选择背景图', (path) => { + showImageSelectModal(t('dataSource.selectBgImage'), (path) => { document.getElementById('action-led-qr-bg').value = path; }); } @@ -19366,8 +19460,8 @@ async function showVariableSelectModal(targetInputId, mode = 'insert') { @@ -19456,8 +19550,8 @@ async function showVariableSelectModal(targetInputId, mode = 'insert') { console.error('加载变量列表失败:', e); document.getElementById('variable-select-loading').innerHTML = `
    -

    加载失败: ${e.message}

    - +

    ${t('common.loadFailed')}: ${escapeHtml(e.message)}

    +
    `; } @@ -19620,7 +19714,7 @@ function updateActionFilterParams() { const config = filterConfig[filter]; if (!config || !config.params || config.params.length === 0) { - paramsContainer.innerHTML = '
    此滤镜无额外参数
    '; + paramsContainer.innerHTML = ("
    " + t('automationPage.noExtraParams') + "
    "); return; } @@ -19656,9 +19750,9 @@ async function testAction(id) { console.log('Action execute result:', result); if (result.code === 0) { - let msg = result.message || '执行成功'; + let msg = t('toast.actionSuccess'); if (result.data?.output) { - msg += ` - 输出: ${result.data.output.substring(0, 100)}`; + msg += '\n' + t('promptRepair.outputPreview', {output: result.data.output.substring(0, 100)}); } showToast(msg, 'success'); } else { @@ -19884,11 +19978,11 @@ async function editAction(id) { // 更改模态框标题和按钮 const modalTitle = document.querySelector('#action-modal .modal-header h3'); - if (modalTitle) modalTitle.textContent = typeof t === 'function' ? t('otaPage.editActionTemplate') : '编辑动作模板'; + if (modalTitle) modalTitle.textContent = typeof t === 'function' ? t('ui.editActionTemplate') : '编辑动作模板'; const submitBtn = document.querySelector('#action-modal button[onclick="submitAction()"]'); if (submitBtn) { - submitBtn.textContent = typeof t === 'function' ? t('otaPage.updateAction') : '更新'; + submitBtn.textContent = typeof t === 'function' ? t('ui.updateAction') : '更新'; submitBtn.setAttribute('onclick', `updateAction('${tpl.id}')`); } @@ -19928,7 +20022,7 @@ async function updateAction(originalId) { * 删除动作 */ async function deleteAction(id) { - if (!confirm(typeof t === 'function' ? t('ui.confirmDeleteAction', { id }) : `确定要删除动作模板 "${id}" 吗?`)) return; + if (!confirmAction(typeof t === 'function' ? t('ui.confirmDeleteAction', { id }) : `确定要删除动作模板 "${id}" 吗?`)) return; try { const result = await api.call('automation.actions.delete', { id }); @@ -19947,7 +20041,7 @@ async function deleteAction(id) { async function toggleSource(id, enable) { try { const action = enable ? 'automation.sources.enable' : 'automation.sources.disable'; - const result = await api.call(action, { id }); + const result = await ruleWriteWithRevision(action, id); showToast(typeof t === 'function' ? t('toast.sourceToggled', { id, state: enable ? t('status.enabled') : t('status.disabled') }) + ': ' + (result.message || 'OK') : `数据源 ${id} ${enable ? '启用' : '禁用'}: ${result.message || 'OK'}`, result.code === 0 ? 'success' : 'error'); if (result.code === 0) { await refreshSources(); @@ -19961,7 +20055,7 @@ async function toggleSource(id, enable) { * 删除数据源 */ async function deleteSource(id) { - if (!confirm(typeof t === 'function' ? t('ui.confirmDeleteSource', { id }) : `确定要删除数据源 "${id}" 吗?此操作不可撤销。`)) { + if (!confirmAction(typeof t === 'function' ? t('ui.confirmDeleteSource', { id }) : `确定要删除数据源 "${id}" 吗?此操作不可撤销。`)) { return; } @@ -20028,10 +20122,10 @@ async function showSourceVariables(sourceId) {
    `; } else { - body.innerHTML = `

    ${result.message || (typeof t === 'function' ? t('sshPage.getVarFailed') : '获取变量失败')}

    `; + body.innerHTML = `

    ${escapeHtml(result.message || (typeof t === 'function' ? t('sshPage.getVarFailed') : '获取变量失败'))}

    `; } } catch (error) { - body.innerHTML = `

    ${error.message}

    `; + body.innerHTML = `

    ${escapeHtml(error.message)}

    `; } } @@ -20108,13 +20202,13 @@ async function saveShutdownSettings() { // 验证 if (config.low_threshold >= config.recovery_threshold) { - errorDiv.textContent = typeof t === 'function' ? t('otaPage.lowVoltageError') : '低电压阈值必须小于恢复电压阈值'; + errorDiv.textContent = typeof t === 'function' ? t('ui.lowVoltageError') : '低电压阈值必须小于恢复电压阈值'; errorDiv.classList.remove('hidden'); return; } if (config.shutdown_delay < 10 || config.shutdown_delay > 600) { - errorDiv.textContent = typeof t === 'function' ? t('otaPage.shutdownDelayError') : '关机倒计时必须在 10-600 秒之间'; + errorDiv.textContent = typeof t === 'function' ? t('ui.shutdownDelayError') : '关机倒计时必须在 10-600 秒之间'; errorDiv.classList.remove('hidden'); return; } @@ -20125,7 +20219,7 @@ async function saveShutdownSettings() { showToast(typeof t === 'function' ? t('toast.shutdownSettingsSaved') : '关机设置已保存', 'success'); closeShutdownSettingsModal(); } else { - errorDiv.textContent = result.message || '保存失败'; + errorDiv.textContent = result.message || t('errors.saveFailed'); errorDiv.classList.remove('hidden'); } } catch (e) { @@ -20138,7 +20232,7 @@ async function saveShutdownSettings() { * 恢复默认关机设置 */ async function resetShutdownSettings() { - if (!confirm(typeof t === 'function' ? t('automation.confirmRestoreDefaults') : '确认恢复默认设置?')) return; + if (!confirmAction(typeof t === 'function' ? t('ui.confirmRestoreDefaults') : '确认恢复默认设置?')) return; const config = { low_threshold: 12.6, @@ -20171,12 +20265,12 @@ async function resetShutdownSettings() { * 删除规则 */ async function deleteRule(id) { - if (!confirm(typeof t === 'function' ? t('ui.confirmDeleteRule', { id }) : `确定要删除规则 "${id}" 吗?此操作不可撤销。`)) { + if (!confirmAction(typeof t === 'function' ? t('ui.confirmDeleteRule', { id }) : `确定要删除规则 "${id}" 吗?此操作不可撤销。`)) { return; } try { - const result = await api.call('automation.rules.delete', { id }); + const result = await ruleWriteWithRevision('automation.rules.delete', id); showToast(typeof t === 'function' ? t('toast.deleteRuleResult', { id }) + ': ' + (result.message || 'OK') : `删除规则 ${id}: ${result.message || 'OK'}`, result.code === 0 ? 'success' : 'error'); if (result.code === 0) { await Promise.all([refreshRules(), refreshAutomationStatus()]); @@ -20427,7 +20521,7 @@ async function testRestConnection() { const auth = document.getElementById('source-rest-auth').value.trim(); if (!url) { - alert(typeof t === 'function' ? t('automation.alertEnterApiAddress') : '请输入 API 地址'); + alert(typeof t === 'function' ? t('ui.alertEnterApiAddress') : '请输入 API 地址'); return; } @@ -20436,9 +20530,9 @@ async function testRestConnection() { const statusSpan = resultPanel.querySelector('.test-status'); btn.disabled = true; - btn.innerHTML = ' 测试中...'; + btn.innerHTML = (" " + t('ui.testing') + ""); resultPanel.style.display = 'block'; - statusSpan.innerHTML = ' 正在请求...'; + statusSpan.innerHTML = (" " + t('automationPage.testRequesting') + ""); try { // 通过 ESP32 代理请求(避免 CORS) @@ -20450,7 +20544,7 @@ async function testRestConnection() { if (result.code === 0 && result.data) { lastTestData = result.data.body; - statusSpan.innerHTML = `连接成功 (${result.data.status || 200})`; + statusSpan.innerHTML = `${t('ssh.connectionSuccess')} (${result.data.status || 200})`; // 解析并显示可选变量 try { @@ -20460,20 +20554,20 @@ async function testRestConnection() { } catch (e) { // 非 JSON 响应 document.querySelector('#rest-var-selector .var-list').innerHTML = - '
    响应非 JSON 格式,无法解析字段
    '; + ("
    " + t('dataSource.responseNotJson') + "
    "); document.getElementById('rest-json-preview').textContent = lastTestData; } } else { - statusSpan.innerHTML = `请求失败: ${result.message || '未知错误'}`; + statusSpan.innerHTML = `${t('automationPage.testFailed')}: ${escapeHtml(result.message || t('errors.unknownError'))}`; document.querySelector('#rest-var-selector .var-list').innerHTML = ''; } } catch (error) { - statusSpan.innerHTML = `错误: ${error.message}`; + statusSpan.innerHTML = `${t('common.error')}: ${escapeHtml(error.message)}`; document.querySelector('#rest-var-selector .var-list').innerHTML = ''; } btn.disabled = false; - btn.innerHTML = ' 测试'; + btn.innerHTML = (" " + t('common.test') + ""); } /** @@ -20483,7 +20577,7 @@ async function testWsConnection() { const uri = document.getElementById('source-ws-uri').value.trim(); if (!uri) { - alert(typeof t === 'function' ? t('automation.alertEnterWsAddress') : '请输入 WebSocket 地址'); + alert(typeof t === 'function' ? t('ui.alertEnterWsAddress') : '请输入 WebSocket 地址'); return; } @@ -20498,9 +20592,9 @@ async function testWsConnection() { } btn.disabled = true; - btn.innerHTML = ' 连接中...'; + btn.innerHTML = (" " + t('network.connecting') + ""); resultPanel.style.display = 'block'; - statusSpan.innerHTML = '正在连接...'; + statusSpan.innerHTML = ("" + t('toast.connecting') + ""); try { // 通过 ESP32 测试 WebSocket(获取第一条消息) @@ -20508,7 +20602,7 @@ async function testWsConnection() { if (result.code === 0 && result.data) { lastTestData = result.data.message; - statusSpan.innerHTML = `连接成功,已收到数据`; + statusSpan.innerHTML = `${t('automationPage.testConnected')}`; try { const jsonData = typeof lastTestData === 'string' ? JSON.parse(lastTestData) : lastTestData; @@ -20516,20 +20610,20 @@ async function testWsConnection() { document.getElementById('ws-json-preview').textContent = JSON.stringify(jsonData, null, 2); } catch (e) { document.querySelector('#ws-var-selector .var-list').innerHTML = - '
    消息非 JSON 格式,无法解析字段
    '; + ("
    " + t('dataSource.messageNotJson') + "
    "); document.getElementById('ws-json-preview').textContent = lastTestData; } } else { - statusSpan.innerHTML = `${result.message || '连接失败'}`; + statusSpan.innerHTML = `${escapeHtml(result.message || t('ssh.connectionFailed'))}`; document.querySelector('#ws-var-selector .var-list').innerHTML = ''; } } catch (error) { - statusSpan.innerHTML = `错误: ${error.message}`; + statusSpan.innerHTML = `${t('common.error')}: ${escapeHtml(error.message)}`; document.querySelector('#ws-var-selector .var-list').innerHTML = ''; } btn.disabled = false; - btn.innerHTML = ' 测试'; + btn.innerHTML = (" " + t('common.test') + ""); } /** @@ -20541,7 +20635,7 @@ async function testSioConnection() { const timeout = parseInt(document.getElementById('source-sio-timeout').value) || 15000; if (!url) { - alert(typeof t === 'function' ? t('automation.alertEnterSioAddress') : '请输入 Socket.IO 服务器地址'); + alert(typeof t === 'function' ? t('ui.alertEnterSioAddress') : '请输入 Socket.IO 服务器地址'); return; } @@ -20551,12 +20645,12 @@ async function testSioConnection() { const eventInput = document.getElementById('source-sio-event'); btn.disabled = true; - btn.innerHTML = ' 连接中...'; + btn.innerHTML = (" " + t('network.connecting') + ""); resultPanel.style.display = 'block'; // 显示连接阶段状态 - const statusText = event ? `正在连接并等待事件: ${event}` : '正在连接并自动发现事件...'; - statusSpan.innerHTML = ` ${statusText}`; + const statusText = event ? t('promptRepair.waitEvent', {event}) : t('sshPage.connectingAutoDiscover'); + statusSpan.innerHTML = ` ${escapeHtml(statusText)}`; try { // 通过 ESP32 测试 Socket.IO 连接 @@ -20568,16 +20662,16 @@ async function testSioConnection() { if (result.code === 0 && result.data) { const data = result.data; - const eventName = data.event || '(未知事件)'; + const eventName = data.event || t('sshPage.unknownEvent'); lastTestData = data.data; // 显示成功状态和发现的事件 - let statusHtml = `连接成功`; + let statusHtml = `${t('ssh.connectionSuccess')}`; if (data.event) { - statusHtml += ` | 事件: ${eventName}`; + statusHtml += ` | ${t('promptRepair.event')}: ${escapeHtml(eventName)}`; } if (data.sid) { - statusHtml += ` | SID: ${data.sid.substring(0, 8)}...`; + statusHtml += ` | SID: ${escapeHtml(data.sid.substring(0, 8))}...`; } statusSpan.innerHTML = statusHtml; @@ -20594,18 +20688,18 @@ async function testSioConnection() { document.getElementById('sio-json-preview').textContent = JSON.stringify(jsonData, null, 2); } catch (e) { document.querySelector('#sio-var-selector .var-list').innerHTML = - '
    事件数据非 JSON 格式,无法解析字段
    '; + ("
    " + t('automationPage.eventDataNotJson') + "
    "); document.getElementById('sio-json-preview').textContent = String(lastTestData); } } else { // 显示详细错误信息 - let errorMsg = result.message || '连接失败'; + let errorMsg = result.message || t('ssh.connectionFailed'); if (result.data && result.data.sid) { - errorMsg += ` (已获取 SID,但未收到事件数据)`; + errorMsg += ' ' + t('promptRepair.noEvent'); } - statusSpan.innerHTML = `${errorMsg}`; + statusSpan.innerHTML = `${escapeHtml(errorMsg)}`; document.querySelector('#sio-var-selector .var-list').innerHTML = - '
    提示:留空事件名称可自动发现服务器推送的事件
    '; + ("
    " + t('automationPage.hintAutoDiscoverEvent') + "
    "); // 显示详细错误 if (result.data && result.data.error) { @@ -20614,12 +20708,12 @@ async function testSioConnection() { } } } catch (error) { - statusSpan.innerHTML = `错误: ${error.message}`; + statusSpan.innerHTML = `${t('common.error')}: ${escapeHtml(error.message)}`; document.querySelector('#sio-var-selector .var-list').innerHTML = ''; } btn.disabled = false; - btn.innerHTML = ' 测试'; + btn.innerHTML = (" " + t('common.test') + ""); } /** @@ -20641,7 +20735,7 @@ function renderVarSelector(containerId, data, targetInputId, prefix = '') { flattenJson(data, prefix, items); if (items.length === 0) { - container.innerHTML = '
    无可选字段
    '; + container.innerHTML = ("
    " + t('ui.noSelectableFields') + "
    "); return; } @@ -20824,21 +20918,21 @@ async function loadSshHostsForSource() { const hosts = result.data.hosts; if (hosts.length === 0) { - hostSelect.innerHTML = ''; + hostSelect.innerHTML = ''; return; } let html = ''; hosts.forEach(h => { const label = `${h.id} (${h.username}@${h.host}:${h.port || 22})`; - html += ``; + html += ``; }); hostSelect.innerHTML = html; } else { - hostSelect.innerHTML = ``; + hostSelect.innerHTML = ``; } } catch (error) { - hostSelect.innerHTML = ``; + hostSelect.innerHTML = ``; } } @@ -20857,7 +20951,7 @@ async function onSshHostChangeForSource() { // 重置变量预览 const varsListDiv = document.getElementById('ssh-vars-list'); - if (varsListDiv) varsListDiv.innerHTML = '请先选择指令'; + if (varsListDiv) varsListDiv.innerHTML = ("" + t('ui.selectCmdFirst') + ""); if (!hostId) { cmdSelect.innerHTML = ''; @@ -20874,11 +20968,11 @@ async function onSshHostChangeForSource() { const commands = sshCommands[hostId] || []; if (commands.length === 0) { - cmdSelect.innerHTML = ''; + cmdSelect.innerHTML = ''; return; } - let html = ''; + let html = ''; commands.forEach((cmd, idx) => { const icon = cmd.icon || 'ri-rocket-line'; const label = (icon && icon.startsWith && icon.startsWith('ri-')) ? cmd.name : `${icon} ${cmd.name}`; @@ -20900,7 +20994,7 @@ function onSshCmdChange() { if (!hostId || cmdIdx === '') { if (preview) preview.style.display = 'none'; - if (varsListDiv) varsListDiv.innerHTML = '请先选择指令'; + if (varsListDiv) varsListDiv.innerHTML = ("" + t('ui.selectCmdFirst') + ""); return; } @@ -20908,7 +21002,7 @@ function onSshCmdChange() { const cmd = sshCommands[hostId]?.[parseInt(cmdIdx)]; if (!cmd) { if (preview) preview.style.display = 'none'; - if (varsListDiv) varsListDiv.innerHTML = '指令不存在'; + if (varsListDiv) varsListDiv.innerHTML = ("" + t('ui.cmdNotExist') + ""); return; } @@ -20916,7 +21010,7 @@ function onSshCmdChange() { if (preview) { preview.style.display = 'block'; document.getElementById('preview-command').textContent = cmd.command; - document.getElementById('preview-desc').textContent = cmd.desc || '无描述'; + document.getElementById('preview-desc').textContent = cmd.desc || t('ui.noDescription'); document.getElementById('preview-timeout').textContent = cmd.timeout || 30; } @@ -20924,13 +21018,13 @@ function onSshCmdChange() { const varName = cmd.varName || cmd.name; // 优先使用 varName,否则用 name if (varsListDiv) { varsListDiv.innerHTML = ` -
    ${varName}.status - 执行状态 (success/failed/error)
    -
    ${varName}.exit_code - 退出码
    -
    ${varName}.extracted - 提取的值
    -
    ${varName}.expect_matched - 成功模式匹配结果
    -
    ${varName}.fail_matched - 失败模式匹配结果
    -
    ${varName}.host - 执行主机
    -
    ${varName}.timestamp - 执行时间戳
    +
    ${escapeHtml(varName)}.status - ${t('varPreview.status')}
    +
    ${escapeHtml(varName)}.exit_code - ${t('varPreview.exitCode')}
    +
    ${escapeHtml(varName)}.extracted - ${t('varPreview.extracted')}
    +
    ${escapeHtml(varName)}.expect_matched - ${t('varPreview.expectMatched')}
    +
    ${escapeHtml(varName)}.fail_matched - ${t('varPreview.failMatched')}
    +
    ${escapeHtml(varName)}.host - ${t('varPreview.host')}
    +
    ${escapeHtml(varName)}.timestamp - ${t('varPreview.timestamp')}
    `; } @@ -20956,7 +21050,7 @@ async function submitAddSource() { const enabled = document.getElementById('source-enabled').checked; if (!id) { - alert(typeof t === 'function' ? t('automation.alertEnterSourceId') : '请输入数据源 ID'); + alert(typeof t === 'function' ? t('ui.alertEnterSourceId') : '请输入数据源 ID'); return; } @@ -20969,7 +21063,7 @@ async function submitAddSource() { params.reconnect_ms = parseInt(document.getElementById('source-ws-reconnect').value) || 5000; if (!params.uri) { - alert(typeof t === 'function' ? t('automation.alertEnterWsUri') : '请输入 WebSocket URI'); + alert(typeof t === 'function' ? t('ui.alertEnterWsUri') : '请输入 WebSocket URI'); return; } } else if (type === 'rest') { @@ -20979,7 +21073,7 @@ async function submitAddSource() { params.auth_header = document.getElementById('source-rest-auth').value.trim(); if (!params.url) { - alert(typeof t === 'function' ? t('automation.alertEnterRestUrl') : '请输入 REST URL'); + alert(typeof t === 'function' ? t('ui.alertEnterRestUrl') : '请输入 REST URL'); return; } } else if (type === 'socketio') { @@ -20994,11 +21088,11 @@ async function submitAddSource() { params.auto_discover = autoDiscoverEl ? autoDiscoverEl.checked : true; if (!params.url) { - alert(typeof t === 'function' ? t('automation.alertEnterSioAddress') : '请输入 Socket.IO 服务器地址'); + alert(typeof t === 'function' ? t('ui.alertEnterSioAddress') : '请输入 Socket.IO 服务器地址'); return; } if (!params.event) { - alert(typeof t === 'function' ? t('automation.alertEnterSioEvent') : '请输入要监听的事件名称(可先通过测试按钮自动发现)'); + alert(typeof t === 'function' ? t('ui.alertEnterSioEvent') : '请输入要监听的事件名称(可先通过测试按钮自动发现)'); return; } } else if (type === 'variable') { @@ -21007,18 +21101,18 @@ async function submitAddSource() { const cmdIdx = document.getElementById('source-ssh-cmd').value; if (!hostId) { - alert(typeof t === 'function' ? t('automation.alertSelectSshHost') : '请选择 SSH 主机'); + alert(typeof t === 'function' ? t('ui.alertSelectSshHost') : '请选择 SSH 主机'); return; } if (cmdIdx === '') { - alert(typeof t === 'function' ? t('automation.alertSelectSshCmd') : '请选择 SSH 指令'); + alert(typeof t === 'function' ? t('ui.alertSelectSshCmd') : '请选择 SSH 指令'); return; } // 获取选中的命令配置 const cmd = sshCommands[hostId]?.[parseInt(cmdIdx)]; if (!cmd) { - alert(typeof t === 'function' ? t('automation.alertCmdNotExist') : '指令不存在,请重新选择'); + alert(typeof t === 'function' ? t('ui.alertCmdNotExist') : '指令不存在,请重新选择'); return; } @@ -21172,6 +21266,11 @@ function showAddRuleModal(ruleData = null) {
    +
    + + + +
    ${typeof t === 'function' ? t('automation.triggerConditions') : '触发条件'} @@ -21216,6 +21315,11 @@ function showAddRuleModal(ruleData = null) { // 如果是编辑模式,填充现有数据 if (isEdit && ruleData) { document.getElementById('rule-id').value = ruleData.id; + document.getElementById('rule-id').disabled = true; + document.getElementById('rule-show-dashboard').checked = ruleData.show_on_dashboard === true; + document.getElementById('rule-show-dashboard').dataset.present = String(Object.hasOwn(ruleData, 'show_on_dashboard')); + document.getElementById('rule-allow-manual').checked = ruleData.allow_manual_trigger === true; + document.getElementById('rule-allow-manual').dataset.present = String(Object.hasOwn(ruleData, 'allow_manual_trigger')); document.getElementById('rule-name').value = ruleData.name || ''; document.getElementById('rule-logic').value = ruleData.logic || 'and'; document.getElementById('rule-cooldown').value = ruleData.cooldown_ms || 0; @@ -21238,7 +21342,7 @@ function showAddRuleModal(ruleData = null) { // 填充条件 if (ruleData.conditions && ruleData.conditions.length > 0) { ruleData.conditions.forEach(cond => { - addConditionRow(cond.variable, cond.operator, cond.value); + addConditionRow(cond.variable, cond.operator, cond.value, cond); }); } @@ -21251,17 +21355,18 @@ function showAddRuleModal(ruleData = null) { // 填充动作 if (ruleData.actions && ruleData.actions.length > 0) { // 异步加载动作模板行 + modal.dataset.loading = 'true'; (async () => { - for (const act of ruleData.actions) { + try { for (const act of ruleData.actions) { await addActionTemplateRow( act.template_id, act.delay_ms || 0, act.repeat_mode || 'once', act.repeat_count || 1, - act.repeat_interval_ms || 1000, - act.condition || null + act.repeat_interval_ms ?? 1000, + act.condition || null, act ); - } + } } finally { modal.dataset.loading = 'false'; } })(); } } @@ -21272,22 +21377,15 @@ function showAddRuleModal(ruleData = null) { */ function toggleManualOnly() { const checked = document.getElementById('rule-manual-only').checked; - const addBtn = document.getElementById('add-condition-btn'); + document.getElementById('add-condition-btn').disabled = checked; const container = document.getElementById('conditions-container'); - - if (checked) { - // 禁用添加条件按钮,清空现有条件 - addBtn.disabled = true; - addBtn.style.opacity = '0.5'; - container.innerHTML = '

    ' + (typeof t === 'function' ? t('ui.manualTriggerOnly') : '此规则仅可通过手动触发按钮执行') + '

    '; - } else { - // 启用添加条件按钮 - addBtn.disabled = false; - addBtn.style.opacity = '1'; - container.innerHTML = '

    ' + (typeof t === 'function' ? t('automation.addConditionHintShort') : '点击"添加"创建触发条件') + '

    '; - } + container.querySelectorAll('input, select, button').forEach(el => { el.disabled = checked; }); + let note = document.getElementById('rule-preserved-conditions'); + if (!note) { note = document.createElement('p'); note.id = 'rule-preserved-conditions'; container.before(note); } + note.textContent = checked ? runtimeText('conditionsPreserved') : ''; } + // ==================== 规则图标选择 ==================== function switchRuleIconType(type) { @@ -21377,7 +21475,7 @@ let conditionRowCount = 0; * @param {string} operator - 预填充操作符 * @param {any} value - 预填充比较值 */ -function addConditionRow(variable = '', operator = 'eq', value = '') { +function addConditionRow(variable = '', operator = 'eq', value = '', original = null) { const container = document.getElementById('conditions-container'); // 移除空提示 @@ -21392,7 +21490,7 @@ function addConditionRow(variable = '', operator = 'eq', value = '') { } // 处理值显示 - let displayValue = value; + let displayValue = typeof value === 'string' ? JSON.stringify(value) : value; if (typeof value === 'object') { displayValue = JSON.stringify(value); } else if (typeof value === 'boolean') { @@ -21402,6 +21500,7 @@ function addConditionRow(variable = '', operator = 'eq', value = '') { const rowId = conditionRowCount; const row = document.createElement('div'); row.className = 'condition-row'; + row._originalCondition = original ? structuredClone(original) : null; row.id = `condition-row-${rowId}`; row.innerHTML = ` `; @@ -21555,8 +21654,8 @@ async function openConditionVarSelector(rowId) { console.error('加载变量列表失败:', e); document.getElementById('variable-select-loading').innerHTML = `
    -

    加载失败: ${e.message}

    - +

    ${t('common.loadFailed')}: ${escapeHtml(e.message)}

    +
    `; } @@ -21613,13 +21712,20 @@ async function loadActionTemplatesForRule() { * @param {number} repeatIntervalMs - 重复间隔毫秒 * @param {Object|null} condition - 动作条件配置 {variable, operator, value} */ -async function addActionTemplateRow(templateId = '', delayMs = 0, repeatMode = 'once', repeatCount = 1, repeatIntervalMs = 1000, condition = null) { +async function addActionTemplateRow(templateId = '', delayMs = 0, repeatMode = 'once', repeatCount = 1, repeatIntervalMs = 1000, condition = null, original = null) { const container = document.getElementById('actions-container'); + if (original && !templateId) { + const row = document.createElement('div'); row.className = 'action-row'; + row._originalAction = structuredClone(original); row.dataset.inline = 'true'; + const label = document.createElement('pre'); label.textContent = JSON.stringify(original, null, 2); + row.appendChild(label); container.querySelector('.empty-hint')?.remove(); container.appendChild(row); + return; + } // 先加载模板列表 await loadActionTemplatesForRule(); - if (cachedActionTemplates.length === 0) { + if (cachedActionTemplates.length === 0 && !original) { showToast(typeof t === 'function' ? t('toast.createActionFirst') : '请先创建动作模板', 'warning'); return; } @@ -21630,16 +21736,19 @@ async function addActionTemplateRow(templateId = '', delayMs = 0, repeatMode = ' const row = document.createElement('div'); row.className = 'action-row template-select-row'; + row._originalAction = original ? structuredClone(original) : null; row.id = `action-row-${actionRowCount}`; // 构建模板选项 - let optionsHtml = ''; + let optionsHtml = ''; cachedActionTemplates.forEach(tpl => { const typeLabel = getActionTypeLabel(tpl.type); const selected = tpl.id === templateId ? 'selected' : ''; optionsHtml += ``; }); + if (templateId && !cachedActionTemplates.some(tpl => tpl.id === templateId)) + optionsHtml += ``; const rowId = actionRowCount; const showRepeatOptions = repeatMode !== 'once'; const hasCondition = condition && condition.variable; @@ -21654,25 +21763,25 @@ async function addActionTemplateRow(templateId = '', delayMs = 0, repeatMode = '
    @@ -21681,7 +21790,7 @@ async function addActionTemplateRow(templateId = '', delayMs = 0, repeatMode = '
    @@ -21719,11 +21829,11 @@ function getActionTypeLabel(type) { 'cli': 'CLI', 'ssh_cmd_ref': 'SSH', 'led': 'LED', - 'log': '日志', - 'set_var': '变量', + 'log': t('common.log'), + 'set_var': t('common.variable'), 'webhook': 'Webhook', 'gpio': 'GPIO', - 'device_ctrl': '设备' + 'device_ctrl': t('common.devices') }; return labels[type] || type; } @@ -21821,21 +21931,21 @@ async function showVariableSelectModalForCondition() {
    `; @@ -21919,8 +22029,8 @@ async function showVariableSelectModalForCondition() { console.error('加载变量列表失败:', e); document.getElementById('variable-select-loading').innerHTML = `
    -

    加载失败: ${e.message}

    - +

    ${t('common.loadFailed')}: ${escapeHtml(e.message)}

    +
    `; } @@ -21973,7 +22083,7 @@ function updateActionFields(selectElement) { - + `; break; @@ -21981,10 +22091,10 @@ function updateActionFields(selectElement) { paramsContainer.innerHTML = ` - + `; break; case 'device': @@ -21994,17 +22104,17 @@ function updateActionFields(selectElement) { `; break; case 'set_var': paramsContainer.innerHTML = ` - - + + `; break; case 'log': @@ -22014,7 +22124,7 @@ function updateActionFields(selectElement) { - + `; break; case 'webhook': @@ -22037,6 +22147,8 @@ function updateActionFields(selectElement) { * @param {string} originalId - 编辑模式时传入原规则 ID */ async function submitAddRule(originalId = null) { + const modal = document.getElementById('add-rule-modal'); + if (modal?.dataset.saving === 'true' || modal?.dataset.loading === 'true') return; const isEdit = !!originalId; const id = document.getElementById('rule-id').value.trim(); const name = document.getElementById('rule-name').value.trim(); @@ -22057,7 +22169,7 @@ async function submitAddRule(originalId = null) { // 收集条件(仅手动触发时为空数组) const conditions = []; - if (!manualTrigger) { + { document.querySelectorAll('.condition-row').forEach(row => { const variable = row.querySelector('.cond-variable').value.trim(); const operator = row.querySelector('.cond-operator').value; @@ -22071,19 +22183,23 @@ async function submitAddRule(originalId = null) { // 保持字符串 } - conditions.push({ variable, operator, value }); + const condition = { variable, operator, value }; + if (row._originalCondition && Object.is(value, row._originalCondition.value) && row._originalCondition.value_type !== undefined) + condition.value_type = row._originalCondition.value_type; + conditions.push(condition); } }); } // 收集动作模板引用(包含 template_id、delay_ms、重复选项和动作条件) const actions = []; - document.querySelectorAll('.action-row').forEach(row => { + document.querySelectorAll('#add-rule-modal .action-row').forEach(row => { + if (row.dataset.inline === 'true') { actions.push(structuredClone(row._originalAction)); return; } const templateId = row.querySelector('.action-template-id')?.value; const delay_ms = parseInt(row.querySelector('.action-delay')?.value) || 0; const repeat_mode = row.querySelector('.action-repeat-mode')?.value || 'once'; const repeat_count = parseInt(row.querySelector('.action-repeat-count')?.value) || 1; - const repeat_interval_ms = parseInt(row.querySelector('.action-repeat-interval')?.value) || 1000; + const repeat_interval_ms = Number(row.querySelector('.action-repeat-interval')?.value ?? 1000); // 收集动作条件 const hasCondition = row.querySelector('.action-has-condition')?.checked; @@ -22092,10 +22208,13 @@ async function submitAddRule(originalId = null) { const condValueRaw = row.querySelector('.action-condition-value')?.value?.trim(); if (templateId) { - const actionRef = { - template_id: templateId, - delay_ms: delay_ms - }; + const actionRef = row._originalAction?.template_id === templateId ? structuredClone(row._originalAction) : {}; + actionRef.template_id = templateId; + actionRef.delay_ms = delay_ms; + actionRef.repeat_mode = repeat_mode; + actionRef.repeat_count = repeat_count; + actionRef.repeat_interval_ms = repeat_interval_ms; + delete actionRef.condition; // 只有非单次执行时才添加重复参数 if (repeat_mode !== 'once') { @@ -22121,6 +22240,9 @@ async function submitAddRule(originalId = null) { operator: condOperator, value: condValue }; + const oldCondition = row._originalAction?.condition; + if (oldCondition && Object.is(oldCondition.value, condValue) && oldCondition.value_type !== undefined) + actionRef.condition.value_type = oldCondition.value_type; } actions.push(actionRef); @@ -22128,7 +22250,7 @@ async function submitAddRule(originalId = null) { }); if (actions.length === 0) { - alert(typeof t === 'function' ? t('automation.alertSelectAction') : '请至少选择一个动作模板'); + alert(typeof t === 'function' ? t('ui.alertSelectAction') : '请至少选择一个动作模板'); return; } @@ -22140,27 +22262,37 @@ async function submitAddRule(originalId = null) { cooldown_ms: cooldown, enabled, manual_trigger: manualTrigger, + show_on_dashboard: document.getElementById('rule-show-dashboard').checked, + allow_manual_trigger: document.getElementById('rule-allow-manual').checked, + expected_revision: Number(document.getElementById('rule-revision').value), conditions, actions }; - try { - // 编辑模式:先删除旧规则,再创建新规则 - if (isEdit) { - await api.call('automation.rules.delete', { id: originalId }); + if (isEdit) { + for (const [element, field] of [['rule-show-dashboard', 'show_on_dashboard'], ['rule-allow-manual', 'allow_manual_trigger']]) { + const input = document.getElementById(element); + if (input.dataset.present === 'false' && input.dataset.dirty !== 'true') delete params[field]; } - - const result = await api.call('automation.rules.add', params); + } + modal.dataset.saving = 'true'; + try { + const result = await api.call(isEdit ? 'automation.rules.update' : 'automation.rules.add', params); if (result.code === 0) { - showToast(typeof t === 'function' ? t('toast.ruleCreated', { id, action: isEdit ? t('toast.ruleUpdate') : t('toast.ruleCreate') }) : `规则 ${id} ${isEdit ? '更新' : '创建'}成功`, 'success'); + showToast(runtimeText(result.data?.mirror_synced === false ? 'mirrorWarning' : 'saved'), result.data?.mirror_synced === false ? 'warning' : 'success'); closeModal('add-rule-modal'); await Promise.all([refreshRules(), refreshAutomationStatus()]); } else { - showToast(typeof t === 'function' ? t('toast.ruleCreateFailed', { action: isEdit ? t('toast.ruleUpdate') : t('toast.ruleCreate') }) + ': ' + result.message : `${isEdit ? '更新' : '创建'}规则失败: ${result.message}`, 'error'); + showToast(runtimeSaveError(result), 'error'); } } catch (error) { - showToast(typeof t === 'function' ? t('toast.ruleCreateFailed', { action: isEdit ? t('toast.ruleUpdate') : t('toast.ruleCreate') }) + ': ' + error.message : `${isEdit ? '更新' : '创建'}规则失败: ${error.message}`, 'error'); - } + showToast(runtimeText('saveUnknown'), 'warning'); + // Re-read once, never replay the write. Keep the editor and its draft. + try { + const current = await api.call('automation.rules.get', { id }); + if (current.code === 0) document.getElementById('rule-revision').dataset.observedRevision = current.data.revision; + } catch (_) { /* Remain explicitly uncertain. */ } + } finally { modal.dataset.saving = 'false'; } } /** @@ -22442,7 +22574,7 @@ async function previewSourceImport() { importBtn.disabled = false; } else { resultBox.className = 'result-box error'; - resultBox.textContent = (result.message || '无法验证配置包'); + resultBox.textContent = (result.message || t('ssh.cannotVerifyPack')); } } catch (e) { resultBox.className = 'result-box error'; @@ -22553,10 +22685,10 @@ async function doExportRule(ruleId) { if (certText) params.recipient_cert = certText; const result = await api.call('automation.rules.export', params); - if (result.code !== 0) throw new Error(result.message || '导出失败'); + if (result.code !== 0) throw new Error(result.message || t('toast.exportFailed')); const data = result.data; - if (!data?.tscfg) throw new Error('无效的响应数据'); + if (!data?.tscfg) throw new Error(t('toast.invalidResponse')); // 下载文件 const blob = new Blob([data.tscfg], { type: 'application/json' }); @@ -22962,7 +23094,7 @@ async function previewActionImport() { importBtn.disabled = false; } else { resultBox.className = 'result-box error'; - resultBox.textContent = (result.message || '无法验证配置包'); + resultBox.textContent = (result.message || t('ssh.cannotVerifyPack')); } } catch (e) { resultBox.className = 'result-box error'; diff --git a/components/ts_webui/web/js/lang/en-US.js b/components/ts_webui/web/js/lang/en-US.js index 6d16946..9240a21 100644 --- a/components/ts_webui/web/js/lang/en-US.js +++ b/components/ts_webui/web/js/lang/en-US.js @@ -2,6 +2,261 @@ * TianShanOS WebUI - English Language Pack */ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { + promptRepair: { + taskResults: 'Configuration task history', + taskAttempt: 'Attempt {attempt}: {path}', + retry: 'Retry', + pageLoadFailed: 'The page could not be loaded. Please retry.', + logoutConfirmed: "Signed out locally. The server acknowledged the sign-out request.", + logoutLocal: "Local sign-in information was cleared. The server session has not been confirmed as ended.", + packRevalidate: "This package verification is no longer current. Upload and verify it again.", + listRefreshFailed: "The file list could not be refreshed. Refresh it manually. Confirmed upload results are unchanged.", + + "phase_PLATFORM": "Platform initialization", + "phase_CORE": "Core services", + "phase_HAL": "Hardware access", + "phase_DRIVER": "Device drivers", + "phase_NETWORK": "Network services", + "phase_SECURITY": "Security services", + "phase_SERVICE": "Application services", + "phase_UI": "User interface", + + "forceOff": "Force power off", + "state_UNREGISTERED": "Not registered", + "state_REGISTERED": "Registered", + "state_STARTING": "Starting", + "state_RUNNING": "Running", + "state_STOPPING": "Stopping", + "state_STOPPED": "Stopped", + "state_ERROR": "Error", + "state_Running": "Running", + "state_Ready": "Ready to run", + "state_Blocked": "Waiting for a resource or event", + "state_Suspended": "Suspended", + "state_Deleted": "Deleted", + + "settingsTitle": "{device} · Settings", + "viewVariables": "View variables: {name}.*", + "ledServiceStatus": "Check LED service status", + "customColor": "Custom color", + "organization": "Organization", + "wwwPartial": "Firmware was written, but the WebUI upgrade failed; no restart was requested.", + "wwwRetry": "Retry WebUI upgrade", + "variableCount": "{count} variables", + "variableExample": "Example: system.flag", + "valueExample": "Examples: true, 123, ${other_var}", + "webhookConfig": "Webhook settings", + "qrVariableHint": "Text or URL; supports ${variable_name}", + "noHosts": "No hosts available. Add a host on the SSH page first.", + "noCommands": "This host has no commands. Add one on the SSH page first.", + "chooseCommand": "Select a command", + "chooseAction": "Select an action template", + "unknownFilter": "Unknown filter", + "colorRed": "Red", + "colorOrange": "Orange", + "colorYellow": "Yellow", + "colorGreen": "Green", + "colorCyan": "Cyan", + "colorBlue": "Blue", + "colorPurple": "Purple", + "colorWhite": "White", + "colorPink": "Pink", + "colorGray": "Gray", + "filterFadeIn": "Fade in", + "filterFadeOut": "Fade out", + "filterColorShift": "Color shift", + + "keyVerified": "Key “{id}” was deployed to {target}; public-key sign-in was verified.", + "keyUnverified": "Key “{id}” was deployed to {target}, but public-key sign-in is unconfirmed.", + "packApplied": "The configuration package was applied.", + "filesSelected": "{count} files selected", + "fileErrors": "{count} files could not be read: {message}", + "packGenerated": "Configuration package generated\nFile: {name}\nSize: {size} bytes; contains {count} configuration files", + "orphanCount": "The hosts referenced by {count} commands no longer exist", + "orphanHost": "Host “{id}” does not exist. Select another host for this command or delete the command.", + "expectedLabel": "Expected output:", + "failureLabel": "Failure condition:", + "extractLabel": "Extraction rule:", + "servicePattern": "Service readiness condition: {pattern}", + "waitEvent": "Connecting and waiting for event: {event}", + "event": "Event", + "noEvent": "A session was established, but no event data was received.", + "outputPreview": "Output: {output}", + "upgradeWritten": "Upgrade files were written. Requesting a device restart.", + "rebootUnknown": "Restart confirmation was not received. The device may be restarting; wait for the status check before repeating the operation.", + "horizontal": "Horizontal", + "vertical": "Vertical", + "diagonalRight": "Diagonal ↘", + "diagonalLeft": "Diagonal ↙", + "effect_rainbow": "Rainbow", + "effect_breathing": "Breathing", + "effect_solid": "Solid color", + "effect_sparkle": "Sparkle", + "effect_pulse": "Pulse", + "effect_color_cycle": "Color cycle", + "effect_heartbeat": "Heartbeat", + "effect_chase": "Chase", + "effect_comet": "Comet", + "effect_spin": "Spin", + "effect_breathe_wave": "Breathing wave", + "effect_fire": "Fire", + "effect_rain": "Rain", + "effect_coderain": "Code rain", + "effect_plasma": "Plasma", + "effect_ripple": "Ripple", + "effect_unknown": "Unknown animation", + + "sshAccepted": "The device accepted the execution request. Process startup and readiness are not yet confirmed.\n\n", + "sshCheckOutput": "Use the buttons above to check logs or process status.\n", + "sshBegin": "--- Execution started ---\n", + "sshEnd": "\n--- Execution ended ---\n", + "sshCancelOutput": "\nExecution cancelled.\n", + "noOutput": "(No output)\n", + "serviceStoppedOutput": "The service has stopped.\n", + "processStoppedOutput": "The process has stopped.\n", + "tailStopped": "\nLive log tracking stopped.\n", + "matchSettings": "\nOutput matching settings:\n", + "stopOnMatch": " Stop after a match: yes\n", + "modeFailed": "The fan mode could not be changed.", + "noResponse": "No response data was received.", + "enterOtaPath": "Enter the path to the firmware file or its folder.", + "otaPathFailed": "The SD card upgrade file could not be read. Check its path.", + "wwwSibling": "Check that www.bin is in the same folder as the firmware file.", + "startFailed": "The operation could not be started.", + "webUploadFailed": "The WebUI file could not be uploaded.", + "firmwareDownloading": "Downloading firmware…", + "firmwareStep": "[1/2] Firmware ", + "webUpgradeFailed": "WebUI upgrade incomplete: ", + "hiddenPrefix": "[Hidden] ", + "officialSuffix": " (Official)", + "logFile": "Log file: {path}\n", + "logFileSpaced": "\nLog file: {path}\n", + "processKeyword": "Process keyword: {keyword}\n", + "sessionWaiting": "Session ID: {id}\nWaiting for output…\n\n", + "expectedPattern": " Expected output pattern: {pattern}\n", + "failurePattern": " Failure output pattern: {pattern}\n", + "extractPattern": " Extraction pattern: {pattern}\n", + "storedVariable": " Store in variable: {name}.*\n", + "exitCode": "Exit code: {code}\n", + "extractedLine": "Extracted content: {value}\n", + "extractedBlock": "\nExtracted content:\n{value}\n", + "sshError": "\nExecution error: {message}\n", + "executionFailed": "Execution did not complete: {message}\n", + "stopFailed": "The service could not be confirmed stopped: {message}", + "firmwareMissing": "Firmware file not found: {path}", + "wwwMissing": "WebUI file not found: {path}", + "directoryUnreadable": "Folder could not be read: {path}", + "firmwareDirMissing": "No firmware .bin file was found in: {path}", + "wwwDirMissing": "WebUI file not found: {path}/www.bin", + "dnsFailed": "The device could not resolve the server address: {host}", + "tcpFailed": "The device could not connect to the server: {host}:{port}", + "httpFailed": "The device could not retrieve content from the server: {message}", + "httpStatus": "The server returned an error (HTTP {status}).", + "downloadHttpStatus": "Download failed (HTTP {status}).", + "sshStopping": "The process is still running. Requesting forced termination…\n", + "stopUnconfirmed": "Forced termination was requested, but the process state is unconfirmed. Check its status.", + "credentials": "The username or password is incorrect.", + "oldPassword": "The current password is incorrect. Enter it again.", + "sdUnavailable": "The SD card is not available. Check that it is inserted and mounted.", + "sdMounted": "The SD card is already mounted.", + "fileMissing": "This file could not be found. Refresh the file list.", + "directoryMissing": "This folder could not be found. Refresh the file list.", + "rootDirectory": "The storage root cannot be deleted. Select a file or folder inside it.", + "fileInfo": "File information could not be read. Check the storage device and refresh the list.", + "unknownError": "The operation could not be completed. See the details below.", + "invalidInput": "The submitted information is not valid. Check the relevant settings.", + "notFound": "The requested item could not be found. Refresh the list to check whether it still exists.", + "permission": "Your account does not have permission to perform this operation.", + "busy": "The device is busy. Wait for the current operation to finish.", + "timeout": "A complete response was not received in time. The result is unconfirmed; check the current state first.", + "resultUnknown": "No complete confirmation was received. The result is unknown. Check the current state before repeating the operation.", + "memory": "The device does not have enough available memory to complete the operation.", + "internal": "The device encountered an error while processing the request. See the details below.", + "unsupported": "This operation is not supported by this device.", + "hardware": "The hardware operation could not be completed. Check the relevant hardware status.", + "connection": "The device or target service could not be reached. Check the network connection.", + "auth": "Authentication failed. Check your credentials or sign in again.", + "invalidResponse": "The device response could not be read. The result is unconfirmed.", + "details": "Details: {detail}", + "deleteSummary": "Deletion results: {success} succeeded; {fail} failed or are unconfirmed.", + "downloadSummary": "Downloads requested in the browser: {success}; not started: {fail}. Check the browser for saved files.", + "uploadSummary": "Upload results: {success} uploaded; {fail} failed or unconfirmed; {invalid} configuration packages failed verification. Uploading does not apply a configuration.", + "ledSummary": "Lights switched off: {success}; failed or unconfirmed: {fail}.", + "uploaded": "The file has been uploaded.", + "packVerified": "Uploaded and signature verified; not yet applied.", + "packInvalid": "The file was uploaded, but package verification failed. It cannot be applied.", + "downloadStarted": "The download has been requested in the browser. Check the browser for the saved file.", + "hiddenNetwork": "Hidden network", + "wifiPassword": "Enter the password for “{ssid}”; leave it blank for an open network:", + "logConnected": "Live log connection established", + "logDisconnected": "Live logs disconnected; waiting to reconnect", + "sshSubmissionUnknown": "Command acceptance was not confirmed. Check the logs or process status before submitting it again.", + "sshDiagnostics": "Reported status: {status}; exit code: {code}", + "sshUnknown": "The command result is unconfirmed. Check the output and status details.", + "sshTimeout": "The command timed out. Check the output to see what was executed.", + "sshCancelled": "Command execution was cancelled.", + "sshFailureOutput": "The output matched a configured failure condition. Check the command output.", + "sshExpectedMissing": "The command ended without the expected output.", + "sshExpectedFound": "The expected output was detected. Waiting for the final result.", + "sshFailed": "The command failed. Check its output and exit code.", + "sshSuccess": "The command completed successfully.", + "lpmuProbeFailed": "The LPMU network check failed. Its power state is unknown.", + "lpmuReachable": "LPMU is reachable over the network. This check does not confirm its power state.", + "lpmuUnreachable": "LPMU is unreachable over the network. This does not confirm that it is powered off.", + "retry": "Retry", + "terminalLoadFailed": "Terminal components could not be loaded. Check the network and retry.", + "terminalRestoring": "Restoring the terminal session. Waiting for connection confirmation.", + "terminalRestored": "The terminal session has been restored. Previous commands were not resent.", + "terminalRestoreTimeout": "Terminal session recovery timed out. Connection is unconfirmed.", + "terminalRestoreFailed": "The terminal session could not be restored. Reconnect to continue.", + "noInitialColor": "No initial color configuration is available to restore.", + "serviceStarted": "Service “{name}” started successfully.", + "serviceStopped": "Service “{name}” stopped successfully.", + "serviceRestarted": "Service “{name}” restarted successfully.", + "ruleCreated": "Rule “{id}” created successfully.", + "ruleUpdated": "Rule “{id}” updated successfully." +}, + + runtimeRepair: { + configLoading: 'Configuration is loading. Refresh shortly.', + confirmFingerprint: 'Verify this server fingerprint through a trusted channel. Trust this exact fingerprint and connect?', + saved: 'Saved', + "showDashboard": "Show on dashboard", + "allowManual": "Allow manual execution", + "conditionsPreserved": "Manual mode preserves conditions; automatic evaluation resumes on the next cycle.", + "saveFailed": "Save failed; draft retained", + "saveUnknown": "Save outcome unknown. Read back before resubmitting.", + "mirrorWarning": "Saved, but backup is not synchronized. Keep the SD card installed.", + "revision_conflict": "Configuration changed. Reload and merge your draft.", + "source_read_only": "This configuration source is read-only; original retained.", + "recovery_required": "Configuration recovery is required; automatic execution paused.", + "commit_unknown": "Save outcome unknown; recovery required.", + "execution_busy": "Rule is executing; operation unavailable.", + "service_busy": "Service is active or unconfirmed. Verify and stop it first.", + "busy_retired_config": "Previous configuration is still in use; retry later.", + "disabled": "Disabled", + "manual": "Manual", + "automatic": "Automatic", + "referenceUnresolved": "Unresolved reference", + "unknown": "Unconfirmed", + "running": "Process running", + "ready": "Readiness log matched", + "checking": "Checking readiness log", + "starting": "Starting", + "stopping": "Stopping", + "stopped": "Process confirmed stopped", + "failed": "Failure log matched", + "timeout": "Readiness check timed out", + "lastKnown": "Last known", + "confirmedAt": "Last confirmation (uptime)", + "stateEvidence": "Evidence source", + "startBlocked": "Start unavailable: check enablement, manual permission and service state.", + "outcomeUnknown": "Remote outcome unknown; it may still be running. Verify before retrying.", + "confirmStop": "Stop the remote service?", + "confirmStopAutomatic": "Stop the remote service? An enabled automatic rule may start it on the next matching evaluation. Disable the rule to keep it stopped.", + "refresh_required": "Refresh this outdated page before editing." +}, + // Common common: { confirm: 'Confirm', @@ -257,7 +512,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { lpmu: 'LPMU', agxRunning: 'AGX Running', agxStopped: 'AGX Stopped', - lpmuDetecting: 'LPMU Detecting', + lpmuDetecting: "Check result unknown", usbMux: 'USB Switch', widgetManager: 'Widget Manager', @@ -307,21 +562,21 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { agxPowerOnSuccess: 'AGX powered on', agxPowerOffSuccess: 'AGX powered off', agxPowerFail: 'AGX operation failed', - lpmuRunning: 'LPMU Running', - lpmuStopped: 'LPMU Stopped', - lpmuOnlineTitle: 'LPMU online (ping 10.10.99.99 reachable)\nClick to trigger power button', - lpmuOfflineTitle: 'LPMU offline (ping 10.10.99.99 unreachable)\nClick to trigger power button', + lpmuRunning: "Network reachable", + lpmuStopped: "Network unreachable", + lpmuOnlineTitle: "LPMU is reachable over the network. This check does not confirm its power state.", + lpmuOfflineTitle: "LPMU is unreachable over the network. This does not confirm that it is powered off.", lpmuDetectingTitle: 'Detecting LPMU status...\nWait up to 80 seconds', - lpmuUnknownTitle: 'LPMU status unknown\nClick to trigger power button', + lpmuUnknownTitle: "The LPMU network check failed. Its power state is unknown.", statusFetching: 'Fetching status', lpmuTriggerConfirm: 'Trigger LPMU power button?\n\nThis sends a pulse, like pressing the physical power button.', lpmuTriggering: 'LPMU power trigger...', lpmuTriggerSuccess: 'LPMU trigger sent, detecting status...', lpmuTriggerFail: 'LPMU trigger failed', - lpmuOnlineSuccess: 'LPMU is online', - lpmuOfflineSuccess: 'LPMU is off', - lpmuStartupTimeout: 'LPMU startup detection timeout, assumed off', - lpmuShutdownTimeout: 'LPMU shutdown timeout, device may still be running' + lpmuOnlineSuccess: "LPMU is reachable over the network. This check does not confirm its power state.", + lpmuOfflineSuccess: "LPMU is unreachable over the network. This does not confirm that it is powered off.", + lpmuStartupTimeout: "LPMU is unreachable over the network. This does not confirm that it is powered off.", + lpmuShutdownTimeout: "LPMU is reachable over the network. This check does not confirm its power state." }, // Fan Control @@ -506,6 +761,14 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { // SSH Commands ssh: { + restartToTakeEffect: "Restart the system to apply the changes.", + note: "Notes", + useConfigHost: "Use the host from the configuration", + includeHostConfigHint: "Include this to import the complete configuration on the target device.", + serviceModeVarHint: "Service status is stored in ${变量名}.status (ready/checking/timeout).", + timeoutConditionHint: "The timeout applies only when a success or failure pattern is set, or “Stop on match” is enabled.", + matchTimeoutHint: "The command will be terminated when the matching timeout is reached.", + hostNotExistCannotExec: "This host no longer exists. Select another host before running the command.", title: 'SSH Commands', hosts: 'Hosts', commands: 'Commands', @@ -719,6 +982,20 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { // Automation automation: { + displayQrCode: "Display QR code", + displayImage: "Display image", + programEffect: "Animation", + solidFill: "Solid color", + selectLedDeviceHint: "Select the LED device to control.", + ledConfig: "LED control settings", + variableLabel: "Variable:", + sshCmdHint: "Select a command configured on the SSH management page.", + sshCmdConfig: "SSH command settings", + resultVariableHint: "Store command output in this variable.", + fan: "Fan", + agxRestart: "Restart AGX", + cliPlaceholder: "e.g.: gpio --set 48 1", + cliConfig: "Console command settings", title: 'Automation Engine', status: 'Engine Status', sources: 'Data Sources', @@ -783,7 +1060,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { importRuleTitle: 'Import Rule Config', importRuleDesc: 'Select .tscfg config file to import rule', exportActionTitle: 'Export Action Template', - exportActionDesc: 'Export action {id} config as encrypted package', + exportActionDesc: 'Export the configuration for action {actionId} as an encrypted package', importActionTitle: 'Import Action Template', importActionDesc: 'Select .tscfg config file to import action template', packTypeSource: 'Data source', @@ -1116,7 +1393,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { configRestartRequired: 'Takes effect after restart', verifySuccess: 'Verification passed', importSuccess: 'Import successful', - keyGenerated: 'Key generated', + keyGenerated: 'Key “{name}” generated successfully.', keyDeployed: 'Key deployed', confirmTrigger: 'Confirm trigger?', triggerSuccess: 'Trigger successful', @@ -1142,7 +1419,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { serviceSuccess: 'Service {name} {action} successful', // Voltage protection voltageProtectionEnabled: 'Voltage protection enabled', - lowVoltageWarning: 'Low voltage warning: {voltage}V ({countdown}s)', + lowVoltageWarning: "Input voltage is low: {voltage} V. Shutdown countdown: {countdown} seconds.", voltageProtectionTriggered: 'Voltage protection triggered', voltageRecovering: 'Voltage recovering: {voltage}V', voltageProtectionDisabled: 'Voltage protection disabled', @@ -1172,7 +1449,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { firmwareWriteComplete: 'Firmware write complete!', webuiWriteComplete: 'WebUI write complete!', webuiUpgradeSkipped: 'WebUI upgrade skipped: {msg}', - nohupStripped: 'Auto-removed redundant nohup wrapper (backend adds it)', + nohupStripped: "Duplicate background execution parameters were removed. The system will run this command in the background.", saveCommandFailedMsg: 'Failed to save command: {msg}', deleteCommandFailedMsg: 'Failed to delete command: {msg}', fillServerInfo: 'Please fill in complete server information', @@ -1434,12 +1711,12 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { commandSuccess: 'Command executed successfully', commandMatchFailed: 'Command completed, pattern match failed', commandTimeout: 'Command execution timeout', - commandCompletedCode: 'Command completed, exit code: {code}', + commandCompletedCode: "The command did not complete successfully (exit code: {code}). Check its output.", execError: 'Execution error', execErrorMsg: 'Execution error: {msg}', commandCancelled: 'Command cancelled', hostFingerprintDeleted: 'Host fingerprint deleted', - hostInfoEmpty: 'Host information is empty', + hostInfoEmpty: "No connection settings are available for this host. Check its settings.", testingConnection: 'Testing connection to {host}...', cannotGetHostInfo: 'Cannot get host information', connectionSuccess: 'Connection to {host} successful!', @@ -1482,9 +1759,9 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { device: { agxRunning: 'AGX Running', agxStopped: 'AGX Stopped', - lpmuRunning: 'LPMU Running', - lpmuStopped: 'LPMU Stopped', - lpmuDetecting: 'Detecting Status', + lpmuRunning: "Network reachable", + lpmuStopped: "Network unreachable", + lpmuDetecting: "Check result unknown", lpmuUnknown: 'LPMU Status Unknown', lpmuOnlineHint: 'LPMU online (ping 10.10.99.99 reachable)\nClick to trigger power button', lpmuOfflineHint: 'LPMU offline (ping 10.10.99.99 unreachable)\nClick to trigger power button', @@ -1810,8 +2087,8 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { patternMatchSuccess: 'Pattern Match Success!', expectPatternMatch: 'Expect pattern matched: Yes', failPatternMatch: 'Fail pattern matched: Yes', - failMatchedTrue: 'true (error detected)', - failMatchedFalse: 'false', + failMatchedTrue: "A failure condition was detected", + failMatchedFalse: "No failure condition was detected", extractedContent: 'Extracted Content', cancelledExecution: 'Execution cancelled', error: 'Error', @@ -2813,8 +3090,8 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { unbindSuccess: 'Temperature variable unbound', unbindFailed: 'Unbind failed', dutyOrderError: 'Min duty cannot be greater than max duty', - hysteresisRangeError: 'Temperature hysteresis must be 0-20°C', - intervalRangeError: 'Min interval must be 500-30000 ms', + hysteresisRangeError: "The temperature change required to adjust fan speed (hysteresis) must be 0–20°C.", + intervalRangeError: "The minimum time between fan speed adjustments must be 0.5–30 seconds.", curveApplied: 'Fan {id} curve applied and saved', applyCurveFailed: 'Apply curve failed', curveExported: 'Fan {id} curve exported (local + SD {path})', @@ -3137,6 +3414,45 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { }, // PKI/Security Config + pkiRepair: { + "unknown": "Unknown / unconfirmed", + "none": "No device certificate", + "invalid": "Certificate cannot be parsed", + "time_unverified": "Validity: awaiting device time", + "not_yet_valid": "Validity: not yet valid", + "valid": "Within validity period", + "expired": "Validity: expired", + "stored": "Saved", + "missing": "Missing", + "key": "Private key", + "certificate": "Device certificate", + "clientCa": "Client verification CA", + "running": "Running", + "stopped": "Not running", + "restart": "Stored materials changed. The running service still uses the previous materials. Restart the device to apply; startup conditions must be met. Deleting stored credentials does not revoke the active instance.", + "activeFingerprint": "Active certificate SHA-256", + "deviceTime": "Device time", + "synced": "Synchronized", + "unsynced": "Not synchronized", + "timeUnknown": "Device time unavailable; retry refresh", + "syncBrowser": "Set device time from this computer (browser source)", + "empty": "Provide PEM text", + "saved": "Saved. Check validity and actual HTTPS status.", + "unconfirmed": "Installation result unconfirmed. Refresh status to check before retrying.", + "lessDay": "Expires in less than a day", + "expiredLessDay": "Expired less than a day ago", + "block_time_not_ready": "Device time not ready", + "block_private_key_missing": "Private key missing", + "block_private_key_invalid": "Private key invalid", + "block_certificate_missing": "Certificate missing", + "block_certificate_invalid": "Certificate invalid", + "block_key_mismatch": "Key mismatch", + "block_not_yet_valid": "Not yet valid", + "block_expired": "Expired", + "block_ca_missing": "Client verification CA missing", + "block_ca_invalid": "Client verification CA invalid", + "block_storage_error": "Storage uncertain; restart and check materials" +}, pkiPage: { signatureVerified: 'Signature verified', configImported: 'Config package imported', @@ -3193,6 +3509,10 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { // UI Dynamic Text ui: { + confirmDeleteRule: "Delete rule “{id}”? This cannot be undone.", + confirmDeleteSource: "Delete data source “{id}”? This cannot be undone.", + confirmDeleteAction: "Delete action template “{id}”?", + confirmDeleteFiles: "Delete the selected {count} files or folders? This cannot be undone.", // Language chinese: '中文', english: 'EN', diff --git a/components/ts_webui/web/js/lang/zh-CN.js b/components/ts_webui/web/js/lang/zh-CN.js index d9025ac..2249198 100644 --- a/components/ts_webui/web/js/lang/zh-CN.js +++ b/components/ts_webui/web/js/lang/zh-CN.js @@ -2,6 +2,261 @@ * TianShanOS WebUI - 简体中文语言包 */ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { + promptRepair: { + taskResults: '配置应用任务记录', + taskAttempt: '第 {attempt} 次:{path}', + retry: '重试', + pageLoadFailed: '页面加载失败,请重试。', + logoutConfirmed: "已在本地退出,服务端已响应退出请求。", + logoutLocal: "已清除本地登录信息,尚未确认服务端会话已结束。", + packRevalidate: "此配置包的验证结果已失效,请重新上传并验证。", + listRefreshFailed: "文件列表刷新失败,请手动刷新。已确认的上传结果不受影响。", + + "phase_PLATFORM": "平台初始化", + "phase_CORE": "核心服务", + "phase_HAL": "硬件访问层", + "phase_DRIVER": "设备驱动", + "phase_NETWORK": "网络服务", + "phase_SECURITY": "安全服务", + "phase_SERVICE": "应用服务", + "phase_UI": "用户界面", + + "forceOff": "强制关机", + "state_UNREGISTERED": "未注册", + "state_REGISTERED": "已注册", + "state_STARTING": "启动中", + "state_RUNNING": "运行中", + "state_STOPPING": "停止中", + "state_STOPPED": "已停止", + "state_ERROR": "发生错误", + "state_Running": "正在执行", + "state_Ready": "等待调度", + "state_Blocked": "等待资源或事件", + "state_Suspended": "已挂起", + "state_Deleted": "已删除", + + "settingsTitle": "{device} · 设置", + "viewVariables": "查看变量:{name}.*", + "ledServiceStatus": "检查 LED 服务状态", + "customColor": "自定义颜色", + "organization": "组织", + "wwwPartial": "固件已写入,但 WebUI 升级失败;尚未请求重启。", + "wwwRetry": "重试 WebUI 升级", + "variableCount": "{count} 个变量", + "variableExample": "例如:system.flag", + "valueExample": "例如:true、123、${other_var}", + "webhookConfig": "Webhook 配置", + "qrVariableHint": "文本或网址,支持 ${变量名}", + "noHosts": "暂无主机,请先在 SSH 页面添加。", + "noCommands": "该主机暂无命令,请在 SSH 页面添加。", + "chooseCommand": "请选择命令", + "chooseAction": "请选择动作模板", + "unknownFilter": "未知滤镜", + "colorRed": "红", + "colorOrange": "橙", + "colorYellow": "黄", + "colorGreen": "绿", + "colorCyan": "青", + "colorBlue": "蓝", + "colorPurple": "紫", + "colorWhite": "白", + "colorPink": "粉红", + "colorGray": "灰", + "filterFadeIn": "淡入", + "filterFadeOut": "淡出", + "filterColorShift": "色彩偏移", + + "keyVerified": "密钥“{id}”已部署到 {target},并已验证可使用公钥登录。", + "keyUnverified": "密钥“{id}”已部署到 {target},但尚未确认能否使用公钥登录。", + "packApplied": "配置包已应用。", + "filesSelected": "已选择 {count} 个文件", + "fileErrors": "{count} 个文件读取失败:{message}", + "packGenerated": "配置包已生成\n文件:{name}\n大小:{size} 字节;包含 {count} 个配置文件", + "orphanCount": "{count} 个命令关联的主机已不存在", + "orphanHost": "主机“{id}”不存在,请为命令重新选择主机或删除命令。", + "expectedLabel": "预期输出:", + "failureLabel": "失败条件:", + "extractLabel": "提取规则:", + "servicePattern": "服务就绪条件:{pattern}", + "waitEvent": "正在连接,等待事件:{event}", + "event": "事件", + "noEvent": "已建立会话,但未收到事件数据。", + "outputPreview": "输出:{output}", + "upgradeWritten": "升级文件已写入,正在请求设备重启。", + "rebootUnknown": "未收到重启确认。设备可能正在重启,请等待状态检查,不要重复操作。", + "horizontal": "横向", + "vertical": "纵向", + "diagonalRight": "对角 ↘", + "diagonalLeft": "对角 ↙", + "effect_rainbow": "彩虹", + "effect_breathing": "呼吸", + "effect_solid": "纯色", + "effect_sparkle": "闪烁", + "effect_pulse": "脉冲", + "effect_color_cycle": "颜色循环", + "effect_heartbeat": "心跳", + "effect_chase": "追逐", + "effect_comet": "彗星", + "effect_spin": "旋转", + "effect_breathe_wave": "呼吸波", + "effect_fire": "火焰", + "effect_rain": "雨滴", + "effect_coderain": "代码雨", + "effect_plasma": "等离子", + "effect_ripple": "涟漪", + "effect_unknown": "未知动画", + + "sshAccepted": "设备已受理执行请求,进程启动与就绪状态尚待确认。\n\n", + "sshCheckOutput": "请使用上方按钮查看日志或进程状态。\n", + "sshBegin": "--- 开始执行 ---\n", + "sshEnd": "\n--- 执行结束 ---\n", + "sshCancelOutput": "\n执行已取消。\n", + "noOutput": "(无输出)\n", + "serviceStoppedOutput": "服务已停止。\n", + "processStoppedOutput": "进程已停止。\n", + "tailStopped": "\n已停止实时跟踪。\n", + "matchSettings": "\n输出匹配设置:\n", + "stopOnMatch": " 检测到匹配后停止:是\n", + "modeFailed": "未能切换风扇模式。", + "noResponse": "未收到响应数据。", + "enterOtaPath": "请输入固件文件或所在目录的路径。", + "otaPathFailed": "无法读取 SD 卡升级文件,请检查文件路径。", + "wwwSibling": "请确认 www.bin 与固件文件位于同一目录。", + "startFailed": "未能启动操作。", + "webUploadFailed": "WebUI 文件上传失败。", + "firmwareDownloading": "正在下载固件…", + "firmwareStep": "[1/2] 固件 ", + "webUpgradeFailed": "WebUI 升级未完成:", + "hiddenPrefix": "[隐藏] ", + "officialSuffix": "(官方)", + "logFile": "日志文件:{path}\n", + "logFileSpaced": "\n日志文件:{path}\n", + "processKeyword": "进程关键词:{keyword}\n", + "sessionWaiting": "会话 ID:{id}\n正在等待输出…\n\n", + "expectedPattern": " 预期输出匹配:{pattern}\n", + "failurePattern": " 失败输出匹配:{pattern}\n", + "extractPattern": " 内容提取匹配:{pattern}\n", + "storedVariable": " 保存到变量:{name}.*\n", + "exitCode": "退出码:{code}\n", + "extractedLine": "提取内容:{value}\n", + "extractedBlock": "\n提取内容:\n{value}\n", + "sshError": "\n执行错误:{message}\n", + "executionFailed": "执行未完成:{message}\n", + "stopFailed": "未能确认服务已停止:{message}", + "firmwareMissing": "找不到固件文件:{path}", + "wwwMissing": "找不到 WebUI 文件:{path}", + "directoryUnreadable": "无法读取文件夹:{path}", + "firmwareDirMissing": "文件夹中没有固件 .bin 文件:{path}", + "wwwDirMissing": "找不到 WebUI 文件:{path}/www.bin", + "dnsFailed": "设备无法解析服务器地址:{host}", + "tcpFailed": "设备无法连接到服务器:{host}:{port}", + "httpFailed": "设备未能从服务器获取内容:{message}", + "httpStatus": "服务器返回错误(HTTP {status})。", + "downloadHttpStatus": "下载失败(HTTP {status})。", + "sshStopping": "进程仍在运行,正在请求强制停止…\n", + "stopUnconfirmed": "已发送强制停止请求,进程是否停止尚未确认。请检查进程状态。", + "credentials": "用户名或密码错误。", + "oldPassword": "当前密码错误,请重新输入。", + "sdUnavailable": "SD 卡尚未就绪,请检查插卡和挂载状态。", + "sdMounted": "SD 卡已经可以使用,无需重复挂载。", + "fileMissing": "找不到这个文件,请刷新文件列表。", + "directoryMissing": "找不到这个文件夹,请刷新文件列表。", + "rootDirectory": "不能删除存储根目录,请选择其中的文件或文件夹。", + "fileInfo": "无法读取文件信息。请检查存储设备后刷新列表。", + "unknownError": "操作未能完成。请查看详细原因。", + "invalidInput": "提交的信息不符合要求,请检查相关设置。", + "notFound": "找不到所需项目,请刷新列表检查它是否仍然存在。", + "permission": "当前账户没有执行此操作的权限。", + "busy": "设备正在处理其他操作,请等待当前操作结束。", + "timeout": "未在规定时间内收到完整响应,无法确认结果。请先检查当前状态。", + "resultUnknown": "未收到完整确认,操作结果未知。请先检查当前状态,不要重复执行。", + "memory": "设备可用内存不足,暂时无法完成操作。", + "internal": "设备处理请求时发生错误,请查看详细原因。", + "unsupported": "当前设备不支持此操作。", + "hardware": "设备未能完成硬件操作,请检查相关硬件状态。", + "connection": "无法连接到设备或目标服务,请检查网络连接。", + "auth": "身份验证未通过,请检查登录信息或重新登录。", + "invalidResponse": "设备返回的内容无法识别,操作结果未确认。", + "details": "详细原因:{detail}", + "deleteSummary": "删除结果:{success} 项成功,{fail} 项失败或未确认。", + "downloadSummary": "已向浏览器发起 {success} 项下载,{fail} 项未能发起。请在浏览器中确认保存结果。", + "uploadSummary": "上传结果:{success} 项已上传,{fail} 项失败或未确认;{invalid} 个配置包未通过验证。上传不代表配置已应用。", + "ledSummary": "关闭灯光结果:{success} 项成功,{fail} 项失败或未确认。", + "uploaded": "文件已上传。", + "packVerified": "已上传,签名验证通过;尚未应用。", + "packInvalid": "文件已上传,但配置包验证未通过,不能应用。", + "downloadStarted": "已向浏览器发起下载,请在浏览器中确认保存结果。", + "hiddenNetwork": "隐藏网络", + "wifiPassword": "请输入“{ssid}”的密码;开放网络可留空:", + "logConnected": "实时日志连接已建立", + "logDisconnected": "实时日志连接已断开,等待重新连接", + "sshSubmissionUnknown": "未收到命令受理确认,无法确定是否已经提交。请查看日志或进程状态,不要直接重复执行。", + "sshDiagnostics": "返回状态:{status};退出码:{code}", + "sshUnknown": "无法确认命令结果,请查看输出和状态详情。", + "sshTimeout": "命令执行超时,请查看输出确认实际执行情况。", + "sshCancelled": "命令执行已取消。", + "sshFailureOutput": "命令输出命中了配置的失败条件,请查看输出。", + "sshExpectedMissing": "命令已结束,但未检测到配置的预期输出。", + "sshExpectedFound": "已检测到预期输出,等待最终执行结果。", + "sshFailed": "命令执行失败,请查看输出和退出码。", + "sshSuccess": "命令执行成功。", + "lpmuProbeFailed": "LPMU 网络检测失败,电源状态未知。", + "lpmuReachable": "LPMU 网络可达;此检测不能确认电源状态。", + "lpmuUnreachable": "LPMU 网络不可达,无法据此确认是否已关机。", + "retry": "重试", + "terminalLoadFailed": "终端组件加载失败。请检查网络后重试。", + "terminalRestoring": "正在恢复终端会话,请等待连接确认。", + "terminalRestored": "终端会话已恢复;之前的命令未自动重发。", + "terminalRestoreTimeout": "终端会话恢复超时,尚未确认连接。", + "terminalRestoreFailed": "终端会话未能恢复,请重新连接。", + "noInitialColor": "没有可恢复的初始颜色配置。", + "serviceStarted": "服务“{name}”已启动。", + "serviceStopped": "服务“{name}”已停止。", + "serviceRestarted": "服务“{name}”已重启。", + "ruleCreated": "规则“{id}”已创建。", + "ruleUpdated": "规则“{id}”已更新。" +}, + + runtimeRepair: { + configLoading: '配置正在加载,请稍后刷新。', + confirmFingerprint: '请通过可信渠道核对以下服务器指纹。确认信任此指纹并继续连接?', + saved: '已保存', + "showDashboard": "在首页显示", + "allowManual": "允许手动执行", + "conditionsPreserved": "手动模式保留自动条件,切回自动后从下一次评估开始生效。", + "saveFailed": "保存失败,草稿已保留", + "saveUnknown": "保存结果未确认,请重新读取核对,勿重复提交。", + "mirrorWarning": "已保存,但备用副本未同步;请勿移除 SD 卡。", + "revision_conflict": "配置已被其他操作修改,请重新读取后合并草稿。", + "source_read_only": "此配置来源当前只读,未修改原文件。", + "recovery_required": "配置需要恢复核对,自动执行已暂停。", + "commit_unknown": "保存结果未确认,需要恢复核对。", + "execution_busy": "规则正在执行,当前操作不可用。", + "service_busy": "服务正在运行或状态未确认,请先核实并停止服务。", + "busy_retired_config": "旧配置仍在使用,请稍后重试。", + "disabled": "已禁用", + "manual": "手动", + "automatic": "自动", + "referenceUnresolved": "引用尚未解析", + "unknown": "状态未确认", + "running": "进程运行中", + "ready": "已匹配就绪日志", + "checking": "正在检查就绪日志", + "starting": "正在启动", + "stopping": "正在停止", + "stopped": "进程已确认停止", + "failed": "匹配到失败日志", + "timeout": "就绪检查超时", + "lastKnown": "上次状态", + "confirmedAt": "上次确认(开机后)", + "stateEvidence": "状态依据", + "startBlocked": "当前不允许启动:请检查启用、手动权限及服务状态。", + "outcomeUnknown": "远端结果未确认,可能仍在运行。请查询核实后再操作。", + "confirmStop": "确认停止远端服务?", + "confirmStopAutomatic": "确认停止远端服务?自动规则仍启用且条件满足时,下一次评估可能再次启动。若需保持停止,请先禁用自动规则。", + "refresh_required": "页面版本过旧,请刷新后编辑。" +}, + // 通用 common: { confirm: '确认', @@ -257,7 +512,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { lpmu: 'LPMU', agxRunning: 'AGX 运行中', agxStopped: 'AGX 已关闭', - lpmuDetecting: 'LPMU 检测中', + lpmuDetecting: "检测结果未知", usbMux: 'USB 切换', widgetManager: '组件管理', @@ -307,21 +562,21 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { agxPowerOnSuccess: 'AGX 已上电', agxPowerOffSuccess: 'AGX 已断电', agxPowerFail: 'AGX 操作失败', - lpmuRunning: 'LPMU 运行中', - lpmuStopped: 'LPMU 已关闭', - lpmuOnlineTitle: 'LPMU 在线 (ping 10.10.99.99 可达)\n点击触发电源按钮', - lpmuOfflineTitle: 'LPMU 离线 (ping 10.10.99.99 不可达)\n点击触发电源按钮', + lpmuRunning: "网络可达", + lpmuStopped: "网络不可达", + lpmuOnlineTitle: "LPMU 网络可达;此检测不能确认电源状态。", + lpmuOfflineTitle: "LPMU 网络不可达,无法据此确认是否已关机。", lpmuDetectingTitle: '正在检测 LPMU 状态...\n最多等待 80 秒', - lpmuUnknownTitle: 'LPMU 状态未知\n点击触发电源按钮', + lpmuUnknownTitle: "LPMU 网络检测失败,电源状态未知。", statusFetching: '状态获取中', lpmuTriggerConfirm: '确定要触发 LPMU 电源按钮吗?\n\n这将发送一个脉冲信号,效果类似按物理电源按钮。', lpmuTriggering: 'LPMU 电源触发中...', lpmuTriggerSuccess: 'LPMU 电源已触发,开始检测状态...', lpmuTriggerFail: 'LPMU 触发失败', - lpmuOnlineSuccess: 'LPMU 已上线', - lpmuOfflineSuccess: 'LPMU 已关闭', - lpmuStartupTimeout: 'LPMU 开机检测超时,认定为已关闭', - lpmuShutdownTimeout: 'LPMU 关机检测超时,设备可能仍在运行' + lpmuOnlineSuccess: "LPMU 网络可达;此检测不能确认电源状态。", + lpmuOfflineSuccess: "LPMU 网络不可达,无法据此确认是否已关机。", + lpmuStartupTimeout: "LPMU 网络不可达,无法据此确认是否已关机。", + lpmuShutdownTimeout: "LPMU 网络可达;此检测不能确认电源状态。" }, // 风扇控制 @@ -1087,7 +1342,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { serviceSuccess: '服务 {name} {action} 成功', // 电压保护 voltageProtectionEnabled: '电压保护已启用', - lowVoltageWarning: '低电压警告: {voltage}V ({countdown}s)', + lowVoltageWarning: "输入电压过低:{voltage} V,关机倒计时剩余 {countdown} 秒。", voltageProtectionTriggered: '电压保护已触发', voltageRecovering: '电压恢复中: {voltage}V', voltageProtectionDisabled: '电压保护已禁用', @@ -1117,7 +1372,7 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { firmwareWriteComplete: '固件写入完成!', webuiWriteComplete: 'WebUI 写入完成!', webuiUpgradeSkipped: 'WebUI 升级跳过: {msg}', - nohupStripped: '已自动去除命令中多余的 nohup 包装(后端会自动添加)', + nohupStripped: "已移除重复的后台运行参数,系统会自动在后台执行此命令。", saveCommandFailedMsg: '保存指令失败: {msg}', deleteCommandFailedMsg: '删除指令失败: {msg}', fillServerInfo: '请填写完整的服务器信息', @@ -1416,12 +1671,12 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { commandSuccess: '命令执行成功', commandMatchFailed: '命令执行完成,模式匹配失败', commandTimeout: '命令执行超时', - commandCompletedCode: '命令执行完成,退出码: {code}', + commandCompletedCode: "命令未成功完成,退出码:{code}。请查看命令输出。", execError: '执行出错', execErrorMsg: '执行出错: {msg}', commandCancelled: '命令已取消', hostFingerprintDeleted: '已删除主机指纹', - hostInfoEmpty: '主机信息为空', + hostInfoEmpty: "没有找到此主机的连接配置,请检查主机设置。", testingConnection: '正在测试连接 {host}...', cannotGetHostInfo: '无法获取主机信息', connectionSuccess: '连接 {host} 成功!', @@ -1465,9 +1720,9 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { device: { agxRunning: 'AGX 运行中', agxStopped: 'AGX 已关闭', - lpmuRunning: 'LPMU 运行中', - lpmuStopped: 'LPMU 已关闭', - lpmuDetecting: '状态获取中', + lpmuRunning: "网络可达", + lpmuStopped: "网络不可达", + lpmuDetecting: "检测结果未知", lpmuUnknown: 'LPMU 状态未知', lpmuOnlineHint: 'LPMU 在线 (ping 10.10.99.99 可达)\n点击触发电源按钮', lpmuOfflineHint: 'LPMU 离线 (ping 10.10.99.99 不可达)\n点击触发电源按钮', @@ -1793,8 +2048,8 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { patternMatchSuccess: '模式匹配成功!', expectPatternMatch: '期望模式匹配: 是', failPatternMatch: '失败模式匹配: 是', - failMatchedTrue: 'true (检测到错误)', - failMatchedFalse: 'false', + failMatchedTrue: "已检测到失败条件", + failMatchedFalse: "未检测到失败条件", extractedContent: '提取内容', cancelledExecution: '已取消执行', error: '错误', @@ -2798,8 +3053,8 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { unbindSuccess: '温度变量绑定已解除', unbindFailed: '解绑失败', dutyOrderError: '最小占空比不能大于最大占空比', - hysteresisRangeError: '温度迟滞必须在 0-20°C 范围内', - intervalRangeError: '最小间隔必须在 500-30000ms 范围内', + hysteresisRangeError: "调速温差(温度迟滞)必须在 0–20°C 范围内。", + intervalRangeError: "两次调速的最小间隔必须在 0.5–30 秒之间。", curveApplied: '风扇 {id} 曲线已应用并保存', applyCurveFailed: '应用曲线失败', curveExported: '风扇 {id} 曲线配置已导出(本地 + SD 卡 {path})', @@ -3122,6 +3377,45 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { }, // PKI/安全配置 + pkiRepair: { + "unknown": "未知/待确认", + "none": "未安装设备证书", + "invalid": "证书无法解析", + "time_unverified": "有效期:待校时确认", + "not_yet_valid": "有效期:尚未生效", + "valid": "有效期:当前在有效期内", + "expired": "有效期:已过期", + "stored": "已保存", + "missing": "缺少", + "key": "私钥", + "certificate": "设备证书", + "clientCa": "客户端验证 CA", + "running": "运行中", + "stopped": "未运行", + "restart": "存储材料已变更。运行中的服务仍使用旧材料;请重启设备以应用。新材料须满足启动条件,删除凭证不等于在线吊销。", + "activeFingerprint": "活动证书 SHA-256", + "deviceTime": "设备时间", + "synced": "已同步", + "unsynced": "未同步", + "timeUnknown": "设备时间读取失败,请刷新重试", + "syncBrowser": "用当前电脑时间校时(来源:浏览器)", + "empty": "请输入 PEM 内容", + "saved": "已保存,请查看有效期和 HTTPS 实际状态。", + "unconfirmed": "未能确认安装结果,请刷新状态核对后再决定是否重试。", + "lessDay": "不到 1 天后过期", + "expiredLessDay": "已过期不足 1 天", + "block_time_not_ready": "设备时间未就绪", + "block_private_key_missing": "缺少私钥", + "block_private_key_invalid": "私钥异常", + "block_certificate_missing": "缺少设备证书", + "block_certificate_invalid": "设备证书异常", + "block_key_mismatch": "证书与密钥不匹配", + "block_not_yet_valid": "证书尚未生效", + "block_expired": "证书已过期", + "block_ca_missing": "缺少客户端验证 CA", + "block_ca_invalid": "客户端验证 CA 异常", + "block_storage_error": "存储结果不确定,请重启后核对材料" +}, pkiPage: { signatureVerified: '签名验证通过', configImported: '配置包已导入', diff --git a/components/ts_webui/web/js/router.js b/components/ts_webui/web/js/router.js index 16d762e..256f1c5 100644 --- a/components/ts_webui/web/js/router.js +++ b/components/ts_webui/web/js/router.js @@ -7,6 +7,9 @@ class Router { constructor() { this.routes = {}; this.currentPage = null; + this.appReady = false; + this.startupStarted = false; + this.navigation = null; // 需要 root 权限的页面(终端、自动化、指令) this.rootOnlyPages = ['/terminal', '/automation', '/commands']; @@ -15,7 +18,9 @@ class Router { this.publicPages = []; // 暂时没有公开页面 window.addEventListener('hashchange', () => this.navigate()); - window.addEventListener('load', () => this.navigate()); + window.addEventListener('load', () => this.start()); + window.addEventListener('languageReady', () => this.start()); + window.addEventListener('appReady', () => { this.appReady = true; this.start(); }); } register(path, loader) { @@ -42,27 +47,45 @@ class Router { return { allowed: true }; } - navigate(path = null) { - if (path) { + start() { + if (this.startupStarted || !this.appReady || !window.i18n?.isReady()) return; + this.startupStarted = true; + const pending = this.navigate(); + const navigation = this.navigation; + return pending.then(ok => { + if (!ok && this.navigation === navigation) this.startupStarted = false; + }); + } + + async navigate(path = null) { + if (path && (window.location.hash.slice(1) || '/') !== path) { window.location.hash = path; - return; - } - - let hash = window.location.hash.slice(1) || '/'; - - // 页面切换前的清理 - 停止定时器等 - if (typeof stopDeviceStateMonitor === 'function') { - stopDeviceStateMonitor(); - } - // 取消系统页快捷操作定时器,避免切走后仍触发 refreshQuickActions - if (typeof stopSystemPageTimers === 'function') { - stopSystemPageTimers(); + return false; } - // 离开终端页时主动断开 WebSocket,避免 1006 异常关闭 - if (typeof destroyWebTerminal === 'function') { - destroyWebTerminal(); - } - + if (!this.appReady || !window.i18n?.isReady()) return false; + const hash = window.location.hash.slice(1) || '/'; + // Dispose synchronously before the next loader starts. A late loader never + // runs global cleanup and cannot dispose resources belonging to its successor. + this.navigation?.dispose(); + const disposers = []; + const navigation = { + active: true, + isCurrent: () => this.navigation === navigation && navigation.active, + onDispose: fn => { if (navigation.active) disposers.push(fn); else fn(); }, + dispose: () => { + if (!navigation.active) return; + navigation.active = false; + for (const fn of disposers) fn(); + } + }; + this.navigation = navigation; + navigation.onDispose(() => { + if (typeof stopDeviceStateMonitor === 'function') stopDeviceStateMonitor(); + if (typeof stopSystemPageTimers === 'function') stopSystemPageTimers(); + if (typeof stopDataWidgetsAutoRefresh === 'function') stopDataWidgetsAutoRefresh(); + if (typeof stopNetworkLpmuAccessPolling === 'function') stopNetworkLpmuAccessPolling(); + if (typeof destroyWebTerminal === 'function') destroyWebTerminal(); + }); // 检查访问权限 const access = this.checkAccess(hash); if (!access.allowed) { @@ -96,7 +119,21 @@ class Router { const loader = this.routes[hash] || this.routes['/']; if (loader) { this.currentPage = loader; - loader(); + try { + await loader(); + return navigation.isCurrent(); + } catch (error) { + if (!navigation.isCurrent()) return false; + navigation.dispose(); + const content = document.getElementById('page-content'); + content.replaceChildren(); + const message = document.createElement('p'); message.textContent = t('promptRepair.pageLoadFailed'); + const retry = document.createElement('button'); retry.textContent = t('promptRepair.retry'); + retry.onclick = () => this.navigate(); + content.append(message, retry); + console.error('Page initialization failed:', error); + return false; + } } } diff --git a/components/ts_webui/web/js/terminal.js b/components/ts_webui/web/js/terminal.js index 8b4475a..0f66d25 100644 --- a/components/ts_webui/web/js/terminal.js +++ b/components/ts_webui/web/js/terminal.js @@ -10,36 +10,30 @@ const _xtermReady = (function() { let _promise = null; - function loadCSS(href) { - return new Promise(function(resolve, reject) { - if (document.querySelector('link[href="' + href + '"]')) { resolve(); return; } - var link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = href; - link.onload = resolve; - link.onerror = reject; - document.head.appendChild(link); - }); - } - function loadScript(src) { - return new Promise(function(resolve, reject) { - if (document.querySelector('script[src="' + src + '"]')) { resolve(); return; } - var s = document.createElement('script'); - s.src = src; - s.onload = resolve; - s.onerror = reject; - document.head.appendChild(s); + function loadResource(url, css) { + return new Promise((resolve, reject) => { + const selector = css ? 'link[href="' + url + '"]' : 'script[src="' + url + '"]'; + const existing = document.querySelector(selector); + if (existing?.dataset.ready === 'true') { resolve(); return; } + if (existing) existing.remove(); + const node = document.createElement(css ? 'link' : 'script'); + if (css) { node.rel = 'stylesheet'; node.href = url; } else node.src = url; + const timer = setTimeout(() => finish(false), 15000); + function finish(ok) { + clearTimeout(timer); node.onload = node.onerror = null; + if (ok) { node.dataset.ready = 'true'; resolve(); } + else { node.remove(); reject(new Error('Terminal resource unavailable: ' + url)); } + } + node.onload = () => finish(true); node.onerror = () => finish(false); + document.head.appendChild(node); }); } - return function ensureXtermLoaded() { if (_promise) return _promise; - if (typeof Terminal !== 'undefined' && typeof FitAddon !== 'undefined') { - return (_promise = Promise.resolve()); - } - _promise = loadCSS('https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css') - .then(function() { return loadScript('https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.min.js'); }) - .then(function() { return loadScript('https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.min.js'); }); + _promise = loadResource('https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css', true) + .then(() => loadResource('https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.min.js', false)) + .then(() => loadResource('https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.min.js', false)) + .catch(error => { _promise = null; throw error; }); return _promise; }; })(); @@ -60,6 +54,9 @@ class WebTerminal { // SSH Shell 模式 this.sshMode = false; this.sshConnecting = false; + this.restoring = false; + this.restoreTimer = null; + this.destroyed = false; } /** @@ -73,7 +70,18 @@ class WebTerminal { } // 按需加载 xterm.js(首次访问终端页面时从 CDN 拉取) - await _xtermReady(); + try { await _xtermReady(); } + catch (error) { + if (this.destroyed) return false; + console.error(error); + container.replaceChildren(); + const message = document.createElement('p'); message.textContent = t('promptRepair.terminalLoadFailed'); + const retry = document.createElement('button'); retry.className = 'btn'; retry.textContent = t('promptRepair.retry'); + retry.onclick = () => loadTerminalPage(); + container.append(message, retry); + return false; + } + if (this.destroyed) return false; // 创建 xterm.js 终端 this.terminal = new Terminal({ @@ -297,6 +305,7 @@ class WebTerminal { * 连接到 WebSocket */ connect() { + if (this.destroyed) return; const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const wsUrl = `${protocol}//${window.location.host}/ws`; @@ -328,6 +337,7 @@ class WebTerminal { this.ws.onclose = (event) => { console.log('Terminal WebSocket disconnected, code:', event.code); this.connected = false; + if (this.restoring) this.finishRestore(false); // 清除心跳 if (this.pingInterval) { @@ -341,7 +351,7 @@ class WebTerminal { if (event.code !== 1000) { // 非正常关闭 this.writeln('\x1b[33m' + (typeof t === 'function' ? t('terminal.reconnectIn') : '5秒后尝试重新连接...') + '\x1b[0m'); const tryReconnect = () => { - if (this.connected) return; + if (this.destroyed || this.connected) return; if (document.visibilityState !== 'visible') { document.addEventListener('visibilitychange', function handler() { document.removeEventListener('visibilitychange', handler); @@ -365,9 +375,18 @@ class WebTerminal { /** * 处理 WebSocket 消息 */ + finishRestore(ok, timeout = false) { + clearTimeout(this.restoreTimer); this.restoreTimer = null; + this.restoring = false; + const key = ok ? 'terminalRestored' : timeout ? 'terminalRestoreTimeout' : 'terminalRestoreFailed'; + this.writeln(t('promptRepair.' + key)); + showToast(t('promptRepair.' + key), ok ? 'success' : 'warning'); + } + handleMessage(msg) { switch (msg.type) { case 'connected': + if (this.restoring) this.finishRestore(true); this.connected = true; this.prompt = msg.prompt || 'tianshan> '; this.writeln('\x1b[1;32m' + (typeof t === 'function' ? t('terminal.connected') : '已连接到设备') + '\x1b[0m'); @@ -391,10 +410,14 @@ class WebTerminal { case 'error': { const errMsg = msg.message || (typeof t === 'function' ? t('terminal.unknownError') : '未知错误'); if (errMsg.indexOf('Not a terminal session') >= 0 && this.ws && this.ws.readyState === WebSocket.OPEN) { - this.ws.send(JSON.stringify({ type: 'terminal_start' })); - const toast = typeof showToast === 'function' ? showToast : function(m) { console.log(m); }; - toast(typeof t === 'function' ? t('terminal.sessionRestored') : '会话已恢复,请重试', 'success'); + if (!this.restoring) { + this.restoring = true; this.connected = false; + this.ws.send(JSON.stringify({type: 'terminal_start'})); + showToast(t('promptRepair.terminalRestoring'), 'info'); + this.restoreTimer = setTimeout(() => this.finishRestore(false, true), 10000); + } } else { + if (this.restoring) this.finishRestore(false); this.writeln('\x1b[1;31m' + (typeof t === 'function' ? t('terminal.errorLabel') : '错误') + ': ' + errMsg + '\x1b[0m'); this.writePrompt(); } @@ -686,6 +709,7 @@ class WebTerminal { * 断开连接 */ disconnect() { + clearTimeout(this.restoreTimer); this.restoring = false; // 清除心跳 if (this.pingInterval) { clearInterval(this.pingInterval); @@ -707,6 +731,7 @@ class WebTerminal { * 销毁终端 */ destroy() { + this.destroyed = true; this.disconnect(); if (this.terminal) { this.terminal.dispose(); diff --git a/docs/CERTIFICATE_FIX_REPORT.md b/docs/CERTIFICATE_FIX_REPORT.md new file mode 100644 index 0000000..47500ab --- /dev/null +++ b/docs/CERTIFICATE_FIX_REPORT.md @@ -0,0 +1,254 @@ +# 证书修复实施与验收报告 + +日期:2026-09-23。工作区 `/Users/massif/TianshanOS`,分支 `main`,HEAD +`d6ed947a592265fa12754828bc79803fc50c1db2`。本报告描述该 HEAD 上的**未提交补丁**, +不是已部署版本;没有 commit、push、PR、真实 CA 操作、设备连接、刷写或重启。 + +开始时仅 `output/`、`tmp/` 是已有未跟踪目录,保留未动。仓库中没有找到额外 +AGENTS.md。已读取 README 构建说明及用户提供的完整修复方案。 +实际 SDK 为 ESP-IDF 5.5.2、目标 ESP32-S3,SDK 内 mbedTLS 为 **3.6.5**(不是方案引用的 +在线 3.6.1 文档版本);未升级 SDK、修改分区、调整权限或关闭 mTLS 验证。 + +## 交付状态 + +- 完成安装长度/边界、请求局部错误、缓存与快照互斥、UTC、元数据缓存、材料版本、 + 校时/材料通知、局部协调与有界重试、真实 TLS 运行态、待应用展示、自动注册适配。 +- 宿主测试通过;采用真实 SDK mbedTLS/cJSON,平台功能使用替身,业务代码用 ASan/UBSan。 +- ESP32-S3 固件和 WebUI 构建通过,实际命令及尺寸见后文。 +- **实机 Web 安装、TLS 握手、重启恢复与资源测量未执行。不能据此宣称生产可发布。** +- **用户已批准的范围补充:**修正通用服务管理器吞掉停止错误的问题。 + `stop_service_internal()` 失败时返回原错误、恢复原状态、不发送停止成功事件; + `ts_service_restart()` 也不会把运行中服务的停止失败当成可忽略的状态错误。 + `tests/certificate/test_service_stop.sh` 先从 HEAD 复现旧错误,再测试当前真实函数: + 一般失败、超时、状态错误均阻止重启;正常停止、重复停止与正常重启通过。 + 共享回调已静态核查:正常返回成功的流程不变;返回失败的服务不再被假标为已停止。 + 保留管理状态不代表能撤销其他模块内部的部分操作,其他服务实机故障未逐个注入。 + +## F1–F12 基线核对 + +所有问题在当前 HEAD 均仍存在,没有复用“已部署修复”的历史假设。 + +| 项目 | 基线核对 | 本轮处理 | +|---|---|---| +| F1 | 两个 Web 安装入口遗漏 NUL 长度 | 均改为实际内容长度 + 1 | +| F2 | 自动注册、CLI 已正确包含 NUL | 不再加一;全调用面核对 | +| F3 | 缺私钥与不匹配共用错误码 | `_ex` 请求局部错误;保留旧函数包装 | +| F4 | 页面忽略 error、PKI 翻译键错位 | 证书局部提取,键存在性回退,纯文本显示 | +| F5 | 浏览器校时没有通知 | 与 NTP 共用通知;失败不通知,丢事件可被兜底发现 | +| F6 | HTTPS 一次性 pending_init | 单一串行任务、两类事件、5 秒轻量检查 | +| F7 | 活动 HTTPS 复制材料 | 一致性拥有型快照;活动指纹与存储版本分开 | +| F8 | mktime、本地时区、未初始化 tm | 纯公历 UTC 算法;两个 HTTPS 时间消费者同步适配 | +| F9 | 读取缓存派生状态、刷新写 NVS | 静态元数据缓存;每次状态采样一次 now,派生状态不写 Flash | +| F10 | 32 字节序列号可溢出 serial[64] | serial[65]、有界编码、截断标志 | +| F11 | HTTPS 不是整套 WebUI | 验收端点仍为现有身份/权限 API | +| F12 | 通用 RUNNING 不代表实际监听 | cert.status 独立公开完整启动后的真实状态;停止失败正确传播,重启不继续 | + +本次没有在修复前建立完整的红灯测试基线;上述是源码证据,不冒充修复前实机复现。 +实施中故障测试曾发现“相同 PEM 幂等路径绕过损坏私钥检查”,已修复并保留回归用例。 + +## 文件与行为对应 + +| 文件 | 主要符号/用途 | 兼容边界 | +|---|---|---| +| `components/ts_cert/include/ts_cert.h` | 追加状态/validity/error、snapshot、generation | 原枚举 0..5 不变;原 esp_err_t 安装入口保留;新结构需全量重编译 | +| `components/ts_cert/src/ts_cert.c` | `install_material`、`info_from_crt`、`refresh_metadata`、`ts_cert_get_snapshot` | 原 NVS namespace/键不变;不把多键 set/erase 当事务 | +| `components/ts_cert/include/ts_cert_time.h`、`src/ts_cert_time.c` | `ts_cert_time_utc`、`ts_cert_time_days`、`ts_cert_hex` | 纯 C、无 TZ/全局时钟副作用;支持年份 1..9999 | +| `components/ts_api/src/ts_api_cert.c` | 两个 install、`add_validity`、`add_runtime` | 保留 code/error/data 协议、路径和权限;只增加字段 | +| `components/ts_core/ts_event/include/ts_event.h` | PKI 材料变更事件 | 小型 generation/kind 数据,不携带 PEM/指针 | +| `components/ts_net/src/ts_time_sync.c` | `notify_clock_updated`、UTC readiness | 继续使用原最小年份与原时间源策略,不声称时间经过认证 | +| `main/ts_services.c`、`main/ts_https_retry.h` | `https_coordinator`、串行启停、重试策略 | 不调用管理器重入自身;普通 GET/重复通知不重置预算 | +| `components/ts_core/ts_service/src/ts_service.c` | `stop_service_internal`、`ts_service_restart` | 用户批准的共享管理器最小修正;失败返回原错误,阻止假重启 | +| `components/ts_https/include/ts_https.h`、`src/ts_https.c` | runtime 快照、完整启动后发布、失败保留所有权 | 活动材料只在显式停止/重启后切换;非 mTLS 配置不强加 CA | +| `components/ts_https/src/ts_https_auth.c` | UTC 剩余天数 | 不改角色/权限策略 | +| `components/ts_pki_client/src/ts_pki_client.c` | 已有材料保留、安装返回值、协作取消 | 待校时/尚未生效不触发重新签发;缺 CA 不重新申请设备证书 | +| `components/ts_console/commands/ts_cmd_pki.c` | 新时间状态和容量提示 | 文件读取仍传 read_len+1;不再把所有无效状态写成 Expired | +| `components/ts_webui/web/js/app.js` | `certError`、`installCertMaterial`、`refreshCertStatus` | code===0 才成功;丢响应显示未确认,不自动重发 POST | +| `components/ts_webui/web/js/lang/{zh-CN,en-US}.js` | `pkiRepair` 文案 | 两种语言覆盖;缺新增字段的旧固件显示未知,不推断运行 | +| `components/{ts_cert,ts_api}/CMakeLists.txt` | 新源文件、API 私有 HTTPS 依赖 | ts_cert 不依赖 WebUI/API/main,无 SDK 变更 | +| `tests/certificate/` | 可运行宿主测试、临时夹具生成、生产函数提取 | 测试注入不进入生产 API | + +锁顺序为:材料锁内读写缓存/RNG/NVS与元数据 → 解锁 → 发布事件。HTTPS 获取自己的 +精确长度快照后才启动 TLS;不会持材料锁等待网络或服务管理器。CA 的小型 SD 副本写入 +仍串行处理,写入/关闭失败只是警告,不改变 NVS 保存成功结论。 + +NVS set/commit 或多键操作异常后进入 `storage_error`,旧 RAM 材料不被冒充为新保存结果, +阻止新的 TLS 加载;请重启后读回并检查实际存储。既有活动实例可继续运行,其版本与 +指纹仍来自自己的快照。这里没有断电跨键回滚保证,也不会自动清空 NVS。 + +长度契约仅适用于本轮 PEM 文本:已知跨度包含最后一个 NUL,跨度内无提前 NUL。 +两个安装容量均为 4000 字节含 NUL;4096 缓冲宏未改。JSON 解码后 cJSON 的 C 字符串 +不能保留原始 `\u0000` 后缀语义,本轮不声称 strlen 能检出该原始后缀。 + +## 调用者审查 + +| 调用来源 | 缓冲/长度 | 结论 | +|---|---|---| +| Web `api_cert_install` / `api_cert_install_ca` | cJSON 拥有的终止字符串;strlen+1 | 修正长度;底层再次检查边界 | +| CLI `cmd_pki_install` | malloc(file_size+1),fread 后补 NUL;read_len+1 | 保持正确长度;文件内容上限 3999 | +| 自动批准 `ts_pki_client_submit_csr` | cJSON 字符串;strlen+1 | 长度原本正确;新增设备证书/CA 结果检查 | +| 下载 `ts_pki_client_install_certificate` | cJSON 字符串;strlen+1 | CA 失败或缺失不能报全流程完成 | +| 配置包签名者 `ts_config_pack` | PEM 文本;strlen+1 | 无需更改;没有改变配置包授权或用途规则 | +| `ts_cert_get_info` | 以前重复解析缓存;现在读取元数据 | 不暴露材料指针,不重复解析 | +| HTTPS `load_certificates` | 一次一致性快照,精确大小副本 | 替代三次独立读取;活动指纹取叶证书 DER SHA-256 | + +搜索未发现 `ts_cert_info_t` 作为未经版本化二进制结构写入持久化存储。 + +## 实际执行证据 + +宿主命令:`./tests/certificate/run_host.sh`,退出码 0。结果: + +```text +PASS UTC/serial bounds and bounded retry/control policy +PASS material: real SDK mbedTLS, mocked NVS/allocation/events, state/time/concurrent snapshots +PASS UI: error typing, bilingual/fallback, text output, uncertain POST, button recovery, refresh separation +PASS actual HTTPS lifecycle: init/start/URI/stop failures, retained ownership, duplicate start, loaded generation, optional CA +PASS actual coordinator with simulated scheduler: fallback, duplicate events, bounded retries, stop intent, explicit restart, stage errors +PASS actual cert API handlers: JSON validation, PEM installation, business errors, additive status, active/stored separation +PASS actual time notifications/UTC readiness and cooperative enrollment stop (syscalls/tasks mocked) +REPRODUCED manager stop bug: callback failure becomes success/stopped +PASS manager stop/restart: failed stop retained, restart aborted, successful/duplicate stop unchanged +``` + +Node `--check` 验证 app.js 与两种语言资源;`git diff --check` 验证补丁空白。 +宿主测试使用 Command Line Tools 的 clang,应用代码开启 ASan/UBSan;SDK mbedTLS +宿主库没有 sanitizer 插桩,也未使用 ESP32 的硬件加速配置。 + +目标构建: + +```sh +. /Users/massif/esp/v5.5.2/esp-idf/export.sh +export IDF_PYTHON_ENV_PATH=/Users/massif/.espressif/python_env/idf5.5_py3.12_env +export PATH="$IDF_PYTHON_ENV_PATH/bin:$PATH" +./tools/build.sh +``` + +使用已有 Python 3.12 构建配置。最初 export 选择 3.14,与现有 CMake 配置不符;随后 +改为命令局部的 3.12 环境。沙箱禁止 psutil 的 sysctl 进程读取,批准放开本地构建后继续。 +没有 fullclean、重配目标、改变全局 PATH、修改 Xcode 许可或绕过 SDK 安全配置。 + +第一次编译发现 `_Atomic TaskHandle_t*` 不能传给 FreeRTOS 的普通输出参数,改为普通 +句柄与原子运行/取消标记;后续目标编译通过。宿主曾发现相同 PEM 的私钥检查回归并修复。 +这些失败不被隐藏为“第一次就全绿”。最终构建退出码 0,版本 `0.5.1+d6ed947d.09232301`(未提交源码的本地构建)。 +Node v24.10.0,Apple clang 21.0.0。优化后的 app.js 通过语法检查,gzip 解压内容与 +优化文件一致。应用分区 3,145,728 字节,剩余 988000 字节(约 31%)。 + +| 产物 | 原有构建产物字节 | 本轮字节 | 差值 | SHA-256 | +|---|---:|---:|---:|---| +| TianShanOS.bin | 2154096 | 2157728 | +3632 | `7f80532700f622abc7b46cbf2e7f314e35b0332a5aa3204fe6195404613ff0e5` | +| www.bin | 3145728 | 3145728 | +0 | `6ce320ce1f67ae4b35970dde8b74ce6e0f40c9e4e6b74d2c9056ca47ba4d3adc` | + +此比较针对工作区原有二进制,未另建干净基线固件,因此差值不是独立性能测量。 +本轮二进制和日志保留在 `/tmp/tianshan-certificate-tests/artifacts/`;仓库中原本受跟踪的 +两个 build/*.bin 恢复为修改前内容,避免将生成文件混入源码补丁。它们不能被当作本轮 +新固件使用;重新构建或使用上述临时验证产物,部署前仍须完成实机验收。 + +## 62 项验收映射 + +`HOST` 表示该行核心行为已在宿主执行;`PARTIAL` 表示仅覆盖其中明确列出的部分, +仍缺整项验收;`NOT_RUN` 表示未执行。即便 HOST,也不等于真实 ESP32/WebUI/TLS 验收。 + +| 编号 | 状态 | 实际测试 / 限制 | +|---|---|---| +| A01 | PARTIAL | `test_api` 正常设备 PEM、NVS/缓存;`test_material` 模拟重载;真实 Web/Flash 重启未测 | +| A02 | PARTIAL | `test_material` 拼接双证书 CA,真实 mbedTLS;真实 Web 未测 | +| A03 | PARTIAL | LF/CRLF/无末尾换行已跑;前端 trim;全部空白排列未穷举 | +| A04 | HOST | `test_api` 缺失/数字/空串;`test_material` 空白 | +| A05 | HOST | `test_material` 坏 PEM,原材料/版本不变 | +| A06 | HOST | `test_material` 合法 CA + 损坏 CA,全批拒绝 | +| A07 | HOST | `test_material` 缺私钥与模块未初始化区分 | +| A08 | HOST | `test_material` 另一 P-256 公钥拒绝,原材料不变 | +| A09 | HOST | `test_material` 损坏已存私钥;同 PEM 不绕过检查 | +| A10 | HOST | `test_material` 漏 NUL/提前 NUL/超长;ASan/UBSan | +| A11 | PARTIAL | 测 3999..4096 每个长度的边界/解析分流;未生成恰好 3999 字节有效证书验证真实 NVS 容量 | +| A12 | PARTIAL | 缓存分配失败与 mbedTLS 分配错误返回注入;不是穷举库内全部分配点 | +| A13 | HOST | 模拟 set/commit 失败;commit 失败后 mock 存储可已变化,缓存和成功事件不伪更新 | +| A14 | PARTIAL | 宿主无 SD 的路径正常安装;未模拟 SD 部分写及 close 失败 | +| A15 | HOST | 相同 PEM 的写入计数与版本不增 | +| A16 | HOST | `test_ui` POST 超时只提交一次,结果未确认;后端可能已写入的语义保留 | +| A17 | PARTIAL | 安装返回值路径已静态核对;未运行真实自动批准/下载服务器 | +| A18 | PARTIAL | `test_material` init 读取/分配失败与坏私钥;真实 NVS 损坏恢复未测 | +| B01 | HOST | UTC/CST-8/PST8PDT 同 epoch 结果一致 | +| B02 | PARTIAL | 算法不调用 TZ/mktime;PST8PDT 复核;未逐个枚举 DST 跳变 epoch | +| B03 | HOST | 2000/2024 闰日有效、2100 闰日无效 | +| B04 | PARTIAL | not_before-1 与端点已跑;+1 尚未独立列测 | +| B05 | PARTIAL | not_after 与 +1 已跑;-1 尚未独立列测 | +| B06 | HOST | 86399/0/-1/-86400/-86401 与 UI 不足一天 | +| B07 | HOST | 2050、9999 年 64 位结果 | +| B08 | HOST | 1970、time()=-1、阈值前时间未就绪 | +| B09 | HOST | `test_time_cancel` 阈值 UTC 前后一秒、三种 TZ | +| B10 | PARTIAL | 无证书、坏 PEM/私钥;纯 UTC 非法日期;未构造签名证书起止倒置夹具 | +| B11 | HOST | 解码后长度 0/1/20/31/32/33;终止、截断、保护字节与 sanitizer | +| B12 | HOST | 状态读取 1000 次 NVS set/commit 计数不变,再跨时间边界 | +| B13 | HOST | 实际生成 CSR 后读取 100 次保持 CSR_PENDING,无状态持久化 | +| B14 | PARTIAL | 自动注册的存在性条件与回调语义静态审查;未运行真实自动注册任务闭环 | +| C01 | PARTIAL | `test_coordinator` 单任务、单实例;实机启动顺序未测 | +| C02 | PARTIAL | 真实校时通知/材料前提分别测;协调器假前提→真前提;未实机组合 | +| C03 | PARTIAL | 同 C02;后安装材料的真实设备闭环未测 | +| C04 | PARTIAL | 底层 CA 安装不依赖私钥,条件统一;各种真实顺序未实机穷举 | +| C05 | HOST | 重复通知保留等待资格;创建任务/订阅计数不增 | +| C06 | HOST | 100 次重复通知/启动不重复 URI/实例 | +| C07 | HOST | init、默认端点、URI/TLS 启动故障;1/5/15 秒虚拟重试 | +| C08 | HOST | 四次失败后普通重复事件/时间推进不再重试 | +| C09 | HOST | 明确 stop/start 恢复;纯策略新 generation 重置预算 | +| C10 | HOST | 停止后大量旧通知与旧到期时间不能启动 | +| C11 | HOST | 模拟 TLS start 正在进行,另一线程 stop、材料变更;stop 返回后保持停止 | +| C12 | PARTIAL | 通知丢失不回滚保存;协调器无事件也检查前提;不是实机队列压力测试 | +| C13 | PARTIAL | not_before 派生与兜底分别测;真实无事件等待到日期未实机测 | +| C14 | PARTIAL | 活动 A/存储 B 的 API 版本与指纹分离;真实握手仍 A 未测 | +| C15 | PARTIAL | CA generation 更新和状态重读;真实 CA-only 握手变化未测 | +| C16 | PARTIAL | 模拟 stop/deinit/init 重新加载 generation;真实重启和 B 握手未测 | +| C17 | PARTIAL | 生成新密钥/删除凭证后已有快照仍自洽;真实会话未测 | +| C18 | PARTIAL | pthread 安装与状态/快照并发;不是所有 ESP 任务与 NVS/校时交错的穷举 | +| C19 | HOST | 快照取 B 后安装 A,持有的 B 副本和旧 generation 不变 | +| C20 | PARTIAL | TLS/协调器停止失败与半启动清理保留句柄;管理器停止/重启真实函数错误传播已测;设备用户入口未测 | +| C21 | PARTIAL | 真实取消函数等待超时不强删;材料锁并发测试;完整 HTTP 注册取消竞态未实机测 | +| C22 | HOST | `test_lifecycle` 非 mTLS 缺 CA 能启动;没有自动降级 | +| D01 | HOST | message/error/空白/布尔 true 类型选择 | +| D02 | HOST | 中英文实际资源与缺键回退;相邻 PKI 提示检查 | +| D03 | HOST | POST 成功/失败/超时/刷新抛异常均恢复按钮,刷新不改已保存结果 | +| D04 | PARTIAL | 旧字段缺失的有效期/HTTPS 显示未知;未与旧固件做真实浏览器组合 | +| D05 | HOST | HTML 字符串使用 textContent,不拼入 HTML;DOM 替身测试 | +| D06 | NOT_RUN | 没有真实 mTLS 设备/客户端,不能认定认证通过 | +| D07 | PARTIAL | 未修改角色/用途/权限策略;旧真实凭证/配置包端到端回归未跑 | +| D08 | PARTIAL | 测试凭证临时生成、不打印密钥;源码/产物变更审查;不是全站日志安全审计 | + +## 资源与升级 + +- 新增一个 8192 字节内部 RAM 栈的协调任务、一个静态材料 mutex、两个保留订阅与少量元数据。 + 这是配置申请量,不是实机测量的最终总消耗;TCB、分配器开销、库临时内存另计。 +- 材料副本按实际长度优先 PSRAM,失败回退内部堆;错误检查后再交换。没有把 4KB/4KB + PEM 固定数组放入事件栈。事件处理器只唤醒协调任务,不解析/TLS 启动。 +- 当前材料的叶证书元数据、匹配结果、CA 解析结果和指纹被缓存。安装复用候选解析对象; + GET 与 5 秒无变化兜底不重新解析、不写 NVS、不创建新 TLS 实例。 +- 第一次瞬态失败后至多再试 3 次(1、5、15 秒)。缺前提不做快速重试;版本变化、 + 明确重新启动、前提由假变真才重置预算。用户停止优先。 +- 内部空闲堆/PSRAM、协调任务栈 high-water、失败前后资源趋势:**未实机测量**。 +- 保留旧 NVS。固件与 WebUI 应成套更新;只升级一侧不算完整交付。新 UI 对旧固件新增 + 字段缺失显示待确认;旧 UI 无法正确表达新状态,升级说明须提醒同时更新页面。 +- 运行中更新证书或 CA 不自动断连接。重启设备或成功的显式服务重启后才尝试加载新材料。 + 缺时间/CA、密钥不匹配、证书未生效/过期时 HTTP 管理路径保留,HTTPS 不新启动。 +- 构建产物属于本地验证附件,不包含在本补丁中;没有改动用户原有 output/tmp 内容。 + +## 实机放行步骤(尚未执行) + +1. 在明确授权的 ESP32-S3 测试设备记录旧版本、现有凭证及可恢复方案,不清空生产 NVS。 +2. 更新固件与 WebUI。设备生成专用测试密钥/CSR,用隔离测试 CA 签发;不得拿本报告 + 宿主生成的私钥替代设备 CSR 主流程。 +3. 交叉执行先校时/后装、先装/后校时、CA/设备证书互换顺序;断开 NTP 后用安全页 + 的浏览器校时按钮,验证失败能重试及设备时间/来源如实显示。 +4. 从正常页面安装有效/损坏/不匹配/过期/未来证书,记录脱敏响应、保存内容与真实状态。 +5. 正确信任 CA、SAN 地址、客户端证书/私钥下,验证现有 `/api/auth/whoami`: + + ```sh + curl --fail-with-body --cacert ./test-server-trust.pem \ + --cert ./test-admin-cert.pem --key ./test-admin-key.pem \ + "https://${TEST_DEVICE_HOST}:${TEST_HTTPS_PORT}/api/auth/whoami" + ``` + + 不使用 `-k/--insecure`。分别验证无客户端证书、非信任客户端证书被拒绝及现有角色权限。 +6. 握手确认活动 A 的叶 DER SHA-256;存储 B 后握手仍 A、页面常驻待应用;重启后 + 完整认证握手确认 B。只换 CA 时也核对 configured/loaded 版本及客户端信任变化。 +7. 测试停止与重启、重试期间停止、删除/换钥期间活动会话;停止失败须从真正用户入口 + 保留错误,不能只测底层函数。管理器宿主回归已通过,仍需设备入口验证。 +8. 记录内部堆/PSRAM、任务栈余量、重复故障后的趋势和实际镜像版本。所有未测项继续 + 标为未验证,不能因页面显示有效或编译通过而取消。 diff --git a/docs/OS_RUNTIME_AUDIT_2026-09-23.md b/docs/OS_RUNTIME_AUDIT_2026-09-23.md new file mode 100644 index 0000000..c1dc785 --- /dev/null +++ b/docs/OS_RUNTIME_AUDIT_2026-09-23.md @@ -0,0 +1,145 @@ +# 旧版 0.5.1 串口与模型管理链路核查 + +日期:2026-09-23。结论:卡片消失是确定的软件问题;模型自动启动链条在本段日志中走通,但状态可信度、编辑安全性、SSH 开销与身份验证仍有独立缺陷。本次只分析,未修改产品代码、连接设备、执行远程命令或刷写固件。此前证书修复保留。 + +## 证据边界 + +- 输入:`/Users/massif/Downloads/serial.raw.log`,283358 字节、3932 行;以及《卡片消失原因与最佳修复方案.md》。附件中的修复建议作为待核实观点,不作为本次自动改代码授权。 +- 用户确认日志来自修改前的 0.5.1。日志没有完整启动头和镜像 SHA,不能仅凭版本号证明它与当前 HEAD 完全相同。 +- 源码基线:`d6ed947a592265fa12754828bc79803fc50c1db2`,叠加此前未提交证书补丁。下述规则引擎、自动化 API/动作管理器、SSH 客户端/日志监控、日志系统均与 HEAD 无差异;前端所引卡片与规则编辑代码不属于证书补丁。 +- 日志约覆盖启动后 37 秒至 1283 秒,中间有长空白;不是连续、完整开机验收。未出现明确 W/E 级记录、panic、看门狗复位或分配失败记录;这不等于整个系统没有故障。 +- 日志有截断、拼接和重复行。下述“120 次”等是文本记录计数,不保证一条日志严格对应一个唯一操作;不能据重复日志直接断定模型重复启动。 + +## 实机日志实际说明了什么 + +| 行号 | 观察 | 能得出的结论 | +|---|---|---| +| 1–3 | LPMU boot successful,ON | 固件把电源/启动状态置为 ON,不等于远端 OS 或模型 API 已就绪 | +| 9–10 | 浏览器校时成功 | 当时设备需要较大幅度校时;没有 NTP/HTTPS 启动全链路证据 | +| 200–213 | 规则数先变 6,再变 7;删除 Qwen 规则文件,随后触发并注册 | 保存操作确实经过删除/重建;首次保存附近出现自动触发,但不能单凭此证明重复启动 | +| 241、2299–2301 | 主模型 checking → ready,随后触发 Embedding | 日志模式检测约 287.7 秒后成功,自动链路推进 | +| 2338、2960–2962 | Embedding checking → ready,随后触发 Reranker | 约 87.2 秒后推进 | +| 2997、3683–3684 | Reranker checking → ready,监控任务退出 | 约 97.0 秒后检测成功 | +| 3686–3706、3832–3838 | 再次多轮 6 → 7、删除与注册 | 编辑仍持续使用删除/重建;卡片不显示不能解释为规则永久丢失 | + +三个 ready 都来自远程日志出现 `Application startup complete`。没有真实推理请求、端口健康测试或启动后持续存活证据,因此不能把它们表述为“模型一直正常服务”。 + +## 发现及决策 + +### R1 / P1:卡片显示与启动方式混用;保留条件还必须补后端判断 + +**已确认。** `components/ts_webui/web/js/app.js:4341` 使用 `r.enabled && r.manual_trigger` 筛选卡片。切换自动模式时字段变 false,卡片被过滤,日志和停止入口一起消失。 + +`app.js:22027` 附近提交逻辑只在非手动模式收集条件;手动保存把条件数组写成空。附件关于“条件会丢失”的判断正确。 + +**附件遗漏:**`components/ts_automation/src/ts_rule_engine.c:686` 的 `ts_rule_evaluate()` 只检查 enabled、冷却时间与条件,不检查 manual_trigger;`:657` 通过空条件返回 false 间接避免手动规则自动执行。仅在 UI 中保留条件,会使手动规则重新参与自动判断。 + +修复应把卡片可见性与启动方式分开,后端明确跳过仅手动规则,再允许保留自动条件。已有手动卡片、服务型模型规则可作为旧配置的默认显示集合;缺省与明确 false 必须区分,避免用户隐藏后又被重新显示。字段须贯通列表/详情 API、NVS、SD JSON 和配置包导入导出。已被旧版本清空的条件无法凭空恢复,必须提示补配。 + +### R2 / P1:保存规则可能丢配置、重置运行历史,还可能假报成功 + +**日志与源码确认删除/重建;异常损失属于代码风险,日志未发生。** `app.js:22106` 附近先调用 delete,再 add,且没有检查 delete 的业务 code。网络中断或新规则校验/分配失败发生在两步之间,会留下已删除状态。新建规则在 `ts_rule_engine.c:430` 附近 memset,重置触发时间/次数;冷却状态变化可能改变再次触发行为。 + +后端 `ts_rule_register():353` 已有同 ID 原位更新分支,**但不能直接认为它安全**:先释放旧数组,再分配新数组;分配失败仍可返回成功。新增分支也没有完整处理分配失败。`ts_rules_save():2323` 先清空旧 NVS,单条序列化/写入失败可能只打印警告;上层注册/删除不传播保存错误。SD 文件以 `fopen("w")` 直接覆盖,导出结果也没有完整传回。因此“保存成功”不保证重启后能恢复。 + +修复:准备并验证完整新配置后再替换,避免先删;保留适合保留的运行统计,定义修改条件/动作时何时重新评估;持久化错误返回给用户。不能宣称 NVS 与 SD 多次写入是一个原子事务。对旧配置包优先级也要保留:启动加载优先 SD,且同名 `.tscfg` 优先于 `.json`,不能只更新 JSON 后声称一定生效。 + +### R3 / P1:运行中编辑规则存在释放后使用风险 + +**源码确认危险交错,未在该实机日志观察到崩溃。** `ts_rule_engine.c:686` 的 evaluate 在取得规则指针后解锁,再读取条件和动作、执行网络操作;手动 trigger(`:808` 附近)也把内部动作指针带到锁外。与此同时 unregister(`:481`)可释放数组并移动规则,register 可释放并替换数组。`ts_rule_get():568` 同样返回解锁后的内部指针。 + +可能结果是偶发崩溃、执行错误动作或把统计写到另一条规则;“改为原位更新”本身不能消除这个问题。 + +修复:在短锁内取得本次执行所需的有界快照或明确的对象使用权,锁外执行网络操作,结束时按稳定 ID/版本回写。不要持全局规则锁等 SSH。对 ESP32 要限制快照尺寸和并发执行数量,而不是复制整个规则库。 + +### R4 / P1:状态未知被当成未运行;ready 也不是持续健康状态 + +**源码确认;本日志没有模型后续退出的证据。** `app.js:4370–4446` 的进程检查在熔断、SSH 错误等情况下把 isRunning 置为 false,再显示“未运行”并允许触发。API 业务失败也未先验证 code。可能只是暂时查不到,却误导用户再次启动。 + +`ts_ssh_log_watch.c:263–268` 一旦找到就绪字符串就写 ready 并退出;UI 后续 3 秒轮询(`app.js:4490` 附近)主要读取该变量,不是持续远程健康探测。卡片的进程检查也不是每 3 秒重新执行。因此页面可能保留历史 ready。自动规则链依赖该变量时也有相同语义问题。 + +另外 `ts_action_manager.c:1434` 启动日志监控失败只写警告,没有同步变成可靠的失败状态;命令发出成功不能代表模型启动成功。 + +修复:至少分清“启动中、已就绪、已停止、检查失败/状态未知”,带观测时间;未知时不能据此放行重复启动。后端也要提供重复启动保护,不能只靠按钮禁用。就绪后的低频健康检查应按主机合并、有界执行,避免每张卡片各自高频 SSH。 + +### R5 / P2:每次查日志都重新认证,ESP32 做了大量重复工作 + +**日志与源码吻合。** 文本中有 120 条 SSH 连接/认证完成记录、100 条 Checking log、101 条结果记录;绝大多数日志属于 SSH 与密码学细节。`ts_ssh_log_watch.c:98–219` 每轮加载私钥、建会话、连接认证、执行 grep、断开并释放。 + +配置是完成一次检查后等 3000 ms,实际正常连续轮次大约相隔 4.75 秒。120 对 signv 开始/结束日志的耗时中位数约 722 ms,范围 711–1175 ms。**这是日志测出的墙钟时间,不能换算成 CPU 使用率。**检查本身大约 1.7 秒,也包含网络/调度等耗时。 + +修复优先级:先减少握手次数与 INFO 调试日志;复用受限数量的主机连接或一次远程等待/合并检查,并设置真正的截止时间与取消。避免为每个模型建立永久独立连接。监控任务当前每个申请 8 KiB 栈,多模型扩展前须测内部堆、栈余量、并发上限。 + +### R6 / P1:自动化 SSH 没有和网页操作保持相同的远端身份检查 + +**源码确认,不代表此次发生攻击。** `ts_api_ssh.c:321–335` 在 connect 后验证 known_hosts;但 `ts_action_manager.c:1329–1345` 和 `ts_ssh_log_watch.c:185–195` 连接后直接执行命令,没有对应验证。SSH 客户端 `ts_ssh_client.c:293–316` 本身也没有提供主机信任检查。 + +日志中网页路径有 Host key verified,而自动模型启动/日志轮询路径没有;这与代码一致,不能把网页曾验证过等同于后续连接都已验证。 + +网页验证位置也晚于用户认证,因为 connect 实际包含认证。密码模式下,不能等凭据已经发出后再拒绝错误主机。 + +修复:将连接分为握手、主机信任校验、用户认证;所有自动/手动路径统一遵守。自动任务遇到未知或变更指纹应停止并报告,沿用现有人工信任流程,不自动接受新指纹。 + +### R7 / P2:日志本身存在截断与并发串行化问题,且打印密钥文本前缀 + +**日志确认格式损坏;具体每条损坏来源不能仅凭记录唯一归因。** 207、210、241、2997 行等长命令被截断/拼接;211、246 等处有重复行。 + +`ts_log.c:1000–1038` 用共享 static 512 字节缓冲和共享 in_hook;格式化无互斥,输出前已清除 in_hook。并发线程可覆盖尚未输出的内容;长行会截断。当前 SDK log v1 直接调用 hook,没有替这个缓冲加锁(已核查本机 SDK 源码)。当前配置启用该 hook,环形日志仅 500 条,密集调试内容也会挤掉历史线索。 + +`ts_ssh_client.c:424` INFO 打印私钥文本前 50 字符,日志有 120 条;并非完整私钥,也不能据此断定私钥已可被还原,但不应保留这种输出。去掉密钥文本、降低密码学内部调试级别;日志改为有界且线程安全的格式化/输出,明确截断,不长时间持有临界区。 + +时间戳在不同 tag 之间偶有约 1 秒回退;自建 TS_LOG 使用 esp_timer、ESP_LOG 使用 SDK 时间源,不能将这种差值直接认定为设备时钟故障。 + +### R8 / P1:日志监控替换/取消的生命周期不安全 + +**源码风险,当前日志没有重复监控替换或强删任务证据。** `ts_ssh_log_watch.c:293–313` 任务退出会自行 free(task);`:331–345` 替换同名任务时,调用方解锁后轮询 existing->is_running,旧任务可能已释放它。stop/stop_all(`:407`、`:468`)有类似问题,还会强制删除可能正在 SSH 操作中的任务,绕过 socket、会话和私钥缓冲清理。后两 API 未检出外部 C 调用者,不能说当前常规操作必经强删。 + +修复:明确谁持有对象、谁负责释放,以完成通知确认退出;网络调用可取消、等待有界,避免依赖已释放对象的标志。重复启动新监控前确认旧监控已退出或用代次隔离,防止旧任务覆盖新状态。 + +### R9 / P2:配置了超时,不代表 SSH 各阶段都能按时退出 + +**源码风险,日志里没有连接卡死。** `ts_ssh_client.c:293` 的握手 EAGAIN 循环、`:316` 的密码认证循环反复 wait_socket,没有总截止时间;已有 SO_RCVTIMEO/SO_SNDTIMEO 不能替代整个重试循环的截止时间。日志监控自己的 600/800 秒超时只在每轮调用前检查,若卡在连接里,外层无法及时终止。 + +修复:连接/握手/认证/执行共享单调时钟截止时间,等待时检查取消;不要仅增加外围定时器或到期强删任务。 + +### R10 / P2:日志匹配字符串并未真正转义 + +**静态确认,本次字符串不含危险字符,未触发。** `ts_ssh_log_watch.c:130–158` 虽称转义,实际只是 strncpy,然后把 pattern 与路径放进 shell 单引号。包含单引号时可破坏命令,导致检测错误甚至改变执行含义;snprintf 截断也未完整检查。 + +修复:统一 shell 参数编码并校验长度,固定字符串 grep 使用明确选项边界。不是要求禁止用户使用正常的包含引号的日志文本。 + +## 对附件“最佳方案”的结论 + +方向正确,但不足以直接作为完整实施纲要。批准实施前应补齐: + +1. 可见性独立;规则禁用不应让仍运行模型的管理入口一起消失,需明确产品语义。 +2. 保留条件的同时,后端真正执行仅手动语义;旧版丢失条件要提示恢复。 +3. 以安全更新代替删除重建;先解决分配失败、持久化错误和运行中对象生命周期,不能只换 API 调用。 +4. “不重复启动”由后端保证;未知状态不能当成停止;定义用户主动停止后是否允许自动规则再拉起。当前字段不足以表达维护暂停,此项需要产品决策,不能私自选择。 +5. 不把模型 ready 文本匹配当作长期健康;后续探测要有频率/并发预算。 + +推荐分包:第一包修模型卡片、模式切换、规则安全更新与状态真假;第二包统一 SSH 信任、生命周期、超时并降低轮询成本;日志可观测性修复可与第二包同步。都不需要重做全局 OS 架构。 + +## 本次验证与未验证 + +- 完整扫描 3932 行,按 tag、级别、状态变化和连接/签名配对汇总;清洗副本 `/tmp/tianshan-serial-clean.log`。 +- 从当前 app.js 提取真实过滤表达式和 submitAddRule 函数,在 Node VM 中使用模拟 DOM/API 执行。复现:自动卡片被过滤、手动保存清空条件、delete 业务失败仍继续 add。脚本 `/tmp/tianshan-card-audit.cjs`,退出码 0。这不是浏览器真机操作。 +- 校对关键模块与 HEAD 无差异,并核对本机 SDK log v1 调用路径。 +- 并发释放、内存不足、存储失败、恶意主机、网络黑洞等为静态确认的缺陷路径,未宣称已在真机注入复现。 +- 未运行模型推理、压力测试、浏览器自动化、硬件资源测量;未修改产品代码。 + +## 与此前证书修复的关系 + +这份日志只能证明浏览器校时成功,不能验证新补丁的证书安装、HTTPS 启动、活动证书切换;也没有充分证据判定当时 NTP/HTTPS 的最终状态。旧日志不能用于宣称新固件回归失败或成功。 + +此前证书修复不覆盖上述模型规则/SSH 日志监控/日志 hook 缺陷。PKI 自动注册任务的取消修复也不等于 SSH 日志监控取消已安全。这些应独立验收。 + +## 建议实机补测 + +- 按自动→手动→保存→自动操作:卡片存在、条件不丢、手动期间条件为真也不自动启动。 +- 模型正在启动/运行时修改规则:不崩溃、不串规则、不重复拉起;保存故障后旧规则可用且界面报错。 +- SSH 暂时断开:界面显示未知而非停止;恢复后状态收敛;连接黑洞能按截止时间退出。 +- 模型 ready 后杀进程:状态及时失效;用户主动停止后的自动恢复策略符合产品选择。 +- 替换 SSH 主机指纹:所有自动与手动路径均拒绝,不能先执行命令再验证。 +- 多模型连续启动/取消:监控任务、连接、内部堆和栈余量无持续恶化;日志无密钥文本及串行损坏。 +- 使用新证书固件另跑证书报告中的硬件验收,记录镜像 SHA,避免只用 0.5.1 版本号区分镜像。 diff --git a/docs/PROMPT_REPAIR_REPORT.md b/docs/PROMPT_REPAIR_REPORT.md new file mode 100644 index 0000000..99b0c95 --- /dev/null +++ b/docs/PROMPT_REPAIR_REPORT.md @@ -0,0 +1,34 @@ +# 用户提示与操作结果修复记录 + +本次包含历史 N01—N14 提示语核查及两轮审查确认的 R1—R6。代码已修复,本地主机和浏览器回归通过;未执行真实设备验收。 + +## 最终行为 + +- 实际内联翻译入口等待语言就绪,处理加载失败、超时、重试和快速切换;补齐中英文键与参数,内部枚举转换为用户可读状态。用户输入、文件名、路径、命令和远端输出不强制翻译。 +- REST 业务失败保持既有返回契约,具体写操作显式校验结果。HTTP 错误保留 error/message,超时覆盖响应体读取;未确认的写入不当作成功,也不自动重发。 +- 退出接口单独遵守 success:true 契约;其他接口不因此放宽。区分本地退出与服务端响应,旧退出回执不清除新的登录。 +- SSH 完成事件、匹配成功/失败、超时、取消、冲突与未知状态分别处理;会话已受理不等于后台进程就绪。保持原匹配规则。 +- 终端恢复等待实际确认;资源加载失败可重试,销毁实例不能迟到重连。LPMU 可达、不可达与检测未知分开,不自动重放电源脉冲。 +- 上传、下载、删除及配置应用保留逐项/部分失败结果。下载只称已发起;上传不等于验证通过,验证通过不等于已应用。 +- Toast 取消旧计时器,动态文本安全输出;有效新尝试可替换旧失败,迟到成功或失败不能覆盖新尝试。 + +## 两轮审查补修 + +|问题|修改|回归| +|---|---|---| +|R1 接口真实契约不一致|HTTP 错误先处理;退出、登录按自身契约;退出与新登录归属|401 error、成功退出、异常退出、其他接口拒绝宽松成功、迟到退出| +|R2 重复初始化与旧页面更新|首次启动/每次导航分离;主要页面读取校验导航有效性;只取消自己的订阅|已登录冷启动、旧页面迟到、失败重试、外部订阅保留、旧 finally 不释放新锁| +|R3 旧验证应用入口|绑定文件/路径/上传代次;重新上传立即失效;重叠写入不声称已确认最终文件|验证交替、旧成功晚到、已打开确认失效、同路径重叠上传| +|R4 新成功被旧错误遮住|有效尝试决定当前提示;不按响应到达顺序更新|快速重试、旧成功/旧失败分别晚到| +|R5 旧操作关闭新弹窗|成功、错误、finally 校验实例;任务记录独立于弹窗|A/B 弹窗交错、新按钮状态、关闭后结果保留| +|R6 上传后列表不刷新|固定目的目录;上传结果与刷新结果分开;目录请求代次校验|跨目录上传、同/跨目录刷新乱序、刷新失败不改上传成功统计| + +## 验证 + +- `npm ci --prefix tests/prompts`:锁定 Acorn / Playwright 依赖。 +- `npm test --prefix tests/prompts`:静态与实际生产函数 VM 测试 38/38 通过。 +- `npm run test:browser --prefix tests/prompts`:实际网页入口 Chrome 测试 36/36 通过,API/WebSocket 模拟,外部请求拦截。 +- 新增 25 项浏览器回归在修复前源码快照上全部失败、当前源码全部通过。历史快照和本地原始日志属于工作记录,不作为发布附件。 +- 既有证书与运行时 UI 回归通过。固件版本与整体构建结果见 `releases/v0.5.2-validation.md`。 + +VM 测试不等于浏览器渲染,浏览器模拟不等于真实设备。实际会话吊销、文件覆盖与配置生效、SSH 终态、断网恢复、保护策略、下载落盘及旧版本升级仍需设备/部署环境验收。任务记录仅保留在当前网页会话,不承诺刷新浏览器后的历史持久化。 diff --git a/docs/releases/v0.5.2-validation.md b/docs/releases/v0.5.2-validation.md new file mode 100644 index 0000000..30d6a99 --- /dev/null +++ b/docs/releases/v0.5.2-validation.md @@ -0,0 +1,28 @@ +# v0.5.2 提交与发布验证 + +基于上游 `d6ed947a592265fa12754828bc79803fc50c1db2`,合并证书/HTTPS、自动化/SSH/日志与 WebUI 提示修复。保留原有设备策略、分区和权限;没有设备连接、刷机、重启或模型启动/停止。 + +## 提交前验证 + +- `./tests/runtime/run_all.sh`:生产 codec/store/engine/SSH/service/watcher/log 等主机回归通过;含持久化故障注入、取消/代次/实例身份与实际 UI 函数。C 使用 ASan/UBSan。 +- `./tests/certificate/run_host.sh`:真实 SDK mbedTLS/cJSON 与平台替身测试通过;覆盖材料、时间、HTTPS 生命周期、协调、API 及服务停止失败。 +- `./tests/certificate/test_service_stop.sh`:原缺陷固定基线为 d6ed947;不再以变化的 HEAD 当旧代码,提交后仍能执行。 +- `npm test --prefix tests/prompts`:38/38;`npm run test:browser --prefix tests/prompts`:36/36。 +- `python3 tests/release/test_release.py`:3 项通过,覆盖实际发布条件矩阵、版本不一致、缺失/非中文说明的拒绝,以及提交绑定/构建依赖。 +- `./tools/build.sh --fresh`:ESP-IDF v5.5.2 / ESP32-S3 完整构建通过。应用大小 0x20fba0,最小应用分区 0x300000,剩余 31%。WebUI 重新优化并生成 SPIFFS 镜像。 +- `git diff --check`、JavaScript 语法、Workflow YAML 解析通过。 + +本地构建的元数据包含提交前工作区标志。正式 Release 由 Actions 从合并后的具体提交重新构建,不直接将本地提交前镜像作为云端验收结果。 + +## 发布条件 + +- Fork 分支和上游 PR 执行构建/回归,不发布正式版本。 +- 上游 `RMinte-AI/TianshanOS` 的 main 合并推送,构建与 WebUI 回归均成功后,依据 version.txt 自动创建 v0.5.2。 +- Release 绑定触发构建的 github.sha,中文正文来自 `docs/releases/v0.5.2.md`,不使用自动生成的英文提交摘要替代正文。 +- tools/check_release.py 要求 tag、version.txt、构建版本一致,并检查中文说明。没有对应说明的新版本不能静默发布。 +- 若同版本 Release 已存在,main 流程保持既有的跳过行为,不覆盖正式版本。发布新版本需同步更新版本与说明。 +- 本轮仅提交和提 PR,不自行合并,也不提前创建 v0.5.2 标签或 Release。 + +## 残余验证 + +主机模拟与云端编译无法证明真实 TLS 握手、设备会话吊销、断电/NVS 页回收、历史配置升级、Linux 进程组、SFTP/SCP、DNS 取消边界、三模型联动及长期资源趋势。具体矩阵见 `docs/CERTIFICATE_FIX_REPORT.md` 与 `docs/runtime-repair/VERIFICATION.md`。这些限制在中文发布说明中保留。 diff --git a/docs/releases/v0.5.2.md b/docs/releases/v0.5.2.md new file mode 100644 index 0000000..b439661 --- /dev/null +++ b/docs/releases/v0.5.2.md @@ -0,0 +1,57 @@ +# TianShanOS v0.5.2 + +本版本集中修复证书与 HTTPS 启动、自动化规则保存、SSH 后台任务与日志监控,以及 Web 管理界面的提示与操作结果判断。目标平台为 ESP32-S3,构建使用 ESP-IDF v5.5.2。 + +## 证书、时间与 HTTPS + +- 修复网页安装设备证书和 CA 证书时 PEM 长度不正确的问题,保留解析、公私钥匹配和容量检查;分别说明缺少私钥、密钥不匹配、解析错误及存储失败。 +- 证书有效期统一使用 UTC 计算,区分待校时、尚未生效、有效与过期。证书材料安装、证书有效期和 HTTPS 实际运行状态分别展示,避免仅凭材料存在就显示服务可用。 +- 浏览器校时与 NTP 校时统一通知 HTTPS 启动协调逻辑。先安装后校时、先校时后安装均重新检查条件;重试有上限,用户主动停止后旧事件不会重新启动服务。 +- 使用一致性证书快照和材料版本,避免并发安装与读取交叉。运行中更换材料后明确提示待应用,活动连接使用的证书不与新存储材料混为一谈;本版不增加无中断证书热替换。 +- 修复通用服务管理器吞掉停止错误的问题。停止失败不会继续按“停止成功”执行重启。 + +## 自动化规则与配置保存 + +- 将规则编辑从“删除再添加”改为带版本核对的更新。冲突时保留用户草稿,不允许旧页面静默覆盖新配置;丢失写入响应时不自动重放保存。 +- 保留手动触发、允许手动触发、规则启用和仪表盘展示之间的区别。切换手动模式不会清空自动条件,保存配置本身不会启动任务。 +- 完善规则、条件、动作与重复执行参数的序列化,保留显式 false、缺失模板引用等信息。修复合法点号开头规则在重新加载后消失的问题。 +- 为 SD/NVS 保存增加阶段标记、读回校验及恢复处理。提交结果无法确认时停止自动准入;备份同步失败不再伪装成全部成功,也不回退到陈旧配置。 +- 修复旧执行与新配置并存时的所有权、取消、删除及登记回收问题。停止采用协作退出,尚未完成时明确返回等待或失败,不强制删除仍持有资源的执行任务。 + +## SSH 服务、日志与资源释放 + +- SSH 认证前统一验证主机密钥。未知或变化的主机指纹需要明确确认,不能直接使用旧的模糊信任标记继续认证。 +- 查询、启动、停止和监控使用实例身份与运行代次。旧请求、旧取消和迟到的就绪消息不能影响新实例;取消观察不等于停止远端服务。 +- 普通页面状态轮询读取缓存,避免持续重新建立 SSH 连接;明确核实时才查询远端。断网后的就绪恢复必须属于同一个已确认实例。 +- 对连接、认证、执行、输出及关闭设置总时间预算,完善取消和错误路径的资源释放。同步 DNS 调用仍受底层解析行为限制,不承诺瞬时取消。 +- 受管服务停止前核对进程身份,停止其对应进程组;去除基于相邻 PID 的猜测。启动或停止结果不明时显示未知,不自动重复执行命令。 +- 原始日志完整输出,缓存使用有界预览并标明截断;改善 UTF-8、ANSI 和并发日志处理,减少认证噪声及内部敏感诊断输出。显式用户日志内容仍按原功能记录。 + +## Web 管理界面与操作结果 + +- 补齐中英文提示和参数,减少翻译键、内部枚举、变量与工程错误直接出现在主要提示中。真实文件名、路径、命令及远端原始输出保留原文。 +- 按具体接口契约判断成功。HTTP 错误保留原因;退出登录区分本地凭据清除与服务端响应确认,迟到退出结果不影响新登录。 +- 上传、下载、删除和配置应用区分成功、部分失败、验证失败及结果未知;下载提示只说明已向浏览器发起请求,不声称文件已经落盘。 +- 修复首次页面重复初始化、重复订阅及离开页面后的迟到更新。初始化失败可重试,旧页面只清理自己的订阅和资源。 +- 上传固定目的目录,验证结果绑定文件与上传代次;旧验证不能恢复应用按钮。同一路径重叠写入、无法确定最终内容时,要求重新上传验证,不自动重放上传。 +- 配置应用按当前有效尝试更新提示,旧成功、旧错误和旧 finally 不覆盖新结果、不关闭新弹窗。弹窗关闭后仍保留带路径和尝试编号的任务记录。 +- 上传结果与文件列表刷新结果分开呈现;旧目录响应不能覆盖当前目录。修复 Toast 定时器和重试成功被旧错误遮住的问题,动态结果以安全文本输出。 +- 完善 SSH 终态、终端恢复确认与资源加载失败重试,以及 LPMU 可达性、检测未知状态的提示。不修改硬件保护策略,也不以自动电源脉冲掩盖未知结果。 + +## 升级与兼容性说明 + +- 升级前请备份规则、SSH 主机/命令及相关配置。本版本没有新增分区,也不会主动清空 NVS 或替用户重新签发证书。 +- 同名加密配置包、旧单文件规则和部分镜像来源保持只读保护;并非所有历史配置格式都支持直接网页修改。 +- 旧固件仅留下单 PID、无法核实身份的活跃进程不会被新版本猜测性终止。需要操作人员先确认旧实例退出,再交由新版本接管。 +- 新后端的规则写入要求版本信息;使用旧缓存页面可能不能完成写入,升级后应刷新管理页面。固件与 WebUI 镜像应配套升级。 +- ready 表示已取得对应实例的日志就绪证据,不代表推理服务持续健康,也不是性能测试结论。 + +## 验证边界 + +已补充生产函数回归、模拟存储故障与并发测试,以及实际网页入口的中英文浏览器测试;构建与发布由本次提交对应的 GitHub Actions 执行。测试详情保存在仓库的证书、运行时和提示语修复记录中。 + +本版本未将模拟测试等同于真实设备验收。实际 TLS 握手和证书切换、真实 SSH/SFTP/SCP、板卡断电恢复、旧配置升级、三模型联动、长期堆内存与时延仍需部署环境验证。请先在可控设备上验收,再安排生产升级。 + +## 固件附件 + +Release 附带应用固件 `TianShanOS.bin`、WebUI 文件系统 `www.bin`、bootloader、分区表、OTA 初始数据及刷写参数(以该次构建实际附件为准)。本 Release 发布流程不连接设备,不自动刷机或重启。 diff --git a/docs/runtime-repair/IMPLEMENTATION_REPORT.md b/docs/runtime-repair/IMPLEMENTATION_REPORT.md new file mode 100644 index 0000000..0a26d1f --- /dev/null +++ b/docs/runtime-repair/IMPLEMENTATION_REPORT.md @@ -0,0 +1,64 @@ +# TianShanOS 定向修复交付(2026-09-24) + +代码已修改;受控主机测试通过;ESP32-S3 构建通过。**板卡验收、真实 SSH 服务器回归、三模型联动和运行资源对比未运行,不能据此宣称可以直接发布。** 本次没有刷机、清配置、停止真实模型、提交或推送。 + +## 基线与范围 + +基线 HEAD:`d6ed947a592265fa12754828bc79803fc50c1db2`。执行用户交付的《TianShanOS_Codex_代码修改交接文档.md》v1.0;此前证书修复保留。开工 SHA 核对表中,证书、HTTPS、时间、PKI、通用服务管理器等文件均未再改动;共同修改的 app.js 和中英语言文件通过既有证书 UI 回归。工作期间其他任务修改了首页、路由、终端、提示文案等 Web 文件,均保留,不能把这些更改全算成本轮修复。 + +关键模块原本为 C,仍保持 C ABI;新公共头文件有 C++ linkage guard。未增加 C++ 运行时、线程框架、全局 JSON allocator hook、后台健康守护或新分区。 + +## 实现及原因 + +| 批次 | 最终行为 | 主要文件 | +|---|---|---| +| A 日志 | 原始串口记录用独立 va_copy 完整输出一次;缓存用两个固定槽生成有截断标识的 UTF-8/ANSI 预览。抢不到槽/锁计数降级;回调和输出不持环形锁;移除私钥前缀、完整凭据命令/执行输出诊断,第三方认证噪声降 DEBUG | ts_log.c、ts_log_preview.h、SSH/client/action/vendor 日志 | +| B 规则所有权、提交 | 不再 delete+add 编辑。候选完整准备后,以 expected_revision 比较提交;旧执行持有原配置 lease,提交后重新核对代次才准入。全局最多一个退役负载;编辑门禁串行候选。持久化前短锁复制标量视图,动态负载由编辑门禁保持有效 | ts_rule_engine.c、ts_rule_codec.c、ts_rule_store.c、ts_api_automation.c、ts_cmd_auto.c | +| C 产品语义 | show_on_dashboard 与 manual_trigger、allow_manual_trigger、enabled 分离;手动保留自动条件。保存不启动,自动恢复由下一轮正常评估处理。模型状态以后台服务记录/远端证据为准,未知禁止盲启动;自动模式停止有再次自动启动提示 | app.js、语言文件、ts_ssh_service.c、ts_action_manager.c | +| D SSH/监控 | 槽位+代次句柄,先登记再运行,协作取消,worker 自行释放。共同连接入口认证前验证 known_hosts;交互确认必须带当前完整指纹。TCP、握手、认证、exec、读写/关闭共享各操作总 deadline,EAGAIN 等待不超过 100ms | ts_ssh_client.c、ts_ssh_log_watch.c、ts_ssh_probe.c、API/CLI 调用者 | +| E 回归/工件 | 主机故障注入、并发屏障、实际函数 UI 测试、目标构建;SPIFFS 显式依赖 Web 压缩完成,资源版本更新 | tests/runtime、ts_webui/CMakeLists.txt、index.html | + +另外修复了同步动作等待超时后的结果对象生命周期:等待者和执行者各持引用,后台不会继续写入已经失效的调用栈。SSH API 的凭据改为请求局部生命周期,避免并发请求共享/释放同一密钥。它们直接服务于本轮并发和 SSH 调用链的可靠性。 + +## 契约与使用边界 + +- 旧客户端缺少 expected_revision 时不能静默覆盖。冲突保留草稿;网络中断后只读回核实,不自动重放保存。显式 false 与字段缺省有区别;模板解析失败保留引用,不能凭猜测把后台规则变成卡片。 +- 规则读者 acquire/release;入队动作持有模板、主机和 SSH 命令的执行快照。运行中改身份/删除被拒绝,改展示或模式不撤销已受理执行。确认停止后允许重新绑定。 +- 普通 SD JSON 使用 pending/previous 文件、NVS 阶段标记、读回校验和恢复;NVS-only 使用双 bank 和最终选择标记。权威提交不确定时停止自动准入。镜像失败明确返回已应用但备份未同步,不回退到陈旧 NVS。 +- 同名加密 `.tscfg`、旧单文件 `rules.json` 和缺 SD 时的镜像来源维持只读,修改前报错;不解密降级、不删除旧配置。不是所有历史格式都可以直接网页编辑。 +- 服务记录最多 64 项(既有 SSH 命令上限),以命令 ID、配置目标 host/port、受管路径保护实例;远端启动前查询,并用原子 mkdir 锁目录避免失联后重复启动。主机别名不会自动合并为物理机器身份;远端同一路径锁仍约束同名实例。 +- 新受管进程用独立 session/process group,记录准确 PID 和 `/proc` 启动时间;停止只在核对身份后 TERM 该组,确认后才 stopped。删除了 PID-1 猜测。**旧固件只有单 PID、无法证明身份的活跃进程可以显示运行,但拒绝自动误杀;需操作人员确认旧实例退出,再由新版本接管。** 这是安全兼容边界,未擅自迁移现场进程。 +- 停 watcher 仅取消观察;迟到 READY 受服务 generation 阻挡。ready 是历史日志证据,不代表持续 HTTP 推理健康。启动 exec 后断线、监控创建失败或停止结果未知都显示 unknown。 +- 无新常驻任务。watcher 仍为 8KiB 栈、core 1、priority 5;默认查询/日志轮询频率未提高;页面隐藏、重复请求、已移除弹窗的迟到响应受控。 +- 普通 SSH exec 默认每个输出流最多 64KiB,watcher 为 128B;溢出返回错误。大文件应走原文件传输接口。交互 shell、SFTP/SCP 仍需真实服务端回归,不以编译代替运行验证。 +- **DNS 是例外边界**:lwIP `gethostbyname()` 同步调用仍受原生解析重试约束,无法在其内部做到 100ms 取消。返回后立即检查总 deadline。已核对 SDK 默认 DNS_MAX_RETRIES=4、DNS tick=1s;多服务器/重试的实际耗时未测,不承诺 DNS 也在一个轮询间隔内退出。 +- 显式“日志动作”仍会记录用户要求的文本;本轮移除的是内部诊断泄露,不提供任意用户日志内容的全局秘密识别器。 + +## 静态资源核算(目标工具链,非板卡测量) + +从最终 ELF DWARF 读取 sizeof;旧类型由 HEAD 头文件使用同一 Xtensa 编译器编译对象验证。详见 `evidence/resource-sizeof.txt`。 + +| 项目 | 基线 → 本轮 / 静态值 | +|---|---| +| rule 结构 | 224 → 240B,+16B/条 | +| 每条额外所有权记录 | payload 16B(PSRAM)+ meta 3B;连同结构增量共 35B/条,未含 allocator 自身开销,低于 64B 设计目标 | +| action 结构 | 984 → 992B,+8B/动作;执行专用字段不序列化 | +| 日志固定捕获工作区 | 1624B,共两个槽,低于 2048B | +| watcher 固定槽表 | 32 × 24 = 768B 内部 RAM | +| 规则上下文 | 共 160B(包含原有字段);meta 已含其中 96B | +| 服务登记表 | 64 × 240 = 15360B,指定 PSRAM,失败不回退到内部 RAM | +| 新同步对象 | 按 7 个相关 mutex 的全部容量保守计 7 × 92 = 644B;实际部分是原有锁 | +| 动作队列 | 每项 1032B,16 项;结构增长连同对齐保守计增量不超过 256B | +| 其他控制 | guard 100B、回调任务表 32B、指针/原子/锁控制保守预留 256B | +| 新增常驻内部上界估算 | 1624+768+160+644+256+100+32+256 = **3840B**;特意把部分旧容量也计入。低于 8KiB 目标;链接器整体变化与运行堆仍不能由此推定 | +| 新增常驻任务 | 0(静态任务创建路径审查);实机任务数未测 | + +临时空间按实际上限计算,不把 PSRAM 当无限内存:令 C/A 为一条规则条件/动作数,各不超过 255。一个配置负载约 `16 + 144*C + 992*A`;一个冻结执行约 `992*A + 2368*S`,S 为需绑定的 SSH 动作数。每个同步结果 288B PSRAM 加现有二值信号量;watcher 配置 616B PSRAM,探测命令缓冲 3072B PSRAM,不增加栈。API 候选、引擎规范化候选、一个退役负载与实际执行快照可能同时存在;每次提交还有最多 `32*240=7680B` 的标量持久化视图。队列仍上限 16,退役配置全局上限 1,编辑候选门禁 1。JSON 使用工程已有 allocator,序列化的临时内存另计;分配失败明确拒绝,不无限回退内部 RAM。255 个动作的极限配置不保证在实际剩余内存下装得下。 + +NVS 分区维持 **48KiB**,还与证书/密钥/其他配置共享。双 bank 的最低数据量约为两份配置 JSON 加两份 bank metadata 和 guard,再加 NVS 页/条目/GC 开销,**不能承诺 32 条任意大规则都能放入 NVS**。模拟测试覆盖写失败时保留旧版或拒绝不确定恢复的语义;实际满容量、剩余空间、擦写耗时和断电未测。SD 权威保存后的镜像容量不足会显示“已保存,备份未同步”;NVS-only staging 空间不足拒绝新提交。未扩大分区。R01 保留未验收。 + +## 构建、工件与下一步 + +使用 ESP-IDF v5.5.2、本机 Python 3.12 环境和仓库 `tools/build.sh`,目标 ESP32-S3。分区和发布版本未擅自升级;dirty 构建版本仅作定位。工件清单、SHA-256、大小见 `evidence/artifacts.json`,文件位于 `build/runtime-repair-20260924/`。二进制是本地待验收工件,包含既有证书补丁及保留的其他 Web 改动。 + +测试命令与每项验收映射见 [VERIFICATION.md](VERIFICATION.md)。交付前仅检查源码/主机/构建,不做现场操作;批准设备测试后,按 E01/E02/R01 和未运行项在同板卡、同配置下完成回归,尤其是真实 Linux 进程组停止、SSH 共同调用者及断电恢复。 diff --git a/docs/runtime-repair/REVIEW_FIXES_REPORT.md b/docs/runtime-repair/REVIEW_FIXES_REPORT.md new file mode 100644 index 0000000..9421603 --- /dev/null +++ b/docs/runtime-repair/REVIEW_FIXES_REPORT.md @@ -0,0 +1,57 @@ +# 两轮 Reviewer 问题修复记录 + +2026-09-24,基于 HEAD d6ed947 的现有工作树,保留先前证书修复及其他并行页面改动。本轮完成 8 项定向修复和用户追加的交叉约束;本机回归与 ESP32-S3 构建通过。未刷机、清配置、提交或推送,不将本机通过称为实机验收通过。 + +## 修改与验收映射 + +| 项目 | 最终行为 | 主要验证 | +|---|---|---| +| R1 查询取消导致永久 busy | 登记身份、运行代次和操作凭证分开;旧结果丢弃,但自己的占用必须完成释放 | service_protocol:连接期间取消、后续查询/停止;旧 finish 不释放新查询占用 | +| R2 断网丢失 ready | 保存本次启动身份及日志就绪证据;仅同一实例可恢复 ready,换实例必须重新取得证据 | service_protocol:无页面恢复、实例变化、读日志期间换实例、错误启动回执 | +| R3 强删自动化任务 | 协作退出,短延迟等待正常停止;未完成返回 pending/error,重启拒绝;不清空远端管理登记 | stop_protocol:真实顶层 stop/task 与真实 engine;completion:真实队列准入/完成所有权;覆盖延迟和重复执行取消 | +| R4 页面持续 SSH 登录 | 普通状态接口只读缓存;用户明确核实才远端查询;启动前未知状态可先核实 | UI:周期调用不携带 verify;service_protocol:100 次缓存读取零新增连接,恢复预算不变 | +| R5 点号规则重启消失 | 目录加载按实际 .json/.tscfg 后缀识别;不笼统丢弃点号开头文件 | rule_reload:真实保存→加载普通、点号前缀及含 pending 的合法 ID,忽略真正临时文件 | +| R6 删除后登记不回收 | 删除建立门禁;持久配置删除成功后才回收;失败保留登记,旧凭证不能影响复用位置 | configuration_protocol:实际配置写包装;service_protocol:70 次同名不同 ID 重建、旧 pin/删除回执 | +| R7 缺失模板无法修复 | 无活动登记可修复/删除;活动服务登记独立于模板及动作完成状态,并保存启动规则身份 | engine:缺失引用修复/删除、动作已结束但独立服务活动时拒绝;service_protocol:配置丢失后仍保护所属规则 | +| R8 查询与主机修改混用目标 | 配置读取和占用建立共用准入协调;网络连接使用捕获的主机快照,不重读可变 ID | configuration_protocol:真实主机写包装与查询并发,写入被保护且实际连接原快照 | + +## 协议与产品边界 + +- 登记代次与操作凭证由本次开机内不复用的序号分配,耗尽时拒绝新准入。完成只释放对应占用;运行代次过期只影响结果发布,不影响自身清理。停止/取消使旧就绪证据失效。 +- 删除、命令身份修改、主机身份修改与查询准入共用 binding gate。网络 I/O 不持有该协调锁;配置删除期间登记保持 deleting 门禁,删除失败不回收。快照 pin 带登记身份,旧 unpin 不减新登记的引用。 +- 自动化停止关闭动作准入,最多短等 200ms;调用方和队列/执行者分别持有完成信用,全部归还且评估任务退出才报告停止。长操作仍在结束时返回“正在停止,请稍后重试”,期间 start/resume 不重新放行动作。现有网络超时继续负责结束 I/O,无外部强删。 +- 停止自动化不会停止真实模型,也不会清掉运行中或未知服务的登记。延迟和重复动作会协作结束;已经开始的动作正常释放自己的快照和临时占用。 +- 启动回执包含 Linux boot ID、PID、/proc start ticks。完成阶段必须与回执匹配;日志读取前后都复核同一实例。日志由本次启动重定向清空,不能用旧 ready 文本给新进程背书。 +- 断网恢复复用现有 watcher 容量,最多 3 次远端恢复尝试/启动代次、5 秒间隔、20 秒调度窗口;一次已开始的 I/O 仍受自身超时约束。预算仅在新启动代次建立,不因页面刷新、查询成功或恢复成功补充。资源不足时保留 unknown,不伪报恢复成功。 +- 正常页面显示的是最近一次证据及其时间,不代表持续在线监测。未增加永久远端健康轮询;用户显式核实与启动/停止仍会产生必要连接。 +- 服务独立记录启动规则身份。活动/未知服务所属规则的动作结构变更及删除受保护;名称、显示、手动/自动等不改变动作结构的编辑仍可进行。旧配置失去模板且不能恢复绑定时,保守检查独立服务登记,不以查找失败或动作已返回推断安全。 + +## 本机验证 + +- `bash tests/runtime/run_all.sh`:13 组 PASS,含原回归和新增交叉反例;C 主机测试使用 ASan/UBSan,文件/RTOS/SSH 等外部边界按各测试注明进行模拟。 +- `bash tests/certificate/run_host.sh`:8 组 PASS。日志中的旧 manager bug REPRODUCED 是基线反例,后续修复断言通过。 +- 实际配置写入口删除门禁补充断言、最终 UI VM 检查通过;app/router/terminal JavaScript 语法检查通过。 +- ESP-IDF 5.5.2 / ESP32-S3 构建 PASS,使用既有 Python 3.12 环境,没有 fullclean。固件大小 2,161,568B,app 分区剩余约 31%。 +- 构建结束时源码摘要核对无变化;工作区另有并行 Web 页面编辑,之后若继续变化,不应把该构建视为包含后续编辑。工件目录保存当次 manifest 和哈希。 +- 本轮后端改动的 diff whitespace 检查通过。全工作树 diff --check 仍报告 app.js 其他页面位置的 4 处尾随空白,未修改这些并行改动。详见 evidence/reviewer-fixes/diff-check.txt。 + +## ESP32-S3 资源预算 + +从目标 ELF DWARF 核对(不是主机 sizeof): + +| 项目 | 修复前 | 本轮后 | +|---|---:|---:| +| 服务登记,每条 | 240B | 416B | +| 64 条登记,固定 PSRAM | 15,360B | 26,624B | +| watcher 固定槽,每槽 | 24B | 24B | +| watcher 配置,按需 PSRAM | 616B | 620B | +| 动作绑定快照,按需 PSRAM | 2,368B | 2,372B | +| 规则 / 动作本体 | 240B / 992B | 不变 | + +新增登记 PSRAM 为 11,264B,无每次页面刷新分配或握手;队列 16、watcher 槽 32、规则退役负载上限不变。没有新增常驻任务或独立恢复调度器,恢复任务使用现有 watcher 槽和栈规格。新增固定序号/停止状态与计数为少量标量;实际总堆、短时任务退出重叠、TLS 峰值和栈最低余量仍需板卡测量,不能仅凭此表宣称整体性能验收完成。 + +## 尚未验证 + +未运行真实 ESP32-S3、真实 SSH 模型服务、多浏览器联机压力、三模型启动、Flash 断电或持久化耐久测试。Linux 实例身份/日志绑定路径已做受控反例,尚需在目标主机实测命令执行和停止。建议下一阶段在授权的测试设备验收 CPU、内部堆最低值、最大连续块、任务/栈余量、SSH 连接计数和 UI/API p95。 + +证据:`evidence/reviewer-fixes/`。工件:`build/reviewer-fixes-20260924/`,含固件、Web 镜像、构建日志、源码摘要与 SHA-256。 diff --git a/docs/runtime-repair/VERIFICATION.md b/docs/runtime-repair/VERIFICATION.md new file mode 100644 index 0000000..7527b22 --- /dev/null +++ b/docs/runtime-repair/VERIFICATION.md @@ -0,0 +1,83 @@ +# 验证记录 + +日期:2026-09-24。PASS 只针对列出的环境;PARTIAL 表示已有局部证据但该验收项尚未全部验收。NOT RUN 表示未执行。没有连接板卡或现场服务器。 + +## 可复现命令与测试模型 + +```sh +./tests/runtime/run_all.sh +./tests/certificate/run_host.sh +# 本机 SDK /Users/massif/esp/v5.5.2/esp-idf,使用其 Python 3.12 环境: +./tools/build.sh +``` + +- runtime:9 个套件 PASS,输出在 `evidence/host-tests.log`。源 JS 与中英语言文件语法检查通过。 +- certificate:此前 8 组回归再次运行,输出在 `evidence/certificate-tests.log`。服务停止回归先运行旧实现故障复现,再运行修复实现;旧实现失败为预期结果。 +- 构建:PASS,完整输出在本地工件目录 `target-build.log`;构建结果摘要及工件哈希保存在 evidence。没有执行构建日志给出的 flash 命令。 +- C 使用 ASan/UBSan;并发由 pthread/屏障模拟,不是 ESP32 双核调度。核心算法来自实际源码;I/O 与 RTOS 边界 stub。引擎套件模拟执行/存储接口,分别由 SSH/持久化套件验证这些实现,不能声称端到端固件运行。 +- store:188 次单点失败位置扫描(NVS、SD 两种来源各 94 次)和 79 个模拟崩溃位置。每次期望完整旧版/新版或显式拒绝恢复;部分编号超过实际路径调用次数,是无故障控制,不能全部称作独立失败分支。NVS mock 不模拟实际 flash 页/GC/电源中断。 +- codec:9 类动作、条件、repeat/动作条件、显式 false、整数值 FLOAT 类型保留、缺失模板保留;条件/动作内存失败,以及 encoder 每个 cJSON 分配位置失败。没有枚举所有字段组合的笛卡尔积。 +- SSH:未知/变更主机认证调用数为 0;合法确认可认证;握手、认证、开 channel、exec、读输出、close 六阶段永久 EAGAIN/取消;stderr-only 释放。真实 libssh2 和 lwIP 的失败释放仍需实机。 +- UI:实际函数在 VM 中运行;草稿/冲突/不确定写、双语、模板优先、日志请求防重入、旧 DOM 响应丢弃。没有用静态字符串搜索冒充页面交互测试,也没有把 VM 当浏览器渲染。 + +## 按交接文档映射 + +| 编号 | 状态 | 已有证据与仍未覆盖范围 | +|---|---|---| +| P01 | PARTIAL | UI 函数保存手动条件/类型并单次 update;codec round-trip;真实浏览器卡片布局/切换未运行 | +| P02 | PARTIAL | engine 遍历 enabled/manual/allow 组合;UI 显示由 show 决定;真实页面全部组合未运行 | +| P03 | PARTIAL | codec 缺省/显式 false、引擎兼容解析代码审查;完整历史现场配置未提供 | +| P04 | PARTIAL | 缺失模板序列化保留;UI 模板优先于缓存命令、请求失败 unresolved;启动加载顺序实机未运行 | +| P05 | PASS(主机) | 条件真时 manual 不自动准入,合法手动按 allow/enabled 准入 | +| P06 | PARTIAL | 引擎正常评估准入、保存 handler 无执行调用;真实调度循环未运行 | +| P07 | PARTIAL | 实际 service registry 拒绝重复准入,远端 mock;真实 Linux 锁目录/跨规则同时启动未运行 | +| P08 | PARTIAL | engine expected_revision 冲突、UI 单次带版本 update 和保留草稿;两个真实浏览器未运行 | +| P09 | PARTIAL | 主机/命令/模板/规则共同 binding gate 静态审查;已停止重绑定通过;全部 API 并发场景未运行 | +| C01 | PASS(主机范围) | codec 分配位置失败、engine 候选失败后旧配置/版本保留;生产内存压力未测 | +| C02 | PASS(模拟) | 短写、flush/fsync/close/rename、NVS set/commit/readback 故障扫描,错误传播 | +| C03 | PASS(模拟) | 主存储/镜像阶段故障及恢复检查;真实 NVS 满页/GC 未测 | +| C04 | PASS(模拟) | 不确定 guard/回滚路径不能作为成功;恢复失败不加载规则。真实硬件故障未测 | +| C05 | PASS(模拟) | 79 个模拟中断位置恢复为完整旧/新或 fail-closed;板卡断电 NOT RUN | +| C06 | PARTIAL | SD/NVS commit/load 与只读拒绝测试;完整加密包/旧单文件的设备升级回归未运行 | +| C07 | PARTIAL | 9 类动作及代表性非默认字段、条件/repeat round-trip;现场所有动作字段与保存重启未运行 | +| C08 | PARTIAL | 非法操作符、ID、逻辑 enum、引用/内存错误、probe 溢出测试;所有字段极限与 32 条最大实体容量未穷举 | +| O01 | PASS(主机) | variable getter 屏障中更新:旧判断不准入;执行屏障中更新:旧动作快照有效 | +| O02 | PASS(主机) | 活动执行禁止删除、同 ID 重建 instance 改变、统计不继承;旧代 ready 测试另覆盖 service | +| O03 | PARTIAL | 持有旧执行与新读者时第二个退役提交被拒绝,释放后归零;板卡 100 次高频编辑未运行 | +| L01 | PASS(主机) | 510/511/512/1024/4096 字节原始输出完整,自有日志 4096B 完整,缓存明确截断 | +| L02 | PARTIAL | 4 pthread × 1000 条、槽耗尽计数及锁争用降级;ESP32 双核/同核抢占时序未运行 | +| L03 | PASS(主机) | UTF-8/ANSI/末尾 m/空行及完整回传验证 | +| L04 | PASS(主机范围) | 实际 hook、自有入口、capture 开关、回调递归;init/deinit 与外部 IDF logger 极端并发未运行 | +| L05 | PARTIAL | 共同 client 所有日志级别捕获不含合成密码;静态移除私钥/原始命令诊断;全部 vendor 失败路径未动态执行 | +| W01 | PASS(主机) | task 创建失败、创建后立即 READY/结束,槽登记及释放正确 | +| W02 | PARTIAL | 协作停止/自然退出、资源计数;全部 stop_all/deinit 竞态组合及真机循环未运行 | +| W03 | PASS(主机) | 槽复用后旧句柄不能取消新 worker | +| W04 | PARTIAL | 间隔 notify 取消与 client 六阶段 deadline/cancel 测试;真实 TCP/DNS 丢包未运行,DNS 不可立即取消 | +| W05 | PASS(主机) | cancel 后旧 generation READY 不改 unknown/stopped | +| W06 | PASS(主机) | stderr-only/error、session/channel/socket/key 测试计数归零;真实库运输层释放需板卡验证 | +| S01 | PASS(主机) | 共同 client 匹配/未知/变更/明确 verifier 的认证门禁 | +| S02 | PARTIAL | API/CLI/自动/watcher/shell 调用点共同入口静态审查与完整编译;各入口真实服务器握手未运行 | +| S03 | PARTIAL | 永久 EAGAIN 不刷新 deadline、取消停止后续工作;真实丢包/DNS 未运行 | +| S04 | PASS(本机 shell) | 实际 C builder + /bin/sh:单引号、空格、前导 -、shell 元字符按字面量,溢出拒绝 | +| S05 | PASS(主机) | 精确 token、重复/前后缀拒绝、FAIL 优先;异常 exec 不当作 ready | +| U01 | PARTIAL | 日志请求串行、旧弹窗响应丢弃、查询错误保守状态;真实页面完整乱序/断网未运行 | +| U02 | PARTIAL | 启动后 watcher 创建失败、registry unknown 禁止盲启动;真实 exec 后断线未运行 | +| U03 | PARTIAL | watcher cancel 保留远端运行,remote stop mock 证据后 stopped;真实进程组 TERM 未运行 | +| U04 | PARTIAL | 自动模式停止提示/后端无永久抑制静态检查;真实用户交互及自动恢复未运行 | +| E01 | NOT RUN | 未连接现场三模型,不启动/停止真实模型,不刷机或设备重启 | +| E02 | PARTIAL | 优化 JS 语法/gzip、资源版本、SPIFFS 重生成哈希一致;设备浏览器实际下载/缓存未运行 | +| R01 | NOT RUN(运行回归) | 目标 sizeof 与静态容量审计完成;下表实机前后数据均缺失 | + +## 同板卡资源表(待设备测试授权/环境) + +| 场景/指标 | 修复前 | 修复后 | 判定 | +|---|---|---|---| +| 空闲面板:内部当前/最小空闲/最大块、PSRAM、DMA | 未测 | 未测 | NOT RUN | +| 页面进出、断网恢复:任务/socket/watcher、堆趋势 | 未测 | 未测 | NOT RUN | +| 32 条无匹配规则:评估 p95、allocation instrumentation | 未测 | 未测 | NOT RUN | +| 100 次模式切换:NVS/SD 时延、最大保存容量、碎片 | 未测 | 未测 | NOT RUN | +| 100 轮安全测试进程 start/stop/timeout/cancel:堆、栈 HWM、socket | 未测 | 未测 | NOT RUN | +| 同配置普通 API p95,解释超过 10% 的退化 | 未测 | 未测 | NOT RUN | +| 三模型链及持续观察:任务栈 HWM、内存/连接稳定性 | 未测 | 未测 | NOT RUN | + +DNS 原生等待、旧单 PID 实例接管、NVS 双 bank 48KiB 共享容量和真实 Linux process group 行为是下一轮优先核验点。没有从旧 0.5.1 串口日志推断本次修复后的任何运行指标。 diff --git a/docs/runtime-repair/baseline-notes.md b/docs/runtime-repair/baseline-notes.md new file mode 100644 index 0000000..00e5fae --- /dev/null +++ b/docs/runtime-repair/baseline-notes.md @@ -0,0 +1,17 @@ +# Gate 0(2026-09-24) + +HEAD d6ed947a592265fa12754828bc79803fc50c1db2。交接文档已完整读取。 +原工作区证书/HTTPS/time/PKI/API/WebUI 补丁及 tests/certificate 保留;开工 diff 和修改文件 SHA 保存在 /tmp/tianshan-runtime-start。原有 output/、tmp/ 不动。未找到额外仓库 AGENTS.md;遵守用户提供约束。 + +实际构建配置目标 esp32s3,SDK /Users/massif/esp/v5.5.2/esp-idf,已有 Python3.12 构建环境;PSRAM OCT/80MHz、内部保留16KiB来自 sdkconfig,未作为硬件检测结果。无板卡采样/现场完整 JSON;使用合成配置。 + +已核实仍存在:卡片 manual 过滤、手动保存丢条件、delete/add 编辑、无 revision、借用指针解锁使用、先 free 再分配、保存错误丢失、日志512截断/共享 scratch、watcher 裸句柄与强删、SSH认证前缺少信任检查、EAGAIN无总deadline。 + +当前规则权威加载优先 SD目录(同名tscfg优先)>旧单文件> NVS。当前 register/enable/delete 全量保存;普通 SD JSON、NVS需要新恢复协议;不可安全写回的加密/旧单文件来源在改内存前拒绝写,不删除或明文降级。 + +调用清单 /tmp/tianshan-runtime-start/{rule,ssh}-callers.txt:规则调用来自自动评估任务、API、CLI、启动加载;SSH来自API/CLI/自动动作/日志监控/shell。API规则详情和导出借用内部指针;规则/模板执行跨网络等待。共同路径修改需逐个回归。 + +批次 A 日志;B 规则所有权与存储;C 字段/UI与服务准入;D SSH生命周期与信任;E 构建和综合验收。原证书修复不作为本轮功能测试替代。 +资源目标:新增常驻任务0,常规评估/日志新增分配0;日志工作区<=2KiB,规则元数据<=64B/条,新增内部常驻<=8KiB。实际sizeof/链接图与实机未测分开记录。 + +收尾核对:开工已有的证书/HTTPS/时间/PKI/服务管理器文件 SHA 保持不变;共同 Web 文件在本轮叠加修改。期间另一任务继续修改 index.html、api.js、app.js、router.js、terminal.js 和语言文件;均保留。最终构建前后源码 SHA manifest 相同,记录于工件目录,不能把这个联合工作区等同于已提交版本。构建生成的 bin 保留为本轮新工件,未刷写。 diff --git a/docs/runtime-repair/evidence/artifacts.json b/docs/runtime-repair/evidence/artifacts.json new file mode 100644 index 0000000..b7ae210 --- /dev/null +++ b/docs/runtime-repair/evidence/artifacts.json @@ -0,0 +1,26 @@ +{ + "TianShanOS.bin": { + "bytes": 2157264, + "sha256": "1b32fa63b196fd97f5e69811ab88bc7758f611b43242c1712a5da4c879f4565f" + }, + "www.bin": { + "bytes": 3145728, + "sha256": "b0fa8484b032e1a457dc2e42faa8b2eb5dce75a7ba4f141464ec270a3e0c4bce" + }, + "bootloader/bootloader.bin": { + "bytes": 22496, + "sha256": "293d3ec188d6246688c6d1d971ece0f7dcc130117cb04be5aa1d36a80550c81f" + }, + "partition_table/partition-table.bin": { + "bytes": 3072, + "sha256": "973dfb7f44bdd42d525e53fcc1eb06ac5745687dddc1c73223715df841d785e5" + }, + "ota_data_initial.bin": { + "bytes": 8192, + "sha256": "7d2c7ac4888bfd75cd5f56e8d61f69595121183afc81556c876732fd3782c62f" + }, + "flasher_args.json": { + "bytes": 1169, + "sha256": "5288d74c7e3ee9e0369f93f9418802ad2b455159cae42f6261c29be818034cc9" + } +} diff --git a/docs/runtime-repair/evidence/build-summary.txt b/docs/runtime-repair/evidence/build-summary.txt new file mode 100644 index 0000000..f144689 --- /dev/null +++ b/docs/runtime-repair/evidence/build-summary.txt @@ -0,0 +1,8 @@ +[1/7] Copying web assets to build directory +TianShanOS.bin binary size 0x20ead0 bytes. Smallest app partition is 0x300000 bytes. 0xf1530 bytes (31%) free. +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[6/7] Minifying + gzipping web resources +Minifying web resources in /Users/massif/TianshanOS/build/esp-idf/ts_webui/web_optimized... +[7/7] cd /Users/massif/TianshanOS/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /Users/massif/TianshanOS/build/esp-idf/ts_webui/web_optimized /Users/massif/TianshanOS/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +Project build complete. To flash, run: +✅ 当前固件版本: 0.5.1+d6ed947d.09240429 diff --git a/docs/runtime-repair/evidence/certificate-tests.log b/docs/runtime-repair/evidence/certificate-tests.log new file mode 100644 index 0000000..9512e4e --- /dev/null +++ b/docs/runtime-repair/evidence/certificate-tests.log @@ -0,0 +1,9 @@ +PASS UTC/serial bounds and bounded retry/control policy +PASS material: real SDK mbedTLS, mocked NVS/allocation/events, state/time/concurrent snapshots +PASS UI: error typing, bilingual/fallback, text output, uncertain POST, button recovery, refresh separation +PASS actual HTTPS lifecycle: init/start/URI/stop failures, retained ownership, duplicate start, loaded generation, optional CA +PASS actual coordinator with simulated scheduler: fallback, duplicate events, bounded retries, stop intent, explicit restart, stage errors +PASS actual cert API handlers: JSON validation, PEM installation, business errors, additive status, active/stored separation +PASS actual time notifications/UTC readiness and cooperative enrollment stop (syscalls/tasks mocked) +REPRODUCED manager stop bug: callback failure becomes success/stopped +PASS manager stop/restart: failed stop retained, restart aborted, successful/duplicate stop unchanged diff --git a/docs/runtime-repair/evidence/host-tests.log b/docs/runtime-repair/evidence/host-tests.log new file mode 100644 index 0000000..d26733e --- /dev/null +++ b/docs/runtime-repair/evidence/host-tests.log @@ -0,0 +1,9 @@ +PASS actual log hook/parser: full 510..4096 output, bounded UTF-8 preview, ANSI, concurrent capture/drop, full own output, callback recursion, capture toggle +PASS rule codec: nine action types, conditions/repeats/explicit false, allocation failures, unsupported operator; rule=256 action=1000 +PASS actual rule persistence: NVS and SD fault injection, recovery boundaries, read-only rejection +PASS actual rule engine: revisions/no-op/allocation failures, stale-evaluation barrier, pinned old execution, retirement bound, enable/manual/allow matrix, recreate identity +PASS actual SSH client: pre-auth trust gate, six EAGAIN phase deadlines/cancellation, stderr-only cleanup, bounded wait +PASS actual service registry + watcher: duplicate admission, task failure, immediate finish, stale handle, cooperative cancellation, late READY rejection, truthful remote stop/unknown +PASS production synchronous action completion: timeout then late result, success, queue rejection; semaphore lifetime balanced +PASS actual probe builder: quotes, spaces, leading dash, literal shell metacharacters, fail priority, exact tokens, overflow +PASS actual UI functions: bilingual states, one revisioned update, manual conditions/types, inline fields/repeat preservation, explicit false vs omitted, conflict/draft/uncertain write diff --git a/docs/runtime-repair/evidence/resource-sizeof.txt b/docs/runtime-repair/evidence/resource-sizeof.txt new file mode 100644 index 0000000..1455fc3 --- /dev/null +++ b/docs/runtime-repair/evidence/resource-sizeof.txt @@ -0,0 +1,16 @@ +Xtensa ESP32-S3 ELF DWARF sizeof (bytes), SDK 5.5.2 +s_capture: 1624 +watch slots: 768 +service_t: 240 +ts_auto_rule_t: 240 +ts_auto_action_t: 992 +ts_action_queue_entry_t: 1032 +rule context: 160 +rule meta array: 96 +StaticSemaphore_t: 92 +action_completion_t: 288 +action_binding_t: 2368 +ts_auto_condition_t: 144 +rule_payload_t: 16 +watch config: 616 +Baseline HEAD same target compiler: rule=224, action=984 bytes diff --git a/docs/runtime-repair/evidence/reviewer-fixes/build-source-check.txt b/docs/runtime-repair/evidence/reviewer-fixes/build-source-check.txt new file mode 100644 index 0000000..d3282fc --- /dev/null +++ b/docs/runtime-repair/evidence/reviewer-fixes/build-source-check.txt @@ -0,0 +1 @@ +Source changes during build: [] diff --git a/docs/runtime-repair/evidence/reviewer-fixes/certificate.log b/docs/runtime-repair/evidence/reviewer-fixes/certificate.log new file mode 100644 index 0000000..9512e4e --- /dev/null +++ b/docs/runtime-repair/evidence/reviewer-fixes/certificate.log @@ -0,0 +1,9 @@ +PASS UTC/serial bounds and bounded retry/control policy +PASS material: real SDK mbedTLS, mocked NVS/allocation/events, state/time/concurrent snapshots +PASS UI: error typing, bilingual/fallback, text output, uncertain POST, button recovery, refresh separation +PASS actual HTTPS lifecycle: init/start/URI/stop failures, retained ownership, duplicate start, loaded generation, optional CA +PASS actual coordinator with simulated scheduler: fallback, duplicate events, bounded retries, stop intent, explicit restart, stage errors +PASS actual cert API handlers: JSON validation, PEM installation, business errors, additive status, active/stored separation +PASS actual time notifications/UTC readiness and cooperative enrollment stop (syscalls/tasks mocked) +REPRODUCED manager stop bug: callback failure becomes success/stopped +PASS manager stop/restart: failed stop retained, restart aborted, successful/duplicate stop unchanged diff --git a/docs/runtime-repair/evidence/reviewer-fixes/configuration.log b/docs/runtime-repair/evidence/reviewer-fixes/configuration.log new file mode 100644 index 0000000..81c5541 --- /dev/null +++ b/docs/runtime-repair/evidence/reviewer-fixes/configuration.log @@ -0,0 +1 @@ +PASS actual configuration wrappers: host edit vs query, immutable target, failed delete preserves registration, successful delete then same-name replacement diff --git a/docs/runtime-repair/evidence/reviewer-fixes/resource-sizeof.txt b/docs/runtime-repair/evidence/reviewer-fixes/resource-sizeof.txt new file mode 100644 index 0000000..b39e0b1 --- /dev/null +++ b/docs/runtime-repair/evidence/reviewer-fixes/resource-sizeof.txt @@ -0,0 +1,7 @@ + +warning: Section .debug_aranges in /Users/massif/TianshanOS/build/TianShanOS.elf entry at offset 56 debug_info_offset 3221684224 does not exists, ignoring .debug_aranges. +$1 = 416 +$2 = 24 +$3 = 620 +$4 = 2372 +$5 = 168 diff --git a/docs/runtime-repair/evidence/reviewer-fixes/runtime.log b/docs/runtime-repair/evidence/reviewer-fixes/runtime.log new file mode 100644 index 0000000..616b71a --- /dev/null +++ b/docs/runtime-repair/evidence/reviewer-fixes/runtime.log @@ -0,0 +1,13 @@ +PASS actual log hook/parser: full 510..4096 output, bounded UTF-8 preview, ANSI, concurrent capture/drop, full own output, callback recursion, capture toggle +PASS rule codec: nine action types, conditions/repeats/explicit false, allocation failures, unsupported operator; rule=256 action=1000 +PASS actual rule persistence: NVS and SD fault injection, recovery boundaries, read-only rejection +PASS actual rule engine: revisions/no-op/allocation failures, stale-evaluation barrier, pinned old execution, retirement bound, enable/manual/allow matrix, recreate identity +PASS actual SSH client: pre-auth trust gate, six EAGAIN phase deadlines/cancellation, stderr-only cleanup, bounded wait +PASS actual service registry + watcher: duplicate admission, task failure, immediate finish, stale handle, cooperative cancellation, late READY rejection, truthful remote stop/unknown +PASS service protocol: stale credentials, cancellation cleanup, deletion barrier/failure/reuse, 70 replacements, missing config protection, physical identity, page-free recovery, 3-attempt budget, zero-I/O cached reads +PASS production synchronous action completion: timeout then late result, success, queue rejection; semaphore lifetime balanced +PASS actual configuration wrappers: host edit vs query, immutable target, failed delete preserves registration, successful delete then same-name replacement +PASS actual store -> current loader: normal/dot IDs, temporary files ignored, reload retains saved rule +PASS actual automation stop + engine: blocked action returns normally, leases/executing clear, async work prevents restart, independent remote ownership retained +PASS actual probe builder: quotes, spaces, leading dash, literal shell metacharacters, fail priority, exact tokens, overflow +PASS actual UI functions: bilingual states, one revisioned update, manual conditions/types, inline fields/repeat preservation, explicit false vs omitted, conflict/draft/uncertain write diff --git a/docs/runtime-repair/evidence/reviewer-fixes/ui-final.log b/docs/runtime-repair/evidence/reviewer-fixes/ui-final.log new file mode 100644 index 0000000..aa17785 --- /dev/null +++ b/docs/runtime-repair/evidence/reviewer-fixes/ui-final.log @@ -0,0 +1 @@ +PASS actual UI functions: bilingual states, one revisioned update, manual conditions/types, inline fields/repeat preservation, explicit false vs omitted, conflict/draft/uncertain write diff --git a/docs/runtime-repair/evidence/web-artifact-check.txt b/docs/runtime-repair/evidence/web-artifact-check.txt new file mode 100644 index 0000000..3436368 --- /dev/null +++ b/docs/runtime-repair/evidence/web-artifact-check.txt @@ -0,0 +1,3 @@ +PASS: optimized JavaScript syntax; gzip matches optimized originals; resource version 20260924-prompts-runtime; regenerated SPIFFS bytes identical to build/www.bin. +PASS: modified source SHA manifest stable during final build. +NOT RUN: browser downloading these resources from ESP32. diff --git a/main/ts_https_retry.h b/main/ts_https_retry.h new file mode 100644 index 0000000..cf01556 --- /dev/null +++ b/main/ts_https_retry.h @@ -0,0 +1,27 @@ +#ifndef TS_HTTPS_RETRY_H +#define TS_HTTPS_RETRY_H +#include +#include +/* Pure policy shared by the coordinator and host tests. Times are monotonic ms. */ +typedef struct { + uint32_t generation, control; + bool ready; + unsigned failures; + int64_t due_ms; +} ts_https_retry_t; +static inline bool ts_https_retry_due(ts_https_retry_t *r, uint32_t generation, + uint32_t control, bool desired, bool ready, int64_t now) +{ + if (generation != r->generation || control != r->control || (ready && !r->ready)) { + r->failures = 0; r->due_ms = 0; + } + r->generation = generation; r->control = control; r->ready = ready; + return desired && ready && r->failures < 4 && now >= r->due_ms; +} +static inline void ts_https_retry_failed(ts_https_retry_t *r, int64_t now) +{ + static const int delay[] = {1000, 5000, 15000}; + if (r->failures < 3) r->due_ms = now + delay[r->failures]; + ++r->failures; +} +#endif diff --git a/main/ts_services.c b/main/ts_services.c index 93745a0..d45b61c 100644 --- a/main/ts_services.c +++ b/main/ts_services.c @@ -40,6 +40,8 @@ #include "ts_device_ctrl.h" #include "ts_config_file.h" #include "esp_log.h" +#include "esp_timer.h" +#include "ts_https_retry.h" static const char *TAG = "ts_services"; @@ -550,17 +552,17 @@ static esp_err_t security_service_start(ts_service_handle_t handle, void *user_d ts_cert_pki_status_t cert_status; esp_err_t ret = ts_cert_get_status(&cert_status); - if (ret == ESP_OK && cert_status.status != TS_CERT_STATUS_ACTIVATED) { - /* 没有有效证书,启动自动注册 */ + if (ret == ESP_OK && (!cert_status.has_certificate || cert_status.cert_info.validity == TS_CERT_VALIDITY_EXPIRED)) { + /* 缺证书或确实过期才自动注册;待校时/尚未生效不触发替换。 */ ESP_LOGI(TAG, "No valid certificate, starting auto-enrollment..."); ret = ts_pki_client_start_auto_enroll(pki_enroll_callback, NULL); if (ret != ESP_OK) { ESP_LOGW(TAG, "Failed to start auto-enrollment: %s", esp_err_to_name(ret)); } } else if (ret == ESP_OK) { - ESP_LOGI(TAG, "Certificate status: %s (valid for %d days)", + ESP_LOGI(TAG, "Certificate status: %s, time validity: %s", ts_cert_status_to_str(cert_status.status), - cert_status.cert_info.days_until_expiry); + ts_cert_validity_to_str(cert_status.cert_info.validity)); } /* 证书已就绪,现在加载加密的配置文件 (.tscfg) */ @@ -652,166 +654,163 @@ static bool api_service_health(ts_service_handle_t handle, void *user_data) * HTTPS 服务回调 (mTLS) - 事件驱动方式 * ========================================================================== */ -/* HTTPS 服务状态 */ +/* TLS lifecycle has exactly one owner. Events only wake it; no event stack TLS work. */ static struct { - bool pending_init; /* 等待时间同步后初始化 */ - ts_service_handle_t handle; /* 服务句柄 */ -} s_https_state = {0}; + TaskHandle_t task; + ts_event_handler_handle_t time_handler, material_handler; + bool desired; + uint32_t control, completed; + esp_err_t stop_result; +} s_https_state; +static portMUX_TYPE s_https_control_lock = portMUX_INITIALIZER_UNLOCKED; + +static void https_conditions_changed(const ts_event_t *event, void *user_data) +{ + (void)event; (void)user_data; + portENTER_CRITICAL(&s_https_control_lock); + TaskHandle_t task = s_https_state.task; + portEXIT_CRITICAL(&s_https_control_lock); + if (task) xTaskNotifyGive(task); +} -/* 时间同步事件处理器 - 当时间同步完成后初始化 HTTPS */ -static void https_time_sync_handler(const ts_event_t *event, void *user_data) +static esp_err_t https_cleanup(void) { - (void)user_data; - - if (!s_https_state.pending_init) { - return; - } - - ESP_LOGI(TAG, "Time synced, now initializing HTTPS with valid time..."); - - /* 刷新 PKI 状态(使用正确的系统时间) */ - ts_cert_refresh_status(); - - /* 检查 PKI 状态 */ - ts_cert_pki_status_t pki_status; - esp_err_t ret = ts_cert_get_status(&pki_status); - if (ret != ESP_OK || pki_status.status != TS_CERT_STATUS_ACTIVATED) { - ESP_LOGW(TAG, "PKI not activated after time sync, HTTPS disabled"); - s_https_state.pending_init = false; - return; - } - - /* 初始化 HTTPS 服务器 */ - ts_https_config_t config = TS_HTTPS_CONFIG_DEFAULT(); - ret = ts_https_init(&config); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to init HTTPS: %s", esp_err_to_name(ret)); - s_https_state.pending_init = false; - return; - } - - /* 注册默认 API 端点 */ - ret = ts_https_register_default_api(); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to register default API: %s", esp_err_to_name(ret)); - s_https_state.pending_init = false; - return; - } - - /* 启动 HTTPS 服务器 */ - ret = ts_https_start(); - if (ret == ESP_OK) { - ESP_LOGI(TAG, "HTTPS server started on port 443 (mTLS enabled) [delayed start]"); - } else { - ESP_LOGE(TAG, "Failed to start HTTPS: %s", esp_err_to_name(ret)); + esp_err_t ret = ts_https_stop(); + if (ret == ESP_OK) ts_https_deinit(); + return ret; +} + +static void https_coordinator(void *arg) +{ + (void)arg; + ts_https_retry_t retry = {0}; + for (;;) { + bool desired; + uint32_t control, completed; + portENTER_CRITICAL(&s_https_control_lock); + desired = s_https_state.desired; + control = s_https_state.control; + completed = s_https_state.completed; + portEXIT_CRITICAL(&s_https_control_lock); + if (!desired) { + if (completed != control) { + esp_err_t ret = https_cleanup(); + portENTER_CRITICAL(&s_https_control_lock); + s_https_state.stop_result = ret; + s_https_state.completed = control; + portEXIT_CRITICAL(&s_https_control_lock); + } + } else if (!ts_https_is_running()) { + ts_cert_pki_status_t status = {0}; + ts_https_config_t config = TS_HTTPS_CONFIG_DEFAULT(); + esp_err_t ret = ts_cert_get_status(&status); + bool ready = ret == ESP_OK && ts_cert_prerequisites(&status, config.require_client_cert); + int64_t now = esp_timer_get_time() / 1000; + if (ts_https_retry_due(&retry, status.generation, control, true, ready, now)) { + const char *stage = "cleanup"; + ret = https_cleanup(); + if (ret == ESP_OK) { stage = "init"; ret = ts_https_init(&config); } + if (ret == ESP_OK) { stage = "default_endpoints"; ret = ts_https_register_default_api(); } + /* Stop intent supersedes this attempt before starting the listener. */ + portENTER_CRITICAL(&s_https_control_lock); + bool current = s_https_state.desired && control == s_https_state.control; + portEXIT_CRITICAL(&s_https_control_lock); + if (ret == ESP_OK && current) { stage = "start"; ret = ts_https_start(); } + if (ret != ESP_OK || !current) { + esp_err_t cleanup = https_cleanup(); + if (cleanup != ESP_OK) { stage = "cleanup"; ret = cleanup; } + if (ret != ESP_OK) { + ts_https_record_error(stage, ret); + ts_https_retry_failed(&retry, esp_timer_get_time() / 1000); + } + } + /* A stop arriving inside TLS start is serviced before its acknowledgement. */ + portENTER_CRITICAL(&s_https_control_lock); + current = s_https_state.desired && control == s_https_state.control; + portEXIT_CRITICAL(&s_https_control_lock); + if (!current) continue; + } + } + uint32_t wait_ms = 5000; + int64_t remaining = retry.due_ms - esp_timer_get_time() / 1000; + if (desired && retry.failures > 0 && retry.failures < 4 && remaining > 0 && remaining < wait_ms) + wait_ms = (uint32_t)remaining; + ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(wait_ms)); } - - s_https_state.pending_init = false; +} + +static void https_unregister(ts_event_handler_handle_t *handler) +{ + if (!*handler) return; + esp_err_t ret = ts_event_unregister(*handler); + if (ret == ESP_OK) *handler = NULL; + else ESP_LOGW(TAG, "HTTPS subscription cleanup: %s", esp_err_to_name(ret)); } static esp_err_t https_service_init(ts_service_handle_t handle, void *user_data) { - (void)user_data; - - ESP_LOGI(TAG, "Initializing HTTPS service..."); - s_https_state.handle = handle; - - /* 检查系统时间是否有效(年份 >= 2025) */ - if (ts_time_sync_needs_sync()) { - /* 时间无效,注册事件等待时间同步后再初始化 */ - ESP_LOGI(TAG, "System time invalid (< 2025), waiting for time sync event..."); - s_https_state.pending_init = true; - - /* 注册时间同步事件处理器 */ - ts_event_register(TS_EVENT_BASE_TIME, TS_EVENT_TIME_SYNCED, - https_time_sync_handler, NULL, NULL); - - ESP_LOGI(TAG, "HTTPS init deferred until time sync completes"); - return ESP_OK; /* 非阻塞返回,不影响其他服务 */ - } - - /* 时间有效,直接初始化 */ - ESP_LOGI(TAG, "System time valid, initializing HTTPS immediately..."); - - /* 刷新 PKI 状态 */ - ts_cert_refresh_status(); - - /* 检查 PKI 状态 */ - ts_cert_pki_status_t pki_status; - esp_err_t ret = ts_cert_get_status(&pki_status); - if (ret != ESP_OK || pki_status.status != TS_CERT_STATUS_ACTIVATED) { - ESP_LOGW(TAG, "PKI not activated, HTTPS server will not start"); - ESP_LOGW(TAG, "Use 'pki' command to generate and install certificates"); - return ESP_OK; /* 不是致命错误,继续 */ - } - - /* 初始化 HTTPS 服务器 */ - ts_https_config_t config = TS_HTTPS_CONFIG_DEFAULT(); - ret = ts_https_init(&config); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to init HTTPS: %s", esp_err_to_name(ret)); - return ret; - } - - /* 注册默认 API 端点 */ - ret = ts_https_register_default_api(); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to register default API: %s", esp_err_to_name(ret)); - return ret; + (void)handle; (void)user_data; + if (s_https_state.task) return ESP_OK; + esp_err_t ret = ESP_OK; + if (!s_https_state.time_handler) + ret = ts_event_register(TS_EVENT_BASE_TIME, TS_EVENT_TIME_SYNCED, + https_conditions_changed, NULL, &s_https_state.time_handler); + if (ret != ESP_OK) return ret; + if (!s_https_state.material_handler) + ret = ts_event_register(TS_EVENT_BASE_PKI, TS_EVENT_PKI_MATERIAL_CHANGED, + https_conditions_changed, NULL, &s_https_state.material_handler); + if (ret == ESP_OK) { + /* Internal stack: TLS and material reads may touch Flash. Not a PSRAM stack. */ + TaskHandle_t task; + if (xTaskCreate(https_coordinator, "https_coord", 8192, NULL, 5, &task) == pdPASS) { + portENTER_CRITICAL(&s_https_control_lock); + s_https_state.task = task; + portEXIT_CRITICAL(&s_https_control_lock); + return ESP_OK; + } + ret = ESP_ERR_NO_MEM; } - - return ESP_OK; + https_unregister(&s_https_state.material_handler); + https_unregister(&s_https_state.time_handler); + return ret; } static esp_err_t https_service_start(ts_service_handle_t handle, void *user_data) { - (void)handle; - (void)user_data; - - ESP_LOGI(TAG, "Starting HTTPS service..."); - - /* 如果正在等待时间同步,跳过启动(会在事件回调中启动) */ - if (s_https_state.pending_init) { - ESP_LOGI(TAG, "HTTPS start deferred (waiting for time sync)"); - return ESP_OK; - } - - /* 检查是否已初始化 */ - ts_cert_pki_status_t pki_status; - esp_err_t ret = ts_cert_get_status(&pki_status); - if (ret != ESP_OK || pki_status.status != TS_CERT_STATUS_ACTIVATED) { - ESP_LOGW(TAG, "HTTPS server not starting (PKI not activated)"); - return ESP_OK; - } - - ret = ts_https_start(); - if (ret != ESP_OK) { - ESP_LOGE(TAG, "Failed to start HTTPS: %s", esp_err_to_name(ret)); - return ret; - } - - ESP_LOGI(TAG, "HTTPS server started on port 443 (mTLS enabled)"); - return ESP_OK; + (void)handle; (void)user_data; + if (!s_https_state.task) return ESP_ERR_INVALID_STATE; + portENTER_CRITICAL(&s_https_control_lock); + s_https_state.desired = true; + ++s_https_state.control; + portEXIT_CRITICAL(&s_https_control_lock); + xTaskNotifyGive(s_https_state.task); + return ESP_OK; /* Scheduled; actual listening is reported by ts_https_get_runtime(). */ } static esp_err_t https_service_stop(ts_service_handle_t handle, void *user_data) { - (void)handle; - (void)user_data; - - ESP_LOGI(TAG, "Stopping HTTPS service..."); - - ts_https_stop(); - ts_https_deinit(); - - return ESP_OK; + (void)handle; (void)user_data; + if (!s_https_state.task) return ESP_OK; + portENTER_CRITICAL(&s_https_control_lock); + s_https_state.desired = false; + uint32_t control = ++s_https_state.control; + portEXIT_CRITICAL(&s_https_control_lock); + xTaskNotifyGive(s_https_state.task); + for (unsigned i = 0; i < 300; ++i) { + portENTER_CRITICAL(&s_https_control_lock); + bool done = s_https_state.completed == control; + esp_err_t ret = s_https_state.stop_result; + portEXIT_CRITICAL(&s_https_control_lock); + if (done) return ret; + vTaskDelay(pdMS_TO_TICKS(100)); + } + ts_https_record_error("stop_timeout", ESP_ERR_TIMEOUT); + return ESP_ERR_TIMEOUT; } static bool https_service_health(ts_service_handle_t handle, void *user_data) { - (void)handle; - (void)user_data; - + (void)handle; (void)user_data; return ts_https_is_running(); } diff --git a/sdkconfig b/sdkconfig index c2e19e5..3a04067 100644 --- a/sdkconfig +++ b/sdkconfig @@ -2464,6 +2464,7 @@ CONFIG_TS_SECURITY_MTLS_ENABLE=y CONFIG_TS_SECURITY_TOKEN_EXPIRE_SEC=86400 CONFIG_TS_SECURITY_MAX_SESSIONS=8 CONFIG_TS_SECURITY_PERMISSION_LEVELS=4 +CONFIG_TS_SSH_LOG_WATCH_MAX=32 # end of TianShanOS Security Configuration # diff --git a/tests/certificate/README.md b/tests/certificate/README.md new file mode 100644 index 0000000..6ae2e36 --- /dev/null +++ b/tests/certificate/README.md @@ -0,0 +1,68 @@ +# Certificate repair host tests + +These tests use **production C/JavaScript**, ESP-IDF 5.5.2's bundled mbedTLS 3.6.5 +and cJSON sources. They do not connect to devices or change the host clock. +NVS, ESP heap allocation, event delivery, scheduler and HTTP server sockets are +substitutes. The mbedTLS host configuration is its default configuration, not the +ESP32 hardware configuration. This does not validate hardware TLS or Flash. + +Prerequisites: C compiler with ASan/UBSan, CMake, Node, Python with `cryptography`, +and the existing ESP-IDF checkout. No production credentials are read. Credentials +are generated into the temporary build directory with fixed 2026 validity dates. +Private keys are test-only, temporary, and never printed. + +On this macOS workspace (Command Line Tools avoids requiring changes to Xcode's +license/global selection): + +```sh +export DEVELOPER_DIR=/Library/Developer/CommandLineTools +export IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf +export CERT_MBEDTLS_BUILD=/tmp/tianshan-cert-mbedtls +/Users/massif/.espressif/tools/cmake/3.30.2/CMake.app/Contents/bin/cmake \ + -S "$IDF_PATH/components/mbedtls/mbedtls" -B "$CERT_MBEDTLS_BUILD" \ + -DENABLE_TESTING=OFF -DENABLE_PROGRAMS=OFF -DCMAKE_BUILD_TYPE=Debug +/Users/massif/.espressif/tools/cmake/3.30.2/CMake.app/Contents/bin/cmake \ + --build "$CERT_MBEDTLS_BUILD" -j 6 +./tests/certificate/run_host.sh +``` + +Override `CERT_TEST_PYTHON`, `CERT_TEST_BUILD`, `CERT_MBEDTLS_BUILD`, `IDF_PATH` +as needed. On other systems set `DEVELOPER_DIR` appropriately or remove it. +Nothing is installed globally. The runner recompiles tests with ASan/UBSan; +prebuilt mbedTLS is not sanitizer-instrumented. The application under test is. + +- `test_time_retry.c`: pure UTC conversion, calendar limits, serial output boundaries, + retry schedule and control intent policy. +- `test_material.c`: includes the entire production certificate implementation; + real mbedTLS parses generated PEM and checks keys. Injected heap/parse allocation, + NVS set/commit/read and notification failures; pthread readers/writers; metadata + polling and CSR retention. A failed NVS commit deliberately leaves the mock write + visible, proving the implementation does not assume rollback. +- `test_lifecycle.c`: production HTTPS lifecycle, with mocked server and snapshot + provider. Tests failed URI registration and failed cleanup without losing ownership. +- `test_coordinator.c`: production coordinator on a simulated pthread scheduler and + monotonic clock. Tests retry exhaustion, event duplication, fallback, explicit + stop/restart and stop during an in-flight start. Timing is simulated, not measured + FreeRTOS scheduling or worst-case latency. +- `test_api.c`: production JSON handlers plus the production certificate module and + SDK cJSON. HTTP transport/auth middleware are not exercised. +- `test_time_cancel.c`: production clock notification/readiness and cancellation + functions with mocked syscalls. Tests never call the real `settimeofday`. +- `test_ui.cjs`: executes production functions in Node with DOM/API substitutes; + bilingual keys, text errors, uncertain results, button recovery and refresh errors. + This is not browser layout or real Web UI acceptance. + +`extract_lifecycle.py` extracts unchanged function bodies into the temporary build +folder to avoid compiling unrelated SDK request handlers. It does not reimplement +these functions. Tests fail to compile if the source boundaries change. Full target +compilation separately validates the complete translation units. + +See `docs/CERTIFICATE_FIX_REPORT.md` for all A/B/C/D acceptance mappings, limits, +and the remaining device acceptance procedure. + +`./tests/certificate/test_service_stop.sh` (also included in `run_host.sh`) +reproduces the generic manager defect from HEAD and tests the current production +stop/restart functions with mocked callbacks and event delivery. Failure, timeout, +and invalid-state errors prevent restart; successful and duplicate stops and a +successful restart are covered. The user explicitly approved this minimal scope +extension. No source files are changed by this test. diff --git a/tests/certificate/extract_lifecycle.py b/tests/certificate/extract_lifecycle.py new file mode 100644 index 0000000..7d67bdd --- /dev/null +++ b/tests/certificate/extract_lifecycle.py @@ -0,0 +1,27 @@ +"""Compile production lifecycle without unrelated request handlers and SDK transport internals.""" +from pathlib import Path +import sys +s=Path('components/ts_https/src/ts_https.c').read_text() +end=s.index('esp_err_t ts_https_register_endpoint(') +Path(sys.argv[1]).write_text(s[:end]) +s=Path('main/ts_services.c').read_text() +start=s.index('/* TLS lifecycle has exactly one owner.') +end=s.index('/* ============================================================================\n * Console', start) +Path(sys.argv[1]).with_name('coordinator.inc').write_text(s[start:end]) +s=Path('components/ts_api/src/ts_api_cert.c').read_text() +# Extract helper functions and exactly three unchanged handlers; no alternate implementations. +pieces=[s[s.index('static const char *status_to_display'):s.index('/*===========================================================================*/\n/* API Handlers')]] +for name in ['api_cert_status','api_cert_install','api_cert_install_ca']: + start=s.index('static esp_err_t '+name+'(') + end=s.index('\n}\n',start)+3 + pieces.append(s[start:end]) +Path(sys.argv[1]).with_name('api.inc').write_text('\n'.join(pieces)) +def function(source, declaration): + start=source.index(declaration) + end=source.index('\n}\n',start)+3 + return source[start:end] +s=Path('components/ts_net/src/ts_time_sync.c').read_text() +pieces=[function(s,d) for d in ['static void notify_clock_updated(', 'static void time_sync_notification_cb(', 'esp_err_t ts_time_sync_set_time(', 'bool ts_time_sync_needs_sync(']] +s=Path('components/ts_pki_client/src/ts_pki_client.c').read_text() +pieces.append(function(s,'void ts_pki_client_stop_auto_enroll(')) +Path(sys.argv[1]).with_name('time_cancel.inc').write_text('\n'.join(pieces)) diff --git a/tests/certificate/generate_fixtures.py b/tests/certificate/generate_fixtures.py new file mode 100644 index 0000000..54c2b83 --- /dev/null +++ b/tests/certificate/generate_fixtures.py @@ -0,0 +1,30 @@ +"""Ephemeral test-only P-256 credentials; fixed dates, no production material.""" +from pathlib import Path +from datetime import datetime, timezone +import sys +from cryptography import x509 +from cryptography.x509.oid import NameOID, ExtendedKeyUsageOID +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import ec +out = Path(sys.argv[1]); out.mkdir(parents=True, exist_ok=True) +key = ec.generate_private_key(ec.SECP256R1()) +ca_key = ec.generate_private_key(ec.SECP256R1()) +other = ec.generate_private_key(ec.SECP256R1()) +def name(cn): return x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, cn)]) +issuer = name('TianShan isolated test CA') +def cert(label, public, start, end, serial, ca=False): + c = (x509.CertificateBuilder().subject_name(issuer if ca else name('localhost')) + .issuer_name(issuer).public_key(public.public_key()).serial_number(serial) + .not_valid_before(datetime.fromisoformat(start).replace(tzinfo=timezone.utc)) + .not_valid_after(datetime.fromisoformat(end).replace(tzinfo=timezone.utc)) + .add_extension(x509.BasicConstraints(ca=ca, path_length=None), critical=True) + .add_extension(x509.SubjectAlternativeName([x509.DNSName('localhost')]), critical=False)) + if not ca: c = c.add_extension(x509.ExtendedKeyUsage([ExtendedKeyUsageOID.SERVER_AUTH, ExtendedKeyUsageOID.CLIENT_AUTH]), critical=False) + out.joinpath(label+'.pem').write_bytes(c.sign(ca_key, hashes.SHA256()).public_bytes(serialization.Encoding.PEM)) +cert('ca',ca_key,'2020-01-01','2099-01-01',1,True) +cert('a',key,'2026-01-01','2027-01-01',2) +cert('b',key,'2026-01-01','2027-01-01',3) +cert('future',key,'2050-01-01','2051-01-01',4) +cert('expired',key,'2020-01-01','2021-01-01',5) +cert('wrong',other,'2026-01-01','2027-01-01',6) +out.joinpath('key.pem').write_bytes(key.private_bytes(serialization.Encoding.PEM,serialization.PrivateFormat.PKCS8,serialization.NoEncryption())) diff --git a/tests/certificate/run_host.sh b/tests/certificate/run_host.sh new file mode 100755 index 0000000..e9b6f63 --- /dev/null +++ b/tests/certificate/run_host.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -euo pipefail +cd "$(dirname "$0")/../.." +: "${IDF_PATH:=/Users/massif/esp/v5.5.2/esp-idf}" +: "${CERT_TEST_BUILD:=/tmp/tianshan-certificate-tests}" +: "${CERT_MBEDTLS_BUILD:=/tmp/tianshan-cert-mbedtls}" +: "${CERT_TEST_PYTHON:=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python}" +export DEVELOPER_DIR="${DEVELOPER_DIR:-/Library/Developer/CommandLineTools}" +mkdir -p "$CERT_TEST_BUILD" +"$CERT_TEST_PYTHON" tests/certificate/generate_fixtures.py "$CERT_TEST_BUILD/fixtures" +cc -std=c11 -g -fsanitize=address,undefined -Icomponents/ts_cert/include tests/certificate/test_time_retry.c components/ts_cert/src/ts_cert_time.c -o "$CERT_TEST_BUILD/time_retry" +"$CERT_TEST_BUILD/time_retry" +cc -std=c11 -g -fsanitize=address,undefined -Wno-unused-function -Itests/certificate/stubs -Icomponents/ts_cert/include -I"$IDF_PATH/components/mbedtls/mbedtls/include" tests/certificate/test_material.c components/ts_cert/src/ts_cert_time.c "$CERT_MBEDTLS_BUILD/library/libmbedx509.a" "$CERT_MBEDTLS_BUILD/library/libmbedcrypto.a" -lpthread -o "$CERT_TEST_BUILD/material" +"$CERT_TEST_BUILD/material" "$CERT_TEST_BUILD/fixtures" +node tests/certificate/test_ui.cjs +"$CERT_TEST_PYTHON" tests/certificate/extract_lifecycle.py "$CERT_TEST_BUILD/lifecycle.inc" +cc -std=c11 -g -fsanitize=address,undefined -I"$CERT_TEST_BUILD" -Itests/certificate/stubs -Icomponents/ts_cert/include -Icomponents/ts_https/include -Icomponents/ts_https/src -I"$IDF_PATH/components/mbedtls/mbedtls/include" tests/certificate/test_lifecycle.c -lpthread -o "$CERT_TEST_BUILD/lifecycle" +"$CERT_TEST_BUILD/lifecycle" +cc -std=c11 -g -fsanitize=address,undefined -I"$CERT_TEST_BUILD" -Itests/certificate/stubs -Icomponents/ts_cert/include -Icomponents/ts_https/include -Icomponents/ts_https/src -I"$IDF_PATH/components/mbedtls/mbedtls/include" tests/certificate/test_coordinator.c -lpthread -o "$CERT_TEST_BUILD/coordinator" +"$CERT_TEST_BUILD/coordinator" +cc -std=c11 -g -fsanitize=address,undefined -Wno-deprecated-declarations -I"$CERT_TEST_BUILD" -Itests/certificate/stubs -Icomponents/ts_cert/include -Icomponents/ts_https/include -I"$IDF_PATH/components/mbedtls/mbedtls/include" -I"$IDF_PATH/components/json/cJSON" tests/certificate/test_api.c components/ts_cert/src/ts_cert_time.c "$IDF_PATH/components/json/cJSON/cJSON.c" "$CERT_MBEDTLS_BUILD/library/libmbedx509.a" "$CERT_MBEDTLS_BUILD/library/libmbedcrypto.a" -lpthread -o "$CERT_TEST_BUILD/api" +"$CERT_TEST_BUILD/api" "$CERT_TEST_BUILD/fixtures" +cc -std=c11 -g -fsanitize=address,undefined -I"$CERT_TEST_BUILD" -Itests/certificate/stubs tests/certificate/test_time_cancel.c -lpthread -o "$CERT_TEST_BUILD/time_cancel" +"$CERT_TEST_BUILD/time_cancel" + +./tests/certificate/test_service_stop.sh diff --git a/tests/certificate/stubs/esp_err.h b/tests/certificate/stubs/esp_err.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/esp_err.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/esp_heap_caps.h b/tests/certificate/stubs/esp_heap_caps.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/esp_heap_caps.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/esp_http_server.h b/tests/certificate/stubs/esp_http_server.h new file mode 100644 index 0000000..e72a3f6 --- /dev/null +++ b/tests/certificate/stubs/esp_http_server.h @@ -0,0 +1,18 @@ +#ifndef TEST_HTTP_H +#define TEST_HTTP_H +#include "platform.h" +typedef void *httpd_handle_t; +typedef struct { int dummy; } httpd_req_t; +typedef int httpd_method_t; +#define HTTP_GET 0 +#define HTTP_POST 1 +#define HTTP_PUT 2 +#define HTTP_DELETE 3 +typedef struct { + const char *uri; + httpd_method_t method; + esp_err_t (*handler)(httpd_req_t *); + void *user_ctx; +} httpd_uri_t; +int httpd_register_uri_handler(httpd_handle_t,const httpd_uri_t *); +#endif diff --git a/tests/certificate/stubs/esp_https_server.h b/tests/certificate/stubs/esp_https_server.h new file mode 100644 index 0000000..8aa1f82 --- /dev/null +++ b/tests/certificate/stubs/esp_https_server.h @@ -0,0 +1,10 @@ +#include "esp_http_server.h" +typedef struct { + struct {int server_port,max_open_sockets,recv_wait_timeout,send_wait_timeout,task_caps,stack_size;bool lru_purge_enable,enable_so_linger;} httpd; + uint16_t port_secure; + const uint8_t *servercert,*prvtkey_pem,*cacert_pem; + size_t servercert_len,prvtkey_len,cacert_len; +} httpd_ssl_config_t; +#define HTTPD_SSL_CONFIG_DEFAULT() {0} +int httpd_ssl_start(httpd_handle_t *,httpd_ssl_config_t *); +int httpd_ssl_stop(httpd_handle_t); diff --git a/tests/certificate/stubs/esp_log.h b/tests/certificate/stubs/esp_log.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/esp_log.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/esp_netif.h b/tests/certificate/stubs/esp_netif.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/esp_netif.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/esp_tls.h b/tests/certificate/stubs/esp_tls.h new file mode 100644 index 0000000..fa7b8f2 --- /dev/null +++ b/tests/certificate/stubs/esp_tls.h @@ -0,0 +1 @@ +typedef void esp_tls_t; diff --git a/tests/certificate/stubs/freertos/FreeRTOS.h b/tests/certificate/stubs/freertos/FreeRTOS.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/freertos/FreeRTOS.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/freertos/semphr.h b/tests/certificate/stubs/freertos/semphr.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/freertos/semphr.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/lwip/inet.h b/tests/certificate/stubs/lwip/inet.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/lwip/inet.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/nvs.h b/tests/certificate/stubs/nvs.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/nvs.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/nvs_flash.h b/tests/certificate/stubs/nvs_flash.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/nvs_flash.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/platform.h b/tests/certificate/stubs/platform.h new file mode 100644 index 0000000..edaac6b --- /dev/null +++ b/tests/certificate/stubs/platform.h @@ -0,0 +1,64 @@ +#ifndef CERT_TEST_PLATFORM_H +#define CERT_TEST_PLATFORM_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef int esp_err_t; +#define ESP_OK 0 +#define ESP_FAIL -1 +#define ESP_ERR_INVALID_ARG 0x102 +#define ESP_ERR_INVALID_STATE 0x103 +#define ESP_ERR_INVALID_SIZE 0x104 +#define ESP_ERR_NOT_FOUND 0x105 +#define ESP_ERR_NO_MEM 0x101 +#define ESP_ERR_TIMEOUT 0x106 +#define ESP_ERR_NVS_NOT_FOUND 0x1102 +#define ESP_ERR_NOT_SUPPORTED 0x107 +static inline const char *esp_err_to_name(int e) { return e == 0 ? "ESP_OK" : "TEST_ERROR"; } +#define ESP_LOGI(...) ((void)0) +#define ESP_LOGW(...) ((void)0) +#define ESP_LOGE(...) ((void)0) +#define ESP_LOGD(...) ((void)0) +#define MALLOC_CAP_SPIRAM 1 +#define MALLOC_CAP_8BIT 2 +#define MALLOC_CAP_INTERNAL 4 +#define portMAX_DELAY 0xffffffff +#define TS_TIME_MIN_VALID_YEAR 2025 +#define TS_EVENT_BASE_PKI "ts_pki" +#define TS_EVENT_PKI_MATERIAL_CHANGED 1 +#define NVS_READWRITE 1 +typedef int nvs_handle_t; +typedef pthread_mutex_t StaticSemaphore_t; +typedef pthread_mutex_t *SemaphoreHandle_t; +typedef pthread_mutex_t portMUX_TYPE; +#define portMUX_INITIALIZER_UNLOCKED PTHREAD_MUTEX_INITIALIZER +#define portENTER_CRITICAL(p) pthread_mutex_lock(p) +#define portEXIT_CRITICAL(p) pthread_mutex_unlock(p) +static inline SemaphoreHandle_t xSemaphoreCreateMutexStatic(StaticSemaphore_t *p) { pthread_mutex_init(p,NULL); return p; } +static inline int xSemaphoreTake(SemaphoreHandle_t p, unsigned t) { (void)t; return pthread_mutex_lock(p)==0; } +static inline int xSemaphoreGive(SemaphoreHandle_t p) { return pthread_mutex_unlock(p)==0; } +void *heap_caps_malloc(size_t n, unsigned caps); +esp_err_t nvs_open(const char *, int, nvs_handle_t *); +void nvs_close(nvs_handle_t); +esp_err_t nvs_get_str(nvs_handle_t,const char *,char *,size_t *); +esp_err_t nvs_set_str(nvs_handle_t,const char *,const char *); +esp_err_t nvs_erase_key(nvs_handle_t,const char *); +esp_err_t nvs_commit(nvs_handle_t); +esp_err_t ts_event_post(const char *, int, const void *,size_t,unsigned); +typedef void *ts_keypair_t; +#define TS_CRYPTO_KEY_EC_P256 1 +esp_err_t ts_crypto_keypair_generate(int,ts_keypair_t *); +esp_err_t ts_crypto_keypair_export_private(ts_keypair_t,char *,size_t *); +void ts_crypto_keypair_free(ts_keypair_t); +typedef void esp_netif_t; +typedef struct { struct { uint32_t addr; } ip; } esp_netif_ip_info_t; +static inline esp_netif_t *esp_netif_get_handle_from_ifkey(const char *p) { (void)p; return NULL; } +static inline int esp_netif_get_ip_info(esp_netif_t *p,esp_netif_ip_info_t *i) { (void)p; (void)i; return ESP_FAIL; } +#endif diff --git a/tests/certificate/stubs/ts_core.h b/tests/certificate/stubs/ts_core.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/ts_core.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/ts_crypto.h b/tests/certificate/stubs/ts_crypto.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/ts_crypto.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/ts_event.h b/tests/certificate/stubs/ts_event.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/ts_event.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/stubs/ts_time_sync.h b/tests/certificate/stubs/ts_time_sync.h new file mode 100644 index 0000000..948df4b --- /dev/null +++ b/tests/certificate/stubs/ts_time_sync.h @@ -0,0 +1 @@ +#include "platform.h" diff --git a/tests/certificate/test_api.c b/tests/certificate/test_api.c new file mode 100644 index 0000000..da84184 --- /dev/null +++ b/tests/certificate/test_api.c @@ -0,0 +1,42 @@ +#define main material_suite +#include "test_material.c" +#undef main +#include "cJSON.h" +#include "ts_https.h" +#define TS_API_ERR_INVALID_ARG 1 +#define TS_API_ERR_INTERNAL 7 +#define TS_API_ERR_NO_MEM 8 +#define TS_LOGI(...) ((void)0) +#define TS_LOGE(...) ((void)0) +typedef struct {int code;const char *error;cJSON *data;} ts_api_result_t; +static void ts_api_result_error(ts_api_result_t *r,int code,const char *e) {r->code=code;r->error=e;} +static void ts_api_result_ok(ts_api_result_t *r,cJSON *d) {r->code=0;r->data=d;} +static ts_https_runtime_t runtime={.port=443,.require_client_cert=true}; +void ts_https_get_runtime(ts_https_runtime_t *r) {*r=runtime;} +#include "api.inc" +static ts_api_result_t invoke(bool ca_input,const char *pem) { + cJSON *params=cJSON_CreateObject();cJSON_AddStringToObject(params,ca_input?"ca_pem":"cert_pem",pem); + ts_api_result_t r={0};int ret=ca_input?api_cert_install_ca(params,&r):api_cert_install(params,&r); + assert((ret==0)==(r.code==0));cJSON_Delete(params);return r; +} +int main(int argc,char **argv) { + assert(argc==2);stored[0]=read_pem(argv[1],"key");a=read_pem(argv[1],"a");b=read_pem(argv[1],"b");ca=read_pem(argv[1],"ca"); + assert(ts_cert_init()==0);ts_api_result_t r=invoke(false,a);assert(r.code==0&&!strcmp(stored[1],a));cJSON_Delete(r.data); + r=invoke(true,ca);assert(r.code==0);cJSON_Delete(r.data); + cJSON *bad[]={NULL,cJSON_Parse("{}"),cJSON_Parse("{\"cert_pem\":3}"),cJSON_Parse("{\"cert_pem\":\"\"}")}; + for(unsigned i=0;i<4;++i){r=(ts_api_result_t){0};assert(api_cert_install(bad[i],&r)!=0&&r.error);cJSON_Delete(bad[i]);} + r=invoke(false,"garbage");assert(r.code!=0&&strstr(r.error,"parse")); + r=(ts_api_result_t){0};assert(api_cert_status(NULL,&r)==0); + assert(cJSON_IsTrue(cJSON_GetObjectItem(r.data,"prerequisites_satisfied"))); + assert(!cJSON_IsTrue(cJSON_GetObjectItem(cJSON_GetObjectItem(r.data,"https"),"running")));cJSON_Delete(r.data); + runtime.running=true;runtime.loaded_generation=status().generation;strcpy(runtime.loaded_certificate_sha256,"ACTIVE-A"); + r=invoke(false,b);assert(r.code==0);cJSON_Delete(r.data); + r=(ts_api_result_t){0};assert(api_cert_status(NULL,&r)==0); + assert(cJSON_IsTrue(cJSON_GetObjectItem(r.data,"restart_required"))); + assert(!strcmp(cJSON_GetObjectItem(cJSON_GetObjectItem(r.data,"https"),"loaded_certificate_sha256")->valuestring,"ACTIVE-A"));cJSON_Delete(r.data); + clock_now=0;r=(ts_api_result_t){0};assert(api_cert_status(NULL,&r)==0); + cJSON *info=cJSON_GetObjectItem(r.data,"cert_info");assert(cJSON_IsNull(cJSON_GetObjectItem(info,"seconds_until_expiry")));assert(!cJSON_IsTrue(cJSON_GetObjectItem(info,"is_valid")));cJSON_Delete(r.data); + ts_cert_deinit();for(int i=0;i<3;++i)free(stored[i]);free(a);free(b);free(ca); + puts("PASS actual cert API handlers: JSON validation, PEM installation, business errors, additive status, active/stored separation"); + return 0; +} diff --git a/tests/certificate/test_coordinator.c b/tests/certificate/test_coordinator.c new file mode 100644 index 0000000..9af37ea --- /dev/null +++ b/tests/certificate/test_coordinator.c @@ -0,0 +1,75 @@ +#define main lifecycle_suite +#include "test_lifecycle.c" +#undef main +#include +#include +#include "../../main/ts_https_retry.h" +typedef void *ts_service_handle_t; +typedef void *ts_event_handler_handle_t; +typedef struct {int id;} ts_event_t; +typedef pthread_t *TaskHandle_t; +typedef int BaseType_t; +#define pdTRUE 1 +#define pdPASS 1 +#define pdMS_TO_TICKS(ms) (ms) +#define TS_EVENT_BASE_TIME "time" +#define TS_EVENT_TIME_SYNCED 1 +static pthread_t worker; +static _Atomic int64_t simulated_ms; +static _Atomic bool allowed; +static _Atomic unsigned created_tasks,subscribed; +static int64_t esp_timer_get_time(void) {return atomic_load(&simulated_ms)*1000;} +static void vTaskDelay(unsigned ticks) {(void)ticks;usleep(1000);} +static unsigned ulTaskNotifyTake(int clear,unsigned ticks) {(void)clear;(void)ticks;usleep(1000);return 0;} +static void xTaskNotifyGive(TaskHandle_t t) {(void)t;} +static void (*task_fn)(void *); +static void *task_entry(void *arg) {(void)arg;task_fn(NULL);return NULL;} +static BaseType_t xTaskCreate(void (*fn)(void *),const char *name,unsigned stack,void *arg,unsigned priority,TaskHandle_t *out) { + (void)name;(void)stack;(void)arg;(void)priority;task_fn=fn;*out=&worker;created_tasks++;assert(!pthread_create(&worker,NULL,task_entry,NULL));return pdPASS; +} +static int ts_event_register(const char *base,int id,void (*handler)(const ts_event_t *,void *),void *data,ts_event_handler_handle_t *out) { + (void)base;(void)id;(void)handler;(void)data;*out=(void *)1;subscribed++;return 0; +} +static int ts_event_unregister(ts_event_handler_handle_t h) {(void)h;subscribed--;return 0;} +static int default_error; +esp_err_t ts_https_register_default_api(void) {if(default_error)return default_error;s_endpoint_count=1;s_endpoints[0]=(ts_https_endpoint_t){.uri="/api/auth/whoami"};return 0;} +esp_err_t ts_cert_get_status(ts_cert_pki_status_t *out) {memset(out,0,sizeof(*out));out->generation=stored_generation;out->time_ready=atomic_load(&allowed);return 0;} +bool ts_cert_prerequisites(const ts_cert_pki_status_t *s,bool ca_required) {(void)ca_required;return s->time_ready;} +#include "coordinator.inc" +static void settle(void) {usleep(30000);} +static void wait_running(bool running) {for(int i=0;i<1000;++i){if(ts_https_is_running()==running)return;usleep(1000);}assert(!"coordinator timeout");} +static void *stop_request(void *unused) {(void)unused;assert(https_service_stop(NULL,NULL)==0);return NULL;} +int main(void) { + assert(https_service_init(NULL,NULL)==0);assert(https_service_init(NULL,NULL)==0);assert(created_tasks==1&&subscribed==2); + assert(https_service_start(NULL,NULL)==0);settle();assert(!ts_https_is_running()); + // No event: low-frequency fallback notices the final prerequisite. + atomic_store(&allowed,true);simulated_ms=5000;wait_running(true); + unsigned count=starts; + for(int i=0;i<100;++i)https_conditions_changed(NULL,NULL);settle();assert(starts==count); + stored_generation=2;settle();ts_https_runtime_t r;ts_https_get_runtime(&r);assert(r.loaded_generation==1); + assert(https_service_stop(NULL,NULL)==0);assert(!ts_https_is_running()); + for(int i=0;i<100;++i)https_conditions_changed(NULL,NULL);simulated_ms=100000;settle();assert(starts==count); + start_error=ESP_FAIL;assert(https_service_start(NULL,NULL)==0);settle();assert(starts==count+1); + simulated_ms=101000;settle();assert(starts==count+2); + simulated_ms=106000;settle();assert(starts==count+3); + simulated_ms=121000;settle();assert(starts==count+4); + simulated_ms=999999;for(int i=0;i<100;++i)https_conditions_changed(NULL,NULL);settle();assert(starts==count+4); + assert(https_service_stop(NULL,NULL)==0);start_error=0; + assert(https_service_start(NULL,NULL)==0);wait_running(true);ts_https_get_runtime(&r);assert(r.loaded_generation==2); + // Stop failure is reported, buffers remain; a subsequent explicit stop recovers. + stop_error=ESP_FAIL;assert(https_service_stop(NULL,NULL)==ESP_FAIL);assert(ts_https_is_running());stop_error=0; + assert(https_service_stop(NULL,NULL)==0);assert(!ts_https_is_running()); + // Initialization and default endpoint failures share the bounded retry policy. + init_error=ESP_ERR_NO_MEM;count=starts;assert(https_service_start(NULL,NULL)==0);settle();ts_https_get_runtime(&r);assert(r.last_error==ESP_ERR_NO_MEM&&!strcmp(r.last_error_stage,"init"));assert(starts==count); + assert(https_service_stop(NULL,NULL)==0);init_error=0;default_error=ESP_FAIL; + assert(https_service_start(NULL,NULL)==0);settle();ts_https_get_runtime(&r);assert(!strcmp(r.last_error_stage,"default_endpoints"));assert(!allocations); + assert(https_service_stop(NULL,NULL)==0);default_error=0; + block_start=true; + assert(https_service_start(NULL,NULL)==0); + for(int i=0;!inside_start&&i<1000;++i)usleep(1000); + assert(inside_start); + pthread_t stopping;pthread_create(&stopping,NULL,stop_request,NULL);settle(); + stored_generation=3;https_conditions_changed(NULL,NULL);block_start=false; + pthread_join(stopping,NULL);assert(!ts_https_is_running());settle();assert(!ts_https_is_running()); + puts("PASS actual coordinator with simulated scheduler: fallback, duplicate events, bounded retries, stop intent, explicit restart, stage errors"); +} diff --git a/tests/certificate/test_lifecycle.c b/tests/certificate/test_lifecycle.c new file mode 100644 index 0000000..84b4d3d --- /dev/null +++ b/tests/certificate/test_lifecycle.c @@ -0,0 +1,46 @@ +/* The build extracts the unmodified production lifecycle section (not a model). + * TLS sockets and certificate snapshot provider are deterministic substitutes. */ +#include "lifecycle.inc" +#include +#include +static _Atomic int init_error,start_error,stop_error,uri_error; +static _Atomic bool block_start, inside_start; +static _Atomic unsigned starts,stops,registrations,allocations; +static _Atomic uint32_t stored_generation=1; +static bool has_ca=true; +static esp_err_t generic_handler(httpd_req_t *r) { (void)r;return ESP_OK; } +esp_err_t ts_cert_get_snapshot(bool require_ca,ts_cert_snapshot_t *out) { + memset(out,0,sizeof(*out));if(init_error)return init_error; + if(require_ca&&!has_ca)return ESP_ERR_INVALID_STATE; + out->key=strdup("key");out->certificate=strdup("cert");if(has_ca)out->ca=strdup("ca"); + out->generation=stored_generation;snprintf(out->certificate_sha256,65,"certificate-%u",stored_generation);++allocations;return ESP_OK; +} +void ts_cert_free_snapshot(ts_cert_snapshot_t *s) {if(s->key)--allocations;free(s->key);free(s->certificate);free(s->ca);memset(s,0,sizeof(*s));} +int httpd_ssl_start(httpd_handle_t *h,httpd_ssl_config_t *c) {(void)c;++starts;inside_start=true;while(block_start)usleep(1000);inside_start=false;if(start_error)return start_error;*h=(void *)1;return ESP_OK;} +int httpd_ssl_stop(httpd_handle_t h) {assert(h);++stops;return stop_error;} +int httpd_register_uri_handler(httpd_handle_t h,const httpd_uri_t *u) {(void)u;assert(h);++registrations;return uri_error;} +static void candidate(void) { + assert(ts_https_init(NULL)==0); + s_endpoints[0]=(ts_https_endpoint_t){.uri="/api/auth/whoami"};s_endpoint_count=1; +} +int main(void) { + ts_https_runtime_t r; + has_ca=false;assert(ts_https_init(NULL)==ESP_ERR_INVALID_STATE);assert(!allocations); + ts_https_config_t config=TS_HTTPS_CONFIG_DEFAULT();config.require_client_cert=false; + assert(ts_https_init(&config)==0);assert(s_ca_chain==NULL);assert(ts_https_start()==0);ts_https_deinit();assert(!allocations); + has_ca=true;init_error=ESP_ERR_NO_MEM;assert(ts_https_init(NULL)==ESP_ERR_NO_MEM);init_error=0; + candidate();start_error=ESP_FAIL;assert(ts_https_start()!=0);assert(!ts_https_is_running());ts_https_deinit();assert(!allocations);start_error=0; + candidate();uri_error=ESP_FAIL;assert(ts_https_start()!=0);assert(!ts_https_is_running());ts_https_deinit();assert(!allocations);uri_error=0; + candidate();assert(ts_https_start()==0);unsigned before=registrations; + for(int i=0;i<100;++i)assert(ts_https_start()==0);assert(registrations==before); + ts_https_get_runtime(&r);assert(r.running&&r.loaded_generation==1); + stored_generation=2;ts_https_get_runtime(&r);assert(r.loaded_generation==1); // stored B cannot impersonate A + stop_error=ESP_FAIL;assert(ts_https_stop()!=0);ts_https_deinit();assert(allocations==1&&s_server&&ts_https_is_running()); + stop_error=0;assert(ts_https_stop()==0);ts_https_deinit();assert(!allocations&&!s_server); + candidate();assert(ts_https_start()==0);ts_https_get_runtime(&r);assert(r.loaded_generation==2&&!strcmp(r.loaded_certificate_sha256,"certificate-2"));ts_https_deinit(); + // Half-start cleanup failure must retain handle/materials without claiming running. + candidate();uri_error=ESP_FAIL;stop_error=ESP_FAIL;assert(ts_https_start()!=0);assert(s_server&&allocations==1&&!ts_https_is_running());ts_https_deinit();assert(s_server&&allocations==1); + stop_error=0;uri_error=0;ts_https_deinit();assert(!allocations&&!s_server); + puts("PASS actual HTTPS lifecycle: init/start/URI/stop failures, retained ownership, duplicate start, loaded generation, optional CA"); + return 0; +} diff --git a/tests/certificate/test_material.c b/tests/certificate/test_material.c new file mode 100644 index 0000000..8483f21 --- /dev/null +++ b/tests/certificate/test_material.c @@ -0,0 +1,131 @@ +#include "platform.h" +#include +static _Atomic int64_t clock_now = 1790121600; /* 2026-09-23 UTC */ +static time_t test_clock(time_t *out) { time_t t = atomic_load(&clock_now); if(out)*out=t; return t; } +static bool fail_alloc; +static void *test_malloc(size_t n) { return fail_alloc ? NULL : malloc(n); } +#include "mbedtls/x509_crt.h" +static bool fail_parse_alloc; +static int test_parse(mbedtls_x509_crt *crt,const unsigned char *pem,size_t len) { + return fail_parse_alloc ? MBEDTLS_ERR_X509_ALLOC_FAILED : mbedtls_x509_crt_parse(crt,pem,len); +} +#define mbedtls_x509_crt_parse test_parse +#define time test_clock +#define malloc test_malloc +#include "../../components/ts_cert/src/ts_cert.c" +#undef mbedtls_x509_crt_parse +#undef malloc +#undef time + +static char *stored[3]; +static unsigned writes, commits, events; +static bool fail_set, fail_commit, fail_read, drop_event; +static int slot(const char *key) { return !strcmp(key,"privkey") ? 0 : !strcmp(key,"cert") ? 1 : !strcmp(key,"ca_chain") ? 2 : -1; } +void *heap_caps_malloc(size_t n,unsigned caps) { (void)caps; return test_malloc(n); } +esp_err_t nvs_open(const char *name,int mode,nvs_handle_t *h) { (void)name;(void)mode;*h=1;return ESP_OK; } +void nvs_close(nvs_handle_t h) { (void)h; } +esp_err_t nvs_get_str(nvs_handle_t h,const char *key,char *out,size_t *len) { + (void)h; int i=slot(key); if(fail_read)return ESP_FAIL; + if(i<0||!stored[i])return ESP_ERR_NVS_NOT_FOUND; + size_t n=strlen(stored[i])+1; + if(!out){*len=n;return ESP_OK;} if(*len=0); + free(stored[i]);stored[i]=strdup(value);return ESP_OK; +} +esp_err_t nvs_erase_key(nvs_handle_t h,const char *key) { + (void)h;int i=slot(key);if(fail_set)return ESP_FAIL; + if(i<0||!stored[i])return ESP_ERR_NVS_NOT_FOUND;free(stored[i]);stored[i]=NULL;return ESP_OK; +} +esp_err_t nvs_commit(nvs_handle_t h) { (void)h;++commits;return fail_commit?ESP_FAIL:ESP_OK; } +esp_err_t ts_event_post(const char *base,int id,const void *data,size_t len,unsigned wait) { + (void)base;(void)id;(void)data;(void)len;(void)wait;++events;return drop_event?ESP_FAIL:ESP_OK; +} +esp_err_t ts_crypto_keypair_generate(int type,ts_keypair_t *key) { + (void)type;mbedtls_pk_context *pk=malloc(sizeof(*pk));if(!pk)return ESP_ERR_NO_MEM; + mbedtls_pk_init(pk);int ret=mbedtls_pk_setup(pk,mbedtls_pk_info_from_type(MBEDTLS_PK_ECKEY)); + if(!ret)ret=mbedtls_ecp_gen_key(MBEDTLS_ECP_DP_SECP256R1,mbedtls_pk_ec(*pk),mbedtls_ctr_drbg_random,&s_ctr_drbg); + if(ret){mbedtls_pk_free(pk);free(pk);return ESP_FAIL;}*key=pk;return ESP_OK; +} +esp_err_t ts_crypto_keypair_export_private(ts_keypair_t key,char *out,size_t *len) { + int ret=mbedtls_pk_write_key_pem(key,(unsigned char *)out,*len);if(ret)return ESP_FAIL;*len=strlen(out)+1;return ESP_OK; +} +void ts_crypto_keypair_free(ts_keypair_t key) {mbedtls_pk_free(key);free(key);} +static char *read_pem(const char *dir,const char *name) { + char path[1024];snprintf(path,sizeof(path),"%s/%s.pem",dir,name);FILE *f=fopen(path,"rb");assert(f); + fseek(f,0,SEEK_END);long n=ftell(f);rewind(f);char *p=malloc(n+1);assert(fread(p,1,n,f)==(size_t)n);p[n]=0;fclose(f);return p; +} +static ts_cert_pki_status_t status(void) { ts_cert_pki_status_t s;assert(ts_cert_get_status(&s)==ESP_OK);return s; } +static void install(const char *p) { assert(ts_cert_install_certificate(p,strlen(p)+1)==ESP_OK); } +static void reload(void) { ts_cert_deinit();assert(ts_cert_init()==ESP_OK); } +static char *a,*b,*ca; +static void *writer(void *arg) { (void)arg;for(int i=0;i<100;++i)install(i%2?a:b);return NULL; } +static void *reader(void *arg) { (void)arg;for(int i=0;i<150;++i){ts_cert_snapshot_t snap;assert(ts_cert_get_snapshot(true,&snap)==ESP_OK);assert(!strcmp(snap.certificate,a)||!strcmp(snap.certificate,b));ts_cert_free_snapshot(&snap);status();}return NULL; } +int main(int argc,char **argv) { + assert(argc==2);a=read_pem(argv[1],"a");b=read_pem(argv[1],"b");ca=read_pem(argv[1],"ca"); + char *key=read_pem(argv[1],"key"),*wrong=read_pem(argv[1],"wrong"),*future=read_pem(argv[1],"future"),*expired=read_pem(argv[1],"expired"); + unsigned n; + ts_cert_op_error_t detail; + assert(ts_cert_install_certificate_ex(a,strlen(a)+1,&detail)!=0&&detail==TS_CERT_OP_NOT_INITIALIZED); + assert(ts_cert_init()==0); + assert(ts_cert_install_certificate_ex(a,strlen(a)+1,&detail)!=0&&detail==TS_CERT_OP_PRIVATE_KEY_MISSING); + stored[0]=strdup(key);reload(); + char csr[2048];size_t csr_len=sizeof(csr); + ts_cert_csr_opts_t opts={.device_id="isolated-test"}; + assert(ts_cert_generate_csr(&opts,csr,&csr_len)==0); + n=writes;for(int i=0;i<100;++i)assert(status().status==TS_CERT_STATUS_CSR_PENDING);assert(writes==n); + install(a); + uint32_t generation=status().generation;n=writes; + install(a);assert(status().generation==generation&&writes==n); + assert(ts_cert_install_certificate_ex(wrong,strlen(wrong)+1,&detail)!=0&&detail==TS_CERT_OP_KEY_MISMATCH); + assert(!strcmp(stored[1],a)&&status().generation==generation); + assert(ts_cert_install_certificate_ex(a,strlen(a),&detail)!=0&&detail==TS_CERT_OP_INVALID_INPUT); + const char embedded[]={'a',0,'b',0};assert(ts_cert_install_certificate_ex(embedded,sizeof(embedded),&detail)!=0); + assert(ts_cert_install_certificate_ex(" \r\n",5,&detail)!=0&&detail==TS_CERT_OP_INVALID_INPUT); + for(size_t len=3999;len<=4096;++len){char *p=malloc(len);memset(p,'x',len);p[len-1]=0; + assert(ts_cert_install_certificate_ex(p,len,&detail)!=0); + assert(detail==(len>4000?TS_CERT_OP_INPUT_TOO_LARGE:TS_CERT_OP_PEM_PARSE_FAILED));free(p);} + fail_parse_alloc=true;assert(ts_cert_install_certificate_ex(b,strlen(b)+1,&detail)==ESP_ERR_NO_MEM&&detail==TS_CERT_OP_NO_MEMORY);fail_parse_alloc=false; + fail_alloc=true;assert(ts_cert_install_certificate_ex(b,strlen(b)+1,&detail)==ESP_ERR_NO_MEM&&detail==TS_CERT_OP_NO_MEMORY);fail_alloc=false; + assert(!strcmp(stored[1],a)&&status().generation==generation); + fail_set=true;n=events;assert(ts_cert_install_certificate_ex(b,strlen(b)+1,&detail)!=0&&detail==TS_CERT_OP_STORAGE_FAILED);fail_set=false; + assert(events==n&&status().storage_error&&!strcmp(stored[1],a));reload(); + fail_commit=true;n=events;assert(ts_cert_install_certificate_ex(b,strlen(b)+1,&detail)!=0&&detail==TS_CERT_OP_STORAGE_FAILED);fail_commit=false; + assert(events==n&&status().storage_error);/* Mock deliberately persists set despite failed commit. */ + assert(!strcmp(stored[1],b));reload();assert(!strcmp(s_certificate_pem,b));install(a); + assert(!ts_cert_prerequisites(&(ts_cert_pki_status_t){0},true)); + assert(ts_cert_install_ca_chain(ca,strlen(ca)+1)==0);assert(ts_cert_prerequisites(&(ts_cert_pki_status_t){0},false)==false); + ts_cert_pki_status_t ready=status();assert(ts_cert_prerequisites(&ready,true)); + size_t cl=strlen(ca);char *chain=malloc(2*cl+1);strcpy(chain,ca);strcat(chain,ca);assert(ts_cert_install_ca_chain(chain,strlen(chain)+1)==0); + strcat(strcpy(chain,ca),"-----BEGIN CERTIFICATE-----\nBAD\n-----END CERTIFICATE-----\n"); + assert(ts_cert_install_ca_chain_ex(chain,strlen(chain)+1,&detail)!=0&&detail==TS_CERT_OP_PEM_PARSE_FAILED);free(chain); + /* CRLF and no trailing newline are parsed by the SDK's actual mbedTLS. */ + char *crlf=malloc(strlen(a)*2+1),*q=crlf;for(const char *p=a;*p;++p){if(*p=='\n')*q++='\r';*q++=*p;}*q=0;install(crlf);free(crlf); + char *no_nl=strdup(a);no_nl[strlen(no_nl)-1]=0;install(no_nl);free(no_nl);install(a); + n=writes;unsigned c=commits;for(int i=0;i<1000;++i)status();assert(writes==n&&commits==c); + int64_t from=status().cert_info.not_before,to=status().cert_info.not_after; + const char *tz[]={"UTC","CST-8","PST8PDT"};for(unsigned i=0;i<3;++i){setenv("TZ",tz[i],1);tzset();assert(status().cert_info.not_before==from&&status().cert_info.not_after==to);} + clock_now=from-1;assert(status().cert_info.validity==TS_CERT_VALIDITY_NOT_YET_VALID); + clock_now=from;assert(status().cert_info.is_valid);clock_now=to;assert(status().cert_info.is_valid); + clock_now=to+1;assert(status().cert_info.validity==TS_CERT_VALIDITY_EXPIRED&&status().cert_info.days_until_expiry==-1); + clock_now=0;assert(status().status==TS_CERT_STATUS_TIME_UNVERIFIED&&!status().cert_info.is_valid); + clock_now=-1;assert(!status().time_ready);clock_now=1790121600; + install(future);assert(status().status==TS_CERT_STATUS_NOT_YET_VALID);install(expired);assert(status().status==TS_CERT_STATUS_EXPIRED);install(a); + drop_event=true;install(b);assert(status().generation>generation);drop_event=false; + ts_cert_snapshot_t snap;assert(ts_cert_get_snapshot(true,&snap)==0);install(a);assert(!strcmp(snap.certificate,b));assert(snap.generation!=status().generation);ts_cert_free_snapshot(&snap); + pthread_t t1,t2;pthread_create(&t1,NULL,writer,NULL);pthread_create(&t2,NULL,reader,NULL);pthread_join(t1,NULL);pthread_join(t2,NULL); + assert(ts_cert_get_snapshot(true,&snap)==0);generation=status().generation; + assert(ts_cert_generate_keypair()==0);assert(status().generation!=generation&&!status().has_certificate);assert(snap.certificate!=NULL);ts_cert_free_snapshot(&snap); + assert(ts_cert_delete_keypair()==0);assert(!status().has_private_key&&!status().has_certificate); + ts_cert_deinit();free(stored[0]);stored[0]=strdup("broken");assert(ts_cert_init()==0); + assert(ts_cert_install_certificate_ex(a,strlen(a)+1,&detail)!=0&&detail==TS_CERT_OP_PRIVATE_KEY_INVALID); + ts_cert_deinit();fail_alloc=true;assert(ts_cert_init()==ESP_ERR_NO_MEM);fail_alloc=false; + ts_cert_pki_status_t empty;memset(&empty,0xAB,sizeof(empty));assert(ts_cert_get_status(&empty)!=0);assert(!empty.has_certificate&&!empty.cert_info.subject_cn[0]); + ts_cert_deinit();fail_read=true;assert(ts_cert_init()!=0);fail_read=false;assert(!s_private_key_pem&&!s_certificate_pem); + ts_cert_deinit();for(int i=0;i<3;++i)free(stored[i]); + free(a);free(b);free(ca);free(key);free(wrong);free(future);free(expired); + puts("PASS material: real SDK mbedTLS, mocked NVS/allocation/events, state/time/concurrent snapshots"); + return 0; +} diff --git a/tests/certificate/test_service_stop.c b/tests/certificate/test_service_stop.c new file mode 100644 index 0000000..d5e4e0f --- /dev/null +++ b/tests/certificate/test_service_stop.c @@ -0,0 +1,44 @@ +#include "platform.h" +#define TS_SERVICE_STATE_STOPPED 0 +#define TS_SERVICE_STATE_REGISTERED 1 +#define TS_SERVICE_STATE_RUNNING 2 +#define TS_SERVICE_STATE_STOPPING 3 +#define TS_EVENT_BASE_SERVICE "service" +#define TS_EVENT_SERVICE_STOPPED 1 +typedef int ts_service_state_t; +typedef struct {const char *service_name;int old_state,new_state,error_code;} ts_service_event_data_t; +typedef struct {int state;struct {const char *name;unsigned capabilities;int (*stop)(void *,void *);void *user_data;}def;} ts_service_instance_t; +static void set_service_state(ts_service_instance_t *s,int state) {s->state=state;} +static unsigned stopped_events; +int ts_event_post(const char *base,int id,const void *data,size_t len,unsigned timeout) {(void)base;(void)id;(void)data;(void)len;(void)timeout;++stopped_events;return 0;} +#include "service_stop.inc" +typedef ts_service_instance_t *ts_service_handle_t; +#define TS_SERVICE_CAP_RESTARTABLE 1 +static unsigned starts; +static int ts_service_stop(ts_service_handle_t s) {return stop_service_internal(s);} +static int ts_service_start(ts_service_handle_t s) {++starts;s->state=TS_SERVICE_STATE_RUNNING;return ESP_OK;} +#include "service_restart.inc" +static int result; +static int stop_callback(void *s,void *u) {(void)s;(void)u;return result;} +int main(void) { + ts_service_instance_t s={.state=TS_SERVICE_STATE_RUNNING,.def={.name="https",.stop=stop_callback}}; + result=ESP_FAIL;int ret=stop_service_internal(&s); + if(ret!=ESP_FAIL||s.state!=TS_SERVICE_STATE_RUNNING||stopped_events) { + puts("REPRODUCED manager stop bug: callback failure becomes success/stopped");return 2; + } + result=ESP_OK;assert(stop_service_internal(&s)==ESP_OK);assert(s.state==TS_SERVICE_STATE_STOPPED&&stopped_events==1); + assert(stop_service_internal(&s)==ESP_OK&&stopped_events==1); + s=(ts_service_instance_t){.state=TS_SERVICE_STATE_RUNNING,.def={.name="other",.stop=stop_callback}}; + assert(stop_service_internal(&s)==ESP_OK&&s.state==TS_SERVICE_STATE_STOPPED); + s.def.capabilities=TS_SERVICE_CAP_RESTARTABLE; + const int failures[]={ESP_FAIL,ESP_ERR_TIMEOUT,ESP_ERR_INVALID_STATE}; + for(unsigned i=0;i +#include +/* Use the production time information type, bypassing the platform stub header. */ +#include "../../components/ts_net/include/ts_time_sync.h" +#define TS_EVENT_BASE_TIME "ts_time" +#define TS_EVENT_TIME_SYNCED 1 +#define pdMS_TO_TICKS(x) (x) +static struct {ts_time_sync_info_t info;char timezone[32];} s_time_sync; +static time_t clock_value; +static int set_error,event_error; +static unsigned notifications; +static ts_time_sync_info_t delivered; +static time_t read_clock(time_t *p) {if(p)*p=clock_value;return clock_value;} +static int set_clock(const struct timeval *tv,const struct timezone *tz) {(void)tz;if(set_error)return -1;clock_value=tv->tv_sec;return 0;} +int ts_event_post(const char *base,int id,const void *data,size_t length,unsigned wait) { + (void)base;(void)id;(void)wait;assert(length==sizeof(delivered));delivered=*(const ts_time_sync_info_t *)data;++notifications;return event_error; +} +static struct {_Atomic bool enroll_running,stop_requested;} s_client; +static unsigned delays; +static bool finish_on_delay; +static void vTaskDelay(unsigned t) {(void)t;++delays;if(finish_on_delay)s_client.enroll_running=false;} +#define time read_clock +#define settimeofday set_clock +#include "time_cancel.inc" +#undef time +#undef settimeofday +int main(void) { + set_error=1;assert(ts_time_sync_set_time(1790121600000LL,TS_TIME_SOURCE_HTTP)!=0);assert(notifications==0); + set_error=0;assert(ts_time_sync_set_time(1790121600000LL,TS_TIME_SOURCE_HTTP)==0);assert(notifications==1&&delivered.source==TS_TIME_SOURCE_HTTP);assert(!ts_time_sync_needs_sync()); + assert(ts_time_sync_set_time(0,TS_TIME_SOURCE_MANUAL)==0);assert(notifications==2&&delivered.source==TS_TIME_SOURCE_MANUAL);assert(ts_time_sync_needs_sync()); + struct timeval tv={.tv_sec=1790121600};time_sync_notification_cb(&tv);assert(notifications==3&&delivered.source==TS_TIME_SOURCE_NTP); + event_error=ESP_FAIL;assert(ts_time_sync_set_time(1790121600000LL,TS_TIME_SOURCE_HTTP)==0);assert(!ts_time_sync_needs_sync()); + for(unsigned i=0;i<3;++i){const char *tz[]={"UTC","CST-8","PST8PDT"};setenv("TZ",tz[i],1);tzset();clock_value=1735689599;assert(ts_time_sync_needs_sync());clock_value=1735689600;assert(!ts_time_sync_needs_sync());} + s_client.enroll_running=true;ts_pki_client_stop_auto_enroll();assert(s_client.stop_requested&&s_client.enroll_running&&delays==50); + finish_on_delay=true;ts_pki_client_stop_auto_enroll();assert(!s_client.enroll_running); + puts("PASS actual time notifications/UTC readiness and cooperative enrollment stop (syscalls/tasks mocked)"); + return 0; +} diff --git a/tests/certificate/test_time_retry.c b/tests/certificate/test_time_retry.c new file mode 100644 index 0000000..1d14a9f --- /dev/null +++ b/tests/certificate/test_time_retry.c @@ -0,0 +1,47 @@ +#include "ts_cert_time.h" +#include "../../main/ts_https_retry.h" +#include +#include +#include +int main(void) { + int64_t t; + assert(ts_cert_time_utc(1970,1,1,0,0,0,&t)&&t==0); + assert(ts_cert_time_utc(1969,12,31,23,59,59,&t)&&t==-1); + assert(ts_cert_time_utc(9999,12,31,23,59,59,&t)&&t==253402300799LL); + assert(ts_cert_time_utc(2050,1,1,0,0,0,&t)&&t==2524608000LL); + assert(ts_cert_time_utc(2000,2,29,0,0,0,&t)&&t==951782400); + assert(ts_cert_time_utc(2024,2,29,0,0,0,&t)&&t==1709164800); + assert(!ts_cert_time_utc(2100,2,29,0,0,0,&t)); + assert(!ts_cert_time_utc(0,1,1,0,0,0,&t)); + assert(!ts_cert_time_utc(10000,1,1,0,0,0,&t)); + assert(!ts_cert_time_utc(2026,13,1,0,0,0,&t)); + assert(!ts_cert_time_utc(2026,4,31,0,0,0,&t)); + assert(!ts_cert_time_utc(2026,1,1,24,0,0,&t)); + assert(!ts_cert_time_utc(2026,1,1,0,60,0,&t)); + assert(!ts_cert_time_utc(2026,1,1,0,0,60,&t)); + int64_t seconds[]={86399,0,-1,-86400,-86401};int days[]={0,0,-1,-1,-2}; + for(int i=0;i<5;++i)assert(ts_cert_time_days(seconds[i])==days[i]); + assert(!ts_cert_time_ready(1735689599,2025)&&ts_cert_time_ready(1735689600,2025)); + unsigned char bytes[33];memset(bytes,0xff,sizeof(bytes)); + size_t sizes[]={0,1,20,31,32,33}; + for(int i=0;i<6;++i){struct {char hex[65];char guard;} v;v.guard='!'; + assert(ts_cert_hex(bytes,sizes[i],v.hex,sizeof(v.hex))==(sizes[i]>32)); + assert(strlen(v.hex)==2*(sizes[i]<32?sizes[i]:32));assert(v.guard=='!');} + ts_https_retry_t r={0}; + assert(!ts_https_retry_due(&r,1,1,true,false,0)); + assert(ts_https_retry_due(&r,1,1,true,true,0)); + ts_https_retry_failed(&r,0); + for(int i=0;i<100;++i)assert(!ts_https_retry_due(&r,1,1,true,true,999)); + assert(ts_https_retry_due(&r,1,1,true,true,1000));ts_https_retry_failed(&r,1000); + assert(!ts_https_retry_due(&r,1,1,true,true,5999)); + assert(ts_https_retry_due(&r,1,1,true,true,6000));ts_https_retry_failed(&r,6000); + assert(!ts_https_retry_due(&r,1,1,true,true,20999)); + assert(ts_https_retry_due(&r,1,1,true,true,21000));ts_https_retry_failed(&r,21000); + for(int i=0;i<100;++i)assert(!ts_https_retry_due(&r,1,1,true,true,999999)); + assert(ts_https_retry_due(&r,2,1,true,true,999999)); + ts_https_retry_failed(&r,999999); + assert(!ts_https_retry_due(&r,2,2,false,true,9999999)); + for(int i=0;i<100;++i)assert(!ts_https_retry_due(&r,2,2,false,true,99999999)); + assert(ts_https_retry_due(&r,2,3,true,true,99999999)); + puts("PASS UTC/serial bounds and bounded retry/control policy"); +} diff --git a/tests/certificate/test_ui.cjs b/tests/certificate/test_ui.cjs new file mode 100644 index 0000000..5094981 --- /dev/null +++ b/tests/certificate/test_ui.cjs @@ -0,0 +1,42 @@ +const fs = require('node:fs'), vm = require('node:vm'), assert = require('node:assert/strict'); +const source = fs.readFileSync('components/ts_webui/web/js/app.js','utf8'); +function fn(name) { + // Use complete production functions, bounded by the next top-level declaration. + const match = new RegExp('^(?:async )?function '+name+'\\(', 'm').exec(source); + assert(match, name); + const rest = source.slice(match.index); + const next = /\n(?:async )?function \w+\(/.exec(rest); + return next ? rest.slice(0,next.index) : rest; +} +const translations = {}; +for (const lang of ['zh-CN','en-US']) vm.runInNewContext(fs.readFileSync(`components/ts_webui/web/js/lang/${lang}.js`,'utf8'), {i18n:{registerLanguage:(id,d)=>translations[id]=d}}); +let locale = 'zh-CN'; +const elements = new Map(); +function el(id) {if (!elements.has(id)) elements.set(id,{textContent:'',value:'test PEM',disabled:false,style:{},classList:{add(){},remove(){}}});return elements.get(id);} +let posts=0, refreshFail=false, response={code:0}, reject=false; +const ctx = vm.createContext({console, setTimeout:()=>{}, document:{getElementById:el}, window:{}, + t:(key,params={})=>{let v=key.split('.').reduce((o,k)=>o?.[k],translations[locale])??key;return v.replace(/\{(\w+)\}/g,(_,k)=>params[k]??`{${k}}`);}, + api:{certInstall:async()=>{posts++;if(reject)throw new Error('timeout');return response;},certInstallCA:async()=>{posts++;return response;}}, + refreshCertStatus:async()=>{if(refreshFail)throw new Error('refresh failed');} +}); +for(const name of ['certText','certError','certValidity','certExpiry','installCertificate','installCAChain','installCertMaterial'])vm.runInContext(fn(name),ctx); +(async()=>{ + assert.equal(ctx.certError({message:'M',error:'E'},'F'),'M'); + assert.equal(ctx.certError({message:' ',error:'E'},'F'),'E'); + assert.equal(ctx.certError({error:true},'F'),'F'); + assert.equal(ctx.certText('missing.key','fallback'),'fallback'); + for(locale of ['zh-CN','en-US']) { + for(const key of ['none','invalid','time_unverified','not_yet_valid','valid','expired']) assert(!ctx.certValidity(key).includes('pkiRepair.')); + assert(ctx.certValidity(undefined)); + assert.equal(ctx.certExpiry({is_valid:true,days_until_expiry:20}), ''); // old firmware + assert.equal(ctx.certExpiry({validity:'time_unverified',seconds_until_expiry:null}), ''); + assert(!ctx.certExpiry({validity:'expired',seconds_until_expiry:-1}).includes('pkiRepair.')); + response={code:7,error:''};await ctx.installCertificate(); + assert(el('cert-install-result').textContent.includes('{console.error(e);process.exitCode=1;}); diff --git a/tests/prompts/README.md b/tests/prompts/README.md new file mode 100644 index 0000000..97a4fb6 --- /dev/null +++ b/tests/prompts/README.md @@ -0,0 +1,21 @@ +# Prompt and operation-result regressions + +Run from the repository root. The test harness loads the **actual** inline translator in `index.html`, language packs and complete production JavaScript into a VM. It does not import the hand-transcribed reproduction package. + +```sh +npm ci --prefix tests/prompts +npm test --prefix tests/prompts +npm run test:browser --prefix tests/prompts +node tests/certificate/test_ui.cjs +node tests/runtime/test_ui.cjs +``` + +The browser suite requires locally installed Chrome (`channel: 'chrome'`). It serves the actual WebUI on an ephemeral localhost port, intercepts all `/api/` calls, replaces WebSocket with a stub and rejects external requests. Only the terminal retry test supplies local fixture responses for CDN URLs. It does not use device addresses, credentials, firmware, or real commands. The xterm fixture verifies resource recovery and production initialization, not xterm rendering itself. + +No device validation is performed. Real file storage, browser disk download completion, SSH execution, power state, protection, firmware upgrades and embedded resource packaging require separate authorized acceptance. + +`static.test.cjs`: literal/conditional translations, HTML attributes, finite dynamic families and placeholder contracts. `regression.test.cjs`: actual API/UI/terminal functions with controlled network, DOM, time and device-result inputs. `browser.test.cjs`: actual HTML/deferred-script loading, DOM safety, language recovery and terminal CDN retry. Browser screenshots are written under `output/playwright/`. + +During this repair, existing local Acorn/Playwright installations were used through `NODE_PATH`; no dependencies or browser binaries were installed. The public submission summary is in `docs/PROMPT_REPAIR_REPORT.md`. + +`ownership.browser.test.cjs` covers endpoint contracts, startup/navigation ownership, upload generations, modal ownership, out-of-order outcomes, and independent directory refresh. It is included in `test:browser`. diff --git a/tests/prompts/browser.test.cjs b/tests/prompts/browser.test.cjs new file mode 100644 index 0000000..e452f44 --- /dev/null +++ b/tests/prompts/browser.test.cjs @@ -0,0 +1,132 @@ +const {test,before,after}=require('node:test'); +const assert=require('node:assert/strict'); +const http=require('node:http'),fs=require('node:fs'),path=require('node:path'); +const {chromium}=require('playwright'); +const {root}=require('./harness.cjs'); +let server,browser,base; +before(async()=>{ + server=http.createServer((req,res)=>{ + const rel=decodeURIComponent(new URL(req.url,'http://local').pathname),file=path.resolve(root,'.'+(rel==='/'?'/index.html':rel)); + if(!file.startsWith(root+'/')){res.writeHead(403).end();return;} + fs.readFile(file,(e,data)=>{if(e){res.writeHead(404).end();return;}const ext=path.extname(file);res.setHeader('Content-Type',({'.js':'application/javascript','.html':'text/html','.css':'text/css'})[ext]||'application/octet-stream');res.end(data);}); + }); + await new Promise(resolve=>server.listen(0,'127.0.0.1',resolve));base=`http://127.0.0.1:${server.address().port}`; + browser=await chromium.launch({channel:'chrome',headless:true}); +}); +after(async()=>{await browser?.close();await new Promise(resolve=>server?.close(resolve));}); +async function pageFor(language='en-US',handler){ + const context=await browser.newContext({locale:language,viewport:{width:1280,height:900}}); + await context.addInitScript(({language})=>{ + localStorage.setItem('ts_language',language); + class Socket {static OPEN=1;static CONNECTING=0;constructor(){this.readyState=0;}send(){}close(){this.readyState=3;}} + window.WebSocket=Socket; + },{language}); + const page=await context.newPage(),errors=[];page.on('pageerror',e=>errors.push(e.message)); + await page.route('**/*',async route=>{ + const u=new URL(route.request().url()); + if(u.origin!==base){await route.abort();return;} + if(u.pathname.startsWith('/api/')){await route.fulfill({json:{code:0,data:{}}});return;} + if(handler&&await handler(route,u))return; + await route.continue(); + }); + return {page,context,errors}; +} +for(const language of ['zh-CN','en-US']){ + test(`${language}: real index cold start, safe toast/file text, current websocket state`,async()=>{ + const {page,context,errors}=await pageFor(language);try{ + const fetched=[];page.on('request',r=>{if(r.url().includes('/js/lang/'))fetched.push(r.url());}); + await page.goto(base);await page.waitForFunction(()=>i18n.isReady()); + assert.equal(await page.evaluate(()=>getLanguage()),language);assert.equal(fetched.length,1); + assert.equal(await page.evaluate(()=>document.getElementById('app').inert),false); + assert(!await page.locator('#login-modal').innerText().then(t=>t.includes('login.'))); + await page.evaluate(()=>{renderWsStatus(false);showToast('\nSecond line','error',10000);}); + assert.equal(await page.locator('#toast img').count(),0);assert((await page.locator('#toast').textContent()).includes('window.injected),undefined); + assert.equal(await page.locator('#ws-status').getAttribute('title'),await page.evaluate(()=>t('network.disconnected'))); + await page.evaluate(()=>{const list=document.createElement('div');list.id='upload-list';document.body.append(list);filesToUpload=[];handleFileSelect({target:{files:[{name:'',size:1}]}});}); + assert.equal(await page.locator('#upload-list img').count(),0); + assert.deepEqual(errors,[]); + fs.mkdirSync('output/playwright',{recursive:true});await page.screenshot({path:`output/playwright/prompt-repair-${language}.png`}); + }finally{await context.close();} + }); + test(`${language}: initial language failure blocks controls and retry recovers`,async()=>{ + let fail=true;const {page,context,errors}=await pageFor(language,async(route,u)=>{if(u.pathname.includes('/js/lang/')&&fail){await route.abort();return true;}return false;}); + try{await page.goto(base);await page.waitForSelector('#language-status button'); + assert.equal(await page.evaluate(()=>i18n.isReady()),false);assert.equal(await page.evaluate(()=>document.getElementById('app').inert),true); + assert.equal(await page.evaluate(()=>{let n=0;window.confirm=()=>{n++;return true;};confirmAction(t('ui.confirmRollback'));return n;}),0); + fail=false;await page.locator('#language-status button').click();await page.waitForFunction(()=>i18n.isReady()); + assert.equal(await page.evaluate(()=>document.getElementById('app').inert),false);assert.deepEqual(errors,[]); + }finally{await context.close();} + }); +} +test('delayed language package and rapid switches keep the latest requested language',async()=>{ + let release,hold=true;const gate=new Promise(r=>release=r); + const {page,context}=await pageFor('en-US',async(route,u)=>{if(u.pathname.endsWith('/zh-CN.js')&&hold){await gate;await route.continue();return true;}return false;}); + try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady()); + await page.evaluate(()=>{window.firstSwitch=selectLanguage('zh-CN');}); + await page.evaluate(()=>selectLanguage('en-US'));release();hold=false; + await page.evaluate(()=>window.firstSwitch);assert.equal(await page.evaluate(()=>getLanguage()),'en-US'); + await page.evaluate(()=>selectLanguage('zh-CN'));assert.equal(await page.evaluate(()=>getLanguage()),'zh-CN'); + assert.equal(await page.locator('#ws-status').getAttribute('aria-label'),await page.evaluate(()=>t('network.disconnected'))); + }finally{release();await context.close();} +}); +test('terminal resource failure presents retry; a rejected cached promise is not reused',async()=>{ + const {page,context,errors}=await pageFor('en-US');let attempts=0; + try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady()); + page.on('request',r=>{if(r.url().includes('xterm.css'))attempts++;}); + await page.evaluate(()=>{closeLoginModal();return loadTerminalPage();}); + assert((await page.locator('#terminal-container').textContent()).includes('could not be loaded')); + await page.locator('#terminal-container button').click();await page.waitForFunction(()=>document.querySelector('#terminal-container button')); + assert.equal(attempts,2);assert.deepEqual(errors,[]); + }finally{await context.close();} +}); +for(const language of ['zh-CN','en-US']) { + test(`${language}: package confirmation treats names as text and applies only on explicit verified action`,async()=>{ + const {page,context,errors}=await pageFor(language);try{ + await page.goto(base);await page.waitForFunction(()=>i18n.isReady()); + const path="/sdcard/a');window.injected=true;//.tscfg"; + await page.evaluate(path=>{closeLoginModal();window.fixturePath=path;window.calls=[];api.call=async(name,args)=>{calls.push({name,args});return {code:0,data:{success:false,result_message:''}};};showConfigPackApplyConfirm(path,{valid:false});},path); + assert.equal(await page.locator('#config-pack-apply-confirm').count(),0); + await page.evaluate(()=>showConfigPackApplyConfirm(fixturePath,{valid:true,signature:{signer_cn:''}})); + assert.equal(await page.locator('#config-pack-apply-confirm img').count(),0); + await page.locator('#config-pack-apply-button').click(); + await page.waitForFunction(()=>calls.length===1&&!document.getElementById('config-pack-apply-button').disabled); + assert.equal(await page.evaluate(()=>calls[0].args.path),path); + assert.equal(await page.locator('#config-pack-apply-confirm').count(),1); + assert.equal(await page.locator('#toast img').count(),0); + await page.evaluate(()=>{toastDeadline=0;api.call=async()=>({code:0,data:{success:true,applied_modules:['fixture']}});}); + await page.locator('#config-pack-apply-button').click();await page.waitForFunction(()=>!document.getElementById('config-pack-apply-confirm')); + assert.equal(await page.evaluate(()=>window.injected),undefined);assert.deepEqual(errors,[]); + }finally{await context.close();} + }); +} +test('initial delayed language keeps controls inert until the real package arrives',async()=>{ + let release;const gate=new Promise(r=>release=r); + const {page,context,errors}=await pageFor('en-US',async(route,u)=>{if(u.pathname.endsWith('/en-US.js')){await gate;await route.continue();return true;}return false;}); + try{await page.goto(base,{waitUntil:'domcontentloaded'}); + assert.equal(await page.evaluate(()=>i18n.isReady()),false);assert.equal(await page.evaluate(()=>document.getElementById('app').inert),true); + release();await page.waitForFunction(()=>i18n.isReady());assert.deepEqual(errors,[]); + }finally{release();await context.close();} +}); +test('failed language switch preserves the loaded language; retry clears failure and stale toast',async()=>{ + let fail=true;const {page,context,errors}=await pageFor('en-US',async(route,u)=>{if(u.pathname.endsWith('/zh-CN.js')&&fail){await route.abort();return true;}return false;}); + try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady()); + await page.evaluate(()=>{showToast('old language','info',10000);return selectLanguage('zh-CN');}); + assert.equal(await page.evaluate(()=>getLanguage()),'en-US');assert.equal(await page.evaluate(()=>document.getElementById('app').inert),false); + fail=false;await page.locator('#language-status button').click();await page.waitForFunction(()=>getLanguage()==='zh-CN'); + assert.equal(await page.locator('#toast').evaluate(e=>e.classList.contains('show')),false);assert.deepEqual(errors,[]); + }finally{await context.close();} +}); +test('terminal can initialize after failed resource load using newly served resources',async()=>{ + const {page,context,errors}=await pageFor('en-US'); + try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady());await page.evaluate(()=>{closeLoginModal();return loadTerminalPage();}); + await page.route('https://cdn.jsdelivr.net/**',async route=>{ + const url=route.request().url();let body=''; + if(url.includes('xterm.min.js')) body=`window.Terminal=class {constructor(){this.cols=80;this.rows=24;}open(el){el.replaceChildren();el.dataset.terminalReady='yes';}onData(){}loadAddon(){}write(){}writeln(){}focus(){}dispose(){}};`; + if(url.includes('xterm-addon-fit'))body='window.FitAddon={FitAddon:class {fit(){}}};'; + await route.fulfill({contentType:url.endsWith('.css')?'text/css':'application/javascript',body}); + }); + await page.locator('#terminal-container button').click();await page.waitForSelector('#terminal-container[data-terminal-ready="yes"]'); + assert.equal(await page.locator('#terminal-container button').count(),0);assert.deepEqual(errors,[]); + }finally{await context.close();} +}); diff --git a/tests/prompts/harness.cjs b/tests/prompts/harness.cjs new file mode 100644 index 0000000..0bfa21a --- /dev/null +++ b/tests/prompts/harness.cjs @@ -0,0 +1,51 @@ +const fs = require('node:fs'); +const vm = require('node:vm'); +const path = require('node:path'); +const root = path.resolve(__dirname, '../../components/ts_webui/web'); +const read = file => fs.readFileSync(path.join(root,file),'utf8'); +class Element { + constructor(tag, doc) { this.tagName=tag.toUpperCase();this.doc=doc;this.children=[];this.style={};this.dataset={};this.attributes={};this.className='';this.textContent='';this.value='';this.disabled=false;this.hidden=false; + this.classList={add:(...ns)=>{this.className=[...new Set([...this.className.split(' '),...ns])].join(' ').trim();},remove:(...ns)=>{this.className=this.className.split(' ').filter(n=>!ns.includes(n)).join(' ');},contains:n=>this.className.split(' ').includes(n),toggle:(n,on)=>on?this.classList.add(n):this.classList.remove(n)}; + } + set id(v){this._id=v;this.doc.elements.set(v,this);} get id(){return this._id;} + setAttribute(k,v){this.attributes[k]=v;if(k.startsWith('data-'))this.dataset[k.slice(5).replace(/-([a-z])/g,(_,c)=>c.toUpperCase())]=v;} + getAttribute(k){return this.attributes[k];} hasAttribute(k){return k in this.attributes;} + appendChild(n){n.parent=this;this.children.push(n);return n;} append(...ns){ns.forEach(n=>this.appendChild(n));} + replaceChildren(...ns){this.children=[];this.append(...ns);this.textContent='';} + remove(){if(this.parent)this.parent.children=this.parent.children.filter(n=>n!==this);if(this.id)this.doc.elements.delete(this.id);} + removeChild(n){n.remove();} querySelectorAll(s){return this.children.filter(n=>s==='*'||s.startsWith('.')&&n.classList.contains(s.slice(1)));} + querySelector(s){return this.querySelectorAll(s)[0]||null;} + click(){this.onclick?.();} focus(){} scrollIntoView(){} +} +function harness(language='zh-CN') { + const listeners={}, elements=new Map(), timers=new Map();let now=0,id=0; + const doc={elements,documentElement:{},visibilityState:'visible',addEventListener(){},removeEventListener(){}, + createElement:tag=>new Element(tag,doc),getElementById:id=>elements.get(id)||null, + querySelectorAll:()=>[],querySelector:s=>s==='main'?doc.main:null}; + doc.body=new Element('body',doc);doc.head=new Element('head',doc);doc.main=new Element('main',doc); + const el=(id,tag='div')=>{let n=elements.get(id);if(!n){n=doc.createElement(tag);n.id=id;doc.body.appendChild(n);}return n;}; + ['app','lang-name','lang-menu','ws-status','page-content'].forEach(id=>el(id)); + const storage=new Map([['ts_language',language]]); + const logs=[]; + const context={document:doc,navigator:{language},localStorage:{getItem:k=>storage.get(k)||null,setItem:(k,v)=>storage.set(k,String(v)),removeItem:k=>storage.delete(k)}, + console:{log(){},debug(){},warn:(...x)=>logs.push(x),error:(...x)=>logs.push(x)}, + setTimeout:(fn,ms=0)=>{timers.set(++id,{fn,at:now+ms});return id;},clearTimeout:n=>timers.delete(n), + setInterval:(fn,ms)=>{timers.set(++id,{fn,at:now+ms,repeat:ms});return id;},clearInterval:n=>timers.delete(n), + Date:class extends Date{static now(){return now;}},CustomEvent:class{constructor(type,init={}){this.type=type;this.detail=init.detail;}}, + JSON,AbortController,URL,URLSearchParams,Blob,TextDecoder,TextEncoder,Map,Set,Promise,Error,SyntaxError, + location:{host:'127.0.0.1',protocol:'http:',hash:''},CSS:{escape:s=>s}, + addEventListener:(k,f)=>(listeners[k]??=[]).push(f),removeEventListener(){}, + dispatchEvent:event=>(listeners[event.type]||[]).forEach(f=>f(event)), + confirm:()=>true,prompt:()=>null,WebSocket:class{static OPEN=1;static CONNECTING=0;}, + fetch:async()=>{throw new Error('Network must be explicitly mocked');}}; + context.window=context;const ctx=vm.createContext(context); + const run=code=>vm.runInContext(code,ctx); + run(read('index.html').match(/ - - - - - + + + + + diff --git a/components/ts_webui/web/js/lang/en-US.js b/components/ts_webui/web/js/lang/en-US.js index 8eaf87b..cae057d 100644 --- a/components/ts_webui/web/js/lang/en-US.js +++ b/components/ts_webui/web/js/lang/en-US.js @@ -3699,6 +3699,25 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { // Terminal Page terminal: { + sshCapacity: "The result channel is busy. SSH was not started; try again shortly.", + sshCreateFailed: "The SSH session could not be created. Try again shortly.", + sshOpenFailed: "The remote shell could not be opened. Check whether the server permits interactive sessions.", + sshStartupClosed: "The SSH session ended during startup. Check the server before reconnecting.", + sshStatusFailed: "SSH status notification failed. The connection state is unconfirmed; reconnect to check.", + sshOutputIncomplete: "SSH output in this page is incomplete. The remote result is unconfirmed. Check the server before repeating commands.", + sshClosed: "The SSH session has ended.", + sshClosing: "Closing the SSH session; waiting for confirmation.", + sshConnecting: "Establishing the SSH connection…", + sshReady: "The SSH shell is ready.", + sshServiceStopping: "The service is stopping. This request was not accepted.", + sshControlUnsupported: "Unsupported SSH signal; the session is still active.", + sshControlInvalid: "Invalid SSH control parameters; the session is still active.", + sshControlFailed: "This SSH request failed. Input was not replayed.", + sshChannelUnknown: "The SSH channel ended unexpectedly. The remote result is unconfirmed.", + sshWrongOwner: "This connection does not own an active SSH session.", + sshBusy: "Another SSH session is active. This connection attempt was rejected.", + sshRequestRejected: "This SSH request was rejected.", + connecting: 'Connecting to device...', connected: 'Connected to device', helpHint: 'Enter {help} to view available commands', diff --git a/components/ts_webui/web/js/lang/zh-CN.js b/components/ts_webui/web/js/lang/zh-CN.js index cfebef2..1e2f124 100644 --- a/components/ts_webui/web/js/lang/zh-CN.js +++ b/components/ts_webui/web/js/lang/zh-CN.js @@ -3663,6 +3663,25 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { // 终端页面 terminal: { + sshCapacity: "结果通知通道暂时繁忙,本次 SSH 连接未启动,请稍后重试。", + sshCreateFailed: "未能创建 SSH 会话,请稍后重试。", + sshOpenFailed: "未能启动远端交互式终端,请检查远端是否允许此类连接。", + sshStartupClosed: "SSH 会话在启动期间已结束,请检查远端状态后重新连接。", + sshStatusFailed: "SSH 状态通知未能完成,连接状态尚未确认,请重新连接。", + sshOutputIncomplete: "网页 SSH 输出不完整,远端执行结果尚未确认。请检查远端状态,不要直接重发命令。", + sshClosed: "SSH 会话已结束。", + sshClosing: "正在结束 SSH 会话,请等待确认。", + sshConnecting: "正在建立 SSH 连接…", + sshReady: "SSH 交互式终端已就绪。", + sshServiceStopping: "服务正在停止,本次请求未被接受。", + sshControlUnsupported: "不支持此 SSH 信号,会话仍可继续使用。", + sshControlInvalid: "SSH 控制参数无效,会话仍可继续使用。", + sshControlFailed: "本次 SSH 请求失败,输入未自动重发。", + sshChannelUnknown: "SSH 通道异常结束,远端执行结果尚未确认。", + sshWrongOwner: "此连接不属于当前有效的 SSH 会话。", + sshBusy: "已有 SSH 会话,本次连接请求未被接受。", + sshRequestRejected: "本次 SSH 请求未被接受。", + connecting: '正在连接到设备...', connected: '已连接到设备', helpHint: '输入 {help} 查看可用命令', diff --git a/components/ts_webui/web/js/terminal.js b/components/ts_webui/web/js/terminal.js index 0f66d25..ccd3a51 100644 --- a/components/ts_webui/web/js/terminal.js +++ b/components/ts_webui/web/js/terminal.js @@ -54,6 +54,7 @@ class WebTerminal { // SSH Shell 模式 this.sshMode = false; this.sshConnecting = false; + this.sshDisconnecting = false; this.restoring = false; this.restoreTimer = null; this.destroyed = false; @@ -149,7 +150,7 @@ class WebTerminal { */ setupInputHandler() { this.terminal.onData(data => { - if (!this.connected) return; + if (!this.connected || this.sshConnecting || this.sshDisconnecting) return; // SSH Shell 模式 if (this.sshMode) { @@ -306,26 +307,31 @@ class WebTerminal { */ connect() { if (this.destroyed) return; + if (this.ws) this.disconnect(); const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; const wsUrl = `${protocol}//${window.location.host}/ws`; - this.ws = new WebSocket(wsUrl); + const ws = new WebSocket(wsUrl); + this.ws = ws; + const current = () => !this.destroyed && this.ws === ws; this.pingInterval = null; - this.ws.onopen = () => { + ws.onopen = () => { + if (!current()) return; console.log('Terminal WebSocket connected'); // 发送终端启动请求 - this.ws.send(JSON.stringify({ type: 'terminal_start' })); + ws.send(JSON.stringify({ type: 'terminal_start' })); // 启动心跳机制 this.pingInterval = setInterval(() => { - if (this.ws && this.ws.readyState === WebSocket.OPEN) { - this.ws.send(JSON.stringify({ type: 'ping' })); + if (current() && ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({ type: 'ping' })); } }, 15000); // 每15秒发送心跳 }; - this.ws.onmessage = (event) => { + ws.onmessage = (event) => { + if (!current()) return; try { const msg = JSON.parse(event.data); this.handleMessage(msg); @@ -334,9 +340,11 @@ class WebTerminal { } }; - this.ws.onclose = (event) => { + ws.onclose = (event) => { + if (!current()) return; console.log('Terminal WebSocket disconnected, code:', event.code); this.connected = false; + this.sshMode = this.sshConnecting = this.sshDisconnecting = false; if (this.restoring) this.finishRestore(false); // 清除心跳 @@ -351,7 +359,7 @@ class WebTerminal { if (event.code !== 1000) { // 非正常关闭 this.writeln('\x1b[33m' + (typeof t === 'function' ? t('terminal.reconnectIn') : '5秒后尝试重新连接...') + '\x1b[0m'); const tryReconnect = () => { - if (this.destroyed || this.connected) return; + if (!current() || this.connected) return; if (document.visibilityState !== 'visible') { document.addEventListener('visibilitychange', function handler() { document.removeEventListener('visibilitychange', handler); @@ -366,7 +374,8 @@ class WebTerminal { } }; - this.ws.onerror = (error) => { + ws.onerror = (error) => { + if (!current()) return; console.error('Terminal WebSocket error:', error); this.writeln('\r\n\x1b[1;31m' + (typeof t === 'function' ? t('terminal.connectionError') : '连接错误') + '\x1b[0m'); }; @@ -384,8 +393,10 @@ class WebTerminal { } handleMessage(msg) { + if (this.destroyed) return; switch (msg.type) { case 'connected': + if (this.sshMode || this.sshConnecting || this.sshDisconnecting) return; if (this.restoring) this.finishRestore(true); this.connected = true; this.prompt = msg.prompt || 'tianshan> '; @@ -403,18 +414,25 @@ class WebTerminal { break; case 'done': + if (this.sshMode || this.sshConnecting || this.sshDisconnecting) return; // 命令执行完成 this.writePrompt(); break; case 'error': { const errMsg = msg.message || (typeof t === 'function' ? t('terminal.unknownError') : '未知错误'); + if (this.sshMode || this.sshConnecting || this.sshDisconnecting) { + this.writeln('\x1b[1;31m' + this.sshMessageText(errMsg) + '\x1b[0m'); + if (this.sshConnecting && !this.sshMode) { this.sshConnecting = false; this.writePrompt(); } + break; // request failure is not an operation terminal + } if (errMsg.indexOf('Not a terminal session') >= 0 && this.ws && this.ws.readyState === WebSocket.OPEN) { if (!this.restoring) { this.restoring = true; this.connected = false; this.ws.send(JSON.stringify({type: 'terminal_start'})); showToast(t('promptRepair.terminalRestoring'), 'info'); - this.restoreTimer = setTimeout(() => this.finishRestore(false, true), 10000); + const restoringSocket = this.ws; + this.restoreTimer = setTimeout(() => { if (!this.destroyed && this.ws === restoringSocket && this.restoring) this.finishRestore(false, true); }, 10000); } } else { if (this.restoring) this.finishRestore(false); @@ -446,6 +464,7 @@ class WebTerminal { case 'session_closed': this.connected = false; + this.sshMode = this.sshConnecting = this.sshDisconnecting = false; this.writeln('\x1b[33m' + (typeof t === 'function' ? t('terminal.sessionClosed') : '会话已关闭,请重新连接') + '\x1b[0m'); break; @@ -593,10 +612,9 @@ class WebTerminal { startSshShell(params) { if (this.sshConnecting || this.sshMode) { this.writeln('\x1b[1;31m' + (typeof t === 'function' ? t('terminal.sshSessionInProgress') : 'SSH 会话已在进行中') + '\x1b[0m'); - this.writePrompt(); return; } - + if (!this.connected || !this.ws || this.ws.readyState !== WebSocket.OPEN) return; this.sshConnecting = true; const connMsg = typeof t === 'function' ? t('terminal.sshConnectingTo', { user: params.user, host: params.host, port: params.port }) : `正在连接到 ${params.user}@${params.host}:${params.port}...`; this.writeln(`\x1b[36m${connMsg}\x1b[0m`); @@ -627,29 +645,66 @@ class WebTerminal { /** * 处理 SSH 状态消息 */ + sshMessageText(message) { + const keys = { + "Missing host or user": "sshShellRequiresParams", + "SSH result delivery capacity unavailable": "sshCapacity", + "Failed to create SSH session": "sshCreateFailed", + "Failed to open shell": "sshOpenFailed", + "SSH shell closed during startup": "sshStartupClosed", + "SSH connection status delivery failed": "sshStatusFailed", + "SSH readiness delivery failed": "sshStatusFailed", + "SSH status delivery failed": "sshStatusFailed", + "SSH output delivery incomplete; remote command result is not confirmed": "sshOutputIncomplete", + "SSH session closed": "sshClosed", + "Closing SSH session...": "sshClosing", + "Connecting to SSH server...": "sshConnecting", + "SSH shell ready": "sshReady", + "Service is stopping": "sshServiceStopping", + 'Unsupported SSH signal': 'sshControlUnsupported', + 'Invalid SSH control parameters': 'sshControlInvalid', + 'SSH control request failed; input was not replayed': 'sshControlFailed', + 'SSH channel failed; remote result is not confirmed': 'sshChannelUnknown', + 'This connection does not own an active SSH session': 'sshWrongOwner', + 'Another SSH session is active': 'sshBusy', + 'SSH request rejected': 'sshRequestRejected' + }; + return keys[message] && typeof t === 'function' ? t('terminal.' + keys[message]) : message; + } + handleSshStatus(msg) { const status = msg.status; - const message = msg.message || ''; + const message = this.sshMessageText(msg.message || ''); switch (status) { case 'connecting': this.writeln(`\x1b[33m${message}\x1b[0m`); break; case 'connected': + if (!this.sshConnecting) return; + this.sshDisconnecting = false; this.sshMode = true; this.sshConnecting = false; this.writeln(`\x1b[1;32m${message}\x1b[0m`); this.writeln('\x1b[90m' + (typeof t === 'function' ? t('terminal.exitSshHint') : '(按 Ctrl+\\ 退出 SSH shell)') + '\x1b[0m'); this.writeln(''); break; - case 'closed': case 'disconnecting': + if (!this.sshMode) return; + this.sshDisconnecting = true; + this.writeln(`\r\n\x1b[33m${message}\x1b[0m`); + break; + case 'closed': + if (!this.sshMode && !this.sshConnecting) return; + this.sshDisconnecting = false; this.sshMode = false; this.sshConnecting = false; this.writeln(`\r\n\x1b[33m${message}\x1b[0m`); this.writePrompt(); break; case 'error': + if (!this.sshMode && !this.sshConnecting) return; + this.sshDisconnecting = false; this.sshMode = false; this.sshConnecting = false; this.writeln(`\x1b[1;31m${message}\x1b[0m`); @@ -725,6 +780,7 @@ class WebTerminal { this.ws = null; } this.connected = false; + this.sshMode = this.sshConnecting = this.sshDisconnecting = false; } /** diff --git a/docs/repair/ws-control/README.md b/docs/repair/ws-control/README.md index 4cb03f0..023ea0d 100644 --- a/docs/repair/ws-control/README.md +++ b/docs/repair/ws-control/README.md @@ -1,3 +1,5 @@ +> 后续项目级契约修复与当前本地验收见 [v3 记录](../ws-project-v3/README.md)。本文件保留上一轮历史证据,不替代 v3 结论。 + # PR #42:控制请求归属与业务取消统一修复 修改前基线为 `1591ecc8e293c0fa62feda18d2517edfc179ca5a`。实现阶段仅本地修改与验证;用户随后另行授权提交、推送并更新 PR #42,见 publication-gate.md。本轮没有改版本/发布流程或操作设备。既有 output/、tmp/、另一份未跟踪 reviewer diff-check 保留。 diff --git a/docs/repair/ws-project-v3/README.md b/docs/repair/ws-project-v3/README.md new file mode 100644 index 0000000..3999689 --- /dev/null +++ b/docs/repair/ws-project-v3/README.md @@ -0,0 +1,99 @@ +> 实施阶段之后,用户另行授权更新 PR。提交前审查与补充复跑见 [publication-gate.md](publication-gate.md);下文“不提交”描述原实施阶段边界。 + +# PR #42 v3 本地修复与验收记录 + +本记录是本轮当前结论;ws-operation / ws-control 下的记录是历史输入,不替代这里的源码和测试证据。只完成本地修改、模拟边界测试和独立目录编译,没有提交、推送、更新 PR、设备操作或远端业务执行。 + +## 基线、影响与处理结果 + +当前分支 `fix/v0.5.2-reliability-and-prompts`,HEAD / 审查时 PR head `568b871f64902f88b3c68148ce072eda218fe9db`;PR base `main` / `d6ed947a592265fa12754828bc79803fc50c1db2`。初始已有未跟踪的 output/、tmp/、docs/runtime-repair/evidence/reviewer-fixes/diff-check.txt 不纳入本轮改动。浏览器历史套件按原入口在 output/playwright 输出截图,不清理其中其他文件。 + +- [影响及消息契约](impact-contract.md):先于产品修改建立,补充了实际依赖的 CLI 本地退出。 +- [累计 PR 文件范围](cumulative-files.txt)、[导航/API/服务注册证据](registries.txt):用于确定深入、相邻回归和不修改范围。累计审查侧重实际依赖契约,不是声称逐行证明整个仓库无缺陷。 +- [原始工作区源码与哈希](baseline.json)、baseline.tar.gz:本轮修改前真实 WebUI、SSH 及相关测试。H1 不使用目标分支旧代码作为反例。 +- CLI 原始文件另存 baseline-console.c / baseline-console.json:从同一初始 clean tracked HEAD 导出;它不冒充第一次归档已包含的文件。 +- [实际产品与测试 diff](changes.patch)、[最终输入哈希](final-inputs.json)。v2 operation、TX、订阅管理器、Exec 取消与匹配实现均未修改。 + +| 问题 | 原始证据 | 本轮处理及当前行为 | +|---|---|---| +| H1:请求错误误作 SSH 终态 | baseline-h1.txt/json:实际 C 发帧后生产 JS 退出 SSH,后续 input 不再产生 ssh_input;C op 仍 OPEN | 请求错误只提示本次动作;有效 SSH 不写本地提示符、不自动接管/恢复/重发。真实通道故障走原 operation 唯一终态 | +| 无数据误作 EOF | baseline-no-data.txt:零字节、无 EOF 却结束 Shell 的业务断言 | read/poll/run 使用同一下层判定;暂无数据返回 TIMEOUT 并保持 RUNNING | +| EOF/ERROR 后 close 不释放 | baseline-eof-release.txt:真实 client 销毁后 Shell 包装仍泄漏 | close 消耗所有已分配句柄,不以 RUNNING 作为释放条件;回调至多一次;上层重复清理使用已置空句柄 | +| EAGAIN 无界等待及部分写无明确失败状态 | 原 open/PTY/start/write/resize/close 循环;真实 driver 故障测试 | setup 共用 10 秒预算,write/resize 各 1 秒;部分写记录接受字节,致命/不确定错误标记 ERROR;不重放输入。close 不等远端 EOF,必要时借原 client 本地 disconnect 释放 | +| CLI Ctrl+\\ 退出意图未被循环观察 | baseline-cli-exit.txt:实际 CLI 回调置 console interrupt 后 Shell 仍 active | 该回调请求本地循环退出;保留原 drain-until-no-data 节奏,退出后由原 owner close/destroy;不声称远端已停止 | +| 旧 socket 回调污染新页 / disconnecting 被当终态 | 消费者反向检查及新旧 socket 交错 | 回调、恢复与重连 timer 绑定 socket;连接断开清 SSH 模式;disconnecting 等待真正终态;页面销毁后迟到结果不生效 | + +## 实际修改映射与所有权 + +1. `ts_webui_ws.c`:完整检查 `ssh_request_error` 所有调用点(connect 参数、准入/创建资源失败、统一四控制入口)。这些调用均为请求结果。真正已接受操作的启动/读取/写入故障继续由 `ssh_close` 封口;没有改变公共 request API,也没有修改 operation fallback。IO mutex 外调用关闭和 JSON 编码;原 operation 引用一直保留。 +2. `ts_ssh_shell.c/.h`:统一 read 分类,处理 EOF/ERROR/部分初始化的真实释放;有限等待、部分写计数;增加仅给已串行持有 Shell 的调用方使用的 `request_close`。它只是驱动现有状态上的本地退出,不是第二套操作控制层。分配的 Shell 始终需要 close;close 后不可再次使用旧指针。 +3. `ts_cmd_ssh.c`:唯一新增一行把 Ctrl+\\ 退出传给上述原 Shell,CLI 原清理顺序不变。 +4. `terminal.js`:请求错误、启动失败、会话终态、socket 关闭分别影响对应状态;提示符、恢复和下次输入路由一起适配。固定消息映射只翻译展示,不用于判断生命周期;未识别错误仍保留原始文本。 +5. 中英文语言包、index cache key:启动、请求、观察不完整和远端结果未确认表达一致;仅更新静态资源缓存标识,没有改固件版本、布局或发布流程。 +6. 新测试桥包含整个生产 WS 单元、operation、manager、TX、真正项目 SSH client/Shell。SDK、libssh2、socket、时钟、xterm 渲染为边界替身。CLI 小回调由当前生产文件提取原文字节编译,无手写逻辑副本。历史 adapter 只增加真实下层编译模式和状态查询边界,保留原断言。 + +下层释放依据另外检查了仓库内 libssh2 的 `_libssh2_channel_free` 与 session_free:channel_free 只在 EAGAIN 时保留 channel;其余关闭错误不阻挡 free。项目 client 的本地关闭回调使清理看到断开的传输,随后释放 session/socket。组合测试保留 EAGAIN 时的所有权,未把项目 close/destroy stub 成直接 free。模拟库不证明真实服务器/双核时序。 + +## 可重放验证入口与证据 + +环境:ESP-IDF v5.5.2,ESP32-S3,Apple CommandLineTools;ASan/UBSan 主机 C;Node 和隔离 Chrome。设置 `IDF_PATH` 指向固定 SDK;macOS 测试设置 `DEVELOPER_DIR=/Library/Developer/CommandLineTools`。无需设备或真实 SSH。 + +```sh +python3 tests/ws_subscriptions/replay_project_baseline.py +python3 tests/ws_subscriptions/run_project_v3.py +python3 tests/ws_subscriptions/run_project_v3.py --browser +# 固定 SDK 独立目录 build 后: +V3_BUILD=/tmp/tianshan-project-v3-build/build python3 tests/ws_subscriptions/verify_project_assets.py +V3_BUILD=/tmp/tianshan-project-v3-build/build python3 tests/ws_subscriptions/measure_project_v3.py +# 构建输出消费者: +PROJECT_WEB_ROOT=/tmp/tianshan-project-v3-build/build/esp-idf/ts_webui/web_optimized \ +V3_RESULTS=docs/repair/ws-project-v3/optimized-results \ +python3 tests/ws_subscriptions/run_project_v3.py --browser +``` + +每个套件命令及退出码见 [host.json](results/host.json)、[browser.json](results/browser.json)。runner 保留每个子进程结果并对任一失败返回非零。构建/资源检查是独立入口,不伪装成主机测试。旧缺陷重放返回 0 表示**反例确认**:必须找到指定业务断言,编译失败不算红灯。H1 冻结测试验证同一个 mode/next-input 性质的反面;当前测试增加了后续实际 C 控制,而不是删除旧性质。 + +| 验收链 | 证据与关键断言 | +|---|---| +| C → 实际消息字节 → JS → 下次 C 请求 | results/cross-node-*.json、cross-browser-*.json;unsupported、非法尺寸、可恢复 resize 后合法输入调用原 driver;退出后是 terminal_input,再启动仍成功 | +| 前端真实入口 | Chrome 加载当前 index、语言包、terminal.js;最终 SDK payload 的 bytes 交给真实 ws.onmessage;xterm 渲染和网络替身,不冒充实机浏览器连接 | +| 真实失败和启动拒绝 | 同一桥验证 fatal write、EOF、PTY 启动失败、重复启动和其他页面四类控制;不误伤所有者,不自动重放 | +| 普通终端恢复 | 实际 terminal_stop 后下次 terminal_input 产生 Not a terminal session;实际 JS 生成 terminal_start 回到 C 并成功恢复。SSH 请求错误不触发这条路 | +| 交错及通知失败 | request_error 编码前插入输出+真实关闭;输出在唯一终态之前;编码失败走静态请求提示;直接发送失败不递归报错;输出 HTTPD 入队失败后无需新业务即可结算 | +| 原架构不变量 | operation/adapter/control 日志:G1/G2 原回调/票据,逐目标与引用账本;V1/V2 全 peer 和 exact ID、准备/密钥/连接/认证/提交取消;USER/TIMEOUT/MATCH 分离,观察失败不取消业务 | +| 背压、保护、公平性、事件排空 | host/reviewer/f1_f2 日志:对象/描述符/字节耗尽、目标部分失败、角色日志代次、各主题进展、被选中事件节点保活与排空 | +| 实际下层及停止 | shell_driver.log:真实 open/read/write/poll/run/close/client destroy;部分写、EOF/ERROR、partial init、持续 EAGAIN、两次上层清理;停止 timeout 后 channels 与 op 保留,retry 收尾时无新业务 | +| 相邻依赖 | runtime/certificate/prompts/browser/release 原入口重新执行;配置保存/部分失败/未知、证书和 HTTP 生命周期、导航与表单异步归属等既有行为保持 | +| 编译与运行资源 | build.log、assets.json:真实 www.bin 与验证目录重新生成的 SPIFFS 逐字节相同;JS 语法、gzip 解压一致、cache key 配套;optimized-results 运行构建后的中英文消费者 | + +初次 Chrome 启动及 SDK 配置曾被沙箱权限阻挡;获准本地沙箱外运行后重做成功。开发中的夹具初始化、翻译断言和调度设置失败不计作产品反例,也不替代最终记录。 + +## 资源与性能边界 + +[target-resource.json](target-resource.json) 使用实际目标 compile_commands 的 GCC 及 `-fstack-usage`,分别编译冻结原实现和当前实现。Shell 对象 1076 → 1080 字节(+4),WebUI Shell context 20 → 20。open/poll/resize/统一控制的静态栈帧变化逐项列出;这是单函数静态数值,**不是调用链峰值或实机栈水位**。新增 helper 有自己的调用栈,不能只拿某个函数栈变小推断总栈降低。 + +baseline/current-allocation-metrics.json:相同正常创建、写入、不支持信号、关闭基线,项目分配数依次为 5/0/0/0,最终保留 0。它不计 libssh2 内部真实分配/硬件堆碎片;真实库所有权由边界模型另计 channel/session/socket 并在收尾归零。close 从无界网络等待改为本地收尾,时间上界属于代码与模拟时钟证据,不是设备耗时基准。 + +无新增常驻任务、队列、轮询或采样频率。TX 预算未改,当前 8 连接配置:6 个遥测消息槽/32 描述符,2 个普通消息槽/8 描述符,2 个结果槽/16 描述符,4 个保护转换槽+1 个倒计时槽/40 描述符;共 15 槽/96 描述符。保护字节保留 5×1024=5120;总预算 1 MiB,普通非保护不能借走该保留。单帧、legacy 与重试上限均沿用头文件。请求错误走 HTTPD 请求上下文直接发送,不新增结果预留或永久缓存。所有权、退订及终态释放仍由原 TX/operation 管理。 + +## 消费者反向独立自查 + +按与实施不同的顺序,从下一次用户输入/退出、提示符、恢复、socket 事件、Exec 消费者反查消息生产者及真正下层返回值,并重新查看累计 diff 中共享 API、注册、停止和构建链: + +- 通用 error 在有效 SSH 中只提示请求;普通 terminal 恢复仍由原文义明确的旧契约触发。没有新增“匹配错误文案决定是否关闭”的旁路。 +- 所有已接受 Shell 的真正终态来自原 op;四种页面控制仍经统一完整 peer 获取,不在错误处理后重新查询 current Shell。service owner 入口仍独立。 +- Exec 原创建/取消/输出/业务结束和 timer 收尾未改;共享 client 的已有协作取消通过 runtime/control 回归。 +- 唯一新增控制出口是 CLI 本地循环退出,引用和资源仍由同一 CLI 栈持有,未让回调 close/free 活跃句柄。 +- 未发现本轮已知的高优先级未关闭回归;没有以缺失键数、测试数或编译结果替代上述行为链证据。 + +## 本地结论与未验收事项 + +在记录的 SDK、主机模型和 Chrome 边界内,H1 与本轮直接相关的下层/CLI 缺陷已有反例和当前正向证据,先前有效回归保持,满足本轮**本地交付门槛**;不是可自动合并/发布或实机验收结论。 + +- 未运行设备、真实 SSH/网络、双核抢占压力、实际 CPU/堆碎片/栈水位、TLS 现场握手和长期运行。需设备验收多页面与网络抖动下输入/退出/停止重试、远端部分写及 EOF、连续日志+遥测+保护通知负载、固件/www 更新后的实际缓存刷新。 +- 发送成功不是浏览器 ACK;网络断开或关键通知有限重试耗尽时,不能承诺网页看见每条终态。需重新连接检查,绝不自动重放远端命令。请求错误本身发送失败仅有本地可观测日志,不递归产生通知。 +- 协议仍没有同一连接内的 Shell 操作 ID,无法完全区分同连接跨操作代次的迟到控制;完整 peer 只解决连接实例归属。本轮未偷偷扩展协议。 +- 支持同一构建的 firmware+www,更新后刷新并重连。旧固件仍把 H1 请求错误发成终态,新消费者无法凭旧帧安全猜测真实含义;混合版本不宣称兼容。 +- Chrome 回放使用实际入口与消费者,但 xterm 渲染是边界替身。原套件另测资源加载失败/重试。项目原 xterm CDN 在线依赖仍在,本轮没有新增外部依赖,也不声称完整离线终端验收。 + +CI 后续可接入 host runner、Chrome runner 和固定 SDK artifact checks;本轮未修改 CI 工作流。 diff --git a/docs/repair/ws-project-v3/assets.json b/docs/repair/ws-project-v3/assets.json new file mode 100644 index 0000000..1b51eda --- /dev/null +++ b/docs/repair/ws-project-v3/assets.json @@ -0,0 +1,41 @@ +{ + "index.html": { + "source_sha256": "cb1baa1bfbd2fac00a5fc55caa5442da07ab83b99996af52a41fc5c7e6e98092", + "optimized_sha256": "cb1baa1bfbd2fac00a5fc55caa5442da07ab83b99996af52a41fc5c7e6e98092", + "gzip_sha256": "27ba99dee0cb19ee0bf672ce11bed8e5570cb31b9becd7481717eb97eb794284", + "optimized_bytes": 26703 + }, + "js/terminal.js": { + "source_sha256": "6d93870c3b33b1888388f3a288cfca581a3034a2a212e1e4130853d1aceda581", + "optimized_sha256": "fb42120cf796baf79ad63058838dec0c5044e6fba436c0f86fbd169450240d75", + "gzip_sha256": "4e27a02cbdaa42f128ccb27a1e2a6625b8ce632784858c2385ab0014379b24e8", + "optimized_bytes": 19696 + }, + "js/lang/zh-CN.js": { + "source_sha256": "bb3d3b4b28c8c146fdb1c437bee84862806ed915af8cc0aa2388deb6a9e9ef89", + "optimized_sha256": "81b0fed5b0ac73d51d9c37204c9f62e035a79bbf5b5610d37fc8a936faf9fd64", + "gzip_sha256": "093c3c58b8c5aa1eaf26e50d523da35cc7f6eb84ffba92e72d2db65f7301efa1", + "optimized_bytes": 137314 + }, + "js/lang/en-US.js": { + "source_sha256": "58beed2b903407387d884c99f38eaef578e74be916175b53745d0d5ececadc10", + "optimized_sha256": "e9963046086616fecc9ba662df94e736a98c1430865e0caa47292b3690ca0ad0", + "gzip_sha256": "cf8ef5c0dc80f63cc98f09b7e1a5cd558c3576524c9b17b5aa6f00dcb5402fb4", + "optimized_bytes": 143161 + }, + "build": { + "TianShanOS.bin": { + "sha256": "729d2deb703b00ae9264bfdcabba9b63de15437ee34928da21bd799e1dcd27d6", + "bytes": 2183456 + }, + "www.bin": { + "sha256": "3caa18d33014ee7f424295b5643e3526788245998a989db077956672adc26a74", + "bytes": 3145728 + }, + "TianShanOS.elf": { + "sha256": "387099e658e1965919bb7c99a3227d684bdfb42e65ed91e6a0264fafecc9ae11", + "bytes": 18286816 + } + }, + "spiffs_regeneration": "byte-identical from verified optimized directory" +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/baseline-allocation-metrics.json b/docs/repair/ws-project-v3/baseline-allocation-metrics.json new file mode 100644 index 0000000..6d5f009 --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-allocation-metrics.json @@ -0,0 +1 @@ +{"open_allocations":5,"write_allocations":0,"unsupported_allocations":0,"close_allocations":0,"retained":0} diff --git a/docs/repair/ws-project-v3/baseline-cli-exit.txt b/docs/repair/ws-project-v3/baseline-cli-exit.txt new file mode 100644 index 0000000..c7f2f38 --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-cli-exit.txt @@ -0,0 +1,3 @@ +CLI exit: active=1 interrupt=1 +Assertion failed: (!ts_ssh_shell_is_active(shell) && cli_interrupts==1), function main, file test_shell_driver.c, line 27. +tests/ws_subscriptions/run_shell_driver.sh: line 19: 80391 Abort trap: 6 "$build/adapter" "$@" diff --git a/docs/repair/ws-project-v3/baseline-console.c b/docs/repair/ws-project-v3/baseline-console.c new file mode 100644 index 0000000..ebda813 --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-console.c @@ -0,0 +1,1826 @@ +/** + * @file ts_cmd_ssh.c + * @brief SSH Console Commands + * + * 实现 ssh 命令: + * - ssh --host --user --password --exec + * - ssh --test --host --user --password + * - ssh --keygen --type rsa2048 --output /sdcard/id_rsa + * - ssh --keyid 使用安全存储的密钥连接 + * + * 注意:密钥管理已移至独立的 key 命令 + * + * @author TianShanOS Team + * @version 2.0.0 + * @date 2026-01-18 + */ + +#include "ts_console.h" +#include "ts_i18n.h" +#include "ts_api.h" +#include "ts_log.h" +#include "ts_core.h" /* TS_MALLOC_PSRAM, TS_STRDUP_PSRAM */ +#include "ts_ssh_client.h" +#include "ts_ssh_shell.h" +#include "ts_port_forward.h" +#include "ts_crypto.h" +#include "ts_keystore.h" +#include "ts_known_hosts.h" +#include "argtable3/argtable3.h" +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/uart.h" +#include +#include +#include + +#define TAG "cmd_ssh" + +/*===========================================================================*/ +/* Argument Tables */ +/*===========================================================================*/ + +static struct { + struct arg_str *host; /**< SSH 服务器地址 */ + struct arg_int *port; /**< SSH 端口 (默认 22) */ + struct arg_str *user; /**< 用户名 */ + struct arg_str *password; /**< 密码 */ + struct arg_str *key; /**< 私钥文件路径 (PEM 格式) */ + struct arg_str *keyid; /**< 密钥 ID(从安全存储读取) */ + struct arg_str *exec; /**< 要执行的命令 */ + struct arg_lit *test; /**< 测试连接 */ + struct arg_lit *shell; /**< 交互式 Shell */ + struct arg_str *forward; /**< 端口转发 L:: */ + struct arg_lit *keygen; /**< 生成密钥对 */ + struct arg_lit *copyid; /**< 部署公钥到远程服务器 */ + struct arg_lit *revoke; /**< 从远程服务器撤销公钥 */ + struct arg_str *type; /**< 密钥类型 (rsa2048, rsa4096, ec256, ec384) */ + struct arg_str *output; /**< 密钥输出路径 */ + struct arg_str *comment; /**< 密钥注释 */ + struct arg_int *timeout; /**< 超时时间(秒) */ + struct arg_lit *verbose; /**< 详细输出 */ + struct arg_lit *help; + struct arg_end *end; +} s_ssh_args; + +/*===========================================================================*/ +/* 认证信息结构 */ +/*===========================================================================*/ + +/** + * @brief SSH 认证信息(统一传递认证参数) + * + * 支持三种认证方式: + * 1. 密码认证:只设置 password + * 2. 密钥文件认证:只设置 key_path + * 3. 内存密钥认证:设置 key_data 和 key_len(安全存储密钥) + */ +typedef struct { + const char *password; /**< 密码(密码认证) */ + const char *key_path; /**< 私钥文件路径(文件认证) */ + const uint8_t *key_data; /**< 私钥数据(内存认证,安全存储) */ + size_t key_len; /**< 私钥数据长度 */ + const char *passphrase; /**< 私钥密码(可选) */ +} ssh_auth_info_t; + +/** + * @brief 根据认证信息配置 SSH config + */ +static void config_ssh_auth(ts_ssh_config_t *config, const ssh_auth_info_t *auth) +{ + if (auth->key_data && auth->key_len > 0) { + /* 优先使用内存中的密钥(安全存储) */ + config->auth_method = TS_SSH_AUTH_PUBLICKEY; + config->auth.key.private_key = auth->key_data; + config->auth.key.private_key_len = auth->key_len; + config->auth.key.private_key_path = NULL; + config->auth.key.passphrase = auth->passphrase; + } else if (auth->key_path) { + /* 使用文件路径 */ + config->auth_method = TS_SSH_AUTH_PUBLICKEY; + config->auth.key.private_key_path = auth->key_path; + config->auth.key.private_key = NULL; + config->auth.key.private_key_len = 0; + config->auth.key.passphrase = auth->passphrase; + } else { + /* 密码认证 */ + config->auth_method = TS_SSH_AUTH_PASSWORD; + config->auth.password = auth->password; + } +} + +/*===========================================================================*/ +/* 流式输出回调 */ +/*===========================================================================*/ + +/** 用于传递给回调的上下文 */ +typedef struct { + ts_ssh_session_t session; + bool verbose; +} stream_context_t; + +/** + * @brief Stream output callback for SSH + * @note Reserved for real-time streaming output feature + */ +__attribute__((unused)) +static void stream_output_callback(const char *data, size_t len, bool is_stderr, void *user_data) +{ + stream_context_t *ctx = (stream_context_t *)user_data; + + /* 检查中断请求 */ + if (ts_console_interrupted()) { + ts_ssh_abort(ctx->session); + return; + } + + /* 打印输出 */ + if (is_stderr && ctx->verbose) { + ts_console_printf("\033[31m"); /* 红色表示 stderr */ + } + + /* 直接输出数据 */ + for (size_t i = 0; i < len; i++) { + ts_console_printf("%c", data[i]); + } + + if (is_stderr && ctx->verbose) { + ts_console_printf("\033[0m"); /* 重置颜色 */ + } +} + +/*===========================================================================*/ +/* 主机密钥验证 */ +/*===========================================================================*/ + +/** + * @brief 主机密钥验证提示回调 + * + * 当主机未知或密钥变化时,提示用户确认 + */ +static bool host_verify_prompt(const ts_known_host_t *host, + ts_host_verify_result_t result, + void *user_data) +{ + (void)user_data; + + if (result == TS_HOST_VERIFY_NOT_FOUND) { + ts_console_printf("\n"); + ts_console_printf("┌─────────────────────────────────────────────────────────────┐\n"); + ts_console_printf("│ The authenticity of host '%s' can't be established. \n", host->host); + ts_console_printf("│ %s key fingerprint is: \n", ts_host_key_type_str(host->type)); + ts_console_printf("│ SHA256:%s\n", host->fingerprint); + ts_console_printf("└─────────────────────────────────────────────────────────────┘\n"); + ts_console_printf("\nAre you sure you want to continue connecting? (yes/no): "); + fflush(stdout); + + } else if (result == TS_HOST_VERIFY_MISMATCH) { + ts_console_printf("\n"); + ts_console_printf("╔═══════════════════════════════════════════════════════════════╗\n"); + ts_console_printf("║ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ║\n"); + ts_console_printf("║ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ ║\n"); + ts_console_printf("║ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ║\n"); + ts_console_printf("╠═══════════════════════════════════════════════════════════════╣\n"); + ts_console_printf("║ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! ║\n"); + ts_console_printf("║ Someone could be eavesdropping on you right now ║\n"); + ts_console_printf("║ (man-in-the-middle attack)! ║\n"); + ts_console_printf("╠═══════════════════════════════════════════════════════════════╣\n"); + ts_console_printf("║ Host: %-50s ║\n", host->host); + ts_console_printf("║ New fingerprint: SHA256:%.40s... \n", host->fingerprint); + ts_console_printf("╚═══════════════════════════════════════════════════════════════╝\n"); + ts_console_printf("\nAre you ABSOLUTELY sure you want to continue? (yes/no): "); + fflush(stdout); + } else { + return false; + } + + /* 读取用户输入 */ + char input[16] = {0}; + int idx = 0; + + while (idx < (int)sizeof(input) - 1) { + uint8_t ch; + int len = uart_read_bytes(CONFIG_ESP_CONSOLE_UART_NUM, &ch, 1, pdMS_TO_TICKS(30000)); + if (len <= 0) { + ts_console_printf("\nTimeout - aborting connection.\n"); + return false; + } + + if (ch == '\r' || ch == '\n') { + ts_console_printf("\n"); + break; + } else if (ch == 0x03) { /* Ctrl+C */ + ts_console_printf("\n^C\n"); + return false; + } else if (ch == 0x7f || ch == 0x08) { /* Backspace */ + if (idx > 0) { + idx--; + ts_console_printf("\b \b"); + } + } else if (ch >= 32 && ch < 127) { + input[idx++] = ch; + ts_console_printf("%c", ch); + } + } + input[idx] = '\0'; + + if (strcmp(input, "yes") == 0) { + ts_console_printf("Host key accepted and saved.\n\n"); + return true; + } else { + ts_console_printf("Host key verification failed.\n"); + return false; + } +} + +/** + * @brief 验证主机密钥(连接后调用) + * + * @return ESP_OK 验证通过或用户接受,其他表示拒绝 + */ +static esp_err_t verify_host_key(ts_ssh_session_t session, bool verbose) +{ + if (verbose) { + ts_console_printf("Verifying host key...\n"); + } + + esp_err_t ret = ts_known_hosts_verify_interactive(session, host_verify_prompt, NULL); + + if (ret == ESP_OK && verbose) { + ts_console_printf("Host key verified.\n"); + } + + return ret; +} +static esp_err_t cli_verify_before_auth(ts_ssh_session_t session, void *unused) +{ + return verify_host_key(session, false); +} + + +/*===========================================================================*/ +/* Ctrl+C 检测任务 */ +/*===========================================================================*/ + +typedef struct { + ts_ssh_session_t session; + volatile bool running; +} interrupt_monitor_t; + +/** + * @brief Task to monitor Ctrl+C interrupts during SSH sessions + * @note Reserved for async interrupt handling feature + */ +__attribute__((unused)) +static void interrupt_monitor_task(void *arg) +{ + interrupt_monitor_t *mon = (interrupt_monitor_t *)arg; + + while (mon->running) { + /* 非阻塞检查 UART 输入 */ + uint8_t ch; + int len = uart_read_bytes(CONFIG_ESP_CONSOLE_UART_NUM, &ch, 1, pdMS_TO_TICKS(50)); + if (len > 0) { + if (ch == 0x03) { /* Ctrl+C = ASCII 0x03 */ + ts_console_printf("\n^C\n"); + ts_console_request_interrupt(); + ts_ssh_abort(mon->session); + break; + } else if (ch == 0x1C) { /* Ctrl+\ = ASCII 0x1C (SIGQUIT) */ + ts_console_printf("\n^\\\n"); + ts_console_request_interrupt(); + ts_ssh_abort(mon->session); + break; + } + } + } + + vTaskDelete(NULL); +} + +/*===========================================================================*/ +/* Command: ssh --exec */ +/*===========================================================================*/ + +static int do_ssh_exec(const char *host, int port, const char *user, + const ssh_auth_info_t *auth, + const char *command, int timeout_sec, bool verbose) +{ + /* 构建 API 参数 */ + cJSON *params = cJSON_CreateObject(); + cJSON_AddStringToObject(params, "host", host); + cJSON_AddNumberToObject(params, "port", port); + cJSON_AddStringToObject(params, "user", user); + cJSON_AddStringToObject(params, "command", command); + cJSON_AddNumberToObject(params, "timeout_ms", timeout_sec * 1000); + + /* 配置认证方式 */ + if (auth->password) { + cJSON_AddStringToObject(params, "password", auth->password); + } else if (auth->key_path) { + cJSON_AddStringToObject(params, "keypath", auth->key_path); + } + /* 注意:keyid 认证需要 CLI 先加载密钥,API 不直接支持 keyid */ + + if (verbose) { + ts_console_printf("Connecting to %s@%s:%d...\n", user, host, port); + ts_console_printf("Executing command: %s\n", command); + ts_console_printf("(Press Ctrl+C to abort)\n\n"); + } + + /* 调用 API */ + ts_api_result_t result; + ts_api_result_init(&result); + + esp_err_t ret = ts_api_call("ssh.exec", params, &result); + cJSON_Delete(params); + + if (ret != ESP_OK || result.code != TS_API_OK) { + ts_console_printf("Error: %s\n", result.message ? result.message : "SSH command failed"); + ts_api_result_free(&result); + return 1; + } + + /* 解析结果 */ + if (result.data) { + cJSON *stdout_obj = cJSON_GetObjectItem(result.data, "stdout"); + cJSON *stderr_obj = cJSON_GetObjectItem(result.data, "stderr"); + cJSON *exit_code = cJSON_GetObjectItem(result.data, "exit_code"); + + /* 输出 stdout */ + if (stdout_obj && cJSON_IsString(stdout_obj) && stdout_obj->valuestring[0]) { + ts_console_printf("%s", stdout_obj->valuestring); + if (stdout_obj->valuestring[strlen(stdout_obj->valuestring)-1] != '\n') { + ts_console_printf("\n"); + } + } + + /* 输出 stderr(红色) */ + if (stderr_obj && cJSON_IsString(stderr_obj) && stderr_obj->valuestring[0]) { + if (verbose) { + ts_console_printf("\033[31m%s\033[0m", stderr_obj->valuestring); + } else { + ts_console_printf("%s", stderr_obj->valuestring); + } + } + + if (verbose && exit_code) { + ts_console_printf("\n--- Command completed with exit code: %d ---\n", + exit_code->valueint); + } + + int code = exit_code ? exit_code->valueint : 0; + ts_api_result_free(&result); + return code; + } + + ts_api_result_free(&result); + return 0; +} + +/*===========================================================================*/ +/* Command: ssh --shell */ +/*===========================================================================*/ + +/** Shell 输出回调 */ +static void shell_output_callback(const char *data, size_t len, void *user_data) +{ + (void)user_data; + /* 直接输出到 stdout,更高效 */ + fwrite(data, 1, len, stdout); + fflush(stdout); /* 立即刷新,确保显示 */ +} + +/** Shell 输入回调 */ +static const char *shell_input_callback(size_t *out_len, void *user_data) +{ + static char input_buf[64]; + ts_ssh_shell_t shell = (ts_ssh_shell_t)user_data; + + *out_len = 0; + + /* 非阻塞读取 UART(0ms 超时 = 立即返回) */ + uint8_t ch; + int len = uart_read_bytes(CONFIG_ESP_CONSOLE_UART_NUM, &ch, 1, 0); + if (len > 0) { + /* 检查特殊控制字符 */ + if (ch == 0x03) { /* Ctrl+C */ + /* 发送 SIGINT 到远程 */ + ts_ssh_shell_send_signal(shell, "INT"); + return NULL; + } else if (ch == 0x1C) { /* Ctrl+\ - 退出 Shell */ + ts_console_printf("\n^\\ (Exit shell)\n"); + ts_console_request_interrupt(); + return NULL; + } + + input_buf[0] = ch; + *out_len = 1; + return input_buf; + } + + return NULL; +} + +static int do_ssh_shell(const char *host, int port, const char *user, + const ssh_auth_info_t *auth, + int timeout_sec, bool verbose) +{ + ts_ssh_session_t session = NULL; + ts_ssh_shell_t shell = NULL; + esp_err_t ret; + + /* 配置 SSH 连接 */ + ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); + config.host = host; + config.port = port; + config.username = user; + config.timeout_ms = timeout_sec * 1000; + + /* 配置认证方式 */ + config_ssh_auth(&config, auth); + + if (verbose) { + if (auth->key_data) { + ts_console_printf("Using public key authentication (secure storage)\n"); + } else if (auth->key_path) { + ts_console_printf("Using public key authentication\n"); + } + } + + ts_console_printf("Connecting to %s@%s:%d...\n", user, host, port); + + /* 创建会话 */ + ret = ts_ssh_session_create(&config, &session); + if (ret != ESP_OK) { + ts_console_printf("Error: Failed to create SSH session\n"); + return 1; + } + + /* 连接 */ + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); + if (ret != ESP_OK) { + ts_console_printf("Error: %s\n", ts_ssh_get_error(session)); + ts_ssh_session_destroy(session); + return 1; + } + + /* 验证主机密钥 */ + ret = verify_host_key(session, verbose); + if (ret != ESP_OK) { + ts_console_printf("Error: Host key verification failed\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + return 1; + } + + /* 打开交互式 Shell */ + ts_shell_config_t shell_config = TS_SHELL_DEFAULT_CONFIG(); + shell_config.term_width = 80; + shell_config.term_height = 24; + shell_config.read_timeout_ms = 50; + + ret = ts_ssh_shell_open(session, &shell_config, &shell); + if (ret != ESP_OK) { + ts_console_printf("Error: Failed to open shell\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + return 1; + } + + ts_console_printf("Connected. Interactive shell started.\n"); + ts_console_printf("(Press Ctrl+\\ to exit, Ctrl+C to send SIGINT)\n\n"); + ts_console_clear_interrupt(); + + /* 运行交互式 Shell 循环 */ + ret = ts_ssh_shell_run(shell, shell_output_callback, shell_input_callback, shell); + + int exit_code = ts_ssh_shell_get_exit_code(shell); + + /* 清理 */ + ts_ssh_shell_close(shell); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + ts_console_clear_interrupt(); + + ts_console_printf("\n--- Shell closed (exit code: %d) ---\n", exit_code); + + return (ret == ESP_OK) ? 0 : 1; +} + +/*===========================================================================*/ +/* Command: ssh --forward */ +/*===========================================================================*/ + +static int do_ssh_forward(const char *host, int port, const char *user, + const ssh_auth_info_t *auth, + const char *forward_spec, + int timeout_sec, bool verbose) +{ + ts_ssh_session_t session = NULL; + ts_port_forward_t forward = NULL; + esp_err_t ret; + + (void)verbose; /* 暂未使用 */ + + /* 解析端口转发规格: L:: */ + if (forward_spec[0] != 'L' && forward_spec[0] != 'l') { + ts_console_printf("Error: Forward spec must start with 'L' (local forward)\n"); + ts_console_printf("Format: L::\n"); + ts_console_printf("Example: L8080:localhost:80\n"); + return 1; + } + + int local_port = 0; + char remote_host[128] = {0}; + int remote_port = 0; + + if (sscanf(forward_spec + 1, "%d:%127[^:]:%d", &local_port, remote_host, &remote_port) != 3) { + ts_console_printf("Error: Invalid forward spec format\n"); + ts_console_printf("Format: L::\n"); + ts_console_printf("Example: L8080:localhost:80\n"); + return 1; + } + + if (local_port <= 0 || local_port > 65535 || remote_port <= 0 || remote_port > 65535) { + ts_console_printf("Error: Invalid port number\n"); + return 1; + } + + /* 配置 SSH 连接 */ + ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); + config.host = host; + config.port = port; + config.username = user; + config.timeout_ms = timeout_sec * 1000; + + /* 配置认证方式 */ + config_ssh_auth(&config, auth); + + ts_console_printf("Connecting to %s@%s:%d...\n", user, host, port); + + /* 创建会话 */ + ret = ts_ssh_session_create(&config, &session); + if (ret != ESP_OK) { + ts_console_printf("Error: Failed to create SSH session\n"); + return 1; + } + + /* 连接 */ + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); + if (ret != ESP_OK) { + ts_console_printf("Error: %s\n", ts_ssh_get_error(session)); + ts_ssh_session_destroy(session); + return 1; + } + + /* 验证主机密钥 */ + ret = verify_host_key(session, verbose); + if (ret != ESP_OK) { + ts_console_printf("Error: Host key verification failed\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + return 1; + } + + /* 创建端口转发 */ + ts_forward_config_t fwd_config = TS_FORWARD_DEFAULT_CONFIG(); + fwd_config.direction = TS_FORWARD_LOCAL; + fwd_config.local_host = "0.0.0.0"; /* 允许所有接口访问 */ + fwd_config.local_port = local_port; + fwd_config.remote_host = remote_host; + fwd_config.remote_port = remote_port; + + ret = ts_port_forward_create(session, &fwd_config, &forward); + if (ret != ESP_OK) { + ts_console_printf("Error: Failed to create port forward\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + return 1; + } + + /* 启动转发 */ + ret = ts_port_forward_start(forward); + if (ret != ESP_OK) { + ts_console_printf("Error: Failed to start port forward\n"); + ts_port_forward_destroy(forward); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + return 1; + } + + ts_console_printf("\n"); + ts_console_printf("╔════════════════════════════════════════════╗\n"); + ts_console_printf("║ SSH Port Forwarding Active ║\n"); + ts_console_printf("╠════════════════════════════════════════════╣\n"); + ts_console_printf("║ Local: 0.0.0.0:%-5d ║\n", local_port); + ts_console_printf("║ Remote: %s:%-5d", remote_host, remote_port); + /* 填充空格 */ + int len = strlen(remote_host) + 6; + for (int i = len; i < 25; i++) ts_console_printf(" "); + ts_console_printf("║\n"); + ts_console_printf("╠════════════════════════════════════════════╣\n"); + ts_console_printf("║ Press Ctrl+C to stop forwarding ║\n"); + ts_console_printf("╚════════════════════════════════════════════╝\n\n"); + + ts_console_clear_interrupt(); + + /* 等待用户中断 */ + while (!ts_console_interrupted()) { + /* 检查 UART 输入 */ + uint8_t ch; + int len = uart_read_bytes(CONFIG_ESP_CONSOLE_UART_NUM, &ch, 1, pdMS_TO_TICKS(500)); + if (len > 0 && (ch == 0x03 || ch == 0x1C)) { + ts_console_printf("\n^C\n"); + break; + } + + /* 显示统计(每 5 秒) */ + if (verbose) { + static int counter = 0; + if (++counter >= 10) { + counter = 0; + ts_forward_stats_t stats; + if (ts_port_forward_get_stats(forward, &stats) == ESP_OK) { + ts_console_printf("Stats: %u active, %u total, TX: %llu, RX: %llu\r", + stats.active_connections, stats.total_connections, + stats.bytes_sent, stats.bytes_received); + } + } + } + } + + /* 停止转发 */ + ts_console_printf("Stopping port forward...\n"); + ts_port_forward_stop(forward); + ts_port_forward_destroy(forward); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + ts_console_clear_interrupt(); + + ts_console_printf("Port forwarding stopped.\n"); + return 0; +} + +/*===========================================================================*/ +/* Command: ssh --test */ +/*===========================================================================*/ + +static int do_ssh_test(const char *host, int port, const char *user, + const ssh_auth_info_t *auth, int timeout_sec) +{ + const char *auth_type = "Password"; + if (auth->key_data) { + auth_type = "Public Key (secure storage)"; + } else if (auth->key_path) { + auth_type = "Public Key"; + } + + ts_console_printf("\nSSH Connection Test\n"); + ts_console_printf("═══════════════════════════════════════\n"); + ts_console_printf(" Host: %s\n", host); + ts_console_printf(" Port: %d\n", port); + ts_console_printf(" User: %s\n", user); + ts_console_printf(" Auth: %s\n", auth_type); + ts_console_printf(" Timeout: %d seconds\n", timeout_sec); + ts_console_printf("═══════════════════════════════════════\n\n"); + + /* 构建 API 参数 */ + cJSON *params = cJSON_CreateObject(); + cJSON_AddStringToObject(params, "host", host); + cJSON_AddNumberToObject(params, "port", port); + cJSON_AddStringToObject(params, "user", user); + + /* 配置认证方式 */ + if (auth->password) { + cJSON_AddStringToObject(params, "password", auth->password); + } else if (auth->key_path) { + cJSON_AddStringToObject(params, "keypath", auth->key_path); + } + + ts_console_printf("[1/2] Testing connection... "); + + /* 调用 API */ + ts_api_result_t result; + ts_api_result_init(&result); + + esp_err_t ret = ts_api_call("ssh.test", params, &result); + cJSON_Delete(params); + + if (ret != ESP_OK || result.code != TS_API_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: %s\n", result.message ? result.message : "Connection failed"); + ts_api_result_free(&result); + return 1; + } + + /* 解析结果 */ + bool success = false; + if (result.data) { + cJSON *success_obj = cJSON_GetObjectItem(result.data, "success"); + success = cJSON_IsTrue(success_obj); + + if (!success) { + cJSON *error_obj = cJSON_GetObjectItem(result.data, "error"); + ts_console_printf("FAILED\n"); + if (error_obj && cJSON_IsString(error_obj)) { + ts_console_printf(" Error: %s\n", error_obj->valuestring); + } + } else { + ts_console_printf("OK\n"); + } + } + + ts_api_result_free(&result); + + ts_console_printf("[2/2] Verifying response... "); + if (success) { + ts_console_printf("OK\n"); + } else { + ts_console_printf("FAILED\n"); + } + + ts_console_printf("\n"); + if (success) { + ts_console_printf("✓ SSH connection test PASSED\n"); + return 0; + } else { + ts_console_printf("✗ SSH connection test FAILED\n"); + return 1; + } +} + +/*===========================================================================*/ +/* Command: ssh --copy-id */ +/*===========================================================================*/ + +/** + * @brief 读取公钥文件内容 + */ +static esp_err_t load_public_key(const char *path, char **pubkey_data) +{ + if (!path || !pubkey_data) { + return ESP_ERR_INVALID_ARG; + } + + /* 构建公钥文件路径 (.pub) */ + char pub_path[256]; + snprintf(pub_path, sizeof(pub_path), "%s.pub", path); + + FILE *fp = fopen(pub_path, "r"); + if (!fp) { + ts_console_printf("Error: Cannot open public key file: %s\n", pub_path); + return ESP_ERR_NOT_FOUND; + } + + /* 获取文件大小 */ + fseek(fp, 0, SEEK_END); + long fsize = ftell(fp); + fseek(fp, 0, SEEK_SET); + + if (fsize <= 0 || fsize > 8192) { + ts_console_printf("Error: Invalid public key file size: %ld\n", fsize); + fclose(fp); + return ESP_ERR_INVALID_SIZE; + } + + /* 分配内存并读取 */ + char *data = TS_MALLOC_PSRAM(fsize + 1); + if (!data) { + fclose(fp); + return ESP_ERR_NO_MEM; + } + + size_t read_len = fread(data, 1, fsize, fp); + fclose(fp); + + if (read_len != (size_t)fsize) { + free(data); + return ESP_ERR_INVALID_RESPONSE; + } + + /* 去除末尾换行符 */ + data[fsize] = '\0'; + while (fsize > 0 && (data[fsize - 1] == '\n' || data[fsize - 1] == '\r')) { + data[--fsize] = '\0'; + } + + *pubkey_data = data; + return ESP_OK; +} + +static int do_ssh_copy_id(const char *host, int port, const char *user, + const char *password, const char *key_path, + const char *keyid, int timeout_sec) +{ + ts_ssh_session_t session = NULL; + esp_err_t ret; + char *pubkey_data = NULL; + char *privkey_data = NULL; + size_t privkey_len = 0; + bool use_keystore = (keyid != NULL); + + ts_console_printf("\nSSH Public Key Deployment\n"); + ts_console_printf("═══════════════════════════════════════\n"); + ts_console_printf(" Host: %s\n", host); + ts_console_printf(" Port: %d\n", port); + ts_console_printf(" User: %s\n", user); + if (use_keystore) { + ts_console_printf(" Key: [secure storage] %s\n", keyid); + } else { + ts_console_printf(" Key: %s.pub\n", key_path); + } + ts_console_printf("═══════════════════════════════════════\n\n"); + + /* 读取公钥 */ + ts_console_printf("[1/4] Reading public key... "); + if (use_keystore) { + size_t pubkey_len = 0; + ret = ts_keystore_load_public_key(keyid, &pubkey_data, &pubkey_len); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: Cannot load public key '%s' from secure storage\n", keyid); + return 1; + } + } else { + ret = load_public_key(key_path, &pubkey_data); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + return 1; + } + } + ts_console_printf("OK\n"); + + /* 配置 SSH 连接(使用密码认证) */ + ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); + config.host = host; + config.port = port; + config.username = user; + config.timeout_ms = timeout_sec * 1000; + config.auth_method = TS_SSH_AUTH_PASSWORD; + config.auth.password = password; + + ts_console_printf("[2/4] Connecting with password... "); + ret = ts_ssh_session_create(&config, &session); + if (ret != ESP_OK) { + ts_console_printf("FAILED (session create)\n"); + free(pubkey_data); + return 1; + } + + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: %s\n", ts_ssh_get_error(session)); + ts_ssh_session_destroy(session); + free(pubkey_data); + return 1; + } + + /* 验证主机密钥 */ + ret = verify_host_key(session, false); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Host key verification failed\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + return 1; + } + ts_console_printf("OK\n"); + + /* 构建部署命令 */ + ts_console_printf("[3/4] Deploying public key... "); + + /* 命令:创建 .ssh 目录并追加公钥到 authorized_keys */ + char *deploy_cmd = TS_MALLOC_PSRAM(strlen(pubkey_data) + 512); + if (!deploy_cmd) { + ts_console_printf("FAILED (out of memory)\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + return 1; + } + + snprintf(deploy_cmd, strlen(pubkey_data) + 512, + "mkdir -p ~/.ssh && chmod 700 ~/.ssh && " + "echo '%s' >> ~/.ssh/authorized_keys && " + "chmod 600 ~/.ssh/authorized_keys && " + "echo 'Key deployed successfully'", + pubkey_data); + + ts_ssh_exec_result_t result; + ret = ts_ssh_exec(session, deploy_cmd, &result); + free(deploy_cmd); + + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: %s\n", ts_ssh_get_error(session)); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + return 1; + } + + bool deploy_ok = (result.exit_code == 0); + if (result.stderr_data && strlen(result.stderr_data) > 0) { + ts_console_printf("WARNING\n"); + ts_console_printf(" stderr: %s\n", result.stderr_data); + } else if (deploy_ok) { + ts_console_printf("OK\n"); + } else { + ts_console_printf("FAILED (exit code: %d)\n", result.exit_code); + } + ts_ssh_exec_result_free(&result); + + /* 断开密码连接 */ + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + + if (!deploy_ok) { + free(pubkey_data); + return 1; + } + + /* 验证公钥认证 */ + ts_console_printf("[4/4] Verifying public key auth... "); + + /* 加载私钥用于验证 */ + if (use_keystore) { + ret = ts_keystore_load_private_key(keyid, &privkey_data, &privkey_len); + if (ret != ESP_OK) { + ts_console_printf("SKIPPED\n"); + ts_console_printf(" Note: Cannot load private key for verification\n"); + free(pubkey_data); + ts_console_printf("\n✓ Public key deployed successfully!\n"); + ts_console_printf("\nYou can now connect without password:\n"); + ts_console_printf(" ssh --host %s --user %s --keyid %s --shell\n", host, user, keyid); + return 0; + } + } + + /* 使用公钥认证重新连接 */ + ts_ssh_config_t verify_config = TS_SSH_DEFAULT_CONFIG(); + verify_config.host = host; + verify_config.port = port; + verify_config.username = user; + verify_config.timeout_ms = timeout_sec * 1000; + verify_config.auth_method = TS_SSH_AUTH_PUBLICKEY; + + /* 配置认证方式 */ + if (use_keystore && privkey_data) { + /* 使用内存中的密钥(安全,不写入临时文件) */ + verify_config.auth.key.private_key = (const uint8_t *)privkey_data; + verify_config.auth.key.private_key_len = privkey_len; + verify_config.auth.key.private_key_path = NULL; + } else { + /* 使用文件路径 */ + verify_config.auth.key.private_key_path = key_path; + verify_config.auth.key.private_key = NULL; + verify_config.auth.key.private_key_len = 0; + } + verify_config.auth.key.passphrase = NULL; + + ret = ts_ssh_session_create(&verify_config, &session); + if (ret != ESP_OK) { + ts_console_printf("FAILED (session)\n"); + free(pubkey_data); + if (privkey_data) { + memset(privkey_data, 0, privkey_len); /* 安全清零 */ + free(privkey_data); + } + return 1; + } + + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); + + if (ret != ESP_OK) { + const char *error_msg = ts_ssh_get_error(session); + + /* 检查是否是密钥类型不支持的错误 */ + if (error_msg && (strstr(error_msg, "Key type not supported") || + strstr(error_msg, "Method unimplemented") || + strstr(error_msg, "Method not supported"))) { + ts_console_printf("SKIPPED\n"); + ts_console_printf(" Note: Key type may not be fully supported for verification\n"); + ts_ssh_session_destroy(session); + free(pubkey_data); + if (privkey_data) { + memset(privkey_data, 0, privkey_len); + free(privkey_data); + } + ts_console_printf("\n✓ Public key deployed successfully!\n"); + ts_console_printf("\n⚠ Verification skipped (may be ECDSA or memory auth limitation)\n"); + ts_console_printf(" The key has been added to authorized_keys.\n"); + ts_console_printf(" Try connecting with:\n"); + if (use_keystore) { + ts_console_printf(" ssh --host %s --user %s --keyid %s --shell\n", host, user, keyid); + } else { + ts_console_printf(" ssh --host %s --user %s --key %s --shell\n", host, user, key_path); + } + return 0; + } + + /* 检查是否是 ECDSA 不支持 */ + if (privkey_data && strstr(privkey_data, "BEGIN EC PRIVATE KEY")) { + ts_console_printf("SKIPPED\n"); + ts_console_printf(" Note: ECDSA keys may not be fully supported by libssh2 mbedTLS backend\n"); + ts_ssh_session_destroy(session); + free(pubkey_data); + memset(privkey_data, 0, privkey_len); + free(privkey_data); + ts_console_printf("\n✓ Public key deployed successfully!\n"); + ts_console_printf("\nYou can now connect. If authentication fails, try using RSA keys:\n"); + ts_console_printf(" key --generate --id mykey --type rsa\n"); + return 0; + } + + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: %s\n", error_msg ? error_msg : "Unknown error"); + ts_ssh_session_destroy(session); + free(pubkey_data); + if (privkey_data) { + memset(privkey_data, 0, privkey_len); + free(privkey_data); + } + ts_console_printf("\n⚠ Key deployed but verification failed\n"); + return 1; + } + + ts_console_printf("OK\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + if (privkey_data) { + memset(privkey_data, 0, privkey_len); + free(privkey_data); + } + + ts_console_printf("\n✓ Public key authentication configured successfully!\n"); + ts_console_printf("\nYou can now connect without password:\n"); + if (use_keystore) { + ts_console_printf(" ssh --host %s --user %s --keyid %s --shell\n", host, user, keyid); + } else { + ts_console_printf(" ssh --host %s --user %s --key %s --shell\n", host, user, key_path); + } + + return 0; +} + +/*===========================================================================*/ +/* Command: ssh --revoke */ +/*===========================================================================*/ + +/** + * @brief 从远程服务器撤销已部署的公钥 + * + * 使用密码认证连接到远程服务器,然后从 authorized_keys 中移除匹配的公钥。 + * 支持两种方式指定要撤销的密钥: + * 1. --keyid:从安全存储获取公钥 + * 2. --key:从文件读取公钥 + * + * @param host 远程主机地址 + * @param port SSH 端口 + * @param user 用户名 + * @param password 密码(用于认证) + * @param key_path 私钥文件路径(用于定位公钥) + * @param keyid 密钥 ID(从安全存储) + * @param timeout_sec 超时时间(秒) + * @return 0 成功,非 0 失败 + */ +static int do_ssh_revoke(const char *host, int port, const char *user, + const char *password, const char *key_path, + const char *keyid, int timeout_sec) +{ + ts_console_printf("\n══════════════════════════════════════════════════════════════════\n"); + ts_console_printf(" SSH Public Key Revocation\n"); + ts_console_printf("══════════════════════════════════════════════════════════════════\n\n"); + + ts_ssh_session_t session = NULL; + esp_err_t ret; + char *pubkey_data = NULL; + size_t pubkey_len = 0; + bool use_keystore = (keyid != NULL && key_path == NULL); + + /* 获取公钥数据(用于匹配要删除的密钥) */ + if (use_keystore) { + ts_console_printf("Loading public key '%s' from secure storage... ", keyid); + ret = ts_keystore_load_public_key(keyid, &pubkey_data, &pubkey_len); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf("Error: Failed to load public key: %s\n", esp_err_to_name(ret)); + return 1; + } + ts_console_printf("OK\n"); + } else { + /* 从文件读取公钥 */ + char pubkey_path[256]; + snprintf(pubkey_path, sizeof(pubkey_path), "%s.pub", key_path); + + ts_console_printf("Reading public key from %s... ", pubkey_path); + + FILE *f = fopen(pubkey_path, "r"); + if (!f) { + ts_console_printf("FAILED\n"); + ts_console_printf("Error: Cannot open public key file\n"); + return 1; + } + + fseek(f, 0, SEEK_END); + pubkey_len = ftell(f); + fseek(f, 0, SEEK_SET); + + pubkey_data = TS_MALLOC_PSRAM(pubkey_len + 1); + if (!pubkey_data) { + fclose(f); + ts_console_printf("FAILED\n"); + ts_console_printf("Error: Memory allocation failed\n"); + return 1; + } + + fread(pubkey_data, 1, pubkey_len, f); + fclose(f); + pubkey_data[pubkey_len] = '\0'; + ts_console_printf("OK\n"); + } + + /* 提取公钥的 key type 和 key data 部分(忽略 comment) + * 格式: "ssh-rsa AAAAB3Nza... comment" + * 我们需要 "ssh-rsa AAAAB3Nza..." 部分来匹配 */ + char *key_type = NULL; + char *key_data = NULL; + char *pubkey_copy = TS_STRDUP_PSRAM(pubkey_data); + if (!pubkey_copy) { + free(pubkey_data); + ts_console_printf("Error: Memory allocation failed\n"); + return 1; + } + + /* 解析公钥格式 */ + key_type = strtok(pubkey_copy, " "); + key_data = strtok(NULL, " "); + + if (!key_type || !key_data) { + ts_console_printf("Error: Invalid public key format\n"); + free(pubkey_data); + free(pubkey_copy); + return 1; + } + + ts_console_printf("\nKey to revoke:\n"); + ts_console_printf(" Type: %s\n", key_type); + ts_console_printf(" Data: %.40s...\n", key_data); + + /* 显示警告 */ + ts_console_printf("\n"); + ts_console_printf("┌─────────────────────────────────────────────────────────────┐\n"); + ts_console_printf("│ WARNING: This will remove the public key from the remote │\n"); + ts_console_printf("│ server's authorized_keys file. │\n"); + ts_console_printf("└─────────────────────────────────────────────────────────────┘\n"); + ts_console_printf("\nTarget: %s@%s:%d\n\n", user, host, port); + + /* 配置 SSH 连接(使用密码认证) */ + ts_ssh_config_t config = TS_SSH_DEFAULT_CONFIG(); + config.host = host; + config.port = port; + config.username = user; + config.timeout_ms = timeout_sec * 1000; + config.auth_method = TS_SSH_AUTH_PASSWORD; + config.auth.password = password; + + /* 创建会话 */ + ts_console_printf("Connecting with password authentication... "); + ret = ts_ssh_session_create(&config, &session); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf("Error: Failed to create SSH session\n"); + free(pubkey_data); + free(pubkey_copy); + return 1; + } + + /* 连接 */ + ret = ts_ssh_connect_with_verifier(session, cli_verify_before_auth, NULL); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf("Error: %s\n", ts_ssh_get_error(session)); + ts_ssh_session_destroy(session); + free(pubkey_data); + free(pubkey_copy); + return 1; + } + ts_console_printf("OK\n"); + + /* 验证主机密钥 */ + ret = verify_host_key(session, false); + if (ret != ESP_OK) { + ts_console_printf(" Host key verification failed\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + free(pubkey_copy); + return 1; + } + + /* 构建检查命令 - 使用 grep -F 进行固定字符串匹配 + * 只取 key_data 的前 100 字符作为匹配特征,避免命令行过长 + * 同时需要检查完整密钥类型前缀以确保唯一性 */ + char key_signature[128]; + size_t sig_len = strlen(key_data) > 100 ? 100 : strlen(key_data); + snprintf(key_signature, sizeof(key_signature), "%s %.*s", key_type, (int)sig_len, key_data); + + char cmd[1024]; + snprintf(cmd, sizeof(cmd), + "if [ -f ~/.ssh/authorized_keys ]; then " + " grep -cF '%s' ~/.ssh/authorized_keys 2>/dev/null || echo '0'; " + "else " + " echo '0'; " + "fi", + key_signature); + + /* 先检查密钥是否存在 */ + ts_console_printf("Checking if key exists on remote... "); + + ts_ssh_exec_result_t result; + ret = ts_ssh_exec(session, cmd, &result); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf("Error: Failed to check key: %s\n", ts_ssh_get_error(session)); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + free(pubkey_copy); + return 1; + } + + int key_count = 0; + if (result.stdout_data) { + key_count = atoi(result.stdout_data); + } + ts_ssh_exec_result_free(&result); + + if (key_count == 0) { + ts_console_printf("NOT FOUND\n"); + ts_console_printf("\n⚠ The specified public key was not found on the remote server.\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + free(pubkey_copy); + return 0; /* 不视为错误 */ + } + + ts_console_printf("FOUND (%d match%s)\n", key_count, key_count > 1 ? "es" : ""); + + /* 执行删除操作 - 使用 grep -vF 进行固定字符串排除 */ + ts_console_printf("Removing key from authorized_keys... "); + + snprintf(cmd, sizeof(cmd), + "cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys.bak 2>/dev/null; " + "grep -vF '%s' ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp 2>/dev/null && " + "mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys && " + "chmod 600 ~/.ssh/authorized_keys && " + "echo 'OK'", + key_signature); + + ret = ts_ssh_exec(session, cmd, &result); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf("Error: Failed to remove key: %s\n", ts_ssh_get_error(session)); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + free(pubkey_copy); + return 1; + } + + bool remove_ok = (result.stdout_data && strstr(result.stdout_data, "OK") != NULL); + ts_ssh_exec_result_free(&result); + + if (!remove_ok) { + ts_console_printf("FAILED\n"); + ts_console_printf("Error: Failed to remove key\n"); + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + free(pubkey_copy); + return 1; + } + ts_console_printf("OK\n"); + + /* 验证删除成功 */ + ts_console_printf("Verifying removal... "); + + snprintf(cmd, sizeof(cmd), + "grep -cF '%s' ~/.ssh/authorized_keys 2>/dev/null || echo '0'", + key_signature); + + ret = ts_ssh_exec(session, cmd, &result); + if (ret == ESP_OK && result.stdout_data) { + int remaining = atoi(result.stdout_data); + if (remaining == 0) { + ts_console_printf("OK\n"); + } else { + ts_console_printf("WARNING (%d keys still match)\n", remaining); + } + } else { + ts_console_printf("SKIPPED\n"); + } + ts_ssh_exec_result_free(&result); + + ts_ssh_disconnect(session); + ts_ssh_session_destroy(session); + free(pubkey_data); + free(pubkey_copy); + + ts_console_printf("\n✓ Public key revoked successfully!\n"); + ts_console_printf("\n A backup was saved to ~/.ssh/authorized_keys.bak on the remote server.\n"); + + /* 如果是 keystore 密钥,提示可以删除本地密钥 */ + if (use_keystore) { + ts_console_printf("\n To also delete the local key:\n"); + ts_console_printf(" key --delete --id %s\n", keyid); + } + + return 0; +} + +/*===========================================================================*/ +/* Command: ssh --keygen */ +/*===========================================================================*/ + +/** + * @brief 解析密钥类型字符串 + */ +static bool parse_key_type(const char *type_str, ts_crypto_key_type_t *type) +{ + if (!type_str || !type) return false; + + if (strcmp(type_str, "rsa2048") == 0 || strcmp(type_str, "rsa") == 0) { + *type = TS_CRYPTO_KEY_RSA_2048; + return true; + } else if (strcmp(type_str, "rsa4096") == 0) { + *type = TS_CRYPTO_KEY_RSA_4096; + return true; + } else if (strcmp(type_str, "ec256") == 0 || strcmp(type_str, "ecdsa") == 0) { + *type = TS_CRYPTO_KEY_EC_P256; + return true; + } else if (strcmp(type_str, "ec384") == 0) { + *type = TS_CRYPTO_KEY_EC_P384; + return true; + } + return false; +} + +/** + * @brief 获取密钥类型的描述字符串 + */ +static const char *get_key_type_desc(ts_crypto_key_type_t type) +{ + switch (type) { + case TS_CRYPTO_KEY_RSA_2048: return "RSA 2048-bit"; + case TS_CRYPTO_KEY_RSA_4096: return "RSA 4096-bit"; + case TS_CRYPTO_KEY_EC_P256: return "ECDSA P-256 (secp256r1)"; + case TS_CRYPTO_KEY_EC_P384: return "ECDSA P-384 (secp384r1)"; + default: return "Unknown"; + } +} + +/*===========================================================================*/ +/* Command: ssh --keygen (file-based) */ +/*===========================================================================*/ + +/** + * @brief 生成密钥对到文件(保留直接实现,因为需要写入文件系统) + * + * 注意:如果要生成到安全存储,应使用 key 命令或 ssh.keygen API + */ +static int do_ssh_keygen(const char *type_str, const char *output_path, const char *comment) +{ + ts_crypto_key_type_t key_type; + ts_keypair_t keypair = NULL; + esp_err_t ret; + + /* 解析密钥类型 */ + if (!parse_key_type(type_str, &key_type)) { + ts_console_printf("Error: Invalid key type '%s'\n", type_str); + ts_console_printf("Supported types: rsa, rsa2048, rsa4096, ecdsa, ec256, ec384\n"); + return 1; + } + + ts_console_printf("\nSSH Key Generation\n"); + ts_console_printf("═══════════════════════════════════════\n"); + ts_console_printf(" Type: %s\n", get_key_type_desc(key_type)); + ts_console_printf(" Output: %s\n", output_path); + if (comment) { + ts_console_printf(" Comment: %s\n", comment); + } + ts_console_printf("═══════════════════════════════════════\n\n"); + + /* 生成密钥对 */ + ts_console_printf("[1/4] Generating key pair... "); + + /* RSA 4096 需要较长时间,给出提示 */ + if (key_type == TS_CRYPTO_KEY_RSA_4096) { + ts_console_printf("(this may take 30-60 seconds)\n "); + } + + ret = ts_crypto_keypair_generate(key_type, &keypair); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: Failed to generate key pair (%s)\n", esp_err_to_name(ret)); + return 1; + } + ts_console_printf("OK\n"); + + /* 导出私钥 (PEM 格式) */ + ts_console_printf("[2/4] Saving private key... "); + + char *private_pem = TS_MALLOC_PSRAM(8192); + if (!private_pem) { + ts_console_printf("FAILED (out of memory)\n"); + ts_crypto_keypair_free(keypair); + return 1; + } + + size_t pem_len = 8192; + ret = ts_crypto_keypair_export_private(keypair, private_pem, &pem_len); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + free(private_pem); + ts_crypto_keypair_free(keypair); + return 1; + } + + /* 写入私钥文件 */ + FILE *fp = fopen(output_path, "w"); + if (!fp) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: Cannot create file %s\n", output_path); + free(private_pem); + ts_crypto_keypair_free(keypair); + return 1; + } + + fprintf(fp, "%s", private_pem); + fclose(fp); + free(private_pem); + ts_console_printf("OK\n"); + + /* 导出公钥 (OpenSSH 格式) */ + ts_console_printf("[3/4] Saving public key... "); + + char *openssh_pub = TS_MALLOC_PSRAM(4096); + if (!openssh_pub) { + ts_console_printf("FAILED (out of memory)\n"); + ts_crypto_keypair_free(keypair); + return 1; + } + + size_t openssh_len = 4096; + const char *key_comment = comment ? comment : "TianShanOS-generated-key"; + ret = ts_crypto_keypair_export_openssh(keypair, openssh_pub, &openssh_len, key_comment); + if (ret != ESP_OK) { + ts_console_printf("FAILED\n"); + free(openssh_pub); + ts_crypto_keypair_free(keypair); + return 1; + } + + /* 写入公钥文件 (.pub) */ + char pub_path[256]; + snprintf(pub_path, sizeof(pub_path), "%s.pub", output_path); + + fp = fopen(pub_path, "w"); + if (!fp) { + ts_console_printf("FAILED\n"); + ts_console_printf(" Error: Cannot create file %s\n", pub_path); + free(openssh_pub); + ts_crypto_keypair_free(keypair); + return 1; + } + + fprintf(fp, "%s", openssh_pub); + fclose(fp); + ts_console_printf("OK\n"); + + /* 显示公钥指纹 */ + ts_console_printf("[4/4] Key generation complete!\n\n"); + + ts_console_printf("Files created:\n"); + ts_console_printf(" Private key: %s\n", output_path); + ts_console_printf(" Public key: %s\n", pub_path); + ts_console_printf("\nPublic key (for authorized_keys):\n"); + ts_console_printf("─────────────────────────────────────────\n"); + ts_console_printf("%s", openssh_pub); + ts_console_printf("─────────────────────────────────────────\n"); + + ts_console_printf("\nUsage:\n"); + ts_console_printf(" 1. Copy the public key above to remote server's ~/.ssh/authorized_keys\n"); + ts_console_printf(" 2. Use: ssh --host --user --key %s --exec \n", output_path); + + free(openssh_pub); + ts_crypto_keypair_free(keypair); + + return 0; +} + +/*===========================================================================*/ +/* Command Handler */ +/*===========================================================================*/ + +static int ssh_cmd_handler(int argc, char **argv) +{ + /* 解析参数 */ + int nerrors = arg_parse(argc, argv, (void **)&s_ssh_args); + + /* 显示帮助 */ + if (s_ssh_args.help->count > 0) { + ts_console_printf("\n%s\n\n", TS_STR(TS_STR_SSH_HELP_USAGE)); + ts_console_printf("%s\n\n", TS_STR(TS_STR_SSH_HELP_DESC)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_CONN_OPTS)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_HOST)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_PORT)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_USER)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_PASSWORD)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_KEY)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_KEYID)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EXEC)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_SHELL)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_FORWARD)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_TEST)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_TIMEOUT)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_VERBOSE)); + ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_KEY_MGMT)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_KEYGEN)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_COPYID)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_REVOKE)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_TYPE)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_OUTPUT)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_COMMENT)); + ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_GENERAL)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_HELP_OPT)); + ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_EXAMPLES)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEYGEN)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEYGEN_CMD)); + ts_console_printf(" \n"); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_STORED)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEY_LIST)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_KEY_GEN)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_SSH)); + ts_console_printf(" \n"); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_COPYID)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_COPYID_CMD)); + ts_console_printf(" \n"); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_REVOKE)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_REVOKE_CMD)); + ts_console_printf(" \n"); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_FILE)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_EX_FILE_CMD)); + ts_console_printf("\n%s\n", TS_STR(TS_STR_SSH_HELP_NOTE)); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_NOTE_HOSTS)); + return 0; + } + + /* 参数错误检查 */ + if (nerrors > 0) { + arg_print_errors(stderr, s_ssh_args.end, "ssh"); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_USE)); + return 1; + } + + /* 检查是否是密钥生成模式 */ + if (s_ssh_args.keygen->count > 0) { + /* --keygen 模式:必须指定 --type 和 --output */ + if (s_ssh_args.type->count == 0) { + ts_console_printf("Error: --type is required for key generation\n"); + ts_console_printf("Supported types: rsa, rsa2048, rsa4096, ecdsa, ec256, ec384\n"); + return 1; + } + if (s_ssh_args.output->count == 0) { + ts_console_printf("Error: --output is required for key generation\n"); + ts_console_printf("Example: --output /sdcard/id_rsa\n"); + return 1; + } + + const char *comment = (s_ssh_args.comment->count > 0) ? s_ssh_args.comment->sval[0] : NULL; + return do_ssh_keygen(s_ssh_args.type->sval[0], s_ssh_args.output->sval[0], comment); + } + + /* 检查是否是公钥部署模式 */ + if (s_ssh_args.copyid->count > 0) { + /* --copyid 模式:必须指定 --host, --user, --password, 以及 --key 或 --keyid */ + if (s_ssh_args.host->count == 0) { + ts_console_printf("Error: --host is required for --copyid\n"); + return 1; + } + if (s_ssh_args.user->count == 0) { + ts_console_printf("Error: --user is required for --copyid\n"); + return 1; + } + if (s_ssh_args.password->count == 0) { + ts_console_printf("Error: --password is required for --copyid (initial auth)\n"); + return 1; + } + if (s_ssh_args.key->count == 0 && s_ssh_args.keyid->count == 0) { + ts_console_printf("Error: --key or --keyid is required for --copyid\n"); + ts_console_printf(" --key Use key file (public key at .pub)\n"); + ts_console_printf(" --keyid Use key from secure storage\n"); + return 1; + } + + int port = (s_ssh_args.port->count > 0) ? s_ssh_args.port->ival[0] : 22; + int timeout = (s_ssh_args.timeout->count > 0) ? s_ssh_args.timeout->ival[0] : 10; + const char *key_path = (s_ssh_args.key->count > 0) ? s_ssh_args.key->sval[0] : NULL; + const char *keyid = (s_ssh_args.keyid->count > 0) ? s_ssh_args.keyid->sval[0] : NULL; + + return do_ssh_copy_id(s_ssh_args.host->sval[0], port, + s_ssh_args.user->sval[0], s_ssh_args.password->sval[0], + key_path, keyid, timeout); + } + + /* 检查是否是公钥撤销模式 */ + if (s_ssh_args.revoke->count > 0) { + /* --revoke 模式:必须指定 --host, --user, --password, 以及 --key 或 --keyid */ + if (s_ssh_args.host->count == 0) { + ts_console_printf("Error: --host is required for --revoke\n"); + return 1; + } + if (s_ssh_args.user->count == 0) { + ts_console_printf("Error: --user is required for --revoke\n"); + return 1; + } + if (s_ssh_args.password->count == 0) { + ts_console_printf("Error: --password is required for --revoke (auth to remove key)\n"); + return 1; + } + if (s_ssh_args.key->count == 0 && s_ssh_args.keyid->count == 0) { + ts_console_printf("Error: --key or --keyid is required for --revoke\n"); + ts_console_printf(" --key Revoke key file (public key at .pub)\n"); + ts_console_printf(" --keyid Revoke key from secure storage\n"); + return 1; + } + + int port = (s_ssh_args.port->count > 0) ? s_ssh_args.port->ival[0] : 22; + int timeout = (s_ssh_args.timeout->count > 0) ? s_ssh_args.timeout->ival[0] : 10; + const char *key_path = (s_ssh_args.key->count > 0) ? s_ssh_args.key->sval[0] : NULL; + const char *keyid = (s_ssh_args.keyid->count > 0) ? s_ssh_args.keyid->sval[0] : NULL; + + return do_ssh_revoke(s_ssh_args.host->sval[0], port, + s_ssh_args.user->sval[0], s_ssh_args.password->sval[0], + key_path, keyid, timeout); + } + + /* 连接模式:必需参数检查 */ + if (s_ssh_args.host->count == 0) { + ts_console_printf("Error: --host is required\n"); + return 1;; + } + + if (s_ssh_args.user->count == 0) { + ts_console_printf("Error: --user is required\n"); + return 1; + } + + /* 认证方式检查:必须提供 password、key 或 keyid 之一 */ + if (s_ssh_args.password->count == 0 && s_ssh_args.key->count == 0 && s_ssh_args.keyid->count == 0) { + ts_console_printf("Error: --password, --key, or --keyid is required\n"); + return 1; + } + + /* 获取参数值 */ + const char *host = s_ssh_args.host->sval[0]; + int port = (s_ssh_args.port->count > 0) ? s_ssh_args.port->ival[0] : 22; + const char *user = s_ssh_args.user->sval[0]; + const char *password = (s_ssh_args.password->count > 0) ? s_ssh_args.password->sval[0] : NULL; + const char *key_path = (s_ssh_args.key->count > 0) ? s_ssh_args.key->sval[0] : NULL; + const char *keyid = (s_ssh_args.keyid->count > 0) ? s_ssh_args.keyid->sval[0] : NULL; + int timeout = (s_ssh_args.timeout->count > 0) ? s_ssh_args.timeout->ival[0] : 10; + bool verbose = (s_ssh_args.verbose->count > 0); + + /* 构建认证信息 */ + ssh_auth_info_t auth = {0}; + char *loaded_key_data = NULL; + size_t loaded_key_len = 0; + + if (keyid && !key_path) { + /* 从安全存储加载密钥到内存(不写入临时文件) */ + if (verbose) { + ts_console_printf("Loading key '%s' from secure storage...\n", keyid); + } + + esp_err_t ret = ts_keystore_load_private_key(keyid, &loaded_key_data, &loaded_key_len); + if (ret != ESP_OK) { + ts_console_printf("Error: Failed to load key '%s' from secure storage (%s)\n", + keyid, esp_err_to_name(ret)); + return 1; + } + + /* 使用内存中的密钥(不暴露到文件系统) */ + auth.key_data = (const uint8_t *)loaded_key_data; + auth.key_len = loaded_key_len; + auth.passphrase = NULL; /* TODO: 支持加密密钥 */ + + if (verbose) { + ts_console_printf("Key loaded: %zu bytes\n", loaded_key_len); + /* 显示密钥类型 */ + if (strstr(loaded_key_data, "BEGIN RSA PRIVATE KEY")) { + ts_console_printf("Key type: RSA (PKCS#1)\n"); + } else if (strstr(loaded_key_data, "BEGIN EC PRIVATE KEY")) { + ts_console_printf("Key type: ECDSA\n"); + ts_console_printf(" Warning: ECDSA key authentication from memory may not work\n"); + ts_console_printf(" with libssh2 mbedTLS backend. Use RSA keys if possible.\n"); + } + } + } else if (key_path) { + /* 使用文件路径 */ + auth.key_path = key_path; + auth.passphrase = NULL; + } else { + /* 密码认证 */ + auth.password = password; + } + + int result = 0; + + /* 执行操作(按优先级) */ + if (s_ssh_args.shell->count > 0) { + /* 交互式 Shell */ + result = do_ssh_shell(host, port, user, &auth, timeout, verbose); + } else if (s_ssh_args.forward->count > 0) { + /* 端口转发 */ + result = do_ssh_forward(host, port, user, &auth, + s_ssh_args.forward->sval[0], timeout, verbose); + } else if (s_ssh_args.exec->count > 0) { + /* 执行命令 */ + const char *command = s_ssh_args.exec->sval[0]; + result = do_ssh_exec(host, port, user, &auth, command, timeout, verbose); + } else if (s_ssh_args.test->count > 0) { + /* 测试连接 */ + result = do_ssh_test(host, port, user, &auth, timeout); + } else { + ts_console_printf("Error: Specify --exec, --shell, --forward, --test, or --keygen\n"); + ts_console_printf("%s\n", TS_STR(TS_STR_SSH_HELP_USE)); + result = 1; + } + + /* 清理内存中的密钥数据 */ + if (loaded_key_data) { + /* 安全清零内存 */ + memset(loaded_key_data, 0, loaded_key_len); + free(loaded_key_data); + } + + return result; +} + +/*===========================================================================*/ +/* Command Registration */ +/*===========================================================================*/ + +esp_err_t ts_cmd_ssh_register(void) +{ + /* 连接相关参数 */ + s_ssh_args.host = arg_str0(NULL, "host", "", "Remote host address"); + s_ssh_args.port = arg_int0(NULL, "port", "", "SSH port (default: 22)"); + s_ssh_args.user = arg_str0(NULL, "user", "", "Username"); + s_ssh_args.password = arg_str0(NULL, "password", "", "Password"); + s_ssh_args.key = arg_str0(NULL, "key", "", "Private key file (PEM)"); + s_ssh_args.keyid = arg_str0(NULL, "keyid", "", "Key ID from secure storage"); + s_ssh_args.exec = arg_str0(NULL, "exec", "", "Command to execute"); + s_ssh_args.test = arg_lit0(NULL, "test", "Test SSH connection"); + s_ssh_args.shell = arg_lit0(NULL, "shell", "Open interactive shell"); + s_ssh_args.forward = arg_str0(NULL, "forward", "", "Port forward: L::"); + s_ssh_args.timeout = arg_int0(NULL, "timeout", "", "Timeout in seconds"); + s_ssh_args.verbose = arg_lit0("v", "verbose", "Verbose output"); + + /* 密钥生成参数 */ + s_ssh_args.keygen = arg_lit0(NULL, "keygen", "Generate SSH key pair"); + s_ssh_args.copyid = arg_lit0(NULL, "copyid", "Deploy public key to remote server"); + s_ssh_args.revoke = arg_lit0(NULL, "revoke", "Remove public key from remote server"); + s_ssh_args.type = arg_str0(NULL, "type", "", "Key type: rsa, rsa2048, rsa4096, ecdsa, ec256, ec384"); + s_ssh_args.output = arg_str0(NULL, "output", "", "Output file path for private key"); + s_ssh_args.comment = arg_str0(NULL, "comment", "", "Comment for the public key"); + + /* 通用参数 */ + s_ssh_args.help = arg_lit0("h", "help", "Show help"); + s_ssh_args.end = arg_end(10); + + /* 注册命令 */ + const esp_console_cmd_t cmd = { + .command = "ssh", + .help = "SSH client. Use 'ssh --help' for details. Key management: use 'key' command.", + .hint = NULL, + .func = ssh_cmd_handler, + .argtable = &s_ssh_args, + }; + + esp_err_t ret = esp_console_cmd_register(&cmd); + if (ret != ESP_OK) { + TS_LOGE(TAG, "Failed to register ssh command: %s", esp_err_to_name(ret)); + } else { + TS_LOGI(TAG, "Registered command: ssh"); + } + + return ret; +} diff --git a/docs/repair/ws-project-v3/baseline-console.json b/docs/repair/ws-project-v3/baseline-console.json new file mode 100644 index 0000000..b92c640 --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-console.json @@ -0,0 +1,5 @@ +{ + "source": "git show 568b871:components/ts_console/commands/ts_cmd_ssh.c", + "basis": "initial workspace was clean for tracked files", + "sha256": "4b4edc6e2be0dfedda745d998232bafe99e12496d2ddb8af9f4bb04a5a1bb526" +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/baseline-eof-release.txt b/docs/repair/ws-project-v3/baseline-eof-release.txt new file mode 100644 index 0000000..bdfd9ca --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-eof-release.txt @@ -0,0 +1,3 @@ +EOF ledger: allocations=1 channels=0 sessions=0 sockets=0 +Assertion failed: (!live_allocations && !driver_channels && !driver_sessions && !driver_sockets), function empty, file test_shell_driver.c, line 22. +tests/ws_subscriptions/run_shell_driver.sh: line 19: 80371 Abort trap: 6 "$build/adapter" "$@" diff --git a/docs/repair/ws-project-v3/baseline-fixture.tar.gz b/docs/repair/ws-project-v3/baseline-fixture.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..619a6c4e642d16d03a644b6fa0ef8639dcef8e3f GIT binary patch literal 10102 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 Yp4GE@R?q5LJ$F9;A1gL8d;rJ*0HnLI(EtDd literal 0 HcmV?d00001 diff --git a/docs/repair/ws-project-v3/baseline-h1.json b/docs/repair/ws-project-v3/baseline-h1.json new file mode 100644 index 0000000..32d3112 --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-h1.json @@ -0,0 +1,88 @@ +{ + "recovered": false, + "next": { + "type": "terminal_input", + "data": "x" + }, + "state": { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1 + }, + { + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1 + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1 + }, + { + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH control could not be completed for this session" + }, + "fd": 1 + }, + { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1 + }, + { + "finished": true + } + ] +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/baseline-h1.txt b/docs/repair/ws-project-v3/baseline-h1.txt new file mode 100644 index 0000000..0e9856d --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-h1.txt @@ -0,0 +1 @@ +CONFIRMED H1: actual C request error leaves op OPEN but JS exits SSH and next input is not routed to SSH diff --git a/docs/repair/ws-project-v3/baseline-no-data.txt b/docs/repair/ws-project-v3/baseline-no-data.txt new file mode 100644 index 0000000..621be9a --- /dev/null +++ b/docs/repair/ws-project-v3/baseline-no-data.txt @@ -0,0 +1,2 @@ +Assertion failed: (ts_ssh_shell_read(shell,buf,sizeof(buf),&n)==ESP_ERR_TIMEOUT && ts_ssh_shell_is_active(shell)), function main, file test_shell_driver.c, line 30. +tests/ws_subscriptions/run_shell_driver.sh: line 19: 80350 Abort trap: 6 "$build/adapter" "$@" diff --git a/docs/repair/ws-project-v3/baseline.json b/docs/repair/ws-project-v3/baseline.json new file mode 100644 index 0000000..a26cd34 --- /dev/null +++ b/docs/repair/ws-project-v3/baseline.json @@ -0,0 +1,121 @@ +{ + "head": "568b871f64902f88b3c68148ce072eda218fe9db", + "pr_base": "d6ed947a592265fa12754828bc79803fc50c1db2", + "status": "?? docs/repair/ws-project-v3/\n?? docs/runtime-repair/evidence/reviewer-fixes/diff-check.txt\n?? output/\n?? tmp/\n", + "sha256": { + "components/ts_webui/CMakeLists.txt": "53e02258893758d55edf0debef2e0694b154ecccda65ab3b5bb5d34770c39d45", + "components/ts_webui/Kconfig": "6a1fc77d34f7c635b44a922f4c7c9fb96832a9f6bb433967c26e3bdc451ae286", + "components/ts_webui/web/favicon.ico": "1ea04b690d7fe816da5efb405c13f9cd953366026eb3553e214de8d5df0d3648", + "components/ts_webui/web/index.html": "0b3ce77c7da2da7d18bd086dfe55fc33e994adbfe06f2f47eb6d69c01fe6124a", + "components/ts_webui/include/ts_ws_subscriptions.h": "edcfedcdb48cc47bdd776218d43f362f4f2feb84f0a8bd347b465e3dd751e3ae", + "components/ts_webui/include/ts_ws_transport.h": "4c7b996ed4e6a578ce7daa1a02a13729795bd4dca2e66eb8b49895b6f59f36ee", + "components/ts_webui/include/ts_ws_operation.h": "4a31681f9e5d0041d2627b5850b23c083e1b0ca3b876acf959adab5955611512", + "components/ts_webui/include/ts_webui.h": "374e230b4f0d016adb2373acd2e6431cf537eaeb8f7f84efcf53523d6dad0402", + "components/ts_webui/src/ts_webui_ws.c": "8f26c8ddf9bf391a70ec0909809e2a084352f4cff23c97875baecd838e4eb4ba", + "components/ts_webui/src/ts_ws_transport.c": "e2eaeb31d00d7996a84badc669ca5587628c63b044c9a8014e587e84b5ab37f8", + "components/ts_webui/src/ts_ws_operation.c": "504ce5caa9375a792692eec681a86bf4515aa5c2d28e758d67df08117b6fe865", + "components/ts_webui/src/ts_webui.c": "6ec898b4c78fbd19e469dd45d4f890ce5bf32708a38217c516ba595c00683686", + "components/ts_webui/src/ts_webui_api.c": "c8225f3fc36be3446947e205932a3d43340665d687b81c23c16556f3be8dc9b8", + "components/ts_webui/src/ts_ws_subscriptions.c": "9f8d2f33a374d6992a1ef119cd20a791244e44abc8d7cd66dc906b4896f764fb", + "components/ts_webui/web/css/style.css": "30dab8799ed2a8b0a5da49ec84202b30f3c951779ea4533e847a53b2ac9b8dff", + "components/ts_webui/web/images/tslogo-32.png": "64e4bce72f2b13c81bef5b46ae919abeeb47f98571cf5e55460385880731810b", + "components/ts_webui/web/images/tslogo-512.png": "b7508585c46e16fcc7d42c52459ab55df32716aea85a10a560cd64de7cceb8e8", + "components/ts_webui/web/images/tslogo-128.png": "f09ac97789726872277a0399338cd9bfd0493752de930aeb6b2c6f7b0a864c3b", + "components/ts_webui/web/images/README.md": "f4429665c315cdabc2a935caf0f1423632dd7cbff84f34914965969217102237", + "components/ts_webui/web/images/tslogo-48.png": "41f959e327dca63386a2f254b8a245a6fa151904a06eae93ae6c449277467f70", + "components/ts_webui/web/images/tslogo-256.png": "55dc7df59429c23fdc531baba002b7b23f5a4f2be0f29b2ecc5098f3df059da7", + "components/ts_webui/web/images/tslogo-64.png": "a0809405c5632eb4bf1f1b4783175c2b92b25fc522f5b0682a35d3cfa1c58752", + "components/ts_webui/web/images/favicon.icns": "bdc873fa7bff5e1888d80273f99f22d97d3719d4b17419e68e64eafd85c2b039", + "components/ts_webui/web/images/tslogo-original.png": "9fb0ee8532c2d572d8b235f7586d225f00609cf8defb98b59cf55ae749e83ed1", + "components/ts_webui/web/js/terminal.js": "048ca0d64b9ee52b0c2b4f3f3f7e270a2bbd35fc729dbd513cc7b11dfb26bbcf", + "components/ts_webui/web/js/router.js": "1e73ca3bf272a54aea8c516809e09e10f257b620bf66311bbbe358693fe377d5", + "components/ts_webui/web/js/dragSort.js": "7c5b9159cb8bb88b35222424db6d8bd822d3960899d5c090c17955700d6590af", + "components/ts_webui/web/js/api.js": "6fb266abb3780a0d402d86ad95a3644b8e1f488136ad44dc18ddd83caaa8dab4", + "components/ts_webui/web/js/i18n.js": "2eed1c54b4ef89bc2e4221a3fd900e88bd8d7a11064a04d97dcc3decfdeedbd8", + "components/ts_webui/web/js/app.js": "ad63a38112eab45af87da091f3536156614db526bb85f2c83bafa7867439230b", + "components/ts_webui/web/fonts/remixicon.woff2": "e92dc38bfb1d15dbb9d9ca9e645754f68e7c5b224e33c45a17048bd0cf2407a6", + "components/ts_webui/web/fonts/remixicon.css": "b2218eec4e02513f0feef46f74f13c852152f54eafd83d1274057e3895f0ea1c", + "components/ts_webui/web/js/lang/en-US.js": "24bfe60afe5589d5f257baa6b1ef66f23e23453f70be9c8bd7778944f73ac3fc", + "components/ts_webui/web/js/lang/zh-CN.js": "0ec109e51f3bc21531f8fca829eaed271898a4cfd7172696881013d5b20e6817", + "components/ts_security/CMakeLists.txt": "cdc8e21b6985899e65385ce4b2c92958cc540f19f3445255301b20ad71241c88", + "components/ts_security/Kconfig": "c3d0036c138f0bf227f73558802a24892694e5f8328ecda2ab8007e0aa219a06", + "components/ts_security/include/ts_ssh_service.h": "73fbddabe3eaed6a191b90b1644eb50eb440509723c92f4a61788c2306596102", + "components/ts_security/include/ts_known_hosts.h": "4b1244556d046e0057ba0d372498f92d263e43183975d5e55d0bbaea669b0934", + "components/ts_security/include/ts_ssh_log_watch.h": "08677f37f9ee0a3620f6ed38770c4f1977d3b70787e96e57db0f934de5c5452f", + "components/ts_security/include/ts_crypto.h": "371ac3b950f7185eaa21a710c4e823ed806ab337d573cfffdcfe58656aeee8c0", + "components/ts_security/include/ts_ssh_shell.h": "19a5f9706d3db36baa967f5ecefb77735e3771ac176e2e680a89be342f39c8e1", + "components/ts_security/include/ts_scp.h": "5801a44ef598560d9eef3265ec5b891b494e2682b3049834d3694abe0f86f175", + "components/ts_security/include/ts_ssh_commands_config.h": "d1fa1bbc2762bc4accf697db09959396cb5d82bb67ba1806a0cd4f9b45305352", + "components/ts_security/include/ts_ssh_probe.h": "697c24c0ff5244397d3483997357a81311cbd24b718d64b845efd96e19979e43", + "components/ts_security/include/ts_keystore.h": "55831771c42ae32640dc6ce1d7755f3487149f71f42d1f1ca7451af2ff675f40", + "components/ts_security/include/ts_sftp.h": "6d0c9ab1ac7dd3eab5d820798f543be18e2de1d43028dc72ca088b3ec13ab1fe", + "components/ts_security/include/ts_security.h": "01cf0f2c1ee2599c0d733ac5d7466e73358fe5483aad23d654c2e6b99c039f35", + "components/ts_security/include/ts_ssh_client.h": "ceb00ed29965279a154e061638b58769e148ea370f5435de48c90c1c8d90f928", + "components/ts_security/include/ts_ssh_hosts_config.h": "48d27c0cdeb6b0f462d41eaef281b6f2afe6e460b810a61f2f98278d0609280d", + "components/ts_security/include/ts_port_forward.h": "a249f758369a81a7db44f71e4aed0511cd4f5aa932cc4bde33b29c393b5d39be", + "components/ts_security/src/ts_ssh_client.c": "071b875b4029cc9d0d9e5538ce7a05921a07ec57d09faa45d295fccb7625552d", + "components/ts_security/src/ts_security.c": "1c4bd91f4ab676be0739b60b826e026a84baade609369995c845b1991a1e2c49", + "components/ts_security/src/ts_port_forward.c": "b2dafd8ffc849f684cf0a9f332864876951d2d9ee7fd8a69ce7704430d00853f", + "components/ts_security/src/ts_ssh_hosts_config.c": "36d70ff90bef5b0efdf1195c614a33a70b7ed521807c28a2a3b4d918265b2056", + "components/ts_security/src/ts_known_hosts.c": "72e2c0c5723cf9fed7c589e46152b5806c4bdcfba565b862305d2fb299ec3844", + "components/ts_security/src/ts_ssh_log_watch.c": "3843930a4337ea56092d37e1ade0651dd1f6a14c3f5596d33bc83a7880712f6b", + "components/ts_security/src/ts_auth.c": "b4456d19bb701f5be50c08bb8024c8b24eb97820fd47c72c9fda6e1ff334b78d", + "components/ts_security/src/ts_ssh_service.c": "fc345627f4f2c9417dd0e74fb47b3d77e2cc9f41fd9537bd2f633b0260e5e01c", + "components/ts_security/src/ts_scp.c": "cf328d792705cf8d6b00ecc3b8369ae8360fba977a3147e0a2eef6634a08cff8", + "components/ts_security/src/ts_ssh_shell.c": "9e696a8daee19df9b1caf76e3170ed89ae45a1139b6ca60544221f3ba27d22b1", + "components/ts_security/src/ts_crypto.c": "5ef1140c4f122a49a531de1bff5c48c80067bdcadf2139553c35a59fd5404587", + "components/ts_security/src/ts_ssh_probe.c": "810b235d84659426a3181ec594a345e2fd0ac7fc7c1ce765c34265ad1bc05843", + "components/ts_security/src/ts_ssh_commands_config.c": "f12fdb5169de9e52db02590bf9d821bc08291b6c24e62f4f81bc54b03574e6da", + "components/ts_security/src/ts_sftp.c": "e05a3cd229dcf4344cfcc785755e075b52f94a4276411abbbfb6e7716793a899", + "components/ts_security/src/ts_keystore.c": "0046e9a9f13a4dd73f932a2861b787c6264ad1597694b3cdc8a9b9eca251ea1d", + "tests/ws_subscriptions/test_init.c": "49b7ade237c4fe5df5fe683f4ec731c222cc4939b91b19d976471e99d29173c7", + "tests/ws_subscriptions/test_operation.c": "c28fd00d191f92bbe8722033a3dbf5d7c6bcc54e054c06acff4429fce149a4e6", + "tests/ws_subscriptions/run_reviewer.sh": "2a957bb5d4e0ca0c357ec32fffb23aa60c75019b60cc4c5c33d468d389013ea8", + "tests/ws_subscriptions/test_control.c": "7e70ad841a86f6c39a1274f715502991e37c7aa1b7802f7b3dcf805a6aa7d917", + "tests/ws_subscriptions/run_host.sh": "2a1aee658ec0c45fb94163d9671f72579cf8f15fb36532aeef4a5f1d4bfd90f9", + "tests/ws_subscriptions/test_manager.c": "a1b46f3ad3a877a5cfd1235e7253418aec965c442a5c21ab811a68f1e70be8cd", + "tests/ws_subscriptions/test_f1_f2.c": "7d4907e42f3a9c7110055acb6ca667abd62a5f16712306c7dde6b85ec285c9b4", + "tests/ws_subscriptions/replay_control_baseline.py": "aefd5ff8bc6ced036c9fec466bef70bddb8b66949b4eed3994cdd109fe2f255f", + "tests/ws_subscriptions/test_reviewer.c": "65916f6af7fb3fe00d00bf6999a55f441422b35d4d95b3f801d9cb9b0f591c54", + "tests/ws_subscriptions/test_reviewer_service.c": "3fa82db0882b90d69450ddcd7a50e5904ae60e2cab8e62ea11656ac4c21e2890", + "tests/ws_subscriptions/README.md": "e2a186d0cc38c5a2df86207cde9f371365b95e678908b15943a7556fe57e5ada", + "tests/ws_subscriptions/test_operation_adapter.c": "4178c7dd1b9ad582cdc0fd5950dced82d448494494702dfd30246d7ba60f3338", + "tests/ws_subscriptions/run_operation_adapter.sh": "1a5b900b4c6aae1619b86a285b6371a683263304db90a81d82477d8fb750d3f5", + "tests/ws_subscriptions/run_baseline.sh": "2b5a8288cc2d94276588589eea6b45b8fb028fbb93c5911efff668b8d7d953c0", + "tests/ws_subscriptions/test_event.c": "88273dfb16120f29254912729dbceb9cefe025902b5d8e1fb4602f5b09500636", + "tests/ws_subscriptions/test_lifecycle.c": "187359b892e11b98d3491f3ee60aac5cda9e157c65fbd262fe0fe466d5f943d3", + "tests/ws_subscriptions/run_reviewer_baseline.sh": "6ea73543f64c6de65f59480300cf2d73ece85b798a7a430df5b55f2adae1bb96", + "tests/ws_subscriptions/replay_operation_baseline.py": "ba26a739d9dfb4b30b4e10ac0b3955994738820b85a156406dcaaa9518382cc3", + "tests/ws_subscriptions/test_baseline.c": "1197573bdf34c4bb7d2aa86f9742ae568199db3a6927211081251345c5070442", + "tests/ws_subscriptions/test_reviewer_core.c": "7669567ad82171ae32102779e4fc98c4b88871f9e9f761600a21623378882ef2", + "tests/ws_subscriptions/run_control.sh": "e2853acc8652b99dfccca85d25425b870996e7bfcb03a5cfe021b76e66d0139e", + "tests/ws_subscriptions/run_operation.sh": "bf9d6db03b483d4b74db26e464efc73b673648ef82565edf987e6f275c9ee6c5", + "tests/ws_subscriptions/run_f1_f2.sh": "8e804b7a5c66663a62da53f9027b175722034e5cce77ba152aba8ad13b527935", + "tests/ws_subscriptions/test_reviewer_http.c": "2b9696ac9dd86be96db383392d3bcf61f81a5ab2e881933d767aad8f91d30c00", + "tests/ws_subscriptions/baseline_operation_adapter.c": "0b0703b144fa8fc7d412110e55b4d7d2010196e9422deb78ff00185059a5af05", + "tests/ws_subscriptions/stubs/ts_event.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_log.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_heap_caps.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/ts_log.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/ts_api.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_err.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_console.h": "f97fca9ebf2a497277d9ac5af3581a2e83789b4acf3e8b125e0f36fb27210151", + "tests/ws_subscriptions/stubs/esp_http_server.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_timer.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/platform.h": "de005401b26f9dce9028db4bbc656ea72e55730535769be4ddf31ccec072c2dc", + "tests/ws_subscriptions/stubs/ts_webui.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/timers.h": "fd6abec4a547b6e9caed8f0514a08ead4223303736dade89179bb8812a2a5d94", + "tests/ws_subscriptions/stubs/freertos/task.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/semphr.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/FreeRTOS.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/queue.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/prompts/ownership.browser.test.cjs": "1938411e7cc76ecc190b3469c58e58fd8aaa4a080ede60989190b4abd1147903", + "tests/prompts/browser.test.cjs": "59e7f77387e015d7d8b3ed926750f1fbf6328059d52b82bb79cbf973b590a1aa", + "tests/prompts/README.md": "ae4c5e8cca1dae0c7ec4e54d51b58977a6e15a743fdedc32215111ddc4bd5b13", + "tests/prompts/harness.cjs": "7c176507bb17c57abf22d73c5399b34cd8e221fb9663c4e5efe7ac3d168f944a", + "tests/prompts/package-lock.json": "8bef9925fb843348d3bf83eea1953314108e97f1db9c5972f4e8bf6741269a7a", + "tests/prompts/package.json": "180e0ffb285f1258b7a87ba2688e88c7c454ad7a4de3a9c56daa4c5346a7eae1", + "tests/prompts/static.test.cjs": "e8a08a747786a84efc6b976545e6d929ec3cf40278c0166b9bdb6b7a8fa810fe", + "tests/prompts/regression.test.cjs": "c372b74e125b361103defe66017c3eeb286fea9975cf4f3167ed5cf981050516" + } +} diff --git a/docs/repair/ws-project-v3/baseline.tar.gz b/docs/repair/ws-project-v3/baseline.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..48aec358fd3ab2fbb2707b8c015e3f955964dc43 GIT binary patch literal 1023926 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 z%0D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
    rt0kM`)0J2%G*n^$KUiXEi!Z-cIS?%WQL#d+x` z0uyVdtF$|30YPj*0XgHK-Kv)t3+Odnp@5{m#F(B0+SW_SX$uYO5_~-!on5rJvk)N9 zfguB6eJJaXwgdmvO0mIXg;aYRcD`JDZxa6W)yB+Vp7y!PpREZ!^V6|j>?6nfM+JBO zqhoV7s8)%iM0}fv&DjPhsxl>A!GKnJR> zjh{tysQ3;$Tp=RJmjM?d6AY>b6xKFCuqnRn1B{q4O)~h|Yr-9*6Lb^7)rFQrgy!Q2 z&bG5u9-Z>fbH+5DGo&wLL9@$w*<5SFyKU`8&nJ9Rz6^v0(Q?yrX%8257Js6RSzwMH zi%G*^x7XzC{x$s#h7*|3bAfa*@xhBgzo~(d`S$%TN zR<{1}olQ7=8E^gwK%$})!s7Hx=(%NRC?}-}DSOJ4uVMmAl2#NCS}CYRyb~9z{{qQt zaDP7j;6=dyz!!AIW&h&+%xLx7roW?T3wqR$(4au4Y@M5dA<$V7d{E~?b8nHE8_!oV zOYE|P1BZ`*K`4NW0mByo^)`gbtq}c3D&5g$R_y9(rk=!>8|4i87=v^E)=2{XVJV9w zXl;h&()MwIiW{wjf&uYud%UlxsE|gkc^StJr}5m5oyqm9KkHv%DA)iW^8ei3ANw5N zEsL+Fv=9HtQ;a6R21AR0tsJ(l)1?$E6dsr;vdw26%1u3@io&ZX3}Q=oZn^)6kEw9V z;J5Q~L}*d#o`UEeBfjW=tDcLpF}MFFB>GZoqR7Ub_`lBrcy~=-ruiDz?X4DPm7K?m zu{|MC&_mHRV)Y##;!hZq4cB4)df6+>VPnG7VcPvo9FwQ!OkK^Q`mmP*o?7`6%UQJpZ@N;Q z|8Z3eq6k?%BV80U;$Id`#puKM6TJY-{k84^QE}0FUAB$>-9dAh;LW}dgAS1#i^urt zr~MSCjfas6gu41z<2I8Ycfh5Wt1hw)w@$pSOecTvF+8^TE7;iV)wQMabn_9byA{a7 z>)<@TfI8}>p`ST5W^C+6SMtR-TQ4!3i~Hcy2TmA&?kdN}nTFb>Yui!w2ci78`qfiA zgO~bEdVc)&D24Rr=DFy4_@{8Y4eu~&e-#&dEFfRTV_+=O5p5~mU#<7;PSscA5yJk* zL6vz<74_4&R+|r_Xw3}wGIH+?W!u>NK+iz^HNbDC?!ou=>Ft!488XaNoF7id%(T7p zbY>dzGynJKTKgh1iFREb3Pda8pb8`GorzkTm`&--hD~y@Gyj2dGQ%@d?17Ti@Et?v+a<^JyJ{@5ak{z!PJw~iBHA-ABIcUbuhld6UINW6{R4aV_;F!vo zLBvM@zIOzStdw6zhunnaDdymC4l|>`RY4Cay@&!d{DdcJ$>d)e8r5PTxQs$H(x*MV_f35PY%kBB$LWlxuF^*Z)$a zamu4Yk~{y|N8p(6%+sSWg_FyZ|38gcD)+3_HP{5gY}b2jM~Xm8)y zc01zi5p0iGlfqZ+Q)o!{YYMo){kMYjH7 zW$2v-_xoT(w30F|<--fUWW(to*MEWck{Ind`59H{K53}W9}<&fjV~DaJSL-j zh+PM``t|TPd-zx9CB; zcSCvIJlodE;M@Oo`R_{x5`c3;`rITSb)}6&9bMRINudOT8ktdmvQhI8$|2pa>gSWh z<1hMQe?JnSAsG7gb0BRxsdn+2|MEy)bVt$1>SsPW|9H#ap&_gaWyFBW30g-6b4D;p z%S+K`*4Al^9Q_*WbfX*p478a}51AqEh!&@|L5Zc=X{22}trqy|guw(Kxd=-O`-G^=_Ga862w8VOLfEvU6KbhC-RZ$n;@P zcj;`?+h%P&sg3Sri6t=BM(o#sXS!stpjGDpHZU1)Z1xS1HI7W6E7&f;hH=0}Vqxw- zvV;dCDiUO?aDEl>q4Cg>S}IfcuMJ_irLY}ir)Ic@z_Aa#9O>^9*=3AAi*#Q`_SyXJ zSm;wD8MdfK)do$boD>5RNJWnY{WH<%wH!L?T%r;meS=Xy^}HlpOe5pwyk^%c
    Rc+9d5J{Ij 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
    PYBVZqO%G;%+2M@L~M&m%oTl)!d|TBJy66X}b43 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

    *3_|hlB@0ML`i&O)ag>NK8QTMonx*lx>QU6iLDm z5w|;RpI}_xoc+SPa+>XV-e-^5PC#sZL}sln<;mAL zc0mSRj~l^k2MB;?vzzfg`+RwF64D;19I$RxEUmGzI^tLsRoOBXV9T&k`>6#CzmuTS z5+uonju=(|T?Y4C@+&9zfac|ImL7e#aDUoC*9Y(W&zqAsDP16{YtGV_-!`YdX?}WJ zB;SZ(A~h8%U?WlCt4-t0-#J!{yu0_Qb8qtD(v#1YuFVj3gegomA?PcTY?ma}k*(|7 zFz$!vywks62Z;Q_gO7NY0dmi$aYAA=TG?k#@eWU4Xil9`RMeEScze2e=j7tU2MifK zvq2;!`0Rm(Ma|s2uT&XxD*Xh;!Iz*-&pjX~7TSdgqRnYc5Lt6>IWUfgn}b{FB^Elh1>?)v2Ge#-4t+(^ zhz~Qm!s zn}g20lbv1Z%-F{@!M;P?sj$3i3T{G>U4o&g-#dn4gj*7JZ(kebVt!v@%2`i}U_loYM;}LZ3{FpBe3kmqei3O>7l$(c2!Q^c8zz4zhT{U#TVjiL?sEt3T8I)b1Eq0 zt{JpWUb`Y>xrC`EylXn)n+d_~=VtHpjQ7#S@I&+S=ArreiG}$`p-IDS$7RR^6EG)8 zkrS{d=!%=o+~CW!(DSvQfl5VRW?7<9sJTbAC0GlS4*?0Upr>+A0%+zjGSwb&`s}Ee zMcT9w5!Kyco)FkzaUR(eTJx+XGcPdY1F1fxWk5l=-Ii8Bu@!`m&0iL5pWL&1-~KQu zoWN#5CWt;rAFR?m5f;FRhd;|9LZriTcowqFc)C}t8!E~T#5T}Gj-a8P z^ji=kAp$`1iapGd(OefkVlbez&dqv{zV{&d?8)NUTO5_4LWwcZVf(ScG#3Wae35Lk z89?DYaqcJY%oMF?O&N$&77TV%#gf_=q?ovT%lsI0`GvX3rN927nCL)Zy?xy~0mr9c zK?SDNhejKJ2Y|_JozG zs<~3WJZik`sErLUMIznZ?rhRHa_P>s#XE3WwDkBf+ve!Z?=;WeZO(iE)?udkvZ-XU z$GiRY(vvf+Z961BWSUL$o-d}I5N*i!=8-i^fz!fFnexc?i)Vo56`h3ka5%EXFo9pTzYcW`|NW$ zH462RMCtYa8;FOrd#~~A`b@@FFOC-)RX(m23ykn=xn#RC0Yj2R-5{;iPU+p5_Kx2& z)|ve*!3OIc|6u9PocF~8SYgVl^FEpJZl7QL?(2oQA1Dl8n*h!}9fi_haV+oF(lkpM z3w!duTsFc|J)1AoUPW%gq{3kxJHd>OJIzs?s>Iwkl5Vz>y6jD=YAac^QZ zQj&_VUSDZcR;L^6$1ZnCiHF2f7!k_FoRBamC&*CBM9Zl!AiP&^A!HCwO`7!q@(Z;i z^6cO4F#LuJ6YWlIYzY4y!nBRR7OLQ(r#mPt^Bw3sjVQG9PE>)zbFA>C$d@L6B3G=x zLbItrrfVNRHh*0LM~ns)i1Hr-TbULPx;xU)7bk4g=%cD6TE)sp_^~>x94C4qC0gnT z4xo{0r;%ioH-s9zqQBI4glR+KY`rYOb#q?M(7K?M;-s_X(Bb%U`aDmqWkpdzMA&T! z14}JW9RS~iX_(4qDsx_2{sv0|ps0``i`)PVR{`iJiFOTX9(G~K{x)sSp!PEP$=}W{-n?hgbW4SL;lEtpik}8EF9dpOd!2ZwcsTs&#&|HR-2Q6u+MVU|x0z0_)^)O*=FL9!Ec57ed=O5U8ZK4_X>E!^nWJL zGJWJr@8MBMbB7GJc=adN&e^g1Elu}KX&j3w0BBd{v9gRIIio5(Ms;n8!!UxF4xGAg z3piYn;}mzuB*!W46GaYMD30i3MG%4FG)T38ksbZmb~-7I7jTyW(Aq|mtGV3GvnLSh z?!$@>anFxus}yj~1FFM<+-rx1jc?idF zAOo_A>CuCS>EG(+wvF9w>sy8;LX6wkWZ=_hj}-C^j;_5E5r)s!fBAhE4huM8joz^C zUs=y+5uXY`po9|Bz=xh~$%cgXYk}k9zk#Zodq2cyg;)VYlvl?K2%=SHz>h54@IoXr zK>s7*qc39-Acio1Sbk zA1J>g(r!e&vf%LRO*2;nS2fWDqt&VAUt#7GJ+XdmBt%_9%c|~SoX^!p2Feh+ zp?DZKl9Qfe#0eeFG%(r0&)7fK84DjeTSBFp$I; zDm~khoMr+RsKUPr*+7o0j%Wa(Rg&R1JS&wkOiLOlOSpM*iegv49z7xKeRcE%2(8i+ zzZqp8v@U*=(h<9;xs|pp>s$S3Y`{PZp0wPzRphVb)bTj_)yt zbW=M#I#6c1;d5(CL5O_nv3Q_~a3*<oQ!Zf*e9$A_T~Z z@uX7-Bb8~3?5|#^1FM^qh|WQ$gyp#tOcTswU>@e1`~IBwaI$&+hWF$=K1mEnj8%dn z#uA_!QOcOQgXOB#GSbhO+46V^XK}2OVp37r-$GO`n$uP%9QqXthxH0i^H3G8ihW}v z%43~H8N*nr1$Ll0ZiN{*Dn2hHB%(14%m@wx03{;TP>5#?I9c%&0LQ=KT!UT-3HU`o zsH$Ht-JSPNf67>7EoU+TmAPjIBlGUkpt9clHI*chBZmSYI5E&IV_|Nx`Q5ctVz%dC zo)TXtpa!~gFj~-ZUMV#Y3Sa+o#~1(dAUOr{ZqcnX5vwJ6SP2n~V=xGCIxCo}6+PV2 z$`X*19^l`Fx!WBb9SPO|b&E4lk!6Q|`9Z9q(8GC{{t?_B{lwj28)RT(G|pmWFq1Ob zjs+}WHt_O9Xd;bdiW+o;`D%g0iMJ8p(*0$a4VmQMY` ze)8?5vDVhi301e{F_Wt_Z%))(H*d0U=#bZnVau9!uhEK4abj(?>$q9aucf&o1EzVR zTR}Bik7tq=3MT&zG{8(wy@9sdVO-$eNiFdz7Mnuc0&polXCtIPFmge=9uwDy>q5u{ zuELJ^9D8f<#X~q|frdyx{+L?AGu~xDI`h)9n2oN+)<*~LCQHRIpfV^Mad=xr2d1V_ zu7DWltz3z1z|}B~!ZNn(2wRI*mNg|UwkG>Q1j9D8T*=tnF7zzi1k5Ivov$w_E&GG_ zujE=r_pi2l*YI=#P{|-F(YP|pdf5Z|9ED%v@3FO3Hvu48N+uZInW3TE@VS=0I%T+{ zVUHO?GnoE-pjaM!KNS*r8vl8zTymBE0?4Q%kReIIi|{~V`$nLOo^ih(a9yNQc?6Uk zh=}CErzZ54UAb6qhb(>!Yf9q>zCn;?LH8B%^KOb%n{-28Q=PH8?N{{R7;*jB;+c<_ z$|U?9TkvSI_%x2WuN5PBuV0ty{h5HDBLK(uAZ6AWf3{06q+WA~c*>D39#Kt%@u$a{mn32JVDb=9E61khKWWjrggml5SHo|Zq z83B!B>|Y@P+9J17uO*~W75WX+NwG9G`VKlRhkEKU%F@FgiZFS-SkBecYAsKmFNchr z;B{8pmD`mj$Qkx|C;Jrr+~e(j|rZYX?ZR1oEgGw z9E}=w2cV}T4A*d~q)ZLYRT3#{oh(iI{xc@4#knGnoTnlA*Knf524deX#2h>ioZ1^s z?%*u1ZUQ=y@|X_OzAZhY0SZf4gtd-IOupi5?DW}!hKVX7?gJYJUg{otA!SbqB=;`~ z>V*hUU7Z6jztoi&)JqYdhBm$Ib`C^=3jK29hM`Svs#%sEVPuQ%>0`W z^uo`}O7JzIRm^x>9d1jblegFZcMeau_dFf-c8!R{qaI*o_~&NeRi$Eu?TbOIu8pT_ zY#mq1LWhCbXOKMGxwINA9_S2h1Vu-DH9OXJO&{%o5S}8x1G)W`H#cWl?(sW_BB!?i zjSh4lgxsnD?7I*4t_It8sURG`$+-Qs_ot6jy_SNG=H5X#b=h(1S{+W?>aa|p0TJ=X zTg_vq16Vaybm~%YZF$xDLuzR~lHZthHNvZes|cDt)wKv6yp^l)2qaux|I`{OHXONq zaVI6=;us&$LdOmQ;^K|$@?h|q#MWz&C1{2+e5P~@rjJa^tb|Wn;v({vdpbK7PlPcx zkPrxK`KxbwU?H8p>rFnSjHi%=NwuodbzlG`8q>f3ySOi6ztIGY_dr$ys!W^)Um7D2 zsrC$5hULY0Z3&9(G28U6TroyRvS3wWx)|j~@#*``J0FvM8A9qV-?C(-fUGLs?7790 z--)~ut(-Nj_oe?d^-2>6309ewVMCNH)>89e3QAjotpZcA*B~D?WqS%Fw^lBL?1@yB zRDd#TAEn*)bB76ky|^4ay=q>)$(xi#hhKpP?#WcN!&98ZrGSl0vS)C`$r_bAIr|J3i~|a##aQWWO-?!_u{x zrF%y)hf;9LZNpvJtlKltMCDu4GPY38wU8VM$ETWSe_sCVBcd4zO}HHs8A0sX9cnyn z!9G_jz?>i{sh^k>4efZ(4zdY_Z-<%*BrG!`CZZtE*N$L*3M02iNOoxsBg`bjU&}F! z!WhKRJ97DadeoNEB9m#&mO*q-wx?DH-TkjNYRF2WvLCHCObJV@mVA4mvIL7Y^8_M&qb}sQL$BsQ zUHPOru+7wWmQ;6`b8c%#Aj?kR+KrvS(wtrn(^TZQ@t+20Ig+cT4`D@jObl?S<4`ii zNw>qw)Gr9>AgI0_7Uegb$HJc)yl739vXXf)608v8lGwz0A@;<4W^z(>HISb|^X_Ts zr+|qLd<|`3ZdT3drE`N!mNp~1`2K4ttICn=Q-LR4HNDE`b>`^gkp)JWAVdw^9 zC&=)odC@40NKTfEAO8%M;Xj%2?p$h~|Jl2EODQ#16h6ZHp=^*4$G)O=0CTjp|aU|#`4%qR|acY z=KbJSN$GJLcdQXOqLXdEb{Q|CS~mOOwn7!GLxu8KjYHa37$~yIR6heR@8rD-&)@!x z;ZY|0G)p*GC}Q!Ppl>_Syz(a7B~h&ix*KN#9xU;Ys_tm{kQ)Qc^prr44~C~jCmc*dZjLD~k#rd`FF{nU(8{nnrw8`DPy*C1Irj$!`}R}x+?RM}yHM~M8w&f}B< zj|NWqWD3eqjEftX-Z<~CU~Fd~@47KdZ1d)NB`&db5hBnJ&r}Iv-zAMG&NbNsSFsPS z)m~`X3Rk)xY1_~0q`yVj+XQ~fBJjs5nlLx6H&lVXHUc+d%Obs(eYPKE<*OLLC0BSm z^0ATGbn)Ah-t3Pex(e(G+!(2a?HSA5k0OBxW<`JX@45UO*_^wpM&@TG9=c`rY(w2W zAo@EPllwUu%|^S#L*H){No^OAcA>pi5>ih*7bbMHgM_vdg;Fa#b9DG8iv1B|1H8^5MVX2YcwzAjURW^Qi9Zxq7Lnm*E_8bbD$dENynZrTN;c6%Zqvmn!2)nHZQ>iJr> z-gi93S%aPL^<1GSb}rg@2o1{=sr%T{lSkgiSA`aLPhPfor{I4ygXN27ys4j; zuFbF+59Im|n-0+FO71w#hL{F@Yg^^%H+DaPBMr{X;;DPh%hTRR$GtoE{jwMn>{Q8^ zO{9(zrC@m+GJnf)si`OHj{h8UtB3b7{d%xou5JV2AtJ~@0Ta4{2}0f_yG8xjqhZof z8LL4PWd0i5NWsd0&~?pYClgZH0v(p5S^~3p`tH)vM^NbE`Xx4n;+l*{#ku2R_;(^iyfd{e*lA#4P~3LTI#ra{z>mOdm1Y!9-DvNACd01KCm>yK(>MkcnF? zJb_I$BTkCGhHg`88%$}E;<;%?36(6q(wgyt>P2<_TwzgxHcT9*78d3;s^q z;bwXrwJ;9HLp2Oplj~r+EYJ7?xfnI5&fp+>H(JRJ)+3VG5RC8?HY44ToJzBCQ!hYa z%*Mr9tcyvs#t{WFD7k#%$zmk$H6ttRdCn|pae@OLDCZBW6ocPwvB|?k>so<{zFfjA zRq`Vj`8+D!+sMWMu`9WfTioZ?Vb81)y*DOH+YP0XvJlr(ktwN08EY0wY_N=Kqdi@l zDiggC=paDMKP0{%Dnr88!hg9vogFW`qnJ=$M>pp?DDRX-KpD~qCZ;REop;1TM|y^e z?nLi!uF~@oLp4_{441Nnx;t9yf%rtX8ize4VM5(qWa<)m1jX$F^5X~?Y&W-&**f6& zEy)Mi^mHZZ6gw_gP_E&bc5_>28{6rkDw3jk0PMVouS`7`ATcksmPfi$A1gwrtFto+ zPS7j~T8zERrF^YxwPwxLDL zHmn-67ZPIjLQ>2|3#GBT+ZyM;vYw#E$i$d}D{E0(VRidcE}wVvoQTP`CoYIZx8O3~ zWGK?>KXJd#P37%j)Y_OKNBB79m$GG6L2V&yQE&3TkDwL^K}h*%a~mU7SBajqD&R>GqLAF`uRrK(EEf!)r65 z$Gj3mrk#Mm7bb13XWN`P0fjRke6;xR)1}9MTD){jm~weN+vfD2y@!+ZRz&9stCDi8 zGM&2U`D?5NEefq|Xo5kdT)NE>Agua1zq2R(EGi9TP;FE5KoWq&h2Q;>^7tLUa{#NW zQdT~$etWO(-xpm--5+Zo6SA#@`{S0!^ZefYBxQmV)ZiB?(Z$-~UOl1(CUWY`P~A%Q zzldrJuBN_Pir9Yr!Q$ClszJtg8H|KjhbE@S(LPs1718e=edG=3vR~yw@0TBViH5lc z;2oi~ZuGaa9er$Y(5=<1IWuW>3LC}3+-Jgtpb2Z`aqt0ryRyGU7d-lk*l=O) z#ScA@z z3^@u}nR8jWMHughO067DUy)k9yH`LzXTM%uGoYJmY|Jv89_ z!q$y%Hjwg{A5!e@u5re*r!$PeDCFYP#$gd>S*I)E;2=ih=?{;VslVN;tH&RrA_5wQ z4bxi1A(0_7sCH@>AN~%;gp&91E$*fE2z;9KElZgq|N1^(sM7gQ-?(sU0{&$?*`7BM z?_?(Cm2q*HpIONr--%s7+vj~Od?38VE95)Fe{Hcbi=~qTN~;5`i-YazcLxaCL2y+* zV0o@LhR?a%fF&d*fd+5Q5@BAEG=E`}cQuezL%St053c&1NUl&ysA@n{P1S%0p;HBt z8m>0 z1&}bq68kq3)E8=l1V=z*`qd8humuGGI>Yh;>h%iVg-L4zNGjHS{5FrU#P-fck9%{X zJr}=(LBtg_;R6L_2ReYC$vXgg#dW}GDms9l)dE`P0{z5@Rbvr=pQBrU6Ep|84hAb@ z;FXPUwpYd&|Bbq%^2uB7DDZ5d_P%_ygZ=PV2tDKLWLSaq2EwY8$8q7%vpw*OJv~$| z)^oVt==nSJo4pw%M>ZcL`VDK)t&f+hJ{r5|x4Po!gAV&}H z3-?q174pA)hrj%nq$Tio@S|N3F<6UEi9YbK@CohWvj>_$d`=Icm??GP|TFDAURh1VV8+i~%0;RNd zZPjKfkj~dy7)sy&Y>M%lBHoj6&!d*MxW2$1#~GY&bmAB7cFMx=r!leFmF9OFpsGYd z_^5M3>n}f$+;M~?rVdTZsv14@nK%ES`RTpIOUDe6Y52?;I;&a^!&l*H9r+TAmK?4% zMKJj-LxmGxmo+{o)LLJynC7*yR$?t6$&#`{$-gv2U))c*>wd}cl~YFDb^4M|&PuP)3@E?t`mf@tmB;R|>k>IR)P|N22HaQE?>+O9)f zakcwlyEm>0?^ns%^3-fu5a#jig@p%qyhnfbre`?;uHDz~@$ErB>NNla%xED#Zqbsz z0`3Y9v9m&^Hv)dT-voX@y}}WG-)#r`Gh5A!OQHj-wa&gzD#`B-26i_f&zD!c>z`6E zETrMPdS9mbrSpxt64xU^dA`s8Dp{75I|zVBWO zD|-3DlsEa1u8(2-SfXG(CD~t36#y6oQsGXm0gS8V@i3p7La8!FleM{xY^3Cp1AZ4- ziD0%%dPw01ZNimJhF|-8*w&5%oj9+ZjW(xJ%niEm*sX#G>gtf_ZV8DlL}F6_i%qLV zV?#@5bR!xs1<-iOhDNCGPavs5fU`0E{BMJ=$!jE6J#2<$Q+{|q8asl8)wuxcyfPC? z#>dc^Q14j-c_MkWE;b`!u3g$pt!m(Vd`SG#{_#og>kpwUGt)r&5aEWk2Ky^Drim7{ z85${+>TRo=2y#k8#R0cr@A9pMxp_7#-sv9~9^ZtJd7LD?- zT@l}Mr+-unRT@!1W-2<0AX<9JGVO7)Lsv@~i?WjqlUZ$Wo~+2R6*%J zG`V!*o_=jB7CZ2LK;UqvU_OwxRg(Lkp>c7;Bj^pEJ!bRLik4tZ3Hi?@o)NihQmdF2 z0HV(dKy*jTe=MM*ApO<&t*C5hE9OG>%gamCKeR$_{8*tk|E&_-!T%L+Or^~rMSIX$Xq{r zB;xw)K&YZ~gl2)^2654FN62sSdYs@$wow!Ax)jy|9mAYPdxAc3kB#YcA8!-UD>iAN z+fl}!W1}(sz9kw(bWCkp=(z})7h*boledZJ7n`)uEnYoD_xk!+9F?I3@6+1lLB`>4 zZu`UTxA*t$-m`z_?p^z+ax(cUGVTqg(6N>vVfqtm99LpSx@7qmBk+|NqA=!y2PhV> zidwVkhp4^C2Oy2Kw{Zvo{dA0^^JI$%DGq}2w?Id{i^GO&?|!~UaT&E4%U1$4ncmVSk{n zzTX>OBubb3KpKTN5yBowOYV-RGjZq`N;e;*>iA~WY7@c{KBMq&EF7_O^xG##@vUpD z#s2Brt@XNaTYrl-I&cNxyY1|`g-5fi&=>(!3mT*Egb>gepZojd2Y$~6X!eB(ka#bRm@FbgaZpUA_)w)oMwO4b;o8QbKhcTH!hwC?2O^4h>0=qqTFlsza z1~=|e8c#v0KUK>${255rjH!K!^`&+rcQX&`Bn}RsFbdg~JE4&dk zBX}G%Zm1W<8C09Ok&6i}&T5_)G&k%8bBfxF?(UgFb>u+M+H$Z**iug@m3V0Pc zG$k2MoL4?q-JlmQ9b2Bf1UujNpEoCOS{;X;iSXdY!*?9n$Tko$2?{`YMpg1LMML*b z)LWI5OKwmGGb8%ot3nd+5(8(Om7Og>%;=pPUxqY<&yLEt@Ru6H54)LW<3GiU+-k%n)$K>(;mS8TrS)iKa8V8r~nX-Jig7Ct947a@I zLGjBETz?E^W|KSZ@gJAZ-~N_$m^lMz<-YS#C zEMa0j;+s)J*N`m0qp z_dXWpIN}WD3dOfe^+NIgXYXCx<0y`X;qU$xgKlniH_@&o8yS$W{rCvJW58G@d7qc~ zu~xeyX~Sw~v%B&k&R&-dF_yunaImp4*d`nt5^Nv@+mZ~|_576k)~uvY{Drrxs(Yrp zr{}a<8OR%Q#gb;aYpT1etE;N(0NDWWuN}?|#FGy|IHX!6QpQ4xtTWexd=XP*kntkB zs$!5yDv4w;BZn}SVE&0rNP(^6sjD3_Zo$~NH9GpNwRms7b8U_c%dn_#+*p3_fUO8S zDi`O@TQz5DrfyOBSP@JnDVnvibEE)^@vPHqHGvJlfz9(Zy<#70W=(B!p&2lJO8}Dx z%cD}CY%W;$C$1V?+blFJ%(=7Q5&_^8xPN}IIREj|!rSaz11DIT931(2Znk+2ssb*3 zamM}Pa_9Cx7w^q=uAN}r*BNo%;Y>3IQf_9uEk~HVA|m)?H4Abc($pW*YaddU!p9zy zYaeQV(r5K`!=huSJM$mAr{|dH1q5{Ooz9KZ%eTK|6XssHBX4rZE`a+yxTx}nU`Fk- zR*8{`u_fm)Q_~MMY_>}p!7_|$Ssk@_ZG$m`%Crp$%(9U{!Eqw+5M3znc%Izr@S?UO zfyq^gPjW-4R`XHr@rRt+AzH%clNT(BLk(mKq@G|&?qA-d-}k&V4sp(R$Z6o6OVGgs3AcD87vf5#p!Q#*FFapBT?f0Ey+x4v zwlx~XV}(i+e`b9kYzsvWHn`;GDwYZMXy8K{U`(X#HSz1*4VbPIRt+(z$bC@!sdeE7{KE2QpQ1 zckh3@^v?Cp>_zw7&80J^LF+yFy?g2$#BHSOpbK>OE{M$^CUU}!r;)8P`I~FdHM4~to@lQAnEN}*!n+?-qvZgfX zTr{<@AHSyRy4czGIcM^9YYNKkHkbz9m~NU%*vSkDIs%drBp|+3KyAJGn@Vdcn_1s1 z!vNQ3a=8fCOaYzhzfVtE%|>Z+-+Fd5uRlDvp0Q<59Q)_Fz*qYk>=yAISr|L`l z_b{oT?$ltXdlHVqL<`eXXfVv*66MNLktJ$E*DIx8@09&na%DFVqvx zFC1u|00uYB*oFS{=y4BRn^c=<1k%H2#{y6gBoy6WQRXi4bH=9;B#8TJ4^vz`feQ`% z@aboZ&FA4Q6Ya7u;#_#;aA}A_mp$(M8&}*PZ#k$v=xE}f-Kc# zya=pheyGuPYa+*ugULgEx!8QvNruR;jy+Jn_f^hcSL`Euok_SLHcn>MncU6zPp%D? zxsWzfOqqh&4%{mP=fXmsfqFQ;u7L$5p^i7C%EqaUDtnW3SfeyeU`GrcnnWjTaE~5; z1dj+hTn@DwmB~rF(GFadGr%yeYQ$)o{>Kv!C{WTgp6mGM=L@wRyb$FW$6GQgXyd1I z5Las~O5lPTpEaJX4*P)3roeB?v+MuQ%fFpDKDc}1z(6~Xzdf~kcbomPVH1C{VH1Dw zgn018c6_jV7k|Kh!3Tr82X_f5gV<@qz`)Lfzx-|U7wacy`oR?|P$62uS4a?)Vrgt$ z>g@&)9zE`}YNnxCQ^h82L+;%!y;nG(*O))^n)|#JT2z|(2K_0V^Q~wC2VWZnN%Jc9 zMMFV`35|Iwp>9Di9nm>rBM9tg*Dx7BD)8_(zCWby9W33AZyWZ6&5o{;eQ2h}6jY~r zm>2ezrqq9v2q8Y(fKceV#O!*$4oN=7j-TjHd1nIvh5cV=I(-~$k8wSET-wF4l;PDF zkjCfj*4Q&IbQ6fnQ3wO~h9>j`*F~`D664B` z9?yo8CR`4hC^Ls!`TyR<>PU)c;DLF`Yn>6lCLa$ z{u!*H9V+31od+v_b*`Or-?&MNW1tnq0ZE6^DD4``q?%3mA-HgT;}*YjMfONBeLQTJNG~69)z9 z*}Ql&=FJk&3{AktUoC(0Nnq%P@`ch&k;rxeB zH{DmST={tM{+p1H^6H;F|B`jWNhFGac|ZgkBqq6d??mVCHv{}R27SoxE@~WRja5%b z8Q&pRvKi{;NLe!@6ngz~NrxPHpBFbPrprrpYbQIM+WlCdnC_jWRSo+(N0Z7@hEKIT z91x8f-mFLVlBy{tAw!Sc1BAP$w!2!HoND=&AMJWNZg!+`ddojmDVJ@uuo}Oma*!}| z;EHL)aKS8Dg8iFr#u~aNKAob}3-Ce(D6xiRpJ7DWAam9@cn6rS*GhODx4B}D<_IgZoY6t`k_v(A38qc45=^fU`ik>~!nK;#f)HusTghg_S5PhRLC z(C1jv$)I7SW=c%Jc(XSmx<-~#*amx`@+NnYuA{diyaF{D_O&M?B#|p()y4B5*t~w%J@*ZhZB{OSBPXZy?iiQ9|8Qyk3*KG2 zS#&Ra-Z}FbTwh*0!JbfZI`Y|)w1xwu_wR6=DqNVMzZOGoU?k9TFC%W=+9o~=_ax9t zRzeQ2$#Z5}_#O{ba&tl-Cctj?a}d)mTy5w)dRSRCr^Sx1nOYg;PHXYI_pJtA z#92(aS-JVol@C60XHR#|edK{trcOwM>>KX=Z&%(q(YbT7^X8?_n-9R3V(tQ)$(8rM z?tJl)H3_zOt8@F!rFYTQjft$>Qwjx^W6hR54FWR^3?(;l-20wqiY(GFiXV*#X+!Og zo*3{k4MN~~1Pn0%M4oD`XwV{BC~(o+x;{Mv)NAi^s#S2N<}f7bf-M*mD`ao8sx!&! zKH@>M|8g62!qw3?yg~c#`%`xo`fIzgz6rW87BB!Zol3E@_WSG9{aU~>vg1niDeH=|w z;r1l%z5x4qr?nd(%SMULneW`$FJ&b=lk2xKh^2feg?O7X#=Fg$VdoEN)E2nT+33u6 z%sOm0Dig;ne!`I~RIv83r%t(268wt&1b^)&ai4-Wfy#-@Z#rmvpo(A`67|rg{T+NB z6v5CdPq;{hq!jVyhWbqIhZ{pH^qrP zN&rjfqCDa+3gp&Gu_`>T3|-79nx9YHy3E*UZD*8%!I+Frj}#jQH717)_;Sv6qt&>QpEcG7743n@TvTfY; zi}RN{w{Ai~#$2jt33#?swX@FIGmH1$?7TbM`S2Pz$$ff~iGq}|W1X_Av=S{c0jL%) z69wl&_6kxYz!*_KhQT3)x`RPzI9lgE_xlX+u&2pqO7>})bU*& zuLZOl6%m3c->0B+PbSjgKdmo4CjsQ!z_0msk$G~o>wLicnQHeqf?Ggz3s~3r!Ayto z-LFZv!d;?;---XCl_wfbc#jap%x5`F86SdhPb9%1G-AJg%6;>Dc`J(u9^sBExtx-! zxb*kGFV3B1iecv(*A{~Zp0+h5zYNpy7_zrCHN8oS0Z8j)GB<|y^jjN-(2g8=wIr=8 zr-5m<8sJ6`CtiZ32G?BqDugCNT!k1VuK3~7JuJdts%YorM~r)Dj8Cu+eCM9O?tb7Xvn+YXj}>IY`M!wq}f8Rdt2Y`zVP6{*eFT_LgsBNQgP*)Itp z(X=Mwbl95ocnAt$0)#%ZiRU8aR%i!r*U;CT_HF0AJMP6#sh$9LH}|8YWHrk{#hcVD zPswuc++Y6c<_`=KFWt_dm3b zbBD%$iz)U;oJP6dBKO6%)tSA-YfA=|xp1dl{|=8Zv$pNqW4RYT=id|ICM5_K1lD!! z#PX*nm(SmIFI;kOpY6Q+jTEm$aZ2b2Q(O7B zfT$JBje!x;ye9+`6*1(k%?5vM&REibJe~xM`p!p?R^fy11%LW*<;p2qH3g^_^AVgM z(}>Jhll}&5)f2HAX-Pe1V_2YeL>z_pB`qe^e-67oGF(N0f;=LE4z!krh16O^&_xK1 zboq(!tmEydIGaSAHd&-%V#XbJNo5R-6ElYMuHPZ}Vc>>nC*^!NJXi*# zfNQsi{Za%x+Iz$6w3yF2q;RD|2hB#ZO|a?OL%Ed-Oc8WmeTKcZvb7z9wu863** zRsy|*kF^AT-$=5hkRf~G<8(QS7PVRNJvSoY6;Sqzqj2C`XfIxzd!0**LQ;(G)htff z;AQ;7!qvrv_uNyni}U9#{4B&WbS_*38R*TgAeSd(`-D876Cx2G`y4i{l;gevXU^Om zSkp_V-HYekPhahWW8~B)WNzxbd1m>acl+pTi}%jKIOgXUAH2&xxb*i=J)R4Nv491i ziTob-W8ed$Rn@{VUj9GD{2#XE|KEZ9QwP^iQp`jXv#ks;wQ~SH2gTy!0CVa3W>~Mx zNCGUmcn$us>s!L%7da5@7X8IUX2mlnB`2Vndof@fYQ$BYHzm zIat7j3tqn1NWhUV1#gRuW8zabEPm;a?ZM||So{*-gDX43ICg$-kl;HFXYzSW)gq=l zz7KJ*Vg56|Jwu2-A&5Fb7vU~6O#Caphqk(l-{0(yFUwDeX8V((54Io$R`5ANj0D(DEifdAM?e`{K0|WJC4zP$ zFJ{edV^ZVImYY~S+Uo);x3GIa9w6xo*~(k&CMA^f{D@`qC|iqw$AZ=djIO?C z57=FFBZVQX)3bK)7){0Fc{QV|)I#a4pOjff_b1MjbIcQcOX-C>v#B|Xe zWwT|<*0Z(1rJaM)RW>~7=8lK~Mn7=q|Gd-Mb+poKjZQfY9zwveV+ZjU?=b-_)xEQK zt{vd6WoaTB{J>VfNNh&V*#uXT2O3QHU`I0;2UEhAyK~R?lh-<5e6)P``trTcl`n}L zi(P!hPtS-s#Idxn5%%DyUFs4xbS3zMOP{@EgubDB=o>uf8^WM(>>m0?5BkP1=tJE@ zAM&6Ng+U)2SjEH-_%lBcIytNOz()TA8v`F;2OIir3FM?$Q5$U%p_uw?Bki z3cScB;kR2>KMx92ktQYz<3(q3N7&Ql`BoAc^(^{sM<$I zCX4mqK^UYrEcS#B_7GWCN=Sn{mJ= z?9-4&GchCs#p$&q)Rl$XguGgXrR7XcRy}G2xlhZ_5T0-&G|fgZCxtFmBuGNRiwv43 zDmXzncaO8VlXv)&Ls45iCj42JPTDb%;pkwZO||IX7pOug=GyZo?qa_6-OYB8wTTUX z9J9#fp?Km<6DNe83=gsfOlzo=Et(2?oRhaHe=*5tC^&QVMulzfV>xA#pR%WuWPIVJ zA$hqYh@imGeo5A1BteZ*L))N1+psEV8#QPfR|O4xNcwnD5W6ga9and%KEXL=WD6 zB+N}V#wAjujfA_~b-Klv?8Rul(W-bj4e=6wRbN6h0DlR;2Cc`h*vBf|7G1#K`_~x^ z$-~wdo6VQ4`~)dDu>Ni9;E2_lV$%phoRu$Gn}BCq`MlI-gf2zx(v$^^2{6k|5+#M-UWliD4|HLT;Xb&91{4MECg$8QCB@Z}F&$Q}T4NA#0-E5ViMwFJ+nmx4} z4PMexs(wN^sw>9f!eW`tze!h&0F8vSZI&8NwR*s*TblzTzeWrPAKlJ9o6K{U9eEU21@BU8^r;3cXfT5V`Hy zW1nlXmXzj22t;ZyHOfmCodimiz<7a4`o?CGo}^SCA(vL+*-XMZm^@VZ!s1Hmmr&-l z5?G5{IZ3<%(@Y}4N?2*s@{gnrC4-=5v+?GN!OR)5=Q#DXy6A!b*hjTUm?%>b>`#G_ z3M1$r9w;{|U!JL5FtozAi)C_ptQ^f)&LBNLwCez_J}@*)kwc2Q`X2*BPi@-t6lJ7R zP{hPia=1`C-Q}r!`|9HTGrVfd=?8-Dxfiy>^%9V#QFqZ3GJ#S_>D+}4tgb=VeAE7`tCQMb6Ce0(IRm{ca zS)c$2DfM7T)&<4}{j3YAOy1`FEo@qnrB?J6#yX~li7ThKRn9;oa-GBlBMb0b{VuSG z!4PG+Ax{wi4Yi~iYSNeF@y}9r6=D>IlyefzP@P_xZ208I=5+O}NR))my?D0s#V76? z*Oy;=pl>?(3pBmm4QG0L!#Tnb$u=1yu6YUX#9lK|g*mB;F9;)`oSXzkMDW8zjk0gU z|8Y*F+NZIUCptswmYmTb&q;-~2_`8_iW;xu3UdvQh82^uc*=-5JfDOfrAYERoz}E8 zkj)__6yYoHr*8DpQ72gwGX`l_!RLqojv@93r)H~y zC0N#DrMedH8Widt;ZmJcSz8BIYS@s)mEdJF<;r1s)<_(zU?NZLGkPObu6QU|MsK2e zN)*|NS1a$Bs#MEd?hL5M{KLk=5NTX`(bZFT37*=ZxMXs&_yZ=XZ3o?ABq}cEtp0e--B&Y2(_K8t0#(_>G9{2l6 zu2uC2A0LWUkPM_WVz>tj$cNd~qG6J(a!mA)J*xQal~i9Ri5$t)yv@D(4}gXJw|Cc0 zi?XWs_LBe&?p0sCMQ$@(Lw)P)(wY06cX?_ubTVNRwG%yV&|9HBA|CFVm|z6mXyv_AA0YP&&jj)= z_O3!1r_iH@z0G5@(8#o>rv{0k*NTS=NPHmm4n_wZ0azsme_ynZI32+BM_=IFnZ_TJ zjp8v_KQCRVdhqe5-rDu~MH+p6!5iU;9GikPDqJV*h}2L;-v#z>qhXU_6mbR-!<+b0 zNgD_gqH1gu#BVawMaGJcLSPKS@H(#>k)LScn5k3jX`D$P>?q3-aYCMy9P zKYCd_s8-oV=(+RX#C)Pp4eBN4l?G}&xTvc3v5*P|AKrVSyA)-$vUgbp$ zt&^u*zEYz(PB=o|jk74ZWEy8|_r8Es((SIJ9h9@l+ZHDAL~o-e$M@nGK+Y(IiXFN43+4_{~1rpfuuvv)GN*o zxEQB^`Y-@buQ!drFwbKn-Q+(4Zd$ECz+v*@tYZolA+d0pQ=+AldWK`~I2+4ve2GDJ!pcKVOa z{lsyq95Zs2LXJrDg&NvELXIH?*fw#5Na{Pe9e$C2obL!BaLtf6O$jtlM3j_C8 z7YNqFSE`|l&HrK$UOpIbFg@faTXd9)$CSz03H9K_Daj9#$usVDVh(TVwxy>073l(ZubfV+`)cf>7F8 zrbP`ef{=-;aG;K}775a+84}FvYs#$>i4t`Ax~JcVFUb4fxvyPV|Kk3o8z&b7ajq@+Tgs8m~aBNc4wLNw38&wsq~?lme)qk;#Y9cr1JMnw-f%EW!+ z*3vukDs0rSUr4^2M0VghFo6)h;4!$ZvVBZ7UHFD7+Bl(hm`9HbCfO!q47bTiW+r711g?B!dGGgN z6Dr%1QASecb@N7#Foyl0qU-IDNL=w&>>=Su`%1-9+MbbklBtba$4~4Sma&zNCZ0vo zY)JLZ8|c{xxpF{m*lI!T8i$InW!imM$(T0;+`X~sct4WQTU@jJ_?wm2ZZYvT+C&Rq zjWE%gQ3WTPFs(!`%_MaJY(c2>Fptdr5ds86HUi?wXrXWtB(Rbo^AH9|uH>CiZA}RF zkG5Pp40@1SF(^;9!}@GkrBj7E{YGt5MyOJyQL5Ui@m21V=vFjf2SEDiod3+7{nkA@ z=U%^_jDGmVwed80`v%z0;?d20Of>Ejo(r^k{x?6?V+Atw)gi~6e6^&QGUyT= zm93!LN3xF`t~6(g7#tjG*$Ete^&(SITEu896&yD=t&cL7$eRggN7_0?Q9+l$S-XRk@Q)Vwd+w`^%wAzSaa;lPo%^iI>clDzilYLyT;fL43sx)DyG1mI>clD45T$%bL1!3f2oj% z4)MtEI96P1+&7e;D5t`mI>h6?y*jhjBwyaNaUd1$)FB@CeKQT=Jh_$|HYL?ihj{FN z1Ic~Y9QhLaFBS68A;HvFYOky@?)CuuF9q(@AqlT39!rRO)ZJN#=9tLEB&e*pbMG=W zpWe|O4#KxkAg~HM<5kVFeMWE z|0MhWxatfaW{Dt!T0g0I>LgGS@^Jr*F_W&(fVIaYPk98ABUoA{4DLy8h%7Xyg#u4y zu~dh$hRrr-!`@b}a2N2b;!_4kiUx*FB7Y(KmMBh2to6Y_H9eY4*b0onVp|U|G&B~S zPT<$gaS`#n2yr;{svF8r^MTM^{g}4^7F>_s{F{5~l*RS-_E^xlJvK@)F~$)wjDQ!R zB76uQJ?_0ktYQOAHG#lL38F?F&`K1^2CWu4!P2`Nhef6b%#F!9j{KCVt{?Mz{P?s7 zxi~mvDsppvpvBiWi2Bh-brr`$bz zvzCS&f#4a9xj@J#TJj4w`9WbmA1zRluFS*Ig=sxRsHfV=fDR!dB`A@T-eG=!gse_Y zrVzMXmcuXOExm>tpL zu}kBjwyNngIr*iY%1GZgpZd_6BYE9(!4&Kk>>AA(JBDf zx0htJKwA^#dSJAT>I7Wxy_PNEEobsA8wtc6cu1R~2E3Q*T1YmZprt33bH8DHf~|Bj z#M)Yq5Uo}*m3B=G8FTJY7%Wku#GHfVM_Jo++g2v$MK@u((JcW2WRE>}M#z)Nq`7Ua zR--aL!_KWti##q>qT}b+V~@$5H*dDg?8uOO6M{$&D`1TaZBFrN=)6wE5s{%tb|vsj z19|5&82L~KB{LtFR1Ja~)SwBK-L@9k$z2Xa+Hh#0uIn7^)^Hd0G>+o~=r%qO<}^;G zB!9sr$c098GGzwHhy$7zoJy7*sY!9bfh- zvb?)8hNvSM2h3YJ8RDB`a#Mk;36a*xWa2S9vhe#T%KEekN?&@#KH2Ymy~&8;nKI?u z0l+DfJPg`1iE>c}Z5uS9ndHucZ1wzPS5T}p-*W21gPU-y2{FM#0#OmM%6Q!PxI`^0 zxx3I3g~wE@bIjKhd!}@9F;2ST=CUR6p2(BLjBJw*csml6%=(pxmZsUjsB z)TQ@mn6LFC(ZGxSo}w`@kQ$AFfnK8l^P3V4>e71>O^rtH7bVPWittKp(;ds7_@+sq65cFg5&KuOxkw&cX@z)IStsj&^HcoPF8I=fMIi z<(XM2lS$0AgO=Bg(>v-9q$TdbL!Mrq|Q=Q}qRGy^!t8G=o{(eTkpnZ{Hn;H_Fa$O&ab-2Rr(;t7@J zHZ)w5dj}Ot(Wo^n!xCA%Mg9g4&{oD4xG`Lceh!uZw8jkPE*dqk;zy55@MSMx@=u{5 z?x~q%cDzj#;azA2g9C#)l%R+pTN0R;Ts!36QA$jx-9EPc3|h+bVNp#|&cQ@gB$F}7 znxiHlxcVxiA}G`Q&MlsXAQvn_sd#}anP!4wRWR?_I(7yQ0?~n4?1U0F5WvYlRoX4#d{}~Pk$2|RmnbV*NWrpq>qTI3`xOlw(df{rg7(} zY~bY=v-F{|Y~uBO!m%GOpOa~)2ubuj*hAD!j7Q|q8R3RQR?<%KO^+C7a_x{vgRtD> zq_DGyFp6P7KA8BDg1hvom0;7{4rI!^+j0HWRQ@uJ9-U~={<`aU-Ti*1hF zw4FTY!W> zio-q-hccGPj0>v>nwC~DaAU_FM(;$tPn@aOordrG%JiX9b*5}L4Ft({>O|E(nqZ@b z(M^em@28`iz>TEGZD5$uH?1S{VV8?tM6|6-uzWm~H;5U@vU(><4~;hA z=<%qFQ`!$by3SE8U)gfB^qbpgY@&jfwA|XIZIRV4l0_7bDV~z5X5^)zQVf7S7a9Yd zTgCB&i|@7Ps)wvE9I3QQQ#i#3isM;eYyG?$6m-b59Ss5d+WO;D);=u(cyLo-@cTyK z^S^JzeLF!)BmWDc27s6xpL=*SkRVG*tQcq%OO%-m6HB@}j03#UFRep^!%yeI1zRhl zv%XmdSGD!npt-(KD0pev5ndixyT?Mc*6A{7M6;!FEH=3Z0cZ7HKY`fh!7(g!^Amtr zDvdc>yPtkKx?;5|T8WYk)hyUllZK=7F?`F#z$E8l_xzWi`#A4D1J*a8+-kKmoKES8 z+{OC#{e8n&qG4pscC^o&9`1JjeS?%0LrE-8GXN5TtZXkdUTQ%3Dbv3GQMQPRCS1ns zkcw<1BzCDPpEo6TsT6|&c2%pa?d{vL*UDQ@{AYA+wg?E%^?8wETb^T}28X(b^ZgYL6|GVC0V-(r(u&n!H%Q?e7q3P)^TFeJ8*;#%a2c}zVn37 z1=9}Ju#LwjxzG`@m21xSz{mTT*jX$)wdyg!@nAy_4~{VXtm!m{>rRDE7$tSW?n>3B zK=0iUw-CSrY{u#tpUL&|kPmg-4PufbjeBz@6G(Z$V*@bqP0s>ZsyaJtL z@!h?Em3|s0954lyM}eSwJd?%)hnK>LGZO`*1Dty39=CDTv$Ska6lba}wZbNU7+cOY z+2NXsf64`4c8mC!oS8xLB2&=3nWX-j71cXN^N-*zy;%2RwK7?owpX?I2qWFz5%9C{5**<2!01P>GlJdE5?NNet6L%%0qW~t#+t80Iz){Bke^v+5O{X2xg62j>?EEUi+jQe>}N4yITh-^EA z!4mYPS~tLasopKXvU8+n1i6#FSi@rg>1nj9i{KE>ffuPB_ZS*5 zT@|kx`=~ljJ&bk0yHS6et_|bp(N$m~D=_FBu}0u-F9OSO&EE)q8>%xze;8V<;hml+ zg7OpAR;8LOy>cYl%}1Tgi--^i4JD0OdR`y~GhAXG9D1<1uRg<;BH+zPXnEd@*huzY z3{1*CY>~(Yk^;H$hFxUetWCxt=rxQ)a=X{6=ZG=|?v+?1p;0t~RmwozTjY)u567-B zw24IRH_)Khm^Dj9svaGKooE+{;izcTYb+0&G=#8%O)kec*-3hjC&7CmefJ$=}s z=ac6&+0V)!;!hIMFnS8TR=q|Pi$N8etvEbIyGS&5h(^7}vQj&2H)3(5R*@L)p(Z`& zh>hYg#*^bWwAV12FM6%IG;yX={UzmskC4RsbY2TTj<+*MSQM;Vr4KSrPyjgUj?K_Y zOh2}|h=*wSJgg=U$J^;hgtqY7g1P<1La;Fct}4mFfa4t((w zfIT$rYb|4EJn-c{Dcps-5u=}k@9mOJ9@$bVtuCsixB6(QgymNDIifcG>e!A1?OE0) zsZyH8=DEN7m;}#GEyX0D(TOkjk$S$7I^_N60)(={YP7vdC{a7BttKC%BtP!Ob1R=-a=*CTxpU6__%rwQD^~V^GgF#c zzukcd0jivt3#1<6`S$6LLTRel*w)HoiM^Mgn){Ao)6T+l@&-*tNOpEGm}4Aw!gIws zpzE!(NKParo`dhTErU%`T$qpb``twZZ*+g&$^-yi+oOBS&gF7f?r9L+S-tC5QCE#> zN+t*<=~tccVwHDO-+7)u*`8 z)JFza9m*%G7i19$FL<=Ro}`dTKP9$;#ZpTzouLqvp6)QYja&SufK!tS>J>*!W^_X$ zws^>6tC#2Cb|6hs2G%@Zsx(T~@KZka!ePufAFG;DJ*}b+GA-?hl#z+aCmz>!n#{=Z zrgz`CvHaixJDe9EyzS0jUcPzjhlN@9(^oqmUhBMfhxWK9D*Ui;#;{WZL0abU5>pK@ z`ntjoPMuqNaC=?4Z2}+EWJg~0SWC}JnKHxV9}N2Q1RyorW%@HsUkBtE>LR2S@t{wX zh{to#N;y8Q1I2O6oju(-_mMwNEqw;txa>p4@jYI7I>=mFF9K?Oh^7)mUc9_id#DAO z5nB<(e8h1TS1ZUc^VEl}P_q@>UGkJi;VSJ%fpbZ#mQ+C1M7XKK9>Z)zBT|dFVnuC( z5Lz6MpdOliKgTZnTPgBb91mheY0XBIMv-&cHqZx^ccJ1_5`h>pLh1!j$Neg2$qJlm zX^r(tSL*W0>E`+^scu6*>T<`2t}*c)?Hksj3slFtU0Ev}tmgtK_>i>0f7qMZaf0+r{z{n`%;@4FX2b!V?E&Yz;B z+#r--J;=`NrOwHZm^QI^|4sMIIbtAUWBDZFZ!k86A^a&=4bWWJ4*nCl_zhXclx)_q zVkZIerq=6?EBpPG#f7WOU%s~V&aFVXUaV3`{%{^zb`J_ za8G@*IQP0(p1{Xp`fq=@a^=+Gy*GRuti^lhR<4~`{`92iXt@_&?Y#RXEXnQH-0O3T zbLWEza81w`zrPJK+==<+@BYkGLPFPNlI59mBzi60d&m38;=MU6H~^oSy+Z380E%^6 z1K-Yt&SRPalZrqXAck%}+79Ld4lle5|3xJ84}8BrjF5X*7r_zbk*PAmbInOC<}lry zl9Fs|JnWEvU_5|y)Rg+R=pvZ=u<2jrT0`c2lgn*X<^9oDW4PwB}c$C(-MAD)9SiA z7ij#{ZRNeMJ8xVKK1yYkA7s!)%^FRL4GO;JQ{m?yxme&GBRg84OBA1x=n^L1#8grn#bsei&`xWxE(xllL>9c>bwZOAclxP z!`MIH7DS+n559*3wh4s~tj_sQ+zWr9!<3zaB=>b@FS>7Bw~!}Vi}Rnjr_Quwb-(3DbPRu8T;1X2v3F^_IeGA$ z$81)nbwusPkjQ!HXvd$qn=~0Yd1myl?eN*gI!#;(xEzd%I#j`$R9)y@bMJViD2#>b zlI((HXO?tcnI*#{qG6zJ0O-%lcka5UX2}Gwc<;pGz0XB$4K_u&-?Mv65n zODEwTSDlWmCAii&#pl;<*Kl^MHf+3~V? zIt3aumQ~a@^ii#+Ago}uOIkBVOE~*$PD@Tbj+7)S=$e#BbSD1*os>e-Ln~()WEGFP zVAC^@X9PD^_&X*&OA4mMQ>1Mbh5}7wc?7=G{gH{#am@P=Uw&dPfA_X~>Jyr%<-2#> z@BWnXxJgEECU zTt@RmCMFrGH$+b~7ESLmsdi28ysF}h`>mxLCv}1k&B3aWJP5M!w92z|8|mFHl@bB4 zq5iZiy*#H>Mx2;T1Z83}6H(omyJ1b@3M7K(XX%xpX7pVMqhIANq%^3zY9-8ct8B#O zPfso_Tw-guboEc<@9+?|7^#``N-ALfLMZ{npRs_7Kk3us6$WzGiAn zm8sM~vRwVv{e9yZPPu&F5_z+IOXR+G`}V~~%%)ZLTdG}a^l|aF^3s`Ew&q|s(e|*} zjYZkOkP4QrpyTP?%N?7M%({>G5LBb#I`2m11MmsPD-`d>jD`|4U;wrZ5g%qjw+)*# zl!o18iZJWv6Dkw^8f;2o-%SJ@ue!?y9!7bdcqg6EN-1+t65OUmI<#d4Q3Pju(rsinWpvAJHkdEa|3(MXu@ zn*!tRJljR`VzDi>^x6E%m5)1T{_1}9E;>S-b>F|ScyG?Vcz)?`ci<`$ud1o91VgwpmZK^82V@33r!8t9f&ATSlZDC&}qFSbP7Cxb7Jzgh$RRn zlsr?DfN5-`8nX!gh~$Id-agxT_ZymXHVOrVw1`EflGMsOrYhBPmLMmg4CyA_#9TZZ zg~VPSd(7I_XcUhXCYVr@l`x>MHW_(4(>CA$E6RR|Y48i-0-S(FLuXo+(mY^NHl8`c zLXD?DHly%;IxsZ*wC9h&n_?qy;-PDR3m4hHv0FyVn3<$VEifZqlYytk#y}CTKrNyy zVnuj@%}ku?MZ!yn>ZPSd>_QBc)6N@Z(Fr=o8+;y;EqLt+$9#$!> zycs=rYbMgN3t3bX;t5S7l>VNn8(!4~UEkmyggwzWbStyMR0Fz&@)q?BpU!oUu^C0butN%avdhtJ+s=6vDv&b2d4`ejV9Gkcd`G|auu z1(D0&cFvqzT)44v;w|Dnt0Cd8ON;Y-gZQ##TH-&`ROfH52$F};C3 zek`ql-d7h<|CdejtJCrToMxXPN_+_R89a!Rm}fXftFvsI&qPD6;M5jvb#W*z#iY*n zLMw+aP=;t>dzRL$Gk+EC0faSqZC5U_F?p4%M?0Nj%XGhVHANq3bVh%4HAI3MO3YsM zIG0lso4w2ZJZ)>{UG8br>_ai0;h8`_J=w0{gUCtXbY%ly$WGt%B#04tC-1BrPK*%s zP>*P0UumFF58VO(w=I!U&x#Q-tuNls=;oBa$Zzs$&^n5k7- z?MzsX5p#}F`7@A1L>XQHcv!lWv5^qZL*O2=)rAp{?tUKhgi}=wkFDl>4jUclCF^;!_J?8 z2T<^?hgN0SD6_Oj*2SF`hHeK(OhgtqDm1%U^0R@^Ax0MKNTqGXv0Tst7$KP)e8Kfx zm;ya(0k$R%VPN-x!&*LwpC~;s&YnE+B>VTtiA^PJ!`==JY%Ce$PWS`>i8ZCnSO!!* zHp)Up)fQ=AwC27!GQsbzR&*HFf1Q6!^uXuxLjzXJv3@x;5d3Bce-%=K65wEn?8)`yLY4@%fKK5FHSGjUh@e7V zq6&8y68k+UdmEV_54Ax)#k43x8*)lRXVSHCB=W~_EKc)7EC|`v>g}ZY8T9tB17uZ; zzJ|IxuUeq!?KDGctg-taPNuM@U$)Jw_-~z-aK?S(`toZJRtcjBwq`$YKYNqHdf@`|om-1@=P4cmt|l?E{hYnmn%!y*6+}l?fG>CYn z_ECXRJlI`Cl<_OQ``;=7T3U3OnkdkwLv>Ht7+hvY+2*~ja-euM$2yrJ$OWdg1_qc+1=$4=>j`SL_ENyUfLtDO64u9eQwllaY2rI z%?95`vko(|{aL1k#&baHaP}Bfk-5GS;UH!6rs#lG0Z90vkUIu8z_Krf^M+)3}rexfh7} zV*V--ll6t}5fl0KWH&ZLvLu7wT1Yk|qpTF_1r}s8&oDNmMOt&WFK}l>VPpU_P01H5 zXH*|Oekrw#4t*4CI`RNlJ`^~}|7-Mx=L@)iS^SmUdMXpg1ZzzceaYCOdS{B6OF0`n z;4mi0p>^f6Lb4j@O0bOFd%;h8#V5|hvE46U=X{zX%VrT%)%s#WljGt?mtF)H6e&WV zOBzI?k)iAg50_*P(KY8okwWvi^?|=KB@0@*@?h!J`{1}M`J&mj9(z1vKqO>{UBS!r06%9yx%zMH!k{(8#Bf6 zy@!X8PYC#@)tSA-jSr#gjtzq=ei(yW%MG?Da_z^9o;IxbOY7b9c8MvQH7j_uq} zb;SJ>PR2g!!_t}9Zv~(f=pYj)g}sl!bLEq-+_%meQ1#Eeq^L@#q=$!UktNchv z!U#!f0{?7^CQxUpHzHF=_&izMk+t2nYM$>0!2%DUDAMOd#O$%!6z*m%F3spFc#%HSI`3d%HN-DS@MTum_p+ZlfZ<%$#H~Ebr{rCmC-jPXv zO}U3$K!#r#;Q(F^M$MwTXxI=WkR#^llJl|zXYCdH7&&P9lOtD0awz>bg^ntR1I`vlM7Y=oL8oZSie}WOsSqnT%J(WL+F7hpOqO=t7*w= z=zWG4`^b2MOc7mD*vuVQ905p2OTUipNm6Be;w8mLKcr#VxEvD@j_N~-Bu=XL?95Any2K<1}V%xIKe>#CsEz`HLuUQi(wSNJ)Pj5aK4ho;{)44=uPD}Qxk$&FSLYC(%r!e$iUksJ z;~Os-Cj9Ym>vM41KTaA-UNl;6$7Hj|R*oi9nn10YHi^mSk9|Bmf#<*TcKSZyYm%|^ zA?51yqLF1b;4uI%4q0Xo|AKiw{VRFo4RD#D)@_JS1j_HSBLi2)sK!Eget(I-d6vB( ze+Z_9@s%Xb#`LOfb&$dH&>&-qRVcybCj6_V08z@=&D2zdBuRCMm7CwLympJ1${>UyZN(8mX{++XRO>?$t7uMT7 zLox*(M%13bP{b%gQR~s0OHUw>9KkY|o(LX*O}pizX~r;>JFEeicia$E&cL=y9)aB_ zdi9}zV{LM3q!UNa_e!1}u+sRx9Y=^(5Af!Mm?lT9nPe$Lzom~RRiFUWTckQubZji& z{?dK$E*F};6GMpFVP&X{k`$CeGL?7n9EU@XeB|e>x9K(?*>LB*J9M~-3)!<&Ey%t7 zTB>_|xq=hFy@yBo`C>Xb4cX-)5*}mga2sl}Bo9o^v&%0`OspckF=MzmQDZ4gv&yVv zZ-3Tt5wI-S?9!D7?x`~=Jpi#lPQNLbp6qi;FKH=X3wW7iDO4dQQATqu+w>}yqqe%$ zzzGanjh}e!sJ7vBslt?alUA{>b61*7dJ_K@DM}H_5W0DfJ4f^5 z)ne@xQQaHXFrXgAe2Q{lYXWE_NzPOXV76d~*wU`hPU#iH9^vSx-Jq)VN%gOJQvKTuo?<78@?;OMDjD3< zU%j||`2x8(u6*!O=Y#Kq@dvGjQ*A~UefDlGsd2<5jR(#UNzLB`bH+(&w^f3qdJrpD zKIYyJY9a2VRoDJqIBhkB({w^E9!4vo?1T{G$y;Z?*cd&ZB+XG1eQ7K)jhw>iaiE-w z=O-*agR%K?5nRnJxF}o;BHX$Y%{ooMD8s7!n@Vd6ZX#1~Ko5;!g9lU)Rh_iB&+^@` zDOL}bQSa0q>(13U?clrLAKD<++TyFA9kWviBaYz1N-`D5IA!{eJaetZdvCj6eb}2c zRKc87RKJD$cwG_M6(D~UmIA@j#5?E)ejn9A^vW(_#jhq~=4$Iv&ZC*W=%<|005T3R zUM#($=CC?(6_T{6_*i*1{<+TC)9&r7RHXo-5zoBMgi5WY&b*wu4StCHi@TY0g&7(# zcp4;ukkJU53md)HcSLJu9JU6@A9j`sI4Y^5!j5E)w{LE$d!OfwFEs51d^=yqkLNM( zB@-%x+T~QGT(&()*pG$qr*EgIFO@aUi|^<5&kM_+%~JhBUOFppC0efWhI6E8W9_(R zHf|AuB-rbK&M)chk{%q1Pq*xJ~H~b=)WzIPpk1dZLPgeV@TxmS-w00du>Hs@} zHdUE6t#J6)#_@7lpa`ZM_Wyiynts>~kP7pt8}?Zan2I{{(6xdj9llkf+$39*oD?KmhyT6NjU*qj`=H3dZgYW5Lp7iP;+NH5aQ zvKOT)e^|H*9>7$)35N=KaNhrJ>C9>3Y1-HDZ1Ag9*2($5@VmPBY11#06)ImjK3zAI zuf!M+O2)o66)b~}Eo)W4(wmS}6)gR7CQN7L^(~B1s0mrCvXfJl>f0k^S6-`6T6zOV z4kPOjFW~cUxpNm7iE+xhcFR2j6*YO`NA~B%^L`~lF&#~a*3A|nX;xUG_Tru<+or(( z4Wv;tl7@*I#s!#h1DNpyV6fN#0eS2(>k)$I5n+BX*!mH_xz>8nNM1!wiw*>K?Qo{+ z#fF_7$A@t=7EU_eR8JS{;YCU-d~%X+zX-Q<0=8ANdQUKs4`m7OD#=3Y07yv~3p}BZ zRAM4bGM9uSpn3SoSYNpbrj~4GeFh??G5`~Q|D~uzYMSWaX({h7S@Nm0>}jUvdn5A4 z45_x`t}K%4cEfY2l>BFQftxa9rZD`f!! zOmxyiS&NKTwIsnk&XkwLmgfm{lH<6^byE@bgdtC{_T@se{Hu!J%FX)#<=ngO>3Jnm zJFruE9`k-=Uj4)$rL?6~=h;2=?c)5Uz^#U-pqUH0DV(Yx?meXFLlB~mwc!kkZJ}AOR$9pX3w5V1r{74XIfL=HG0l1h zO9mMY;|WYhJsMsnpXtS5eAzgfh%cN4A`UvLn$8CU5mP9FMhhvnzc$Snst6bnvPedi(#_k;w?9rxX?#|E46@Oidhy;HOLL!@d8q%%XPlSnO5(Z@Q_g1J21%k+L^Gv4 zO)y^73-I*qL`G;@xp!j|McY{qwg!kX6^JIWllge~#xe9u(apD#)0We;9X84PRTwT zky7fK=8??!tH>)ExR{Rg=%Do>F6-A>Q)gFXALm!$*rn@uL0ku|oHDq_2PbO>BdQYLrmH=2>G#JZ0vB#`j&w6IO&%7eS^DV z$@{@Bm1zGa1HhWA{U;`O#KeL~y(hF%wd0dGttkdDK1mzWuoGKkO7mtUY$x`h@cfGn zE(2*hk*^@s*SdW_)m99xFV7}?*k2?XQ~x@pZ2YiT1bQo9N_qK4?#{!t&}(NqSMD(S z{9$3%{q)t&hu1pSyeL0qMZf|jtxd>O@+QHOzlHJ1LlqTHPnpk)4aiZGg_YDYE6|&+ znauAS&+y&GISef*?awvlFfTS@*o(p?(p7##Uo_s+qk?s+ulkFP?UU-Mn`%FLccht& zdJ{?c&fM9{%QtTsFCf`g!b>uhvrVwai8&KcLLPd^x!WJ{LFANuw@xi~qNOQ9bk_xv zK>(T{&U!HAh_-I;1--j}0NV`Sk+1G5g@(di7qW#3Q0@!k2zr|4S?@?G| zx-KcxwF&EBxHbW-*Y3{55SP7HmnLHHsqRc@XD$78j?FbwQGIFIr;*sg=QuSmjgglw z@TISBGH%V6^zygF(cN=579X6`J|Bg`(+>K!iE7k+mQcgf-O=nOauruJ7oe66p(d_q z=sWr?P0FH<>?_YZZ0FI9G<@vZ=bba(xwBu&r2WIfS#|<5op^EK2BbsP_7tPuN^Qc4 z^(CZL5EiM4sB-Om62t4HQ-h4Tb}r?Ort~ zaNj!1#mbB4Ou*cW=a>F=XK~@`@@dE}#SePa1sGRbS~vj!1mKY2;5<|1cD`v;^*qr= zLc2W<+dBya+|Y)qH7UHgM9p$7aDoz14%}E?3UlW#-hVTM=^Ik_AnOMm*+)YSbr>T| zUiNCdOC8&N2gi(l68cF3p_hKQ&_cWkidXt2L!tq z@~5R7P}LXI2*}Y?0FJ7ikEQB-Oq+z6mb1@kCY}J+JYRR3Dv)NW;Z&>Xrjq(-a3CpM zs?lH%6-d=_>M5)|2nPE6xQgXYf5T|1rM%60qgm=@nEMs^WjMf}{P#%z!}87v(M$bZ zp*Ns)A696Fw;?V)5BY{Wm+re4|NO(kRS2|MU$rM%>oN7x`kDIrvU8;7g98E>_LEil zB*cr@`(K7d9#+Uhn5n`QXZM4Pog1e;tr@uEdw1x-b#Gr~5|~^I?Ge72JnL6bJw7Vu zaXc#H2~x3C`i!?fCbvHp(!NK!H8N|1W_>_19i>)p0iI^NBT{}SwmU#Qk?D?bN~K!! zvfjqy4`Sz(voBT59Q4G9Ik7>dh0r7B(y^Krhfr77Vy#Q1OSmTs_)2Bsz{2XH_S4nQ zoePWiKBtEu-(jXuE(X1ImV_B5U9Xef|8}S)jd*tDVe2^G2*XS-rjzDiKjWU5CLZeB z2<|g9z-Ecpm61{rCkL=m0RRciyZt)mbvE_wr+1`l!e7N{xSeJiFaA-Rge1>K_>VJ9 z!0$S2J=t%0eTS{V4e&Q~AGTyfM1J*9WGZEj2YwoLH74gZE3IQ8cx(bZpck7j|C9Ze z*N-8i%mpQH*AVc(!ag|xJJGI{0-uy%J^_l5Xs0ceNY@=QMydW{*wXbY1&9U*lquxt zzC)mw{c)7-QZa1WhTth53w#gT>QlwjeTR($JpQ7F0Plyb4GKh&a$W;kwHYNfbztde_|@KOH;LRu(*0!3 zv7A6m({(&GJ8@Aa2`zo`9pj?QXJ2#Q{{{r0`)8PJL|IT5@69olnjI+ascY`syWm?( zN9*Npm)^Mru9W-WJD5|I9iCUM%HWeV5T7JD6<_+oDxW97k#(mGsc@u9x%5Td0ig)6 z;X%C(M&Imb@#rwsHl3+eTHsmNk8q~!YCQxDVlfJ^o@I>?p0pN%b0k3sA?@+HNSF<9 z%r*=SrNzvH7sO6t?upU+jo-&Ga~n5!=+&XJ3jdIQZY2KBHm^%>ron?3oCY!`1IJB_ z-A=EI0lSSlZV0X^!+SY19lGmsn};mN5Do13=iCYjKZp@hJK zDES9^VzhR9T@2GDbC3V@_keV;C;rZ;-zWKp%4s>y&Ytp{onhRD1dbF~LGxbW#9#$6 z@=v~GtAWkq&I=DZms%2o-%IT!_#1-6F7s5BX;Ls$Y@dLR@C1jj^``Hu)xyw99r{{`wzkq{OhRZ)WGm1zab|9)cMd-Pt=o(?C3e*ngJX~+&Gj~sA zFmXyxvoNtNMg9+C9;zT8y7eVt+`Mr;0o}BNJW<<3%>AAeZKTD1PewM#8pR73fLg;m%;{1$Q9j*OrhJcmbz&p5@EK z-v2$3pSxdDh~g$0>Nsaq*G*bcxXBxZfRqT6xaafD$3?E+KAr+b&V!aFw-@HbQC0<` zAn04eh8lAIiiuP#?%l76Fu*qCzZMlT)_GT>crA?u>!p?CHy%(sXnSN@whXq(%d6{8 zg6N;~AceT+d)T~jt8;>T5^+W9{AVJZRW{P^tQ?LBc?Wc;t$qo`4Op^0>t%m}4r-AR zygl2g^jm@766g6rk>Xcr|j2N0~4iUZ&#nSmNq3n-8CwgSDgpb%` z_-9zOAU|m)95SA(jOU=qt%Pg6zxER0;x~mZ%sT>~8XAbWW9H^|=SYNqK)G^QcMf13 zXsh#^_zZnM&z@(3EosI}&E^5RoXYUYXB(($A045)84R~!2LXBIj#!h$I*0~!_I|q9 zn5@+D<4&vPO!J4C*g*vfooK_t_klG3hKeQzDZ|){hRH-5Jc41In;53?h&HR0vYI(U z!xYod=$KM3?vn&&z1pOmF*d2dCLiNl5d!Il1#XMqu_>4NW3cr=k=FILvVFOdvE_z_?2s~it%MLJ9GiW5T4ShPM zk%za|&ga{5Yu4M~8W(V?iZ~y%#EGHDgL>75C%G@2kyL1^2{@|A7fJ-oBdYAN+KPXo zIH+FkkC01sQIEARzg>C%_0E|S;OXZVw+ocb3tZiM;*%!tw&TSEwMRk`LGwCFdo)*K zoI3)X)l?+Tl(30%@^V%tUz%5>J9DE`UgyUB&biyX;OJNL?uTzKKlpp++(&Rps5ght z^YH+h13z; zZLpSX=kjNr^PjjE{sPxTCU&2~5)j=~4k|SsBqOTVhw%gguMh3uNn1w)>UkSHKm0e{ z`+iJ#FnsS1TBj)Qk3f6@CIg_3q*`t+mbcf*(^QdVG zR!)PfiS^PR&ChDJ7M9*vS!OEWrOzwFi!pN#dPPFfLpoMt7fEItG3Cea-twWG#{eOh zQ10v*Lrm}Q`-tsbaMOFPlnY(H4v zo2^Q1(l@;s8}7vr2DAtrhvc`DAVXKmXfsFafX(B{Csc?Rf&Z&lH?KY4h|2 zU^^<-nNWz~GEAGTlq;=c!dDoB?cfHa!GxG>!=7l^%_;FWZv$t@C}kFe`Vup2h}bME zy?@>`TM)9L8HU{pmpb3hF8yPEY5qDbG9-Py{n5&Mr*tpjlCOz}ZNfT6!v~!4;m?p< zk8)Na?9G=&%hdGrBl$chMLIk>pT4^M*{qe%YwaX(3{sx)bv94-5kul9y=fDt5-e(A zS)#NKm5E}>?z1Xo>Ce2~nu^Iy>E)Ti_LOZ($uh=gKuR+fmxD40m634-8s<(Sg%#sq z9EAcKjon~>WO8wNFwG!oPHB!9tUT5u6Hm9~`CNjqFyCg?jx0n%4*lU zS(&UAs|YH;@u#rrfC*zPy;yV{)I(Zz>04{P?8W+O7k#|J&WjQ|aegWbzOCMi^)A-e zdbLYTGp@Dt&xxnqth(W`;Zg87TD&*E{OL(vPT}mFd;NOsal~(JCL5Kq=|lpk?%hup zzxxcF)KRM?@BzRk;7kdys|n67Y?q(1i)FhJMaEMbRVo38jRvd%*#?nZSery^N8fA} z$D48Vs^(Mn`dOsNMP^lQ9syr&CixsFj%PDAIFd!3XHf}~W6?>D2W+kYBJ?l;65TN| zb9*G(`A^)BKWCDZTs_H1Ugjm_(wxr_*<_>;diVxtlD|y~-sRtS#&il~=Hxx`Hbh$m z2%;bfI+Ke`*%=2M4UYbtfcyclksZZDP04lFWGX84ZRK(UjXJBJ32WM^IqG!q6Zz*c z8O@n-_Um)S<|}J78|>#agZ?v`lF4GrJ_1(>Ycd~`M}9_AQLe4kCSj0&M)NRTEcI+2 ztmbsFT2*I*!SBs%^!g0_O=Wk*THX0+QQk-O7)_x}qOLRTlx?1a)oH|?rMQCH0%9_( z_VCl|>18wk`jD?_Nnc0VX9^r*nDAq_e#2frhuP?oP@9@_#+jJV$c#NfGUGX8(gI|P zh|b-)YTG41(ESv6#ro>N1u?{DiGi{mf~(NAk`>+$sD1RnHf!GJ!%X9DIbsjNF0!-Ja4Xn=;%+AuR#Aygr;VtyjFA31bz9ZJQI8N z^;#bA2LJPtoY9uKMr6=nbg(va;eDcrys4RFM#2g|$?UFFtictiY#W$zj==di%3i_w zs9J)dy>Ab+)Tu3jb7exiMI?s!qYTG&LyH>G7j?>MHS5m5_;Cgk`0vxqn~MLx9%gLpKdZBh?i6;AALANr z3Z@S-@O@hb*6L7WpXu3|#$fRQ1<$l?bzVC?aHiQU@V#g%SDPvmEcy2dt3KO2Ou4?$ zG~znSUmCD&99AlPshE;$b@L&daLMngjAtQTC0+Ojze>7x&VA$NPv|O%|Kv_A&B&{y zgm<;-^~9EF>0t5ReCHY@O-(Evh`Sz)T}yFqA^OG6k&%Ch-iABdDW};Y&%o|jlK`#p zCINPB__X*a?f4|KLBRl2Y7RUc2~&Y(9$)ua^=h$XPhoXFNU*9<+L34dnd6a0LszC2Yz*Efi&SsmSv7t52J?g1$Odrhgn zY`2P)s`O3oM!kvksr$Bc3AiUGymCbDWa#Z6pNha4In#_dA-N;Qk52JFJtB_s7_Rw_ zqlH?r^^CY|1E1{Yw;ce_NB7h}GCiYs_Kk-~@Coph<&RJ6IKoVl>yQ~1lyAC|NYJ|~SBQd^7mi|ZNT7sHe&g5j( z)`Wd}_5W?Av)AHbK*?8^k|74&2rVj1lKBa#Ac@@N zz@P2ZCyV#qaKCz$Jh@}tgrM`yE2rseVffRW&Fl~mM zHG?P3fSehOOh%?FKueG)V0goZP_hZ0%yi6^ot6cOIYFLEax$1Fd{5aUt!tk%*5$r& z%TOgciAEhZJI$GCHpj>G32!+x39NlN51EZ$8ODF}@E}yC4QC_k%nlcwGk@z`xUe+; zcIU%uA#N8T{3CeDffp^|M*Rp@5y=qLrGYQ;{S;&2Fnlila7-%7hu${v;G%#i&kr2_ zI+>Sh0$kW4*rB*!G0-qf@MSC>=`3aeLn&XmrcNc48NX?y<3#7)wtf8QTfY6B`|;^j zkgjai>^<=&}8>9sGGUcE05v8#hjqm&36?J8*{0YS(Ujf#0-`d3XAXpM1i zf7F@1yY#m^s~`$AByg?!N2H3fZ!jRTPzRXlJ^PdV(a4xW!6@7z&4UMj3i9GEY7nZa z893IZbO6H>Y1_Vp4q9q|)W3FdwJsh)0{5;2d&)58n8ToVTtDi&`et4$9(a}9SV?AR-?kD&)zwvtFK&4n~GEVfu zXx~E{OA1C_XTU*l=O&OluP@y=X=Rt*y|VPzxy|mviOxIU<$#-~nHT}nn;h{V?EWUX zEV7S7dbZ-#TR!~{_sc(9Pg;u)&Sly?nB!@M(d-N zv_vGnk#o{m2a4mCJA1lw?jtD&xEz7oDvk$gmK!ond9l4xqNx^E-iSym#Sx2#>m^0; zb07ljx}LzBcDDx@|FI7PXf{EUb|B%mn%^okF^dQ>g5*OmABG``FJl%nExC<}s=CW> z1FJW`;9i`SlevVJB_so>QXpNp4k`4QgeFBBf{E4AbH@CW@CLH7`t71?27As#%8SUQ z@SS(`9JlOio@);zlg{KbF<%z}-KI+DnDG{2ifcrGdAvPhZp?#gFcBB~vmmB_GbNm+ zcUYSp-a>@)p_zJ2L1oO-yPW=0y;v7NzCF#V#De1i;zpSKU3Y*dj~HR{ z@b2zlVnDP3D0@EG9YhQ*Hb7+06EQ_J&y60~W?*wXxsl+D@aG{$58-@~y_ESP@9)zo z^b`-x3^M}PNJfZ`D*XxqNy##hcPTKP%CLS`tWe4G6d0FSidFMNEfP~>i`w-4n=M97 zAjZ;!tP{LU&m^Si$g~uY3@*ePhC+syY|6$SJuW|KTjlN3Oy6d3M==a?d$G~X$}Mv3 zF__Lc?nT+gX~ucBLoD30e&y=L<;xd3m%acyoL{p>6JNdMi%HaK2=~hvQmHHK$B@oj z`Cg=6A@>T@1Be5sXh&hWy+hA}ZTmuwf^Bu>Bq-Ly4}xNS8|9$d%zH-2$Gib)XJ%mh zMnr*j2*ZK2GVkdQjba_DcyUydZdWaBTY&Jrp(i{jxPs3Ovfp1^zIk@>-WSP_iJH^e zg^qY-*`o!V@lub-b4c!XNXjiI#s5%D7-VNJQMELGH7N=EqsP4`ZHq3&$8xb-Kb|vr zk(AnLBn@WGPojvm%_Q<}O8lkOQ-L0LY2@gz^}0WVFsd;OZr4YU935yNT~1q4n(~OO z)e(jfWJXTaE>xY#Y=)b6gw+LeP7i}B4mBi|tij}vb?c_PZ~-4dK4tDZCz8KFLTyOh zG7@UsnWk30Y3GQSHzvJR2Y{JvIsvr2rkDT+7sy96ne-{;zG15)idkr%N^;2494g2A z();(^Q~#iZl4f;el)Hh%o$XS#6@ABuLntXIKL*|m30$R;h#Mj!LKr?|P>;Mv?f)Z$hyGEI9Q3x^>H+-x^^R)X6Gn;b51B^< zk3L(v~cij4q&G6unU>#WF#M%1CaJn9WFO=GbawvwY= zj8{a6Ao%EU>@C&+DhTZPs10s|yjcdML zY|6SqZI~lMTHzsjkIEjY4cV~QSUJR6`t17B+^5k&fFYO4W4XfboJuX5NvwvO_JdDB z{_=IJG9=dpn{qWGQG}@5t!5fRn!RS;TA8Rl!oF)DG%=9S`h?104f#qtEkNv87&C z7hBz*=B#tXVNQXHAmWI2Ja(}>5@PC-Z!x?+X!Y`JS0VSpFV&ULw5Fo3eG`fYUJ!Di zI+ua>h~dU^9EzIllH*Y41RN(BxABoq%43q72}J0zW(iUkx_fhw>Wd3LXp%2(Ch46+ zq(^TWqX>^%4&F__RR38GQnvyCPYJc;vq2xg2<8|aR*iqwNlJ#&<)-3(ZCtJ5VLzXq zL`z)krV0=u5`{_BdHSmKA$C$_)s6JnV?=CGC~I0Lz38=x zj?s&DL;-!uII&bi4Ql*hVa3pM zlp-@gr21bA$N!Po{5*oT92NHS{Q8I>yg$Ky%H7WR=<%0!6@`j2w%SY;@1Ox6 zC_abTW~!rqLbIecX%3#P6h-k4(vy}>pdLc;tjA>q>i2$vWtja|L{sP&3*&`$S}5R* zdINN#5rq*u(X@vm(oi}_(zO1rA>|+w)Y+5F-3=%}XeXyK&N!zlZ&s>@E8Z1I=kpsY zA6{BsSWv5mC)=LmM4rAlvb{{DX16*z|Dc}pRR{3ckh$SRW!yQ!CE3_*EsR9Q=Mu~kX}$BsQwS<6uF?oC1| z&90Q1jQGZ1`~)>Py~T-iAr5Y|?%auuv-MFE^h#eJC1#p3WH6T9#g>=5<(!NwV#UVm zoNF>MVSW5LJd|Mhsc3H3r)ih^>A%O3%LXqq6;jZb&)#v*U5Gw&2{#TEe2wOxfiqdh z7C4=fp{OqqnduLaNHrKnQS1ETPZZQwX5Uib=j)u zUVpc9{v^6SDWC_t0v(wyD`yZSxGTWUa#}?54`pO~uyVm0>S|Nqk#;%o>pFNj!hMx= zI4SoNSsC&0=BQmRR}V{97Xj8rA+wt;HU$%rPS`I)1KwrRr%N9K*tWDaU*mQ5xdx4P zkp7hhA`q!v4@KPcz`yb}j(=MtaVD6Wa!+C)2!33qCkXzbOb{L{{Wwz(X4AcdSVxIu z0!MdutAdgv-y!_)3PA2|^Sw6RtWAsb0gpa#Pu&mk(W#cJ_270mRIF$7+!mR~HaVnp zdJb!sFGFs)oF>J1ST<1$&#{K!27w%?b0ig?0-uc)o&rP@dhP2EN3{~m!dFYCJCbEM z_m_{c6vs`1lT0#>N#9Afv99f6(KazlASn)Hm8rD}zgR2q;^)x`K{@@(`Rr|d5Y z4-O?+G=rgP{SlJrUjn-clCi=~ z4b;vbv6kvKjL{D0SWq-zl#}2zlLT4T&!DwNDRz5(;UDJP62-rzKkiKOnnxAfpDb>W^lA@_o`yNX`KMgfuftG_Yefr)VX z?Y@tld;<{9X1`j#c4qm`Lg&NpmfyYHzVfZq73WReb)^_dxp~xsOuV%#z{*uI*`-K& zP__Wk?>?mL1HLrE{-8Gnpk{TGM4qP@tRkOJJbFbEo&6`%m6FZaGgx%RCRIcSu5xp+ zm_Qd8cY$_qu>r3JS1oqwFx4{k_(} zrr)4eQz#TNLp&i+`;#Bq7jA>K)qmM{=wDkCzdyY-%zI*@6_NUhrjwnSN zW0bM9xEQItWwVvvp<8Q#0?*=>7F+nkSVAN-5kdP-NJ&*zTVE9^7^sR&^ z_s;i}8*J(BeG1Jte%Lx_zVM36sTSfFlJEk9rb)TV=rDMtF+tO8ObklbJS{pSa3XY4 zaHEfC;a^*5Y=bDr&rlU48^3OuLN*oRTA^g4R$voE6JYb}p-uO=!72-W{WcUP7VdzF z4oYY6No4}F58lA1qh&FoX zNt`Zt14iiIUr^nQrMtI4VB+>*DVQRS*T`WH`|4e;>>u&;)3OVrNY@weUC=)B+6kF( zv&oAjA@=O4TJtD|^`=H$rOLO6ujZY5zjO9Buh0`jpZuSGw;#++0;1}fSw)sR`&ak= zIg|4@M~LbY>f@k#0~l5*BR^Jz zjLu$4RJk~O=BZ=Sg#`NmGc4pZXBbRZ{lgd>8Rgd_+4Wxu zI^@WQFKUInon&QWY5*DE4DYt>iF!MQ0=41h)v&z}Dm)Qj37#0a$El?=24zH)&=z_D zQA=<%;lZTdQqp~A9RgrB_4nsQ-u~Fy3h32GP$#TI5&+TId zDMD9Fs5w`ueJ7*btB%|AnP@z ziuGn~vRY9~FeTEs1k~g@7yn|aI0k}O1N=vdV`-Eq4gdrl0YTD{)}X?1H#$PM^5(eh z*@I02r^gXhi8Cl?8rWVsHWw*t66>XMXX`X}E6SoI=vA(GmWeG(q0MhC`U%cVJ3+Kk zFX{mTc_U-^zE=m#Xe1BFs8O)gvRUd)4L^-Yy9ZgfSZ~<7E6r>qR^(z(0-iE5!c5G# zITcg@^XlG zzIX3`h$$b;lBl|!e_jcdI70&Il+PuVbgEWCRr#b+7Bh~8naaGz@Jsa6)ysYc+34C1 zBbJ>8M$}#4FAr~`)OB&$45iAjMy8oKFQQf{RFUETO=NSa5HIDE>msr@LW1WQh!fy> zvtL|(Cro(qyI+s^$qVlS1t7cA-%nJ0f9e=@Qg9k0D9Vk2XOSY*LxR>of+Hn)QFV%) z;C5YZ)OylVzf+S3U+Y5b=XwJNkwA6u+Ip3?wyL5z2P|Go(8VJme4{sgYc)j>d0&_l zEMyt=`(1pFM6KtiKgz}iuUbz~wMoK7ei`*gJ8CE=)~m&4h~+N4##~t1KB*?$R*`N` zXKPX783Vk7qFB)u=>ODhtf?HOd@x-0f-F%?=He;3%p#ZZmLz8El#O2ueP?AYMy_P| z=L6^Y!9oV!opfk*DIQj9b{!StB=*Y>=9V5_iIotoa2J>2A)r@H*Gw+{1K~0dVuj%E zuHEk{VjKWPS|3lOUwZthd+TGvDy@l25$jZTkfzQI;rjx?VG{V}wfYZ$h5gsQaB6As z$Ikq<&iRv6mUL~qUMCe;*u{{tr-+puGkuK`$O=q?F^SpGvayQS@va< zb&OcVV6QknxV= z%REyI6%q*MG^N*UaeWppGy0)$7(uF@T8FINb_cF zpxPt_RM|AYHl?PG`Q&A?Y&5HN*j>%yXc$>)s|;m_1*Q-)6yPACqf$KNKmp3VRp4t` zkE@BY+O%-uVO&}5=-wl{tvTc44ZU0bFs@qzj(}m+tK|mqfWXrTs#~AWTaY?ZRDNrp zd1v|I!#;QJF8hb_#aj9NlUZ!&yFGhv<77PT7a#T_=^yxqI{f| zM2$IZ10%B`-ZnTce4HP3Dv=|zDOk7LamikuAQDi4bH?tn>RwS_ruD;%vQhRqI=?|``z*7+3($le{WyC*1q+(mA{>BUwxpA8OI8P;^#l!n|TKx z{t_EJT*AU;LW;A-#_~Kc(Q_M|Djvxnc1q33!A;Ni*N()AAmCQ-5%_qt(*U1mw+EsmR349(mdDLBu&zQ+F?$ z=WF#Hj0h21wTKV#s*g)W@U^rf@l}sCHC=8xH73vTwdOTh2BA0?OwkpF)R~5V&Xd&@mJ5141DOh4Iz9;Wh|Z&5zSka z!>d}KVnk7$u7!~{#&gTP&_rLwxHHxRy7fv;L{{%@`-zx@1uZ!)HWUI(MGk)3hyVk`Ue4AFRNwXJLPR+URKZKyb=v`2^ zG4Ah|+yXR&CrbZ}d{;sI97p^(3Zs19N7rO8_bqEYy!UF|nSgwu`5IF(dwzy(^E&qX zbMBc^mHG_y21jarYVEemLDk?$;iT=;7uu&ElB~;JX`9nEkYTn}N;~S+T2{AH&V1^A zb=p01VdeO2`}E(Xf=)uW+~w;s%E!uegJiprqMbu-#dwkmRH}KmSmbq`a6^_l#<;x0 z*07BwF7yNzo^tiZZq2AG)b0qQs-lJKUd&9N9tH(G;(JvuSDYX4a!kQr!}+rf#SG;u z0N!K=U@fnmlt@Tk&u!)M z_R)BB=8I*&nvH)wDUp!VJ28+QyPnK4}_}+rK8Q8jbk(eaVjOdY1gM1b8Xr>D5#;y zW~@AWF#@>iJ4@HbzD5Fe4q)HCmYArVVMRO>(^9Uy6lw(O0ytsxsJ14{j`G1eO8*q# z14D-44+~t$WT0}4u~ku+|22~y>pP2Mli9IRHKJ)uUTXsd=m~slbgRWag9~=X$P4g9 zyMYga3FHrt!g_f2(-`baUJ?9B>`LgiGEs&k{G3U#3L4fGTvIKcp*3Pj8rpLqn_0?# z8H*XX$$3p&tPfMh#q68*Q7s?iG&^Z~EzGQ^q*dgZZMve+YrG%2BrAFx zU7mzQo?QChMyxM#0@IGr6=>jep9}&W^+ZXXI@jji`ODrE*o>C$-eMC0XFjaXZ7tpX znr7AK8V}s#xchjB< zPJse!Y5dBtDK#SFP6xG+TR%NCk(&_7`t{_`K!NP}z5~*C?0{h6iGQ-Pu`5faNal)* zQJk9*zp2v2 zF_}F^jrg9H9JX4)Q(cb63_YNubwJJ>jHjC#a!&FEf0yZ1(Bt!zTsTkhE-HUMuHs#9 z8u-f6-P6ktA9l-EK%0Mjs=avKJ;e>dKRuXfpZzP_C*D^6>A|c_^Dsq!OcLp*p?dB_ zUp*Wu0A~-9+{N1L1ECb{IAB29K0I6?w^XA4R?mThdK_#O^FFhGJb4ySPN}&|PCZbf zQJWNzuvr9EHE;dHFt7V`i(l~of`=ye@}c@9oc9vnVt=>4zt+Ao%Xq6s2e6D{0U7gc zf4I;-!)b-BXG$tb$BFsS8EEZ18MH#sB{OLnBV*F$w$fpffNLjU*aoWAdd|fKe~1~w zbh*9?8Sc%&*;p_UR3|<}nI)rg6wOCD6lBdhOKqiPg?!urW~lQ)#wCV#Snk|4#T!Ov zk5gzjDs3;;OCb)l3F&AY{VXTgkpU1H9SxV{JQ*|yJ|ak$VaS$|;0%2QfM=!S^A*{) z*7b0QOG?^e8E=sl-lEU9)j9U+BUDPT;n32$_i9T&T`?_wT5;4HCjaIQ0hPx!dU7a| zA1443H1}8bSLm^O{;YfZBxDTu$4ATak5?|v^M*@z-}AWRzmC6?Ng{%-j(j;*0tBp# zzk34a=#fd7KUxhDdrN5`V+atyv4_yGRMATKN)x|p{LxX|3j-3T$-$c3|6;=rp449P z5TRrXCmLJbZV3*2HIbOwVMKlob(Eow>Z_69#zZ}?w!-?AZ7+K?J(VSLJV1#0)X1H< zPBe%uaH%%1P6eLc_pFjJo0W8O1fbx9HCof~*G|<=)8>i}d z#p%JRe$6=cc@~pT$-`qrXqq*c(e=S?rr}{xlLW)S50vpsOQSr``Q{Z^Zz>AT^JKHr zzw^~1XapC(VjOho{%MG~_~d=}{I~9|fHiLJTjBof}NAPYt zJk`+!x+h$sW?m*S(npWbKJ}Z$FW+f@cBTFC0_UmAcNW}7@BZ}Q3{#Y-q63|BbYH}t zue|-(JuwGHiN`0{fdT?G)-_|gRr|Ylq(lWt7+6q)*TUNp@N%(rd{$lvn)v)PRo_vj zWmCRT!si;Ltt1JA*NgR*fFTsaH7eDn#lPuAUJC1i4|r}jQ?4?VEX>g(p^kMG-d&z` z?Tpz8LtFjNysUv-dS^1?^%dsl%kd@}Do{D|>|<@vue`H{U{Ilj33=zS_cNvt8<4iK3h zAi>@TKB$}W3i3IU9%ITDmb&5N0tE3)i26++17CM+E%z}*+|uK>-trV@#fQqfp{i^=ReVKVz;q=#EZ~jd4v6<4}`gMsr0vD3_MOIW(<3F@7guI+Hv^1z_fyx zbeAY4GXF&QxnRgYK^~Gx5>R+-5S#fC&{=u>js~jH!(= zp0^z$8tQg-6d%fVS`%d^l|)`_g2h#hJ%uMG2f`)+i*yeEi4u2mtCqPz3f$`~bS<;DtYxbe70|4MU z4#hx#{5V=s6mvtmG2@UmMzht*1S$|wX+%#YdSa)R#zKH@%8HGz$s zVWQ5w%_c3AsKp7@pfO!hDo{G7R~;iW>L{5^LHs`fYWtd{^b3I5n&bsm_b3WBn3jfS zibXuUebDNzPuSj=R+jzSB?#`;&&fs^|9WZs2V+8m`Bj-QTR_PVKaLMx_EdD9z$&_5 z3T9Aym7_p_B!b=AC8ufXGD-L|{fSNz=E;hP<|OgZe$TOMXFl&DY!oExc^R}?rn545 zCbEY>r2fN$W=(YI;p5JSH%S9Irn0m(bW|T1i&c%6VUc`ewQci2%i-muO3;MGVF$FDnil$M`iN z);Om9&I{58m=ag^XD%*ZyU7`ppJ+D7d9qqP6nVKpcVWc%@&bk>n8Y%^C_;z?7T#+J<)}h4YmBO+lHo^49X>PuvqX$Qt6;2M(DV zis-)Nq8P`tBsH4VGTfhz21ag7lrSc07_xAo_8;&nO3}L)&6;cgBul8>!yS(j(nyX- znz1ErAmnnJ5Di?iP>|sHB}b!x-ySQsX$fwSwTtVh8{`nsL)~25CrpOfFkP#guh!up zlLicuZODL)8AFq%VpbESWO61TkYQo$SJ+z2@GLZnfh4BEFSh9zBGKR z0U@IUClk262VT{Sx?+f-bUk(82?So*FHEweAJ(bN+7<1P_K#<7(#AYY8Kdn~?Z2De zr{u1o+EHZJEi+2v4X}n(Jt3KmsYc@PjzMr1mDh=p7E}|{2qipG6$gYDBqm^VztU@> zATv-+?l>4CI0kl$>6+9d{jen73WOw=?CEk~X|8=~%*(19l`p?3{%@HmW00!V{t3+B zYO<|#LwKoK(MAxOKsrpMJZQX_`#Dx7PM%J?FmYmaPgEA~R9$#z_j*`0+Ph4bz1m~a zcZ*RR4uU$i8rN*T0#`$Vlbo1-GSiG!#D;0lo-SQ0J8Tj9;PTrkH|=`11}9ZbcafiL zPL=V-RX!N}9`a7po(j*|xIfdkKclDNnygN#S-9j=K}w`6d_3hM3pfYwx;_g(do4#h zWaaOl-OTSJpy^P+#_)2n0aBR5o#yI(Nrb$7y@*&~pblDnRum?{tcxJGS{X46Vd)Gv z>V{^#eCn7ql@=wwgh7hqMC4YFFLMDCP(yr8iVMe~!D}*5z7&LQD)`|yGA0T3|yt(P)Gh9=XMl0DAmCkajYj7;X!6$ikns-&gQ| zfA>=6fKr}>HG2hi!+5z`t!MF1*tmRzeU|rRpnt=2IW>xmkBK*`RS#n$pvGLGS>5Fv zu}fJ8Qypxz1{e+WqYQ+8z&ONx&H+zX$Mh&X=LqZo9$P~B$aokEJf}opy2`@mjqhMF z|6tb}m?n)zXIXa_~62UPxq&RqF zl6{)CESVw8TUk+ zH>G3I@C7ZT>7rU&lc|Mvji-s8Qt_BYrj9}D80{j6garj+Z@pM)j5A)2PniJI@@Jsb zi83c?RH$y8XD`}TuNRLN#_QE7Y9-7p_&#Ue%F1sDykUY=R{o$HPk3ef4;ekg@d6yv z5wKG*YZ{y{3&3N>ecADFM3)ClVWh_F3usNmRpfW{VvumSXLRv_TOh+g!VwKH(R`@d zh+(XnZ-j5(Ndgnw=|I(E7W>dVAB5W}5NAX$Bwr&wu&Ig?U*pKghBj=djwtj0T+Dbd z)D#uPx>L+!(m1%14%{2&0+4lfMvvd{l4fRU<)!b~Qc^w(lu<}Aw|n`AY;M}EoRswkPt!lYMUPacZ&A0(7 zo^^;Uw3?GPn@SxwKN}kxp&r%@?2+l}IFp=pnC$}_L*xr%oc;PK$u{OJ`Nh7C2gG@& zpze?_hLSS^W_1C$2JX!7gk;JQo@AlSl6L^9hiL6ea0`Zcj#~QpEX&2fiugqZ2NAe2 z5HC~(OG4K^zO7+!2fT1_;Q^n`<fS=@yhoqK!T+3|0 zSBkVFYqLRHlE(hlTXH5yB?5pxpwm|~`)RW+c$5o+t50j*k`l!UYG<^@;pfD&2q3-< zObiO7Zfy{Z;~Qq`?-J49P;4}tq2MK;n^-1?1`o{HXXGpg^2WhqpGTTdCh!q>XbQbx zO|f3^*qa4nm|(rbJPU$_>YeCLG=NK|qA!G~E*DN#%B4S{6YfFGgWSqTx0#O)1|3Qn zCYyf9WV#qC4Ci%QoFtJkCBbnUhnBv7#u=P(Cx|X7<0e%3P9m}fzQ->E5-gKT=|y00 zToT2%;o~{PN9-|Pg#oP(UCXfX>Ei7%M5E{h=n@1uD)_dCVGL?HAKgwF5X3HJk9)m= zu|3@~gyMNZF-f}EdGwM?3^lmcNf(%lDzfVf;|)8(ApQzDz+{D+3+`Ro>?4M3P+`G? z@NpnvPjs>=Q+AYY&J+cZ>^U?Jsin(0rxc8s=dcX$;vjcY&l3Zyj!cK?=?L1LhAtcA zB9rGy2Qnpsfy?sv>@n0yMDCbg>lo){VhNaJ%l)M+r(qSX27^=w831hUgBDnK`N!7O zG^pVq{95D$ZSkZaY-3W-{Mcv|{488ttj1$PzV(R;msb@8ep@hMhlStELSDise3^D* zGFK=GdFCE^b{VjuiQQHG&peim#v~FL)}F zCcRm5>U#7tJ~StxNrDeT`F317aX0NDVdfLq29!xDXHG+7rZX8;Pa<&)jhzTCLB(2{ zNNmMgrJ}0m)~D`%gPR^-=~pGX45f0pT!X|2BoIT104Nm~BtX6gXdHyD7>ZhVA>m}Z zU?qOF1(k^fc1QItK?0uigF+tW4hfHOM=7fvv=_@ zyG@x|G)}dLyEDiLk=zH_wMzwZg1Mz2zs6Esr-ox&Bu@G+6_QwPcOF5om+l}p=q8tmW0sHu1$SV0uM`gzSc}8e`kQdi z+UmvZ2MnckCqKa$J`>cyGm@x_{wrM0^bcQD|A9uGU?j@08Hon4O7BfRgjzdy211N}j& zdB3}tckWPnD?1aD&C%)dXqR2SY?lH(ju$Ht%UhgoR;SSHQy3>l4P}KHBdHWi)h>s# zt5^vxu?;ofB1Yu-RY1E&U_?;ycQr(SU<0FS9BnXW9r;e%tJ?Brk2gn>J=36EB*<%~cZ0)|Z+36--CY`DGbFma|42h)j$ zNGriwZ7Y@Pbo@x**vASm*8fzo@n)hiHl|0}pRYjkNSNS=e7JZt5lqoG6yRjF(L_}$ z2{f;<0I~@1U4(B6yR9vC}3r~ z*sw>MP7E$3fcOQ-s4CFP^wg+bm+=WF0d>OmZL+1phUzk*gAHR6RpbreIhCo7kAtgs zvBnD^(GU3JfH$vVt z%Mx^j(_+nST!-*Y!>EVtKk8t#4rhD?m{wE|tbIXh8Zn7}K8X#RHu-yMe4I^xq*1d| zFns)G7(YpbGaqTS>S4P+Qmu>-jHEr{XRlRu(nnG3EaQ~Qc1q~*NdnMpZJ6N0H?~t5 zDNQ$zChdZ?-vP}Ntd5K>pypKF6pwV%4LNC!u!Ax&ccoAE!WR*pZ4kY^&@Z1iC|U7c zG;yQ=lI4h?jKn-*;>b4k-5#QhsB;Lq@aT@Ig~g*O$!-UJ6UFqgkMU}K%pPGp8c!9b ze2UVa6s21{{#k;>6CI2er%T{hkhBM{ecbea`+Ps!(*pyWHo(8nJ>UNV{QKJt1MIm! z&%+D_PTE=GM+xRgz-!fdGZo}L@Iiv(>iJEZHg58DtDnWx(>`-*Y4Q4#GW84(|DN|i zd8L1PFtc-b&&CZFWwnB`Soco2XD#S$2rNy(B43-j$OPxcb_Uv&;98A;w%fqF|pTdx?+_YZ(!?3k<_ZA<* z`7`Z*o?HHE#=Ug2bLF%o4#Gkx*6tlv`|1Pt0i*zi$9ZrR5l?28 z7j7-xo5jh^4qEQ#_m}RUr8~RMho84+&O?cWFW<3x&@4alf7#6jJ0x~j#_hUY8MAwO ztsbn~Jo39eZ;VicbPw<3;#XcL?uiHP{5|ZUXKbo8a)kfaV`Wz^pKD*aZ%x`qa_qZ4 zV+s}@rQOy+iA=!m+kn|}mYGW2m@JI(4k^oeFVweq+-t z0~6$#SqpU35vOEz7T@hGo>CoW1Ei*Z|KX1-pPY1WU3cGo?7shy5d*Bn+((_$-?}p= z8ALrbwYX)jG3`PEE$4GrQdDSO%4})DLpjOp^s*f4AkWYsY5YbXQ`S|1#+eJrQmf8_ zdjW=qVLPQk7(Nqqdqdlhr4d?TOi@HCR_v3S@*m-?!M;UJ;V*D3&t$?|ldTL#3Yl}E zH5zlr-n5(CY8F2J>g05dPXPXeuj#5P^b`9?jU8}%icKc7@P3s?al-{)J>_fZLEN`k zxjE3e{45T_p(1)q(Wm@J+&5e_rEmBT_-12&_&1Gawf0)&6}Xb2@1zF_klbMMAd~lB zsh0Rqr3VQ<2hYf(3YO$2ar5PU?a~)2_&g30_PSR_pZo;A9@x+y^SKa?rSHWf0I;dQ zKLP^nc)AgeYDKOXzh{hfH{Ya!$zod1$DejSy5yey-2Ljb&wU}$=h^nhk2=@yhol)b zryn&36sUg8Mz-qTTKimnpETA3VSF#Fy@8LLhXHK)*2VVxKbaV?boVR?E7rC>yDduZ zxpepV@~Iyf3ue2iyuH}4bL*0hA&Lvfao{A}H#z4`&UL%xxGA~qYB+7TTy}LFHZ6Be z%UM^!RYCT-GUvW`4K8sXoFj5xx5m7;d%n9iJa-lRc6Gc~@L9yox;ReQ3Kt!H0r1MK zE&!tMYiIUed;UF=RRfU`ntCh)7eO7{y+dwQMgO7}(8&(aVDcQKuWqXF-l|NO%Pq!U9EgONK){d= zP$;$xJX1tE4=yY}dcS?~$E62X-4i#2qPgvN|Mv(QEk|Cf^q_*mz!NeX*0DVdHBQ5R zkviJa;%AZ!mxn=I{4q|M9j5KZI|-(#UYuUvGpKMg zjpp$Q_u4n^xpx?rSihYQzjJ5jAV)TO#zKEecCI4EkV_;*rxT zF^bUigEr7A43c)L@}UJzUsKyKkmAHeSn^q{ybb$WoWJ1dTbuOa!liZ14ntVT_`GoXEx!$ ze8z`;69!&6(*3dS)mKbu7YWQe<9%p~Bw%RS$^|kfr7@uuOC>DI3Op{Smk*ZAVPhb3 zVJ5g3lbKTrdVXpRWJl2EB&1S+aQ$sH#|v4+_)|Uz@D|WV%!{Pd0+3w@lSv5J9} zFWx1Y4ChXA8YQjkTz=O*_wmXpF!Yl0Oxm(A`kry;KU=wU0uDezAtt2fCp&+1c9a9rTL#+r>Z?M5>UyS2Jafn*%J ze}MEvqmW~V!_N6`U|bp2i3PP|e-fd?=j@J&x~Cp8v4F6(^zh2k-TQI-qTt#i4-#4eq-bh=8XRIQ`#uh6~8ZB9)M}-`DP+3hnQ|YpSja5dz zx11~N#J%%9O<+|^>)m=RFodAIcbSmm(G(vD5|y{qfrYXwjcG>Q<#J%50xJZ)HX9?p zOXi4EaUjl@cYpgYaDT&Eu$3GUD>=d_f#NDg4*8%3U>Y)8DRC7;NMqef!oIbdBfEoNCW~0n3GN+w-Rxd5PnlM;7ip zVvh|oHpXVU8-i6puh8mx<0YC$!mt`h#V9~f1*E2%FgW?`mKEEYAT{?MknKGpZTjimQAe1gN zCt{x5K=sg^ffp+58^#goHXQ7#v6WlY<~(2xr$bYNk}Z=P;!E0yq4E-5J?ZOiPqCAZ z{vyiGV=+f5t1(1X?4E+#bf0Qof!I(;sLd-sjv2Q}H#vcqU;DgAVq? zJ4u8@gfgt4jOQCX@tapfP<yg5&J}0G{crFoY?nqR*GfJ@!=oTWSql!r_Ny4N z5RP8P>=q$=*+ZM)beIgoL!0_E9&J<#8dJ3RsFRq?F35oQ1TaS@+~NoA&#olG98TG0 z2V0(WkG%JS@0gO)sFjOH2f>eOjX1SRO3?Z1*mvmKte(%}!WJuIb~%reWgMg@$Xg^f zLXF|XpQcz3BSMBiHkznIxwXMxjX$?>e3LyiRxMZSgNG*_Sb2rJfW)GegYe@Iu|I|Z zE4#BXmRkjblqUgV)J_k-*<6wmi0ZHa0MILmiFU%vbGn#=+B z5OkqWVwk;vi6q*on|^EekH+m(wvgp?Q*ZDw@VUQzg{c>7ICrefo3GWYT3Ho*i+*o= z=v`nX8*CSkO?I)EV-i$Ol~{ap`SB;6o2S=qMMEY9i|WrwtZRCvJLc5K%H0ri!ykaM zsIk)z<9$rG){k6|kIB#2C|T1j@m?8p?31zj%smJ##KWJdwCztHM|0CDuzrhkpNXM% z*&B-KRSLc;oz(;hK|~7%Bphtql5k}ZE}d(8p^gw=9tj1gwQY>(Oervi!=&msJrZ{4 zNq)3gnn2Pq7vzdqaWg(RW+&=SDGD87-(jhnnDWGdZ_(?zCnGgKcBvDO=JQFQqFr7C%V=tnjLq`)8Gu!7)mdA2T%(s#KI5@^=p(F!UGsuV|sMTX)?uvZu!yY za44Y!2Qc!Wx73IMjZKyEPKiH>;W@}TlWt?YITr;i`JI2JWj*s^AAyPP3bQ_9%-!Z5 zFk|?GwM!0T{OshyT1bp;!DV)=pchVkJ&_|8xva@|WpmGe?JMU0yem z>N#=lE@hjOPJ=0^+~c7XgJQbH;B0|ZS9XMC^JF%fnug-JJ*igPXV~tC3rly8x38XB zUO3tL_DhJ+TRgFH={zv*g}Hw*?)TAc_BZ=u>F#NF=C7UmkJ;bLk3VA%dHcI_%YS*e zw0OfBL8p+sUjLzwsa5XnM=`uy)vhEuM^95<*M(nndKt|%GFIx059BvN5;_0+ zW?%zw&?tQ@rF0|h&NbePekM|WuR%FT*I+|}LuJ>y5r!4MA0f@<`2})?gNmW?l>Lk1 zT3qq$W%!|)_z3)!K9 z{}=njD1S~SGsR?n=VhlNNrvqYAr#rYetG%Y8P8F^y>O2G1P1i!wFHdfm!lak8JU;P zOQ?I0gDcbe>A_4g2o!5y6gJ;;3oFNG;q%$mZf+P_*YpNi#{$IGnLob#<=e{(KeRtS zyZrdl(%r8;AFHK@S5QpvS(CM*SblMpXsJK*;CMYUR19*h?2 z`LRiMT*wclDxfPh5&3_;Q*=5{ZXMo6nRIFU5O+7wHNzyYh2=c%(|VOLRj1 z=Ht%&ub4)$a_t_(l1kV7Ov6BC#|M&FruAmZE!8QHmBeb8s*ZWGJlOR>gy2^}-EmF< zMY4o|w+L=#ti86mXSxOkx>w1Gg#88VD%~lS$bydUQ)V z95VKLo7?vz4Zch+Z3VqjC1|m(E>CEmB-ktRID=be*pF9Dzj0D+9w{>RWtgS7!2q?)T9ClONz34kNbwo9=`=s2iEqxKYL(yIcy{C-g4eHd*y4q8ay8p$gq1 zQ=PaQshUzr&wGCi0?+*Kd|@zQ%M(mFS=p0JQIXOy30SF zU^s;H{j0xnoUE2^DLt^xVtMWmPoW&x(BA_IgxO#4NAbw!p6C1f;SSoa;j<^o6*(e& z8e@1^ete3N775SoEBxf~WCO19&0O;6P2@-UA52HGwL2v#i6C%UVnk_*VUO)KI5-x* zdD28Ba;+}aW*Qy_w$mG zsv|j-=9A{^FIOide2|_iWOK;o^pC~P;^#~YmL+sT3_Fe(ZqSo6Rd;)^x-E3q*PN>L zH5((Sd5`Sl8u$6R1CYKR@Q%O*`d=KaKVe*uFRi4cpq63n^HP-@;0~@`i@&9*ehVlY`Ls;G=lQ=O=Fd;u3p8v-X-D{A;DA^CF}{)kh9S>RR=Q za&@J^q}3=qJLRN);hTY+L9A?@H1%8tZ?(CjDVgNB)Yy$3JMjsjAX<`7AAP{IA0X#5 zC*1SjfS`KeRQt-evI4}5#y(jy)tXb|zn2ysL5e?*=FN3(s*>}Ikl?sU2TwwOv;hCZ z=nsVe$R(2YvQSINDf2{(RC_Yq5W8F@JCuhVPKbx>IwaT{w6cX~a;Ypo$w^H`p-*i~ zi)TH8<8gnajbrp5xW-eZ9T=L`p8II|?48cyyZ`o-_p@9of!kQMlE=uj;H^^E{3G3s zlAqL7X3(^T=g;ySh#0~D?{$UbkJ~54mE-SFdP583We_##E{SeuAupnrot(}d5{bk# zJBu@7nm;FPdIZ6(RBOU4yRbVppMc3R(lVqQ8aE1q&?es+By2&OQggKcS`%wNO@ql1 z(oSMN^wCjDM@W0-0wuR*uY0^bM7yWQ%Ygi32yFE(Ozbsz_;lqQ zq>*-fo~gv%XA||}(YP4Lq;CG0GU}zKaB|0d#+OT+T4GI02yn!>YvXVHD{s$Ai3>Fx(mrTyw1wkarcXGuwNItmn!Wi1Kvf#T-7xRg8WuKUUaX0X1%dnWF(EqXj{NK6ImOa zx{n2lNI*$VxrPJ*5*hye?6Pw8h!!P~^-{-%AeHw9hzU(^>gDFcOr=PyjZApLRBRxp zOQl@593-Pxc%SjI%(5Q^2hzQo`;nW0)V$qG$Lc$l7nBsLRzU>DOm656d&eD!SQAL} z?}a^D19f|9NU8&(f3D;yv==_sG|b)qX}ZyL#*YdwMRTKxVvS*BgFZIM zs*|T)*=wuM$`1@_g;Szdl1AHOe%x9Gw|_W4UR)X$Nbo&Q!Z%``jyX>{F~aE z#3A)?9VQI_Yr=!FMtYCnHLmq0rO~n|GH`SP+i4|pMyqv3i3}69BNp54PD!-J=f=kQ zda>k8Hw0YzrM0ZF9nSyd3_bfrt6I=>$X;Pf-BGTw@Sky`U3H&zp$YZq+iOm zU=6&GhJ0g5Gby&|PYi`Qrq!tQw)2Ld+JG$V?al$y_!)(b z2ZwJO=ip=&{DO{|mNCg#a4Fy%9;83ZjMx0HY@RJ@F1ll$4b?71_Kh%WMK}$IV#t^A z?|QLZVq?rDS{k@QFfGktj@Z#^xug*lZR^o06Is}NpG!&umGNpg4NxZH2qKUIc1_*+ z{i@7Agtq{9H1JEPCJ#%;87HItx?N-EViqE9Fc%^gUS_IHb_49EUTa{yp35a-$jVu= zA#CS}TpMe^ss^4Qt6I}@5E1r55`=&aO$Y_YekNWP96&TT8&J7fB&774Pwq(HFEI50 zCj`DWUalS<^5bVwcNKt>I{=2xgSbGyXHidaYE|qc?JXSeWWq%1xbsGpMY; zurY)j86HR9bea&ZskRU=5DwG#ra;CqHvv;&weFz!#qiX0#){>n7>>jZX3#RM{djT8 zDYL;(RV!7*c@$>Sv&>LVVruB^dB)_`9h#1J{Gvq24HwB72J(Y|C?-p@a2zD)9n1%i z&oq{i^P9(J;r|&|@>iwj;QtM!B<2JxD766f+aRGF@dV4~f)+oY$Ek-;Kth4?VL=uN&M1IIAn$&JP}0kd=>?K%LRyNE}K)xk}pElSXg5~K8nODiG66Aq2B z`_5=H3>>|p)${!!;)>EY`O?L9&C^;&_3LN8jO|nuNsjBa2yP28-HJ9z`sKb<;G&X< z#|`vHc8zVG540&(9LoB`j+g0j!v<4Rg9!!WP)O6r8UN!=`{;PRIAu5Z7wYKxf8ERI zwEx%EF z@e`{x0Y*x&&nFgO4Rfuh(9x73{btk8WtN0X)8|vD3+jdo%vsbDh!Wrer#2r9f8D<- zO+4+bmp*QTP5I|WYI+M|K}sLFmc9UC0uOoctIlp{hOO$!8Aa zdXx0zrS(3R$^k_^Yc|ybr;T*0{anZ$Zu(KlPzN@J+{{KS4<+_>&)j!Ey|{GuEV(l- zfAy|Ab7|@B@#RxLfW!FRFWvheEzf@Mo;k7nw|h|wrsi%g7*aVKx5*P!)}MEV% z|LPDMZSpgA-;%wNJ>OKY;uMOtnq4Vv2j9XhdYY2&EO;3|{J@=^11J5vw;+u>x*M-6 z+f7THV&G=H8{Ahb)1WP^D>jZ+#w^e6Ht31W$4$Pnk}om?F;=WKr|UNO=l%gopfIgi zcrH_Ouw@mU3d6nRUaPz7Djtv-*=@S1T!s-yZf@VqJ*SzxR~Tb@4+S>>s73+2oie@F zv6i%*<2v*;Rz*768+wHmeb-pNFDOC>_M#iQH#ZYsetvXW6kP#Ra)NOyf;GX{y-1%=^ci(+X zv0XZ)78|eCYm>!_aFl0&89v3YeVLJwD!v~X$sDkremeZ6pxZ4npQBEyyoYJr@xd;) z#zR%Or}qairOD=0SzrSb#ZN*&!NJg)YQ7`oQ^$0M#)xYY9P_tY8SyFu!~@aGL88?X z#RCw?5^pycPqTl|hLr_iImj4q_!?8slPhNl0$u~3nTolosevK+9y(oFo?9?Qvqka) z4*@ahdIR5J_Kq!vktVD#==rS%fPilRK+m=QLwf_?#}|a{fztO zJ>!1)PW!Vf+HQf&Ybfn@X79D<-*ab9b{5}NdA3f?I?G1-e0FmpiX^({!n~0@<;}4g zGL^t2piaNFp{QA~f_8mkw3yxS+@{`vO)vBg4D|LF`k&7YDax)SuJj}zS0X*NZV6WV zf-oU47hxo)sWOphfX{M%u%~})RF&n+gp#wFl+`|eRr>93e$)Rv9$DE;tzKnk@9TE0 z=+p}m69mCx4E`9DS!2uCbM*OQI7`eT0#IQH-7_8g!fjqg41>xbvg@nUoy8e?#kBGE z$B#PK@ApvPSLfSrL68=eetPKoTm*d4iHEt^1WMt&%IdqWWnuW2m9^y!lTgGm$v}$8 zgLUC(5qKhf5K1YUjIHn>lueQNj9r+bN~2;4IEq_JIGMD6CUHlKkq6{rdaVTkVv;K^ zR%5CwRVx4QX}f+@h|JqS8ufktGda-mcNWJcv&bjZh&hORz=;E*3(e}pMA^>zoS~Om zz>aR%&BCN~*3m5d;5jAOFhCdUBGy*Mld*}S0wj{@mB<6ZwZV=~v30v3IO-*)6EUWk zut)H170k}RjcmvxvGqlbmeYfPS)4N2cc@)6T@4j zD*E14t-~+{=5BB;0u?Yp3u}fp)8QiH0YvaDQ&oB`r*tHzvMSVbeCcZW)|c-4@4<0{ ziOoD?1C#||>d=*&@}WX2=5T2XEC*91eyAdf;8N18c>Iw>fZvm%;6d0LA(C-Hj0+Dv zDP^2N-%u%=WmL-~*c^pvNH~tGHZpjkh!t9`Qd5y&6{ga~X_PlZw9n7p1v7HMjXkJ(@@zSc?P&DkYii3$&R{t3P|D;a9;q33 z^raUr@_f~UokcCb>|<|4a&VkX7FP>VNlx?JamXwE1A9P zw(5yaiN{mYaQz@;Dl&GXCIamuX8{eS>vqf}r0$GU2vjsmFa?zwB4@#y#w-W6iCqo3 zQ`21hoLq_KlVX>VA1m!FNKuR;x?Jg^J#(RbX@2GSWi?I1tYST(3NExqWLeNTW3EdNuRyLg zsX8^&*H_+t?4Fq83DT+ii$7YscUbPp?>k?=9e^qlIDqFF3hxJf@erQniM|}U64)3WTKXOE7pY>$kt{mMSYcKZdo_V@JAJ`EH} zde-XMFKxU1TJ^B~%C76tE&*F{c3Dh(B6Qpt$Z_=W124ys#ZhZP@**Vepvc0SFe!`A zS6U7@frR1`RVNR$l0f#9O!y*aa>*zR3LSa?fxy7XGANG_2}|W?YF$vh>}8ZtAaf>x zO-cp*uj6l13aB9N8pUxNaYdMe5i-)pRDs#Peg9R=|9M;ffA{Bqd!TQkmvx;hG#Jk8 zY=5t{feGPk!wxs=Ou)+04$h_fHp9Nk=yC<$1>49wUQn^eD#1h^V2uG$Bf+Y}>I{1c zz_U*s1J=XFsVu2LkGANNaSOn(?=yjgG-Zr7Cr(O4qs?lKk9H5+dJqfH?T95%FlvM7 z{j2fkHjZzyxonJa4BF(pg0o@silS7yeipm=GOxVxx;^C_fjW*>=etGs{2UN1)&^d_ zv*12@7Y^HtUv*|@tesF^P}f@6KYu{SPNHMH)ddRE3il2vXEU_=y<)e6gV%#qz_L4y zKRV6HY(^CEgd9cMVa=fgjwY|@BE#Jj6H@DAn|u0-HK*^;Kp#*?U#WVy0%o(VP(pMw zTgD1F#J%zQZpMvj)e4yByurXq70XR3WD10VCb-Q#%}J+GApM6McYMupvu_dEzh6TI zdw@#^@>Jk-;U`NtHW;if5uw)gMaV7X{0I&sbuTh(1Jsb~L0@g|eEBx`Mxi`MtW+a6 zh$&-7&JL#myuG9(;!5cX5G|2_mU<1o6+f2Y&5C`;LRZ8sGF= zyMJ^jPMzm-Z>jw7sbc}NLMu{}46WNogb)OPKy=!n-1(-1U7U=-<3nDAB_@69m?w;x z6f0SYZpB?o(86Gjimj?SUgWL_A3nS_4xe6dqr6FB(z+SL0)%1RaGEpr#NQPfwX(yG zqy3dkZeRa_T#Ke9-a72Wn=XL>1`UA7EG7qYIx$_}XyXe{`xtu6S|aa(bl$?x>86)3 zk#>uGpi0{y-jWFRyH~5toky6Sy1iJbz@PRQPpYU}hpeHUl|DVq7U9 z9*V*%3tp~P7(N&pEV48lR9K~Fzu*WtXtgv`O~3}pJ7+4l=O#f28vO)5wG^#vjtYsR37M}{E&>X&5Kc&%3DWW`k-U0PQcGLN5VOg0 zD|6x!g~*|hAeK4HB%MaaJPijxhFal_ej#FoATuy(mf3^*6f7UGcEV%8KE@44lGfls zKWFe7qUw#xn-!)qd)VrHej^jsO9C`ab8z~;Y)Pzq`RpCY(JdR)$;6HoO^^wD>^G7y z6$bpKee{)Ljg9P>l|e&uhD}JFE0zjodpU#mO$_6~Cfmgu)=Jcu3^d|J9H0$_xCfhX zuN~F`2`BI#DYO@~y=tvy0x-;9Sgj#-l5B=F)qT{E-|ut978<}RvwvYlePKZ?jOO-Y z^d6CNO-J}vz^8kwMRpRdxw`~I48O&eX))w_Kh772f)pr1C6i0LRSFgRu;R8N#~Z1F zju(q0ZjRvo=G+2_lOlkF+ty0Ev4ldDClS<}0g=-wWt7+gr}R5?wT$`JDUnO2Cs$CH z{Alqn&ct)rGp|+3KwoH>P~TEsZ(pd~4zi>H3biAPOz3N}Z3IE!ydJMQuXT|o*j*?lMy5FGdnh>ozxZ-jv; z82TiGvB4Ca`0E-L`3wwPNd7CQK=~u%G;MV2josvac-Ubl=Ju%)n5Xx$F=Tnqe2Gc! z=I{5^ZMYN2Lg-G;)C0d*ri^*gUctxPc|2v@j={#V7_NMsQ-M)lF0@lh+eICfoW?I6 zpK7VSwA3J1M@##yR@N%*=b{Q_+V8~q>VLMeKfz~8g(dcJf`yP3!2pd&x>8a~k=3^l zz0D^Z!$b3!BfF%6%U!OJQUYB1cwj?+;;%)mXX$gO_N;08l&n&sd&-t2p}SZ*w1X`V7a>Cv+KS-mf7FWg;*`a7S-6^SdG?dM<<-M=XXiQ( zj)S|!-8uLCH+W}?&H+KAlF>UtD13@mLjkrC?5I(lt}{;LnJdIpWr=aLS~{8v27Dmz zxb-v)Fv!3wb1fde!fcCu@v-c#OzGD)(^LW*frN9f$cx-7JgmBMjFl>VZ?iTK&Ck1n$MicN|Cd?$-xv3(9 zjpi&7B&>#e*X?oVNVs+DV6SS&q6?*wDaLvS(TUkt_qEt#Zj-{SG-$t!wS4h`>XsBn zVatzCwb??Qy6=AX+0y;9%L_L&tFHb51j5Rz%Nkll>?2Oea&Ldv{&+zU1K+rJzr>Ae ziQPP_!}Rt$1o}TX2c@z(1g^RFdcW->PICliE!fE@;UUOGn8ovxndS z3K+8v75te2q9rTpA@V_zoDIZFMu~+?F3w~LgNlss4%ri4aI}=Qg(q#1quuar!)6F5 z73)WHo`X3Q$mmHHSHOe1#ctoh@a6>;@YEm_*-egd7^?i!gEM4-pvygQ$Ncu16mt-? z7wSP>su3`Nx&THDA@5BXu3#MKH-JyVqFbB53nNOzHS00e?wXTH1Jl{s?1iBq)8vKq zIOW5oF$1*LJ?%wJ6mQ_ZTXa7={e-$f9~M3%%o^byfAEC5dIRMeVK}1m@#2pw7k`NB zkG-vjmHLaIfft)VbKzj|GMS=X4g~|wQ&ST)Ds6cYxjQFf!LGc>YvMj^!q9398-FPw zRM`NUKxMy~1QWE37E2R0p8R`VBjDBMU+#caQ9k=67y|&v{*rVUlb9(+y@Mdq zaIf5igmiaLxBqg&J^4?nQT)?`%gghR-1*CaLdTz8TUz`P+@z#h$6Bdl?E*twg6$k1 zhpbPBz#b&84%?f7m^g_dw4hXZ4dfjrKj+qb?)i!Sp@A`MwK4! z44u#oMalO+T_5Zq1SG7P0U|us)K6 z0zIenG?<_#J`Xnh64sb}V#Tv14MfHrzfIy7MdtO!fc7h1e)jT?0?hKunZo*XO8GF2VzE4Vf*t zEvMI7Ptl2iYivI{5(mgwHy?F?=DcC4#2^nzeG@gD@X^qo@y#9Q&ZCQ*ZxirW`st_T z71ML07{f88_KFCV#FxNBHxuf7mLxAP!yar}a`M9&fSm^Q6ee(aa}vHaTsL9lfOj2z z!at;sGb2U|GK(@wyWLMn`cn2brfMUMgNrO{@e}yh@wW|4Jew151*RuRetK?!F>l6= zJBzpIv{<@(i;@~-azXzcCCv(^ouUmx6a=!v-4mU^-;W^I03C2S(Xq>z$zq>L!tAwz z5+Z-5Ut3BU3JIonY2#?wXC&b_%DC?6`LSUZb~(qs3f#ZxwohMP?M7NvZKxiUoDa}^ zg&3erwpes@3FdMU#Ju3Gs5xK|BUQS%3pMafjhIib6^F1F|Y zX+E-pU52^$rbCGF6qlgw64amkX&{I!k8P(Y>+P@j=mlgN+JwUgB{T~j4B@WJ=5+y6c7)a}w9 z9|9M~ak!A&_t9xKRi=0yDwn4iRkGG~*3M4uBMp9b+=&`19qX^yeOe49RXNn_W&J^1user);dtolQTxe=H zSZ;DB5#bt9SO16}oE1-ltz7>HI2I0my^o1FPeTNc!%hjFaHCI-*dbB$%xxm-rMn-} z1qI~9<@9`}{q`5`^|_VBkC*4K`(_Aj8G}OB7^Nn}Sn$os{R*|*Dn5{eaonqSVDyh4 z*b98;X7#qYC`Qr#=egytW~|{ImOFQiA=3TJIg?YyXuW#4Av_Lu!zy_)07RDW!Byrd z9`_XCD%A33j*HshL-tz_b61{S?1`6oTmx7vm%*(TGzD;`)RK>-K_GlSl>AHGcT@e` z=zoa=R%&-a;B5OMrD$k!WC>f+%;ezD;%Dj%nIXVG;c z1w>kRITYmlIr}qwTzN_OfLsbs9rF<)Zt^lc-i?SZ%a~@TCDaP`lg7b7LiVfRNKVT7 z#jC<;fCe}eWI%UMtX#S-)1^w0V`aNoH!_}|!vQ?Rg?n|L<8kiWQSRTt^tFQRL$}?a z27a!oKYS`*QR%`^@ftNGy@dvBWZRm}x-&Y>w9pLtgwS-5HW3BBgya+1%GYO>7v3gk z7swn&?nxMLg+*_eAnu;~+CB01^88)UtQH^}O#7qT>~HqR(%sYU%wIeAAG5!gAAiOk zcE0@*i<8VP|K;J*;tgxWYR_B%f5!*M-RnQ}brwHxZ$DD$_z={>D0*SdU_p`fGNGyR zHSq;xS&>EdF`F=h0NOug_+Xt#281Ymr73 z>Z{dZ`0R}eBZW9R&RI(ReB_w>! z55c$()Ppo8kG-D~T8t#o*1`nTN%vO#MozYgc_);8w-u-b)F>YEQZr~dz}Z1mN*uLU z5S2%DH--wu&?b&PQ$WDR;@-`1Ftlhi!$>gm&F196X$BBZS32b??nAxYNkePp#S%KV zu63KXoE&rZ`iw;pr0m;3vEFnkZZMGJ0|0~)7Z&2 zSQ1OT9|9{$T|66j!w^=w&XD$zjL>U(6JVrYIX7w?TrCz%^Or)`$Bf~+VOMfu79)>z z%nEjd1KXRDezf4Utr8h|@o5tH-8>F0C44`8P3}O8U_i@`0JPX zIRblgTcyMl89(;@+BfdWOFTT`{9Na&+wNb_&_!&@2>8Bdbk~99Q(wF9-Gqu-|2*y9 z`_Y}f(fM+bYLh~e;fI$X5`w!uK#EBho9YFC|4)g=%7E=;%WAO&?kGc|Ecv+pVgcad-arIR_#xI zaOWSk|M3YZn}HcFEiSg-Jx8fWq3_^Kl@_drg{S*brJv1A?me= zh5TlGosP{^$lI*$V8Rfx|K0hX_9|NiFghR{_{7S! zMRHknZ-3WW{F+z$zy`?=-pKiBp}cD{wLcW=NvGw-X{8e*DBn+bIU!{_5mkpadqsx= zwTl>)L2MpoY4Tu!z||{QVlS$sy{J|821`e%Wg%vk9(?Scm|41iR(3m+PiS^*`pa~T zfKbG$)ygUG<)j5XXa1F&P+9T#1MqZy{Hc5EV|K2% z_pg2`Yn}L^{2=@@O||4*D$n$fh1Q5|{ix_(#EAIaIeQx%1+U!HrOc&!pEJC4KDy*N zwy3T=VW<%rCLFRG`>AvBEPQ&h7Kxw8546P$YH*6HujhCkN-ElpJ|;gf&`;F2ie`tf zlqX5S7?e19V7nqnBywbXrNvAxjbo&Qs3-9;jCmK<`~EC*L6(0^6BD;R{44 zTy#GCj_WUs6ldp{utL#K;O6_u5ACxzmL6Q~EM6ixM*h~5Z0K zu5;)iIWm14h#^d#5{~)xYq+!Ix9*kOod+Kv8=Glgz1Nr-%%}-6Q%YRE&7Z(SO?b!^GS!$Ew7goY zlrkhk;sD1JdRYw8)rS|m$xx@aLPkntiWhoV&2A~aPZrZX}dwA17`6vY?1%5*4|97vz?&@00r;o0+!y#8+I z{7Lek0n5_N_4b8Zkh;aIZ_`J9zsrw5_IxGDiWI!3iZ5l;ooC59xzK&Bkzp^%YD~)wgSCh=rP*Zi4`7I4aIFkZ3WWAK@ zJH6rV^{Hf)nLIs^o{Ap49QDE!+E->(W7!$^yN}!l$De4bPcS27753GA*=6xm+N<)W z<7O%TRNFjyokW>@gULvJvCtS>ZO%vr-ES@A~Fr*MxhypJ(8)M@WR{H{b{3Et~aNIrje*4OOzgqFlYfx6<+DSr4=aYFX zHT?F{y)V&M_|wniZ>T^qq=vc98{sYBRd?Z}DNrU*K1#XS0|V5xc~Fq=d{1Er1eikf zmL6YgzrElqu7{mUsd~6DGKO`d_AqT}SgGxhwv3AhW_M-0n$;{LVV$W77l%@m^?=Kj zY=(-9QA(-cWWlik5llf_w6L13!W3i=-W#9akm1SPp;+08%fQASHm$7%)@p=SOVd%j z&vlI?f|BO{P6pT@Nx6SLBMA+{_OeqW6S4=%20@dSpphoG?FI;xs1s8-ez9_K9<;vm zUy?fs6_L=3nNr*#7*Nmygkh>aMTOV0@u_67HO&W9I)K70Wz_HaGjJh<3+pAETzd5B z@;@(hF276Tq3!$AgU|O@_E$RZ+;dMY{_FS|wo}~s%l|q)=iWXkw_Cb8>I7>eLj0G>LrIgg2?^Nq$N*4|Vy9{cHvWzr6S97B62 zhsusI=a7suO2~_LcyniZQ>8MF-o)z^^TicwOf)EMpLEKlER8cDAn@*unM377!(_f2 zBa@w1`E9CrB!Ac`H75t3@5cB+8b1W&Hvt6XaTCu+`4Iba<5f z?pM!`{$|4q{X^qy$oYozXM3=}@LP7e_jEI)9biD}wT>bE3|eXdLq<`Q+*#fk){Bj1 zy;_+F)X{|2FZS`57TdGlVM~05r;j*u;vlBv3s3nfuMT8#B+H_-H1!Fml4la-;J~K9 z(jb5`gj9!Q_eA%1G|V!Da{Z{sa!R72qerBCH|L>7W{<@+s4Z54DvlB#P)a#U9L~tt zGKSieeIau}Byo($l<>kPdum7}6bWI^0lvDKfs|JV*(l{B!`uvym+qf+uiWHk86Ge0 z{F(MgKfp{++%OkM4L(Xj0-;MCHzk{i)K2p#l7Ew-!*1@dL2le`*G0WbY4~(HTG>52 zU&+Dn!fn2X>Q0y;21@^AeO4)_m0Z_k|fq&O&k&b##{E+>BVt#$_2q&R)bBc8Y33e~L) z=n~3<#HIzROy8tI5;-_<(OI~0_?&{Ww*K_sZCL|q*iCLR%VsepNyHxSwb*gq@9Fd= zn@Rj+i5TLi>Umg*?#7);v0Ro{$hfA;O@XA@qOVs#r7@NKq1ey7<@sC(8@&Y!-eO}P zb7~G7FGvaO3)xn}PJC!&1x*^HGJ6n5t5paMXeqpd^&YTv5LufHb>T#+j8LUeH3@Q!>UIZU{Sj_)u7-{o+&Q>L}zs zVnca}{h8f|MQw1v2f)7yM#efS)@n?M!farDe`>(cTFMDET?fhGjn`l1rkmGB|74Ff z+3zfLpfoK;7Sho*V-;}1v#+VD_t)IdS0XR_DcO!h;mHeIh|FQS&?@<-mqQCQ3 zY%`we?wNE5C<=+d!GI%oeDDE!zVE7+>~!x=_Rz1>-2ro$zF%+*1R(@R0eL9k@EVi^ z9Y=wH{4aOX-N{e>3%6FSs@he1*M4<(LUeS_(e&Q6>#=Ips`XymW1yu4v57*tNj7GT z`kD>M0}#T&K{B91i0N8>_*Pc8aFyq@Osxn*EB9C@RBwPk6TJ;Psmcf9u7Rm7$O_`m zRW}osuSPf%60oc8kUBN#)D4e*tnuhU>&|(`g1QwVT00RuGI+@LfUqbsbCZO5c)3Ys|j-nA82ZvUwM-p0p zX3k+c!n;BhmZ%%)^h@h;9G<2sR>d|Lkj`6_Y4he3rtj7JU^{*Ubm|>B3v#JqB-uv> zStM=bHf1Sb`n?xUirhLzwm(&O6)nMsM$+{VI!@IGo;@3`*NIt5D@-gGSBrz-HeWd+Y*mbM@!|hc8TW zZIx?VdvH^!?rO{|j#?r&o^u7^m6S{g7?w*_S_Ndl93kg&yk-ruS}X(ogLqc@xlXr# zuw0^UMrrF1Sw?jLlJ5j9fhpi{4fvzSqmC=k|BP152}S7^?LN%WjpE#xOYfGWdhRrM z?Zj8Ug&~5U)=?~;rYQ8;vNR_6?}>2QBOG=%<6;SByH6Av#_|bwaN>yY7>I@70F z4SmXmdGy3Sk3%)e5@py(C<9H~X(Z8O0^M*@u}H+m9{2h3!9baAK%9FTT(!l=j{E+= zZ*rS+TXLqTP6=dW5R*`)D`wUnufj1Mj7Vt4o>wW;K)=y%fcD+!k3_K@Uk|1lVW`K6 zbmQ1mW9|XHIGzunK^o{WI-s=z1Z{d3>2EYjr&>T=s~}=k<#2@%(w<0WPtklAiz{OZ z25uf}T{3nK@)v<6^OE2Vr-P=QaG zo%aJJ4(&Iu0+B>qx6PJ}`J9>Si3cIcJgOQ%1(71M6JZ<)03`{E%nl~dom<6+#Qn@H zqdKk!)bTz#gQsmGbpcy7kuqO89hb?K^^vc?N&!D+NOo#Fq|ufsB^O49Osc1j6r6GyI-QoUG@+~(7~IhKPAwlF+X$*9 z0j`30z&FO|gSJ<@V9VY~s6h07T-oCtEl+6psxOn^3WP00u%6;ORvuH%3th!u_9o+PL&ZW9_p|w-){y_L`B0ALm1~->F`KEGP?Qzt=LYB z*|V~Yl7>8sxn98Yn7+iez6IP}6OK1aM))vhnsQ4tphTV_vwS(FgviPc@F4$4b%~vf z6*z{Z7>3`X`}#_*lupDRE%GX4t-C*xle#oHrLNVz5BN!{&JBR2T+YtegcXajaNd~l z(sP7DJixybE56oZsm6^5*N->vj^Nlm7Sq4gKvrD8>L7*T{;WVo+hJ(ooss)+ufTwM1T)Mh={~=~9gW46h{)S;f z8@0MgCIOe&DO8T2 zUsN=bx!iM^tV;>`yhFmWTV8yz|AiPNjB3BCZ*pZA&$4-g-SS)y1`)r=|KB@?Dl!6a zNT?=s#voS>2W4Z@U0Q@|R_t{E8&_&0J?r4EA<(XSU1yvUkPyPzRjjvxWwJSAi3Eso zOOqFuo*YlO^I;W&{ndPvO2zl83tVAbuO^B&W|0sJy5b3mL!<$bE)G#RIEC4LSI${b zl4xahf$I3@k!5{#7K$t@RLC&|q>^*e+V<{^AlP;&|9PWzJ*;&nnNGR!>=nDh)vA!# zcWPR(qj?f)1qfwpKy0d-he$uN<{PCZlpyd-L>HNS1tOh)rX)l7?w6lb5hM<&-w4zl zaQ<{o_h6SqBgI!UTzY9wPT|+|c6LwG6u$TXCt_uFS9ds>;@C78@NL`P?(&UIlchM< zHW4Xp?zv}Y(cg_pC5*i#PYwAxhXY5$;{G*x3UBm(O|tUs!zu6dquf}&w^k>&v-+*# z+!H5;ize4p%u+vmE1yilL>oR5+jd1{8zJ1g&R`OQffpR~e)FKUE0-hGQ0Ajs|5#`( zT!AE}pI&L6opuZ)!(Pb5qr4oq_u>S2Eo%V~yc@X_=PAL~vx)d5g_Ia{!gDvKe}FtE z)Kw3-M#`N-mbP!Np*^048BF-*fo+JZ^h!a^&_m7-?qL|IT2A!)bIAb5VYDacTZ@$hk@+99j?uQ#I{+-^%PGy^*=n zWY%coml?s9INvobxAWKK>{9NOwk{^Gzx6w z07k^EL!rL}yYfeC;&7>wmEZ8l19-BoF3*Jx`^n7W^S_g|LPs!8Ol5Ha{%;!*=cqNTBt@m8JW4aJTucLPj&5 z7fwPEctx(0+J5rdxgj94o$rRpWB6?tboUF~Fg1l95U9(y5fH!^OOtf(Jp9HIcA9jBpTnn2fW{4JFueNGcmLLWL4{ho>y9A9i@T>1+E zwdv!{nJ#|9yJ2!~c7?7%|xm zW6RAvFvPIi^r8@?)b~uV0H;Tjjaw(>69>^vzVzVTA`o|)TdD_f5kKldpf68OHjaa; ze7N2n7%=fgPe7EdpSuVvpvl$n=*fn6i`?You!2H?(h`&z!gI%sVI;mtomQZ%3uQ>Q z(_#k6F)DnBItD&8#;ZwqhQ_@pr%|i)j-U^L0|9&PwHnYkTlhDfN3W*=u;i=({ON5l zUbQN$0sQIJ@4!C?tqIU0&{p(sZxhZI8N+ZEjr4~8{@`oJ*tl(d);hEv?vP<`e=G;* zfkJhF<{wo>yHqGV9S;G;ie0T`S)$a0OR@tDo4vzw-4Rjs%P+W7lWSjj&$PlI{t0oy zE(F#oir{Mxp2N9M=voJoAdmloOV*Vp>Qt9@jm=*;3z4&xyVuk16#J^*eJR)jk!~esoRa&&l;!BL2*b7x}3Vb{FmGDW}0}n2+XuUOg&G$)XMi`XVhw@ zQp)G|m&yVuou{wTa2bCEMp*tyCau7n;9@{Ien6jGQYEXcuTC~*{()q5@&07<>uVBU z$;qmm&~$!wW9!ymJs)_O!>U!|zmvQlp{S_`@P_o#adU_&Z|JZ+5_9O!DnV_^Dk4;q)-B`cZ_sS$9OWB)s6QCjoO%1gjsBT zHVJZTKPz7QnN#g@IB(KZ-0cjI_ie59%6bj z!%wktiooTx5H`SXf9pO?xP+d_r$>SCu^Ga^c&S}9fP_N>rYne4Y-q>}U0j%<8xB;g z2TmToL~MpqS}t%nbOM#Xj9e`JIMw**?^p*~o6_BHv92Q6DS9nq>90@VzGDuz(?LWpWXs1nKdg>BptpVKDgk6GAYQ1>D2(jO(?!6xq!jKaU_!;zd1Be3_y(wh{diCFG` z5jsYqMMwcNq!aXIW--Zn zInnEDh4T7Z^#Hy950GQccD4?>*kM-*9V*_n7Cr&f)TxJ!D_1=C-#!bGCfXgCu441< zXfKo*1iOFxR~Mqu&S}~^mO%D43ORz)oa|7{=Te2}f6`Aros8n!At2Jb9?dSPjPz8j29sBQpeL)eoEr0Gz%2VDi| z#zRVwjya$xFd-xhXho=Z(Xeb&<=#cl9&tFQVIRl(j#(tPvg#?ZNUC~Fo0+p#Dl_uS zHDteXNk3;UX+`va3`3%LilT0io(5_r=eKc>;rNLjiMCN(85_vzkw(9=dOr_VPog!j zcmCKUBay<=tt|TnTGOd%AC;*@1i@;y_h-rEIeP9u+f*B-sJ(B!@y6~q{xATIRE71v z{crBsvumf<4)n&G2e5I@4&WF!g))p44C~lYwprSk07D z??l5uLN~IDNrHnTkBC4Th#wxg6ToD)(1d?HVg$V@%h|?UF1*Uwb_03kUU^a_xTJ(}DlBG97et1I zl<}%*%zn0fd{*mUCzbQ|^H}q`f(Gxk`{CNe z{dc63-RO#;6VNz{jkAqQ+YvgWgd<9lXVh@S_H~DP7nPL{8vZxYgP|mk>98Po6LTyB zVF${6QJw*c)lv5$RNa!XSU@uUmiwPk{!1533VAfBb^`in-!qWibxcm!Kz}_NlfL&wu}W8^S}-%(s-TB?R$_)Kp`|yo4i_YV<^Ou;GyEK8zo>2jo-Zb zg@5jb;Q2_Cce#nqKL9HR^9N=J_Eh84)Y9Lkm?2={Mq};^$c9IKQSp?ZNB7d)y~g9S z%=q)yQ=s7zm9xnHj+=Q#MELancfioQG_AL<+iR zV8#QthKn1BwhA3oP3R)c;BXGwwRz7GSO zSUQDx-zLacZk&8Ap8JOQZcjX0fG5v`Ck)`+18S+8ZeE^*f(D;o1-kl|$3Ow6k1Z}N zG(Vhep1lXzTp@G+OykTcj(;bV9X&G-ZdUBoMZ{FNsJGE*rH$KuyTM?(ooAmR56Kk4 zm0^%xPX9cKpF5RzU1&Ls{h`dw{U8k}P9X!c?j43TU{I?M3Qg2=g9hq&mG^#7qX~o9 z@ne_qkC$Y6g>ZF{&M!NH2rm;^5~TUNRN*+M0cGFaDS*|)3LFD^JqmY7vY_%U?hIb8 z%kYa28w(Fng&?Ktg#%w@(h^-&MB`R6buV>0DhSVa`|9<0GY+pW`nQ13wO5e>R+ zbVZ_T?AWv0Xv}^o%$9~K%PU0wd_Gsq9mvpFv=Of7%@g(5Au zQ()-@%z&fKDvjgQ0}R0#2dFe1)b^$vUDg*obM+)O8}yl#dNRed=wr{k3Z34s*+1>%V0RVDT;c%|7M7en;(RgP6+y>&5#IoAY0_Zv9o;qe2N-ukh?Zsd#`A zVE#n??IA5X@QynXznx`)lP#vRE&2o4D{Tg`Ohf- z*8JyDGBk^(BFE6rp*7rs#P#9_s-7wZ?UztdO**=0x4quXg zxVwarNWIhlo_jEHoP?hshL>V)IF*VAWrypM#vS|pFLFqL>1SDMbpzK!Qxz`#_(|jV z!^XX1m}1@dFKc99DRYoWCKyKBJbimvvU>(-@xT@&s zuK*3uGO^RD@f28EZ)Q{$Aelzv1bD(}{F&Rak|;9?wvl+I5oRNa2k_8ysmr&D-S6V@ za@sI|rN>Uf_?ezwDFuU({IafI*ch~?yg<*_j?~>cb*#gPIIm+MEO-Oc@A5*IfvW7q z`*$J7yDxVijbmVS8Uf>++f+{{^=>6Gtu1u8eWIi=E@f%{hvqjQfF}=SwLF`qr={(T z9OaDBDYbLD{B`h78#$|ZLa7o?lk!OA!4r{{GVB0WGcrt#BzchXWNy9wVe8B>T9N|x zR=UZ+IC6Ae$%;h!-)~h4cF|fo@3y&fe z#d7jowxZGj2-Gt9@vK#a2{6AWk@J|cDg%`7>dXQ^79px3&;xX~Uz@c|BHR9{Qo>5+mO#lg4 zzzp)KHN;K{v)x$Qu=wMF(YN`pENJF%69uuz#-~qLFo+FZpp#ld|6>9mB_@7n3j^TE|Rb`QnAc~K0fCz^ubIdUi@jEzR{RHk9dPwp?-RF(b*OQR|Osv z)902Zr<&6rFD`tIMK=f&u3*kIddE=hGHT7V%T=~r&gi2e2)RE!D53WZf-bmgzY806 z=qU1L>sN6K3KgiwNbe*bG!;L$@ivb_+~a_o9q~NqJ-|T?^5ikpRiVldEeK%RcJ+Wh z7CZES!PnmUNujA*+v!icI$BUtm%F9gnO9?;R7wNf2laPM^&}G+VBXt2U0O1Y<=v{U zfB?XdlI(5{e=^o>kj@1i{U8*5VH%RlF&Z(A{N8%tCk3#7+6?d&coKbdMZdIYYB?Qe=e}*cY@WLX=lQrd zr=L%|j2tR_Q-MJ&{x>5RMX@(#c!lv%f_6L^Cah}6#Oi_5RV0KCCkuV8;8X=VwmVOq z`P|CBW*4a~nnnF6Bh^!JCMs)oR|EljwGs9!ca(WT+F8s;k&eP;Pso z9yKBmbM;Ha9rwzY-(lLQxXg)r6+n9Q`Zn-_@Fzp{IIFsRrFr>MjJ3J$UeNlGb8Qh0 zz@MmfbW3OkCA%llW1t%BXR(y%4p>mt8v`r~LF*b&d~PEh1zll)Ak72`-&?FA)&&>; za(kINxW~BNx=ec&p-Lf;WHA}bK4j4%ZU1ZEn{V`CCLlXEfuxz17&A7ed_(_q6g?G@ zRTcUxUqLdKQB@DQNLG2@X|h7q<28bg76wacs9BtFL^uGfKS~69#V@KF8(i0&>ks*n zr+5Fc^3YD`omsXq?-KyJco^W%dP;W`)+V0Bv(mwacyq3ag)OHr-mYEM)1$2@JrZv=3+D?nNvi{F=`nGqo&rJAGo{R@acC0CZQ-c-~dR8RY`yt5KF*;sx@(A6*I`oN%t4m0$OGH5#lrViz25>Jb z!a!RMx;S0vkR`gf>h$A+uSN)s=9(mgS}VIBwwnT+x_l&A6z23j%%Pj2?_&4*3dNn2 zgGMeCm6jBOpl%@>yW{f>M^9hitq5}ZtSdHZGX1C{=yN*8WbWvsjD4V`W=dyzg65-2 zaDA)6OCPI`=R>=exBNfxp*TT>I#d<8Ge68f{lDPZBOlN~gt01>CSA?OPbF zfX3`TREUMsNy?KzJ^Gz4b<_5JuJpn7MVNBs>k+Nt2+|B&A_qvkTpR6WfK_~zTp&zzHw&$BNm0wYIcYDtkf#GsOYR^QJ@G_< z$4nO;u-bI32^D$a(B7X~zHnU$)?eorlP|^LQ-z^BpdO#{0D9`ig8p)3oUPsZ2Rifn z2eX+kU;8K7f$k3KNq`Q)BelJy61n`URapK$%Q=G#C#}PK4rg}-?sPGA0hX%AXfZv`!*1CFh@&3%>{mG@{-$_@lchMEAP&#C}*X`A# zxYo<-T)$*I54Vr{aGUYM^D6~`*XR(qe!5;o<8_hV zn=+CFUwO3YFY(S(U?5+5xZ<^X>nZ2^7jo^jbDfzkI;Y%c@)rJjq5WJhGy+@~zV9#X zv~s4bNMWLTb=3dti@A7_h+*em&p?Tk_)4yhzI+@srG|oDwDJ)I>o@OS$Ab2Yk1jUu z9aCC0kAB&>PAKQY<%Q2^{U&&5R0{nYFrOs~_^k^IjmKw~KRrrDL*3lJCO=T_9kt36 zD9l_}P((uF1#NQWh)BoBo9<800mpsOfj7>fcjmb=2OY74A9S4`N!Sr~X1F59)|>xY z)@9a8qoa9iMQ2H`}%VQtQ-U|2$ zS=uwaLj}{BMV>%}&xLePzme>*g6U-aO0U&V!CXk_B08NrAIZgOAswUZGl{gsN$zN8 zEr-y+h)g?4(N-ZnF?yBf#qbTiPg$=r_iJZp#%F|U-+zx=m5F^clV+)sOxUtQ6I!Nd zd({k7vD4OsMbil|*s{(XLXY@D`1cG%o0Eem&oHHY#C7u&#>yKYQ?**fCO@I8ifyK8 zBhnrHZ%UVJJzp{jOW?pJ>2{+TwT4i03e3M*uF({Qqt@GI-p&Flb6|n?9x_%{2@G5*`_mqPuATK`yREnGp}CgGl!=DuA1Y|4`XL|neUG7n5K&DyD3Cj;>{hLT-F z5_upK4?2gVlP4VR54#H57XsJq#;`&|U&`8tc+LrCzu-Nk`AoQBqi37PrR$}!joY3* z662asC&>yfe0Q@k`va<(6ZMzYlRmuzmH8|^v&&l5jAm-|D>hwUL;GC^ zOWJAiv>T|TnVp9uGftz|s z`2l3?xmf$9s9Mb;c~lUoS|lYDE{^Wqb3Ox?edmk&*ZHg*$YbI@jrNx?dXK+pd@|E` z{7K`)43zkw92_Pjqwv>)I~3%ASUwPUe+y01kRrEic)FpF1NxzTQ8F3}Ttp0%b+6Ly z3E;rOvE$&u1A$;$`E1DS@laAm!LJ+owujQltv&o{k6~xYA$Hq!dJHI&l_?dI9PFuJ&oMO`)con?Nf1(t2D=2>Pri_!DqU zLS8@JQ^aLY&q=}(zdy&La%jf5Q z$qb=Od+O}i&+H!a+CEo~CsbhO#}s;?xHhgZjg9zMwy=wAq2@gOEcrsc55USYhQa4* zO>>4mE)&19hFxb3y?!!XPF|%10 zuDCE_l=bk2b(nNQ7aL=<>EjyYVCQ2({>L&S*x_rsXG z89wjc30O;dX}hQW)c~8-Oq`)kaF$33{o+ zAc%Nrcm@bhU+VCfHVY+N-Jm6S6B;5R?USr_ z{e|0&Gp8YMFfF7`8e?Wzg0N64nd+b#)9072-44<=wM~O}7vQw)tB%3;>Z$N}89XrB zg_%tUU?orCIFhqCbpsch_*v3x47TI`)vykuZHi59xQcLtYh1q9_o&d^>ZDSoSA8}H>4f(YNiJU4*)$XYnd8X36Dz8`Whw4w3Y=NsaI^^ z#>*8#k^)F`Af1#6ty?(iJ_XG=6L#n*l$Tk0@9mH z>aws-X(89{@Rcjd{=tD>t0bpytX3;mhpbA7GzklVLWMk4R>lPNFB=bN2YV7*z+5TT zvOiGY^AhQ<$j7CG@i0x(KQK}X)w1KaZh(N_ZKy`%rSAby*i@xe%Y=}U@|nZ#q5`Bryw^%PvEM8bWvqzOmgv96`SQKpkDcE zx3aOmAzKIqWY{-Gr33)LU5VHOdR3<-+9&{7I%HLH`O@L^;fh%vFpCq1$E=ElS9Q)T z*!hV8vezYw{1HdXT2vl@(pEuV1PT?S6?3A;=@R-%gWt9+Uyz?bHtd|8A%Fq048p~; zN8pS71Y47d@{@q!Y|MVVG&vPGL;PaZCRi-hUbYB(D+He_&9l>-aR`_u`HtK;@ZqY>b4RWwyb7Ki zhb-;UrfI@=t24_grPNp^oH33MXB*S!8?!$Iqb2>WN4a&qG;TFka0r4&_OWbOm|5)v z!3Z?F1g?R8nda0#;#@nl39>z=R?ac`@{kGKpw18m%?9imnR6z9K*hsQBJVrGUE|)x z=H)wZo~F;B^w5|GF>Y!8hsM-&>w^bGZd<&6vU%UJ%FT7*n zUm;XGmck8o2p-d28nueBO)fPYT$6vWioTYR4$Rl1wA(%8j&(?zv=w0%>&{l1sa7;A z9on~-FVo;vaMktZY$5{zL)*cshpNho4KnJ=E!HlQ6Q9p(7P}kYge6<;)w>-^U}v?FBY)iH2e0t_D`d~>G|Fy-|dLpwTKyu;**H6OCA z!cAm(N+I- zV)OKf-L{sH4d@KUt%O&XFI;aNze|?hxm~|~)kr)Kw$VLi<{;C5)6}euQ&UC~6So@h zE|mz?s?f%1!u=flRk9bVM$l6Es@|4GYIHI`l7ANJf}CdhDI3 zTA&Z=1A>(g*oxH=JAeRlNgfC;mE-;AN9pxyiO4Y6E3)!l*ca$brB|U-&Xw1KjEB~& zx2;N*=H-Qzyh0xt{8_*{4q=m(mhggYci^=cMrpfj!E^33$DL8!YnU*hF?Dol?mkBB zgH8LRt3=vp{Ph$le$LEb?GlUx&2Vf+&VgW{Kx;($nVD6i@o*-Ro>aWXO?jPn;8L9v@kL|hgsn^|Zvu#xUdhd%Ibc>|XH8vcOVP4&p! zy}Sm2Ol)R6S|ny5-3mm^saz(rbI|?OxQIjvnZsx|4D+I5oSPYyjjk2T%$A^JTM&CX zI6^*#^%t`PzsYTa|Mhe^LUCmPJ5-e6Nrj8!Y9mqx?=l%wM-g)~#Y>S)Al*$uu57VomG?cf?BPA0u zO}dp%Ae3zO(7kr}07m&>WNAbmg)q~Y{=PANuW{ne(s$oAKYtR+-h|Le8LfE4qGo9U z%Ctb>N}z<4fq_CmM7ZQjyqHyE>L1JJ@3sknZm~yGH`-^3kcaOIH}ql`xgneu?2?Nc za!D4e%?dg5a#*3o`yVYny4svR*ZTG|aw3erS~Zg!m3QgX@|{zJm^IFvW?71-?;%eI zMK@7OCl5ck{nMip5mQ@4qQTMVFGK1o&0Gm3Z+MW!iRQ__qq-mh`SsOjYc$pob&m4g z2UN_9wfNM`WUO*+YY)P`x9?9?2q-6qo|b+fr`{}P^A_wGtPV4DCaptcE)EGTm#Q|v zWWXG$mh$5@Yp_HHBD+4&KZw}f&u@wT!E(ulb);z@)iC{RXv}-Cycdw%QUydJ)ki<^ zN`f?OKV2$Y#rStX7+ORMcULud(ww=wMx>D8sN}g=a`suS&qrszxUjJJ_^dPkFbhK4 z?jhYjs0tw}RrZ+Gn)Sb`T!ZS+AEPSI-ehAyRPM81$#`{U8Cv=Dlfv=ni)f8^BJxd~^U9%5g$%u1&1 zNPp}e%4RdxW?>3hm(CaBC*HV~$ert`*=}IRGUxb|+4SQNkxeH|AAzf}ldunYaw%6J z=UMAhVE#JLX|~V6Bdy*{WnYJx-_n2RFsI#+WoQtRpRnIAh_>tjX*@P4{N*R;2VGT* zY6JlSO-Z--l*9pNc9Kz!@)@$Vt?}S{#^rNGY3tHl^XhRS12jLKZ=O2ZxPFm*8!Q9p zR|nXJLpA?7yL4;1apATHl~$8EL8cMUH1J|oKgcBNsz(ajoh=#jIWyO@Eg5If0=eUD z-e+ZAJ&%;LhBm{N>OgU62U2#vl-m(AK(k3oz3Z0%WJ&4ORidc2$+ zqdl3*zy?Q`)k$I}*UeHE8WD^Jd8_PA3sNC(2t7_$V^CvY^Q(Pj6Y2!KA|((bQgiF! zt;ixoCrjCjs{bye#bH+q`;dFb{QzZ=I!i#cGPu_s(C`fH$j9J(s{9kK6}wH3-HPrl zp}6rUnzh_hrF`0|Oc>$1)2?($Lf4R7(m5?ZGNB0TXTMv#e}`N-jmKxZg{E#AMuqvj zU3J(B6lDfBl;1b1rM#Urev{2+y#kJq4>to(;o>1w5ortjFM^|*(CJ9Vz(KFAP~ilg zrm?VHm{*yG!^aLFgw4&WtXUZyF_Rl!=-se+Q}2e2TYCHZ`d>(CHb!Fjo_m4(j_8iq zZsxhFqOXB!R1|rGT)|v$Ky~1@mC@-uHC_rifHy>H5XSGGnQ7g+7e&1j&VNAKkq**@ z!a;qdQYrwW=VUO!bP|gTrx^=;W@hR14}{nz>cGAH_c$R`*)^$HgT&Sqy9}@2r2jVA zP0^g4U3zlQND{V^pk}H&u%~IXJ51F&3bKbMLF;R~b{ee{51MDE5o3IFvp!{b*9g(F zJg#!GfW*we$vwMXPqnAeWWXkOqg}QM^`};07ueJA&&#|1u=@>TXxHBTyI$2zQ#3Rd^sIO{?!DO5-(}ra8V6GXB}%X%@3? zA4`m^BT$wiThRQ~*$JUtL~)e}#OSuk8BFEB?0kOTSn2SqR>g8DqamRi)&`)})+k@q z6Z_b>aYQR>xjd4+M$8q-smxtH_QN)~d_5G`S7_)LkFvI$KRN>lch40-@j!yNhysmH zoqhTD`%ABtGMp_~ynk}(@nZs#=H;&&m+!S{6XmR|d5G|_s0mW3{PP(zx2b*}TCIy|jT z%r49}QZk07Wpt%xl#nSTC!=p(#x=pvC=pt*bURPk%UH=*(~f`fL2Ck1(RAa!e|~fK z?t6Fb0*7hBYBDTG^3%NV3FLU9Yn%{Eblsl5k?n)sNlhp^BX1F?n;#4qSu8rzYZN9( zt2M9R4NR*W24FNb$WX-;1;H0tiRzI#b5yCC8~dN%Ot75UE#ei~u9|zT3@rO`?tK%vkf|hzo65$da^PbH<5mJ4eca7?Mag# zZFckA=I5Pm$dB-Dh+Irz8#kVb=5RAyzte}!N)ebZmor43h9o*EPN*mz%Xui1t(yOZ zo#RI0A`vN@7e83MKZBk@24w2SS_VsV5Oj%o+!h}{X?=RzAUh>Inb)qvGU9AawW(l9 zlP=g)*lA>gbYxMXJ?Kf@e%mZo$IRlJ`~DL%l&n>w3K0#=steT9UlHE3d!VL6bYeDy z?>%6~tQ5^lPZk&cCayjM^}T`B1p^LrBwI-Q<4YGHp7^Rqa4s6}%A z`^Lhl#qhIR1m`w zb%1)}X|&9IzH}J%e|swSAuLeE8DN^(1Z_*VjxrW40DpgGFyqFkcvW$TobgA8QxGp9V9s8i!t*^JOh zs0}?g}|j6oWw-in(;amcr*Au5`nejeQ$l z*xa{iQ{RUEexo^k&VY8*+bvYz(N1=aV8$b0zhaqM+T6l`Qe_c#FMJ1~f7cFHN~Ky9 zI7fhW1mFpGmr%1&u@`b|6?)tV5-P)-O=7!iA}V z6@wPz_PZoT?d1dgyNFQ&vWghBxNzDn(A-*p5(Hk^O2Rowwh9+@yw@O&i`w}7rrr&k zHurAWpu|N(@!x4UZbTR%m zDYhzx|KxVOcMKJE0e2+1fF+&7TIVfSPDW+e`m2okvz1ZV4*n{mwj-l5;Qc$wsCct` zCDqP_QV!IgvrsCn0bN0oosZl@WHf3JOj0ADnn_{S++#-xfmpACGgVhGahG@3Y ztimHRr4zElKYZJ~^j-7Q2R}VJy7c5iV|IS&FOQe5-EMw%nm{wmIy0VkPo4uIowsr| z=Jp?Qf!VRvRj_M?9krSWELyyOclrExiw_?*KV4`XU-;?K^y_9Z4Q|t8R{C{<{CUg3 z_AG@J8Lz7o0#%Mx*=wGYN-MhnCLD+s^9qNRK1f^2t-E2PziRC%yNr%k zXx1TaI#^-;hD=lm&vXaJlz=zvs+$#vHyiZ%>>jWvT-uTwpHbRbkwTW zM4>kHWo%!Q$nY%@Hw4kV>%89G{U1JG)QM-TUd$DKOA1+`yXF zJ@{05#RfNMznxWugl~n5t%{oHc6{2##Fg+3{6&Nqcqw z{yqB)%y>f1gR9baTM`7XS(cfN^vR9Y=w8WQP}?)+0lnzEiOEEG9ZUltdcj)dfz5=jqvB8k zcCrDAJVaBD(rOTV zNVoI{tGFh;iQRBk)k-2q1!+O1Up6(lFX5}$#;rBrhODLe>#;5(LUMFR4Z$) zJRzBrMC)^Sy69|QhW#@N)ElzLCh2E2&+l$38US= zd&e95UfuCVdhhG~8`Ay#{Tq6^k-sg@vh$XC$l6sX*Ct*mRd!-LE;|}$FSP#turYlB zjkC)OpAoK_Cj?x})lEjtqWwRnBN((6K5Q)r ztKvY_EuP5C7}{YtUM7T~&3??)mvNHl!J^AnL1YJ9jbejsrIywP)AsM)T^U#-mwhvgN0!=5D*@t?LeArEb&o zwqM2c#vNT{ktKP4B!0G(T|>}!gC?A^^ympC&ms-Nd|k^#QwH|9T3Y68J_X+7Th`k@QHLo}L~F_WhTrNLqag{x;e1l~(PvP2;4W z!-MMt#WN3^cFkbtZJ$IGk|}Iu=ZxetW%6JMJ*<+c6lq=?uM`K@)z_^vs}seH!563R z$T&iKB8RG4Go-GJtwzQyldddi_ckF8S@I1Zc>Q{A(x-vkQWuzCc&m{uWyV39-ZyI1 zcI7Sj^W}-%*<=DzrC|DM8WNdcJ?5>NL9UcPlDDtc3VG5)BH_HLR>$BCdHT+K5`f4w zHuM>dkFG8~evBy`>7?kpT4jQ*&6(Um>;vIymTkyYih0ZjMav+Vs=eW)u;^gWib*># z!rIw{G>rIztO4C?=mMJmB)8aEk%epV{>kRa6B3a54CS#?(mLTE`5n2ci&o{;{ja|U z5Orn#?Aewues3g$@1p9MR6S031VNf8T0V|t3rnZT^WT#ZccB}+dc|4(g_)`&(7+blHHWk#9n9k z^VuZMQnNF4*E7eDrS3gto#LNEfYeXaDaZuu_wJ^B1+(mrtO1A<8CeuW*`4hInqZIE z!R`z_LJD>y6uu*0q8a4{%aNey;qBG)0O_kS?7ceulHI>l3kry%A?nW_app}>lpvy6 zwqR?L0zy!cfwuMS3Q-xsL;(1Vvijjj&ITJ%FC&fbYy)F`hw&WwCEm~a!@$$8_SC^R zLA_wDB+f>e*-^`&|8_B_+sF;YQbH2I(BW7%U%WcTs}^MW1gxo5O8Epp%;$1R`DX@x zt7^ScqUL4j14vBLwMN!31xrk%6Je`+_6TOd*>4vtBDWUG*a^J>vf&>?V<+V*nRhY@ z^Ekn4vNu1Q$3;Z>s#xMVJ8yP49TAHk*=#&qQk~XryB|)36)@tIWu1c zq;lYdw7{r=ybs~U0Ussfs78y$Qca)ycZj|-a1f)6Z-ID3KwOtws;>K8nttnH;83aR zmMvQbHQPX8<-bdAl#AyHsbZUJO|Zt5%N$!BD;;*_dFtroImi?@@z?&+J{lAlE!SyR z6FX(4oK7*aImL{n08qQ4$yXiJ7{v`Go@HQrbM&a;-QABPmxIVVhc%Chmok76Q9hVP zx~>TNL3+e4##dzFw>&fd)#VGOGL-U!s8%YaN;2Wmax|`gv-I7Kfkdxiu~F-aW@Mw#jK~oqKRudmetu)=_#LBG zJpj7UpB|m?)tA8geYBdDqBU_Ix1%_LHRVgA$plUdIy10j7OchTTc<36F`O2CG)Wa8 zfk$2g1=Zd2&AESq;QiUWLC-AGa7fk*nFsHS7YEUEew{}0F{{k29`s?(z$it!Ivvz^ z0NO{tuQQHuU-xx}nx1kc-RJP&03>(>F8D}&(BEJJKywz7(hHvu?Z=}+8uJf)BtgOM zi-i#>Xy}ct&mQ4Z?W>ND{E5i$2Qo# zPGjSF;F8LT>wLkY_F4xnx02;)5j6wKRnD7}#yo?bb3Pa;XBiI={icT=7i17>X zUk{Q^l$u1{kUZ%G9obX5J-9F!A}yuE#JsrT*{Voq3Y+3`P;H0PkeoU_frZ|X6AzD} zH7t=Sb;>HZym9$rWt$Dzbcf`0gX!XSRmG&rjH#|=TN75hj8#UA;23IGgsq~;QL(b* zDA+`XY7;-OFCN>uqnLFdgiMqgefrl^J`nr)aBhYL0;l#$B$tgV(3r3dsDo|Jo+1BU zx^}92mrX9W+1k+dW#hUgwq(rb%$#de-0InO?;sGy*Z2kG1CI0xTt+Wh1)tI4z@%6r zpx|X~MBW_*{{R|RVOvMnT>7b8T54=TUVVARM-` zfw(4wKK%2ag>w)5qk|CnP}X$dgt#Bb7&WYGzk6q_&(6LFT8lx&Z9q{+x#2oMAx$ph zUgJ%w(x6uSq^|!I^Bm|k5_C>nEzvcy?Vg)KpUc!b0?6tCK4A(OY1=1k`R2LC)U*%U zgXZ!4)#b~RUSj4&=@>L1qTd;KVbSSmoX_Yuv&&sm`*-mIg)*-6tA9<-Xl_i^F=Q~vv&RbsgdBL=B*}@iv+t*X zGN_W6*0F@j0L*tp(lCut>x3wLpk?aZt{6xy{ghJJe2k_5uSf2Yr(6%}HL3^`%pfbn zQrAVQ%gyq{7fxYNzj>_dSP4|Ksx?Lv$N?^9t@o499wD1qZ%=}N?g$%Dv@%Z03v{-` z>~vn^<#-#q3m8T2J5)qyORhqjIRlQ%m^LPim2ChCJKj;a~m|<_Pl?d0k*UE^}afBIWDIza_-MD-YvqW}BYp5BXiRyH~AXs_HmnxhO>&&|A z6cZz4o|Pql#UC%VzWcKA=%sinC*}uL=A&hJod<1zLKd|9P$xS+v8!Q#xTHOak$A~meE)0T3v~2t+JnDYo$EJ zRTm5DLYK~1N^!E~j$J_*{6HU6@J>C_tInr#o->qF4P`x}@{z6yaA)HX?ocsVIEkJ6 z`!-vJK`4-t9;sO7!2$a3G&u^MfpQKifX6|#M*bR2_V*gkZA_)=eSLiqfZ+BD9_ur+ zS$~h6MtnqpO+Bj_;o{79 z1RP{2JfPW0AIoqdRDm)pD`m&T5xdHZbe&(Ilx&S~3=kb`8bkmzIW&+?@9MNCAHq`oqAygyE%>9eYBP9MuQukPGf-n zo6_=L1IRRc0Dtz8hE$J-b-WDhf}Jy98C7!D_PIGsb_r!H-^5;fE}Px*g;1R z-6hs~r-z6{*(nD3*0s6D+{LAvM-eOt5dVEJL=_7Zks4>t|Mcj}yTx~l46J8PLrCb? z*HCHExOWUQ>|+LP$5EJe@vq4bhEv^PL77|?ap5YP${0_7Urjio`%5O-|KKgDK^r=# zv>CWNSttFq1ZTzzrh1J;bv%=?s#UkYU<50dua`)?X|t<{lC;;WqZE{d>gWLH%Lx-w zC1e|Ta)&H(=gAae6LW`Qrdopr?|MI{egju-EPr}oX?{MDg4I)69Mw0uOY5@4oc!i4 zT6m_Y5O}IcqtYxQy^fGDWuc?sqw>q{EMJ$irU*-d&Ip1@+CmlYcW2q*Zr=S{_DpvzaKIebLYSUUYfWA+>(?BbJa&7<=g0d8-&U5?18be?urnx&7a zOZkdnAl&xOP(fCSz0!exCip-{fHnpu{Q=9t?xx^^KyrrO(s;oq1UH11$@M~%Uu%0q z4oiJlcUU4yjpFv%>qy$2lRAJ1O*}1Eg2GiT-hbHo`@=-4gE=dAtZVK*xe89)TDo=$ z;-UMj_pOW}V?S8<= z1z#LcM7kfN94A4w_OUC^hj_UOmH~cEA6@zB(a~Z3eHn5IMxUGRvT)!K!m)^z6cj)ru#ib|5 zQ8DegPsyoWKKi6FH3M1v!9aWQ!`6uh&AE>nch9%JzPWsUZu!g4e0)(fM!IkwUeHRYFt+Uvb*1epRcCS8E4~*5Lt+Aa;(ov$K## zDC*UN;B*Nx?`-Jr-_UE2e{X!R&n{;2<5{cfCgCYJ^~U{?W%8{uxkG)t{F=bV^PW}E zJ0P|5=GT!s`R#8FCcY*sDkI2P}lCe1nFC`ohq!v6$xA5`>{!Gu5#@_2Fu0z_prg+L)+*PDgVssU-k~6 z@er3^ulrx_b&qZobnbZbx!pI6=DFjG3*XbWk0u+lA5+Jzi!8R~_O<5Z(dM;dSd_kX zX|8#drJ1C>#OGhg-(cArITz*9@jH!=z+qa)FsQC8s*p}Dm)5np#V4PG8i$&USv@(b znv`T?$|Z1aBIEMyRlLxZn=)A2CAtBLE9pAheuJrYRr&Df5KKlg$V8A#$O5Z(u@I#! zRTX01F)H%aH6G^8zfCr;+>rZ|m@y)6vxFR5eV4Tzr1Ar}S1ui@_&lYmF@o@D?(bv` z&FLR>2qm4NT{3Q9v9^jfIy$fo8;-!l>;wp zACf60Z4MU*p=A2e+-<4hhvlbBxSNPksS!y|@P-rhaNKNs+1j)&G#9Ut$&fz_Wit~s zEw8t$G0V(a6kKX(&wu0X&-PjIX&SV@Q@JRL2?7Yb5ob0O1W2FhnZfep7xlhk~Kj# zdDJkghE>c|CdxI!GZOqcNG9Tw&E6-IeZ2g&ZDhBvk&dkzmJf5{a`)4x20k{VY7s_q z&#u?QikGRmk=^GUqL){(%*lq0on)tvT=-8p5+GfJ8wi1U`^8u#bcGFYT;%rWWh~&LP-$rOgD_65jyIKxSr6CJ-kR=vN@PC%=tUbd8;JPK>#&mutm19TCh` zl$2sN{@W|*9o*8a^R=3tICkVVp)VlTASVAoJma@MT=Y%gukuH}*VB{ocMJpYU|RMnz>k)`okGD*Es z{mvd$hxP}$q=hdPw?2HKLjA#q%h^RUpO-g8yMGKkyPom&DFR{)2; zX}^{9r{X=$PDV8x(gz+nEpp&6yHi}+({(yGA&*x1QED@1#|0=M2J%*o>-$@ui zX=(;20ZdMT&AzdUl_M=l$NUNBC*XUSB&34^YY)JG*ztU!b7$AQzu0ezfhf1b?=tlR zyfM@dV2v0P<*boRQpTrP8d;b&ir{$GXvFssgD-Btwbr`uG^2z=R@+N9AG#jX5T(5ruN7o(_ux}r=` zrr}ijV`WR2J%F)8fVD=gWZ2FWsXhf?k5^1Cla|Bkb2abYSiW=J*f7A#gdo||7v%y$ z$c-#SY%Xu;d8)b>CJJHUlUHoMeGG8)L5OZe(nzq90|U9d_5L8uT9dYGR-wvs*NmF1 zkW;i0^RQ7pTEO8Ow1IBz!R@6YB{hd`?I{z|XMN|ihrJ@y~S`)4SfAmBPnu$!&a&(*cjpEK; zNL5(r5}_jTCE^e?2+iq7BA1>XRHj-%9!n!A^c*J32kNar(pr1@JK-rhhn3ZggHU;12+?Jdv zO5e#UsfwAk$E$Ec2P2Z0vFBBqG|+GK8=z4$V$yHNHpc`Zriqf$9`P4&g*+cpN6!sQ zMi2b;eBtW9PU&zol9w5?G6#vYs3&`bORO9wFe4ZcOLr^2+x5Opowg9VZ}P`Ppv33w z4)iV3;i=GK3eQKhZ6QhilNn%V$iC8DM_R9uOs zsg1Z)$y*k0Cr2tnF^xmctEJKNRLWxE*4<61S&RiEHxpaOtEU@kNAwDf(+T}R?Sn0Q zC!rlNI$~d`U16gTm9yrwx)%jp)UJG77&G=O;Z{jKBX*6-^E6?C``J7F@44e|`7}~u zLU9zfak#fow`B+UsOP17=FU+HoilvW2O5peb^PQHR)-}_-5=`j-AC?eJ2#gG7;j0oe>j9EhvQeDXP=_9$#O&dg{dc#ym`Z(nOXnq9j07wV@pz4Ult`S@(>;Vpz4*2h@7 z^|!|SF>e4*1Z6MImnza!M{QW>0AHu-#O-L@#Hw5l>qt5V=x&7v*LVU?!7ExxgF@A| zdWUU41+izx2~)T```So8mUW7Mr||N-cP4aWRPE8CRf#eJfj%~7A}ao^>$8;0*%{l+ zzl}FAXe{}o;Id)~BMCZAHX8p19avK|D?hlw%@GuQK=6hY2-VG?SgKiZp+>&}KAV%n znx*ZVMHayOC@`x){tqa$4Os`I`~zkV{2AEWL_mQRaJl^A!^Xlx#yNoM(R-#Evv-!B zeA>A5MdQlD=H;)si{}ZYE70SPVf|xW>Udfw&Feqo(Gd9f`e3pK<@?Rxa^q1iN_br# z!2ApPoHG=4-02bZDXukB@Qf>PT^iLp9=1x=pFJYsalON#8A3V(YqPp5px(R*wK4Ab zL07;lNO+hEnjU!y8>_w;4youvN21bcRTqUZ#tRV0T1b~*C{!Jw*KidhcrKH5DLo?^BQ!+c|VLCrwg8t*gxu0?_&RiNj5A7WaXR{BmuK^ zZH~F~E5<*aXsOphD59lMVZ{-9#7Cel2hEz5T@g96Q^C#~@8RW}+fQEMDD_{lD^*db z2htbIW~*3{qAM;Gh0_A_5JsPZzETp2P&mLd;W#~oh(n#EiVqP2{CCt(E(nx{)Q<#$ z4>*6eAu_Zl9Ps;jJG-E1>2Q32Q@66ZJ3E~Ca1OT?Hx zjLBm{%d7n4g+!67IM_AtbEe; z!2@9{7%+TT=Isj4JVH3rYJnV{E|~j;Ftejv&a z%tqL2{r9+C;mpTw_Oh4DP|gJWGcpNhsTr0EmX$_1)wpzZ@&3c5C!aOHy@t_&-l^-n z7Ik{)USp%)qUj_?I?2J4Urb+Y9E%(dM zOwoQ~yS)NJG+(!pJ<5q37a8mp7f!Pr*Z1$rTVV7!QRO{`ld-P(kK4@;XMcJ`Hts@W z_Riv?i{2FAsAnXvMAkr7Vto3ZNM^Tq|0AfkL-VWuYx0A}%@39@Ps&NxvE+oPD}k^6 zH93RjnYxk%&*5pLOn54++D>{Gg-=Di#0|^(Y?LEN$YK5jq+;U`{=;GE@cgQ=bSV=a zLa@V3c({}`l?l&xUG7YH-nmE1ga`Ym7F$tI!F1yhIRXzG^T%3Ok7BGf4NG~XqbF?HY$O*Oh@v7Dax!Q1jm{>=loHFS5Cqqcd00{6zaL$z_Ha*ZiqlIp3I zDhRcsnB6N?J96E6Pbpkm;Y5OXDRDkheL2#eR%CU15PJ4Lp8H@R>(+jdw`-rf#XI|y zwd8P$x=;zOG)`QpqlvHde0q#@7eM4x8onoQnM5k2ZyeGWgIAAXb@CENw~Hja53xA8 z4)U6cT&Hs*?g_O+IM`N; ziz_SNTv-WThFQ!CK9^EcR-VUSbG0te4xn+5(cLdP6OnI~b)i5~QXoh=G7qZfK)XS~ zM3vm#$8-WZu0(mWhsQmc=#b+0?s5CQ0W(P0aR! z?9s$wb7FfUB4TSZ)O)<>X3szYMGsoHE`GQ?d1Cq61J_ub^vPO`M1%rPRA1O}QA-9D z`rN=5#+$|bgf|aApC@A%f$CDW!Vf!F^5nLEdMP&eKq1SJBid>0@(J_;DLdeLlkv7G2*O+}NZ);Fh(&)L^yZ3){lw-$Wv zL}Tjq^0j|1fBq#JjwCOtpB_ywKKZ&hWPEz z%SYK8(G9P;M%N=MuSKr5wokfv)MMe7I(rQiCX+L6d$9>qPpQ}xkq8o~V)h~UbkJX1 zM(+IpY3_y&u+NxOh!Szh&?&83(py{2pq+O0d}Ms~RdQYjP;v~>4o zFWxp$$H4em1}S)n|=|H=Ac?n;%{QzJm7EIDQwS2*ELj z=JY3g%e%$@H~A%HwFxaGolkw;nEIym_~X{X<;6!=mwx<2X)t|k@!?mkg$s)d=N2D6 z#8<3ytj&G-HgZ06Hk`(`7H+i`?jliDiKma|G4A_B5wcB_aG{H)!am}On+mo-ClzOSvr{1tz_~3cg^$P$8{*dzE{|nL>c5~=SK44 z>bj92uy#oqkMROB2;v(&`LU5U6en(U-)`Hbg#MP%?rCP~XXf3J5*eU?fq@-3ppzx- zCyk{zUHA#U@CpE-Lx|vHr;COb|2eK=j(seRHH1$TO@%Y4ILZ)}?Bg1tB*bS2NhAs+ z&$Fdsej*@;{U+ZW_EPNVhK-~Vq2%!QA;;mEbFD-kp%Y8ZVtVIy6IJ8?t_N9sy*XYRD^&G(>cHfG^oGpnrBHO}&&3sXT%6@@Ce9Br1TW z?W8{{PwX!ZY&g1Sbg(tFQ%Sm`hdpA<)(;#}4ZZz+{V${#X_m-xtzs6*B@9J0HE9h*%Ex{u!6Rpf zeA3-9*U;`|K;S==><3&)X7HzV;gmXHw6PUR=X@{VUM9D6)ha^n*F%;e@dD)hp>NMY z%PJd07_OQ*>lxRrt0Ppua+hv4#Kl=Mnh=Av+}Q8WTDo{iC7Z{_Ec}l{y}v(~>+g3n zn>ZVPZnJ$(v+G?k}nK42O zjTid+Jy>1dw(?mr{aHZyB3uz3upRynC$+X1z;>BGww5)>{jD6Eryx~KKF^O=YS))m z7ATad2tpaob!K=@WM?}3>tM?ns&_l@a$jT3j4zWc8E`4d08nZG%Vu)eRD`8-g1S~`x#As8c-(qV%6Rn=dG zF9Z{wxE*K&kfE;f5EfvE^I4uqJf%fz6tymy&Caeg&VXAG^?@+Jat~!kjOC+G8dEdI ztNZuwF=V63I&XTAw`e_<1pGMwy{|9lO}jXl88a*70@^xW%cVE>(p#zsz6@{e-Aw>r zE)_wR@Ws0r^;?u0E^I>b8>yDdFg5Ie`erza;9)8wD8*Z%6>y2|rNQTFWgXL?YQXy8 zTdb~QI7{(jR^5*V@k=c}La9vLzatg;MUfVU2yM}pc&PAiLtN}EdRQ`hG0mq1PA>Ov zHc$M$@y%H|OYIt^Ieu1imFV~p9J2PU^dEz{;-S9`^_*jG)~y3&6_Ig3J+ad&=Svf0 zwB1>en_N|qi5AGl9fYO=VRfC*79qh|S^7m9P}qj(A=QU8Mh{~&5F4=zkTenPGYBz} zKdY2VwTPdhcFFm4Bb01Vx6h6NWQ+XYOI`}&u&zx(by#)r`af5&3O4( ziTz#Z$1$(H;WRJ_I0rfhKGrI!y6k%T@Qtuz(Ry*vT2p)#&^JOaGL~z4p^@iXp+I8Q z+D#~K9L!IFo94!igE4~#eU5@V`yz!Bq`#*Ng+GGB38Ro$A|mH8N@aI3S8|dsUi+$X z>_TJiRP*e2t&1Nze#@|}Cx;<=PkOI`c`0Z#Aplp*E)gjr5g`!}l8CcE#1ieQc_90o$6ICig$8*g z#fRI$U_{up+Fq+{+7(cFi=@7=i|&_i75S$;PooYdSc855ggpRZ{Xa2BRDHOfiWb2o z&yV9POvjbA)JqDqOYSwo`s)RitUE^^HTTi9fNCNno+WU)aprXEt9cnC7av{3XvyY3 zZa0pd;z1%Oy5X&_sR*m=4leyI?r^`Nfjs4dwsh<&Fb~^XHCr=fKMyizHB5?pW%hZSGiu)@^Xd8Z7UGJJw)+o7}O_ zQTVsxj;Qe!XZm(JA650>9iw<%z0y+SK=vV>tF(l zCsBt#(+YlI5t4W?O&#uMbNUS7D}H)(6yrDzSDyyP5=O}Iv3UPZ009Cq?jWdB{M~ff2|R6CI-E0}!GEONM*uc`mumVdgeI zU^~pXcN;_b@vuStS#m8}>3DLOHBEvGJUzvhbxRUo=nOSX{V4ION5J1<)PQ#(tNi58g=j$FL~&ZbUxf z{zW0hba&eiL3YX{F!qtMhMlHDz+L(y8~|iMo4<3Kei^3kbni}#psOYTWDwfcdklir znB7Dd)*CM;0!2ogoV;9)raYl$C#=Glluty;WG--X%_K-zkt7?z2@*1S%dG6k=c$G@ z*)f(4L3aYls;uN4$ExQ2DaejdQyTWBU&!7ls*oq7IY#jc>rpz*p{BvS&8p}XVq1XpO_5Ty%S zAAR4PJldGK);e)qU+0GIBF+#dxQ`a_c6qav$&`oiu7)zxW*KTl!j8WUC6FQMm8O#V zZt^40=ZTEQYNw}d(pFcE9bDL=_5m`B+w=-9+z{gNvY8#VLOa6tX~4?#2z=qHMo8F` zomP$DVl}iYXiNH|jn!U8YDElP3hDzq&}lywi+*zJ3>^>)7LOOcx_n#Ca27wImOuqy z$C9o*70*bhkaVT(idNxH?GE0hLM>s%(q5}tCS6;KEGu)dnAQW)eeuUj7|MsNt*0D% z#)a+74Nc!MvPjsmyJEX3Z6(d9VHOYIj(H#=P?5LACkFu8Gy^;Pt3=~DBW`!4s;ret z`KlCQK&_!l3&N0AYUQy~QO*n?1q(VS&L#fKgT@GeA`7(grLtAoNmt4O82CeDY3|3y z_2cwuGENciO2N##dL(~~?)008Z(H9iG`=|5`0;V;tE-ZsQ6UoE3cYp_z?F6v>UDpo z!pwQ=|Ai8|N$Cy7m?@h~pR3U*bZhasO_lpTh)eT1EzRF-EgVDrzH{^(N)}#`I5N%j zST?ml2<$BbA&{A(wbx>KXjHlvNE1r?Oq&sINLcQmv7{Mw9)$ z#&a8Ka2RO%)vpKQ%<_;`fp{|gETP2#*21%Tg$U9_Hdwi=F?**m|G;n`xW<`znIr-c z7B`ZcQxh*_McOk0JqLXn*X&x}aucgWymJn*jAH6Tydx$OElhcrH9L=smx?yKnLPn5 zJ#QNIdMlCRLfOe=VlQ$}tYW7D`^3m7RyG_U{Hmz}kg#;stzL4e#ATV{tg%NeNC{}i6p`miRNhom=j;q9on0M@KYUTbMR>eep+C9$OMs6O z!&b@dUk-TSPK8j!||8C#2gQk3Jk}t>&tlx)FRmVb$e07XTJJ zj(jUc>MTd2%A-3I%HIl_-QMTi6DXK;N9w9vA&iN2IMm7}DV28R!__wqh?sgw4$0%) zq(p~t=mq1(iY18Q-$&yfg+=P}o#n|B&69s$Tv%9qd=}%~5<&b#7f~r7wbGbb%;qf^ z&zW)jt4XJ&9$mnSbSJvp8TsqaJ;n)sPZp{cA{jF-|BM`9O{ zJ<4Sd(b`)*D41+8l#-~KK5w318agJz42)Ln>>&IrU9$@0NzEc%=En=g>cECv#UTGb zIBJ#$HuLOVG*wrB-xjOjlPQ!Bw2h~kd-jO56W}CYA238FxMz=$r|gZRU9J1nfA#NQ zG1!zUqh`_mAFLwmKU`_N?cr2yVU7rowwd3@_fj{eT|L0tDVP0(g|>hB`cI@foDp4M zc1O*3@!10==tVK18PuC2EKH%CRNkjhha5B&pI5_PWcE@(f2yzQOtlWE@o&J+JxuXJ zkX4vSJ-7@HIJDbp)RV}EwK4VT(Z8HH|xNT+phaec@b z{mS+I%Jr=x*N6KexIWaUw8{0g>Gwcqz!|z;>WkaUf*aNZch?U8rsv&;L-G)E-I)p+ zOXOK}%w9HsQ-5isLN3OFna{_{%~~}NS=s$8R1NZR{(tt~ygRDnS``1EPjRd`?rx)Q z4GaOvz{LzPFE;QH*uVD!t~gR3NgZ0rUCnV@JW#bHCz*9}rq=WGdBlT)RZI56wQvb)RrOcj6 z<>Vce$|5OiVy$~8jOtToP))w6gLt}tY=G+;@?k-9NU~T0T~OT<&0KZ@3Sa%aR~xSu zD#X^3^@(3#fkLUjioj^=Li!!mBIY2LIK0RL6*U>9C*7w77e)U<78tjSemd;81tMPA z&J!CoVz}b20T#j$(jWR;htw)3Iq49ICi7I_lk15PT9$J)1&ppiwa8;I(mo-6`Q<_2 zbuo<-*&(8ltH0;$QrXY06#v$7@TUbuZTC-Hh6R(Nn$fRCortjlBb#HuMe* zZq}mGtAXeBj4&2r+fig}c=j%hS7$5inE7c~)H@!R0HOj?C3F^cUI6ZAD^X|cB**WW z7y9rEdJ)yjPTs?25M{gMd3oRzqLxm%)H{(}{{ciX;+cpaQUx*Mo#K-rtLch~hw<6^ z2Ui!b@|=FH`R|tIKWg7Ri&o!{e@7}b5(q@bT@VqRT)j3vG3n5k)_32MKuEs6tt*$v z#~f|LL!K+QS1Lu){a2^cZ~%G{9l$(T1mYP-O^!^>p zhAxR(aY0;pgq3#BOh8B%IU9hWwL5C_7 z2~?w}=nEphfGEQTUB&cl5$R3>7mLhaGU%tJ;8V#kzIt; z{D=4zs;AUoWH!gduLA3#k4bEmawVMsr8HJeqMKeZ>#OHP@o8ABYTQP^QWoSG*!;7N z`N5v89VS*u&RpUhOTeaxLUy7<4=XlunGE&o8EFze(sV~ljGN2OpdqsbqFv6xs+2~L z+bFXuVOx^4cZsME&v}<5sfL-LBgl>5~&6@v`$>K$OL(DV!qoK&VhsQz4_MnZ!KPbOS0z3Kx3E?e-?Gn zm%%dk51UUbk!!Qs6XuSGg!5av*;{|%sAQY(5d!hbR)OvIH)Wd@SD$;%c_ti{(;0iP z1e+{zz(ZLABT8rycP!5yJgU9i$hB(&+pC$s8v>AQ$OuFbFW8j2*;DL|mcrbY4BupX zj4{Ui{{r%`xsbprTX$>6#XCs3QLh#99wt{s%HHb~*kNv z#djEYi$!r7NL_|dphY@@*LU)B|cCkM3D?)0!UT0I>de}m`X`{i#8Ghec z0=@bAQ}iSJ;n8(&H}SX2OSk7*AMmgN$i7v4?=Kn;*fO|L`fB-cx0>%G%xCwAURxN8 z?5_$HSkz=XmHh~HyAtCZX=V(<#Bafcz9tlSHTcf}akN@I1ps!6YpNLRz8p6jojn0I3Qlk({;=YL{9QG=qBr@@$Q{KsJ1)pLi zHdzNUUNg{}lD}YUL~$PdEynN+%I3zS5@ozwAwG(nWZib8 z9TE`b#dd}DMwhQ~)xu>$IXIN-$JCC5ZePIL3|2d-w>f%|6$>?KFe*AQf-xwXYVkBO z2(R^+q1Y`JCQC!(YyhunrXttEIPl0?YSLfM#46z!$js5#Qg?2)2%%ZoZ3ojxThGf% zO%}sV6g^29w0O{>`1RK%#R!<@U3$0m;4(u6+I|RGb^hWHk1i~}^=<3QC3ZksS1vBz z{+g=EhP>lk4XiWMZm%-UabgN!^3=37xJ}jEmBzi>0D36uH!c8h!@+5Y8guNCT3=@gEg%E*Qxz!J}>o@e4EeFKj0JH-G! zButo5OGt)W2!C}1upa7kk8-MyBs|ueH*Y?o9O@&OsvPqqRmP!pVn){)MBOu4nR7%yY%Wo&W>YzRb%_WRrBq<-S9n;4v+ zv{tD=rl+OHUoCuho*$em7Z>i|VM5O0`S03y-)`Nxw)oW-mXT`igvad|{E0CJon36> zUb-*UH`(j-966He$@qmmP?&n|SB-Lg*z}(a83-Pg}Px0*A=WHq`$ivaH?W97Al8FK*_2x~EhxL*{xhU&vYSSf44w5Dsn( zO`0fFp)91Aa%sBUsCi7xscz|k*GSGY_@)V4Qa_nkH?e+VW2#5iZq!37r@~ASRNDXNJpOI_(?_ij zKV)pLBQfIj)`#D>KRx%l#QWDW4*#c{{q^?j|KFe8d=$^ZsCf)jOQ>IaWb00Lspw|U%J^ErXG>chtCOOn zD9p~V%ZyE+$6^rk>?uxMnqdf4C^5kjE%UeZh~=TD;b%|z%hl|GG`<>j!jC-ZUaIMY zT1!|C>A~{kWYL4Q(GO`azU1e4&+N#C;3AvrDjg44LcAXno{*wD<`rRY1IrUKC^ldn zul#7e(1(3>F>%1Uo~>xdjo1mM+ntqSYE93vspe;l~U2-(GxhJ8mrwRRVFJ ztN8S41xYne<8np?9+m)6|5_QlVnx)0b>(g=mBLX=xUm=X3m;x5n?BT2b;(NDnl zRqs^_rSG-Bog-Rgp+7oTpZCxf#KPEjK(Qj$HO5sHv~9Smf?v9@H2;uIfZYBf)uA=7 zo>pF29JpnM9A(K#wK~N8Lh0FsUGhSoBZc~e6YWCV1F?f_OS{Sno~k?J>yb4b4_^ag zWTiSAnDJNMM4?0`LdG{(I&0W(nY~bGuy;*Y>a*cdzj?x5S{4jt2}x?j|Hf9C!VchQgepCb_F7!P4GwU?bWI~ zo13VXr_*5w!PS@Pj0RHqxOf-Gt_0JOK0Mm%oH&ZQ;1f9>ewj}0aeYplLU-7UHP9`h zT!$TLPsnQ&-DZSFQ$df|$fwGd*`FFC?#sw=)S$c4=C4kvIZUG*oQ{l~$4)a(wW&_C zsc?wuo`_Z0s;>c#1mZvV+FI&2onZVO9PVYYbIpt*vjwN>D+JIX5S(NN*Kg=`1~zPB z{|xjx=qJ<3N-McCeN2g&UWkf<_4_p#? z?m0mTLl6pD88u)V222jd?0Adlm*b7D<~xF~LC^LTdUXprD>oDDIyD9i0XO&=1w_|D z49m;}sB-$eX{&@xeYmJZ^k;jqXn8TV%CoyH?`7%}nR-8l5$!i~i)& zg}`RKw(ztC3Eo!B{U@;^RKU!UeHmJdhVBlEgtSLC4rr%W3v5M)W+*FT*N9PT|NgHF z_x~tfROVD{TDboXAQUD*L;hN7*w4q|*Umy!P6~AympHP%{mIgsj~73@-@0;v37!j& z&$celFFgDl5)vQUgE@$AoNrxt(3&G{hq(_5_L_#w2^`M_0sCLB^6=<#>%x2frW*?VvDvzh>FA*V1y%+`F2i)VC(&2YS>!Ud0ub9 zKlV{+u3p|ve9}Jc27N0E(PkL=X^cEt>vhnHFz?e-O;l!+3MXVgr7bu&hDzFl zZ#-qS+A~eMIB<66P#HVMBoIaVrSE^&I`g^C53E*P3*x9w6l#UBLXq*#&=7wWz150h zhwlSBjNna6^Y>_4D%X@sqSb3({dW1ovqZ9Z3=1>?^tl3?z}S(@*@<8o!fW;a6KxP( z7{1Yp+#$LzXoqAd`j{Q!Zd?ip`X^WkBMwfj?okM>9bVNBxJVHe*}d8R^qiWBC=u4S zuFSQ*V|V9u#)ha1x^Vx&!u`{%5F&B>`Q{o!MQQUjO3K~Cs26|ln+tsSS4d>7Cqz^f zk3xw_+C^Ou2!^({GW{^(t?P0`KIgfw)fq0_zk@6hr5qQwIgmm3fpgrO4T0>GGm7HF z5E98=XB7G9A?H-nY3dqMh37s@E@j}+brg7SKBw@Y&}@8>g+7_+W2T%Tunx0+j_S)v zne79sXnQ?g{n$k-J2=V0&K4*>5Ad8sNFtN0=qKP}`~7(!=D(kV1oW_KX8zu%5STQ6 zQC37#xyqqXLcS5KDR+S42A71ZaEvp|lbT=sgk5UV^M;)k(0S=qn@ocEBQ0Jgm&+aN z;9(OZL0Q~2EMx|W)`j-9Zx^0?1lFB%Uppf^8AZ8i#>?ap)KvR_V%NB=k8&%r%8(_I zAQlaHhXTpww;x$``*WKSVr#7^}wvYNn074ETMbZvaOLTjV@j za<7#|w57v5GgYX2BMjZKX{G9AXR2-`32$I=PyIR98KMf?e2>E5E^>W)?I*fvAdp;^ zOb8&F3OFP*uJo&vy$!Fi#Jpv!^|=Q&?13yVZq;*>3SNON)_Re2L`A9LK)Pk!Gl@&h zy6J&Eb}xxl`Wvk>Qt(BVgs!9+d`(#_X}e|w$V4qEJV@BN=;(z`akL4+Cr}7$eFwai z)sJ0C2!wxXjM>(`Z{)?mQ!fuk3>vbuv5UHR^DY~P@EJ5_pM27~Jim0?f995|g!nwh zy2dmbk?5`flQrYAAbKk}(?ZRGa0Ro^q%ukJ9O#ccd~wG$JBJQ))*AU}ZTFfr5$%ti zmO$`B-H7-su2@euH&yi}SWVWkC=qMQZ`o4N zC^Zl<%$41tF?u>uFQmiqH0OQqcI6UM;JGO_ADX*i#@X@y7xwB z)&v{oP8@jAZz`!vKKJOjQY8>=wq?_ZOz5%<> zxYYH3$9yIF)xsOK3-MQ||L(z8)ICB-_IqZ)-z0v*Qd`K|1qs_I-4W?9;G zwvzVy^QmF$YIdHnq;=&BYhS22Ox~T6k&Cp3)=s%XGI_TJHPshS@@4H9qqryNSHmP~ z#e_^Xsgcn?w<0W8ce#vhqg1+ELzUGCKp1;auiDhq^=gs~g$%7U-y3NP0=_rwV?--5 z0eBIf+^LyRIrYc4HAkd)!#veOf}x>JOzMaPJy2YF2v>{_V_Ll8$*Sj-=p0Ji!h?vu zV(8~*X;t;|)JDNbrBw`A;US(wBG^JgBqh`?;hl&uidRP}5NA5m>)$lB}>E;85#T^Wh{D?K&TJNgGD9<~`k2YKbKGuK=hM@i~y713-LP z@svYig74oeNbskj2Wc(BqvvVR%hko2agx8l zCLt?>na(!FM(7zn#CC)s%>c|;Oz^tR{l-(i@xgz@}#6k>>`8ErbL zerbTl-+~!_fUTIG#^cu%2P^d=EaNZm-&gS8pTC&W65JP9wO7DLa-vvfcz}Px%M%Bt z&ygj^Ga1cd4IhkmGh)G3RT!^fhr1$?~PliESVw(j_$m+r%V{l{WC^EbtbF0?Hn~UeqVf1Y_q6*QW zJ}wcV zx2WYi?#&`GD1s3>q`|4W(|{7EnmWCd4{(DG*23Vj$uhJub1_EfsYJz%V10SZ!+x!zK3h*EvHSfQ8c)4ys9y&!$*HmX7 zIti($z?S-oqw_y*1zhl$AQ9VeY)JJA1`JXrC|EM?mP+NiGv?9B%cpvM)}S!$jW$Xr zc-C@=+z&Sf=q-5aJgC8XW*v;qdi7D!|K2jlTU@eHIuzf*9-vU7pJ02yaI{c{mqzbo zrBKC@cF|v{riK#|4?(fcm1vkfgJypi*X5{!4=I@hsMpc!0AqcKJ~9f!R++9-@+vct z2Y{JHD;Cpvjr})Y<5n}f;EvTRtcy0bOQ?c$Er1VnJZ5C|Ib zsPJynp&~;~f`GvTo<_$6K#=}!w$`L^88pWr+%l9fqUCc|f!-J&?G_;5gXmA|M}GBt z1FQ?tYI-1Bfc0g!8coE$@X+)gJhb8f7zD*kO^}p{RKQ#X)f^^PP}FHb?lMT%Q#3w1 z&h81uU6J0iqln=$FfZ$S|M3FvkCb-SxMGJ3`Cdm@F{7OwJp@R5T3vyG7S*`mlU^yy zF0a%OG1tAur}0{qeR>9!g;Q>Av{EgcVDx$vZq1M$3k)81b%ZtxR?UvPa{Q1^F*&%} zqjIT)wV~JtVQ^3?3rly#2X~Y)B88F?D=-tPuP)@Z=(6I^1Q~*Z$ZtrfsZ@u(K=VK^ z+Vzcdl!QKDKU6PQaTYehNgsh=Vm1*=)cHcKMlTDt=KL!%?)=Y8(&#LhN4pgRZ->^~Vlv9*aF+r$bCiODpb|GwuObJivqL+5!^R>vGu#k>`cSwurT z7YD?@wZuZsj_rZ5Idaw@fc(3L(CSqfxDv4=+0QmdSvX#Zx!iflf%g*+Uhx&LXDt?Q(R`)Yn_9y9YSMDG(moO$_> zog#X{>x_=g(z8(}H|JM+2JVEHonR1p zRYu%O!5cxK8fL&$iP30n${pOW(O9ey(nAC7R>ol~w;c;r@y{7~X?vD+%IOft*RY{E z`X-%hsSJ!vc8X?cDx5=TJn5lf9MeuMdN7cZvLf?I#ArHo=Yzm-hW@*O?zM1DKyJsK z)G<%F&I(6S=o?mT@*wz-ibLbjH4}op6Oc)PLjvC^j8-*OqbiX3nKxno=DpImm-A(9 zjmK7=xe92t<8#?i0Fb6L!LZG7e700ous%#q8_Vo`b_%km>pZn-L>jeYH0Lbp3Zj^X z2rQ>A4wAMZwNp_(5I#%b;U5pz4CH%8w^MkJt2JunMs?iyZr<}6byAu#>5PI~Dwh?O z88=v?#EW|!Tk8?_7hB^};n%z+TxB)2P;)iny64f1CDeD4E$@1JtP~n5a>a?U87hik zGC79RT!c*}%;uA1N-JZ+bt#={D=$jE49Ovv`O1C0yOhuEv?Hh{8guiLk+wPrIjM`X zSXm5*KPwu_&qybV&WjWf$@^j z@lr3Z!}#8YS5>M|0n{*hE0r0q?kv|ni3?NC8A6vOTN)6b==~V=%2;27Q zO4_J_H+(i_8xvCib}%HR42&2ND})SKLw<#gM%C%3Fa!W)r&2sxXM7OcaY$GG=kym8 zZZ~80i7@iB!Ftx1cWqLcHAzHm9U)2CN&s54Snx{`!(cTGJywFuoG=NXFvdaCu93j3nQ@yt>6L(q*qG@ zG=ziNogTtLx-@_BoA$>yTKB$zU?%ftm*2(U^yGhZ=Zn^F-qO!&>0pL;@5r1P(!rPEer}Ghh+v3dUuF0>5G);|e#Q)2n(ZY4fpq z$rcK*Tpd@9@uM+gIC`gyZP1c0>P7=$J}g1L$oJo6%ebE{BlOk2^M}@rFS&OLVti}< zyId|O$#G;nj}BfDg!7@;LR_v0vTQYbO+Hy~JYRG9JV*Sc+qGlo$aZHxh|P|iF3p~7 zNq%_rM!4UTfwdN!6WxTw2a8-!j?>&#Kg^UB3iKKX>0TepLr$dJs0SQ$G&30U%m%H~ zLhmif;`cfO{qp@S)G{~z9+k@>PPQDnSLhO*aVLz#G>J6Cgr26>r*4erUS&cXwe0 z)-v(xb#+yZ956PG7&%Nq5;=9w@PW;CXt=6!buz9SRwb%~Mr`|rwRy*Pu7ML;sH6-OJT0?fMH2#>TL%?Q9Df!^YH01(3UIPJCSC?gT!yg?-8 zkuWOwm&jDQJF=xfE&xx;EwJhur@$7>Nx~%j`&xb~*E0AGvn>es#b)~zM~#9glEe+0 zwTyMbwjd98wdR;(_p#1&<76Ee%kZd<_MNuuW1K^^;E48+g-iEbkuZ@-$QeNs*fPwQ z)k#KZZLnkV;Ea02Qs&KxDy2^?;ZI~7nJJL1xwewTrv7Hlz6&Qe`UN4 zJ=N%UYa)I}n1Euy57z7cY8jqGo&CFBap>8m15#~?h!&+4PR@|=H3f#u9a6cqei-_?M|^wNLFF%9y}8mH@0BWGoI}s89AoNbO6}$F*E@Vo2KT|# zN*KAQM~%?KfhRZO#YW!&r|)?OPlcEznR?e8w^5%eGd|4)+nk*9e4paA$#!es814iv zyen)0z<_DIT(0KX1Q^HXKqgPd6S6)lWqjdaf)`mX!QXV`Ajq$CXisiUsNT;q3C_lG zo)NgL4I8BXt{KH(?byBo#gm(qyK=kat=u1zvoe<=>Eyd%tG4d|^U)ZVic%Li!Cu53 zzFP2Ry5Bx94YxhmB?xZfx3>m2@gv_R=z&-6JVc2ITf0Jx=oveM&7#;y zuw1NFn9hNBs^3RR9m(x08m=Q*x#|Izuv5*0-3>i>nfv)zg`ldqnI{ocZM0JmjNrLT ze$pbTg|2~sNrkH*V$vg6F(#1;0)n1*tb+i>yHrAugX=$`8p5EnRXQLp32<*g8_WxoJs=Z{ifVoeXKe)wHm#~jc>)ai-Y^^KTet7iBk=aX0vu1UP{CPbH-|i0;h4N9jHjHK?XFYL3x=^NWYGIv+%BxG{#(9KmKc168?`j0*@B8 zS+(X4_OIWRqGW6bMz%Zc_vc$z=NImuZeN{mUwFeA8F|TRo%xELm8HA47~U*ie{1p2 z4_hC04dv*pigo*EljsVe2lX$qYfMF86mMXzCeQ3}TX?vx>?R?VyJ;at!oToIH zI0GoX0=IgV4ecc)>E+u3R8whdMwJPk(c$jqt&D*|*?E>=LfF?|hhs=N6!?bpJbOy{ z*6h*V1CQBnKkeolQNq?F4TO_?|Gbq2LXN(wOuOs4769iN_$i_%WK()@fx5>7+=4+c zYlu11%uoVQEmtqUTpo9e-Ux>INT+^1mEEz|58e871JLmQweEf1I&+VQ|5@FLGsa>b zs(@v2dRkw}>Clz*Lt`kB8m1|6om@`gvRrClNFueWXy4~-)N44Y8d`BE3`hraL$JK+mVozzmsRe>wF zRf!NK;#aW$K)zvG$DguwWF=F=XBk@37o#Z_Vogwf^X>X6+b&i%t+p25jP|@(t?hs0 zGhrWV@G(dTLIPnu!%IvA{%6V7s0jO7C^#M}UY#j7G%gHmDs9UZYT&{+OHqoSQG&Da zKb4R)tbR`M>PqW^pHKIL6~mcHVg$s9c(8cLfx=mypzoc zyqX+*?2^U%s|C=x&r-1_$`Ii4I^jGhu?)RVzEKsnP3suFVt0PM4lkB`WOZ@H7l>ZL z|7J@Z;=m>$i{j?6g7(geCEBBe*@qDUHD5TPr7gj$7dds_yTzX_7;_RwRdx* zhMd1B%EJ5JJM19p2*JMUsIb+CUwo65vuaOUB^Ky=h>3c|lZua&e4%Kmb@d`=5yVm3 zw#^R?z?0U-XYdi(ZR^|XthX^n4%4Y>xdyz@<*SoGQ(vE+@OFy=vAlT?UGpV?qWa5EY*vDdARuS69Rql`ddqPKU;qP zjGkNc{+Y!qXBWPE2NEP-e~aeYy8H3M_wV@5Ox~D)O7mFqi*xMes8`Fgs-&ZQmbBXt z2@}8kz|74@AMx;DkMH~fqlO}eZ=HjYg>HKEV7%6PQw;IEYELk1ueG*|n^)@ziT@iG zwV3`xp)9gU43r?oTI#kJMGplK@FDSzxHs`q<8ZuOo~#LR(}-XUL0x%X0X2j%$Y){$ zYqK>*S)mUa4dYKo#x?G0UShl*l=$3?w2TVP>{y``4k%LMk#Pu2y+RoC5L%>a0d8lZ z#@4^&jn@MZGO&(k8{kZR+zMS@HjM=Cg+7Kz1|nLDY}f{9@3O^VfEV)C@~ug`f>5D0 zB*!q_+O&Z~09|zSVyV&azgqcFVJ~gzt|EI&ww0km3KL-Z;`zt4hohh#{IaMFpwBf{5 z4B?@1LTMCMpBmg6a=s51>Y#IE+r#Q4IW>G*upTOb3SA!!aj=?#G94WW`^14|l}lQ2 z^YFAg#P|cT!4pM~Ehqe&%@?X366c}uaG%)Q?FKaj%1~tRXY`t7Aj=5C{_B2DbLTPAV1MEEgVDn-NGd(oG!0Cwyg0CKA z>NQ*RCh8GQ!kRJ0b2_FOHpL*S209hlp((x$9}tzON_upci%v;P^4< zX+Qj{i@^uC|2#RSqTLzFw3Mf&$3WV;I~k3#iPo3>5A$tLm5Yp+Z|OmFp=UCfETj1)}{+1qft1%dy{v zGW=Ol93q`J=tjvKNY7!QdgkY}D$7iCG~V4>>hZcxT7F`i$q5g7q;cAhI4c2waA#0RxpL z-O3PQZs3!U3Y~#Lf!%>RkZohK%5L)f5Mytv>1=k4VX<4yTY{gAF>b?S_pO^RG-{$c z{j$_X(G#@zLk|3Fgh|ntRTbenUsqa!LEH2qfk?E*A&?@|(JiR`Hc%7ob~lTPylcmh zCP%)F=4_(iARZ$K%>+9WS;%BGfX%uyVXntwHrlxe!ZgEb}M!`qWCgwcmKlAAQ#T=!x~ZL(a*D2f#x) z13%`KB3UzTfH>SKIvDCuhwDQ-Iv2#ub+RCcMHB9Hp~wJBjqG+_DVNHah@xC_$LTMx zRK!0HjWtU3hODszAHZDjL1)Z)8Od2Bn%b{HjC#w}y3RmuWAvu|WWXETylyNM*MH)9 zUJSPpzIR!+27uXidMIFA-`_F4f;hahQM7s;qt%kck}tBV34N{b%x6Tv7`}sG$zKn`Sr;ZS3#wilY07%(i#qsvu0%^o*N&gOyEJa)c-0 zQn_k2ZqvqR-BNag7OgNb#Pa3N##R}b^;=$0Jy?N|5WgWIjSKP`WDW9j@i!3!K8l_;OfDS@{jWf3`KcS|8J z@E4va5g7t2p>(1iKg&(8bRsT`iHV7j9>K0H4k{N?{zZX>oy0(;b`spXO0_VJ+?ss= zc=V5h(wp|GZZRJPCw3D9r{9eUsQ9ume1N<+)|iX~bgbBj++^w`229?G2_qIq0LTvd zSQ%Ugqd`>9Q*=jhU{1_R{>hM&gG6IjAml_B%n76t0=gq!G0@6PDZwxVT+Ih z?P9b*xXvo)Y7hG%;&PdBwuSmEkjV{6;ejbc!!wW@Fd>TD@F}*0#SrCABxOmk+>+9S z^Bnzf9%4C;!48;Xc2T_Mjg3GGt-8ZAC%^sW;?;-dW$_=!z1fMX%WhYv(g^za!vFez zis6la%FdhIumSTB!T&bsbzoDCTFtPr$H1y=RmWZzKK2WJiXQlw5$1mGqt@+rS{L3U zYtSDa&9y&0w|M9K<(q$NU7laM{YLxRx9#&6m!5pwz625Qm*05OI&-mg^SO`{I7VPj1BLx`70kOHQYd!$%1nvS8I55NpN4<2)2ZGFQm=Nwe zA-kn~(W|Cyu!PO}ls_05ddH8)hw-DmS@3=3ix*gnj=>A^Vz_CN` zR(FOp%xo3U74@h+_nc6$o^`X-Bi)AsaCdj07H$Pv& zjjiUWge5v@Q^F_(Vh90;s0M5I7m0DXrOEn~BZC*#!~z^FE3fy4BV33f>Z;C>Ptixm zkhz(O21{}VyV;4*=AiWyu?7O+$ag~`8R49=)7GWZ76AnYvY3oo3cF!uDzh!;Cw*F% zGMsr|Mqy+NW9ON>5rXz#Wo*t+A0_>nZfZisJtI#;C7x<0u}0O^ZDhG?od;<74ZO z$H=vX_OtD|mW4y$4mktGU{E-+s?@oQy@RU3#f;ifbr%(|Qc8%e&>d1dO{12RFAN3v zx^%X6`5V3-7MHBx{#pENXE5r5bxEGFpmTs)KD9F{xccSO*O#80Q$(Vr`Frg@|3;g9 zvuAkZsDJNK)JTG zsy^O=SVf&7lVCF4^eIg*=~_HV5cTkwQUywvBFn^t@7YuKhE0c&g<}B{4Kp?R2!_g(v?s(pz7xCa)w8p<+EqvG!-QMH z$h@U8*;-@dx9h)YU;C8KcB&a~2z@LzG989Nfa^{n7(BdFeHvH zl0KGZu;Ty+;G@w?GXv4;CJSbmRv$P)sHz@1aHVkw)<$zX(w?;#vJG%onILDXt&j*a z6@6L|4W2#aZ%Z@GmtOM(W_yol&;A?gxf5uGgFrK5yOa08ZVYU1?kOwJB=3c%b@s0s9aOqnCA*ar<5l2Ww5XgII!g9ur`Ocr%G|BHAH$m;>AAn1YriqS#&{4CeY`?wk)Ezi8loIQ0cuhu zGCP+{YLlFeV!YhCUj6f4jCsix{AKYgt=CsF-!p8c-oOS7_`*i%c&R*7Qe+~Iw^U6D zgqBk3NSe(%6F;GzAM{8awsu^M%dj1LqfIi^;mTfA8nvmkSQS%88nSU)?VA69W?E@k zn<`AeI|;F}w;w_T@f)Yx*KRLfe@nUV!eziDa-X(4xHJ0Zm+*m`?YuL<4m0}3vpbJn zb}4XiXMe6^e}aEH`*S_}6TQsY-y7K9ukJeV;=YkxDY2NGI%AiIajc`b;)nMBV(-4! z_8M{W6ygFLhw&`nRuHJvb162^b8Lr);l1Yt{8g;ukFEG)l795yk6$&)__HU~13!P# zzi#ue2_C=S(NcqAf61$=@9=XkZ0$)M?VId{@Q+&ojKkAMGd95Ka#SG~%rz@gddxk) zcH4hGd#ahvyngt|(IZE&^VE?e&pzizCv9K<>++3n79W1lI`d`g&!-n2-&nl*W$Tkq zet0zJYc}ZMFW)%5^u-(SJkQk+>ISnVQ-2PNI#vL>Kt;bo0HoGdKCFY}AX(-Pn`@$? z8-b*6E0ajW#cFw`M*5ausceDS+xONhBcMy);;27| zwcTaye_bwl+RmzFK5`ZEo>@CkCTqKuN^w?v0@Dxmw+{gYsiGK~s6kSGE4At`qSIT+ zL)KgSEo+gV%FFafB>vWSjy{S%{k19-i#xz#iUbY%TYmjjgB=KlK`>wWw+|cSf!Z}O z0YO!^ILa@jM!BL?5I?kCprReH_mg}R)FORVWoODS<2?AwgAronfiTK77+xz(6h_9~ z5+7guR52B_%1};tDt;L|u-C229bkW}ySUpejZ{3`1m)K-(4igW>1h{24};-~eEg}Y zq(M~KPejcuQU-!>Coh#TRHy$#o9yw7=Oofe$O~ZYUQ_I%RM2Q zLmmH@tl{Mgb-#x4OCe;K=|tAie*67k5cQGTl+u||q$8v8QC%VHH;qJuwGRE}&!%jC zm#?76_=kSgpx-kc4!!l827OrT&~LJJrRsrumj9WmV+c>{7xN0Rv<&&8?5sE5P!T{c z@JDdjomSk1ABoT!B|4de;sY{Erd}dzV%|wtjtcior-R zMOL76*l6(!kSi>0^l}Y3b~lQ}-35qEQDMwsouh?Os*D4sXtFyTK`Sv1A_o@mQqEZ% zO3OE&ZZg>h_n4mjaDxJ6W^L$=NxqCvIq6qd3XNIl)dOWgV!>yu{kD?{_+q6I@`If~ zsO{_@Y@|V~qJ=JKpX@}zgf;lVP7X|1Bii}L9llwpfM0AO0a_bdv9hlx%EuwY1x#7u zr%|TO<^X;*r(%>UYffL3?#&_t|Jk?_-`U>=PSIESxAApnD}26Yv4(?|Hn!qnU+k41Q0kSxG)Q(bF}yr$ zz@ZmvPz34+3l-ev#faPdZ*BAg;?$|5>xGtcXpA0GU!G|7bZevI$t~2TAw`S|K%iWM z!Pd%JZs5)KQvQHPN<_Utxt|ovXS|w}-+@}bxr$QNFGL2S{oc8Shu<#Vy}5YhtZ2`( zA$kYP`(4zh>IK>g9jd@N*jaFkWg%UuMf#aEDhJB6p7(k)yD@N`*11ut_aAIxEB4!9 zh5`8%s_P{NCW2B<14b>yG(dU$r*K-*9U`hZ^2SS zN~ZGds8ujZbV{sts~5<6V{lk0^CGLH{4#3ry^(eJZ=B&PZoOJK>9il-TK@eFU6Peb zHT9>ik{IC;PGwa~sop}bY19BMi9f3Rp#s`^`;(MFHVZy^nzhyOh^am4++1tY4FeDPfh%P*~|MXAN9AU5#3!TPZ+N95I+^l zxP1D2`>MlF8;K8=c0Vs4s%Z70Kqq1TgaiTeOHAfkuWObW1ee`v``Ci*Ecg`HFT$l? zeEi$Rhc}kbTwHv7SG`yjHJbWUMH^j{rWfd1stOptfUqnSRI)(3%(Z%Yfzh9)ViZ4( zzGNNsr+#{sO4@IoDVrLvu)Xz4bpgIoqO)UKO`}9R40=tYL{&AyTE0T(T=}Ke08WSB zYRWI|fbMnc+5wfn>G1vj>-NRFiy!{Bed+e%!?(bEP`_4ox^?%pLVnUiV1tE*`W4Dv zaZBvnRizGADKqt#^l?9iNRsMHrO@9oQ4C_+eg=bw%Hv>Zkm;ZrD$_wF7RYzy3mPy+ zskW~EH@>ibfx$HRt0h?nzev`F+g;Z3e;69sSKVp>(qu8(Co6}1G1Tb?XzTWX>-!1U zSEn20gcTGSL&FFD98sQx6kvtYr2j%8i}VKtt*TL?T`xvOwZLR@*q42!afQX<1;!Ie zdD7o>t-x55m)+TNgURTq)c`Wh^?K6sL0TEM?!Vdk^J#WTE#LeOp1hx&ZvXWmxen-g zbAQ$Fs+?&kgT$FmHjK!lI)&V8?N zW5|~o9mD*h)2cM5ve?2jCIcvBR~f%o!%$QLsw5#+TpC~tGQ&S!HmZFGw>v*p zE~5Zk363lk8~n zgen7D!=q791m{ohx1PMY@Z@IujrrDv2R}TzzIcAFed8-Lj#HyI}#2=1&x z$41XiyM+=)7POfh!a$2(eYJ4^^wP}>a){RDdl1Os#_8p=?=F6L_lHO4ts$h%k;ZAG zA@mFcZU{?@q8j({s#%P9+T$-7@9I_h922bGSQHSS! zAz{x#ESO4EfN*;X2W1LaK~LSli{helYY7{s>h;P{U*Evy!Q8;cO}T;GK!5+xhM#Tf z|5+4t_5ku2VP9 z(Frdj2pJ{jP?L%XINh;wwVq`k6!L~;jPPo74GUM1qFIW9Y+GyYETa(^@m3nmhS%7;?*zPbN599%i z)g)jEErB#WB}+lav50MX#KIL28`kTUU&vF zBmB1($#%UO$<{JX-}BDG{fDiKHy6*JQ$xGvG)OL@eh7xf(*UPZ?8KA2WlTrYXsE?yNiSSjZ zT^p1g?zL|j|r6fJ+U&$g2O_awQW~Q=oqYk7RHs2)Jd=A0f1$r3wq<}D< zsW-Mp))G5k&vz6;Da5v|x89_MUt<+XGfsB20Y+A+!7jJDgN3p!LudFGk>x=r6=50C zI)&DnSjhqgtrk{}rOxUrL4Y!AT7E0Tn5~zsIX@$~+2ncF+!DL0DQU$7WAFErAb@_& z@!XmhIV~lEKW}HyCMH8@Vflxhdetq};2aOppG7wB|C7!F!Ur;Q)XPTPe|uv+`G{?= z152Ena%;RKc9+!zEs2m=OAON?T%~eSuw+7(WCtr5tqTGKcI7DZ#R4SKVkCsfmPI2O zNIbJq3^+V1Q7klwNEH`Eg}5UuAI$>i*L?I^wIiIA^d&p%R!LQVXG_i*c9PjRmWzzc z7ZV9KKJ3{z%FvW>Nko;%A^Fo@)SvOPZ|=`~lf9P3?6oA;GT=vQP@t<2`P76rVa|Bxd^*Rd zV|g`9R8k4jro=~$KYm6Lw*X74CNZq~A-uwgtbEY2(OElrT?K_!rUP;mrPGS%lGSPO z*R)Utr9FjvWa8hIlRgX|Ujr=*+V7guRKhtWWub%DS3;bHh_$kMHjB1L`P4r*2D zVKeN2PgV;?ib*J8Ydu{7ZZ%6u;TZN+y^817F(w`(ef3@t4X53c>A{T**?OIUiKT{D%16e$$AKpQVesPtkb$O*ZS_;)|E@( z=<(@28|Cs1Tav$sts-696iwG+HOLZt>zfwG@WCI2fORCAt$JKK~{T93wbdMPmCH3%$S>> z^r9YWeiop&^02InxPb*zTi4(#js~181|UXmC?`RNxAyK{ZOk{z54i6@?_KzujCd4-_Suu==jHO zIZJprXM|UKKJTLUaA_qHbNx5%;45yY5CjiQ=!?1S0Vy(3G^Wp^NCa3$DVDkGD7eZe zO|UG3@ZbG@@$uc(-RtdZ-?rxNwcq=i-Wz!6Yts?F=G9IAQt(;jx;mK)u^HywN+5RU z-CEZaFAVm99A6OK2&Hx7>()o74L@<(C>iFG*3GRHa^o&|p8H;U;M$rpGH%2rmBw5+ z$^hGP;~0wqlEgr+AN5-<&z4|Yu2C(T==M0K+Pc0xFocD`C#_vUhGA8}S8Zs`z%G*EXq`Jx)edTd>FPxKRFiV*MK_p}f> z4l*4KrP_l9#t9IMW6z#C0UGdMLhvhywSTbSmTFUOY2Qey>HPOS2fj0CDutpqiVwG# z0->puV|pB3&YJAmxf?$h@)M)VwAj~U0hIu(%5HAY%-x4!IpPp&oj@#76Ic-ouKP%= z@)ZW%AeP^~iBu zG~MBhc~;wTi0|d3@rl|D`w-U!>`J-l(ff8fwcBN=lLsRRj2#Aq6=pq@>UF4lTQZc; zwNn?mgG7J2-bkPUBunD?p@Qk>t}NZWuyFs*;`O%(_v9srM3IYMnLzjuh&ZLz@Ye-L zS{s$Z%TNvR9%Ax&nfihx{{6bJ4uF zQ(zk1`Un#+(v=*@8JXtFX6=T#yG1!jG{(mv?!rUY%|b%btxxX zHPo)!D5uD1g4aon1xYxebx0d7&bfM=Zv; zyUv{$7LOF5upT+2r8t87i#6feGz0X=l9 zd+AEgL|M>4gjl$Lt9|ElO%wudo=tP4?!jG6#C{lVQ2NthtLauM_}`hCnH1J%f3V?q zl>l=v?-L|Erl@)E&$q68(Yi7ZmoGZBa(fzVM;^KmQmEXhVoXFPKw!I(ovn*Ex#i8Z zZ{ZaiL+mcyn{R#p)(?*^uSWv9TQ;!b^=kIfV^(j!IL(1D-D9f^QRH-sSlu7Ruw@}R?mEyyvGE$KBvsv5M zEXZ7nFtSv?))=eNt;!1+^{iu-m3k8B#I(S zt82|w6^yYrqJJQEnt};(2{JN;M3Cc-z6)wgQXM^msw1|9+9%TA0{O-Y5ckpxY*-vF ziXLAn)M_AX_d2I4E<8;TXw6I}VvaLJ74U3?kqUio!9y14F>=B9h?aPsyrr>VqBPN3 zC0Q@lVPL5^P)*aar)gU`fujme(n|GO5Kk;HV4lD>-k0ShD%5Z-Qp1$(-0`Hm6xltn z$`HsEPMJdCpsKN~&up(&-C4#z;eV+HEwM+*XEUA9LwZ*%S7#5Es!R?<0ZJ||``9#S zq&Q%dw?Pgr#?DaySU+7m&n*p`zs2AD;Wfd-%EP`x7p1(}flnPl2|j{Ka84v&e|?Ql zYNFcf)R%gzbCr6zwzA&X{PVTf3hd~mct_7Y7e4ee8kryVZ=YwxVsx^FqRq}iHE=vE zJIHw`PCNw55KbT@afsa@+X5@I)D+S)K`NBs_{U9AKl%PFk3D+|s`Wj43g7`)o5!?8 zu}}uTjST8S4LPw8y*Hy7ZeOdvN)MjxPrqwlyi4y2jGtcq#xY z@Acnq#eP?L9zS&pB;U=qDL|5|Q4ch*j>0>`7UDVX#i8kV#hTa2h$|W`_(%iIXguSI zs2ca;2wyOwddO=dXI;@bjH?Lg2iylF;#len&o16V{A6wV?L6DKS0J8^o-X+BQBcr8 zE3GuNn>t(BqUZyE=pE4au-4Nu+cZ|z^12U)8%)S3@gxN@X{&wXtFR?}g|dYQm<3u% z)D3XwOf1L*dCC+9Jp!7cX%eva9paO%ok(m%O#|mem(rEWJeHEKxKO_PIzG#w6l=^5 z?W^*et>sL$P)`IZuV@96f7{KZh$-tR6?W6H3Zqq0QU!tBPZfj`%eEh7h&WgG^6{X` zs#aj-*T@ycCrbj9zui+wCQP0PAgqFpyNYpdmVUU`RK|MHIUO63DW0OAKn?$1d#4zn z^Tm2>Z!+Si*-en7is=H&X}}yLu+}qZcZ9l6A~G37ER9O6PD- z#T(IZLmK4`L)?j(rqidtZs28?F)d-D*S`JjoNC^ZXbSwE3;@r|6Aq83YvKN#_MOk# z7tSxgd-sP&bITvxTK?$c*1d09cQ3T(uC(XgYn^+reD#AL9-R;LVIZtQ*U@6l|LT)$ z;{zw97DPvlF(*qwEH9KW984IpTiL_-UcqkD)?1<#ZQXhc9GbRQDyXieB?SMbN2go2 z-*H}h?KLR3uA@e}P-D$jiLdS!+v*C6LSOyWMY&NUabZhqr(%&03XOu9Kw}3Vmv-f<%T{j;?0G9S0%15j3-NImK`rQN_CKBdhCy!ii5=lc;?i=s8(P>uX76W*MaBXfYZ$MvQx=wr9#e8H+0dr`piVY-D$6Qf~Lwd2g`1)9#F&4ui4Rt(WMJEw10aicH8jAA(Yz5(3_`I3*{<&&Sy(J3!^MV6#1w_ z6>-kUe)g3bYAK!R+T@T_l{AT>5G}d&=cT`X&VDjRn1An;;0*tR5@>xJL-{n=!Y_W) z{`dwY3nkZ#_vamSJY0BuwmtXTg@<3YZhVQiEeVH=*C3N=EHjjtHfHOYFvVqJQ7aL< zXu9V-B};2azX;1j$}Fp?HLNMS`QH9guriEep~O~f1%X*Hl+YR@#^KZ{9DfT??H06e zh1zb6(T*mETbv2Es0JfawbHG*TkZGmv_Ja1{eUr2*U|970Uqn6g9rCJhYq}~`^o6G z80H4*mJ_TyyX}RB7&@eA6tc#6S(ei@4K^6-WP3z4fQ(UIGoW#<66l48m;5|qYy}*e zg-r<}QiH|nmMjiH+$tiBkxa;)$m9}6w{aQ|0eL2b27LX|(){mRx2`YVzDQARjIC5L z!`iV3P+x=Ol74V~dS12F^1WoJUKn-I5JL7N-*LrYXae%O-zom?o79YBqHh}6ca%{{ z2atsu=_G{1f2-{4aCtyuBSz~`Xb@AV5hp12lswBGV9RYsR=3NFE-n{8|VZwu!%%`70MUT!|JU zomgqzq0|J5(?PaijRHwaq_HLbEnIETy=F4i|I?292~$LN&{vq!PU4(p$-|yr)ypdE z?jvg1*@G-z_@mt7q}OVTRrH2@koDu0^n$ZM#;-A%6esQ;GcxO>GBU?9T3Q7URI;gC z=gh`ZrW|}90ystqjv-|V;cFBBmW;MK=Eim;NX)=_;>rj#$tOmU%zQ~=-~$T5f)%PJ zuf!;-5{6zsOwfoH06Gyrl87B0xITADptPsSU0l**3$lFmgQfZTR0qzxN%c3~=xv0) z#1@m{J=7t;prkYlqs_()-_h&rOE(YsCaqsb;xm!tqq zR`S+WIp8rVCNdF_MR9bjgRNFxNfQZ;!TWhl$DBYk7l7=IdENrnGhGI12vW8<*W_>+ zI8?sH4Htr|Dc(j?p1&_)=!z@A$rhO#FdF)3~ejX_X_Mk?$z#GHW642@s{blU%p zU>+=>y*qtdqw5#~syB`h!R9;JV&_WbnY7~0jW_=e&?~bF{kl(gd;YRB=q%oTm!`3B z|8)DSn=~2n_GrKHS?ktCWi)d#>KP#Y2$&{rRZ&)szjm$Z?&%fXN)5UESKRtkZlYLb zSe^D~;bhH8W}H6rTnVRlt~rl3Au;vrDq?8lK?UCsG}9D1m`X$-i+^}TvY?dbP|!oIzS8p*$^q=s}(x? z>KsY`hRqu{ZZ_V6@|d{&0K+sk884qC4fa@dtJb|A5DWvrs(IK+0V}<1n?vAq=&xtw zSjW10XYPo-XE2H@fL@aDsPSDLQa7HC9X?W%8`<2I*4v*jB;^^7F?i3AKDlFzx#w{N z5+MTwZGl7Fx^ju4KP}(<+ww=B1*hmCg)2AeX_JQP@wG|}Wpc&xI3{+pP_4e0fsh_M1{&C!K8E7}#dyzOh> zrdH>)CxHWZeJ4_zS1_q`ahBj&n%8!d@QF;4A)c{v5)wk&tt=FFU}EynM#xM_)`fHT z`;mRcM@eJGQGV^mI({|lbq2%2!l~(tH7AKi{EJBRy9J6(MwGRV2sH}r!nzm}e{;-P z`u=yVGoO>i6g*<2Yzh@sE;K@!oOxsE?tKSxa67GcFW?_F4P?@2aXmfH)y-{rY+q~m zx$AkdE?;TX>MyaLXo~P&)p~Mf`R2ogho3uqe0 zZ(q9In)|l>w>K8Qd}mD(?PJpxrIFs!eRFC>Yz8YaYGOW7_-iz*_z=;JwtV`0`~gE*S>9CzPS9w+?rK4c<;z? z`YEdnyvhJ;QvygpL59yB1Muw8zViphj*vtnAAkLqkJWhfSgjY26HNrG2GPGs)S`v%xvBfr`Bl=mNDZ?o|Bwh@0#`pxLM!opq(RF@ftfe0xRMBBfsbFgeQBg7rYeDojlfD+YHoPs4r~wI28^VVV!$`-Wa1QsJ`5Q$3@q z?-oM0aQ~g9$B#Aq3z(Y)V&8V6eq9w6Y><(XgqMIL4cMBX)pc|nN$Z1NH>Pch%2Km$ zGhP(9nHxPq1&rO2Jw^Ezzo?QmBBuRQy%_1k$G^VR?26%4eYl9TW?N0{(ADA5$f4D> z;l{tnb3n1o#I{_?V^>G@_^ys7+0h$-UD(>q_Q;U7P>kXZ^O3`Y6+xWPB|BTG=vDM6 zRF5WisR5cg7eJCr41A_mkwLy+Kp29W%~>Bm#01rm>tqS7ljLmLFiRsPWg1Bkla3e5 zA_|ce3C_+E%Eu6kI+lw5L8PAG!>vAH9_jPRN3A>WJ0m-t*2SBIk5SRW><_)vF{?V9 zNZ$H8i&g=@T`g)3mxCw<>B?j=)gw2dMvJ@G^B|xpE{)AUY+ZhjNCq%}nSaY-t0apV zC*mJZEJHquql8U1dw7Y^f^#7#z`&ZUOf16~NB@?~?5_emNCiQ5_5*gA|MSUY|Edz# zzvZca%TxcBr#h3Tw4nTIY*rp~dOMj!#Tnl4+ON3P<1*(8MefI^)0=mf?%ryBeU_&a zL5kk~^xV?juNUq=Xx}*B{{7q!k3Kn4T6*#U)MD(;w{ygCQ@DA?r?%g|^?y(QMt>s; z;r#U*H;EYzUxd_;d)vLrht)5-d*2u<6LHs>l$^pNuO<~QGwu(cb(50t_U|q(JigHx z@m^Kh69uu2@B{&lBsqH4m_TIq6(1oja=17-cnDf^3@6@RxPO|gW(ZyI*c>S>{^jA~ z!%x`RA*qX7N`Ch(r81&s3-|xXQy*V{iyE^7#m?OPJvItEVZqK@mmwDQ50BnRbnHaH zc^){!5>-&GV0Gy1XrrM!#*4iu7mMU2zE~?{hO2TLeiV`*h7hZM2S9fOniv8GWI~OQ$ci-@C)uReJYZMdBf5m6-jbt^51YjtGFQ zJWBxHc+z2<3B0>k=knbSU1?$>Q4b2Tq-OGBM5Bv~)Ec~#I$!+oe(S+ihzPHS7D}mNtSF@7ff{39PpJ)5?hhZa`AXz;XERM;XGP zwULD&upMv|NirAEEGu-`kfaw)g~l%8t5NfuclgU% zEBNovUrZgJ8{ zt%na_vBAvp9PV-Vr@!+P*wro+U$US_aY&qEz+Tqtswix za47Koy%L0oX)J&CR_pR_Tle1t@pAsGlg=8`V4E12L{^;yuMj!~9}5fsdBfOQP(AA$ z=y0_^z2AEBrgE~>cfNX!daM)+jBLw?5^+%g0;AHOVLiLnFehs5aR1Sa5+7RB1r!g~ z9kA8KLlCSxsMS@;q`>;7BpmJet4rU%xp1E`Q-3tbhn02=0NMEJD-!7<>J9RG4=(8S zBn>GwrpLT0(2(o^J4FM|3#?J5*XhR}Y@6{HecB2?bOHiF`XE%TH_fOBtJ4crGy>v^ zg^^@tKuex57Wh7xF+J#LZ64~I4(RCeJq3ImqrW9-5#P3oFYGQKV0UwNz}9{HtDDyD z5e<0v@VDAMe%mU(M0UUMgt6hD>3tL0P~Z5s(l>qED!xSaZJcWP@y2=ih3#tl+Nb`{ z^gymZ*AJHq`+|RGRKWa04941HN`VAXfPz%rY+`MpG>EQm$|R0j9eoUn7zdEyU0Q1y zR7X(ze(j`v`l$8jvOHb%IIW%?ajWv11{2DNJDO6JwdTKD`twcw9ElT`RR*~JmT|M| zXNTB4j`llAU7J=$)x<%qT=0D&gq?bxluHtG*QmK_`(dZG+Ib4`uQmwg<5nBg$qUxj zz)#ez@q~~Byy>K$Jp~;?YHz65%p8+fxSwB5+8cu~dFC&iSu$t0>#To+cJ;X~X}1 zqHPGUR>?L1YrJF&45;$#LsW6`(eGGC=%mk`UFEZpbQ$Kp`UV9+1Ge4e>Y)mdl-g6H z0hC0*c5pg31C$g?+5xuC%#kUeV?os}e3CHg;?BZ}SRW!>wJg;a-OJX|mQ#K;bP?Q3 z83Zlen$=aG&2-NTm8~xnxR>FPo@#+@g8k(3qd6Yi6Ea)_KHvCKjg=kr_1EIB9rS8o0^*Pd zIDA7#niGZktWz&TXb>N3tT}5~`vXz;2visq-7<876RBSy;EtHuzi;HAEpUL+KjW_a zU)GdBI#@d?HIUI}*xEv_$4-46*b#;HoQT14h@O)=_CF&UM}z2NUHQ$4y7`~p9;eg$XcEZZWX7F?X;Y&eZLrTcJ3Y7!gxp(KY*beovt;f zYrW3F9sAYKuvhA52>+&jN9g?u$KoCNq3JI3vK1N%@|r_JLzLz6{L-6`A+H%HF>~!} zx5caN`5zu#Si1KYMxdw#dH$0tw-D7Ws{^sBLysKBfAsR=%`ocsO}@R;g|=mPwhrKaL%MZK1-ri2;63{thN?yo2QNog~^T9fV2tAsz65 zSC$S;N#E=Mp04zkA|+pc2pZ}tPg-a@Z6VE1p+@VhsUNkq>(%xoVEHlS)<}Htl^IIU zTPaa(c<_p}1sZ{&>F6ld!A$}cU>L?2d)7hMxP3{whTRPBHxoiRgtqkk_J@C6{PV-s z$LtFGYy166+S5N#?Sq&*HxLcby6h38Wk1*NYue(FO*S#o+E&9C3r$j*N?o!KiBLCN z;@c*-&Q#sX5d1Sd>52eAYr@hAZA}*MN!`1R{r!m}3i%<(c9$C^ zVVraMw~Lp)hGegJyy8PCJ$p()vTe>W=fCf1WzA#gTh>gJI7yF!J8Z;|8s<2=aqMS< zoBHE&Dgh_OmO`bOY%*Bt{Lk5UsY24z@a!p#eu|EwAy7Ao&#dT8)MeZ!#q`BzB@zVI z3s18Y^(iFW6)CH&fv!Y)90-2SA0T?75FwbsYHxXl3B)0wb{7p;A?Lw6^#zN$T2fL0 zAt=a}@ZXfe^a@dNe_t^#6uXA>3@^*qZYPMo_78O8Cnh#;qLt|EfUoKyeo9xe zOD}-od)Pfi)8hPVkBh(v1SV}19Sb+Kx6qA$?3Y9Nvc0!lAMxs;58LeWXp zY+8MMRt(?t@pv$99M$-INw-K);Q-3;mKB=korOp5x88ojW`HGVaCqbN!u_`wAO9Az za9{o-`?>VR8~!8Gn~#_7K3TqYS04_IGx9FL1dy-~)oBRlJj}D&_RC*xMC?c~4 zxFbp1Y@P8Zgih$2+6^Z<@hc;#liC`|&5QNey-~>0(+K%wba`{}?zQ&mhtwe$Mk_|R60IAkX1>m_8+oDteh9}7Gbxl+X!bGARZg;bRAuDtsnU5DYY~9q zKwPeX!4Nv~aGQEeMr$X;RBw&0O$MOS1HFNu9m30hry9yL@Dw%S2j@=mYA&iP(t^bH z4zGA6#HdfV_-lgw7ElINXh&pzLxVg-<}XxFe}{7!m(h&XX~aY`#ygZB_OPp)o_=*) zSbqQ8_T9g=um5J@{>Apy`Syi3$l=fat}kEd@$$m#QI3KV5&@hEwh4@dR}doP@r^hL zGHP)2`+2T){|maOg60_#AIZpzxCem*;3Or(04X5!!s9%<+48+aW-NI#_@R~bAM4>G z>NfHOtb#T@&HHisL`Tmrs1w$ut1pq&!E8vZ z69iNx#odxnF~bpLLHyj7NfuGAVC&ZH*4LMZoMdZvY}IM-Do|h}I@<1{Tbt6PMhukZ zU^ydF5akDL<47hL$PS8JHRpBetXYYC{U%U7+I7MOM%G)G{{U3))j~SL1zWapm8WIbgy-42;qDpvW*ga99 zz_f#9GS}1gw3o8PhIw^7qxPHQM3hXW$K4Oz$J8h@uq2!bc;HrB#C4a-34*d z<08Gr(8!atNsWz!cto25QEBXCB;s7K8>hRI5yC85w+!}3p0!Hm=F>EVh+*ZuMJw-;&#?VFPJhTx?NExg1 zc6?W3*t#y*JIu|RjJFHIAlN#}!X3fZS(=7&bWu6`=nfA(0SYBtZ)fG~bZ{k93>Pqh znX|2$Trw*kXIm@_hIK;yI=i@5LAd5z-AJV{F;TOybtC)t?A|>RB!m&EK`{%qg=b#>RUZ(f?h8wCGDf-Q(oU?KS9Xid^m7-Nr5lkyVv@Fsc~B6Aeqjb2Z&{C z-#ESaaE?^Cz%^3bFTNocmTrI1y8K&`G7PcSuH=k6w{Ee>r)BWcXTDs1^GkK~)Jm9V zza~V^n?&XTs)IkLTg?Ih1qN_>bAR5O>~*+JA^T&Xe{A!nflOEYxKH7uO(cX70`!zc zdl+sBV=;hvp+XsWHQeAYJ8-HP7?|d_Vr%LY@>_b$On)g@Mv+GP>ndJW>=5!f~|VLY80y8_DX?AsZ5)0KDF6e-J8zQ zG9crT_rMy-8DPu>qc>1XkJ=ZOAXlM##)eSmBKQUL%B{sx6#2YA*3&JRQeHi1mUQsL zT^b8XiXUSn)cMhF805;2B1ncg@v1G&wB~8*l)@3Qo4|=l19Ns3M!c!KluHfz;`O&E zy8`jTwwGzEJO)WNopMS14n$P5xh6KGvOmfnG1lRkgY!~HK8b-~0^BZ_*j0*8PYtI$ zwgc4~yoQ3OFV@Nyv6}vbN)qK3qo-|tj4bT~oLfb#)K&`yR6!Uk=VxL31NbGajXFNn zC>_TrhdiJmyjpT5OMkGOnPOPvq~WDM6NvG`h*r78Py`LT*kSj5F=0r|(vmhDNTET- z8DpQ0+f@GuSFX~iO{K9@r8Ng{?G_p?N2?j46$~PkJY@2Vp#=zp4ABF_U72fr_ig+9 z>GqBDt>RBL4xl9V(RSo3>Z0?yL}={q?PsYXxq}z*iWIBh$)`IP7H85?DgU)fg(_ z$6nc!s>u_bv-QDR+WIs@LaXJ*8WR&Fcit21&%&p5T^*;9Vk&0`%qI3wjbW$5$jQ)P(6h|wbSz(f2v4_O%R z6sP4`@K^yk*sWBG1^=z%q(0w|kv%&fRa9D@5r>yulvOtWbP#0)343eOj z;Dsr$i|lLhR*|w!fU7~&Ipy#QA{#Pz2#bh4!gwGe(y-YHq6NS1hb$>RszHep^6u1x zl3v{G&E!FU;(#zN%HY+$`cGlgQxtkdR3ag30gMi9j5SF0c z?}I$aWTun!GH-TI61aTl^8uAN<;@pF5m)e{ueP9)pA7akX*6^e^iTWJSFJ~vsBl7W2YrI%Q+Cf+r&{N) zw=j`ls0a%P7ejPTpFIBNb&J<`N6{B|$Y9SgCSnHsU}wK*J$PHo zX%wXmAwL(t2MP1korSqm3xAuTmT;}Y58F4dwT~WaUpujKYuP$+ymjl7#hI_$Zy$Gu z@9m<3Wn*rx_3pLyxer>i=Xu#@SeHh@Iyl7k8C=bDOsaiQXQxJ*Eno5A@WeEDe-$it zod)9u&j{Hh545GZPZn=qZ=X5cI{nxAho82uo?aT{|Z%IuH0;$ zJ`0`>=&)H}yRo#7jcRc#BD)w-=m%!s<6vS^YrES9kmjkeGV)mA%_v+A*|m``+!_04({}(7r8u z_w9J)C4BShE3fcBhxYB>vq$`!T5sRGcQ?*{?_?FUSokM|&%qxrK>Ukd!cQixI-?Bw zu}ueUZYgy@%C(9By6E9k*sQ81*C6!pCNa=s!q_Iz(%#y%l>t(=`nYNA1+h#4hXott zD}_2X^>_eN4wmT(@H6%{?`!~1k{IrfU1nI2o6;jyW44SXxh+0XH)Y5Bo?^q>oIM?` zv&X7$7>rv%mCL>XaG%%Kt=|AuV}GNsU0ZtQStuJz&)2VAhtEsT{oxP&8?c-#SA3_H zaM-;%KyBKnJ=gE)T73D3^>O>hMcz@wE4nPur8&)k*z2TZgp7=MijUR~cL#m zFpFg!s!5kq$^-$Fwb3JVr;&`i==XV;Bwu=|#+erdiny6B!zrv}~GZC&(lM>MMX z=Nq_--ia!B@2>Q`-zMdTegKm+^#XWrG@)Q;dA?zKOcRaLCOhyPVW}1>x*eqZ{2KPw z*Zip?w4XPN{3L_VP??*9I8*h9xVh!;;8Eyj@=TvPV(;muGR=k9HEWp-07a2X2B5Qd zb~Ck!|76>@`CA?~8#F7#TirBjrqMVYICp1XLt1Um@#Rv13Sd4$u|7F$JJvv|s7Xff zV@4G*IwC+Kv;)xD3vUV&_R#bP;b!xHt{K%#IxR(_wPx;;KP!ShIwgPeOgP1E2$31c24R{_F`vp{xtLT-Qc{qoS#jwyP@kv$+yB0dalLNoFB#sw+;K7D^H6I@@^c zHYsp!)~HY_ZJz?Gi(xhNs%|ow4^nEdqcsy4)`8RtAA_dI(i;d|h`%FNn>pD&`z4{i z{qg0@ZAYS>h81++zr?njltek>2grXTLW~MD)lw*@FM%Aj z-DQZy9q$(8v9-T3J8?dd!q$DXoJQ|Ces$yy*OUa))fG8W&6Ls-eA3d%3+OO#y#x|e z;O0rpvdbjVC(Ym-&|WVYzga5W--ytKzIY5YVC15k6;G3nYtEgmVkP%3kp|XOrJv?4 zpa9iIY?#Nt8Kg&=zTkLEXaIRYhQCHXl=X)# zkGW+!-gy_|R^DmkJs=~|u1P{x0wixAr|JS1wj z@KnRc&F9y!exC?POA1>T?PIXzg6>l8j@w^m^k41+m*)eZcrfaAq1yq~MLJ-AgXc7= zE!_Q{VLe86U=$&(FmX);gm6@Z$gm=lqRCJ-_6++6?)O3y+c_UwjIDo8?;j;=67W6^;Kl-p9C%jE0K5oF z{APD4R+YC5Pr%NTxt!Mi`YlMdbN1T8>62P6x9N$9ZOty9=9HmNr#8i50^@~A#)^S) zhGdVnzrn^i6K_5t38kmTH2~m++M$i9es(`u+mHW?%+8Eds}-$q$@i6_@+?aZ1 zeM$pj-k5?UM6j-A?I2s&-{}4DfA)hMhGuL`J)2t7^P!$P;+6L@fV4bV*Bqk}m;|y- zKRDraN-*dJKPVNfi2}Hl!+1gcGx2&|{@JIS+PY_-c7}r3GA8gdW&mU!Js?s%2>9>? z=;1QC=lZqv@c-E`>^;ARt!_l(Zi!exLz#+`24DJ$PZ;*78VioeFlour(maH7;#m{Jw{(#5DI7^dS_ix zyG}5XFQzj{3lB%&qq|XiO2oB zNBXE`Ed$P3uPcpmHl&O3_LXl|Gt$l4GSND9ywa$rQ3ZNG|IOme92vf~45o6;_8Rlr zgfTu*2LJ2M)*!)N24fC>yU&$z(1b#aHmqmR*OIgL3SnqMFVuyt+`4+A zqb(eP9~foWbA|aCA?QU%mS^~hE6xYuCzfpQVojFsSAfYpb;N8GIk$D~@taji;$&9D zKI@tju|7oUeeb@lJouRLqaVJ7>{6d!Texy{{?X^{Gsj|aCDtQU--*GK#9}?pDos#W z)7o|QLxX~W@Hb=q@P9GY40g{>uc)jVc@UpZgl-~qZo_V zt?C5OgnPq^+D^$<^HrZ7K$9umgMkERdNM%v`E@dZkT|Gc#yzLHK}YQ{az*X_nhcDE zyhcHmvmDmuxaTg+omiOrf*%9Q9Y*0k9%DK@3)*N6h|maGQExz`qJtzFIM!}!jj#8@ zw{xw(yoX_p6TKV+{gbQ)#>d%Lt)r06`14D>AIx^&D!9VT!k6b3PM=&jce3}RVH7D& z%%+Z0Czg(%U8b4ox;PXau*))3#i+trzTHW(-#T}qb^bfHZ1WG#MGYrMYkJ-UQ}^>2 z@X!_IL!2yW_P9Zse)uC)Ri7%XXq<3|u}-MNa^rNSjMo+2Lv1siK&*n5Gw`k8o*NS8 ztDYYAi3Cd%LU(3$7;{JmK!qKC@53)6GnCtg!S^y2euHT%p1H9jVzR9=ol_HmwVdQ+ zE4c&cDe!eS1Vx>8Ls713z6T^lo%NcgRPu*RbEQh5*A%yH*Ou)zWxS1FTW2-6=@ zgcD9^xnxb1IkC4RD2>*=9ij-=4qGw4IP-n`lT|HrC7Rf?qXrLdcs9rW)Syxu7HaN{ z>BHvBm!6f?Kb?0Y>)zt^lW_9x$`&UI<{Aj3(%KjAEX=)=?&_fG{Zc)>&RMIc*Y$3( zo?h3R)nffD^Ku~q-1Rc5jWz8vCzn1rwc1u{n?6>UEc3OZWPVzvLMe{ASt{zbH_OHQ zTIMC=m=LVGpWa?NdRZf6WU}clFBm-(_L9x3Qs73!U0Yxqa#x|wM8huE)5XE^En`J6 z4a1b@A6#Ah@k2-~dE&ct^XDNeK6RuzWpPz0yLFj{ZpE<=u#dVHCs`jujhczY=V89D zyf&nPXU|(Vsk(Ck7oo%|G}Ae4^%N z7jNJ8#mrHxDMZRP!&o6@fxw(bzx$o${u1KL<1k13rfc?yIg=nC>#LT-B6+&vtEX%Z z33Vxxbcm#f`4O>r5R%n^Vy3)=(D84vaFG8!BvqKd_YJ|5X00XdA10B+dYk?EXZ6aU zT>48)F#fi}^qu76)Jl-K( zz<9a>3px;?qLZpis3xW>T>)k4m4ZX#JNk1xxB|c5jq0PPUhMbJa#7> zB*ycPpIVr`(K)6XdROq+2~2?xVV3*2kcfxP{{91-Lo?B)J#Y(c70{%FBA8?srDvPB2$bBy=>jfl~V7;uhg8 zHoF#O^fQ&r%3V9>t|&f>lP2Tz4G*ViJ^ZkB`Yh3oQ?jL7YW)SLgzUjWDbY|xjsdiEnG;_*T|^6=PKvdq7}+|sKk4{+}j z*V-tQmv4Udz4^JjGF<-T>!AsQoMfe*)X%X+yh*G>21T;CwE+`wGZwsb>3jAQgg(d= zx(#C4!PjOdJO0bqey9OC3py|UOzz(rxw`V|bc*`VQ7MrGUWA|KcplTh`sHzbKE?Wb zPF_e;;kjig4`^qce)sC)!-t*$ zp@99&MLw(|^)zg6C>&TpS3=nFp3KvAC{08129#|q)Ekqg4((ops*^_JuuZ5yq31tt z-#s;d|2-y$EL?tP@%EQXpB%@ROsc34Q4KgMIL>PsX0n3;RmH=08^Dy~?SwqnSkXYu zA|+E4d|hznoC?kyhb^hlLO{Xu4e_O7d21(ky~)7Owy6V#LSufx;P3OeSPi1S$kMVoRws zgaC2r#6x~eoC+d6_9}9lgh5ro|BRc3!yb@!RO)a|lAvNYfkqiqYB2y9MkYZKPBGuu zdMi{x9^Zp@gr;W>OuVTA1qDrndPp=Ekh0lS@JA|SW}2`S?48Ws2@~c|X||Skrp_+M zM*gY!xkCioN|YQ&q(a=B44gV6!!SJ*?0-(-3@Xdj(L)FJ;U3eugl~I>&_cPKfFtxi zmKb@+;*ED&r#^lB48)u)uO{}fmw~g|n1=|{FP(M3Tz?^q11bBL#x~fsZT{gExbS}d zXyNv?g$pMhC-dNJVD+$%E!gpDV<0kAzjPKtv;BoI5l*Q;Up6BA91+wgpol?LQ2X@J z_Lb9gqxtE-e$7+xM2wDvn8ooFnmQEE^Qkkq~hkA0e}A9E&Le(Z}Ktr6r?P(?aObqj$Of@$@?1O z7_vKKJ+*IrnGUObO6Z%cqql+%mDzR`8WZ`ka;;`&GNnAd8Ln77lQdK!>+g@~ktjUG zvK68PikX;{w51CoTmG}Fz_Pvn(fF4uQ~Zopl7F7y)32oHId6Q4j$!Os@GQw7ri z1N~}3u>+HUW;gxo&l1gCO}2`V%pnp`?C8yZ*1Tf4VH)G(x@oNnEOTIla1_oozHXg= zzx{XHz3XR)ZSoa*)s`eOj!cn#{2UscF-3IS&X`LVA0k%!62s znV~{*0%AximM2T>s+b?NNwCc!5^yd1I0fOjDHeFQ zD-(+($u9N_H$K2iyI2R^yTdGB)b&qQrO07ipwC3ROZs*?@f z8k(SZ!QX2c5sTTdq2psUF-G|eCZypfnB*YW+M0c@;r~l|Ut1{IjG3bP>PZWsUnWCh=b{ zqBJ`E0AEr&K$DDyreE(Un14gmja((V>^er*R<`WQMI0(G4%JHqqvt1$rq(**D_QeM z&Hdi*9A=6QP||Oh^x$|mgWGwIEz)>(03r@`llwQb>u4s2Wy*5I>I&xJY@F~zul!Kk zOV)h6Y+ZhPmeO z1f{=>)>)Ei-Q%o^;p)vU`X`B2-MeiG=%#-lXajzEhKOp`&6vcY!v~bxbTb;ig9i>L zUDCT7s#e#{f?{sAAzLuWKZXQ?OmIL>38m=G@Iv&$osRwIHMsNxFV3SL9pnwu$TcP) zcH4w#vxA7T^s$gUToyXjK%cK4qM@ z#6H7c@xO-eKmq}djXkgxi{A+3H6W5e zGj4Trsop-=Den%ZRC(MM=&~um;ZJ=74HVgGs^!M@H;P4Ni#+>!$ zWWm%0FR?~#e7vj!8_lFS*|B@~Q%9b3R;(#{j*06i?%n}mRV7z454qT(L{xB_gb1J+ zI|xdA-i+gS)>~xIGRoMH9OvR)|2Qk&N8O1WnG8YcW_SSD3Qk#Po2SG1+RVRXCn|=T zwLkhN2Mr$2cE(>lBLOF$MZA9Y4G9@OJCWainSQvl!l^y~K?W z`=`cENoNAO-reF;A9gadt4p6=_fHd>a;5IzvY%`nxbIqt`(&?TgQR>u2 z*p=F;d%Gd3qWoqw2z z6Psk5PENSgmqWS<$j_ZP5n(ThtXFj5Vm}69h*RpqZs!U84l&(1Q47m%yb~j2mp?Xu z23s)$9v@F_!s9PJMm+x1Z^mAv><$HRU;^7i!I$zxPe=t$A!RF*Ii2zT&!m z;1PA>17&oDUhSo-&r$95RI9g&4Uq}#iAksqeIXsY642e%lMA`}!lug#3L702pn ziLh`Br;uWJIYy%_aXWx5Oci8&V!pVgOW!YD{%Co|_L~P`*bmRnKfIEDTqZ%A>w;0x z0;6DW6yuKO+UihqZ4tqP9K*ZlNLTI4)Z>_47?S}t+kjC8HAD_eGY)$5n?gkX7 zCaVXlwdra)xoSF0fo^r6K({0Xx}!VqP;GAI>$P%u*x|wFuRCSv(@s}>JAd)j!j<>za21d4YqVhIpwe6;H(ERN zcyyq2Un4BIlSdW5rBv}-vWnlqs4mdq^(7mc)tql=LKa2a~KBcdm)iLy;W$VyaqVL=}0`gQTU11t&oWEtnAa z)0HO2nGWf4P(?_zJzUWng#p&_r0xsKSq>eK1Bp+|EYq3t8^4;zUCpepvYw>hV%Jf@Awc74!IK_>*)GKh-Bx`V9LWf{JP{-phNcF8&Qiap6g0Qv7gB7 zgi-A?r`w-@g|?3q3v=%X=mzJ~I?~^fCVlB5Xsl*#FBB(;3ccqP5fb}OBr&+sSck2K zUP*h-9zM=~YI`87c^+_C#Qw(fHea8#7#y~3N6ab?Ld^s@{7UDtOCr3ll#MDjEjVdl z61@LDn6!03V+*t!owW135Nd{hE4e`9XutPYXu!1imUny_p5316x+*ENHCd@JGEsjO zk=9RA8{tH9z#zQoxEY-m%DHJ{%*Z`0XP={w!ejEqK^*AtZ05Pp>SnD{Z|v3U1;cdC zc8Zr^f(fs#3Haq3t{I#JfITO4gl9Hzz<_EzftlC?l=~6sTaA$B&!Rdlb3TE|GWQ>f}GQ2i8;$Amqi zgG*6wM?CH1>#JHun!w;KMMewG%Z@&1fAZtP^;uOe3(xY=;^EQ>IW49r*i0%7%1Fw6 zT%9bJo#Y5|U=6&oX$JnbLtQ-bA(AO_nCfI@6b*4l#DZl^{%YO2H2>)Hg^QoAn}2w= zbq7Q;k8s33W$3809j?Dvt`!;txc5G8Sg#ab$*{J*2rD}d#WMkb$0d6hrd!2>p?_CP%4RroT^n<`3CsKA%qoEl#|VHrZpy-N=$Z6|(#3!R0>=?S6%C$S1t` zfOmQ7+Za16;l+oO4gCu07@_mVGj+wx*VD}T$s<85bw%Gc-F6D5Lg)GXz1fA&?zLv_ z(@zy^0S3Kgyq0mQ$jLWOc1STCK!8*R##8q(k<9Y4b4bSxVqmk9O1T@txq2F@Mef`JcMQiK%u#m*__vI+0_s~a(@Ujr2v(LFxkLjkp63=}H*pTvi~f1iYP?dL zPW#$#=odd2dFqIeOa@wT8*@{tDMWrtY=zl@IpXc{=?(pnebT5>r##n8K&S3Hg!F2U zEcJ^CZlqpAdT@r3x+oP6yFK{VOeLJ~N8(ZXr2Ei5E_3NYZ}up=Q637ZSFFH;Q9*>B zPkq^tocH8)QyMNb0(-P~u<9EHo#RYgj)Bt2;={ks-}hwE5)_i4wUJ32E}Vi2s%YwL zM6QL(q}f}WdfA^I4K?3V@KD>#&dju&@(4a~#3p}YYq3y3q#ee|qrLpetc85)%kHbn z2XpKjNo^To1cS%^u$e7ZrCw%>iD@83t&=o_144+)=_*haZn5)52#P|1fC4;DmHNXV zg9u;}h%bhdrnrRg$rd~59Htz8t9|P$by=N5Of$XzgOhB-mDK4CW0l2&A8RcMI zIfh1+9$38&qD0J6E*eDA*@YW-mdBrwM%=f8zM=)YR);hq+XhTrT%Hk2>;N&1y3cF# z{Q1R4cm93cL~Tw9%B;dNxQP}zbQ3K&2@VR~c!{EV3;&(NJR(~h%0}ySroc5!aN&_& zW0qOxbqB7O1!AJ=93dQ}>4I6sLWyv8IBeRJ$|LaWGNh-WZxx>=@ZGc(f^ec$nB-ha zA^gG)adm$`k7Nhz+D1zWE^dX6T-=}!zC*E2?<$Ms?{<1Wi)enaf>Xko{u?-Pc1r^P z)=r$u=3XOQAjInet!b=l0;Dga$RI{yqT>)1fwEnOf}$>iBhIQ z)7}sGIDjbt*&lxrjp9aHiRm=^L|P;nw`n5&v;v_tKNq0_1d`quO;2>77k zv6$nRR_Y*E9(SUgDuqKi%2oJ>b(j)0uoxwM8t9F}3rxmT3{>@LPPAMP!$qWz@3iJ- z#g$11)TZ>De0;)SD-zB({LPPj37gpnBa`}QQdv%Y2!eAYqF^TnCAhk$_XE4|CLYVF zO>6U7d`w&H=q(Byf)KrQ^mO~Zzlsbd-Hcg!gF}zDeysBza@(X3J;jGukwhb{3RbXW zD;6QqKW|j)lMP<*(kzsWT1tbvoz!uPjFi-$h9*coN_6nlmPA>}Lmv&@tQb{XT{$c( z5MzP8^EHgWfUXi{YuTXH+q!dy)_VWp{M_}>RSSdxZe$&Uu#J6erzpDtH7c(By>;ad zrQ2_vzY`O#=hq-@^n`Z!i8XBMV?Cvz1pUUKA#1|W%ca~w{qRJstUo>~8iMkz8i`Sl ziHaBqUMgz+@EzTg7B0WT0DBBnRMty9rJfl5#h@CLmPRMbqmPeZcG~v_CXs8j&sUmY z7zhHvAP5>jv-IVa#na!lJ~-39c&h!ED=SMcwejB4OLTuR=mjo)WK(*4^ity`Qrnll zYCXENc>7N4;l&lFnA*5YF^fNb*g82&;I!|aY9E_f+4G4mIK4fa;`JGWVgS(50uz7N zJ;pN$gPZtb-To2OW#RQ4m+N3cI9$S+e{{S3(fx&g%q`4);rK7EDDCh|bx&z0W}h)= zXS`e+h5O{=q8nSUgNtSVSYevs!@5M%I{*IC(PP@n`}Xb87H58FfBRN<6w`V6$8Im0 z>ylhFi(Dmc7Ao8mfh)exzZF)+(gDFJ$y;Fz#APexnM)n}&pA5N)M~@o(@Ai~_^wgh z0SY*xoG)hCZEF6}wWt$H93Q-+q6&3-oAY=iJ2`z>KQyp5iX9MzCfy-B9Gx?$8nhkT z(oH#@$kgAQG)$0{|HHA4MzBvG#{+pMB@&QPa_9!zrL=mvP}JGQtE8Jr61dot*yDcA z=kw7F6kob}a&hLwPY=$tzJ3b}v_aX7;llVKuz-ZakFny?qD&Y(o+=@1FB?_c1V@qn zlqK=OMfMXwJO9n%+Yei3j<+uSt##{Cd*`ZW;zxQ72)CUW*sAxl&!njm8 z6MGy~M&WB>m10!!x?U|^(-H>E^oE*vN-5C)`UwgsXzAqH)`b~u%S->Y5(HG%3sd^` zO1*LTRZF)w>cYiO7ydfS2x$J{BSt{DW4ob@mE~gVdO}~01;=q*@H+K$O;tkQJ!MrO zhWKd-@~p(bGRYI2}r4t8usMhxFnkO_S{-Nq;nVck$5|ahFDb z9g&`!HX0MT$*R$a;Z`CoEcroumX^WhT~sc5_ouXqQHB4;7)LxN3ATzA7N;9`T?aM%qqRfQ0-y&}B>NPQOM{mUv}{FTIQn)c z+l2HSSXdK-ll)c$v)+!2po`A7v_I0#Sd`-fBk{dRfWo~JZP~L!TfFl&$AUraDtqvb>(L3!nxM@J4>H@(K>Z0F2u zo3*k1zMHYEslre0U*j0n!K9im)a!b+v~|KLmokVdF#!bRy_$Q!b^9`RmNZPQRP&zbO0~2$Ydky2D@-Q5lf-tT{&tt~Qfs=I`CI zOJ9iO6Jx=JrN;G_bDgj!rDD5o0k#{0c(F;eh+;-L z!>}~q%P8WqB3tzVD#CCb25%WZa|r(+iRC*YT}Xl>gH4;zSg;%QPTS1M_p&< z^|J{lFjn9wU;3YO?b9ch8EnWGoy+NCW9+bHe{l4V*5H`Vp>mELrKS#3*tvaMhy)z8 z>E)DNh0+uV)}2IGb%-&$4%hI*`xYL7DU-_&QHkjPU zGr8KV$C?=mu6@mMkVaMF+=uPITyZVAT`SGt00g6VZxm(@$m(;C4aS?Sgf3RbpL+yC zF5kCqa`^(?7+R<9xF}r~jeUMPj;rnh65=-5yDJDo024gLTZro%xoU4AbOGhEqvY1johQ4yict6B zR$*AmF)~qDSJ~N(Y7a*EsDT(leD2l9*eMP*FhGYCOyHy{wzpeqQ!b~)(}B6EwZS`) ze&q9cHuGHW`8CvS(9WUhE!$OwD9YvId}V(4u65<62E?^+``W^V6HC|rx%By$j_0fE z_S(VK1y;&lqB`N-Sts9fPm!Byt*Q^kaCYF|C)Q4j*XC`+oTQuc%-8L=kH>a-u%SpM z{McWil~LwC{7t;un-mT@QL`F?^?Cl@9J_+Jw>G{7VQK6^;0s3M&K`_?LiY-O$!CWY z8SVtU*G`SHdWjQYbcFEpSp3Hcza5Y#P5@=2&=o+x$ruaJu@ONyTG{nw)g7s7pYqKmi?64k8}^ zA&T9j^FILTJxv$CK1OuKPEHI5upv)+eEQox$*{@$Mq>*N$S@L{I=v*opCva6fS>%R}MhU>uXaMblJ#5+5_li4F&=RyIm6vX8hnVs-{%MXvp=bsQy) zFv?bpP8z5rmFa`J&sDxq??L;vyJG@j-x->zVdf+h3xH0hDvfrM&zI5?Q$Dj;D!OYI!8Dd{@V2)jB-}vpu^F^9)Sm;*FRh zQG0b84)&Vw)`XF zFUB_l55`_brzs#Jp3`pcvYg}zUCO%I7h^_OVv_JcPKzr&4DT4A;vAwyB zzElpnt#PkE71xk5Xq@s=&15>05KAJ3rLQ_B9}wi;TQ1KgE^>Lo?y5B(GH4+X&8IrY zYGcc|A=$XGV(J2_%56VXsMNv3M74JwBQo8}W{@FZneoTV%=C<%u|Bcpl8==U$5^~} zbMeO?q2kI1XE>2ybZJNY%eSs!-jZvl5);)xA5H zk)rv8a+78`l%^*djk-0kW(`z}(1~Keg1II*pT*Bqgs$j~iJD!v@Z^*pzB#Cy#fuP3Uwl4neZ$&o|KteR{A6^S*SGAmN`L_3Dbbu{CtlrP=o`I+&dUHnJ$RwfjD z_M|FI;1dPzS3IQP#hPh{@u^C~fz{MAE?ry#$E7UN@_3Gg);}B{hg56rx%XS2Uuxa{ z3%Gz{?3TAQAI9Lu2nquYl&i~2dkgqsH{L=$^i&bDN6~(LS|%$8e#x*+$(ep*0S1Da z2%HEcdzFPwJ$0ivl*s$!55@XNOQpI44XAU{?d(QEgb%+%P z`o;ceRimN9cIoWqyghl=5!TQ26g+*>D2clT@?P(&6|6=$S8PBNurQRjNV$F(8w3;F ziBH|6KYdynv&)N{!C$H#K@pReCjh1^799^faX|}>0>o~zUDJnjKcLxlX5a}x+9y&{ zACbUt#TuZ$`uG|)JrS)}@3+t1<{bH>yGx&)SU7#Zb^Ed%>D%+Gez1C zD5`5wXk84F5rPbXaF75uOC&8au_vkDtb%JMCL+m`*`*;Tv{JQ5s>PCdr2P-97z7wf z5w|XmaOeS!raoT-c0nGdWsZYC$Y$@w9ZDf-f6qMj04XCjdk}&aoPlrzh*gl0Ame1z z)C&g(Jv1YV5=z>sly<}+9oIkH0ZK(N&|B98LxR35=y-OwAXfE)ZU93JJGkQkQwER< zVkHiKvCx77uVq_oiYZsv-ipDvb$aX(ejUNii(bLot~>N{*~8-AIU7Z!0C41bqAVC# zCMOf(^XyBf6CW6xW1&~@a^Xcg#D4~2^+6v8K)bbJqT3G5(uJL`Cvpg2gr3>@$+3*$ zk$;7WKn7eK`q>SX(ijFP2SkX%Scde&Iif_TBRZ(aiY!aq{HPK}QV}NY5}f&f^1f+L zI**lbV(u1f>ueT8?r&av5lZQ%2g65k<@Y2aoA*j0vgNhwo{bpOsFw6YNr%Ia3t} z7oa?82BSyr-pLG!Kh+jO|8(^*>1%}36akfc>Iin-90^%68w+|l8!>+HwD;qG4v4ad zUKXSbd)_5|tT0(_IPF7Zv~a5NS}i-eX*OdhSfR44O6P|DuW>fF>m(e<=t2GV#OSfp z;}PxHJ)~+?Jy2mYn3Xz1bg)lgdT^Zb9qXiD$;eSTz!xC7LBg&G{DjI3Z@v=G&TKoH zMy#mQEqXx4?3ep{Mw5ySF55#-+GF&Da9*R1UvnK#U6YyZ#|!S7M<4XW075IGq#)Zf zcfej7mHCW8Ip82UF+n(`r4=j3-@R(ax$g?DhH+NU?Yk#y_PW!ZXT>!BMtgPd&R#4R zhg-Q^Z0Z97(p0+_yafkho$Uwd(iW0j16RE6muc}K{UNn9xQSq)G}0;N~Gkh$~ld@F1}o|8lod1 zhfTGWE!*}R$29>GZ+SfhpQIkLKE@iCXRwYj2bh&F8x}Yb9uWmz>Rs|o&7@@a<~LGr zq&B4(RW-0PAv4d*2rqk+ay*|?Sp|ejb_CZX{t&p=W&+a7q=XiH7WQQaeua5MGJr(1 z7jdg_%xBUy?hxlcz}OpywqT6BQBpUOy&^}RI)bfjCoBGGQ_Jud@UP|o|52}*4K#+X zYi39M-SbruD@w2tvr*obKBV)0XtIm|^y)ZhHyQfZdJzrx=kKnyubifEFxnnJJvh@o ze_`SJEZZOLQ$IYRfH5iMkn0=WtzAt5i%%z8Fht*qyfb7j&2dzV4Xx+Xa!WI=C-M!+Bw$s)!@J2g@e(%|%>-g0p4rzlL#w4BTIORerrR8RmY>4<= z5*ph~l0HNp34g*C8#Yk+pDx$f65*axa!Bafu4h6gf#&TY9sU(Z6#vlv72`wqeh(ko zewRUCcF4+;vOIA!`&nMoSEon#Xz9y$7H^zV?dzaaxsr6(#XhDEc+$(T9z4lmMd^_9 z090S_*D^nN!tW-^*F;c}tNlKCe|Ze0v-9@=H}@Ey101m-s$}k*hNZ>M{m?r9aqIS( z_QmfB>r_KG`4v!NSqxA7F6MZ9dJZ|DmU3-8gXyAeB4?lR0f0#8uc+IjhZ%WUkb__b zve3-0$Wj6XO#u|RI>?^{l7yJ7mfh@SHsfUlxpcx_SqI8aMKlr6W-8ps*Gb^e>y zm783inmyqty&$&e^jXN8f8}PV{*d#RR|IYu#%>~Kg$RE9d=r*6#OOAxRf z*TvFF;3@Y*F#-D$_U6k9>JiD%8oMm*Gv`TR z+|B$1Vpsc&1DWuUpRR(?>sj=ymkNBtiQQ6f(64ar*)yeTK799_zTduh$`fY|$Y-LU zg0qNQeA=j%YSa1Qg1wiv%iITzxfvCE0=Z`Y0Y?$-l_Nqr-hV(Pfw%7+hidUc0zqdg z9xBgz$zImrcoFsWTkXGGq19)?9bxRJ2WJ*fegioRi9NY4CorD7 z0{DJJxB^1pCPVQ+7`x0ak`s+e*}Ff4u&RB^AYer(74K(cCGwmA(|O$}jiVX}{p2xc z|Cd)5Pk$Gc+C+fH@w3m-r70}Sj#LvKzHzE|@rWH?=5F4~H&)#!9@Nd8Rf$akhyf2YS|NB~@{#aBqZNUtzdr^%)M&-v85@fM52WZ{5qLIihyf2YS~2>Ggohf% zgQq9ug;r(GGR88g9zpR1AvzBeYCCzfqf(X$fC@=-BH6u<<(p7~Af;7|>c$k?ZI!~I zjj46(*E@&6+I7$R4gevExB>=B!vn_vqXislW2%$fKccE(V`IXwNHT~lC@SRIle-L= z2fp6K<{DLXGC5H`wp4f+;_ORHx$ym$tp~A^;zd;dbfTyOYJVaTb&*)J%bzJwqk~exJe(a&Tv0(U?H(I*D=JXU z9>KZ>KApY{B6eZp#Pb&lKdml2xMigTTwqbB*2525r_U}vy0Ccd3>b4TUbKDjRQoSi zdW##U6xHg&j9us|3NM&7W%2713!i=5`u45fqvkR4ZUsg-uM&z)NNHobl*ffBP>Snm zqcM>iZB*lOdVkdzo_42)H5Q;d-!%|Q*rN5*Aqk)aEV|&S&k{D3Fnt%pg2w*G&m3E; zHBp;>jfd@#!9tD`aB(Rh$eet(p5v4=;31*4SM)bY0fR8mUCU?_^(a;D7kq zg};LW7Ly8$t!Ip;SjRcm@28Y~`Ojkq$@&H;YTI|2lC&>jWTS2VHodZKCc7 z_g^PI=m-jth#45?|Ir~BAQb=W#QPn=@M_%wVE*2_9Rg6QO;-Vg4?6;38~a)S;=N_t z$18JE_2<_|^MU{BiG3)@Hq@_B4J`}Di#6B()04R#e%y17=I(a$DZ?^Gjk3`=JTPID zN_usW*B>$`tB@O?S4*=uLot?|M4APcOEHZho?^l>>Rx5q`io8O~)0LrZ7^`Et zhL48?S*!KqHw))xVo6*btC+!+n8La7UM+ZAyRjFIeN;&!0}(}zvkzQstv-zrLN=-T zO_dMzG3wt8Ibo@kr*u^+-rUTuJygFrSn%oK)>tJd1-AxUSZfX)I+U+h$F=sUkG(25 zn_YOm=&5RMl<{GUJCkFoSt}D;3C9x}P!}}07wB)Vrfm%8A6w0~d|E~^%kR%q*GRX) zp497hXw+M>Tif%>OaFWH*dO=6zhBt3hyDAd9WQF_s}EWa&O=xP?q;#Pcd~-s9WtWs z4ij4~(&2GJpKqfe98o_)3iXf^r5Bb-Wg6sOGkM>f-!x@I%Bp1FJezX>m_TR0!usBC zn)VLnRYF(X;NfJU7Wq&-Zu4(p$RM3LhL!H51fU(O$tYiSH)^t-sZBezoc4#`cBD$# zC1|&Hv2NC`@2sCcr8fPEeZH>4&tFb$dYOIxbpLOEMn)6XhfePDTYF(Xp)BGmCNeg@ z^5&C{`SJ_nD6BDMY2c=Tj&-$T4jC;g9?A#66R_m{9mCw-d*qdE#QSa9ci zsYyqesTa(H<#5DMlTLbP=LEYchLSn9=m>JXZiIF{1PwZZx@NJ@jsFhcpLU~8MkunY zmRYbGVFPUCZ93`Ss7|q)L|E@Tuti6-ZWa!+{p8S$<7h;5ZoiG}y0eH7fmQPo7nE55 z&ignT+f$#nZoJnz^D#M(stSv`O4}el->0n)(cB7IEW*-Kz&SbS%ULDl#gWy@>LgXN zO4*YW0{pcSWrQGCF(HeC+k+xsL(JrNR-UG(uNLoH7u!jbA?xxY_~hiDqW$^2#asca-C{u)!H2oq56$;ZXMSFBrt zBwUZp>mQ4sDadxKJ zxWlG-0}^$T9WX}+C@;MrHo}_=r~Whz0T4@V_^lLj`7!!}El5?M@{NKCc}8K!W6P{m z?m;nfP#GrSu;8!@49C47iWfs{2eDMJjT}W%rEn-WZIl`l1MB-CsKRs2@^>(y7fS2~ zr;s5go{ph1fOTZj3v2sC(4}977w{w8^P}*U+VnecBe4e6S9gUZbRInvCC;+-y|w6I1nfp){{$p@`RW;;mn3- zOB(>?(;(2wgbt2*1J59_)R>?z2kOD1(DovcIs1Q1tE_SlMThfHR2^gI%NjtDHt;kdAqqyw3_o+oP@9kX~C39cU9 z2*G6H?}ZeMJ-K3VoozA@fB#&!|Etp_1)K`7jgYef`yOHsV8(fPquwXsN_uHQjD}uGVY+wpr~z|? zjk2b5JgMv9@)HTHfrEHjVrQ23%v`&U9bf9ooi!6=H2avVAJW(bh{?fpw9?z`U~$r9 zlsZta8Q86|r-oUmS_Yg)18!dSfuv`<`ljk7PH`DZU>h`*lD*;{WEX{M4q&z>t5~S( zFE=V>cKznH{eo^u^8Hh3W{$po%C_VhH#Ek$i;no!O1Az4)il@cFMM{}t5K3!m0s@C z;0O`aBMUd?mOj1SI(~P4?qk;7{JmQX@7`@6JtoWPZ%*pwVIq~9xdlq9SH@lqf6N z(6C(!iM-tH3bJa*c2%VcS2WAu0;{rmQ&tm?CM;6DBq#;{d4BQ6DWbOa$0z6K?rIsa zo(G$avZRN~_nFT{t;?f~O+&RwvuIbcaBjxwY@bF`lnE@3I#l#Zc66Wc(ac;O19Xhp>5^LYrJ3G<6} za-oqv%kB#`ac*|AtV3u-WNZ8Tf2)+_A~eU|1$>-(_n0{5Alitrq(Y?>p@ecZ;<_Wn zy$>nNsk`?M_V1&<&sS^CB5s*t_Y2xHaa8#J02r$Bi}JvWhRL0f998z`07P60w1&TBnzUwG^X(ehjXOG~Q%7BJC?3S7CZd#(jF{xsY?mf^F`s;ivhTg3ke$SU|V_tX))TUTeg|NkrG{(DRA|LxB`cL3C<>0!nI zmCApsFs2W=>ndn+>|T}LN%Rt(*rBYg(*c~-HZAxV?dAx7EKzd8Ep!`w zctd~xU`J+yC~L)^C#{AtcG$k444{fRH>x+Lbx5P|gcho{Z`8)e%Q{;CEcTX3KXrtY zWQ1m3R^@_FY)t90(~6Jskhq)x357bn3Z|lRgq)MX3$o3%n^`BUB1G{oYP8+eEtn8V zh(ek>ZTqP$AG`J${1dEM+&r`CUmxF1ptBC9GF(nC9BK(M<;{;O{Xo2gFnxEo!>-*y zR>C8U1J-KgwAaRGGNhZOT+uL#jHg1CEpF@U1LZ-(*Pb$wSfW*swPdn#!QWODG77Cp zHR5Xy_J5)T(J0y6KZW-F15{1G_W|(xU>l_%HWjA1W@0KIR({=Oue`ZH;JlA)&{upB zcQK&}#~}sOlZ<6D)}fCvAWMv64v}X8f1Q>6L!a&kmYJbB^QzH-dZ&Z>FtDay zv$DYO90mghL+Opc>axwJjtD>Pi`J%%jG2Mg321O&ucyOp)e-h;0JG=dvSUVQw?>JvUEDuTRQivEIHL#wqVZDrwI^ZBjO}#3Cjk4w_pq1NE zP$6sphtEdb0sIl~&%IU1J({%!yF_N5>o4i!S?rlVp$Cd!nnx$wbJt}>p}1lSbHhRX z@H7)36ssm;U*YB85v=5r%?GF1*Su@l^-xvzx_#v|H=rE<$I?f)7iZ4?^x#bE+l#FS zN86{5vbRKxt^0Rrf(~X6PG>!y6jq3*g$rJlgm?6%5Tyhas0u#~cm44r$DJ3z*$np` z{g9Uq0ySHJ1ez(E=9&9T$HD)CZ9AGW!^6_$3yYV|x4*llY~W{(0ZWA&MsP&I-$D36 zOo|1!v9-^`!*hLAhrA)F$LK=Z#U2eZWQHuGqmHHSNlB9Xakc(~B(Kx~Z{I$prZ|iv zr})*ujvh0fp4aiUmT;Q&;5b=dh^s82R>4C&jKd>tXnNVwVp+^NBBp^jE zB{s8xK6`k2sl4@^+Z{s$YFeZ-%Q3a>@;b0YiHnlAhF^#qO zwjYA>>J~;3`z(CqaY!087VYjaAsY(**bn2 zjGmaOS!qnj%8LZe_doZbof48S3L%!Z-iIp4hnMn+rllp&T_C3F>BKqcO%H zCL&sagWkSc0o; zHg0NE1H;~}BVZmNHI4W1Yj(R6I-_hn035&2WjF~KFYovape}M#1vB6bkhz_YRgFG6AM!G`uJ0M4?(LbH`(+#cOu2jy$mfd~xx{*RAvK_kQ-~B!oQ% z&wV9l&Cgrg<0-%wN>JBO(_n2)1hv!WdG1#w>4AvOef`2q{uTK`BMP~rb=Gr@@w#0r zMFq83p}H0+C8sBnNlL=lK1m>2REqvOQdW{DFLoFzEU6pH5)(zJVWiw@;_pR{Xi2ejM;@>L+<) z0E7O_6Et{55FZ43{Dq}Q%cKO;@*8g6`!{U!(i`#X?7orOlmcp0B)iyth+U!ga7?o{ zDN^01qK{jJyP7;}Tcts9D3VG;po|^Wu^NWPu)op5XYI$o56EJ~lTPET&z;fJEzidF znv+%uf#Of?-eHl}_q%N#!m^d!xG^~}^abVpYcF<=8 zF4x90X_~UeoAV*S{!4#l1N^tSJ9*KT;e5J!;D;3p4i67ThSb+cp;PivuT3@->M{%+ zW8H$4{*7vy*tk^Pfxg>g>Qjb34b!Iw1EL2!ZzPLMU_@^QUT)>}XCSC=#7Z512Xw>D z+b+@kUIWKG$ic|x!L8h|uUtFyWc6Sbt1r^+o^tykVQJj5&wlwkNVl(iv+%`NOCNo@ zI5U&R+dg^-NHg=e6~Oxt*8&e+;Zt-g!0!gT-&4Bn0pOwr`*!B#Ab@W(XZ}(%|71nQ zIM*`=G7Y%xM=*`#TbHqZ)wcC+yC+rKE)hD%?c|PrRC;KH;d1fZ53Tbb6Dk&GzHYyL zJcy#y^b<4kf?tE`WjSU=ZNF`w{t)c9Kd?*7)z-}Y#hK4R7j*w_>)PL1$B&b~$hG_< z<^e%lN<338T`mHQ!wa`gw|+dXZQH$zUoAX6RrP6Y592(BrDseK=ma+&lh{d+*%`rW zeK8ByDmQc~P8_vS5(20hmhwhvFxkf?!-9(x+{+p!llK9j9ow||duLncXNcZocL+v! z4?HR#-l%R$x>Ym{p1f7+O?Z>MQ!Lix>5e@craMW0{H}1*v#xmgDBc;d0!VZwXEGC4 znha~?P5Xr334Cv%WYhw^Ju)LG6z(UNSq=+)mO8NCkz4^1c-BlE81XO*X9O>ka9)Tr zGABJcZ=!PXcD#>$_oAVfOFoTtCp*ID2>=`V>U~i0BEI-8xpk?1`=2t8n>O$WvZt<+ z5vU?Xv21wCQAqfyLukCA`aCXWu+MXF^cJe#eaYVB`I{h@_9TO#D%m#xdpaEEG@oRI z1}&6g6#jTF&9x*_fYS=PjGu~Hf~^|6SBf|jgR*kTb8f^*=IHL;a& zZ@pME`2n3BjQBD+`6j_Jn?R0D)z88C%<_N-Ba&EXKf(knrM>zXmve(A*TIs2AP~M3 ztVP%|U{;q?bb2n{{;_raBzG+(XVcqf+NUnWSi_xqX&ajx6R=lo3B#sD*|KRqf$eOK z3xFLSE-7dUsd+jCErS@r4|)~*7(^BwY|1_k8`z6?PQSB*BzG8~7v%1)P|E3-KkHPHAu3dITS zZy;8G)KNHX36uHV?;Nba)8U}=Rl{+Z5O*v3a9ZEFcbKy!)&@j-Mi_tUy#>%|v)`b)|Bg zUozB;#>b00U=rkvB4$QaXmL9nOa$?3h2$WU(mDy)uN4q(aQBkSYIFjAvZXa3yR;`( zRA7?s>vikbCtGf#bSULa!Up~`S#?5^@b9sr zT)BgCfpM3K2FNA=4E~|7e2WT?2NQMV#6i+xEFFd5D7Fmk@2)w^!0(qA&LzOUe~LmD z5D{DuC3yoX`{sB@J-<;~n-njeSaQDlecHPI{%kVDG@s~g%VxacImDUlufo$Z2~S0{ zRxT%$m++hT0uwe*Br)*;vd&O`nF(L~DoQSwC@Es4T&vZ)K?-~y8z;~>2}-E*EFZ*U zk+q@kHAXP2P%17w|{6uXe;-daied(#B3sDuRg zra7Ga;__yE^uB2(zPY@KxP4P45^!jHO?0eVy;w}BXDb$yAb~Ycq-2BMvoweb3+%-z zkPyellb~R1JP8KIko}B}FQ;G_du#DHmSkItK1zsD{3ia5Q;M&Ng;qX5))~rwi^LZz zfZt}%JT_|MQ63w$@ov1F*yjx2Q+nCsxx$|3@i}-EJU!S||J-*}F@or)obH|Hk=}r~ z$SAKPYSj($Aa{tuPm=fSMxJ-+!Ue-jQAW^!aRO3Gbb-TZeRQH$I~ajO-l`iM@-A|d zrk4cyn>>5dEe7pDDtcq0Rtgx0UgA)Db`S0A!EjLQAYd?f#ZLT6y3$N$)@V zzWvdCC#=4G_2kl*pR_(W(>`;0>4V!I4_1u9#2PrkF0AR_@aa<7p}bg)N1J%s8y@d= znH9SCD#yb-+b4~@>y*Ebu%*#34Fs<@{rI`GmUYhS}42OO32@_b?WNUr`Ow; zZY*4e+;OcFXIrN}Yt7BF{_)AF)@N7e@6A#+Io_qVWzP=V7fB8p0mn9sw*ce7*^8b? z2HSrihM44fo95X{SAt?49O!K0jK|yXJLd3GYcQxgwP6d+iKmv+dh9`e)f9D;Tj=v z22{6^0%4Yp&WSM`JnTi{MuW?;cZsND>|1#W675)8so;PtT6$kdmK&jNR`|;(cFJ3C z6FQV*I2W$nZr#4T`1LUnCL$m$g)w(2t##qjPY=Er$toi8yNwc)wwSc7I@l{TKiY*c zgAUWX|1(WdhQjnI)-WK*kbMA)>kA!)%$;^9CG1e&){7NzN+{#Wm1sVa`)IS5q)u2P zQr~4!aBsyLAMnt6Q$$c_)ATAZkFdZ*A}6S) zfK6d7#JVxqm6fNLxH^iroJXZ2;*}v&&g-Vp&|fzi6MJsto(vra?o*r5vd3{L-&q$PV#}7+K_V>`Vr=2-WANuH*cLnU~~xCM<#n< zdC!^zn@YlGXZIpX7wl}z%kTIyn=9%c6NpYZF}LDbc$H(X^h=-RoI-kX#yjqyS1TP( z)CXx4N6vCU7gGq5vmnTi^a= ze)inr%vb&`rAoS9Fg+DJ1q6_Jg6fNjRU-k`fD(iLbn9*fH#H{=pptrU-Quu(TVhRP zBCEJ{3o$Df&FYmJBuu3%yokv5<+s=!o^VMIZ4#}kijH}2@P6&-6QM}(m%Vzvfg&H@ zJy^>Mp9JMtYQW|Xsio5}BZ>w!CZftYdn<*#g60P-6h>_P!db|~#5(HrNc+4M#Fl3m zW$Cl!8R}J3YDl`H_NBW^m%fi0kG(a6iW7ysQpGJd137<~KfjkNRVTgdhCpR+{r}tpGfqzD_ z`9If;Y9^h|HiL*uO+f4gfFr*ciO5{#=YMez0kdZ5x%K`1Sx@OQzf>Qu>LHWx7)C`! zE>B2A91W%1be3v9jl`G4dp|)*%$DGhF09A@v2^K{E2Y!a*+wR-apbQbgv!&CdpED!Q`(9_e=ase_5X7>!P}(P?aJ|-6kZH;%-_%jN6!SpJ;sPUWoo!yqm1kVK8w> z7bv<%x@b&xT>!%rB@Mwte(5-*ZBBBLs6$C9cA;#uxjaofu0_^=Tybqp0 zGk)PkI>)p|4O87{HgYt33wjGMvYjyh5OP;9&3&?X`?{D7Jvo`lWYi%E$<)yiWo+nA z2!&_i*T?%jaAEE7{pWJcWbSBU?|KbC10^N&7n-TFkFh4KU|O!;Qu0lo+4hbo`A zyDxy(Ib3G|68c*Di%_*ZlaQ{neS*fEbAsd@2NAr`yUfUV&pWE&{i^qX3T6S^s7{sp zLg-WGSTQ?Q?-rrgx^7yG_(+Y$lh&MEynScs%F)HIkG0Pno4`zIgs?wHRQcx2 z;>@up+z>eDxN{GlO@4;%yc8L#BZwqZqO!qWqov(WL<%>F`G@BgKKf_t+b zvAf*{y$U!X=FvL(!Q$;}?Mrt#POjW!K;_uT+QN+w=I_4;dXV1Yqch2lu`iCrq(+}) zmSzvP9AX@_B;t#hZR>~chy$mC%O-`L9}$=GfR$F}g~qm49$3A7cOF!C7H7@EB%Ds@ zk7LyVPIje`-6+!hP~-M2w0+qvIv_#G+=ZK*i&hbbCd0Dc2s|}Awwhmtq(qb#IK}N#CKM#G!t-a zeG3=QEPeiEm)E$SUDJAW1M9^ls}~n3FB}Q2;IuLLKC!v(58wHBM|!zZ^P4obf>*`L z$qOBWR2<|zZyT!R!?Zz>OV`(*d<-pV)t4|I95Zfb%5ZOf)is1bNK@*eNg#^4*W2PHj~t+Ko6S`WopuT6)??hdV?X|kN5Qq73Fb++0TFqFy`^I_2N(~**G%D_9ZLVs8}KRRb%cfxEWlz zxp4U%9>n1ym8hFZGm+KF3#C$yo5*|`IQ#po)02I#@T<9e8o#2c7aBSrE0Zo6Q+C&+ z(Zfg{|L{KdDlFU!IjViH)h;TcTNiny75TlaScI|#^+J(tbZ2|huy#ScRHbkT3fVR$ z2L7-fJ$C|Y!HFJks%mf(>!Q3a#P|k#y)pEU`(03lm+K!dy?xW68So5XJ^P2FNIcKP z;kupDoaj8UwxoaEQ=6VQ?C(v3KF*bms?J`lG1&iTh|qdvY9xWZITc?1jv6)!qn2-N z@M(}^5uY}d!=oQ5U!UmjKgBRXj!INIkI8=mYAB5~Ujx=4lZFOqv~$N@MEGJ~VU$*H z@Ajd65b6dCrb1k@8AzZ{>!Vh!cu)_A-)WU>64RD5h1d1bA?l&`b0E-+TIdw)M#*Nt zgiB`%1b=?V?q!&Q?NJaq1-ntQDcD~*^Jt$rIX`!u945l1qS%i3SS%VzDj}+E$T+!8>vwERH{}wKrvB!n!S2$j zP5AFl0zuiE~Q~%XV4|+CRQs-IEOv%=lsI|^;-j4Vf+w=#e=t4 zfD@E*?N<{2SiF@l0XddjIJ{k1jwby8FZJXY@< zVS2FR?5eN!BA^kM?4R3v)p7VnSeJA~)KorXm~{L+KV5cG3(d-HAq{KCouZ+UM5g z*KT+=zc#UM9e_V{g25}gw_U@x2>d-?sP@wI4tz6y#Zm?|jySRaB@!{>onJi4A7NNQg}fxn7XMoY6tadpqS7(mkVZnFj1VL z&8jEM4QHalvm873bXTuYGORk-BdfKl9+O>)odv2nWX2^1KET)Z2^LfUJ^n#9ZWa!U zrx?au|Iw;domzk%^~IP0!3p5Z?y4}fn5^3@OuKPct#eBW zoxjjJ|1pFLVg{L?9$XHUK7)XSn8|27^>}kGs}u}mv8T|O5H4AN9NPVgMx?p;!%XYP zcN|feQ%zWeBBbEYP3ur=gHe@PVFynK(7bF^`3hzh-n!p9IX8drT_*0(;w_&1ruFVk ztmgJrRtRe9>N1El4S9%r#NX|i2t0l->i(P?Ax5LZ-CH*qKQnc9WG!6$bm6bFj8NMb zzlTy4AD(T^euO93%3K*8?Ow#aF#-SY#bt8Z@?9kzE#m69OHNx`N+m`@mUESK0bK3Z z$!UvSCXF7E{j}v1YNjpkJ#^sN{%8BwOk1HMPN&z<*R7CC=(M%Eub==dTaRC*F#UDw zXDx@ZMO+vyY%y)uX>8Q_MsuWv0nJ6i1C#%&hGX)Xel)0JLqRt4sc~jG9jXbZoGzLjYtT z4l&vRA)gC??JH+n?_O(tdULhQe+=|UYeFJK_#{Bv7SYdyzx;F0vHu@f|J?u2-j%>d zQDps~D2NBB=<2G=5YfqK62gs%A>0z>G90cSVlv50lF`Xbn3-^hqu~ey2qbdL4RXmX zA|MH{tGnLldf&QAW)eifmGu_+>Qz;DS9MqS^yKi`_}kx->8`Hx)vNbjz4w1fHzhTS z{5Jv`5baT?cW@6`frzZd|Ud%CDePB*?uSc1>W-#cBizvhNa{!VdS-74 z8YsalYRKyuSS{L=jv&y9zoJQsZ8Xgj_oYeoL?_7aTK9xyY;5Hd+Gx@~o3u}z^QUpu z&k^9fDeIp(g++<>@p+j=;4rUMKFKjeMp#!B6wimO#XyR_Z0|(sKW1{8q^~qn1w&0h zn-B*JqB$c80F8u4;CWG9G<*Bg>d6kF2O4u!hi4T-Dh*5vWP4QaKcM)9>T_8`QZX&& zrbs*}+l{2wlmfdi&xPc5Z((xR!imz)Y%k)D1<9SzQ7^$@Cb*rsf#l9z;qb59geX!O zMJuV8S6x{`q-1jCg!o7G{_Qf`z~OA{)QE-Vy6WFD0N!s(|CV~CRl-LMvZ$Sie@!La zpFhY8j%eeQ?p5!v46iuQ5ZbrafeN*kknikAlr5Z&iC4*OX899wZ`*stf4cb-~Ws$&VXT@gx z;Mm$Hj;&lrVpXUIPXno^4Nr7STA2rs9=5rOVdp9tASPi@f-A69vw z%O~A$BVrAel#+QMYm2B97V)=Ar_vg#DHX|$HOn8W-82Kj;qZcLh?L}}sy~rxmscad zYo6C#3!_y;e-@zjsba(imEox&k&F?gYEd_6FkKW1gY+dfH*s4`dPBvtD29eutKH*Z zgyYad2hq5aWf{mquzg{vl%C^{5QCN>eWTJT8etp`r$2{{nJ6!>J-mw@1a5^L1bl%< zKsnN{JpyVFVFp3WFNTAVtSG&@BuRy$;Q+ulB&?WC^CMI7FQnozAHenp#A@~=Mdo!amHgSiV@!r&)QVGwoGD|v!c?pF&C7^iFIww=!pg% z*}TkXz$^6|#VFF3g;IrL3grhcC`1lD(bgfoZom`94k zPt1|-NYVajh)Ys1w?y(@mu^VWzxIi#v0b_w+eaHicwi@l(I zQUsZ!y2%QrwaV!26_ITfG}TuG3q`cn2~umHTr_?CaA-fBJuFlqZMRpcAlOqcu<%`36OAX_5b!^;- zBwZj*0=cvC#3X^G1P-7vaDzifw%zYc=p2QGTLe46A`Wm^114hrnV)RJ9T^A$qs`k3 z3!NUMh>Tvq5SHA>1oKVgMdgrz9DO9k4H^ZYK9yHI)m(t5(o_ zv2JI;g1!!nbov8e!MCJZJVkDI3Vt!c509z4r}RPw>A;m)hvcHV9J=3WDf3 z2wBL?9T}5e3J(-!tEI3SB=xq*y7(;KY&{UfVzw42E9{a2QH46qLa^A~PG2A*QWY*W z0Qhg8LKpSIm5=G#LkmJB8}Pi-i|)vX?QM3_{zMoo$==0c2v2}T`c6W#(gV2b>L#W;zJl{f!gu>14Tn&rVyy!r2 zutM_<4NBRoVqfcQjKsj|BY8b{E5}aDTxP z=JX|W6?IpY{)lWa9Q7-YfF3Ea`nk0LZMS$??ctf00V9TY>1?U4e59sg1_>1gnRm+J zP{~|NzhN08qy*H_Awd=Tyb~uS<~jp8`4|g|o0a8`xq@ZTKdHd{{D^HLxPP3FM6nqf}Q-sUA@Kv!Z;4H96JQ#5%%9Mc4hKW~B<&yb`d9Z|#7EFdDT!tBq6x?NsI!AG}<*lBjgQi;d<+WO) zKsv1N>`-~1LcD1vM3VtYJ>~`+Z%|iw$h9N7Feg3uopxVNzUVBbBMp!sI4U~?)nc*| zHf1a)^HDx3DcNO0CM8i%5d~6LeFV}w{5tZeCOE92rP2xhI?1Gb=urbpq@Z5mOZMs~ z=Y(d>g&P&T=F&pbNoSQQcJkThiCD{K(cOhAm@!p1kVx!t1}1oY_sZhPuPPeTJ`q$( zb&sMKb=8{^iMs^4vS!=1>ixyxm22hDjyemza?EKaW(^<#qiq*&q2~O|0wmUg+v6`H zt!hB<8%kgmoPv~r;e*hGocY@n9#uhTLeY_iBSj@Rs^aGwS8UWhL{+2v1tdaBfb|s! zBTe70Bo0Or^?0>T5)-4A^~^5YA4AfMcC^0c-n(@WPF2wf4JVy4 zRFIBu!J;CCl;4Gb$)^z|d+ylMz2O~C)Xd%+E}o*9%8}^2KoyX^fe8tTYXyaY3}>O; zY#MD594qv%~#ayloxeXH&&btSiY}fxT`WIHET651#4NB zQa-eCD%=(AUK?I9D_k}+v||}@J3m=f7TPs~$jtJ-3eVeotau92e~1(<`>3l#Xv9G5 z1%AjqM6AH9KrFGDAfGb;FNBSLnJDo!{I5WEj#g5af`cVNoix)>QaS03LnD)?2ujHz zX|Pp6ZYM*Pg$PW5lEH}GraCGBu0z|HCb1F0+b^vM&0bBmO=x}@@t{Ymsaizbj8oc9 zK!pu#N4CmOED@=4xntW5AoxEuo`d(X(`;QtweKYAE{QvfjT1z$!4?~zXJ_g9Z4rtp{1Cr zsB~y`9N@2{M5_nbSX#8o#Dd8OhErc%I^r~rAbf(Ogs7BiMK0U9v8Hl{CILNroM1h1 zh(Av+OQl$a)*cni39CAo^*FEGGUB^doYzKuBzU~S!#3DB76hq3QJV+qPLOpb#(bA2 zz>2|ip7bd)GJQm|q8e*P{fS;vef@Tnp=DgKjefV*8q>u0+c4LJN@s@Wu48l`e7AmV z-SpZ`rGzH=G*jXTdd_S^7d?`y&l3n4CjF_Q7MXg+=Ej(98`Aq~y$LnFZ=3p_-<%5_b|OUciG{3$yJJfUP= z+hH=(LQo--EGCs!d%1{i23z1yphS)tOJ3!=?E$ofVR_<6uSqxKNlEn;D1Mmec6#!_ z(@&jLP;OpLd?vYMkqey}WX$kJ4o?=cMSbIwpbwO9Vh*a5q&K}d<(VKRJ^2ohP)st&H>0uP{m91P!!{YK=+toaP5&yhZZALc&80=v>2 z*%_KoS@&97;yqrMC(df+4YjkTgr0mnRJNG9)9ie*_OZ1mtI7zD0*M$8mG2F0uc)0p zwPxy*1U-P?H7v1tv+q%8jhr6w;I!Z0S%{rTyRq3y<>xnJiqp_G&Lfw752i>ERzdiY zeixygnu`d+!KWF;$5mmGKR<4=1r{M$+Mke>FwW=o25e|)VV;3SpgOJb5?_%Xa95Cq zwos@>Q6*5%RDJK`^VugQy8QTG7zvjXm5xq#+tpz}c4&wj(U`IPc#I{}@SND3>nVAHoE$Vkk-11@ij(_oLCXO>v*{}K9_Iw$<3vbMPjq63$>{4KOg8#AMW+hM1Oh9D zij6faHS%_sVkDYtqJhF+2 ziPn_5(t|v`GD(O@!3;~`Zb?F`5160941wCc=?|2;$6pv43RQ;;bZnFK`C*8dPCK@QJdx zghx%uS?$G&Cy^l7gvt(tRxU9$157?ffx%0W({MzYa2?IGqE6vq*p!mZSGPUt6Cfcl zoAHg{F{Ihl-*PoJrACA9$(ed1^bWBx)4fw6Y_YwQt6>?j{LrAEaynk!esYu(D&56` zW|2)8Ub2_o{moued+;Dd6ewL%yLNLcwGN_cRpa04wL2*6l%GMI()haZM7@4`O~nj0 z#jS;0DTdbq_)VyMOYP1|t*;18E^F3r#^vD1f&E&o0Gk*na1G5wo~&Ai`d+i}F>;(k z-!Y0yXvX8A9m`HumDTPzgdyBuK>W=F+nq$8)9x7NaZlnLdBjEOk!a7k7tj_w4%PXZ zokyT2)VH2|B@8^GqCZ56wZ@kV@N=Nc?RGl)PU=@clS8r-K;e0qv`N;;dVi>7Z*}Ej zc}_zmQ)+kYXYZQL%^hQ;j&kxEezwf!LN;nxI>1o(2m$Udsd@AO326WTnyjs$>#snu_MUrY>7T!9a?fCvEpFa=8O84{6vEnt2cnE3|KS&8Es@53fhc zSZGEGIy9BBE_|%!@yeRY)r2;~k8cjmC<7bgk~POx6cb`2=d2>ZVD`wOu3#PsxStC* zS09)s*G;~Y=1ApQs>33=i2`IlB5asB^e7Y{%ih{6H3&?Y%1i#*M}+)m_1S3 zSol9HFQ*)vi6s=w{Rl5$?;r{sQ4KDqfMebA=bSl7dKh6uFr2tX0GPuQqMi-@n4@wl znG>vzM0qnML}+7YhCZ_Citwylpjs+&1Eua3pdNwb+TS(auxl(pl1i?TzPGWJiLOQ) z1utp1+lhp0sz2kc3&d}+dmI)DpJvI$r6c=hM(|k#?+2*cpU6&vS(ilhwK=Xy?5Bud zsjk8CGlOe<=mPDWfgLp}-XQkEz-&#t8+g-^!jeq5Pk~`4pSUsBZ%bpLMWL19xbyP9 zuHCuM)V^lt$}j7F`Ml=GFB*YGN(BROexl0}w8X(5MSiExV=r(9d&4iNE|?5|6?%Qx zrL=SBpe;)~d-;+JqG~QUKLKdQ7F0Q|;BMFyG)%QWp-nqL0WsurzJx+4PUp)k0o*6k zJ^r8}9z;X@dEn?>;Ll68m=Dqp+Qg%bp)VAP^Fj>*C@3Dq#9zQox?vqAzxYIklR zb6dTCj$*D*Oh1y-kTe18bc`X?F&3sla`91wbXut1^B@*8q&`GV4-q8^bz3?4Ua#Lt z+Y>h@k5!TcKt+kSxEvF0yhuQ=XwW~Xc~mA5{|Q$`K39T|m`=e@ju{3oJ;dP;kf;d% z0$`9Y;J?F#rdRtY4(hbpY-qDVOCV*SU4_ICC>OMJm@GXFGN+@yV1Wi>QkIZp2=M|F z(SbkgST#|5*ztA-HM)4C9AfE?iP4;3+B)ie4%PqMsIQTf{T_oMo2|l4kdwtn2@tz9 z!KtiwVx11(U+H`_K5htORdRP=;^yf~%tzA_$H;-ZWR7fOQ#iTkH#b?RPeZ+d0TW$y znkfodh9`&sxHFOyH$G+9x+7IPZR?V$3O!xpT@HMazKfzZfH4jBoABJa8R4lS`S6X5dP%ERvSKwBsAdh1peEuk+-LVBJh#tkmx6s5T==E@!Zb1 zJ*^t#3N@%2A0r$=jH~*gHqupGg0f!^<-Ocwa94Ka71amUtAMRVh93>oHt#3qFewe{ z!i`8eiAi~os|QBta-=lG)u80|MnLeR0Y8zxvD(sD=o18kyc6 zW6C_XZe?iw;!yci)V)?(w+hAihm-9Hc0|2F6q&lfzb&)SZVD<~#tJj8(&wZxu9$VE$8l$}#| zB@MK-W81cEn>)6h?AUfXw(SmfY@=hVW7|$TexpvGoOAWveq*fq0d-R~$6U{x%X!(S zy!~Brd@Y3o56t|C1Y*&XMtr26m!}t;z4J-|3G7*P>P$NgQW=Yl!NNtDPW&aW<^F3E zX$?Q>3O!@Z1ADDM|t4#W;US}yKT2NT`WNo8Ww zY)Xi5C=T^|Qw~Uis8okiW-#QrTK^~?Ed3hoCcZ_S8uyYsi!zQqJsAZnha{| zJ4gAgdk{|5*OZCf?C7Rn$<-b`d1)J~DA_ffM=Py$>aWdC8W#lY*|f7S1s=U7Pe@b? zAYVE#uC!#y@P7s6TWZX5>h=C$IljzNhfR2)J@m4hx5{eD1NK*Oyr5UU=&-$c!rP@GE?`xoVU ziVroWfYmw8^ufIg*d|l8xtr>`x5}~utTN46f(3VqBCfqc8MC2_OfZ&zB7DrVwGo+Q z&Omjpc74uDWyiDIn3STc!#e%QM=r6vPZN1yN*IWIgl9Fv+~n@_VbsK?_0<A}W0eEo1i9Ae?G4FpxMH7Ff76SBw^_gb=^UHTo zn?TaTO8$ucdD7Lp;nnf(-}wbpczYyA3nhf0pny=SdT$*N+#PL`=cV;sMu68I$otlE zIa=~ruS@uk%p$gB;^UQK-Qz+xevoT43WfZp6O9H-oU$m>GXU6Ml(wHsmi8ep+xjhF|L9i1SAxznTCzA9T8nwS1f4Nn;a@z*z_bK?56(_Umux2Zn*wLR% zuRMA!W(kc3bouGA2a*@%t7Hk+KFLT*+MwluZe3c#_5DNp<`=Op&n(mv^f%w#o)3}b z(+D^uA2r1H;3tqhZTh%wm^K2t{P;O*7!aiX>d`ADBx5Ytw9Azq&|z@%8s!Qma)i;x zTA&G>amH>dn`+>*T+@z*zPHk%Ml06Ky3o6c9ro>TXPg|A2{MPz=?&ReOK6=$uc7zp z`umvKyfILR8jnB5w!<`>R6lp9F-qI+drjlL2Gt%@(_Hho3reB6HzN00D6JfBN}{6A zlI-^I7z$DM;A~eh^)?}y=P1szgyN9q^2KxKnv(B@XIqDXgAHB#^a6|=fo?ZD&xuZwObmoTR=JN>ufkh!gRleMmxqY5M!0%JsJ4*cru>+i> zv66DLH12@pwFP~H;}FdELx^L-B_>@(TopgotCBuHste|WG5AYc1&jKKgC;Usf~h1K}ait4LIA=o$`W8 zAw}$jZc8u0APijTMPM00b61&ND6h9vL0tNCjxyOf9Lz=KhEfH@!nia(RG@}!?q~~= zoT#+>Hp%BCyA6_fM;jFtoP3qW`bQ5YQ%Jy1O!F7d$1GmIUH@$Uw?o_pB*PaNUoerM z?uIGTuxjqSs;ok0c5XW}S1u%JwO2mHhA5u9{xrAvUS=KzYmvgN+witMt24Db{H0b~ zGW&=#B#ogRQMf(A=T;iqoT*w)_)X~zQW>+mraK@U_nq08$pS(@{1D0(M7f!#gq}=O zXorE7aCV#3v?;jwG&KFi%2lberUM#k06}mYYVVSLQi1-v^Z>StU@1IX#G@UXtL5Nv z9Jgf+8m`8&S^$@X0T|v9Z%K7DER*RB8W{e|{s{WR;$V!$ah>i&>t+e@2|%p%V4Uu7 zOwC(B!r2J=MaVk6H$r9oc6BCpeFuOfZWcW6C=>x7p{sfbEA8lQK}}bY)kS;(&*ua_WlPkte7V-a6ry4zJ3X!m75b(RT>KR4DfN6WQxbq- zfSSsijN?uE%jDx{TiuGtV!0i&Rgqj_DN#~{5C|zS!{)Kvx9$V*W^8YYU&S^qgQ66L>WeB*;j{*WTYTU{m|4l1gR)0 zs6iAcE{p~GvY@K}Lz~2+qRj!G$8I~TeJQ&5KN|9<`1rRj_B)UfAhj(qce*)xp6ptT zW&qry^rFd*(x@rWU%t0Ovk#%cF?BPrKAXaTwR6taexezCM`&Y@bEIju|M>MCg(3yw z5Y_CrJq_7LYh zC|Sb$9x5e~^>ywN?xd(%*R^_`{LLWqPATNd82MVcq!t1e36L*LnqTPf?cChUW*~}o zBFu%4EVAM?i z!`j$EW`{7`Lo+Pc_#!0fCxiVknwgxZZ3^0fFFV8yAC>8NNIcQ=QZm>!<6 z)s*M(m->YD$!At5ivzU>(pjfDT(*V*Z|6p$rzDD$hr=CeS4{gnqlQY^&9W;>ms!i6 zzCK@2{G&+=V~m>DLJ=Wy@X4;sxx(YKn`BwXTSlDElk+oEx*X@ahkL_LlAY1aMnt*p zaPSLF3{%l%#-&jmk!QD(Dhn#v?L&Lf!Y^y)PO~wy`4q3;T;uRo^ja~80=iFLSHX}I z{Nm;}vFt=O_No6dbgTr|Rr_K=p*&E8kfKRHgXK2koE5pwAr%6aR>oBqWO-KknLRlb z`fFfnc;%x5Gfnwsj2^gi0s%uf5}$m-3btpVjW=SUP8#MTqfyyRaF=?-R)RH~96Jq} z!RVxV3W(IQZ?pz4mWy{SQ8fHsqZg+x&d2_4y3QYknE$+70g6l_-i7D%;Tra7JJbt* z-ZkY|VpSmew-|)Mv_zj(^#x2UE4kFK#X%vSiu@FbN$~l}>}Z#OJbf;)wO#(Z$=~f* z5cDv5&>IQECv0`}l;AB6LYT+#ucL?v2rFhzOfj*j3*MkmXkvjiZ7Z^VJ;eIYsLS`H z^0zbTT<$Rwy6Mg#lxbci%sC3ULn@NQw_uBGXRQNc#W8q6dBXy8q&o7Kv6~r>6U$BuR&JNspJ&d2W@>z zhAQjT)3y=JgkUbTe@vH#j31>bZBSBr-G{Zf%|SSrZZ~tlDN{Ha>fAp$QpEvCKkqww zGHXT_T7*M5a*S2V4da0`l`4#>w|eL9?_IT1SX-=nx1>CSl>SX2X+7PT+Ihbn9%~7h zNGMoRGm?24!_?(^!Y;m&4lxpk9DGi96AcZi0#1AIAk%FP`y zcIms~Z1B~*lMV$0$FS|{@SNZh7Ml3*ou5QLq6#Rl2)iPl*wA2^qraG%_j>U(R5u!t z8jI>HYU=;l$@Wvis(H%R(7+pn|NePod8XwW!2PdFKo8XuF}j<8=T3he8xj|)k8F~K z3_CrQ+3d&RL=Mv{qt}GEi^JyWWwj;OtJfNmWd!-M?X7@I6?L59UJT_fX|?#{ZN{ZI z9vaO8|64Y-P2*bjz<_1ZXLk&SPalEfHW>=zOF43m& z3v}_m@0=%c-gbb+hQRY$cQdfC!pPHt2{p;baQeTF>7!`6mX1@UhzDQK-;~@oK{%K^ zOU-TpJJmvn!VQ^@XFN{q@yOOUi`L8Gf3O{k77f8$F+APnd@Bz zbaizpQ8_gN#+(h$CKO3ctPB#7ht=pYQ~TM1R^^iejiv}^4Yr61B8!9jd29;nDVD;f zm5r5^eL4sz-cq->6;9Mh%5W`{+irYUYRDpDP>!^d~u=a z#YN#5_W<4e5v9_|;@m6Xuny!rs9(5Lk(VT;-VsMPDqw$(k6Nm~LaTLY zUsA>9n+}(&fhw)Yh|qrgie9RB4L>FiZJNhY(yIL+Ho@*3YxcB}yVc*lHJ3a7Yge|n zk1=)XD&DY6Pw+Mp&owJ6KVzdYjLT?Bt0@DV1-D{Z(HHIl9=i?FwNTp_8<2F1lrODw zdHz84e9KW$zpxccyu1SBX9lC;Zg^GYvnUt0y^rj!p z&wEAoDs_(ojaO)i$MgiMpQgLr$ExmUYF&%WQk(0C^eAYCawGDF%dk+Y-v^Ll0w$Xw zq&QKGsB!%8J93634!|@^f~)VDsqAoIyGkrj{^QsCxp^ghj|}=?;16Pd!j2$0T*;55 znHVFJ*ESl>SBiLJcp@zi3@x%BD*V8H3$Q5~hL10BxEVy+R#BJ-1=^jVR9 zCr=@QXoZ771W}z?QB<#-JtoLHUmWz~5<0t(UNFh**Yar=OfW2Jsf;YCe!Hcrg(Y7s zq~#TIu0x)x?1W)XvITjD#C`*10?ldLPhX06P*WWIw1Iw?j-O4(DPP$*x-YN3WPzJ488m(XKi}A;cw13(Y2^@a2+CF9&VX ze}I6|T2d`et7Jis64pbi?+!zehjdxoeJvR!7DSnnBy!`cX|O(jPV_giU7t|u9sLhI z5@3KP2Rm|JF2^b+rNPTF2jc^Evqt&4A8AVL4g=(@2L&VA7XhzNwMD&8QJ<&mXb*Ld z1mw7ZP4!Is8+_bYz0scXci=V$i;5({aG?Ov9#v_0GDL4Ha;^^Z(eKMr9Yb}1ae2fe0^T(VJSn9J`tjt+5itpiKd1?0~(zCfXhy+WvE(1$_Eti zd&8LZ(1xV6TJD0&jsr$nt}e=a+k?v3j7j}>q{;zej^u+Fv~M=bXnT~gUWP=@;%+K0 zEd%qP4lcypypnvel(~!ZGZ`jPWk2Z0h6#IBOdcOg*BdI2?D#0^6Y$~Dk!<|2dS@`F z+r|%?gAKW4UD$iHm324EpV-kBX;Ivpw`mN*+;?{2C#B%1{+vW9cWh~$d%tPW9RGrth4Oek4iHRI(g~*Y}Wao@qtkQF6RaHxQgu^OqPP|{%NW~K!ffnjvQ+coU z`bvJrH}FFhC0o;NWMEbEVEk!FPB|MsS%iRXb_!U^X*YAU%o7QfZbLwL$+e|xEcU<8 zx-M&+v3m!UA}=kTfw70huhFOV?a-z!NHuPr^{0vL(3GxH!VS|UO3I)w6vwzHY0cj+ zrF+?qd2nn&;zv(P9(4+&F}Z7Fhwvr!ZFvO$X(Cckp!keL)nR+Ev; zmL|FSV4XXszT#|MEn&y`1Z9m5JE@VUJa0+TCYmQ5sk{<8r>6&he@4h3zYl645gVfA za`S%w^S+fA7v^L0MKj1*?vKh7WXXBUxFJji)xyO-)ggf_O0!*OK zs-XD&8~yabd*Hx{lsV6O?}E!ETq}(NSoqLoY=<^$FqbQ7yz3%cFtLtIH*i+%+E6z- zi#Cl>sR}dROxYZs(oV*F;8xN-+?&G{?Zng*xkAAmdsb1kz;qUh&T0p2l&MUF&C2Mt z5{86?(@xft1C=s{7l~pmh3pCaEz%0V;tx~v9i)q;5dm1eqBXO*zflrrbr~0g2tFpq zcvQ3ZWi2UrQCKqg{%TOgPFC8USfvVxgX=dzaJCeab39Y%Ta^`sf}ASs3i|c>eYdN`K#6Q8Sg~=*x>YUdA?e z(ab|3II-}8`&a!B!M_J%<>Mp1mN-Xl5NSE!91 zXp#@FGB(wF@@PEMq2mjp7_YfYp{4jT;t#7*geW@gexi;MMECp?Hh+Fjb{jP&q)|_! zR0yYO1+;!lkH$$jDTp6!2aZV?j?PwIbRdY$s&-&*yR}wkBY6dfy{uKBqm>JDWKbh} zdccE~tsm`Kyx@8xpfAH^g9)0d-$O>}#AD^!oDSVVu7F6<>=9=vMDD-dqqdITfGN*L z7Imy2fE0+t?3^#TuizH371!%-nLJ|3K;c!Z1tEx{&!*3gT#lFs>7Zr)!9aFi%qJSu zl&j!MpbyWm5D&%?0R?OF12{(TBm5y7A;gf+?vzE$_(sWiC?QLNy7p?8b8XWzrdJLFiy zz{oBwGuj7#tdUHzp$9)kP-;xaDE3O6qR>rC zT?X_I1dF06*s8?nUrTr){EOA!Rz`NSmIM_o!Rn=_d>}^OYKlewAJ!Y>HzJwZoF4zX z9e!hW0IFgs4P#4QwmqX3<8>CAd4QSC6s)P7Dki1&Iiy3A{Qz+2b-$2hNMRG%>3|Wy z#JD-n{~*@dC>RQc9hK0Hv4*k<*E9Ns%I4DeRDopR#}Kn4@@qWl`4sp` z3&mxSiXr%+rXph0qtl>;xy~RjdgoUCL5?GQ^2?8W2)qy%vV6{`p~Og`po}JMnzlwD z78_&Wod}+v#RTQB3IOYtmJz`O>%v&YqB39diG(aBM-{%+W+}bNlU}alad{Yk0;9i; zLBuJ7J|_NvY$FO5G#8Xy!ig*L0cEFw&x-W6)U2bQPwt{0rSylfJ6bZIuVui;?+Vq- zYu_(9P5|C`oohCwPo`N)jVCANn|I5vX26eO_L=ESg4f=85fe!B>1yOY5Rv1&Xb(Ae zpt`fSV;T)*=V6JAt$||7Z@lN@Ea7pD9Z06&lWegG=QvBMyvNvrz=1JMT95=^)fK=n zT?j=-LA0g3+(e*owYg~$|4B7aX6SZSe;(s>;wixCVQ;aXiS(zQQ)aIvB8a)(q z>Yr)7hLE_WS2ut1s5^B`zLySJ|qV2R~& zC?!^n7+T<0GE=BX>qNU?-Ox&7WZb%Fv{d!{XY(?}v{*;mz#9qt@l zgA?A)swJ+VCP~rvN4h&y0~_JGVwEt*j{D$uDz&=*FrvS<)|MFS%W?*>$Ccf$bjaqa z6AnCjc6yXEtGYyWxE2~7eP^8PhK!`=78@C>!D}J}y~YK<$}V` zsL{VJec@8+Vd z7#}`CeJb#gS}tG%HAe1F(0YXU=oUnvOhqA?McVRm8nz8A^a{9pVv)@+xZ%5;2#T+% zMFO(iMC%G3ErjedE4r0MdSk%}O^nCcC((?^wzWM%{qHo0S)UuBjY7N5SVh7*+fhpO zvkWz{si7M8Z6z>su(j$eSiU*~3pNW@5f&mG#xAjZs?BM;9TkO4UD0#7(lEU2<>Bu%VPF{+X;<-*rm48hh{^}546juN={zr?84CuIhgIJC-O4*rs z5zSp0LS#+`i42H@imZV5`UyMTBGYnT^ZvZHW@4~G{=iQbLm_~&{g7A{^23^H)M6ByEW0v`6)kvr&e0T6BBn0h5j6*Bb z+o9NskpgNLc!(ov6Isuo>mg3_J;Ye_+yx`;c~_#!un;#_h@+bV+9L;07rKd_Kz zdLSw9trj8+!%@LQm$GE&@p>ll+vr$B#k+sT+0ak`4C8nVGY#t!hDRu`>nU>In`ue2 zG2;!2#Pfb{lz>+jxu1)O`>=OYmCnXihsL78^(`39Y6^=5+FYnXQOClGmM?y2QxHC|N zvK5H<`JVMdfbOL~sf>K$NEye)(AgD+?sScAq}QhuN|Ie7F`d0S(Hfe#$IUGB%B`DNor2<7A^JQ*vAL~ioX%aJ1KZj|GMeT+h|dx6S=4pz;+?Cm0SRwFUs zPEhoJ#u!G4Hbn(ZhR{|XC%L1sKzJ9hKfHVegCVeMM>F{lvgLC*h|aR{cq4t#sO(Q3 zcfnuV8myhEEw?~lZ9;6x#;SDdhc$I zQ8H)WgCDWn2Q2vdhx|>F8HfvPZ#|XRJ(;fPc3HS7OEjXH9JtuU$uI0QzT~+@8{-=BE!4!3M<38U{ z>;lhGog%-rDV8KkmSAT9^nayDr-sD_$5N5HI{8%BoJ$b17I)II%CT^DKT^p{Rqapv znQD?};K$-aIazeI^72GTqPd+h|1Mu1>E$xBcq8(3R>R-xeq)*i=e?w_ijCp_nawY0;6R%s#O-)`>?Kc!}OhHL&}m3NVj zoDGS!#as{|b%qIdbQl*|rPZT6SK|SZD}+HBLQ8$Y0<%`VbdaH`CvsR*eYuH7v#h&> zA*Ly<5(QY>^7RLT>SBOQjtoZ0MYf;4lM=H?reE^Bq+7a-yBOpDcm5`oU|j4#$EwCW zv4Hik8#M~_vHV>UHOX8G z5fNJ58h)DPs!aSO|8qAcOEbbt$hWz=_I)48Z4kk`6jnQ`x?GNGXX}7TsvE+l2Pail zAFj>(J9|de^Vvw#0@_ArvF5pB5sQs(c?jI;$m2@%)BNTBQ{3Hc)d>9((R+i?_z~!H zi!wWz$Tym<0zF@Gqc9{`IPV=o-eP(DCgFwq=Yayn$*PLz=-~B(J(&$=L>b``+mv~5 zU?oz{$?o728s0Q)PcHB;A56t%2KZyrv0LJ$GTE)KpEk^H2+x-NfBfeD&k;W;_y!+H zan@5{xY^s+&_10tf5P-g^S?Fq$_$CVlM+aY`rK6NiTT**+14@7oVL3hJ6ymn=+l5~L_3BEa;8EEs!yU##P-E>|qS?|#@ERRUJ_ zDspsD;?tN+8(Yh+u98hR_tLuAGbsW5e%N_RfG_E@)5Fk7<Ss1$=+}vhaOqcCq0` zZ(p$w=nFhJ7ov(t!}V{8XyZ)nBoR#oZwJiEE>ppkr`tl}6{s@4gMerp{-^&dg z8o=@KhdC|->G0vWZFnk~i;dGmF7YL*7idNdn#nzU1iI{leIKMWcQ(E{B{*!Gx?LZPUDgGCCS$a@fRHa5qn4${Oqkrhq3g=+3XuL03 zEylj?o#3{(i6b%7RImr`R;tJtf&qM`pF^IZcH1e{0_=H}P%}j0kLK=7iXWJZtEB-8 zR!8Ja7k>vC8h<$1z`UEt-K0l+Q}We6^QEVvUF@jAB;#WYG}<~}<|UUQzneQRtGSC) zk&At6-6b*^-c(v9{Jo?Q9ZPN_A1!YQ?prOvhP8~}nn>h!H`KgpE(B<{AxOTp1# z#LzwdbW~2M`qODd^M<5|bbUe+u{5%@IX65NGVZfovftKCo3)_}i=Znxh!a&j`A>|3 zT#;2LicoO7a1!U^h~VIhao9TJp1Lp~-duj2Kf?C(LAW8$3_gt z3-+HoX+tbc5R}A)OHTzvsK!PQUN*l&vjeT;O2u0-Htt}Ca6^%D-V^(^ZBaNyH#C2^ zEts^oQBf^y>%CPX%^|R!pko5L^SpAxB9U3Q{T<$r%q72Lboxem7=_%huB5TANj_6w zkYGf=Y;?YzANmO??B0=*K$TVFP?yzqk$phUM934RUvfTkV~WbP1#Ky3w!|W?gF>GG zwYp)yKowGdl5Pjjq=(}?Wk8$rJaK|a5f@zEz!enIcNlE-)==};Mao?@0u_Df$snyB z;|=yRl{oZBZ-fT{Y={L7nk-NIOP@giWBH}pH|6~;28(YL?Aje`cl!+tVoqZcJD?Gt zgf~hM6`bJh1Y;MT^q5Rh$b#Q7x<7$M_c*RJ=<95O6~IE@lZM>W`BEUiLF|H^@%x!!qw zhy48i8*70^sGGfmf>d^4W);!(Nmn;&Cu8m)_{c{mq){Ly=PVx!!2y%q0#hwuleeOP zcI|-CfkSd*%2!}$7ca;@2Q|w!if3T?a4Gq}S6j?-+UB=!R6cXb+?kpNbFZALCI@l$ zT3XD%DSIzg89}I0a&lm82`RM}4Rp&50~ChgAsx)EArhb1H>$f!hlF`Z7xKp9IE6$B z9RnQj4O<^8w<&g*fuN>_p_+ zD^t;^HJ|`aR%w*Jw#}DdDTF8X)|ab{a}JglD!nDu%+;Tp#&&4!qM}$p7(Q zc5?0m?NYK<#Z-RrqqP={I_LmB1i22Nv(Ktw32Yi>*!Dj=5RsR_CL%lKrBDPi z8*Pa($3B|hkSZ~b3L_abvUS09(QpfU)e?mdXyG(M{!&H5u#7(1;+Yyny!e3HDFq_} zY-)87uGqn|zl4cl9gb)>X-b1g#h!zA@_wip<5B5U*Sn`Ly0BJJld(Y8F2wlAt5Ss> z8Fgi2UorVt;?qo@9H^vqTb7B}ULiX(6Z&y>`nP~*MfQ$xz7So9)zW@`>ZJ|O;+Qlu*~FS{PI+OAAS z1}v5mMmckA-ISl!R$w>uUf;EGJDYt7KTH+v8Dua%W-tb41(AXMyWI0yw+VDwG8^WX zCgE?p1S4|DYPnK}cAF@?*baVFfQ<)lGI8(#O@q!KQthp2M=m8AITMakEQc6Pu261J4)Wv;ycVP0uxpeAJ~T!R}T!4vFdmnKZQ&7g_5W2O8j zHu`Q{ny>4IpDBr~@9necQ70cQE`}UOF!ws~K665%LXvyWlJ($yW!g8XS78}ChwVb6 z@8m9kc<)SG!qU2NLlQNLeP=)<;_pP(l+mXujm>*_Y)90pOox7>5&ca?rxuxdFXr;O zas7S;8J+%qp&Z=2m?&xx(*->r&ZIBWUfV5B&Ot3HjT6qdVy_#K?2kF=Br@(7h95@} zd4!il#bgo+Oxb55rXu?Z>Uo!9mZuI0CfDr5>WyngX1W&G0h$2b=8Lk`HEfwBcvPff zq$#T5Y`?57WHB#Q2SQN9`3x{%%Oinr1zN>9uy)p=Sm+D}0S-5q&F9)vtfR>U}*{Zm@sA>{dB{Rebo(DqMAZI5$2BqK}@lBLGdHl zfS*Ktl6YYSGXAZ)C67_Jcn6SH`pFee{iPDs`kOr6D0;%t*cV8I@}N0Xx+tPKWie;| zU`6FAtu357oq8neOCB~AV=}QfSat>XG)Rx>)@&u+q=P95Y1gF}T^+&b@`-h)d zLky7w$HUvGh~~4rAN7CoenlEiWa`u)Rh|Og>Xqc(qq0=oaQ`V6sfwM7FR>5RHh+*e z)}qd?Q1uxwigcHt@E2>3DT`0Qz5mAxh0bhmF7m91*0kJ=ptPYmiMi0qa^wf<~wHUgt1AHg&+8*1wH`UpN#2@ZlDC)pA}7pu&u4Q;xYBF?s$ z6AC6p?Z*}`>yhq$Xh$a$x@u70t1HU}OI8hoj@_0)p)SIQr&dE2x`AfMtg9lXqM(fO z-cmGQNICR!&2m?gh_Knx@-`C~qimHTDBm6%=d#uBBWpw_NS0uT3N zw5Xm7!q1wVR5Qr&ziW~Le;RiF@Kg+E3BPivJ+wO<8rsoSSD6pNzx<{iF8rwx0DbZ7 zYo-;Tfzu16<6_#HLU0Jw-uCu)s&1JnPg(n$+-ZQn$rlfboRV+$DA~-hgsQ4nwz-uH9vwmETNV*{W$cmW4nz zt}ukvmC@U#~J+d;U)O!etsmo1p~EV}5N#Pp{~;jVZY0(=H-SYNF< zA33-Mc~fw#PvrYcX`8{<6^Q1=qAeNym?onD{m~0@1lG4Npsja_#i9HMICLfDz`ENUd~+_Imq)vw+SwDWL*W!%5`yfAyR2eXM0 z2JGjg+j}@eZJ5SYiD*@J*ufmQZ^4!cQ+SHloQJewLF3|-xrbhmTC=l>BZb+2hEb9$ z!C$I8Sj2?qZN;q9gK=8uE*nFA38})SI7*i`x>oP+v8|UrlJ8(|qS(+y&V2s#&PWxZ zM`r>?y{M?uQ*5a+(Av>M)G3!Zo&JQ>z9VEqzX zxh6m5)wr$qoQn0~$y@^NnGAaFhK$@9E8WM&T2L0u|8-3$i0cL&MOx zx^sdX7)q5n)X;C3?rKXiDN%?IrzebQ-A!-UNICvR-L!$TsjSgZQL$rk7wSgPe95*^ zM9odg5N;qZ_ak(NqWaGs&z(Yr63@(>aO1qxDM{(wft)r~I`d)z+{ma)yp2s8G7p)~ z=yUcSHb0_3kxIdAMo8ej7QK&N&SXxJL#t~dVpuE-9%3b6P#GmB4la_cZG{TMoQ2Bx zk1ZdIl8|t|a8sxr&D_m79Rm_*EHz_<5PWaFVhkr05gFmXIMDOma9#6?OW%PUlF`odH2VL^>}iQ*b@J8Q|0* zGIRrMWaMnd(_Z6m2tq1st@9qRj-Iq(8VEAqWCx|n(sL+e5IT3)&p3ISV+fQQ4Fd+G zvP6S>6eu0_pJ-K!|Ae^QO*tM(kW8x38qUYH?8F;AvE+=X;^|xhBH9 zJ_)?-4Pt?X3Vwt?z;LjuZ&q?!RIG6NAk_1GUnl~_8!T6ED|ea-0r51meFB7C)T*Y+ zSpyG@h{TF%di(C~Vp!GG?%T}><(er<_3C9n-fQ1nby@emzD&o(d{Xf_9_v}&4tf33 zepStrchs6R67oK2Ix-o@6I^!HJ_07U>;?#29W%1D`xn`sWe@Hr!afRhs-cLm$g0Yy zB`^bN_K69`hy*J>#KQNDY$}$}3!N=1bja7DjuCs6mA`bakO84-o}ZgpLeajIlcO1e zaxQJ|4hniVv-Bl3#5qGFI)d4q$V-@)#$U%1#I)WVJ|(77wZ&V}dGiSIh^Xm`54jnY zXUyofP~$f)*7&Q#X=StbgCnu%`nQNC!A=iAq2aMf$OunR%`MwT^q6_41Q7nh zw0W0~+6|k92Gg}#*!tY3?SqGXkY9(u!v9%d;rW8m#8>~L`lO-TF`Q#BI|B3P_Y6KX z6UhZ}JWx-a`_r=N48~=IB!qL-Ja}O_6T);J?7NWkUA>B#-p|;i&zKjMNPk9kmlxsK z#%c>H&G{D3Wgx28DY9TnaPENG%WRMTGd2AtTAyPHTIrVuBfDd&b#!6qbFDs&cfH%Q zDu8|>WhB`xFt41eimR5vS0k}EPMBBvrWuFvoKzE<170$gr}VbCLX0yK4m1$!dZOG2 z_bP3Q7oe`vw8%`D=lAf&JBYSIJzmTq>Zvs`>#C7NBDZ5v>J~)>6|007M30d(MCwrF z77U!?)68#^3$}|cEcd4I=ei=q_M?jU!kxV;M60NAh6V!IUwH@) z7X|q~z{l}uT9SP(#{rfCh^{OY;k3ROT}0xD{>?+$dG2tIZKb1@$1cM9itNHIP^PLh zi5NRaAdx7Vf6Ql%7zxWEuFC7g2&QBx)j<8QNgQH${shdFmXuaHzNeV=F^uQ*vzK`A6T*Ac8m5|7%`b|qY_8MGjFpM(JZSFMDU zdx>sTSYIp5NLQY+ap#$2lV16N8*S|Xav6h3u%c4dvJs4LjY%pHOC&}7>f?ukT~E^6r*j%m`cz{?n0!Zptjeq=R$k9SVR-e-E}?k!fcj)VX)& z12)d`xJe>+*B^v#W-KD(0Ofwo7Kg_3>FRW-7%g>eu!&2PRLLfj`OmNJ{HN(Sm?R*k z>g>-I0n76}K|W;D!W2-j5(_Y>$W&P@N+BU?P%!Fe>o6!twZ63+t#-U!#Q4-)5260%JfilQ=Il))x;X!U;47uJS}Rf4?qU zu{^RJ0=2{c&1Y{EhFg$T0zP1!PF=nr6yaYoc!a})ewtZ?qRb|rpj@SX#k|DB4J)SM zMB56MF&;l7*>Cb%6b|5ISx6|7p4eBo24ya@P{LQwk&%THMd-VX6f7Lzok%8GL|jmrvfRJ=t`!?tmZZ7-|s;*3A@ei zm2+PD947e02KC438TV;U-b+e+>-<=n-5SbfLJ+u z`)7wny+Z9VL^p{fgAS+?_R!-_YnUys{^BK4)63bgzqW?&>lL#ii#TLRL(LQ@vTrYww20hUbxmQ4YcO#zloSr~uKP)P$t zF`8gWwMDT0;gSYgWBpV$y^u*pB5n$r{A~tJGD~DGY?4=8ezCwwjbhUjI@uID*%UhY zdk>vd`J^=kPySAVCp%iGlOh@C%!A=YyIRqMLWz!Ka%`eXgwIo?uM|H;{wv{g`76mu zpS;7u3;Q62?UN?&C+(BwIoBuASHkD=S5%c?lX0VO1W)BJ1nIkp1yTJpMLWlG@G&>T z@>9Y5vR??EYUUQ+Ff$831@o%zhw7CzRw z?~EuhDaMlYOYZ*yB+a>U^~<4Rxw(J5^`9_oVCR@-=#R6GT4K&e|DHFdP0U%JzKEX* z{=0hQxmht&k4|j0@~y(9pIp?e`&k{%{&dj!pAL>`ZaHVh4K1c^oiyezC-$veb^o-< zk6b=0?$6g8JiTwit`Sc;-W}b$^-o8uVv{R2oSk@j<9o^L{NuM~t*ZXZ!ArjQX~D>x z;U8t?Jd*Lvw?(;U`2Rj0zPt2=?Ufrh-8Vk(hujG#U#`C8lEJYZnmyS6;_Gg1)!~YE z13Eq(_sAQUJFgpg&EOs30rx$$HGzq@(+59_`t-TL98i{5=}-BYE<_B`_5`}_VA zc<;g;*;_yOIp)$=zN?s6`TDC_;~lr$yyd1h7q}*DJL~Q1{?ly7zfS%2^5xlQuKRq> zUmVVxHkKcI`n5-n&3t#|8?U=QyC<*tD)WY-$=Uc@y+AAonC(4eb20@$osbc9jCXqZ|@p^-saI){_FFUr%t+t zE<4@(yK9e}f8>F)M!xy;lgm#J?)ln^u9N#r9C&JOvrlpcd^xAtf^ye4H`iqpp zpDcT~?7Zn6&wKl&-0ZKs(-*z_#((el+o&VOyE=bA;i;G1&sC?joc3=2vp%_Z$Tc$t zUv&M)ZARygc>Ux2x8JOIe$n&Z^CmoeWYOQde0SpJN1JV#@b4F%{%&qn&Fc65o;mxg zX1A9f`1!l%_l%zRMq-cVM;^Ph+lQN%T|cC6j}Lo~Sop&Gi+pPr-0{n6I4d%;;H5A1yFsYw+VFI-zO za_-Q72c~YFyJu~;Z(f{qSyHzAbmLWp+me@Ml*YXj zN>~;8^uG5t&b{fwb(_{E3x{_g+C1+e(@{SSFU@`nNV1KUdD$@PxpL( z(8G7nAG15Y_1&Lb_4Ca?oq6EnZ%)UKzGeR2X7le|He<}jhn^d}Z0Jv&rmfyrdi~jZ zy0@;l|Fch4w?6d!pkC8CEMepyL!k9|)b zITo05&emqj#Fnr~XDOHIv=f366+i~fGHqml z&g?bCmZ2l3=C50NY0B`cEAx-o9J;s4q@{~VK5cz2vLW@!A-#}BkTuOgiM zz}cgJnDgS^>hC@+n%}v_-m50x65D2KR#xS~YdiJqSe-P;+A=H8w!}GoT*mP~UD539 ziKkxvu6gdrzunhj+u6H5?(xKD)_s@F|HAj|kdrTe*si=q>GTd|mWs2dj(@aoR`KdF zXWkkxuUWqgw&l__tNqywR z(44H=l|O`Btv7^+?{2l{$G!<2_f)+!wd-MQo1oOkwpl_&o_WvDOiAAOU)`()Vh zGiRoitiNQ`x;B?s%07JO$ixGwC#s%aakKT=<*&{87IKBGamsgy* zV_M&*%d+~PJ8SM=uO4(fWB%SrCpVowcJ>jx5GO> zJNLQAM|~Lc*pGcLdhn(RmS*YA&#SoNp-XPMB(K9mr~9oqb*MCR=3_N?m!JBe?H4~j zbJhGWhV*H6=$_9X-+Avn|NPwEa@+fA*TrfP;_Et;Vhi+)O`JK3L#@>D958Y4ae)Rp|YKLRP*NZxQFzNKW zZ+{s4>GR#~`&XPb#Mb_+|La?m_wAC?bK^#4_kL;CiZ?aABguK#jpZu>6nKN$So2mjby*yWYMEqjbRusZkp4+j5iy|i724_jI8 zZTo+tuiP+v^wvEa65J`5?F}$kPxj7gW?w%fW^eZ7&9}|8=g)X7saeHkSuOthL()g7kGIWg@y;DF!_)pe z@{O0Cc%?_enf+_KXRKX&UdiPvKlo|+qoZb@n|{HQqq`i>edP5OZ?1SH@iN;NKYUp= z$35MUTpSyOk6@t#$A_G=cf-^ zcFWX1fB)w0W*L93`19FEw!QlDiaU?aFMI9J#~0lH)P)_ZzMNlp>dUExPft7Z*)y-C zeUe`M&fsOuvp)IslTVy;TFjgC@vRm24s5&DUa_dv+k+Y&8~Z?_>I`%*5ZXPUr~5=pMt*?zn0Mci;re>*goQd%VsQm zyZMITvupQ!lI{M#nhzFwZurxp%J&wXeyT^85!=q5^vqRPUX}B6#>)d2#^%MAblI6X z;q0Z~KR9pSKmPsFS({(KC+65&qh{S(z4-GJtw$Z{eNk1*2^Zhf@y>0x&36T4A1iUH}9=Jw(`|iPRu|S_Q9_{=(?}hH{<5{KRLnS?`w1-aq|9?+YgPcWf>#wg3H+H?DZJ z#PV~-Ez5SFKjR-S2R~WcFZ^W)C{P`{fV4A?x1fPqzHx!f!9Sv~9(pSD#t` z)Y2ah*EnB3la~MXHLt&)H+jsMfoJu9X2-hH^g+*6pYHVB##KKINLhRGip3Spt6H_4 zb?M$uUOjT=!9H(ndE)0EQ`RS3-q*J~=E|oodN}XMzb@*O_i?*t+|PSnsQkwjm(E@I zXxlz>ADc2YV`JyS!xya^b7p7RRrkF(rnoq;AwBtu*{xdsbxp!GuH7I1`0JC5#AF>lP%>t6h9^}OlJE6ccYHSyrVJ3Kp|cOBf7 zefN*KD^Fj2;IpS5{I;Ox=hLmv+&m}XUUBW`SLc+^fA)oEUweGXD;ti@xvywI>3d^e z4s88b->yObt;IL~(EWlNtslRBaMR}X+tzK_xMS_38@8WqYkzR?^r?%RpM8Fdj#oCj z_`EC6xok+QSDPzZx9b~o zU5D7~+h2F>rZpX6EKg1EoVfnAXOi1xzp!C%ud>&xw!QzrinmW!eO!L@fsan+-8E># z+@fCpSa@4O5V5MF7k{eyxZ}Fx-}kxVpXtj&1MYlt$opSE-Sfzc2flcA(uc47csi!I z_unjQvi_ELam5GwPyPG6b1p>PD=#jcUN&|1jCoULmCT(sXJ+}Dw<=1PPG4BIV(R?a z2V9j8T(N1=o%>Gr?D*_fzoq%Lap#_YRf|7)Zl3s`Pge zqdwd-Hcjef!OEJ`55!E*YW~l{sq6D+geLY`m~?h&(%Q1~AKmlV%QKhy9^KyhXxEN6 z?w$1GxVyhS^}u2OzGsi0>LQJIKxRR(F!shR8?V~vOi8@?r$KE7j+>u5>GrR7Z&|+g z_{?$3mK42Te(J#LZ+~poX6nUlpFZ!a@ekf?TV}uM?l#xmd3(1HlMbIi~;8;g?S*^ErD#*B9sDR$9C~ zSDEtG#cj&gTrsqw?U7wqcPyR1ZSykE(#2owU)659VDRS3U(@af`--sh!*7mOolqvL z>ce)!Q1|Bjsek(Dkwbb6esTO=ue5$DZs=?A9beeud2dI%XIyu`Rgg9`bIJU;=Vxzu z^|iNd_m4gBb?uv*+7-8)bMXsPE6@zTnzyq2(+)?zTDR@9jRWp*McFaUK)(BQ_yyKM zCVKVqaYUFcdbb>i%0Ku1>HpA`cMNzl@bn({vtR#YDU-VOg*5oj`>hy!eD2fZ?i zm=g7h>~H-@&-BNu;%>kF^?%*>D!*r1{=MbwPnu7vOj~7UzV1J87i_-gUwHZXMJdBR zy8ruTrAf_7E^c$;uID~o41}$-Gf6AyuU_!tf2PLSTiDxLU5o$Z9Mz-XZP+8n_qLn2 z=~U=G)QO$n*8KS69ADbWZ_kF^IOEa|1G>aNd;Yo(&&Kgn?0Za_N04MfYs~ zDF48|_f~p#rd=`5ef0T2_tj(K?>K&B{JylSht<6JHQHC1pH;&m54~f;u#Pu=9Q@&% zi=97CI@~U%{S|#Wtw@@uB7xAp8o~H#inK$bn}3IHd8JI(2&;2xYqHI{ zPVHyU%CU>ldEW{!baM9A&$FA=;GeAf|`r)NkJl$|s)R=c5zlR`JLm zSrgdGQ2&TUcg_3f-=F{I5Y)z(Uw-x2_sxXd%fwzeH7#lOf{{1NA9Q|Dy@#be-~Cq1 zQ{Nw#n${B5`|5M9dvh<^_L(`%l4nY+_x-h+joT3mu_ zk)Wlx6o=sM?(Qyau@-kqp-5ZW;_gtaXmE;ap-4HuJ9o~^-E;Q7=O6fH-nE|Zd1rZ5 z7}tsBfAFhXKKw=y#|(Ig4nRTw54NtIwMQoZccTB1U&9^xtugztaBa7Jr5HUpMoAv9Wp6 z|6Zk@`u|MWf0;8I1@GIDp|KHy|2*jBbvg6*zr;x7{_oaO^&hg6cSbN{!u|_mxK{sv zQU0s;{)gy8>;H!!wvYb>=m_YpRO-}jY25ZdG=0M(Cbj`y!>>l$!M^v@ZZf?j z1S_9_|6j&P)c(5y)BFz&6r*!N&8x?RgFjz}7|3#Zx^?|o?QPlunifYCN0i7G%a(K% zca<;{Gf?YCIn6@awb|h8hU{YO0qkIQ1$GwpZH2!iu`I)iwZ%B?C`cs=rwt8hK;v}4 zASE!IrVL0;2F_P4NQD+o>lEa}6wVI>qzr-6+z6>_Bx>u?Sj5HNU@wem_8@BLQ4fI8 z#jUmYDJk;u)mU5LBFz zk2I!Ki+BX7SPc~};T4LhoFZOAD(^#|m+;}mlpu(~a-=MBC2AiIX zUoZ^xDC9x~EqS?PDjJFBV|*>;7fIV7;e%MsQP{ntg&P-C}S;QOf-?&yzaLLk4J%ahUI|d39^{19&!*Jttj#o6ee2$BSc#TNuHz? z%j#nZDGHPaax(xqQNR=2o=Z6#Sz;74UMP)H)~HLIA+Q(|rHFn8v&|sW(w`DWT)P04 z$H+a7j{xhjQ_+j@LJ?9i0#OoiB9YRu{G;NzxP~tmxx}2mPzRXYN`ix9uoaa1*jVh# zDQpb3MM?d0G^^ihcNPaK-p8HLK4QmdrdZ^5@IRsc_TR-H(|@balB-0&NeZT-`yF5x zF#>*v$x7`)@Wu2j5O%>xF3TBX3a)@V;k4-N+ag9RUv<^Sm|<2?x#52|zV(G15Q#82 zDXhelQ##^)dbRD!zNGC}e4wxzyUXYB1YNZ#d!oh*Pd-0IJU-tI@484ge8O1{@BO## z`9N6sMDjM2T@1h-0Ehz=!!T%wWsz78>;POcbO{ENk8B)9H3EZ{9Myy6A{K#5akhcM z7{Z_gD2GJS5NR=CIkCtllkR6?FnghtFzVSOX~{fFvD}2ZlF4tUBN>8V1AtPv91V$z z6_z76Lo(TRQzVn0)&NGWm>eyI!zPxiRBQi*s zAH)zwoOlmA8+;Eh+Z2`0HRcr^c+xlodK1{g$!EBSUl4*S;5)jA4*loB4oJi7sbLVK zzh6&F_t$f%udo@O^aA`Fw=|W1Dv6eB{h?9KaadkE5wQp%Huiipxevp<4-@$== z=wl#&ib}y+-oXhzo?2X?-69g#HZZ*gmdIDI*WGubS{*O0GP)9p@7SGQ2VxobpJLL;4ZBce(pK3=%>^Tom84P;wp$f1n}n zjPG6FICnRRkhP0e+07UN3K$_7xvFjOQ(cO)dGLT;EDYShZdL?MRM#_hsi)C*ESl3Ckj8pzP+3*^X(3=)j&mOorMl&Pi7C(=HrwwEdr|#0W?yGl|8tne0_J zk;A4OvD6h_RYG(*6WIa*+N|y)oASRxIO6GdE~=z3a`-Z!VC@nVCo!@gS)%}d4XqL& z(&NqIRM4()s3n%4v#L>|nMiu6}YndMSmARmqr5S@8aL zH@Hf7zFWY5+Z*Zi!*BmZ_f6j>&=Xw&~Xq#|e)yTPc@Ohe@fBE+h!G4}gNY zEP*WC5pnp99soLCh8~d3ZA21aiU`Qc)TM;?MFl|50b>GLZObMBhqQsuIE$6=TO1Ap1nTpQV&Tmg!2c8=OUK8)39@}CRt3!B zM6ohXvEsEW$QH4~i9yzzC{^Iti>PNDjjZ@>HeK(z#j-&57id+C6^U`;Yp~(Z}MSy&&x6sZF83~0+^vhvN8|Z;eAzODB>U$h_>3*8Ucw!e$_!?d`_*$))GVwsDbauMTcju@t{{M*HC zk-LYT{9tJWsE5Y*$~AJp+hV&Kv=%9_;(Im>!G%dN-r61Kvcphs8uKQFrYh)e?h zC87a|fdIDLebVfAmbKn${*igS{L5s!?E@jAhWq5ntClsv+&2-g>6(^E=7R=;_!jrc z3VvAD`McaizLRcRrucI=5GEtGPZ9sPQ5{Z04`9RY`yJ`whbp88Q(*V+bbI)En9>79 z<@i(Fz}T0A7zwx3`GJjQK#$$@oz4hkC~lv=j1z* zdZ*gqvX?~1Y(7QP;oWCsTar-#W61L;qFyyrMWdjY_zKV*rxU5g>;h{|kYoue$Ffn{ zW+k=DA?L0)Tx$GeeH@X>+@`T8ZhaaR&6VaR_I2whGMTNx{7c~0Npw8l`>=q&TgT2c zU;qTn4nd=2kpO&5ZoD%O2BwG8(@I5^fhV>e@4}0nv$#H{7JA_1;8gq}wt?U- z2u_7^iK)TawKFtExyF9L|Klenfj)|H2CYz!7IZaJuJN3?#)eY^mx)#)r!->x89z}^ zKTkMT4525!&ywJXGj;{gF~uW>I2>RSzRc1&F!?OC6hjYDa2Rm z%fTmquWBAUA?)+9%pdev0AJ}j6H)R3f#EDSE?5f5f#g8b%RPh0%(xLbPQcALY z;GtX$GTdV8aTfrIBx(y_S{RXz3-JW;(=qhpZr?@_%V?1RjH6^VA#fa!AQ9>r^r$Z) zTg)RHV4l^b2?f81Mo_|@;cjlrW=W~&0*sOvG;v5dq6NsbDxe3mve^<2KLKX>#hSQy zj?w(Ihzi`@tFA0*LqUK^9BL9mLm4ed;$aIt8SBax4`>Ehyg^SwfkyHOYKSfF#t}o- za|Q1R!!+0=4zakrz}q9J&R01J|DkP+Us8;3DYh@;kkVRX6smva#KWse0dv5TSFl;! zI3>m@Zc^h|xo;l(q!_DAB?fwFSdUgHEpEKzXzgHv3sB3y+8S~LimNky=GYcaeX!G-;)WK;YhSXvVLan0ZF!c{ znsV_|WC<758NE(l}JVY-_gZ&5+SLH2Frxs=K2ndpU zdpGva#H4{5X$e1>H;#tHWT3ohNuy;O2m4>7vE0%Um#sHW7Qe_4(4{30Zf*R&4Uon# z*GO0(**NYCka@uxo1VRKxqT~v*`b+Oq`Pr5dn<{L_pmPAWE5uQEz=xpu{iV5Wk~&*-j-SB*-N-Lp%-|Xucm1QX{Ls0^BI7>>gBSSe%^I+LOj~U@HKuA-k=>qJiACA=QxE(G${;-}Awn=-O7}p6JdqG%ksBI-y zH>+JcayQGJS0ZlKdwv8b=xq)Bm5R)7!k+1NCv!ca#$PR{2_5$2Xr;=t<9*K)-00?d zt%Cwh={5KFUVx-*Gpg{uEF`>dx|9AZL;2~pC>t*3->zP1+LP#=kBTF zez(p1%yXV*yVlwh{3>vrir#Qfo;t)PJKgm>(N(&&*WT~%3Z2E`-b?I|os5sP=c(2m zzCHdLf7d8w#P*aa9=5ZJ%+8aY!+d+)-TuCl3_E=<6M#;q`v9xpt5hY(@n;j0SGbIb<#;#8L&FHPIL3%-`}AH`XX@Yo3 zTc)o0Es}uw9c%m8gDv^Lkr9jKGtst(547R-lk1XaglX_jfDGssSGE)QK+Vtzy2D1T z0!|4O2pNKbbGZ9!T~`=wd>)Sxr-VHK7B7%NAc6+2S?!m9Au}D8&pUdJR!d@VpqNfGo zmu%SyCV08=1y5si<2#U-Yoi_NR=3fCMd!TnmB9RPgBDOEdyCc02mi+ifheNjQ9VR7 zkr^s6N{rl88~h0giZ(Q*n?&y-auxbm8F?wsIaE{>t*EkQG7BSf)XMD`d8mJj4-F~W zneWQK!uW)nsT;Fmwf&l*lN8gIom*KOGl@%ECw9guXU>KvXQ8B&?lpe3lY%daQ@-|c zRQs#h&m|?ask9CU3YS@Pmkkk0ELepIrt-E&gp=d$H3rbVq-YEw;(FT{MCokM z7)D0D&=^Q-BH9=#=-xeX{2lbo|B~)#brQSr35K2SaSK=0^mq^|>K^tk?CARSvaqwK z-`TXId(OnPvv)jrC9G>zc_qB3*Ip{D`=^0ac<-qH_kUd`M(Y^Z5#Y$Uh}cMFSp~TP zkL0cQUCfF0P(3OiEH!c$0#mvW3?z{ijt-?4rYe~ezA=OqUSF}yyrJVSTwDme)RjrKhh0? zCX`LdD*^x>=Rkxspq~&824peFk^l{R0GeP}B2a)|_8GxG3m}^Xl?^nViO|G?3a1&29i%~@o zXf(hu2`0^p5)jm~B{<-g&3@+43^bcBp2WiY6~!-!uqE83>B?d@^ah$tpe8YCzD5a( zdh8IKNOfhi1zZ9x*3gsKz`sa@3}lCJ1IVDmpnw}?*bU)U=tVoC1)9wQWhAbO3(*T6#;>;JEm5yxeK6Z@iC_7XxqxvYsUWA!egs#1SNugc$0u%PLVF%_$%QScZc5w3jCW=4|` zDK{Y*mwfNRRFeo^Js}BoZ_jRHlQ4}7A%$db@5xz{DDWs9hRxiwksydelS(?s+&etv zDFH1^CEhFR>96(_r!q|?UnuJx-}jWnT1h3kvF_>3Jr^UFN+p}L?j2n`mmv6_N^-i@ zGx+6PoGv7lVtuQ3^7dR3<3Sx}cYL~vnm<9TgUEw>y!Z@{@ee~$&3rC5AXGSj5U?*B zK?vMN$r555X>}2THa!^90S79@>A+nFR653qAvztj5dhN!{8q@&1n$^qX<{7fO=*I* zd=Qg>L$$_9;GT=eB*v-f*<>_21i}}wk4)f;+O|^Ri#*a9;)~w&V*eO%pj!PgYS+o( zW8{hP{>SKzAUJlH5X>(cB?BjrM~jha^rEF`c$v`>#BOD1X(~Evv^cr>7Wz4zGznUg zC@dQ-Ly4ga6BGW);1Faddp0%}mGLVNRN_q}Lb!2B)C9=HC2ECCClfV;n_d!q#ycO) zYy>89WwtoPxK)i`Ii5&S;PY{JN+&TPf`Rgl??`PC%zGydOY?M6_nq_z(z$z5Ss zo&5);?dRf$S9&XPBg@*p*tMq$<7U-AsC{pW|CtM|#1Gt0Ujg#z$K)@PV_KN2?HA}$1!EV>u#;NkcrAFVI&)qW)Y z{*1U3v0Lw6`IZ|_h%4&n|?*hz2v&s8GRy;NoRghyRueTnN5nt1%N@lx2YvwQ9H z;u8V(`qmjX&11q=k;jFgMtJwHk77^w6rEcagr>(mtrwVQ;t70=A^2M+;PtXwqEWF2 zHM9Y-EEGkhh2=r6Lf}AWh!H@fz%eTO%A;=6ytgdP9;8R&gR4gEf^A9>LWrc_1kAuL zAS3Vt@Dk}A-T=)maGv-Nbb{&xYmNLLK{wq7#x&76&M@U~%wJ@G@smt){Hss2Wr_n8 z?qg0UA93RhQrvT;QU4NlNaiOOJ5WzaThtS$U#Lnu5Y95Wr-aEMR3Jk=LDY43qd2%N z9_Rs&hzI$AyOe=mq{Yf0KRomx(32)(5abJ-Vgq^;H?o2Jp=VW59#jcc(LPv1_EBEs z)%MYT1p9kYo^-i;(Y_dq6j9zpUnus7(Pq$pwlGtI4KkP+&bfYuDgJNa3^UxnzFMY) zJAi5|~W+i9PG6PnzHq{60flJT0^C( zdYq}gSM}N}*+rdl-;T#U(SXMk(Nf@X!Z^wtxbU@)fkNUg4;= zKJJTff<(EMCJ?+q1Vj*=#F!O~Q^4~c77tGkt zrTZeJ>uFh%T0v|hC&<66)nBk*-;^Fm>#e8fV{6?r9MB;jdmRG6sp+M^`GsWC-mp#G zu`Inu-v8VWzYnM&9QiZ~55SE6Xtghl*O`_ninwDPSnIi6&JDoM zKD9b{uGX2JM~Jv*+?DQm7&N>ECl^`$7UT|3d(GE)_iVnS=Wb!~7OP<0>QK@pJpCPg z<301Au%3UDVz-#_otyijG*4;SG9K**Yv%@laO`tU$Wz?81^7w%Ts)4?GejM2LcFef zn>jFv7iNpG4cNsX15iZfM7)XAk1&v%m7Vu=Mz8gi#oANrVf#?15xUT?03KjHkWKgu z_=0o>S8yrgJ2AVinRg%E5w!`GQ_Df>_1{|2=4 zWPOQSIcBS-bLG6rKZv*NO&iJj6a9F0^_JhT+k>o3IAwwVSC#O z+J!Ak5J`ve4e~&oFv{>Tq8)lim3xSCkNAf3k341>b}HMB`U~?Dl(-Nh6%CVty5WySG&|; z|55IQY3}89J`Uv~EL_h!4j_d6?#fp%dtS$$l;u)t_G?)|&Pk!I%HI$kgmwF!g!WU} zlmzoS8JVS&uo{fjfxLjlNkHHSvLTsgKpJLDTgP z=`twoKHm)WS2r-VzZy9(ILO48%D-`r_7_GUZkyV>O1t262Cd@wL^VpV8W%;OX_97C zOaMeSLWIV*zPs>#t0T$JIz)+2n60!T$5ZfPwyWgRgnqxrmBY*E%AcX)jnNZdvgtNO zI7BvN@kmeAy@RXbH8Sr!0|#0jn4&3;z>@;M69&<%Z>7WbJHQ-0CYTwed9sGLSW7n~ z6ii{YL=~j)muSn4(Kqme@DAaW=Ux@k=$j=KwInQevW*(>z>m z64p$@+F#jPgDp_WmqAg<(q>x1+l}_hzjJ6XPplJQ8qBiXk|xLULa!Rq6{NDkMb5mfj@> zC^V%FZp%VL71X=1cBtj|B4u`-D!^4oJ3E29?H_{_vG(qM*{3Y<&o*X`IS-!z2##tov z0kieV;%q_kBWtWJ$#)LNS8cwf)Yz)K_PuH~-gaE^A6~XFI=|zchb?|6e_SE2;`J^a z?F9$$?=gAgjcZkt7wy6)V%JXEaF~A*|FjkQe#i;`eEUe+Mz1r_3?bGXr{crs=s3#U zrvGNMQ>G=aTlTc|Nodp~fMC+Of|z&$n})ILBR&ZQ3APGFW0>4-_q5NmFoETd1#HC!);dJYUJ?W6pp4GxbLayhc5s?m6%sy#@W@H=!I9t_B?> zYz;;dBG_#>JyraKuARVqTgc*re5NvOWaE?HGOvci#q|ZTnP*18YjaNKb+D-KP&f6W zj)R&ZJ97vQjpRfAIxVsUTVbZuTK^`UM@GK1n(mCJ_gm*${eEv5Zsxb4{od9PJ6uiB zt|gldNS~1Mp-@=A>PM-rqDB6BrOn7FVecS4_?Olz-#G9o1|}d~kPXoP#)U`UF8hZ# zISqgVXuq!0B(hj*KZIGm|DZ0*A63OkN5WCf54E=X%OaD-clDso{$A2fyghj4xUP2V za!)=d^7+D=A3GYvtk*EiKD1@J-ikDCxFd3)#ZCw4ks`OadM_uk+k-jvB<*SQe!)d2 zQw5V?3>yJVIWc+mgA3j_8p>Ce(2Y=8rsc^$0u6`KI5-t9=3eWVzk)JR7+PLLAMBsQ z-*M$7_}v#gTDsOHIWTKgtx#q6vD@@;bX?*Lqdb%SwdYjwjB%|g{3cfYD0Xm$hJ-&& z`kv+;5^h<(I9-<%6||G3WSEY?Y4#?MnJPh>dRTmtdu^m*@6jAg@vcx3<(cdDK}nI3 z#rFyCwjOk1CiRUUgf)r74(Ax^f}lXtSexq@06Kfw!lg{opg_lon|DTgrOm-;hzvwI zO}fWfqk||HvW24rVvfdI9Q^I|V4R~5hU$@br&1YO$(SXP6P^~Xp zL=qtYXhc-z)F)X9xCqaEZa@fX%VYnH-gqe!UrfbPor4J{$&yzF#=Idok+WRoNwN)W zf4&Ydy9*_YnOms#wc;rLlX;x*I{v%~<{9OStYR=AQ3^mq zrzQK$dLqXKnwBd@q0E$pu2#z}%?^T*U}N>Y_)Y?F=>}fuG_Z0QsqzNy7r@PIaH>GK z&T=&`8xE~lKzTlgkEUlh{0(dF3O}c!$PCHo9jEMh*yUInvlYb~w=ciCn8;oFrBwkx zGtXF6(8TN`GPQ}gK~=^8tidt=)$Vt#@97_vyTXs1W%J6pj08-Oud|{{xO9?THiUL8 zb4NaqvG94;R&>?z^N*nOMQhYy$3B{kbEy$_RyssIDC=}4ZTqO*Cf$x~BKz2jRZ$Ub z-p!EXn$NQ>sb+7`{>?!!TArdQMh1W?l*O~bVR+=5Fn^YH$P_=2h9$Z+a^mW`|HKX# zcSIP`t<}BX?-zg9^6IsUprMJHW9)rHW}9OL$KsW1?eh-s9h?#YfNPZr2k{zDCd)GM za)NXIVb6W92Jn?iqFKDC6h`j(o{Yq=?ru7rLV5NNI@abaYN(4%w>d3Lha;Iep+Y1} zK8tSFADF-6fyzHV@xp$1Y;i~pO(kb!VmcKX5f$c>3AYp<;KYSjSvBH7ZUag@35y0NFSn)6`ID{G2Ofz#1~gpkU+#UA#xJ2*O>{VoVWXY5+CB zQc@g~q_|`3ae)zJLN;k$wS>C&_|Xeu{u>o#08&I4$2B9k75Eo%xIAe|+AH1jr?e;% z+!cgNn}9Gpqw#zc$Zm|a(9{zP%I|zJBIhY7BZd*7o$J^w@S0xT0OM>;g=hZw?w^pe zy@HTZ=Ep%kx=_K>Z#SR6S^T@0ZI1iaK!;_2RLZ8d&BRn`d7udf3>0s3e^q%COHovj zkRt^kjM#%Pi}X|`#C;>6F&WPI04OC|bZ}Y0(T)t9Rc4QX(Off1*c;;=4(NNdeSzxGWO@f_N$%mU z{iG;*`3L~!5LY^kre5H=VgTl`R6ET4Pw^>(tsOq82{WgHc<{LMBCFJ?pdZ}cu?CWq ze#S-`6jS7^j0XMgTlWe8GKRJM%pf=|k5f<|T#{1-s%3Zb(1?;yO) zagQvmdU45V;7uOMfV}RHA9qQ$hWgc5066Jf$k%#(PmMS^z~Z=*pA!Y8RzZHYMh@=7+8dS&(ZxpR&;&ALczt9{Gyr;sRk)> zN0H{Mj4`LZs)wJRVd(!+I{}A3KpQWh@4eUBUc29hsy_a_CoCCi5j|Z4NEH~A8FRH@ zC252E69UMIJ}Am<5&1s*z)0Mh)-+#pr!{7)`||gWvp}P7?FmrJW#%34%Lk?$Qw}DL=hUw|W3u z<5civtF2Z77+>x`pj&3N$ zP3+aSBQDf1pDO?>K-9m@qLK)3CW~lYGyKiNS<68>3Ql^i4Q)~_$z>}%{{#O>UlsA* zfHywWNH51Yp>S$|tALE6xtrL2Wn8Y^`)^9;GA+T1I!WV_(A>|W?)Ot1kW6i*p5Ne# zgS^aEV)5h%DU5g@*%{SASXoz~9bJR2n!zQkjzQ~nKL8FH6o5b`~tQ;$pbCW_xWZ{K~BG)=Xzym&OL`a8;psrpCq0V|yInG92T znHBf<7j)Meo(67Nr&q;dIR)F%CuH};6Zfk^$82!>{xL7^(Ju$bEX=g}lcvL4(_gK! z#gmamL(Ik6L~j)p^jma&XxoXy7XMAZ&jtaUSwcXv<#6`4mWae2g)$qW3Wi4#YKnvH zSq{^;$KzjXPU2AR3In8-5mC+u5@O(Vsug>j5eBBuH-m$rkO~sCBml~}`+R90SzRl| zrDj+^g!V8Q?pCsM!+jyF&0AfvHFe-0^QN^h&!egE!`>z_&ZcX*Av+@gPH1=8?4J|s_z^~uQ%X+$a@4zX}H@f%s zZSsw9v9IITZ8UbKIVa}KNRx5_D1(T4jNw%SA z4(@a*RzoYXa5NtUBs{Pa(-A3@LKK@{yRfYYdrjVHuPrGxI~1Q`bS+aqqiTdNQT;sV zW#p@UH^~;K#ju*kx#tyYijh~UmOw0D9|d*#q6?KJB_j2Bd%6@-TdQm4ylnjPYk+LIFthzprCH`?L2zC$ z!vN?~O}^y=3iq;|tl_KJRQop$LVvF+CWF8L*vuvU&Q`NCs--?RvHEWxfMH|~16>hxP{+c=mJXUD}T%6`{;l7n|!`M-10QbJBiAa{ulYSFdZIqs%(0wQ|*LrvCAC z*(IX$u`m@2a4AH;qd}&It?3h2Bwd>FxG3^5@g)zb3Uxmm-!B}0t3RlQHL>;Z3+aJsaT2(<6Td=D z-^1l!IN!)@^p}%%wg6m^h85&dDkDiM6O*Wq_|9W_Ey~daCy10QPqmN_uorb44&uDVeDB?4%6F>h4jQJ&Bo_R@cvh%KjAv~1w)9`~Qt>ddw zN`-PPr&q8Ki`?R{#GjxPX@&B0p+DL&D&}WB}W}x7OG*UhW-2T=O_d^lc)!ZJ<}t!qi6s2+N*Dn4+{e)oeZP<)nfQmIAj} zlGyX4X>YfhB?Fp>M{}mGw8nDi8A(RsVsF`41&b2qL7=zhCf_Pcdt!J&h)!lZ-w;I%fNsa>N9=n zLyYY(_3ZZf2qJ+R?R@vXF^GibTg`5HZl;K}J_iDp__S@+eMXa$go$*8_>ZX;9c!!p zNTKp;+s_X!i;q53HWK_baa0XfexzgH)fURqKIJ;ob!Z8XZI{mLGYv?obFaLy6xeNT z53YMp@6MNwl3A*EO)}1m(~iDTlG7Zau@Z3%YkBii&wEmYhR#esD-g!ZqTchnRoH{K`Cv((hc8_?(gVf@-W3O9=ygdg!K-OPh z2YX!#d?#p2#9wkW7j-ZEc$l57yHL?;&+=P}54XJYjM_ryWMcKY&?sfDFX1kX5-%nE zckphG%fIejP8A3;Ed}wSYG!aPcGG(>V25B5Zf^3=fU{H1@-q~GG4zYj(BPkPHD1I@ zjbi+}7M5RyyUIhqyZ?H4mvY45)qjX7*1!+{T6ANvDtS+~K=za7*xFS)WZc!|UXWyU zmSpRI;>&X4AfTp@cG&u$Y!vVko zH95%?ML3-NF#SQV*y@T4SQ!jXBynjG#Ikem+z&Jfl3C17Wk|A_rnnU43;d-(%?n~Z z36w~eaW}Dhk)*~V=cBQ}1_Y&d;wO);x-3tYGj`Q ze@!qGIAdy|80aMR>(R63GfT;SLwRI(BP#TDF@LpdCE^`C~l^K<^Zxx`y%yu*Y+RJg>+xRC39k_&C?exL&1h5;PQ9!SYT>gG2<$=_bwgH6)?*rCU_=<`Y*LyN zXOZ->UtSTZ$^?E+vom~9|0gI=)Gcp;$&@_Dv6~GRdIw?3Y+TxkJxerXCfM+IIFLuH zm9euu+iTDA4jpEeA09E}D_SKYk`H~z9j7l(F1nwql8Ns;HMH;vx6mgpOF0|MZK>l% zDg+~@DrV9>Yz=bprFKD{gjv&9T6N`h6Hudj`Cg_8i0mpju1Xq#b1m`87o`VM z4uta?qI+{(jip)tY^BE&$XH!|aquGfwWbrfO7?JT;xB`_R6DoZvDbNLwyrAfreg}e z`o(qS5n!-3E_1iGP&yz%Ptf&lj=q83rqZM+;=Q-RVSCt@us6oT)>T&mHu^I!Z)iTw zNF@-0%u)`oZMXIo8UnNbE?sMLo>TJU62EvW>wu9pJ&$+$a8Rp1HTRje@fuaI$|`gx z*QV`Nb<8<)tp6E*@qI+!0O{OuL8$mW+PR%voitxdUo}yO7S+ll*QWgIJyjqQyzCQ= zKliH4i>$e>jUVi;v0Qs3WnsHI@a5V>$cG~FjKAw!aioM_j9kl0Cynue0dW2Rw%mwln5T@xzrT%Q}$e}T$eSe%(vTgEtbda znErLDg|E0iesWQ6e(nGD{}Vc>qTmVEPY^Y6?tT)aQ9GGD8R z;RAPBR!oVU<7YFIHn8F_ZCj(bUID^gUCvbGYaBz#9L}h@=dx4^2fIF!$U=E26oqq`fU$U`$U2^74dcq4lsXnRB7@4#XL+W8q<@|{ZC2+t! zYOuM@IXg&F)cS)dB$k8f$8W4wjOg>5%b3R>e~!e%0zcal+%F zSq@Fx+Y-&}r|cc3Hg#)bRpFLDvu-pM=h+6HMWK0K{ygnFnS0VU`SVI(OWf)JG%Xpy zioB=(&k@ls?N`YHL$06b6I^sV^a?`5DAqiivQ5;wmqshhesdXyem^=Mg8GYf)dYAP zO3vH9YlV1fZS^*~d-M02cD7}O$>6eN%RDk~eq7XVe{B2#L})NQc0RdFT-#w0^L-QO z;5it=p)Z&2rt=n!_>!zV`CjJ4dqkHh%guN!CBax=%5^Ka>qC}Tsn9{nx~W8yx6#LQ zlek*A1Rulz1Jhp&Ec*U*fxkiz`{A}{$;bJo2UXGyei2JuvUC`|QgyFn($d=f%Q?q! zpkP!S|8TFE4mmHcdYcZz9&EL)NY$={l5J&9mP21dn$$CtS!@iB`2|na`zg`XhbhtpDFtNQt1cC zJkNdO#mQBEm_6_yqu7j<^K;6qUvI-|+KfGI(Z!0yk`mWd|1M*dhU$AmB+fYRj+x0C z)zZ|T2z7D-vI_qIDU|r`CKfnBJ3@^Cr$rW4uVl|s6SCXQeWsil^HsT3K zYGAUqWI_C1!~pOayHiJlR#ezttYP72-EtS=ZfFx&E|E`Y{6_L>#{-VTarz8X{YMdu zZTsJHOw0wtX3b8a6b0tPSy7#{lj-7J7B3Wto@WzuKHH3Y!Cy!Bc79^DBJu)xL7^GL zKsuKHqmTb2?cj&?;hY6~eI<53(MrdWy!dR32H|L5be2=GlkJzYG8Q+P{B@GePv93h zJFf)nIKJFU-HaI#)W-Ogt5>yqx-QO?Z@aPN(p4ZQ-?R0toQ;cpP0`)G5gxZSVo8jp z*}mk3EKFH0wT;NjqpOP8zrA2oYzI9Ed5bwD8Sm-5Cf?@DTBH>N84qDVZLV!uH5(5nIj?^AQVuc(YO>W5_dF8m>JrL;p54_xqurkaT2i==PDa z7FYLP11*sV{KCX*MZU<7=z(*Wc}^TJXJ3MW1YRZS@^OAXc!!-CiqsnMg4^p5l=?Dv7W4g8!2<87-FJ

    zGop35(%V(V`zXMAk`p%N{QPik%iWV?G_&1tB zR(zG8JU}(4ImpFqlsp{3e@7(7Q%HWHlMyha`DRbNwNG@aVUx?!E-Xv&m*b%k0`JgG zJ^S0|jk_NBGfJvaSr6>g1YI&v?+h`k5SC;@BcsjIvQVcn$A#vR0bGi!N-lS-z%bYP zr)t5h6(rjxX*c%`@5-?k0+X;v|MUI_$xS8RjfgY}5R1i52-=amUHcW6m4sr|aDkE8 z?a;xMbUL*Ig?q4}uzbbwdTGdyw}`(ywf=L_#(LI5z0Dt&YXJ%i^{onQj`dDVmo52U z!C%isT9<3S95}C}EP9s}9*CVsUBfuGJ(joHzS#}o$8!b^#dSzhsh#Wm{PrqvnABQ? z3&)uUbD{VHisn(qQ%Py7BH_D^@X75r7nKr|vo>47a?v+)&BKq}K85%{V6Jh3*K`BJ zKI#YB;gkjvbqoi}=Qsk{SHw5w`|P+v*k{n+BAN4^X5m)5r*h0R z^pU)adb-Z;8Hr*P*}MbaV0c@o1S9|9FE1RqE8tu>I9P$JWO%oRhA(7-YMy2MF8~KX z_`mgTy_k>uuwh+hqwBeoyl(jFtaX<+^WMgv>{D?vDxrVqoRmJgM!8rB&5TN4qsCgsBoI_T+CL)~~x8cOugrlU@`IBf`g$a`M|;+#&~nN$4!5loW?WtC?pc+cGBhfE?P^<7s7IxGTV+OiF;u z1g={-_(9SeznS2FD;Lw2^9A>E+QJv)rZa~Hk?A$tL6l9kR}+?t=U>8tsO+eqG9X#H zaj8W(|Bh9xR2*DYp2RSFVwJkW>h%)0BF{AXkv&=8Om!X7Ep_r`P&*$n#$cKeca#Su9xkei$7%0(*9urpSjjB3JMcTdfuD zb)pvizeLfjcH1K6Q`$X-uo0L;a3;m%IGm-3rwNiE-kNr|G-+}%DkgD&s~LVMdGIxj zR-+=HQgH8nZ9LMiU0ptU;~?AcjgVpxEl4~&TL|TCk@51Z_QoZwW@rWVy0Bpbw9|SMPgdWv6?(p zOT3;f$xipu`;4Dqq^I?FU19xrhCFYNaEXDz_U2q#f)|4a*j2Hj& z1i_SDRhU#QDg3!k@nXO!%pEoi2Zai{rLi{kRJsXTa$dN{8HRgY9}stpOY9wi}rffeW4raY8Xgg|6GO^933xNNYxCOK#A zwIO)MnDVW#(WC*sBt?dlh3VH|1%7~$F>SZ(Ci+_MLJc!C5mb6d!4RjFks%o+OP1DF zWG&~>%qn;K1`zG7#Njp1MtfE0gxW^-;yV5l)=SGc&Io2tz_cOUiCI6C*aK0e{gUqB zL4M1cdgej}sqvF5sTbC3PdM6-Ze-8ab<{YNp56<&%Y)~}aWWaI#can0S0Q>BD?XfR z+7Y%qLOt$d+O0Wb7NMynoo1P1-yvq)FPsSJYd3A!N+jdve&SeaOy81= zl`9n&VoQ!gEvIkn;srt?>dJ3Nj2*SQbu>a#zhK;%>9m%QgSPB4hZro@2x}IvRcqsT zZscSk7rysv>*h>m5Kz96KfL@Y%e%uo>boU{#OWUnUOhN^^7i8inQRH_ELRZk-k(Cv zesOOtOAoZu{@W@bjiS9yS@yfjz$X*7BIgN~LfGN?K0rD&E5sY{HFCRbS~Z;fZCn!bxqQ0EO%15G!&66tTfr{2t5e*FFrdCtv-{!MnJbFn@B-;)RG`S?B> z&^;h_3r7(606WJIvS9Gg&X!$56Rq>Dbk*-eMI*Nqza@ZXw>qS#Z@rAm^>4TX1m(`) z!F%8!3>w)P1LT&N*mU>&nzxT&b-^v~O!~Hys5C$i zws;ox=Z6kH>vap>vVC>p@_dU&^6@1kx7_{shn!c#u%_rPY*)PMSf#oZQ9u!yf5k*I zQ(Fq8Id_O7yw2SO;o)(NMFeE1D$uGd(4e0g9`QzA-(1#lut;91;Z4+sq04qPpf+#! zZ4a-LzN2dMl-B~Tf_JSVr-dByM%qyv4Wq5V`BPJ9v0D7-AaqXNAKFHi*W10XQGARtG*; zsZaO&2x^1v4RXb8(K*TZ>fKuZmpjS7hyJM}RJzbPPFAuMA%VNO8o*>G6f$1c-;_GU zI|C(6+pK+Iy8~NXS&Tq3S0yBj^g+2VVEJXlbi=H^9N?_++|{2H-qodXe=|$?tY!-L zC*spTX*Sdp_;tCd&}p2UE7WsPEtA7(^iV^=Hnw=>Z?=TWn>Y<;*M5g&a)|FiMr;G& zp=@Xg^?x4r9*Bf8_ch#SSvkW)0Yub;*oZ!n^*|bF#L+;)86N@dq-=v~tznrxEEu!~ zp+}FlA~oE{7)=*H$a6vQqbo9ER32VNIxcG_u76QQdK@G(|1TYSJq~eCGq#D|GOYUH z7#@TlZ>h&Y^>ip8ycYiKGKq#7i#vK&GNE2I!JY~O15U^fayN>K5HYRw{0AC;kkNQi zWhTb%Gr|9X7C+jP&4!P5H6WnF&tKG7-z7{3BmJZjeuCT{)@=f8`0ViKx0~NV^Kgj% zCXPbCA-fJY0y=?}8i{@J)Y4NnP)&8&hKHw#jZu14=r;x79F`Bnt8HdB)|4B~2ma3t6y?FQ7@Sk)#@4 z{>KEY0lc!u9Ocu{~2t7y%3ZB>l z)eKj%lnMi%rf2O8%a_x~-uDgx+s|VTV7| zBYzi>mdtZ9hjTngwgh@>W^2BSGv^q6cl}X4b05ak2kHazozMlLGs@(hPD+?vfQn(l zZnp8X7MW5IOp-H~Z}QJdgr++$yZKo4(VkhnL~Kz#4ZsGXQ)6U?J8kwFp!MC!<# z!R0+b7=NWy_9i=H8$eB{C5|VrpXiUg3psAbd8RT$OT<*%mj4H`rZ8}py}{GaMUA|O z2Jv%aC8i>cLy$O}s2&68xD}{rK}WdfK#=P*AXfImyb{G9;a&-8!56X}EVto(9L@kt zDLH%_>9|InP|yqL&XJMXfMh7Ck`a8#ZfjScNJ^^pc3Y4Riv;4T=d0E)9Egh{Z956J z@{^iI4fk72qDS(L-IWQKnl#dChh|uo3zg~LkTC@4udaw`N8+~6rlln1I z|6>K=n@zSMPt7k+L72kq#~9H-*56w%KcTCbcQq?UKeGPwb&2lV(mBOgb+ zWc<11OIxJV_ivh2UgS-mo$;;>iEpd-J_`g#6OPCjtfmAhQNlWH_1}L|7t)29WClY# zmq5>y)agqr(-Ks2gzwWuYOjaC!wdyb(qYaFk%%VpM=OH6rcmVTp+xY7vTqNuFZdId zz{uNw2mO5pj4w7YSTXs1~s(p{J*=YSYc z{cBOMoHyP)m=o>8Y5z=v!H_~Lma7N~45#28<)OzSlV=SW+{>Yx$p>t>7>MjrP@vF~ z&854*FtLKqMOm)4;F};04P~TS$)@igm(GQ-*f^w15J4thkwD5fiMhJU3aVbA%6*e# ztGZ{tVKI5bLbnQfh^Tn*=Hx;?wQ-ciHKXs+A%eyd&k#DaURJgY=#*%904?AoCyG}L z+V+|s9UqHqhl@NFhv(e%?O%49{rf(%I-{)_W;Bt1EK@eth&#Q({MImpxlvn;$=#b2 zMh}+nQDRO)ipr|h*BXmH5V+v9P6cm!9KN2au|58Tvf`Z)ZE7RPm`$_Z; zav90}fIp8gmi8BLCVb~MZGV$I@CEEv2o&an>5Ek5CQ+`65&xD4w*%FG7+g1brv1OJ z_^39<)Pz_i`r=WhNi^;f2_`h zjyo)B`se+RtjyNhm#IreNfhs#f9k8a>xI3z?Hdz{ALy1aj~a6$W2`uGC;~GO zBq0AS=9z&DlF(@v{}mH9g?1nWu6CIbzqo{7>jg?Wq2z>s7NJ?SRW2UDcOs_C@&b|J z9x(`-AHIS&KN?^M^?11yn~I2?zQ2|yC-MFJghnM|aXFss19ayoqy&j0)lXRY{u#hLU8NSqk+4FkC%m8&BDh%`y4FMro{Ov< zA$K@G68SV2Bn_vUmlRfj^s?lMR3yhYSMt}nqz7LeVU@h#FaGC#b0%&2+DnS3@tXRH zO!CWE&M1F29H;3SWe^%E%yF*5d=44ie_lBeHSKh;1ve#g-!X)9(p)iYNjz+RJs&M_ z<*e8Nub1yvadG0xvRp{P1weACS1G6FWJ0jALH3!O89*5c9OeHfQX}+=0R3ot86cLj zq-R%20dNn17nN!$-5*8l&w)3ErCT=9d^dX zw<~J>x+!V(Irp`GHz0E+`wix+a!UFd{q=4~M8esLuhJwIZ2PMPv~Lw7aD&#~#$q6W z?F~ZaoT~xrJD2Ir2q-QmjD9Sfx}OtpopVQ$S8cpBd(}VORPk;JtXAxKmtyJRcxD*>)bf5p}QcJ&_LX4&<$)8c+63A`!zgr$}Mvnl(b8( zlGqBaWZhCf+BgX&#;8_7jH9L~tuCsQBuc04)kob69cswJLco9w`qKj>`jrm7OO-UO z%}GcJcgWjsLX&?NQyGoMa)F=leIV3XdVExvpk@o zII)aI?aveIKiZ+ioFO+{Se+xz7ipITRa8349^s!y8^BXEPMObI)jq5G5svf#_`oaI2`rQ0@G8 zmYJWTFov&8nRjrGI#4uG(!U?ege@mGi8!tz-9yWJC%R4&3W|+eSJ&TW0)+JAlQJgc zP)eJLYnUZ(s$xtQECMu`=c|*MXx4kdPCVu>$Z#JTSKzVd#(p*{EhfA&h}m4z>p)6# zT^BVH3sO@j=Sri%`==aMYYYZCw{!%U0i?7j%3~>@zjjPx&|4mAGf(nJ+qXVy@g6+0 z^Ps4?`ow{Nvdr}3ywxL?ea|z>LBj#`*3N|JaA{XB`o=b>-GZ~#r#g!-loy~1`F-15 z;TiI75?n(_n1qfQXxb$S{dCP6uWu@TJ=I#8$ZkHwsDHEGeA6xIjl4I?6(bb~FkYc? zsSLHNHPW7nd1Tg7_0Sx^ zils9;BVXt`XPw;M1BXCg#mvs2s!3P8aJ47$&8&_SSZ8sZm||rU3Dh}DYAjT-s|6sE zUd;nfEH1`nok33#vu()X-DEUFlPlWT(p+*HO(sxv)))2<;#@pC8zcIR9cS15h5PVN z;2p#Swlm$zMDu?Z0rMzun z^fPCM(E&tFEZ7a=_w1mr>SvzV`btTIgSH(_vT62*>ddYblRJr-q-^jeQZQTk*=?Bs z@^^izM+P%+Q^{P9HeSs#)!aFratj%#x;tiL`f(xWzQwAycb0*J0mm6@^?RRLpn{7h z`9#M-mDm_O&clKbpEkb5UHLuTV$|P0ixl`EFKx_u2Op|ze@JI@2e5%)yA*Q22r#}m zq_wdVy!OA?-y{DKMYvwZayXCMytCR5k4j`pADZS_i0O->wBuJLUr>%3o1q!-K)v=D zKQ`WD;~kS?AYjHo?8}zVOMlB@twjG=KI$fquR8tYsk&28Xp;Is8te0cl5DKp{%$- zGS$S6=yRxC&HZj_@OgjLwfoR7%Bl7OXWlV7tXqAjUa0lF{gY?koyzxu>ar4n{ z>=q)5Jf?@iEJ7+nJdU+W#gE5T>sjl^BkZfaq~b;6=hma<xIfc{E{@K%pd-j0lbQe6?nu54>5~eS=|zX4i&n2 zb}?>{@sE~BuuF+vG;L0#C~k30GE@EuZO$&FqEkW(Gv?>j&(T)VS<`o-I#@jt-5>U z@1{N1LA^UbAEjeVgis2SJ4g&gZ#9 zLWQWEbHYgy!zsPU-K+m1BTZOR4*Le`>pBnp3q}8icP{L|e4Do=o9`d~54pi?)JwX# z*{quDZ@q6@>2XiRc6Hn4H#{{Ge+w|Pa``nZLOKRAVuxd*^6~dB>6YpEo@uGYwM~Xl z)XRK?%fuqibOCZkko8e1b_sZ>igf%$7GA-9s&pz$DYKe2opT8ejAz(Y>}V_;*WwjV z3}b^gCOd&xHUUC0d!&8nFpZ7E zh6hnP6%uablW-R@WO?TMz$j#e=tx0?nt2C9QH+GcYo(s?#1RhFNhswUC(#R7ej!zj zj6{3x0A{m|iTJ9-*;EymbQdNjI-5DVGEbhKz<}0}zlk|DdHJm21`~LZ23OrdxIr^t zhivFEmvNt1uz3cKGJzOA@@hnb9VoM`+c<$D*C~`Ugiw`+Nu*<wbnzd%H;aWmtzai>*<@6|pWLM6$BI7dVQ5aA zpXu4HC9=6ftDA*H$qbCQ3}1gtO$|FEH@aimFOe->?66d2LyQ)1#v`CNApV(aS#57_ zVmy!f1rG*Itcu&=c3?eT;oVpHJ8RKdAJdH9I}t+VP?s&;TimUGqooFdqOZ89Pk!NB z4n!j8s-LfS@fV$sPwrPfAOGV2Z#6V{bnJ6BGx0ytJSKb-l&<^TX}u zy7=Cr>w8=*$N3qcy+C+zZ5YG;JVw(Fg2Wd}Ky#_Gz}qgM^TX%x7M*^3uR2b~A+ z0-SgirBYGXcpVH&0$kO1RitxfH|LfQ%(_4vPxTy_J2O9M z41RjzDuJBd;b?Y#K8w;pl(f-%-AyWpvga)C^lDKim`pJ#{4n)j~$RP2WOY zbQAJ7x9dmkV{g0X%f5K2u)0{nbq3w+c&@mfE6LX{;T!+-Mo7n)#`rwSPvh1=?qNiM z_zx#tsBK@MBcEdH$}GHNXoq-J2l#Zf9)q%X@i@1_c2HQOBpjazqRCM9)pJW*&;9l* zUJ^EZ>DP4k2|ZVzh|blBq5L{|X@(a5RU1>ZNK5^)IpBrN%!#%FbOaRL0C=iCT`xrd z3WJwH!)vDC6i-LWG2IZ5wLF8)NH-ny`+I9MOgg9X<;Y+vt;8oXNYNA5h`4=2#VZq3 zZ~ArK0z8zpQ6dSnmDT9Y zRm4<)E0sQHszO4zJL)ShkD3(F`^X}R@O555fVa@5>lsogDayu7G|ZVkQ|l~jzGV*Cso_8Z2m{Opvg z5VOk4E?OXDBvh)53qD&?318;Mq1-8iGP^KR&l(zVRNbh(Vlh0JDkwTw)y50E(%qPw%w)3Sv-StMFydl1U(ux;Q z-^Lb_r(vWyU|CP$dMTdGjKS;CRLwTiNfI4hK<#V?@e~s@A{rGm`f44YH!qahO#>72 z6a%CijWkx~;VIMR{5vNuf2%7sDuK1ie)|Z9jtE3G;y1Uzg0~|U;aklr_M(TZUWpAZ z1lAcbdeTY+NyHuhtO-yEYXtP{9(e@cx%H{E80``2TISk98JpO728ApnBNdrHVtsW3 z#L0ymoYktUgl7n8lm;<1une(E=5rurtYQFzgQn?(>aPi-vOo-(Vlf1nSyETZ+oK{6 zqWTkM7Is{9njxU`qIsokA7_N8Z!Z6cq1e{qO6EL>9U7GQ2N83I3LLnAr~>pN+KLd= zc~M>ye+W;cU(LJ&)Fn;OR)DT~AdL*}Gs8H567UP+!l_j1&HHmN#)%u0{2kWO0}Z?^G#H8$itRz)6!)ADXc>RNd>$3R516xKBwM=F>gEB zu>`J=*5ZtAsM}}_Tomn?BOlI3_INWvVpw{IKdNk|PmOkyq5VGKi>Pu-CfQD3?UvnTdii>J0R zWd>$St$*^Dzs$ZmF9<}i_a|43LUHZPMV#46qMP#NA-U^Bm_d`1mJP&|Fz^`x+igFRB%^6l0J=IlWB-i45oBIdC!tj{d!I7Bdx6 zd2pc!cg>S@77g{c6-rV0T34+)z|Jn8qd_fZO`Op;1`Ag z+TpYXjEH5P#i7GdflaU~_G=HbS+XEFV0eh*ah&vP_mv4D>5jtwa*Gq*qg0Pbk|t#e zo|C)SGU=~h_l>@@la?`E6vR}(O1a%yx2NjB67lvi$t!_QvB6D0!3t@u`$eVGy3;1k zZIx++VKj(10P}hx3+3x>h_{|<)@u`*RcQ1|8?TelIXRz;D|HSa3lX;nYr``!X|Anf zlQ249gRWQ6*vxn^VUY-yYK0vd0D-PMe~)9I(NX06y2?{AF{Wa1kfo{8!Ab9hm~blV zK%``?n_+!8De(;igaO%<$GJ$dr!5E37HsY&bV>!*e8gEaX@HVlWIyZvL zcuDeeMGgms35jxTog9~h8AjMXa-p2K={T|a2#CGhPJ3+VS1!7*LO1=wQ8@&1Drm`4 zChn^-aV3o3j7y0m>8n|R52;teX9h0alC48U7?sTH3|Qthh;*gVgvd0Ox-0V+H+spp z_i18j!eui(RNJEbUuVfVKxDpig-8}KRtPK~>}5i#K?hOG?MVFu@)4=`DJ^3{dI(MW zK~awAFPL{Ed%~6Er7K9~(}&D@(SAa^Cqse`t21L`Kp0xg zokhhK=1XE#XhkeF1aG>kcUkd3*SP?Bbzf{#4CB48M8l4(T;xS}PTuPuhwp((Mf}C! z>jY&&*kf;6?4NY5(w%%y$at_caYAgg+9GCs@C=ot#V<<^;mwK`gk3zp2m&o^%*o)U z$6xBX#LSA;GvoQ?=pFAb`Ot{4VG9eVQu^KsJC7;HGV0bvl` zj%gK}6dY{Uyhsk}p0~4P30#i39c7|@_TwCe;}6(5MCLTHv)MGm+MpHS!eyADqU1QVJ2*(<0+h|ld2VTEu*mt ztH1ULsbOnU^@9=UcZU+e%S{}&GhPe8bOL2c@b|1eMLcP7SFdOeEJx^#m)?xVsuPCh zVNm<0GeMh$^+k@}v>!&RkN2f!s7h}y%{>?g)}Xft@qBh*(%*7S2>Etda0a|X>oMz2 z6v53p4hz9MEXQjX?j_A=F-C*=_U71tbetZtY#K4^R_BuixHPkie`M_f7qV_2}X)<6+qJSm{S5r z#X2Upo!9U=PNgwX+L5YCcn6rQ6cynbpmnPcAdi?!;=INqU(V6xO93?AN3%2w`KBRk z$ZE`tz6{PtqenYWI0u1>cL+|s?(wO5k8v@g}3(|HEopxVGAEih65K~0XJvbMP+ zcD)BS{HaBzJZ#87xjMRG1I-@3{aLIG6kcZopn)__q5B&wb2)6yIN`V8Lhw4aFy%CY zqF_4RAw+AElS}!`AeIqZ^oCNO6uIlQsyd^V+;^?@XK%xm77A1Vco!H&=OhSI0l`hF zr3&+YoE{vTAKdT?eI2WENIZ+SnbUz(xuj$w2^KogjlqgxO}8JZ=* z00mDg96tVl`n7t0V!mOAA{F*|RQc?2!k@F-CE|fdN@-8e*O@yvRC7Cftl($uRfLN& z@9Mt-G)nAY@v&amE}d93#B0*mmfGG>si~SOD z$yk9EU+oOhwRiwAK+eBFvMR(oU#8&3(S8kYGLYo2<}EzaB^As!lbaL?)iChMfP@yp zdysgz1klLY_8Kq-uMA##4GVo-;>eBiE?%cN1R(w<|3N)?@_ZaRz_o-$Y$i4g@{D1y zRtOqy1uTnjNJ8%Q?6yY6y^}Bb_rtL8!|;u(sbJt&Q2y#Ru{s6S$-ak%bgVM* zlwyQH%}vKu%m;!xLzkA~4D*@&!Ny~{qFsgWq4?rF^5;?s?=vCr6~@%6Tc_UQk0VoL zxOjfIGS?9fkBWMzLUmKF+|b*as7QDBLepqM=K@J9t1-aF+FtAMr*azN_?BBo{?WkI zUX7v>83Oob$OSYx90+mD&#*1@lM;4g?SVvK$PiB47+7v2OKtx5JH2IL85L#V7Mb}DFK&lr`am*u=L(GPvF6~c106*CBEPn8*_04f9@ ze%{urmm@tuy~rX4o=mQQV3Fk+ssZqw_65QAaW#m$OX)%IoJ8enoFKZnUY&$?HX-`3 z%{%Yo?->zC=g~=LBXPVLcjTNEa7NbU z08A32x~?_=h21;qZxfNa;JO*gjNj#1CZ>S%a-n^tQV+H))wO;U^76Lf$PP7J7D|=+524(*Kxhf@)@L*!|8cg4^LO+f0sj;tg=eST-4i7>M{CG9Exx!!R|cW< zV>|Jg%$jLE{_;nU>6=gz=%72lZ9wF5t!%=!eVHYodO#Boz#l631Rlj4g=~z6^E&uZ z@NQruYPz|xBZw@Wl7{q}?kxo@6smUtt+1GpfQUWa&EfTGo>f)t=8eaC7Q%dqPn?c$ z?`4`qWOTGP+Wg^`^z9Y1TXw|(A^tVOU-sYPZZg9Ay9JORmZ=?Oz&DT|Lb6Mvwoi(- zb3_}OjY{V(CtJtlJZiGxPq>Kuv#=}RH1HDg0fP~$=GVAa90 zIec?z8ZHJ6v`5^b5$V!9qsx>VkuN$6c8y_zlT)$fJa=q`%W2wI%B@$C0;)J+f#zbXXws;}_SJ8}w&-@BT zXgrcaAL^=Zz?b*F_KFVPs%C^A-y?)ETzOv2;Ef&elSLoP(D6dZ$9wo~scwu&gm!=x zlPI!}2hWYEA+h^-kqpyLQTiB$KD^s$%JU0i$a#=;zc^R`KV@e&1aBrb)WX2^o|B_d zyuUcxGP?I!Oks@b#}NV`9$3I8S`PBgX*dBk~RczUf3y&>T8OP=1B3e$0p=9=UsENw_-q5}{^KM1rV8CK3Kb|1%K1X5o+Q4x@e;V3YtSy_{ zm9eA*`T|#FO!)@qo)x`+Gj#~eBNP1KC%bsXq7}Ic$+9NQvx+Ul`8#g4em&7g5RyKK z{-5NR3ZKo%q~shpXyi<+({ZYqTCL8a+iu8(bF>yEe$>7;laN3Oc@Irx-&mCQbSZhn zA~VqNmh`;{55qg!uJoaKpvFlHa=A8S`c5@N2Ln+k<~pY>1($-Ez=UCumN{J}K-O`n zc*ix1jXWJyk-0;b+tic=YsgqlhdJ&PBsJU-gD3dU<|_>XZIOk-1d4_?Gh|OP05JlU zpbP1sEI0~wKcj<`aW9};Zi~KYtlcN1{=?;wGW$T@YCjjX#3WVfBZTQt;Ez8MyW>a7 zyYA&H0a#K+=VE0zt*T)-a5HV`zgPFIreA&KiH-Jg%{^HX9qc368$*qwb13QCi;N3m zvr4k_^%**99nO!TC_x2aPdHta_5HB=Kemhs5q(yw>V>5tA?8i>4suy4^2pU^%?o$_ zJeq$o)1;e}6tZSmIx!(LD3hbLZ&=8V8QkuJ9Al8L%vzm8~mkbeyZ2Ac5QqCh-(UEQ-ar(?dMHzN#GJ=hIa-kQ7GelD=?Z5*>R2ZZe?B_YT!hYkKoqrk#aTFrQ(l4qzd-80o#sGTnltx$to4iFrxukiz_ zP9I8)x=KT^kZ2PZi1CgIFs%_kf_X0=lt!e|MREObv3%Bchdu`(A9J|ysWY!`8z0<) zSnjMvvYv44XlTpjuX*9E0F@N^>!!!{+nr}glLbW~xNpH*hn7N5Qx!y+Xt5a+Ssu~a znxWi=tP|Hm=1VnQciX;$++v9zjHu=_Ss`TAsk^l%R2xKXZDBb?_8AldINt$8-w{HQ z%C9wTdl?3vVsNTzqD%*q+y=*Z)&{BrnqyW>e-ws^l$8bnxo>M@Eln>@5n(~3Fsxu0 z^XeRcuE6)A({OfXhD=@9rslSv0#HX7M#yrG>tJj=^PLQIkr~Mj0ZInI%Xi+ZGz2O& zt7VM&HbOQyqiR#qbGh6&w{SMBzEoz^#KA1|9lDrPER(p-0SChBHFaHqgD6loo9roo zQ2yd`3~|sSd1tj17kv&=*nZsovU*_WfjtG{+&!S~J3AZDP(&7DY;}My7ZwE~(4U-8 zZt2eHx-k(9V_J2reX=`lEjJB}GO%@19ZsEGfXj?*-oQZ<^?L*Y@6rXQeGz<%HW>Bh z5){VJvkugraIDcg+OipD*|PNrwYTwV2aZpQht34bUjwVicI_CQW0n&E-;dG_nS7w} zfSkwktP)90WiU-<*oCPiUGWnn77(QG}n$~%?ni@fiuLIc@^7TK1<2!?R0z~C8_7cV~+KC(xooyu6Wpq zenj|7@|>?g7W$2ILZ}%uBxK99$aZfL`ID5N*zqtS!?6mYA_4xY?*t@pMmpIgXIldA z$rUHcjqw`eTH8F|?+M|4Y**I@!+S!4OS?ephJUn-G-!KTs9qd@yyw<&-=~3{^|JlL zAg}IONoze5l;`P>G`-IIQnk%;nEsT@J^Xue{_G(PRVt-L>FY3*fiem9e$rZy8uIlc zM3cXc&|&z9CK)8@u@0T%!LL}BCHu{hgBO|f4$Zy*pxrq68d6T?Zp=bUolz-8SmsdzK`<;}G#vMox9z0x^rP1v3@+Ixvo`3RM|3E~N0e2- zEQj|S+4X9#NV0h7^rH5m7!=`Xzf_xQU@@7A9xK=bPL(-$(uiB zq)Y=IaZEyGO-gEp!Lil<3bL9;jJr}#7-U@oK$GmqCIzw^V84giQJ*7pz<#);g}rxD zF*i1>hb6s5kR*T_g%^{MKaWTXzMkzVTo%X2Ja{SX8>FN`J}5FZn>VnQ1RCXSS0F^l{23Awnp$_S9sV+nZj1GJ^qLMFVGUY8h z9@|zR(YzLLLIRx`v2u@Ea%69vjjprIpVEbag2wYzdS1rd!hWjXlEBFUC=lKvLvVwK zp`k`}CoGSRxci`pXc$zaGKpRyuS_C|)28D4wEXDoZ2K-#HnJygu^drH73;-=d%Y<{ z+NWE$xShDh8ZS}D8hDL1pG|(eSz@+lxl6sw4#M z@64GK|E3Dak|p;! zJ;9Bk*Ikai`vB-{uAt`cO5CuHlvljKKK1~VGOk`wpei(HRjHmOe4_e+>EB6gLjN7#v{nPh!u`5e;X_iB+(S?h%okn3}MlA+=&=o9B9 zYWW=^9CCnJ)=@#+#*^1DiujpaRyjXwP!vN(1j!C({7u_p0I#-rGfS_@?W-3l_Jy9X zoYw#sJ_AP}8Z!{c1N_I9g5{o=0$u|ga2?F4-Od;%K#jHb>(Tq3d3?LTF*thA>BzA@ zEiP)fcMd|iiEnOLIM|fUJS2}u*M>o%JdhTC<+X)(!$%Tr`Oe*EbZr8h8;GhbrZNKV zqjaOUZc+ORagt;pJV`hFs*&Qrv}oGQbJVSB$n-0AA3rgq6Of%Em>fTSi%cBqosn4% z838>r!yS%Pek{62EVRfp`K7$N1~bj@%G@>UDe&k{)hDJO;MWT1mM(L}iHs6>2FN4t z)5xD-yIZGW9V`^fhK$d{?VUkRj^Or7+34f;R%Tv)4 zm)n#SO{(sh*ooV+ncy-@U-_7&5-)#yCAHvw(&Gi_9MZ+y$Hc`5x_(&Wqu zX<^-2n2s;QHYD2Xxa7w%`35hc*{RR4V>?hC3;h&=XDDqtXbc#h7lanF`QXqao5-;) zSg{~nd%vO}1NF3IV84T}%!JkBOEW(20`k^|U+PRNk1#4j^70|R`8&twk<&gIX=6md zp4@tqEcZmvTGc2|jk0=p<)Zt65sjweko(}Tl=OTHx+%CN@8hY<(DkZjiCr5YJGUF@ zX)%=;bkcvLVI3{tcwn_=8i#Z4 z)$%;Nvb0m_Hhhg2U_XKN=2|O<33f>B>-B`7A3_4~E_LXxfLuc#I5w>JD@qQcMj4!8 zzfeSw#aG8+OH<=UK{wBUHMMpCEGSNWX~J7Fc#9HL0|jN#0r&w4nRpK~yIPjk-6A~^ z4fcSeAcE$py=>N0y-SE;QD-L*lnX_(oe~R*=3>9Kpan6#u39A~>)LAK$h@K)2vL~2 zV}b$c7&m-*i|D~!F$+8mw1}0P9Oh?;-8cblP#@2_*Rl1KLT#CB^|0fGTq})+;uT9D zygfr>LIUbpHjc{0{6RzWWM|U>@gb{Nk#RCXBBg2UBD)(^;qn^H^_-{ot4!jdP4G{R zg9c!!JulkCY?rxOV`T0+yS|W0KyFYq6&aEKpX1VUi0VXvPYC5q6U~uHK~r{(PH^j^ z*sUyEd0zCMy>U!=JR;}NwIG*Xg7DR;((8)O1$e)fi8ikDmt8^Eg)Kx3?{Vq) zOG6>I%tDWXpEt*AX+l`8`ZtG9RwXq_w^dw zws7MPiC_=wRp2Jh6>79(`mJs}p2|Cl5|Vk&lF057wY(e_Q#{|rONJAQdC2BnJt)Q( zR+P8p1y;ZUbeSMWg~cKf*8#h9o60WYzP*(|^8~c=qWzICWFOh4BFQBrDvdo`IDgBA zN*Ej=tJw=c{oQ+^9+JR+g)ptVegnTI03*p(boi@)2820Xl`Ih?+hu9pAU2aGHPZ1h03$cMSo8a zWY_Lnc%t-EZ9Qx|m>2q@q(V3-WEiAr*Bo#xU3Y>^4DMcMckBn7aLGKyZ7C8}okdIF z0&c-mXbuV7`dAXHKvf@#5G?;v{QEJVLE2SvgFf&@G3(TvhGn}|2MS0Dk%gZisSYJI zAKJm=G*4zLC53yHu>ET4pwJ>9;-ajyyejmHN)lCzfjM6L-ptK>jy;&%NYd7x6-{{a z?2JQ1vOXB-OSTaJ<2QE~_JLya z0Hd1d>yD-kW}+kRnHKNNUnV4+RV@C;MQ;{KZaBR#C=krq4D~vn@>6#IBu6mYtJDI0 zIz@6@D`sf?yvOOFZLrM;F^wyw|HArpx|sSSgPQ72|3adK%5<_3m7 z|BlyMcvn{_2pGVc*udE|!v^V3EM;r|HZ9=G0$wxa@}3zOKcswuo9y|D(@2^G=4l0q zK5eJU9?`dF)#;;^H2?Vsa9Wc*oWY>)8(fQk3it+{j6|UZFb{ z&+<$9uyxAk}F@)Lx54Q2!%mB}|0{|y6 zProhTmc+JLetVEQsPa=M$-wi=;Uls8l_P`#fFvaNlfFp~yP)j%aM~Tfe!Fkfh{%MhA_FSEDq)(;V6goco(OF3J^8M$$-hKS z2gdiFI`U2R7k{kEncc1k9Fj6%nZy@eZ5?Da{Z^X)k*)|N1*05_n7VM?x=s$mM2LNE zm^bo%^EC3Tfy%(}RCv94$6_f*YzAz+g)%AIkqn3uD4K*ihU6@)2Cl&j-RfC=cE&Oz zT}^CW>P~O8y`1KX1TV8QIj?PKYZ(hneR1m zr9EaF#nVhg33z*@hUO9qVm|>*Kyp}I|!|X)#UGx2ia?^s?d1uVk$QOB@Co+&{^u%MYUQ3$p>6p#)bqp z@C}(05M3#faInjfl=MWO#S>Z5li*!O8G~%N{Csdh1LP6)OFc_%)UmRE3e88iFE)z9 zn-|8G<)-cv_d#UxhZno|v9jo$vI&^CYxg*BMTb(I$_9dB?2nf0*C)tlz|9`G2zTb$ zgsWO}q4wg%ak|4Uc#~nert{`~@x~eo7<%N2d1f%6|Cq>Rcxwy{ixXHuB8{Z}SIrvi zX;wapgQhjcE1otO_KaIBmYR^wKgIuNqvwuaxoV8iv2G(+3lolb0hfKq^9hCover7> zOUOrWxq98cKBv0Hp%)tjt`JDp^G?$Z1XzAOYd`r;N1juB_mP5pJVE_i-212v4g@3P zn|-G4$zmIT=K^7dBxok?ZMrESNtp$3+fPt5d#V!u{DndLy!I<3u@vef^Q7$I>)m>Wl&?rchqufOy1oDeSl4+OLf0 zbcux;6cVqM?H2anT9K`$o3NCT-p4Yc|GwaQEAsJ1D39BQ@ZPJ~J=5#YX(Tj`-e@2NgwT-%8Cd#I(>iVxHr#C<#sRA#fd^6~U1$If!Q&m_L0 zC;1s|b+S&W5jScmzIlgcy+M+3AlA&dyqfpf6UwYdqaZYHa)$Gl6V0idNQ$fqpOQqM zE(LAl_y`BzDlubIqL(;zM;D5eftHVXCFsJy8OZr^O`RwoeSJ|EP}inlUY`Cm3&RNt zD`d@Szf!(`3?V5h=gSj4Q(Q`}43Gy{0~Mm1gXL$Z82GlWgi0Z?HB`x!uWMayePbV| zQ8J}?*H$AtiID0J5Mx)|c1X|ExrOPRU`DlIwZo^7w&0-|18{XV;CkM6p^h0b-oaog ztLG z9%vX1FC1{yUL*`Pk$iUNq6zXK(y?5n;>^|EYYiOT`2$S5Gcyr>gw}7y6vPM;l&Qlf zDV#$f^m&U2fWSyhLEaMiJHq`CQIPM6#6Lj)^QKd{0U{s)6SqY*HM%_}z&g~9bOwmb z!-bO0mQ6r$0^R-=f<-!v-*a_~cOh$U zP#+$KNFfaiH1L#G_MWk&iGg@tYm_4{#Ixx?D)jNJVwgq-4B!3n4duPN@*uX*DYDFg z&pn^stXX+^)r$;I2g=UBl7d=RI&9r;(2G~L_-0v+X9fGVM7X#l&3TAAh299n8Z%ioeFCMkm0k^&glvH)zofI# z+*5f{XQhrj{?M@QN;xNz4>IFUswDCeaP%D6A|tFeI-^j_QS=+RGZ5<;D}^Z#d368D z2>G?j4A`@C6VSEX$(wAayMQ%|n^2s>eOwuvBWJ3YG!4R;jnGpm|K#JHT9T72aSca^ z&YLSU;{>Xpm*7LzuxBSkU_)M(5xLdNV^Xe_THeBO&^a~E%Ym+XW><)J;oBUw1nNfO z(gezZ42)#dVhq^Zr4&RSRKpfQ2=8&?F6q$cisCtbsZ^K7NOv^D1;$!4;cL4^~)@lLM)>l%RG(8&>G9DA@%P8G8-X9xAxd;#ed& zC_!SdfEJ`KK)A@uBN`*A-6A$kogQSQ*95iLMt=*OU@O^nt{@*7a_23sTb82x)Lx79 zetpd6aW0NBZYzp!8)k|7ekLbIaXZa(6&z zZ)MTWHR(I^K;Uj4;fMk)+WId96t3|liDGN~QiHqIzp7H=CQ0~d=|m#n7W4+3gHwVw z=1a_9b9#{h#;#C?&xW}Hg4}Ze$R{eI4Af52U94vJ8ea!bRE+o&)gSNzhBCPT7V$UV z?;%ekOcehRfY3@&l@g-4fWNCXBAT`ejc6j+h*X^6LN9_61Jd$cbbpgWeV%@AU@231 zt2{|q=V~J4F>MRA4{_MJiD=qt`=GBaL6N=NWE*9|LsP`4aUI*5K zPXr#iR^lGb**+mu$zdGkGDAxjx3{nXG6!BkEP;(uycg>=q2;r2}o3Q-`HM z5FIGmGo}-To>tF;s-2_&@wMOdrSAE#Yyr~Xj$_RLr~;cJYnMV@B(a;X7pkbSj5Z&B=EvUs>Fy< z_)U#T56M=8B6aU$fm0e>SlKeR%<~yz;ChS?5A^fYW55AC&W-#E;_TUD4KbqIm5cr6!8oCW$Xh3 z&P=Vg0NZxhuU}ukhrIuwzCj;)k*UgfV4SfHh!RL%376l*o|sde!>50l^P)oK_SDE9 z3nqq$+S9v36hB(PhV|s!D9}XOV<}-pS3^Dk+7I(hZj%F1)2=Rj@Od*06QU6!R(V#r8nU-Xex)U_}xuc4!n+Wc}ab+SPc( zw~Urah3T0}iCrA@;KaAX#}_IZ^d|Tn6iy!X4Hx7v6uAu}h?Z=_Sb9*!muF;Y^faDM zJic8CI>*o2cTRPw75N~)W=%ax&s8~(E3xKSrr_Z=K7>MQ8x<8e)i-DjJylnu>-i^R zlN($x;{)*xzm9bDj1cnJ<&8(;t9KOm&b=9pHrzUD>N|Ow+GsY6m;Uep*k|fz`lThKPXYs7;N9 zOSvg@Dnz1+(dS?6T*zEZNc)1t($3cOR4yQQlIcJTQlaV7 z4RsRQ8)9oGtc)SmI^kF7v=kG@i2hFBYFW`QEOj|bC=i4aNux(i?#cTX*I&cslnK%n zEUUHw_2NvmDhgiIkqAOyJkjfeC9R-z0Rmq_!RXg<6g1{>%=OI%ktO%^zQ$7peu9I{ zqg}ws4Lp;*)PZ3kr->(f%BS~|>d~5VB?P$m(BnR#{M@n(BifF>l2$}ZP_8xbxwKHI z!1?cV_@xz9Iur;n2E6eY|E4Oq!&_4@^ttgfHYGWv18*5AS$e4a2m8h#`@NG6O_OY2 zslR@07KX;%ZhDmaWo{guI(q7bN2(+C_yNX(PJ;IT$XO8+pf{MwMcY6SOvMY@4CJ{o zH#;N`0!A^h=Ed?Qbtp!%j(JAZopkYi)sM6@1JB!WiPO!l-f+QlsuN zqtMk)Sb%MjYYfKlrhWK`(DVW`(&0WLfSRKTtP;KbaA$II$c#PKwQgE||H zUKcpgc>baM4jOuC=*cgzle*-Bi0}6yS*5DgkRQ|$)01uWe@DWMUhrELp(w*IGvWOm zLr_il5$FYNsoIO!ca>?}<>=>KEN#@1tC6+L&K)h~a6!XAk033sAUaD6^6idW+XGRY zBP3OiW%Bh8x>@RxF8-;qp}RPK?&8lGDN?%!CMMV;35_Y!CE-26O1yzK8|J1K^)b?> za-pw;m=6IBn5k1^31J5PhhD2JfjmNRfb6-zwo_aGLp!&uEAN0H(~7yd0%Z9{J{Lxs zbF=8RBeBzkD6JvJO`7>oxI2}n1sP(mp+W7XOt2TcW1u}a7P@Jb+q`6&vdIt^s(Lt{ z>gNMP{<$x+UC=ASJ3V(1rfh(?iI?+?xB}yMPzc2@HM{lOJuZOW8QY^dyIrE&W92mA z7gcuw5v;A{O**>yb10R9OYtMrM@L9_FcXlrdjEB^6F`ndu#?W+6u; zfgff^5~yMsv7nlV1+g0`xku55C|tnR)>Jd6@)=_x1q>pfjV4Z9yvUE1XL<7Ou0ZVt z*EM}o7S|;v$vrYU6sGuDgQqVIh}EAIS`unnb0jQLmyc}LL&{q@L2?6yG_M2PN_dQV zY&4Hr(Nv*97AAg#9}>6-jZ#P%!7EjCDu_ZQGqld)%o~t8iBIPJMA( zCI05uB(tkX%{2aPu-EV>R{vXCuf{xYQY4HgrG;iB4BJy^KNOF%2)_omP`k)aFqJ=Y zTLbKWf~FP}(A0y>{H*?1ujXS8ByEW#vcZ~Pj&DEe0`0HAG`9GSqPw*09-oXEEjQ?x zD1dPN&vAE2PKIs{K;2zYrk|O$mq@=wM&u8lZawW`aqPA(4#Z$XVLl!vWE*{Szn)m? z(d@BK4qomEfhdeXVpIf5G+G}D5EG~!9tc6K)!O%pEKG49<$L32YF~D^RrJ);cU}&l zOoU;pCT2Aw5hpQ{HTj&>5fR2|L3qE|M7OdXR=S-(wH<)7i!4h>42Q%ed{>kY=01aF z9I8b|;Q=(}Y4AUMTp}S~>Yrb&yupiW$R>HPpmj=#2ifpU*Y1BOs`lC_rR%yfyfn6d zPkQ3yGlddjz}0US`aFyLwC=rg@2y->)2Qu0P=vbq%)Vd~a#KT>xI8 z9|iTprr*XX@rn>`%hSelAQzE68vImhq~}G6OX_T3*puRGC++d zuBoR^JI90Oly!0m!VN*B869Rzkn(9qtD0O zF-3+ys|;W0enM(&j2!wXOnS$UJ|BZO)2h1$LX}b;hPZ$ecO43eBuo(jRZ+BXIS!y5 zhecLME9k-b0uaQSpb`XvTpL1!ayqvcwOH7wggfC*xckWImK;$H7YTp|kg$%PFuhzW z?zcCy!e}RhSvNpJ*l(+>d#nEAPAyQa>W`^R9eX1`ckrcIvyi5wFuZ=dYX-5}^59OG zXZZc&*LE2tYg({?{w8vebGpuk*U6V{(QXZ9)s{)J%?Ixqwg$SZ6@;8c5(QQWsCxVb zU$L<&ZPHom-tW;nca!`7t1-g;fJd4I5aFX>i&e@ulA{IsS)`WCv{_0xpK_!`)x{=OMh_63 z0TzQep2!wY&VRk_QI%7yM1_g-^w1KyWbb;p^T$2Az0CMh)8eu3V-K2N^k4dOs+O!D zC(!xrcK>+B^2XwAV_vp)Hq__IKYfBPbFiYAAb-j`#oHHHH^UTVV8$lN`ytS&RZrOQ0Y9e) z5Sp)m!v3%?Rr$9uiC)?V08XxCV084rIES$Zzt1823z_ZHp@Ehjhh(g*N1bEgbGEf? z|B@EtZ!bH@z15E``JiQtqT78G6i*vR*O~x)MWImHHx#m$JJJ07j6=AFA3(%NV*toJ zQfr%2!GW)Tv71}dVa3eqCB;&=XWp5g6{15A2TI6a&s-<~ZxQ-x**sWpG~<^Rlht6_ zr>?ZtLdvpI=vg?r$`t6uX-b{uD~0_vH6RfjGu@BCM{T|p z9&55mUx5=vHs%Tqoyj!g({Hb%F%7fWj_f6}o1n|w(CA(fGED_WJtV(EWKQ?b-zwg^ zqRek^k~Zq%7`eDrEme3QnT5lI-cc#IzPmWJr1LC7#6+7j7a|4TZiPzJIt^DpDKH(t zUhZ}8PKtpcf^j*UPA{NYK|OdWGwxYQ2b5XWWMb(6T^ur>p!5^Ch#iu>a!Got2OMP2 z;zR?w(S5O8oci@9pAQXTIXt}$j}sT%G9A0hi!s~-;Dq$`U+)$}g`@bOtCa}vjluEJ zdD;r?v_>OA8gyn>$Ie1)%{Ycd91@~x`>2f!fpj9+o)kF-qb-Iur)l7~;?k#pVED^) zt0Jm<1if7VwFX64xkC8aSv?1PD{v#q`3ri_CIykRz^P=V9F&8JL-PbpiU9{eOPp^V zm@^GRQ2QU1yo#3HXZOPiC>kj}=UBnmm_q3YB={d2A3a0hkq=VfndwY#L7vNeOrYKc zm9kRvY3^71mirhl{d(?!+U7?zxzNF)w)4)P5k2IJ=Ydp;0OeF(h9qMFNP^60NWVz9 zLZb>@_p?sq6Hp4;Nx7C9Xk$bRuK_lVOo%wRK?eYg0n=*L%hg10G_=PiF-j`39m6?5 ziMgmREa8QQB?fCFAY!NlCL;+{&llxc$Rb5+QqU7_oDyLK?|#}DZy-RU#`Qe%h{UoG z*`_bQyVro41+$k5T+a&tUXPQ>Bk7pKo{Prb(2B@aWdSiFefh&u14N@-=~`&4TB|PR zVh>=W`PZ;fFKn4*ngguW(JM1n{#aj}iJ&$J}!gzgP46wnHA?H)fbjGJ&y{72qKZDO*h z0+q?meA|&MVoxFS3KMCu6k~sjh7_Xph@0@(E^8Jp$SUWC-m$L;R+|9*R|l(wwy7;v z1K;baXJOV>Lh7Hhz1-sfib~^TR`u_E&xI0RfHlPsd`NHY5h1)qqfS;qV5;0&pvQw} zoa6S)F^YtqJ0JSw79-3=@Op>Tw__WD1kl?u?Ti+Yqa2$?NNT_hVW3vSip;(&N*yLU zGW`f;vI&O4?`Op{{^Xm}wKM5n-g)v#J~ut3ekyG=DtleEa$utAOlB){DdRl%ccbxrATue(IygWDwF_0`g!b)bjW|w-xyhVKi8_a)? zh{s1ov9t**6+@tC^i@k35dtDME2X3Wz3w!F8ce)n|{;r!7BG(yL4>Prr7-$vJgJWD+*5n+YL5A{7yl zC4+i8VrGNVPEfLM>E%2Twy(>{TAA=BGFx*JGnGQi-ad{U zfgwdK)5}n)jW@Uteu&uX6_4|JM9lJDjh0TjgBaMU@)mF8S=w|BqIiUu8fdu$1&+vC{Pu?_BWp9G zRz`tThWE4IUjJrT0=EuNzN$ivrPZ<|!WuqKnXeJGRl0w)F9vu9l=Ix$4ASsw^R!AcNUC!g$LXOcHEt%Sq|&F0+|6-*`oO&S zd}8;n=iCbzArMOJ5a%y4i>GsilXkgSmc`ZgbBgvPhGYlKev;EEq;rKkZKHpR&3Io< z(JT>nbK8Q2yzT-gZ_b-rhWl_wTq}2?`fT7TX=JXf80icy_ugc}H|I`-^Biw$4e^0d z^!C$&dA@b)-IpLeUlBa_vr}htHf=MNYm{?yq9sl3LYwB1skX{9n9wD-+YrhOb@6Ko zI&Rp&e(2Rrd}R)^NFr_yB0S5Xp4_AcM_Sqh$aRqCZ60r#rqhA%A%ABo)dc^8%6~Xa zM4OYxn;T}O(T)u*98Q1f*az!-Cdcg)0n*oXE~B)s%89}j5#dY^g74hoxx#jqqtSl| z1hIeJbVg76t8lJ_JejB=Aqd`MJ*(2`8K6&jAwx&l$R#%QpYqH&)%GMj134kNIdkyz zkEQt7p|kZZJG(xx7x+!5?O9OEA_bUa3oCiI2~JCW57YI?pIKV;t9~n*OuvHh3h>ZT z_6=nsF_{j;65c;mK%p>>N&e*rv_(tf8xhx&t}!8p^C>GC5Z)pxGPqSxCm(;daKN}{ zq%a*p8=7nv)ZUKHh%j90w<9){vDVwnX6a+i4+Nf%OW#)5w_^ z{GR6{0BLB+$pD)m1!FnTPzP<)=TipRBVqOWHy2;U%{7eeRb^M|{PT!guu}kG3PPLd z!P+$PKD1HX?^6~bmD-q3tj{i^VM`u$?Io1P0j0#MsEr2d!4&wZN?4X6OaZT4q>V}v z9hsD91%gbXdUPdqrV3JzLJ4JnH}p7@$fwUYzTWPzGmor26tA}VwCRtVEr6jUEabF~ zd07v4AIWP)Xt6^boQ1K5CxeY7tMfMM2#G-_+yogEue#Epk&!Z#KXeV=pUFx%lF7$Epk;n zZ_-q=pTBw$4M(n6X-dBC)bs9ad&GajvF+2GRAIf1ole;-D5k*-3)%oFCz*g}`(G*nZ557Q; z5hWh#0)hhR;PV4Bd?qy#MKY}(e6-go^^n>z=xYcF72hR1J@9#2al#if&|I{3_!xZB z4Yf$4RWLX`l<@f4edSbYigQ0kc(D1JNX~()45TEkon3M-GwRSVpDG;&UR*jmtpKyy zAKTi9DXr9CWU>!>Uka+sAvF7V1d^>rc7CF8gpsESxty62u*I}~tT@L{Pi20N-N@LASkR9{xD`p~ z2L$ZM^QJ>O+k7CeRIv&B{?ii-$oH6Qp0bes-&a(rGNk{hc?3A^R^kM?kEw&Xy~kp5 zq#@k-zW;F>DbktyG!q}mx6OB3k`E=kr7(SLLr6<^4w2*6_U2rMB4bnY0HS^D zQ6Qjanz$0*L(owP+Ztemhg3Tqu)>TW;^dM??`+fXh8K}p5zE*;5CJdTX?%nrTUDGW zkqb-C4O{(5Rr3*;o5dpu164AmNfa!_0n<>i7%?e`FV0>(qo;1}kHAemm`AD(MY+fE zSx@Yi3|vp5t&kK~C>{0*-Uj;f@bIH|71BeELy8l)Qlv$^WFhcJlQq@( zc%mJH9u%Yo3Zo*!rhxHzi?=AO$6)(5rtj%&UdI+6tO68n6_NgD<^wj@Z4u9XqzD!t zY}Gns0VPkOw?_O?DAMT305?F$zakx1_o_>IoB5vAe~~8&#oZqeH4pNwDuhW3F{@8fE@lHXefhE4=y?@?Ghvy67_V zu!rY_3x1(oyOc@AOCaip;@k*JnW3OE;00*2H329!PKN2tZQaocO&Ky7KU_5{uYotU z`N=~cB37;kq=Q!8nI?7Ryg`6)x+*I5Z>XgDLT(xsNyfGW0ZkQ^@;5h88j`8dGdc|! z3+i9jv-^MPU}8{3YLpBNI?za^PGw&rji?6FLM|LgbAB1XD)|T)&m@a&$`C}_)dT6m zH7PcMY|-hnIFx2>WXA&7r*B~)s>%^GU-_D|I~3>WoWKfC$qbc>)u#CfOjkxxGXZ290%tq1Y)f+ zbM=NSz5|Nx4cM*3VOAX?Jf=AKWQ$a|nw>g32l_PK?Y819aHFz=&>D zZlq1aaNF+~LP2cqa0Vrt09gnzf$f&YqfH`Iv+@Tq+w)o)XmkLMPjy2;S)G0%q;`G| z%p-Cy3ih=5wVH?MdkXhL!8J(cb@gk+JB}(OSQ8cl1JM{cegl+5H29c6KSQBpkfWyh zIWC_4O{HqrpSV42RSSW3VH&f#y;E6;vCq^hjT380?{N7lj^`uWQR+;SXL=s#my_X~ zneaJ7^F$~Nu?D2+D-_d%3`&RdBP&Ce&4p7%X2mmsgv3G|0J4i-RwfM_!CYZxM0&&% zHK}#WrntaiU5O7Th}u37G%^KC#Etl-)U=L70{n($0O)CZ=C4sm@(4%ldQ?8=Rtf6s z1;?m|2rH{+`Q|4gz#Z?)ObDeez1nunVDsy#fF?o{8Y>qV`5Z*$$Ob%P^Wv%^y;D_L%c)^f5Hm+=Sq~NG}Rm<31 zGu4&yoON#Q(PTBvs(G_0PUxb(qlMJO9Tw_!QMY zf4G!axBMxIf9XE($?g2gPqN+$sI>VOnZZhByvgrMbVUUA9W4c2TRznrQTfYaS1uR^ ztll`0!>o=>^x&zt!A}Y@c&tEdji#V_^&!mjqx5q8a^o(s6S4@(an$o0XuNqn&LvS!mPTDl2O6mYY8%)wM^<8`} z1VM2SseZ#Hs}>=Y&WK7%h}Em!EkzVJ#eaUhW;T!bp8xMu<}J2X1A3Wfw`fZ&i^5oNUC43q%`#ML*xh1=)LKVWDH2l*O7eJNf(}jw8}Y!!AGJoaePi&!iGVZ@Hz6YPV}rOkPm$4FCy^8Q!39Vqi8`<4UVcwC#kpG1wbKg z!QpkqcTtT%>D~-IKIos!sM^yaNeFln2m9|0!mNT`CL8)tuN*fY=twZQiZ%neP~NV= z5R5F^yDpWCJp1kPTgw1AdFz)w>6~iTq~`^N3e33exGme^FM2h~F}8cLbg$h%5UqT; zDrr5`T5n1hiupNxXEeMA$Ejn6Hn!xEivbdW^i+Du(m5VHi%Lo=KTRQ=o~9!<)YcOE z3`IIi!i!CMQr`6PUwf5NXcW}>4TPU&g8jNJ;Xsnb!B3};uUHJMkz`iEw-1>Rhn}9K zvuRGE!W2w^kb#FaOQ7vj(zQFOMz6migc(fL8{8b(VyT+=Pe=(%R0m$ZWa-i|*gu!6 zM1E=GHG!)%3WQ;lV?Bd>2+e#B@L>ODG6b>EWDM2>^tKZf&%ww`&n3sTv}=XgVjfkH z`HPochzN>`o?v48r?jr6ZsesA-K*&$O&&q!>ss9^f7WyIOs?pJHq+;;W69c%O^@1} zRM}ONSODEj>T(^H=y1{uEo3`*0!|13o<2^ZbRkG;&`{C?q4iTh;}_BpoA-b?Ohpkg zBq+tS+7t`geMy;54}RrHp}=WMbjX;H`~(1A*p{y%jw?j$Kv~uVpym~~U?)x`L8f=U zrK-K5lim^q<;@Jbe1f1Jyl3Z`4&QU5HF8yC6tzom%t)q<$D13LsVKEtZOKK^ z%kQ28Xh6bs)5h}5&P0} zPk$}IfNNL-f&!vyzEn_N6*#z6GOIypH;%;WDXHk3sFJ-Vb3mJK>5qI502~nANuYr6 zhh6_Z>YVwi9p{(nPOCTXP@L9YzDt{ICB0#n7PKteyr}e&p2lojs#hUoB$zEs<-7Gv zw9qmtEviJF-M4=^6*VDaPw`{bUox!he&8SjX5RFXiJEqQCGg$ ziYuyLm51T#tPHvE zC?Pf7VgyuQl!q1vOd07T!JCZXcV)aT?wj0egIbBNK(Zw(Gz85^yS{ihArmK5;`HwlBL zGWy>oi`G3sWI^JxD}NyYGMiqScynMbX)vc*JiFoK9n!*&3#_G7TY^A@%IAaq6bTV( z%+MAaObG9W%Y-K_H8_yNns7OT^D`2a7pgmpNdp9!7lf6{vZK6@7d4G%RyOq)1Q}9J zg6cCtYy@Eida^?)+!dP*5hX=v$46FwyG{&Fg%x(N*2neL(-8nWLy}$Q(Um~q>(Bup z^H+Z%o)5BB3-GGvdrT72cv^8p*`tSE_P!9wCa{|L?ZlMI4A93~bE2YcXXw$NB9$W~ zo(CxZglQcG3q~>o?=If>JJ>n;i$u*((vq4&doU@)6OrFMN`4xGg(fB-o}#jJ=wE+I z5=PnG90&ij@ILfq^|U~BxP0?ESMuza(W)v12S4OiK+>La&+KhD+Z-=@sQHu7mM=t1 zRF!jA|RBO=2;_8aDg*5Z64$Oz~=-bqQ$QWn?M(1PRw=zl(5TSdYFmd`AD$M zmroYfv+(1zHc^qFh0W6GmKMI?v0PS(LF@4fx5>g|&EPZ7b89ZY&Z-5kk1w*aVQ;TNAZv>%Ksi1;WR zkR-q-42XH?2uhtK7q%R}M_^r3kj&UmWv(xq0{Xj{GiE9(W$i#Jg~=d5X^)E$Z~-5_r2aM%5oYmr}!8Y>8UIPSWZ%c)_q3BH|-Dhnx^)Vy`;tC7el5|Ii)0feZ|Q z#sXVWkdzEW!#0p2PxCa`cJ-n6sa()K5|Yb zoWBoydlbaphM9Q2;IB69^}ZvIdJPwsf7gM$1+G$s!%mfjmxs#&kG&_iqWLwql(Rfs zSCq@{a5yXyk7cm_M5LE874qkqT1vW)E{%PalGKNV(d{Hy)}Ajt-g&kBM4FG|1lt4^ zf+y5WR$z>4BQiigeY?3lYSPyCmz6ptJxu4DM4Ud98c`Q&J9-~iv+d7Yq-#Dbyxf2E z`h~v01-3xy?W|YhKCCquZ#Q2{zM-KZcVXT{%W6Ghrd#8KuZurH7Ueg4kDYHdV!xc! zM==yGE*LL2o__q_#Ycar>RawJ-z`0Vhk?o~W_($(WVv?--dHwLeA_UNLVJJ$8)^

    z6sAlvdMu2)@e}ql#KXF?odi#Cv>EiUJ$}(I(I&r#JcIC(Lx!{QJ6#I3 zB738#JH=4~k;KfKn|U1+pINC2&qI9#%XN5*dnSm+*xtOveMdEmujeQteboUDwU;^5 zn!T9lGAwtP;rE&vBW_`kiFQb$%= z`Id#IjJXOfpn0C2KMOkvh+a!Pim_Pzh5vvpfFMu}*q5)cp;;j)e1_$4D2A_vKw=}5 zOZ)q5dz^z-o{KzXCil&VW5C=VPiW=0S8LGVCIia5)?DWsx4r%$K2`y4~xr_%%i z^MIk*2kfB0ycll%f~`{Gpr6q!_lz4()Av5MzQ<)qHnVqGj=9Thud+`+KK4_lL95I? zpOPl`c2xjDv97b zG+f87(laVeHIMs=com08S-%8u6`6%8EDcFnXK&UinRcl#Ci*4?H&k^RC9}o{xT70G z&KsD+IV9ucM=e*+NoLQdz8%(7^RJWXwv^Z;tt1$qPRwORo77&1;oxero~`kC$pCGK zgHNorA%}R0IF~rq^)wn$Y*0Ug^Cvo9ub`tWo$3tVrV6bRI0_EuGMpBHdDyWW#Y)u;I<8|Nr44m#ouyV?0_hSwm;V>3w))aY{ zq4J%#I+4&kr9JEF%3Z#S~NZif*+OJe9J_M~For1r=`t=ts4vp!i8+=O~ zU?XWm3(Y%>lFF%5463%y&vHCGUUvy&P|=_m<=L1MUKn}8FR?H~q~1cV-b1m$=Q!Y7 zs4gsj-gldC%;Un==V+LMnTl6wr1MDKYG8!^CHb6$pm-PfZm4#!FOM4%&7Z=r#yNG2 zMK{t)V=xCBdkITqgaY9?){u_I8z8jT2xUD~pL8al(sD3gQL1w(r=Y||H%+FMUkDAb z2}%z%Z;*$lhDSLk(#qnO-LYHH@*=@gVq#&e>^quWyqtr?Iyf6H|9z>GpNQx-qV`)M z(QO_etAS?)_AuKcpqxlHP!0Y)kMwYgsuvhRKlcGEQg9ZRoT{vK2>3_KirB%jY>~oHF(h$E7nsT zVe4?pRr|&D3)P?nLx{q?k(y>u(xfVAc%yhbTws0mxL&h=3FhO{NmWrDoB>a`nn{<0 zYnP;+&(y8kVhI~${<{@XAn*l9+H8PhNuKEg*pbLc6KR&!g|U!oF^LAATCQEA?f7lS zABA~N-I-h9Ds@m`?F7~QI4BNw-lH?(&V&7vBrTzpQLfFy@1OMPIZ77Yw^}iBSfAwk zG_={ZZs&kt776b_upHiigz?l1AweY?Qi+!iZ*&m9Ov@Ay|kwQ4vhejK%NRicl_ue8h{Ln<#T zjR#Nk`*I)(Bl{OGHaIiKpuc+6oa85tGHsu`$+!xXm`F97nEqPm?c(js$6RqpYgvli z7}g3k)@^l&2evS=Q%rbN$*JQ-ovSz3j)8(q|(_v2U7MjhcGiNb9J7*V#`^WiuT}#|Ig7RpxZxpR*i)0}XAFqo1)&aa&^NcTBgQi}Ixy%lm%7@$HLSD>M z+_@!%lIL-1wMDYVMlr<)o97FSBuU`MJ4(8~0%mm~5%-VJSbiATW*@Xq`=(~k!Co@y zXfZ4001(HvfyX z6B>r`GuSj1Ef#}euPOe>qDX8CHt9<=l!t!A?S#dXHphO_hS8LBq;Iqh_>{U9f%ol zG1qN3)ql5q%Rb{m&W-I)8X#@MlTiyl8`q7HQ1Sh*ZEF>k!vWhfx73A~Ovf zS<0_4cM^sZU9fD+A`+-0gu_0P1(Rr$=nS4!tgPjCy0;-s*R;)NMS~3u-L}7pO^Nmu z(Avbb&IB46d2J_p#k)(q5HBJ>)yM5y+hsUALoTMSqo3rTj?-tY8|x)uW8AW;Tih$8_4zYf?;m*5*gCaz+uH#9~QAaL?syP^)1 z(L3Ku$0%olY<}E`!Yok6bE8ir!}TlKiC)QR{nqi5;rMb$CsS#Gu~B7|;aTPmjj;9E zvj53B&@J$8n$*v=77?eICK!{O zT&T!Zu2>~OyWY~K-spRe?IGIoaDca{hwNAJ2djONTl? zAM*}`d~zzjmBp94$+8wVt2LKO{Qbf5! z7yLgEj18wEk8eGSUlCdxd#P75@a9msw;GlPNkYkb77i@$ma?0Nyt$!+Z`3c;ubY~# z=dOpZ0YV2JJ5*B7Yv)50vBr5M4si$xV$2v~K9Qr?U}_?qxyHhXrW<5JN^mV^{oNx9t6 z<>=*36^AZ_e3ES?iza>}A)rT-5D#;!WvyUs)wd;+J|n+Ssmha#o8NO?55~$~vOj}$ z($=)E9BVy_2?D(b>yknQ&65=beVLl%?#1&*o#jt+V&VllLrP<=_648&usdT0W-@nt z$*E^X-S5JVx7P(6YFyT}Yv$YDUV~KK7tsD%o>vD|!Q+3Ysxr$)LG|Pl82cQP^WNP+xxo&PB)}2p8d2PmBtY5EbRULq*TdD7K}D zo5+>&E5z|nyS^$L3LNK}*1yiOps$}z+48M((ZG^dzHVfn_?~$;tu9E&uCCNs>P5Sj zx3FZFMwPvj03UsPqp|pGWo#cFAG86>8_4+4Y+1t+I%Dk zD!MTf4H08$(%2_tf*H)~fPGQ_J@5dI5==t|^O;H5%qMCSD5FY4yRgUQMcZysn}~rv ztUqM>pPB+tgXlvwE3@z8>pg6QroTc4)6+U~%7yA-SJTBaBan0APLzP9KiM(6u}Rh9 zt;97I7U>x?%YTl~AzS$cl^G$?b4BWoxBsuBXD(w}2S01Pr)1Op#j#HRv;ow_SFE0` z!H7zE%Bo~7UH5-Se)8G3varqDzP%6AHO%jw{Dq+qKycH$`$1|K$pdKmW;t5{v~C1C z#>Kd6voM$5)QlUFFBjbS()M3|oKIyJGovz>C0E@jRqbgC3dbvEIWsBqa4{&PCOyke z&)vHf^}1@xtSf{mwmu6K#0c)&+Tor>zVRh|Rzbj+%{l4X-DR?X5ruFommf&}b=fSG z?Oa4ev^0nG3{|GlJ;RD}n9+nvmJj18AG+B`S|Yd-MGPpS$i#ZQic;|1+Bg4CA3rtn*4m%FitRdcyN1QtDxIxh= z5kkTwq3m(FZP1wdRxC4+&jw~qYf5)D8K*9TZBwtMWVaVh25C%4Nqd-Yhg&q;uj*oC z+)9`1ro%vSI*cDmPIJ-T5Orf|hPO{XJUnA8U1Tvyw=Nx8uTXbykd4tjT5lK_UFKC~>Pola z&^Yc50`R%7I?!zKF<38DrfZ8gp@4g9x7Sy}{mHX9G6#uI3MJC0DQl5YVm|g3zys&y zX;PruDLQcxXae+T%e``1A4-y;S?3r9v%j+(a~LaEQzEkRoTX znEc`v3;5L=AcpuDYd5>lu;>y*=a>kv%gI<%J?LW0{<9!9VFO-7ik7y1)J^Meqc3Q= zZ3zAl2o`1aJc<8Qt`s<7Ej@%1?-<8Dtk!eV)eKhAWpBye(hhHOM&D6)TX7KX^Aag- zg{XYV#@n+eSG<8}C$yvN5}jRxH(lt#EXJMt)-n_A8t4wg%%0U9Qd^;rp9$@Dz(E$b zf?D7yGz?`ZIt@iey7JXXinpL^nI;D7W4Py1O+u0XTmeKs&BO}@*A7C)-JS^hY$5>&dQo=Vx9?f zdF+ZV*)rim%yepCO^JKvka^;t#!8eIcCyQw;>k4)BnjuWBiQS9@1*3Efj9s&%;?xa z*O%Xj@hMA6NbuO`b}M$F7}AL(E64uFP4Z0|H$pvmHh=eX^fQi+K zuTBMZkm5A4%tywmTP7?NsZ0deZwQ1xAPF6VLYdAu==?R^l4_B^KR`xdV{clz&SH|* zg_cRd3JO7rXwG3NmOIe#Yv3n1l6A43PW@zpc~_pLX%pI%>&XSqj4I}+Xabvx19Az? z2oc4@`p~BIP1+Gz`Y=nAI=rbKAQy>X(G28j+gJcd!Hy@45eV!=3lV^bldtl%WvsHF z9PJNsjPBLTL0GHW;?XbC?D8b{^{kj&Y*4k8F7yF)XwDv}gtoP>P;4a}kO{{B!4JQ# z2N!XE&kWrKXKDFYyX&|s+ObVD%}YY_c943XQ+u0LZ$-@%TtO?21LU zyI6^MjLYRZ$*K?L5p|S>yv2V*2b5!WRs>K)k}=Y_y{?x}avn~C--)qrLyo`4fI)|l zE%|jIYAU?I?HYHQN^PaO`-HEeJ}`W-4F9XKHhqYjYyIFAH1j~+&|PC%Drf;-yVm(I zx_$5$uidME@Zj?ygM2!*)x)m0yna+2Cl(5Ch4zTp{HE(Nh5`&Oz)G<)@kPt|_K;ZW)s6L1Wf ziDjd7r;eca(r>``S%r$zR@&{qV>SNRKS>(V>8ZorSKO*OOR`N-q7J8!e1Peu5du_P zBTvN9F%qj*el^1yjwhU~#K0$SKDM1sr5|&a6U9WCCXvAlOmPgeaOx|!;6PxB!sn{|^rZQv z3o4N7P|IvNu1YVnLhe#e%LcOUSk}*~FNpJ&f0L8;j0*xC9USF|)#ICD$atymG@L-kF*pY_(we4sR9EIoO^%(D zk+E8Fhi7{;eQsR931Z~FT+?2{us$bPg?!=7bCBP9U^V<#8+XAkJ_Sb|{rt#H`WN!W zkNIeV_ zZhak&hvEE~q+1MzT79Htq<|@cY0!~-dkAQF7rGV-n7Bd<(N*AGNIjjGL+Ti1IyEem z-CA*uI4o$;b3cvj@l}8vhUi|@QAMvK11CXQDBgHM`1K~!cID-FKfK}KVw4THit|WB zE@hmU2YD0ebdJnDOuEWe?uT7{Q`2P}Ceds@o=LW}S;<(gkbvgaOjCv5PTbdNX5nP% zKPA@f7%|3eH2jQ?iAu4);N3{iGWp>0Waud#h0*LX)9|fvcDa0N@VB`-yUZo%khgpJ zW4LqIg63e&K5BztcZND49UiS*%_fi>XX}rRGIxisgi7+kiv#QkV^=1X+195vwqx_p z;V;K3?gG$`;TX2N+VcfwqC>y*AXKgnwcXl58i9_Q7&y7DRtJO~Ii;6;tJDr15!nZ! z?AmKYn3E&)c3PDva3?_RAZ*t9>5I0aF=&BgfnnMcEmR`*h^eO0q(G+>n77~2*bU&2 zle-(X_V9I&g1wTA#fq0r@cpGDYTsHd7pK(`LE;b=sn-!J-Hx|>B1(K{4>P ze$@OL<_TRzP0`A-Bg-8eV^Xx1fGBl>!ve~@gUl{$tflIwE`|~H)LTR$(^(pT+8(9L zOBFjes+A$LWT@mVxCZpS!Xp&NZ|S)&xKeEsxE@a2qP}0K8_Mj|+`#ZprPT%NmJPE~ zn&1oPSy_Pn+8c0jQikpp?QHrB)c)u+J-_hmS){b70jI@rvbekmlRt@GWS3@LCXShe z1f9hj2;SUgUDghh|C=Q)UueQLB z@$6(c2<`Qx&2iZ1X~l4c@1#+t6^)aL*$odJRjnkwxh4AuowZY}mJ7BJs?hnF-BnVD z4_EjqM+S|cxoTk;F|C;6v@2cl6R3|xb$*g(ub?;-FRPZJrDhR2&ilnxFtV%(RlZ5z zWoqkH5uVy62CFRlZd*=xm_q> zHrLJo)0RO?I9Ej34ic^ao4$?+eL*FT0am1S~2Ii(1v z8^?x_V3?GWT0ba?Ts%>7)pc~XF{??=Lr2mnpo?Ee;3lI0tfdxVTMdu8?W}w+>cTDt zwacn>EMYeeXc-sx9R!6!qC-ZURZ+%^m~m8xy-8E`kS<$#Tt5q`!E}G8U>dha6 zp)ALcHNOy6z|VR9z_s0*IaGcuF)$3j7{wBcBNsZ!6&9EAmUcJc_WT5;L{cU zTROA%#gQ6kaY={2^05hyZ6-cCPJU!&mcw^?#c_<0{{p{&n%&6kPrc;N#O`j#Cb}8` z>UT$7yFBJz+bT?<&{th>xH`S}!!PfoY8Fkm;82ONrWiFYr!{;^1O33hC_u8(imG@E z_+M1LI#25n7iSC(}l-n~VdKLZWIJZwr}DF)_YxcfJsZ4XLe@dBH0t)$TD&5x7Y#sZS11|dPl{`a#)epauye9h>9DT7J zG=1q&8`%qH&j)%6@mDaTj{3fX+m<6wCBM97R@x6mm%l-A2BXudR5lnwyowX-Np5f> zF)M)Op{y>w!PRNT^cHoCTxEdRGnJNl=EBzC(9o(qYmX18uLS}UP~Q!Z)IOr}Sy6@9 ziVAbhuV-c9k%uN-J?7#pba%#E^~&~UR?2aLr*eFmekTv#dauVDb`^*Z(cDFn1Q#$^ z4uoHs0@c3ENSMa{9C+a)rl;uU7lc_{qy;cx@)i8Dcik(l2p{47V@^Q?f*mGBeUh znS6$vtG*+*UE}I864EJKqdt1=y$Ls-i zr=_b>nQ@~3V4MAFSoeSw_~kZrDA!WNRWLAHsms%r>0E6uA%;Ky(c#(&K0&$T z{fF~Bd3Ur%-%Z-q<0_L0@$~Fks=F@2DyPG(c4*2x$6lh|A&}p&We}-SNMQ4EJCyZM zZlr;Fw@Ft!a3#UJ6qBjN^QiCGc48@T-ZddK5}zpR8T127ny;OvEp9_{_WRmyUR54$ zA|63C{{y4etTow-*5eI*JZo(pDKvmwvbaP@hhZSfAn-?!#wsHa1GxhV4~}xWx26U| zo4?TGpcgXb^|PmYVK|j=d96cn_nN89Ps&SzHR_{1DMU9;AqhPNJUsbwQ1jHxLxi~H zE9BC)8={-tX|-R0s0|Q}rDL;{7Y3gN!2By~X2-496Kf&U1_o7y9$&d6Rr|;{?U%wc zq+1P{RVx9Lj}Ak=X#I8_gpBUMAw=tg4>F1co7{PHK{G!tK_o^%e#Z#56tRbufhd|Q z&c+q8j<#&|mNpZ;_f`v8CSM0cO`rF%*>Sz@;(<{T@IVYcEv#SGQH}x0lFB=mp%$Btp9T*Th^=_Ip zIvzU~$byk=)o5t{ypHR<3xghAQDbersBk<*$yPF*$fiE!aO5=w;5-G15aJx8Ay9;; z36@$%Lr^Ot#${)7af>SME;KZ!Ts#sLkIOe`C4uBmi?mXE>FC8 zwyS-TXP#PbmFJN9;7QOnx(>Pf&db09kq>mL16yR2w4+1y3awv<=}}@064|C;OCqXh z8NLyT+E^Etd+T>^K1H^aRe5j3fgF0%6GtN#H23otJGFZW58SzNdFvc?F=~d+o5yJ`x5U223Z1%R~lLaOp=cCcs!&0yijC(p$)H~CgQjX+qnSpz4B9L#zukH8cbxea8aoUzDv`F z=g7UCpoL~LTQ=EQsW_5gE59+viFBbrAU(MlqXkRu1b z@RroBI_#X>GPtZK9>x6jV?b8#^rthAge=+e|8l-EGdm87@OQvv$keA}Gl-&;7v2m| zhuMhJ1?Y2nTqriVG1Ma z|Iq*9Ifd9cp4cJ$|MLIVccY4u90Qdb17_Kn25A_+Mx7w}mCqEoSGFWLYNgJ=;Nr;0;v=7XJf%O=oAJaO#Q)PO z>tloXx!RkW;2h*^-qw+D*9qX*vYS{3Vl`w7F{P=&I|%}rs!oXi2S?UaM253yL5{n! zh2Y2%x;Tx(VR%5ZbLHN)g>b<|Dy5iLd(UYf`vCaw>dMlJwF`DJQe1BZqm|7H2e`cM zKO)cWqDv83zZ(Iz#diAt9p^$Aaa__+q|BpFW%rq~_mcEqP?Xb%Cgaft8E9f1Q+I&Z~qxA$jFUkp`w){iPoT8 z7S#a>qdB}Rx4Oe7U$};r3qd<5+H7vP<12TT7{9^*@rFt$Hl0s9J=|bQkz1S zpc-!6nJ;E1g-y1W$3{)#t!o#Nd}rJhZ~Z^41Ve!u3<9oJ3N^A9<$%2N3}i86!tJ4L zgs9GFTY0{T0*?krBA$=>5(Q2%7*^BsOh6W$(g+M4Ko9q=?}nhY`r{Q(;6XjeIga<* zqoONaXS|;AU1;}vRQE=lnB}b`j@{I2bQ>(Xi--5Lr2Ca>cjNp!ZItoWxVi-^=UPBU z#9so|+2EmMqt+vgu?1|U5Q-!LT=WeqQE6;JDq_H2q;=zOfq&@9l8}+dshGeG_TUE! z2x4Zd;TuSWTTadM&s$JSRiGmtc%dBFGp3-{*nl*zzUq}~*z|hF@gomO>L?<$siCVA z$OQZz&^WSu@r6GHJOy~Q)3AqciYu3223{d#AiMz?Xh{-L)I)=;#krC~L@bDbEu<*U z#>bLkBrS-YEo3=w#MP2=L~Lz7NjpD|b0Q+$xfS&c9S;T0357-+X-j@1 z;QjcFk?dYKWb)Dq(XBepkZ7#G636Ls7=%LrfU%pTo+pt(`_oeEiKsW8b3#Scr{giB zy4*zq2a%j8;z25zs$6}BDn#SfVkBcey416@P21cIimfpj90q#~Zg$DTsM?SUd$8tOKNP%E+3V~TxlFlX9r z{K?*i@FhqwMK<+mYkIn?lR0#HM8yOxLxSlb5VM~a(H3CVCGYa4qGTEh35>?zMjT>M z>_|a6NjLZ|wS^nu%8>CYynl0%l(K_sD~+wr-Gx9ouOq-%Zoc3DlI3Vti;pOAa)g%@_iLH8f{z%@KKuUMNs^VHiig5|OJ=flHpl zE8-tU>{0Hst?tRi%joumIxv_TL75cf@X4e+Smei*-NNR|vbC{G-sjTagV>J~dSxVf zxWE8d_aI`%NbtmQvnl@|fLT$i^;i6=&JFPcc+i@JIal!wG2i=nVcr z?K0XW-iax|hN*pksO$+JCmcOYaxiu6oCQoJj}FYfotamElnJI|Sn_+2eYrqVpEf;Q zRsyvta`rmijr=g;);(<5%JAl<6v~R~Q%geQHA%V^qPglFRoS967ycgPe(un#gxHix zK+QjXkIi(y0FAVxHr*;%a%#6znf3+P3hheL?nVN!XJ3`Kc~!gGZrssRcGIof^&YV~ZHJq3E0>IeW(rR(m#U~yn-S&WjZo3IJ**vu|e zLS;vnTWg^fp>?^lOWJ>%FXYB+7lF+l^Ms_QRq+v0?SWWv5O=msZ#Io^$Z(Sm;7MVo z?&)j*)pj+6N^6?a?VbJg!E}Yv5_Idr{7_K{NoH@ ztx<)N5q?jjhZ1Z~aiVBw*x7l9gHF;d9bv8yjRZ>OOgF$+S~CFGtd7$3 zkYWn1s)|r&Xs^PhLt{I_hca0?LY=xHt%avv=x5=F}j(8FYZ&l>0ZeZv6 z0IEzXQU@iE750u34HmMuB16g1KAM8Ml2oC#BqHNnz7QS-MU`tJYJ4R+qHf-<(KT4f zMg0yzM~3sLVKNFgf(B2>L1XEf^Qdt}_H5yD)=#Q;bO5&?LL>9o;T?%KizvArg!-n9 zEZl6%wb>cF*}htX>Dm3&rVo-|$fP0XOt6U@r@ojq#~1PRAX3k@q>%U9bW}-%ZS}BT zsJ<5`PH>$R0ClEaT1JFU_zqSl(sv4yOu@qp1dToO^An#tPx;55uegDyrxgKkzp3OQ zOgRB9v5z%^cGQNhp3@SS&Oy+)6Tc+e_!u2r)U8seF@VnkQ<53S2E9e+DY$c6n|N>c z#X+~3w>2I-JF*A0%gY#6X;g*_{_dB$&D07a5`I~1?MA~sWusG-o&Ax{tp^-m`XpZ< zllF5rde6%_KjEChC?b};LwP1~q%Y_#)l@=4ArqJvI8qZwB+q@6(fVRg+;u=&H7;}$ zDJ>L+7-``RD9#j5+fX)%p2fS7TZwb0CORxyOv*+U#M_D&kip98}(s2e<{H z`G|QF7cR>kqASCa$f0X5;#{NB3>rfa+V@yJ6V@_JL1+m&9pxSJ`KJKbegWWu8w~YH zfR5p!fjG*y^5U^4RQNE_re`mGEu8j-s0DVjG`9m7QNaq>i02zR92rU={(XxtTS@bU zU6tcqH_La@_OR%2D{#lU1y;$Qr=tB4fKn!9WsEHj%O{@mMfTGdZ`jxypM4xpqIkfQ zgdlaW8gQ&sa&QG)C&T45OwOcPzB%6dw1F%rs!dJ+MBok7)W2}Uodlp161ALMDIc&se(;7caXJU<~ zp>M^<;kv%}?O!3uPB;79onf%Bi}0qK2;6q4*15Yi+XSaP0MgKucvwvL$BIwf2unU{ z*3S)inwdX)HqoF-B20wnJ%g;hY?X6|h?Qx995k~j7<0n({>}->iW4>nBU)F>7+ymx zW;&a{EQnl4!s1n`C1HhcwWI$|n4BWN)z&NVe;hG&jdk5J{~$gqvfmr43u5QpYFqm) zKQT>zr*BlnKMtR^%Wko0{2oq~_#e!*ayU*FuvN5W+BnIlKtjyI@no+zEhn;hO5MPh zvdWe4y4$qmYStQ>Jz9?+K8Tk3935QjJ{l`OpH!73p#F|3QOhhhBFtKaihEeeG%E{l zq7b#B8jv)}a2UwZR@(kbm0}j{RMy0DzK*MfLgS|859f9diRef&gdX zmX96sD&~Pt$^t{53$%A+=2c~#9;C!5R5II3Gv~Q9tUbCL1L7CGKvp5Y#>d3%s|aTJzv1{nWo8-@ZE;Bb(uOPZHOwM6u8 zSLH^VwPmeVq8_jPC*^RCr1j}Vnl8j0aT!$KX;X5z}Pm}2>=}qPgC~O1u^tGr$un*cMh_0%zr8t>u zgpwpkfXg1Rz--qglB-^Q$Ou`;Rna1qJKgmp0tUNtg;&Q%{i=7c?So=J4BO2PPd=k5 zw;!1)#MvXA-@~eE#`^4xc756fW&xK1YrF}SX^t0hB6~hI1kgKi+Oq)Mu-m{ZyK8m; zRxqmwEf1BdFk%_Z($^BBs+hUw?HuvQ_dS@`XIxD}TEvS^MMp-#FCpeGf%~hk#K8EQQgaa(v z*yyT*YoCvw^*KO<$-*sP88D4zf(z`73#b1O_DBzKMhNvSnTI<) zEJ-|d7O;+*!cYYp_Ob`oDrrit5HRZ0B>|ztZul_DRJ!!0W-KUo?Fe(l@m=asQiRUu zAu>CdZSrJ5Xbzh~0+GN0V{!8Z^d{yOb-#t|MHy|tUHN!Wf`K85UJj1}DL;4Y;|mEh>+cu}(L z{6B(&jfZeQC%Q|-PuM8}Wp1!+P7X$ua+^P=tb;bcWqg=1^u)yJ+i4Y%x51|$l?S+>apJoS%?WKh*A%t8Sw-3K z$H%s(lO#S-t>&3c!`@;tw$j@BvZq-MWiZ6T_%Oaje~rQaho9NzzCoc$G=mtqv+b%+ zJ)4XZPLp$zV?RrLBR;%={uKfvm9~wqJi(wmlfFfz@Pylo-40rFeb-#C+8?-PZnb%7 zqkbY)pWceBTLPVH=y!9bXKC41T?1-7hfH_rPTz)^1()7h>{if{Y9mFFHu`awliUBU zxFuw(9=px;F{(0)mPGH2_p3S8L)7bjMoyZ!Zrg-7rx{kg-6SYmOQ2oDRa0`!kXgR4 zvUkq18Zs7~ z2R;7T!QeaKc$mTG)1SK^d?)_%`!QZDh&r=ZZO4LW=-d+4SfEgwsrG>4mFA-XePJ-l zAc6KpaHwqaw+~QcV;e%Z*1O(7GWHxlWp8Y51!7zz^}o2pV$!6wL6}YI^iNV=Z8yzf z#0{?f+0eXjkyq!r^BMHFxVfHs(o%fM2aj)^q>qZXtBL(ZixWcpAB7v#m%Y;C7ojxV40|PPu5lSyM`N^^~Iq059*q)hXn;uPrmv#t|!?cGCG0JkKm=vWR(l-`I0k4Eu+RuwdMDD4iqCJH3N>$cLbjTeNn#EH(O0nJ3@HUqA0!NE}Ov4tU>+rdZc#p zvy#lB<$eKsZAkHt7xpdpVh7G(H#{n#w-qaDg9Mb{ zdq^ju*qCaxiT&D$jb?d6e!~&1qhIV;3*)$pZ5b4Av*z1C76q0}gCScKsT;?|?vC=z zVDVO~VUlVo+MS2^OfQ>Vl$`erz7YMb-V((f`~6XbZ~fsog8-d9`ln;W$N%^(V66_g z|61EAgk8ZX~ttK6aX(j^~*h1}x1}ETaSu@cI&mN99teu}#zg{T? z^IH3gO9Hl*Ji)Bp&vy%-vEpz@GCjOp6VDx_36=-4g#a_Bub^Pe+yKt|)=>FVG`_z9e&6DIg$vO$QH`5v@mAs9FL) zQXAm`Rcd$?QR-5RQ3S%{@c;=jMi zc|``E36A8JEvJ*cr<1AR=NIB z19?E!d(qRIlZi8eSJf{cYDr=cYfQnbx+HQ;Zo3^i<=rFYwdKVy5wp}OUBR=(DML*j zMeQB@;yf-9{rTUnqyDc3I;yS*sAZz!>{Mw*QL!#b6~H{jff$@j@N zdEV|O5dn+!DXm7YO{#CD{v;<`&pc0?Q$ccRL~_O4Q&H?O%Z}fsCK!{#AB;xXZ{NOr z{mvuu8ADQ3lw~h|lgKwG9+3=l4F>^Nxp8Og);}$z~m}lrLSD!xX(nf z+4pW=p}1vbeRoQJ#Tu)NRg~1{jlxv93Y60*E!7uM31!o2Fc|rxwWP3&uu&~CRP>#a zhCC_eLUCW4oe`%hn}nW8op;AXdi>NwL|5$hf4|DqID^^Cw*AGNw^-kyv+&5(> z_KV)2&LqLD3XQ%~_f*OzRESuzf73aZ1Ha4} zevDCMb1KKvT$f%OYYsto0v*!t+UH29JdAi!A{hK6N!tp{2w6kPqP{0%Q&~X-Vg0Fg z92dP#l+lfasGwRKb&X&_0wuMslqA{WVQlX|3ol1DbTgF7=GKsd(J8nmiweLAPy``f znRe8b_;6l#bx66WVrN7I*T zCizLik(v^_T``qPTD*ijz1a$JiGhDD23Et~4o^`a7Tdq12s#r07>J znKHJ#ekwkuMyf`&fv34wT{HBE`vsM_z4bzcdHsLqy@p5R1=bGnjAh9v@EgPd&X`Wo zLv?oMH7xri3ST}m9wcY>u97yZ%bIkec8~9#@RFL9KeSU#i&92;?WDt2s`*1Xt1h|e zme)!~Vm@4a{gdj6OzXDrRdBzggM(amfY)tCE!XI{qqO70iKcH&`#6R!IS&AI!I?x2 z;lY4N*2lS}`a$K^&8glXuiJ{*?y(8i(@C67w$bgG?O`D+ht;OH^rS1KYYoI_46dcU zZ?qfjLC`6}7g7)~Bfe6bZoMT;VEf#<$nR_i*Pmn*&atz`X>?tEkb@99UxYCWQIzG z)DS-Ah6lz)sf{$-%v_^cyQNOzm`>Jq^m3s8-^Ru<^;-oK!1X{yk>B=L?aURHW(ui4 z(G1the%pyN6Ml}RZBurP>;pFk`6R{=X{Hk{jpuEp8uyBf50PO}78#m_*Lx+>ET@`P z8wjs>uS8v({4J^Z8(F3UjEo49Kr@^;;tx}XQ>XA{w*$nY|GwWG9Yiyd{;|!^p^>DK zCPj*{q^WmjdVy;x2DuvIk(E@yMDdn14(^)0HW~>Z$N{mC0u?jxF~zYShG;P*U0|w| zOB%B~Te(H$uqv5J0QvSg$I7@2o>O1Nma_IjJT$$vMD5X0N=jSDiDPUUthhA%yDS&# zETn8(94z|5_Y7H>_p`jxAJVucM;~G`vBr7h$MEVQYrJ(?;Ak`$6vS(<+H##W2v*#* z<-1pmwXla2Cddx0!zsf*;5qE(#b!M&<~1kj{(lGT;%jaMGK>>;0*+4oJ3Vo<`mMeI z7iFhzr|=d068#It!f=On9p{A~1nAIV;Uuuj2@pv{27!Zdr3@e|ON~a8Z>j)dy>^(nof{jW?*7uM|NLOI=;YhM9N~nL>ZNsHl+@ z+@!7Pn#57<6fpDk$#SekD?Z`Qj9_@t6;^ICwmI#y-8KaAm3qEnW%<8dA&oeb#xKVG zisCc@ldkx2MO}!2!^juyz(dr|`$k;$tQ&BfLDOY=Inpyq$8t1LNybfesA@tShsK{Y zBh-r#T3eLq?x);q&8W);>q9r%>~L&P6HIe%Z>-%^twH#k&$ERhNULE^Uy`OIE9cZG z)5?muU>prcVEWY$a|`3^ZN!laA7@&T52bkE1*0%Mh+nlWS-PvknKf2Kp!v!#^8>G8m%&<#x*+CN?4~LD!h*)kbt1JR z3=w27!-<1JNQ@qmsu=V(vxHmxX&4oNcBL=O0gn!DwpiX_1ea~m!w|_j``6}G=SekI zF8n`PX1i*b@6L{Nr2WhNj2+uZoky$MBc(@f9y7+54_(A6{?!(+dcptRtEn${ z@)uPO#16%YFrs#ms5M$n|1Z2?4W@sS-v!ZDW)qEhS9o6y4_h-GN=Wo-o7dSqD#Gbz z#$%#QJTonLcvJ)x`WUmF0JE+-7$dNhF;B=D=bM$|`ImDMbbJXS(q_7z_i6F=C*?O@ zur7u_prds{`8RYCnEZ8I%)>>dk&~2SqEizRu_U2Z#S=<98pm48=Aban(W8}V1 zk>oRl5uCtd<{sTPiy{nUXX#tjNspcrx#%Z-s!=jRSHqm6D1Tc75YFKNDmo|)m?4Bz z&_?+by(D-dQpj@3OH7DqHg1%ZgUO2E=vzI~S2&+6AFqou<@c^CW+_>WjR`3-+Vm29 zhDA&9ahT>4oxt=9jx>_;NzJo39wU|jI5A_j8SD-ILjdGV&3!H^oI>7Ru{X@7erbf)Bo!(HkNKp09!u0?hgYqJJ2(8( zgRA*sud?i#i`-JSJ0+`Td%&u{1P^UY0+u6;H`7YDJr*R^9%U@dWrK^K#@4CL5oepZI%Nm7O5NGlUi1 z8&~E#7ZB>`8y?rAP#K`WT;+#Zy9p{pX`12q3h!6M{2T|~JyC+^LOvhSfKd`{>VNGP z#H50wZkT6b1xOu=O^YTFAHn+)oq$)Z{yiMw8Gdw0)50{rV(}5)2nA>d&+uf?U5wdm zW=Jw5Tc9~Aq=pJ3w&q|oL*+4U@Jfl3c9?`DZI}LafPuC^I;6x~lxDk8S^ouL{^%G328{%1kPV&s!*NPPA+==J5}m+?Ex2 z#kV>n$9rQFF zAu+P^x-6OsWz}3rWL=S62PSqTYWu(yVjlwLC?k7qV(j^5Q5@aTcfNR_wjMI|;pO?l ztiK!bIQM?(;`Ng4j>7O=p9J;i%vWWXozgs@ck4aa?_TGq$ohAA-k4KX`!UK99t(NRmZ)zc|1dZha*3;@c&P?8Go`1eOWKLDag!Y3)=;h;0o4x0dOsO`ctNFSJ7*orqPf(C+5QL+aKWNGv=JJ=oc+w;ppiHX@&aoSK`_Hs)Z{; z5T4P<4|`*qmY0HR|OQO>M6mH+;evS!NQ+c^arDomAUUXjIH zfT312t&kA#Oi^FPU%BWmY>{{u@YsuRNCziXA&h&&MHZ=n^#x#%%df3EdxBM*Jn?_n zGtOBd*?!oGzho13`gbST*%^Gt^?@Y0B^uc%myJ@d+WWV8R2`;lH_FhvpAFdjwPm^h z2JU|Gl_jvVMK_OqexKjBOQq4>g28D4f)!?|t93!1aPGk#W5au)hZa-CM5@o!_!|Yy zi{kgNL0vW-){TzL6Tu%}8Qo73BTyE^u*_TXoOM`T~?j#pP1 zp8FD#mk%8pSL{_IA})=yzUwVt+UT?1H7e&-gQY*01bmWId6z zEB}Huz4!Tvo@^yLJ#w2Wu#yb@Q6r<>WI0u1j@t@T$5?~D)Ar{cj-aJVW{LRHUxj8D zcO(?dRu9EniY&Porhg|~3|#@A^u*@#5>X6EaN~*OCDyz+U84G=96A}Uqo+44msr0N zoEBNUE)I<{^Pkav#@PzKQ+o$b*pkE8Q6ZN8%{8V=QzkOrqij3dW=Z)F+?%p3?%ZVw9>4JdZ;XG3I+lR+Y zW!Dzz+Clf%ws8eAOo0p=xNCR+0q~d9h?)~Z4BwN9Z2?{s{ztFu&1ffnNcfrX062&R z-%M_Dzyb5Yy_q`7(Pyzs%sH;ey{)%!9fdnoZ}MnMlKR+oc?bD;vuk&wM+v6@>VdIx z-yJnr?NND^>_CMmJnz~ms13e8pESJTd8D<|RQYh z)o$M|{*aFM{zD1k^F4nzp{D5VES^{OGARDNPNFy%Jg0S5C1v_9yX$R3FV839 zzgkOb(KHq;eZ;XEmF2Ytn*wshiZhsmdAkbu7J9^MaRs}6i#IUMdu+`)iT{Vh8~1&t z)aP?wsdmaosK07-7j%e(3uF@qfWogi8aEGA$>+JoIl5{Th#TXI#ZW`jgP8dC# ze!O-*BCF3(m->7&fuF?797ump?jL*;U%naC82VBBD;M~^+M$KOMmP4kX4I*3I&CyC zRBTVS3}=R7qq3!2k38F&X&I89hn>fJ@!w&kDxA??;RIOfP5yiEcxC9UF!>fV1^!!I zzO9JI0rS?iz3K7Tt<}j(#I!Q@5|W7!Wlj`1BI7(?19)|2Bj|oxF^DSQ@HXuyGb=zd zjtf`sbv1%8N(!*C*D2)aN*x0e;tUPYcW^&*=;UhD_@FNtC&I>Yk`+}PV|6v04?ylH z3CgO|NqoI2`kC3c5l7YVpf3>+i~~xebWY$7Qx78^`|hWFuA_;Yha>pzWUj7gi#cHw zcs?^rXpVVkk}$@(OyFR?{RbIW?&=~Zc8o3DsKB3g zl~vTzg@_0gxX93^c90qRvr;2Kb- zi#v@oafne&;Zpz@qQ|fX5{)mkHmdS3|61pS+iLRYm@$+-p$F#QT7R=VB(a{M+_J3w z_s#R>qO-n&h^vtaZnm=Dng-Y5%>`8@fyd^y58(8TGYmRdgK7;Ep7_{oX|r>Bed={Z z=YlvgOe2E$U|q>no( zEoNVuTM)D2dVyT9jP!XJjyqU)`7)*1O&E99zL#n){p43J!WAK&go z6k6-~1IWba&VxJ3MC?ye*0sgI0K2O9+w)@pxt78gOYe-UEO5heI4-Oke_eXv8;9Lm zJLpqsfv>{J=Q<~K!DV<=@$fOytJ|S zxb_;vGh+41xm<%*Mwr2*tvzi;O{ozF3el$8?#RZ%Sr)|-Z5w)??gk3>5*^yr z5O;=pABYs7Fq+{Mlchemisq?_BC$xxmxFK2=&VIdWid@g6j3bG;DV1ww>UU*N>Pnh zU!zcF1GCKU5Fc4NR_8It$#K&t{2HZReT|aIIiFmRPZtN6`T* z$;&XRkAEZx?6iE1Hzm=Iq`{ga|Sv17|w+?~C;m*_cIoV@KgP`k(UN0GmH4LRF+#cj~Hy$xdt z*W~S^<)czkOXdjLa~Y1{f~?zylyYgAqpv5w(IfbA#&B%P%^~OdEoWVitsHoMN6oI3 zy&co=o~23M5>TpmeCGF##h=^d4!qIPAM%B{3JVRv(nOWhU?(L`aT(5PkRbMqI(A`q zF~y(a{RP^QsO7@kx_iTg8U|$rmV>i7X-Xls9>|(grgetW=N(E3WD6-dKVLM&QQH*O ze^n}QRG$XPhQX@PFOPj5;OKUDeKbCFy7D}EbY4*Eap9*2&GdiNsYE>e<9|`*0<{3R zq2)ObMY2JV$a5-NQ zR>~`qB(BYk=oLGUhyGFT$^As!oL{d^H0kXj@y7bt@b3-Mt=$y=K>AF>S>dx!+qY2^h3Ksf4LxEUd%`nWpPH zeui#EpO9f<4pD-yoNx)r6v#x!0SYXiyL^(2e4vAF`mH51$lUv2P#i?%{qul#TxB7$ ziQ^-FSY~IKv22X^k6*N8sk@;>p_kG03R8oH(^+ZYR>>nXain1{T{*Osre zecWKFT+fm>3zv(n0aVDuw^FaRLE$9chT+j9M!o(-zCOnGYh!2x*>dLJ!)Gmq6N% zw&cr0p4pqR^Hk}YgUsp;rSw>h=q7AA)hzUoYs(<+K|@t zGOfA14Jpm(W&uE(qPeOmD785)+hB#tUW_R^cUCGncP{4OUwegA48P^A1vMp6g;9}( z(IuZm7e^KqMwUc>(m@#`i+1qq$FwA}urR75N~55lRSAiT5Qd_W@w(O-C*UyDVld$) zCZRIOS!^K%FD!wiEiG>TDaaHYJb)tck}yfdsFQ>p`W&jnBA2^2d5g2UyR*b_5EQkO zmu}Ft4Wy;;kvd|;4eM6^+ChkM>W(Klucl>x9spa@6YsdybeNvfIn5Y>>!ezI4;JE% zhmV4GaDLw`Gk34tz}9~Gk4L;r7LskL$PCHx0AGo#~J5pjpOh!Wv+nkg4WnZG>&CA`aKT5 zfSZr-ghd5ZGg&1=#r$S>p+FgB=sq8+xzNKCa*+(KkbhbfJ&wi4^0#YQhvrH`j5!;K z$+{5SI35)n14dZ`2w>!EZIw;h!7v~=LV=O(&h@e~U}S+)g+L)=*j0*Ozy%=(1GT|= z?Jk?zS@q0;i$E>+7HK@kzcBS0v^qv+kr}=#Z_*lu=J1EWNDGAd)o%;U?^qsMzb9Od zmWy0rxlovHiap?R)Y4`2e7-gLt?TVi zE~)EW65t;Y0?kEgG7@!Vy0ju9c*6S2p2lE$L#cn5c`NdH3QoY8vj04bji=+f6VvN6 z6@~Z9B5BP>jw%7-={=~G4L?I0JT>Yb9lhxr`ZwjJ=@z}~z^j@o6|s2&k2BSQvtUfC zTL{~QnAZ}uHlfZijWP?p`|rT;d`%;(C~G(WtQ(y^0gGf2Y~{ON)n42ri|mLkmjt*G zR;QTFw#;#&{u?L!>~TAx)mhD}*>+JV}-bXrxVzm8eOtcrMwOZlxIc-LyA zWR0zl^+dftz)PD z192aFg_eaDNpB)Vkeyi&->N0?oou3xAK)%S+lnhdnIuTkP@f>TvdM=DSgJfB02{(k zUG&1?(}9zQ^I2CYp|T)8Pw=YhaB-l2!@dr~j;T-fG8r>3f-!L+p;8eBbW|nP#APd5Dpstv_tMk$U4b^!I*~as6Wg<^`+C^>52wsp##{G-SIklf z)@zJUz0n66ZhaoNvjao-DZ>tY?t)&Nsa~<7QkmDkc73R@C}gUgkPz#DKhFpP5DpXfR-nw9#z8?+pF$5IF>hI`UZbl67|; z#@{MlIQHzAwZhO3<#p=B&l^++K8_w2(Fw3FqK(S?Ub(QaW^&>fle|=I?3E8H4_W$K z>d&7_Dg1}j&SB#Uib~5EVaLKyMOZF;;Df_*pw;N!``#<3EH%;J$g7LSPJ?h?4#uBk=v*CZPJp>PKm** zB*_OpI&IK=p$+7w9GuE|6nbMHxR2;-UPQ$?Z&TjZd0bxVFSx+UjvqgM-S#VyOR~`1 z6+nZ()X-@Mft~70SPRc1jH6fWJGc9&zTi>Y^9#}OK~bjTCzke(x(S#G*fL?mDtty#@$U#o7@$u(vY7l zpuM5#vYr#(L~vgpIG0I)U2NX-I^L~6tsa9}Y((?YImA!5drrfg+v>o>F< zcnRxB(>!WTX;ufZR5de=6S_rkO92;7KoQfMX{)J@i;bvte8Wux0*+9{3^d|B<*0Me z-8t>{M<5k1YlSY=(QnJYw9J7m9Y#i}bOyykMBWd>lIgee&p)M-bPRACM81%wHGacp zXQh%c1TR;biZy(rB%SLR5-Fm?H_4k&({H9PpKfS%BQe+q5^t4p! z?m@`o6|}*q1Y2)gt%G$A%XWSUq1>6UC@l;LX&oU*OAA6orvAjfQpx)D<8Zv&3X_j0 ze;kORxZ>0V@f8wjt3-;lydNd-L;dw zq{yMo78FuY53ldA1*IUR zsf`aJ57s4q7Zy=lPv!DtlAb%C>GXud&~s|4)p2Zwn|GcCtQh^+kU)P$clB6Opd^(@ zMy_~}fM!Fu31!Tm#-JIRXmTLh02#>QF9oO`1v)nPf~ix)xC~?v6YqP9%^4s?L94=K zweI<@vhgSsV^IJvm|;Z1;MQ8rR@AvI2!X} zo`?`JGsw1{;1ywUvkPiuv>yH?-^D;iT&Wq zn(_929crS*MU25SaSvR2=!a*WtHfdUKc?aABlc26=` zzcVKPBy62;DA2=tENf%MJV!FeupuDU73C+#To#b4e+dvTuqeZg9ejd;5U$)mS)$C5vK79DVN?HT0H+$B?MkE- z^xlcL^}$-%%4=1FLZ+1+`dc2B_lr%N*G2FoZO6H?!IoS*MBSXBa)si=g+Pm%)d7NMNggg=A@Ml zU$bV>eZ19y#@C}ovcpR2gabU~n@mPR=FeYAN0iFXl4O_k_Nu+Xl~2Dpw5{&_>lgqO z?A;YIz2zi~h0>C$3*K%zT#G1YzxOSK#=h`^92)+r^F{JKXPKoy`o}7bgYylJZFHmY zsOZt;eS`X&36l<9vlOCp;FgwmgZ{0e2pB%V+PH}%@^G@)#^vXm}PGY z9{#5vlz=-P?843xMMMBV${@;b$==d*MCUGiO6^e0@)K-1l@UM{KP10z28_A?fI z>2Y&%{aFjtxI~{#Mj3(6aJ1I1_L8PvSnE4Uqx3e*Xb9XFj_YCK>$3?4QF77O7^gHj z>9d5`#t!I14SJk5dx(c(lni|FYet)q1=6j{F9Y$jbNg-byA^wOa8oIDV-LZc3!;C# z3-jr}3lvTxabaP6oJ>wgc;+w@Uk-sunL+*i3l0k`=#`NT-n{NF#O+QNc=IvG#`x&W z)@(ihY^X_YG2~t14xH#Sz8?)d-qMGATGB*QO_sa8@`C~6eGh$n$sf-|NV#@?AlZ~qx=wq6G}KfzAlRV~MDYnG&E?o*TVXXs zzj_fFNIrKt^w7{t#1)L8i6MbwS6>9I*+=dGH`(Uz^uD}mZ&|*&gf{rjo^T&!WtXp3 z-XKqCTP?PXZ<*cgMV_SiJ!+kHBDR!Jv(xTp9Bq$U?R1RkX7EPK;XHt-;02%~3aB^i zBdMnPq_%~5(1-y>sG9#|#J zwBC2=qwbc2AD!me^XDo~7K6qlX}#ZoyVG}2_{u|-);5>gc-t&j1#$m*o~K)>770HV6Tj<1hvQlv?RaY^s<8;s7_vbZR;t zqX$Cyp_~_5w*OiC^N5}cHCY}hK^Kw@&0^`_56md%Ej1r27%X)g@p0gY1H*GyD0yD? zDrz2%UlcD+l?qD)qrtQk56^bH;Mxu+6tnDo#ccVl)Gs5NGEm&*=&j`~lZ5-dxYTE5 zA(;BDg+5eEZx?jd-b=BpjUr`5NXn-SZjZPxqAeo|Z2El{{5YBIeB(C}PTk*KB zHKb*X2F+8PsSr4jPb?0o%let}XAXZT4Ly9&a$xZ5toAjBJs_&?uZAv29E~SS&bX-z z;6XT=pK27UEJf<{sRk8_nKE=pCT`9dsq@S zVb}9~yHIkqX$fd{kJLc3wo*4DN6@vhCmWBZX3;gBZ>Hk@ia>QWjX)O+VBmhp>Ub5bJM#d-{(-zTO6wvt$IeEtA%oOsqTwk0xXy9n&K_7)g4q)13jJ63$ z`7DYuE0*)!Zv$astFJ3&sq_&aFnReDUZ-c43K;DAvOVG3}&XMy@y&eK!PxW-kP zfb{U|>cHfeZQq6Yx(@o~gU=YzSZ(l0WCX^D5opS0mcu1p7)s)oLEm!1f2ZAjgnmiT zC!Zwv@5GB9=Vy@lWQQY=dEh2`?5Q=8I>i$A)IYIc<*6%2J6cQqs{}7~Gov!8ltLD8 zPCGx}QJqnRM+xHVdYmwOsqBnJWRe*p)JE_iE}fkTO>P?0pi_m>@(muuVl8T;ys*f zj(_S1O;+j{>}6O*Utca(hEc?fHo@GddLm6`zLpa>Zx(|2IK1kQGPCsE;3Vt<-j8a- zou>q=a9rP;azZ+GGYlTAmdP-oMEkfPsUfNKj{qfevE)hvDnBZL8o9uOs1cLZ(l%+_ zS}38`OI41NV(R1tRwPIk(On*<*g^@bQZQ0fS_6(8I}PXCT7xA$8t@SQ!v>+O_k9I?X%0a#)D;R;&8CWWwd6S#sg>^`xTZP8($IO0W010$FC_Lh}x+ z>L4riyy~3s6jp7}wI3@*jKHDcDVD%f_?iAoSe8J51eS^I)WVtMhD5;Z# z+&ZPE$-w`jAuyFiE1C;|-B#~zoLZ*JxXZk$E*$!uk+=_zkw3iHYcqFTDk*4#fbo2G@UH%PWh%Q`<9B*do=AGtW%7uzLOC?ZoqH% z>VJB3q9*UdT+5@7zAt6tF`zFbV{`#4B{A}}d$dG!Ax3TXKW#tRPt9rU=GGUX)xmh? z-AOh?Nh1jqSayFHZ@0}#TwGmcQ&m^ZJSBUpKW*mA~Cn>t0^}St%%zphGSJfU2ScV#_HcG1rY@F9u4NsKKZ) zy2Wk6{w$hA9g3?z5ucUiGpWh=YGq411Q87eCSS_s5TE#yw!x?5Ip@5%iL!d!Clm{X znd}l`NgS$3C=&aue#_A=g`$x^Z4yExWXL#UmLVY?$0gKGBpT&pT*DKu0~*n<7pF4Q z#A>6!osd%z)1;rS_jFHh95V=S1E%3RzBcPO*CuQ-7s*X!Y6ta2ohB$`8nNZ|XAZb8 zH?eQlnrM8%v={B?%sASJ#w+tu-qAuXXKKed`Z|U)i7n)}&RxFr!|7*Gpy#T+uL0NI zr|O_Lb*xE$m?b#~X-@XlMzFPl%!LMAGNC7YIKdw!A)kE*s-BeWqrwU05%@{&fti8` zaGALdSDW9p;bEZPhnK1gWvBsTNd;Mzrw`}bx4rR(TR4B`Or=qCcjS<7nP7&^9FLcx z(J(d26p{lMz!&J-O-obC7O!uZ3=l*RnFTjb5W#fXVvr{BX!NMZe>mqRWQE@RHlBin zSP2y38)>+{hZHo9?<bJsVJU}l-T9rF0_&a*8BEJRyJ zBM8exl-YZ4!MO?5U5Q+Ol#hBh>L_@^hf5EuMF-GErtvP~kE4beMvrqFBN{wC=Rr<8 zXrfN9{h0=7By!(B!=}z%(K9^e^=D-C0}`;&2C;kUUg&vrZ4RK^v~#a<28+-tCfdnv zo(quff+nAp%PE|yOZEA1-+eo&ZR2ZFs6wON}4T>^nN8p0?M8UBY5QB6l1k%CMb6}kP| zT7%}ORddSYL91ZMqKjJ<_RUI#5Z(9>s<=e*8zu7@nw zd2H8PcA1*%vIIG1*-6k~J9IjfUAhdNT$seqvO2gkBxoLY6vO9(6nYKX=AuhebKsWo zd&|is8{bC*KVvm$0YamyGk#$Czzhg7z#*#v<3X_q7-v>XIv_=BfJK+WY13F!EeNP3 z^(lk0NuUH&?Mw|pT1@?h>}19q1WiJ#fet|H$~}jR$vm7~M&d}T6bg{|B*7kmYMl## zR;%15c}p0govoW;!{2|kiSoBcC-1m2tW^#QIH&t@s~Q6SQO zNXU5qzhfDnq~H)v>8ySL$$}Ft#rMM_ARy2EPOaI#y{|8Ug9~)u2-86SjN{DaKkqnS zRbANI_bn@5aGY6KnCwD%nJ^Fhi>%^#XJ=J)M+a#f&BtIpL#R1gBiDPqAi`8T)!Wr?w)gtR)!}g@Y?G1pasAP465_k#oY!cuEgp=f_@IZDaQ4J_7 z3e|h1lH$Mhd5lHJXOkFGu09$6N?wzVl}*nU>wV3bKpDmkBBERK3dZeeYO~jrWVL{- zwB4^kH;;cmx|mXM7?#ABRKm+jZJEFB(%!s0C87+t<9Gd)li9QktX9Q`FHd0ldPnBV z)ry+}1(takr~p1D0wq~>lE>J3l-X)Aw^;eLaN=ocwcKqMft8Q*fz;z|kYN*~ zA!{1a&ftlC(3tc@lkJe{PhVVNGDY-*s{-7b#k*0gc_ni~ItGq$@nen?4z-JtAJK-zh_T5t>-2h=H3~wcUyj9XwMsbVs1GL5sdM0n) zoUOHYh#LPfs`8Pe-YtNqG!^qov|zmY=%)}C3HdF?%#4iPsk`x&;?~#A(Va+)n0Cjn zPEl2ZhQ>ajg8>|9!42uyb9D#%LD#j$XrJok8z_6(1-i|8+r0@+_x;-x5Uj;Kp=MOt zTSWy4dSw_xKn_L7qI$9u(MALxn|pymPtGJXPuKgh@r~45v945OJ^e3ikx=i>4Ob?Z zl{8x7`_Qp{W}$vsl?Z`d=neU`F(7ad3&|`y8OKmGRfB-F#7iLC{OwTo1^_0hAVu3s zAvu5#J+t`7OO;Z67H~Tnq!OOr-6Ga7UL5dz`+Or46fj)YJO3I6Cy|R1-OxI&!~6_d z$UqYEeP0&~3?;(HWM(5#;}a1LWp8my3PKV>yo;!0jiJOT{C4OuG)zO4@Nqcd(`h%{ z#!w90pOOg8;;MP6T#jhq)^&ZlTf2rF((Jfdf7honDoo!CURaVL6~^llIoo!YJaKpQ zs4LR)oPsa&E(AOAq=io+`HK3BqJn!DGjAL!{Pgiq%*o21y<4U&b1t#c@!vOVSwRB= zG`84#O{>0jjd!Tj_rw)R|8KFyVcC8cfB7Set{8J-L_4Qzw2jE4Vs)-0zw2haIPinN z_NPUz1QN0Jf-r7YsISBJsl7Z)@e=V&PkzLC6|_Ryf-UP5bb(*9;xrHQ^F3mD!*v;{ z@g$K@5yWz|>F$2aabeG}<7wxqY74gr*N6X&rOhf#nIoKJRs8e#f$z>b&{*eMp6?XU zkEmQ3Ws}l0OI4auN@iycffP-W1XuEj;?Uv^o`M?FEA=kHSAhm|pc8c4!#kDb0RW_Z zqB&e=4}}haF*ffOnRMvjPl{#s6gZGYw1AN`nidB;{#EU$YbD3vpWu}ed9!~KfDfn! zs%VB;SMJw$wZ@^7V5ES8CiIW5${QZ#r=Pyy{CB?_ZdFJ7JN%9J=fBdL>V66kToh!l zY`~EHLv{=UrrEBOd?H2SIOSJ6Pzu5%kd2C1TGe8Ty0Y31d{p9%~Lw_&>^oNq18fxkR%ZeA`RQdR*4Sh?V0VMICAu@U_gL2@P*uno-n>E>m&Tl#R#!7Wgj+yDQj893b|M%SBH+0$usZ4HfnFAf0{9O;$V7s&}>noUD12afGf>2QXVUWZ% z)lJ@BG>Hnl1=@BMMu`0ZlC5a5e6k!5{E5XMY^jv~s_3yd>%%FmNVVpk26puXhxT*X zZgs;ti`vcZW5I3Hzr1GJU*P3gXnCF8T=XVjG{YQI@5uo zdaZ_3oW|}BVT$Io4El}2P4j2mtjYKL-(RqG_ZHY7wkBh0L=@yvN{nc3U+Z{5blADo zPq-m4g%ja*U!BHhrR|1oyY3PaZKXDr?dUOVyF1hc&W^w*$)PFkkezb6K2`7AQI+qk zs<|Ls70U_*(p`rJ1HVLJubpI*xnfBBe@t;=Q=3o7SspI_(AgwBVRAZO#EkrJ@gf_a zu(--u-dp%;Th;Ho3DBmY?LK|qPR2M?cqTZ22narN>x}NZ{bX=ki4lvronO6V5s4&Y z9z=C6{z?8WI_S*Sqx03M73Hr|I<;Do>{0J%r&zSy{fg`rcVquoU*7P^^||q7*BRZN z?-*WHX>(oG0V+<+#mq$UWn1bEvA9C@Ng|AWh$MMO^J~mlmK-s^D+y;ED z&Mp&)5F1#9cYpu=?qgOHgw&}dQ4w#2Kn0xohCRa`?H8vhRHNp00|pJQ0fQWI(e~NG z{f~SLqm`YebEKMjKc7_3PrhM&n)a_3H-{Q2#MEHoj)?Q#&ygb1>>n4KzAMJ8ElA!~)Bm zTQ-~#Gnk}u%o<=AIlO6wNLtVJVHgc5Hcly(9tf=j9EHR<8r{B(299)a>2*J@f}t@A z#78Wq=IfPuT20XygN8)3q5!lKPC3q(mTFoJF~>IIwJOxfXQva5M=$}}VDT5jPh}dK z0`M5aJ;$b)sit~8`Pspk+>q|XqO=+rQIS%+y4_b~=>33;uozJ}M-PY?#w^e2tIO1+ zpge77Ci1=Y!1UT_nY9%68No37io2eDMc{R_`^RO>2(sf~E{T%45{R@9u}^W=h%(kU zKKk?5xE}DRDi0&_Sx~;<(mG(290@2QS=;VSzn$GF1=JW4ogDD<;)Hp@A6E_zN~J~v z$6F!|U@QQ=p*?B#Dh|N$HX5YC4Fl?d0T6=>NX-EBgGX+lmUz@(F3~IHItGw3Fc^^= zI7Y1>C5Vj8faz$}3i()o_6Impr*2b#Dc~QTaHQ=+Od4`1tw})*&4=TRFE@iBBR8up zoWWnvKD&PWn8ac^H909B87ZIKb@7*9Do7YLkN=^j;@gIcyC%zVRK=5%r!0QL;~0%Y z9Vyq+Lv^18lsIIfge$TrFRCo|1YCTFpQ5!Q#FaTnF&We~10fQ|h0t8NlyYdTEb}-t z*l90Lb|u;WoyX@~76)%!x?m}LnEmd`HQHBT*}alX&ID^K z)>tZxkLkbW(6XbX6O!edY-qU+`s8oi*U9vYQxL%#gf&BjtIUD_uKe&S*LSFKwP%2{ z^S+8GMR_g`EahK9rId{Vs|rUOv!>c0tUM4o0v&qa*kOf>@GCdF3z zA26Lb(dyvT-f6)@gprlXtI5;0HsO!K;}v=_?eE3GgG|sPwJ=-wFhamTl0G$oVgKPU zE{n&=)~(EkAVeT(&NG{F{CssO*wt(SZA_Z96(FL(JP!q7wQQKBuB$V@q?L-Gg5S+7 zGffA3c)cQ}3M((qt^vrS#|n>37{$*GDM9eG&>4C*@8!({01-g$zfZFD?tNabJRM_0 z=V@RN0s-LJy33bY5Hj+Mm}-fYC&$QV@=?$%kYXlHw65tZ_2yF+xU%opFEH6UT~+PM z+i*7a%eHR|1pWPMe7f?P)f&P}D07inD6^B_h zFp1L*__oan>nis#@;A;`2(0wO$j3Zw0d~gdsx1^9*Kg?q0o@)?tx1|Jz-xy5EM58A z<7^0E%phXoK3rY=hKV>zz&&tud%b?pOPsW62VXBR*R&~cnXOpIRM>>MC|B&AdZ6*X zI%hU&6EYRWI+{&^x77&DeEs(20Har?kn!3noyA%96GkKE%PImSt?XDPZ2KZNs!{^Q zJ$3mtm#E=!*lMvU9-I}nAz+}#ERqx|2t9O6C$&vhioaHFt*m*U@d1N`UJBN#& zQupN%xIpM=+kR49rQu48shzx}jH6`BM#`p4lEM?i6bh0?tgkleE()z_BVke>oB}36 z{}+|{t8=TF%}cCh`%h(9O%8>uK%f&k-I*yuT9^mxramlHVtd7;H3fR>y3LbYS|_hP z7Xn_%k!%a>3nM;S>5S&&P_ckH!Zqs`S*cLn;_q((9B6;0k%n{|0i5LTJCDV4Gg0aE zOp|5=G5xM{hYaTOa{)&E?1b!}FjFJn5~KbDu-(5vMI-<$@i*wI-6w$Bxi_OrkT{wU?z zNgbZBz$0=JJ$Nm7h!ZY(uoh-6AuCKacuXG7zOG(=c>sB6Zm5$gAlG&fggzRQ=WZ5P zP=WQ4d6GsWb2sM2xP4orq|uwVp3*2hsWls-LKJ&PB61JuT9FiZZ8jj0K1}Eud^T+mX+e&$~}5p%O_YNp!YJt zrj1P2UQtS4r2by@wEsW5lgS`5=@QHj2~$Y0**bikb9jQwXh2b+IgJ?^x9wzHx-keW zL57tjyU|*+jC>xH)YjwqQ=xL>-K%X$-aH2dA=kAM&<#$!hxQHw_5yk#YvV?Z=ffu` zd`CpeVkftU(CzjbfPn^#+r;4 zngr>U>todIHadqD9> z)jJ2>z{XI5xF)!!cT160uF?Og_Qd)@tjt2zcdfgm?dNC&VmnhJndhV!nc*QqCc;fr z>by6FJ2JUR3ZIt>5U?rzQ4YeQvA5Y2C|x%P!V-^3Mt$jRvdw*3geHi_eF|wZ->^NDhMe1Y!eaMJA_QlsB4|$0fs!K7 zkv#64Mpvy{*!>PIB`90%{ zBbrKT3Kf`6pW=ylA~Z=j&A}_dtSBK|nB5^vsk8JQKHMak(!X5V^LT^i3(m2|0%d0y z;8Z7v+`Kz~i)~30Pwsdt2!&3K(UE1*4J+8gG<``~U?~}XOpi4q!wm>)6Q8V3>eyi! z@E_s@(34^u1gJ4<_AWMr2a`-ANQes0Nct1llS`Bk0I45qw`Y(Q+mo0}7TE2onqG2_ z-t$?evBd41`E=f4_Vrmk#V?-oywZAijJP=lFm{B0^rsJ8wDk-OhRVyBU)(2H#HnLQ zOv2yttkJVd`(*E6iXN7WI|qAv2Yn}3KFID*V*kvjJc~&z#|!$xfcW8r&(Z7@Bo}TJ zTZQI){fv7ua%1s{;4sEnftscGE%=>(FZEmcaLhxWdm3DOSggvHrskyxuBlI`maKQF z<1hJbFGG&|o5bOj<12jKX3Vagp`3Z>!u)j5h!P5$wK^y-RWKf)l^E=T$$+TvI8vUrEBA@y5G@~E!Gt^QH)JpeGbJ%hC~VvXyW2Nw%!SbX zZyW&yNK=+7Gs5vrWXs1GNo9-?8h0kf=$$O;fR{^#W~T_l9y`&yv-k||1|yYj{!EFS z>+WMn$a}Pf=%y%}2>)~iwp>+-rG3m;5jiT|Jd`VSj4ZDpe+Tg{e(Z^uckIHB7*gbg zsXCFXp+s(w(F}4^LqMcU)#NDBnuv6_oj97`ufV$Ld_D(+%3M)ub2}9!^Fwtl;!QM# zo?1z3tL>lI!vt^_dNF>Q0%8lXp?BMsqldPV8VDf4RJr8~3-pJUS9G^KQ*9Hn@YzlR zxRmmjm0>oC*RrfD5~CY~1XJbSON;qcIo5#|{Rm&7AMRu$EZ!eVEEXgi{}(ee1$yR) z?4Y=(B?)C+f%F&&zo+XdY9gk|u|E}W)(~eV# zA9l$1_nQ8k{hs2Sxjx!0FE@o5d30Nq@+ll?NT0s}{mKR9Y8n;AN0DMtTPvC5nB^C) zsB>tDlB0o=Iwlq&fVnj~`^4csBUZ5kf)+6=^EsaU2B~U*!Nlc2K78k35ETmjZKEvm zxzj!^jsZ!WR+d=^)u2}!v`m)8|JJ7}K+8^?X9m>@#St=V1mQuTTFKCm!g)9xPmKV) zevA8-0g+h>382~O#8={Qf^6BmDFu&@0l?SAh9H9Vzf2REPWxa+G2m>A3V3Ui`4}C; z>I6Vlp!QVVVO3G;rSEJT!%Wv-)a@DOH7i97J^hN&%ow~rr$20@or^6hpOZ)8Bnx&h z&CHkhX|&SAyt-;$1cKGdG-`df(TV_-MPrHZ3wH*^-#70a6t`~{JGj@J@7};ToCtTU zxd5d>02AA~NMy!i&2Uhqv-)F)aP@G`1n&{eU(*)Tw&u$X^`&$DjNVO6;s%S=g!^e3 zI^{f7TuV3IseuPA@F>B2WU{xH$9HP|+mG~*4*q}(HPEESqY&YK0W{7M=5ms0y2liz zAs!{5k4$zmetD;en`WsGn4$St z8AXWl$SCH<>2}^3q~%ksL%VM=okn9ki2X{b+yW>an?{Yrg{KK%QAF7W~aqE`Jj)gOdjdnwL* z#}09gqPwjXKQ@n1*tcFp`(>`_MHV#$evw=a)ZoA(YED+e=o<~{wAC-}yj;QYHH4&k ziC~?U-r{s|eCb#fy1X4bluU13BB`z+;>F#?s3=f!2%y0Fdy)9yk&^xrBj(K_PF2vx z8@*EhT>nD?MR#^$I`=r3vH2!#Q8JhxcTND&q|C-q3SH zg>Qmyvtff&>XfU(UmJ;UZX?Ldv&Xyiy`j>jR6pE;8Q--$vT&zM1-I@l;4 z2=;vdGFOR;${*IC}I1_Y>Euxhm(9<2-u1_H*stIbmtR@n*HD@bEY;2#v}!F9HLqQbeSELdET;~iHtc54Oah}FNm=?2EDRu;x;176 zL*R<@!gWG9MZ9_kl4htODNTlPdiEW6>P_PeTLr`$I!+gWqH3^Y58Tm`=`v>`&7@lW z09HpKQXG*4pW7GN68gr8F~S$&+qZL`dM-sKR5mD{Rcufi*DhvR3HXnN+g6XWIBuca z*B4F?A}qHTx0*4;ezO4MZNJS*rsd3`0 z?>jd)H&kG!wexAs$py01S zSqMA@oBO^Q+a<1d+9tp86Xj8*@N_>);0C{&Qt3w@;f_7Wo$BLgOj~H4W3O=QjeWWb zzsTJxUh_w!JNGpES)XcOlJfjq_)Pef@Vnvaj!)dHuqv3L^w?J6ygPaL@$1yo=`jDK z^sY8La(>5eqb~!{Y;- z!TBa6>@)2(rq~_M07IN6pjC>OE2mKDpTFDS*X(Z=sKMU-Jl#2hB*DjlP3Z==fkXU& zpVA?RSc)ByjMC(tzLSzoE)}^tcKlSuUg7aw8(+o#NoV<%r~@byx|9f)(`7hc1QqX% zqI5JP+!Cdg6pQMp`2hp8LI$iB?NhbxI1%n*v(l`P!;_|uDl^V;!CDP~)LHkmfsZyK zp15%qHh9)?dCOAuI{$Upla}R00}5M$fE#$=se!ke1D346*vn=8XL0W61nc81DpP z2_5cw$`^)JReqohtl=b)Q_S2Lq?L~IaRH_i&lWrV%RvcUe~@IgJ;J7A-@@ZvXWMAx zkpuzd9SuRz)BRFash0xcr%9RzQtX&sVg@tl){%qsbAJ=D3lJiq|=|4ZT zH-kqRkHOj|T77>wREyM9thDpcK8wZ9^}oSaU|pdoHuU$@bZsi5%GGOxaO$}v=s z`abxq;wXl%o^~E{Q}%nnDLC%PGPyb8RFGQuP;Z`v`&pdO!m%h>X&)( zp|-COdnh_y5B?OE#pP7g+$rYpJ9xXvE4H*_p?u%xSLX$AP30QoAI-W8sB%xZ?mcXL z`P%u9Zp5|Sb{;t={369Nn&ZD9^aOzgH9tB*gRD2AHnk<4xi`OF5t<+jJ6Lcr%BPY7OoeUs7m&QnCtV% zD2d=ETG^om z$u9}Ez!SgI{)nw4FCV{O;#Sg48jz^1I>`7?H2tuCQcqJ?aEOEdT;e9_aW)=e0AQtL z;1}0Jwy(baNJnCV9jU$*9<``F+C#KoTML$ZZ&%FcAlI>x%=zg>&Q*ij;MB> z(m>Jt{An`$|3?y*+m8KQvTl&|^nVQ?%Z02w!bIz;Miup*6PycEa&Ql72t0%sx0iQa zAQn7j+bE`0Fy_QV{YFou*zC4>qZImR^1*|S4rBB(>l)kidd-W3E)<%GPQ^UQw{_(vy!46$@cX0@M36(S=)D+_dBPV zURS2RDYt~FXY_o9Sm2r+y?UrG;!Muc0*Zpn)m$`UpYcy<+T?J@XTm&uw`0T$R{s0hYf$2zsEa7P49_N#f=BTSTkBfeV%!^m{{ z>wQIL#f#{Y#ojrsF~rhtuFt+-Wl+eg$W`8t9J%*K=<@+aZIGBCjjh``9~?aU_J%@3 z_oAV8?Y+F{Q0?# zD9Uth`5tpe!O1l%Jl2;JE^Ns9w`N0@!sx=(+vP^3WR0$iEi!A(54zV0?YxhWaoV(t zZg*Q6SgP<=2dHovzSjtC5=ly)$Hj)hu=pAhb@{a!+R3W6Mc4co9y(`9!=Sj`5c#!e z)|VsUBVQ_ydwoK81RvAS!{Lki=?M?RPsQLS@aIxpZBq+%3({pQ(5s7zDAsIPA0u9B zgUivH+9l)aAl^mjiSeIHR|o*oP1Qq5#r6WPm=uLbm9#gsDWR^Qla7l|1s=_e`W#s> zx6kvz8$OXs=nf2;`J?Gf5T)gJz)&e<+z+Jgne{FL|7ZsfPSpe%CzqiC@E7}{QW9nT z1nLed7|uOD%k%3ut32LUD5N2UOetNwyt#;30695+jfp==+>BP-^%3Ta1jR+N?9^g{ zfc(f5>YEMFWj~?lnq*NLWTOm@Ukx-ZT@x|?xLMpF7*hT0%Z|ms7nYF#9$;uYMhq1$ zU-*6VdNJf|or^7C*;iu{cci(bo;04RyVYS0vlxW?X|~3%)_@H85~#M+8djk)bwg=X zPqAwUCegfF!4k8nb&=NOnm+6j)&2R>I5Wa|DM=@0;KH*7?`0@;(6Ken}WjZ-88+ALWT> zRn^Am8CZu3kFCp$R3vmR6pslMSZB)Yj*Y-O6j-T#RnDC&BJ!v<>$al?<mZ<=J#s235 zsDaAje{2@Nfo5ftILAjJ?#o5;c?T4RN@_iuy*TDI$mVjaNuFL&v$G%Mf{V=WV)@VK z0f?;9sH=w^)80=KSG`|STlEKWvm6?GE3!&WFPB9u9ha*8%lf|AtgVf=0Sr$mHLcOt zrs5D-TI$Sji@hPv(5qx8Wi_V&$i~a`521A|(<~885hz8E*Wd*7upx5l2eFz4C=j#n zSZQP?Zi=Y{T;Lgj;`$rVqeK34;m!N!guNgGiZR+ElCbM1zlqtX!6xnx%t+=Xuf%49 zYHJGAU(^%yxz&y*XDS7>AXZG7J zZi##XdN?J+g5e}pf3WKMOsJ`rk(PtwtDe>QQ+v5}PmL2(?D;Y2c$rUVa@GdGV0`Fj z=S`*cakOUEwK~6AL^JtB_N@I-Rtm0!pERtg7y@2K;Dw%l#i7;CyX4WnX zyQurPvU9aR>RNjlre2$m2M5l_uooIW8a zT_XDex4##+*g|bu3^4df^T{U{&``6`<#5Go?&f zNi!(_gBExSnj~N`N(EL(mAgUQuHvkl4rEx1H|hyLz*F z93oq%t1r99?%$fQ{>zsIM8~Q2kxH<2kc5caU*3n}&2GYqnRhq zE%G!e+s?xlu>@9OY3_!kOvC|^MDEfg#RV)ApV0S{05lL(EL~**NlXyd3w*#cQOyiD z>B~=3i-GwgZjVrj%D@u3Me8c96}jTraLyFXOi=VXkCPhbp2hxPwvDQEF8M4QMNMbS zEJG8b5Px7#Vz>@iHVq16bOR#u6xxzFhI0(RiZgN_i&63Mu3Rd-xnk^yZ z2Uyk+9HU3oLB3~KO%9=N4LZcm-(3fAhd)EJ7?ovu&WAh9KsJ$AV9f#_uTO;!{0m2q zbynySYoI%>DAL!iC=#WzyL5sgsZdrva_y_1(x!%ApVY+d(CgVpa4cmT$X*WeT(*yD zB0@Qi(%_=M;u5;#{PL$+Pw7NikAshk&px^kUzpu<@Pj|1mgD%NO)3EF4BN6dVgJzz zL2ByclKnA$oSkO%7Sq}G9iA%8K=R$k#vp9Nso{}FVJ-?vS@?O@K!X7wd*e6)==21T z8gqyn5kfYNkLAq$OlS>y3UyV>zzqyuhdI?=Wk$a)7>q6HOqasjT46rQfDOpkamagB^Y-`;?Lgl z-sZ$ZYPYz@uJB^q3B|d+T$IJo^`O7)-X~wdEXGnreH^v#^m+yH)Q7-%GhMnj$A#F< zD)VOue#s(%F6msc7`RZgxs;M0gfTUTIp@Q`@J1D6?3L%SyS0VcXf$zECxfuYB4BB{ zOf4enxvHitGM@xD)!7Im1(L1D4VFS(gCZuxQnytp_$LZ?oJ6eDVSH%<9K7Y)DZayJ`!{y^mP4?|P+(qG; z(x+m8#1CxmxHG=By+4K?%Mec+eFNb<3&#SlKH}KieEj}j1_nN+fP0ul&D+rM#TWRnW&bWt1 zd>sVE9i<#Dm+|4+8XKDZ#cuL@lw`V=aY&tXZb-xo?lBe}y0zEJ<`T1aPJOen(Mbb~ zeGcE;2wx2&;+{Xf@S==_N;_(#8GKBNdMaXuWh^Z9XWzsmm5ucr7pZ%fOjd;Dkj-Kd zV=1e6caZnWCgtPCJI~dL#c_k2N1MdbrMr!mE14?tq!LRiB=q?l5I3-%saiPHFM6x+ zuU3*ROHj-&8@eF)17LXFhCmt$2m17Rr3VJOWK{*9hs%NZL@4YF)*SqDfNF)jOf&0- zzfV5Ii)5y^Kl#M7EV=o`HkSJ)SGiXksUNgryU>GFQQ}G{&*vWg6MklBmkoP(_Lt)z zkaqb_n650NUqRbXK{Kq}oL@fGeG2@B_IsuHTidIdZRY#Kk5;dwdyOOomQ$U%!5i9B zg->{z_dXh;9ux-K0JjLG>uE!FK{?rTQi}7#0U#6Jp>M zBFl4!1sDv|<>hgq^D(XN>+|wDbQWC2tt=~rR8LK<-0mBfRJlayO-NBMEKnkL04OiL z@~$XQqr3u;VEImmx=d5WU&g)jfAe7bi)Dp6%}S&*xeovQG4Amhzoibsa{s)d2ghMo zchDC>+3Ke@uac?J((CUKm~$4v^l`_=<9q%gtu>IeO_4JP#NmAC@t;S+2b*?v_Q#1% z_!FaiSbyXm^n|VP_J}-WmraZgB+K6B&-r1r$ipG5H%%(6U;dW_79D1TCjbS2QL6VL zm4A6fjYXM(=0sXabUN^^fA~(=5iL(CzwqFGP($lN;7?kwU>!xJ;gXY z`Q2gqE`IRHyBif}nm_hDP2Q1ba&PJLwNgZhxujG1XA74{?IQMd{UfpLQ9KS*VYS4P zvxnwX7a&|N)l5q{mJ{w5l1L)hq<+e5((cdt8mY^_*4WPRLJ0DnDqqw01OBe|AD7Zp zf!+H^;1K>VKG!h@8ZBm0Sn{3)>G9yWj#27M82Pkc8bcv2u6I^y8CroVci)p2dgidR zKi=jyRLE768?e)wo5vt)pMOP(tTIxBlbcl8L;Dsq`rW6SAcdrLE@4Et7>SbDvP!-p zp$%zPsx^LPZp117awpQM0Pn~Ywq-Wi57@7ZU6sZAw$uLkE?4O6Eti6?+_<}D-eXCj zR`Dh|5CMrHIRAB!40&n06&5jf4)LllUF9Zc({e z5!$SXtj5+K@Bjp9tj3On-`z+zt&{T>DJgs-@?h!Bw?w?$^XL&ln2eprE)IHoXL-dN zf=jZTc~yhj1nm+q1$j#-5-GY$B&l5=*QiIysYK;{4 zI*Y>Et+}@`88*}lQ*9lDyywrSrZNKe^g7Ti&E{vbD!_J=d9biB;3k&R&JOFV%Lx&w z{wvnFY~NNH_|1b*+1k~@qPtENaLve?71I?8ei)(?wbDv!+`-nY zQM?5|7?{wMSZGv_sL;xfCGTJjZN$sJ8*bgQ@JQv4ug+nd=UI&*K7AGjMak2KqVrBH zFny0nniKx2>&`evG1N&0>2H4E0MgL!0%Vk#r7Lb7T(bQtFEjK@g*fKu-|u~YL$&jx zSL!%sgi_jZ0XdwYQoOl*LMqeB%{Lyq1iWV~K;Y?27FQ&erXT=mVm#W2xXYd_H8S1@ z(rjZavFQ~3YDWl(p=I4;^Aru~P~A+1Ao$kr8;2ye2%)DYr}5wimL=^$&fWLpTUurf zrVnDf3%xf);tMwTMNW|mj+z`ZUn6owD-VAwtsWq_31q4nAC&Btkj(zN3UP^H3QvSk zb!c2l9nSK;ump}*zI0uYMU2`O$XKARrB|W+WyXSp9L3FrF5i-x((*qhS&WQi8)are(wi{1itSV618b{f|Zo`j?Y(iF58{--?o3zzDA;f&z>AxyP#~= zBWp&4)6`;=R)%MW^-(sf#122Tfa^|~o<5geOBp`*AuQRlxnlsvOJ=JYZpBbjk8;P| zsxbp;28zbwLgBXL1JX=l09sYfJUYUnkZVD-{PemYeIpHWwU<`AmF3Bc(^JY#T#s+` zp-EYKYd}&vQkK8JDpx#xQEQP2jPPQQO>3t?#=IWLw*;PqjWH-sXB{f$!kz`7HyJh~ zVl!ae1MSq`R;<*D**&__3B$ejoeIo|o&sRr_&vqTr(odP(eIg=7YJ4avGru7;srssd2Hm3E2CvyLAq!&43_IxlqE)Qx-$76K;a?niRo6|~jZ1(lrKcb&_o7RE zZGy-=UTniinWeE-O2xBtT4I}<8w<&>u1EuUw{A>C8*aS~0@V(=1fXe!l;Q3p@OsBh zG(9sOSujKSKirmQe@=L->8H}(9fJdklOsQ#_l)xSeMELq0#R7N$P5B5?)DXDWXLH|Atv;ky zw~sy=ZJhYlNpGFFarnL(8#bPI#385sb3A8!|Gd?Q&Qs?-gimLe3bn1CxBBsiR_@8V z^itTqsvfcjk>lMDt0aaBJv1}}2Pf<^j%+gi<1gQJr#vxq#|+L;wNtL2Lfp%sd&+An zOuD6YIn6Ik)wsf(<0W6qo*L-WmOBT9pbCcJO1f<2xjO^Z9-h%xyn zTCEOo@1kX#Z8j)X%%fJCqrITl;39div|PIpP(y<&-}5b1gv5&rUhZP|yYf8=6DTK6*%Ivo*3hfVW!5<3vJw zhb@T>NY02q`o1TdCILXcRLmXPEtXJ81}rls0+M}%3O(v>VfZ79h8O z<9+)UpZ^~Pz=isVwDZ4QS*17!kPI;Lsg@DMHJc2N4kkpM$u;hts1p5evfH2qZGKEO zcyJ@ox7^Fj(h0gkjSYeDWTrAs{39&>2=>3A6##imZ8)ltODt309t+bEofqy9o=jVo z&#|mA!2G;w^uvuK3TE|NdaQ0{cI&cdo*tpWpxQ)BA6IrwPt$b_D(7JzvV< zzUPnhh>h!g{s2p-<8<}_a&5z&nneGO{_$>C#og(%XfVj3DA^XY99riyqIe**cKzJ?J*Q)%jc6T6+z$Zc3l!F) zjmT-1x$7^x`p{1vd*N{>rT!0M`TQ$*zZvjlLDgXq6xo)ExBsP<;XANe0IuenAN4;4t}ke~=zy2aw}EWQk+Nx zLiqD#F-@Q%Z6Vh-$`pv0<5GFZ6(c5=@0{ZGbNA680YPs|f0}8WKp6XZjsVr*zjkzH z+wmK#inWA!3i2YjbV+cY)QG-1b+oscU>i)q2(&h%M z4UMW!KR&rxfdvuM=%@eOKm}0c-YFfIF91D2!oL)nwZ@X}dfV5#q;Y^E*deJDUfmG+ zPLfEw9dS}ISsCtQE9QyMdIuiU7)oKoZpGB#ZEAbaFxyxoTP{WJJJ}biSsQ&sW<3+M zMYxk`X=$-oCb!SsK&KyDLF}w8!zFuy%Ut?u8X{%ek#%A8LmcS16o=r#_pog<);PMp zfFWos6kl@C1+_vKod>w90)-Nlh^&%m16gD~5o&K=G~;Ciku;Ik`Wz6<&c;g#8mcM9 zUSChgx;FaP8*`*CiB_!27ilDFo2!6A-t9+98prSJF#;K_w1fm3NtTQ{GmM6goJcE6 zgMsvyO1HEVAu>PfhkwADx*SkBqmqU1>jlPUa)`8q5kBo#KVO5iLfD_4G2fvky2o;& z^Ruchg!~Ul1?qXWM3%Asvj@MW@T1$ymRTs8R!|)_+g|d+CbR3v6d9nPnYv%Wxn2FtjK?B#$qL1%+vg1J*H5!-8W*^?Kt$O6-;nZ$m>1tK%tIFTUojyRjS- z?L2pKL+BPkO}8BO!L(AwK6qMlTvU{6`(GbcX*jj;&bKCu?2UWThq=(xx9eSJ#GuQ8 zh}ZJyqG&NS(Z#+qrLK_t=?x*eawRI0F%X?PboJ_?si_d?{c?pg#S(B=ci+s@nWtL3 zpb`8ezl7wQZs&7Ok6`A6X?SD*&Yf{zJ2+`+k^gt+;Ri%t{It`Xf%xsgWoBnwyi}^< z?T@IAjjaX+7B=9Tv$cbxr{;)2?LRA25_aS!zNEof1uE9x3#_#d(QDlhPls(Cn_u3q z(R$r}xL^BqIOcWOVSEE(e_Ns^>b2(h-m9Kza&`Jz3+xr1d60$2`eqk41p6e-b6n;T zgqOlnfO$i2$URQqUL?;U^kAE8uE;o z8V&OG^hmgGlfw|h6sGSvh^=$K!w&z8^%X1Z`AAHxvwUPfr_H3xO*5$4>4q;J|E{>d zc;87n{+!eRJ(^Y6_{SJnJy_gKxajUK48obtVFE}lk+yNlQ zsD~0rva3mWQ}~+oxzDhv5;IUI_gslN;^sXAfIR?slDSx^uRU13Wf5Ci(1g3INxztqV_=tsf-7v) zeMZoUWUjaaE(NKxmY)*>Iwv6B+Jw4y^X^#fIkKn?+C+ zoPcD^2O+b`@+G!LTQ(+|`!MXY6m-HNiioT3=2daHa+Rl7_`w>e#x#!9UsKpxcIuz4 zAZ97-(|5C4-)jZyWUv^+xj{k`&Q@c(5^x>4oiR?EbknK2<47fC`W09zI_y95S8tRn4N00ATd zgb~QIgvQwq5Q~Pmh;GN`VE4B7VQcw3ZMJ$C4kHfVF2Z>n>LK9hNK!kMBB}kvz|!u% z5QV^zu|omqjuCkJh^P46N-u!8*RT|@%!j(;BBgivrHz+R#!pH?2xw{5)1uCjlOWnQ@~)|L%;R%}LU7b>E5y;JtHn3LnMk|Toe zoJ&3R{AAeLGw)sEv+&^N1-wah8GyUltTLF#f3FwtzXqGk;EKc+NN#a=HRRb zARmVL9#Vl_XWkw|%@zQyFhDdsVKu0RrD$%rY$~}-=$=BL@flTI(nzWm3}j4PQc0?t z;=?mZ%y+6{3nzowN za&3vt3CL~IlP7nM{TCdSee`(evko%xr6S;Z-Bj25ehZUEkp+Hy6vx^rZDV#)g+Cckt0Cg`ey}MB8AiF~QE_p8d2v{$Js4&*5Qkodtk-WGWLScAEg97< zk((7v%1yReVv zems@g=J>;v-1mN`SrCunE>XQ zy?qI?BeK~jwwx(hSpwK~3xZ4dwR%pCxh`x4>CM-EkGe_)SLCRfl02CJRDNF7#b`@L z=fG3kXVn;q?m%F>#4W;(_h;Y?UYuvu5wXZE0T`AOBs3t_*tk-z+!v5&B2^S(&5%HW z_2QLi0zR&sD_w5`hDsrh+=~drLp+YF(g>H){6jK$AdAWuvT+g!^P$S0S-#M2(LDlX z{5yv6i60neR^QSG>W<9BJUb&BMNa-$Y3D_dta{DH#7l&1Dc{Tz@D$VV^b$ywo;$KG zmu;qTFY7k(4M`DHeRxDvzGzFY95eXF$Uk%y0vk0dEM$5OM#xqCeX8{<=7nR}BM z;?HOa<1Vk*vE~ngn_2DG(3geohRQpcgk4P3bs2QvD`YoHV75X_p)@+!1{beb$nUx| z*<~8}Z71{KHOickah48DWMjh$iV0qC>|K7W zQgY&zfm*9EwZcx~hQo31$1j?R!)OiOjCQ@Ysvy>bq47wnxA%+#2|q$VsgJ{+Idx#ikQ@* z?y^2ARrpMS=GX-Y^i3ozas;z&MBY+EoZ}=$-cA`EO+Od7t|eo2t>v00cd$U;-=K4#{sQncp(jt1iWx%`?20bpPz3b*w0giYz{E5&C6_0&PH6ggbF`LUb7I695RG~o^pWaLG% zrkHTX4$7`9ViM))$#6ra>Di}4X0ir4-c8Whf{eK?h6aJ=E9NHa;QA1^jSt}eDncBs?F;xH1*>!UMp;5-$K0scT|XBC~}kbYy&Ng`z1F-gJu=^f3=z5{DR&P zraD{{=&%k@CGxoX>ri7UNWw?4&@ZMGAPqtx_lDu^hxhYRhpW` z2A-X3+4@Za#g~N3FvQMH-}1j>`rO#fWNiDV<*^c!Wg6v&jntjBi_BCuVG9!L5!XFZ zuPdKxyLIJ3$Zh~JJ)n{!@nWBE+rtn0tE1iu3~3Rep!>S&&`%2G2>m%2&~DV#)F%4C zt4G2R-vu&H2Ag(L^abB-jcRu;Y)vjfwUQO-Qa(~hRdxi7#uxiXXr{P6ew^UP{Y!yH z_kddnQYhp3Rz&-&(AMP57_j^eGnMMF?7dcJ0=Ai)-}|54Qo1Aj&ZiC5Ea+wf-}&Ql z&@19QZ|;2(rsMW(ea?4oKF`h)SZ8GXaN%;yzj-j4YtaYH&bFe@kEsQ4(URbJ0I7Gn5{iM; zjka%e+Cq|2eF7rIfU~R7Jfq}xP>T_@^xs&OHTz$OH9xE>#Po5yWm!x_19AWQ?U8TQ zv%J}N+P2Wx^_c|uYz?R?Pw=Z-+CZ;0Ry4*RFH)J+R>TclX@Ut3@WsfkczgdD4PkZH zA!O2CDF<9_B#T@{kYK|98y`4k`_o!PQO^A>_O~!cE~;zP%j?R$ilF03ZxN)?_x_7w zinkQ#_HyU)VDL8Y+m&xAU2c9C0SYeF`(V8fKs93w^1!pC4n(d9Hfh|2BC4TSZc;uz zM?L%dF41zMS4z@2xb*|9AhN1>VN{l;y2>hdz!tpf`di|UnNzCgD&L1*Sk$`@Vk`!R z`=J3aND%x{u)EJk_&XgMPS5VC<6?l_<@SNgn+m8}n$2H8Q&2$tG6_`9V6wO5=lV3m zanIfBIZ(5OUkM32B;qxM^LI)~o17Ce)33oK6&Wvg)6~@YMQoX@>N%*m*^RSsfd@aA z``|?cePI?^NbG2$BSPyP0e}Ve7AaZdaTV-$BqzA(A9Z!mV>zd_Fr5W4^~fH+I>$~+7?a|m4^3iUO_5@d9-U*HA!nKM| z#~41(`EJgvt+SKQ$bRhq)UaIpuifYE`+;A=q~K#sYcwn*w08Az{^#Z+DN;fFY_j6`GUiV!@a)Vb&)R|d1 zTozOXWXT*RlWS%X^;?33vfa8LjilRBM0T;5-(@*M_H}z=?sb8z$H+2H8;9RGPfmy^>w=c%w&-LynT>l?0rga-7XQ=_3)+0Dj_ zAtU;YfMQoG6qU&J(hc6Gfx%w7MP9lwZ?#hiJQ{c~U`gj|Pj$_POhFmN92esdFSut)N2;UZ{S(LZOenXW}E8N0Yc~#QL6MNb1rt zKhVbqP{CR<1l+mGB2_o?H$8JU>=mIxBrC;lrHW)8O0@COe@$pNDqZ<5FcdtJMkKri zP{opr{nU_l=GV*)r{B}gu0sri+a&H8-G4M6h0TQ|j}w@8)~19|X>vfD*s7j-Tdt&;4xbU5&4bo9zG z1Vd)!IC+KEwUV@62L||U&v*%*wahyiVh!sraxJ+En*jRo}4n z`xTC#3E3&c8si%*adOe?dm(UnZ6CvFG#ZS3&d&dT>_&cNjg^Xsu)CGH6>HD-mVEFX zeg6_grK>b}@cACm*r&m@fiEYi;on`6cs>CcNWsnAf3ariv0Fam0nzBANr-D7>$Lme z+1Qk#qSUHB=yr+U3jqSwYo~315Y2f)t#KqtdBFB_02PRV|mqXCGbpCKHZ+vaYlM>dCk39eb2+Y7012JxYDmu7rfj zkrj)7oy6F?WgDaj!&uP^lQ>6gA5IegGiW9w2PHL8En!*?xbtQ|dI~AHCQ>44ZIMb3 zoRdgeTBXvcWdZ~W0x1D{3xmkIr#4->;UBy+gK7i>ar}LNpH%t0YmAD!zF#c ziU=`t>H_pANx%OYf({N)P5GFpE=fXo!m6-Ev|lJnSWIkWiqGKZ(B#fC4dYu;!bF6! z+P#B03wP9N11?I~X*3ogwefQ56-wDhIi{!wuED z9JsMna{W57p-`GV*`ARsxJ5g+QwBO2FUmWyO|Yu z{|CVfGS-~n#GZGd1S&OIz=9&4^$AE_HTo&(=ppFQ2EXC%kKAZ>UT-;{KxFn`0>INJ z5heK8nwpDpF#`x3T(`PG{0KT~Jv!_t>H*ZGvvl1h%E7r&WWcWl9 zkurIPt=3|U2@@Gn?@Y*7H(;H})3LqLwVWG_1ULaAFG7@-_-F3lw~mtoweB+a+|H%u z@2(9zyoCzn!p+MPpNg+7B#zlLSy@E)jMDDi3tf7_hrNPchWUzV6x_=~8jqEmyD#gT zpnc|;?0Q?JvY@~l4@e0FOH1CX%TG9`!zmD!~feITSoB&xhpfBpAzB zvBujtL2)ayy>*E&ZuKv~Q*}(5)?yKw_w^d`)#ht8eCt8WZ>FZ|Am7{0w39Tn7e3~c zRcpwxcc4gg1^XB8R|?(~CCHw`G&W$!Uu%i+LsN3T2ZB);5d6T4_pfXKIK;nQ0Ib{n zYQ-TU+-Gwb407abP$%3Bx*0^&i~Ax(9~CoxN#RW5(&9;}6(B+|_ekdk%~Z|c7CDoJ z7H-WK>WykTXd|a8ZT6gvF;5r1AQOz2k{v@J8m_gOU@CO4gB-jht$--=6VA!4s$_Z^ z0j%aOIB?0XPl&=eiwHhZba9JD48!eM{b)u666R&f}SPdz+mBGe||Mr7T;Bxwa z*@FN$QG&2@r=2uQJlqUVc8<5GJEeu%meh%{Wvw2luY%K15ZXN#4WU5Pq6+q%`J>1| zEv^_J$CrMjQUB2}Z3Fp@PBmunAgA^`Iy%`x;6a;Rctkcyfv9TvRVm>t!8>mWj^4gaA&!1bhvu>TMuvm18E==2QT>fVK@{Zn$GW zLORGs>h9{9da9Z+nreU6k{Z^w#-UCO@6VmRl)oUy;$48$^?>}ADxx_TtNn{ME@7k7 znL>I0wDP#I z`=85|Y27*ghC#IIj+KX}xjb3O%5F~pwQZ&I_ zdlR8xMiiN@_DE?Z4rR^niY#^iKtlfo{0y8sPs?Sw=HXGkHcWsL^PX--s5rLfAjlPH z&cN5s@hUciuk)?`Q;AJc-#ovD}HTku-xZKSlA^TVXGmpjogvbNEQmJf!AimyW2+3WD zgps@X=h)%HkB0BWZ?NrI3aAJ$^>FxE&U+dr2x1@tIr-6&U48_KIw@WBy5YhxR|W&t#@07scog#qG+ zQOp)gGW)GNRbV(~k7ZS&N)9!$cetmm)Oy-CYp`@e`^XoeF;)a_pY`er+a{GEKmj4M zs0|QVaSV59YWS2D4z&bL00 z4cTcCsnYwn?!{BR6&D_BiYoCp2>FDODx*|Jg2eyLNa4A@Weka~H21{N26OcLYA?I? z!3X9^<-l`GSbccQ%(ItG&b3;Au{{weyH$B@iSyI-JN@_0OD67D$}OaoblCFA#F(!o z3xIi&b)fZxXuY1`S$U<}S;#I5fD<^P#x($o(u~ZF9~!SroMX%$k}+nsGLH~^_!o52 zCk%9cYl8B2me9fjbRf=L_k+xH07^Y<2?J-qFbew~MJl5qsghSfDOdyG6KZ(`FWQ@H z$W6|@2T|zQD!-6?!f2n%<#ZC~fS%E_9}NdsW|%#Z?_!YHG=%2mg*Mnod~Na?^A}_> zNoYe}UPGwF#^5#;m1mv^i`ap-sA-Nk_Me@E$YbsOs2y>@qrA`Jl`DkElw$hx`A=rq zUWnk76^L*Yd-jw0XBj1%1W1j?cb$H;;(7W6N>U%=zdI)XX5M~_jWBX&f}Yc@cDxKBGVG+5G3zCh3jnZ!IU;;t;pgSauvqsHk{b|<&R0Y;S`p?a zkLgGXFN-spQJGatB-u&WGEkvGi4Ba6HS`h4iwc;jL3gOS+ExlnpS5n9`j5@+z{Ncp zByq&gH87Sg--CU>;eG14UMXrL)SyLp(YD1C29NyP2b&p(?P&|VW%HZ*z~-nI3|>Ui zQtxZH=5(wKHk*bq7y|7hf_kT#&5+J?W>rdbfSIH&d{PIR9w8PEhCN3)r)KNu(dv{~ zlZep7RlqZY8faayiZhrW zXY2FWN7!tC@MzQPDd{S*>H`RXL~i6Qax{wxRv50iZoTw zuByhe{@3heq!f^ReY~djBkdh&8I1SS%vx8Oj#{_0IWL@$FNG~&3~F)& zyd_RmO_nc?_JfW{0BK_932sFF%zX+y_1vS;5aZRbICvdu&hBH%8`s#_29@HP4}y`D zPhFH0xo4yLBWz^!^<}T%rUnr7YJZio-l#2KiVHTZ+Yy$(1PlD%@-vxn>z6z1{NIYx zt3n~s83t{()11E(rY{6AFYet}SPL(7Pyu^-FcBB~+toMxu2b&e-E6g+NtyNk<_>ye zEGe}W&YpOa8bxi*r9AOuHy{tP?=t_JLA?w*XU0_ZIzs2bDfwcWuw&__lr|URMj3zn z6Vi&1e1zbse-@WW6}?iIFvdSSD@DN#HW%~M0UjM+0JD&WeH$ksWrM$Hlx4QRIsfyth z6-;pUXURD^QOq(E5aYh$#KBfKk;HRmJAd_XA>d>HEn)gNn5SN19__4QEl zvSTl5JMjWBY_o{I62Qo^Y`nu`JRj}38lpJ7>29Sqx@r@X5Z|_)=v}+JkYo)km=%jE zm>*qHiDV%@e*<<^(mM`>E+=aJ^vftp7v!~cpI$?mai^1biTn4FM8Tze}C=W z1(SL_Xt!!(pWhPYk*qnYrOo!LFRxyxIsWNrlzpLk0D7JZ1>#llw*43Mr{p4yx_oP` zxEpm3r!++dz!Ys>KHP5(l@;5E@ZRQY`ZqhlzHqlbSqBM39nvUe#*we zx2K@Kz99Wc_}}Dxt?6>~GH=X*Bheon+vwcY!gNNx3}#zBELn#oYEZ$>XZYsqCZFPw zK>6%Ex0KUOV zcH?@RHR$22joQgF>ElKt6x8`E&efcG4tz{6l-O0^8!|0{75**-}Z~M zfB*gtUCEUbkFAyk#Q0W98a~iL`c|7(BP{Bb-nn~KrMf^Yb-XP_ZzmfhCL1RvP(^^@ zmgoJW<|0lJC_ubq{G$nCzt(4QUvPfhqMgILv3O+JoC+}0VF2WLVRU8&IcDaH(irNn7ezo$?ruU(bGHgTT_ z6j)C=K0SY-f-B-#qRY+BhrT{&gG$>(K*^O#!MKz3x!W_oX%`qnom=php@&i(+yc~k4`&71+;iwnf zyfc36TX30j+u6hlm-DxUZ>>PC?pw?EHBHaIvdSH7#`(WHZHGT3uu30b1ewjn7;Ta+ zDcy5-8$}H@S}RUuy1C1)p<%*rzoUxN9}*{a_m+4l z{CkbOo^21GKSfpijk-a-PW^`Z0R3@K?;djC|IRqs7fk<~jeA8n)i!uHF=qqCc)HZN z?f)iciiv93UFZuNw1Ad%PvH3gpl~pe(mHW{VS%?sp;a*R=2oq63tZ~wY)c3E zxprVxB1~rUQa~Ldkd+ykI1vfMbo)33S5G$R^lxm@7b!ZD@Tw4P|EM;o4##z~yU~gO zR$EVG$ShbG!`OdLn+~68|HBy~Af-!7(`X^S70^EUJj{a7qsH`55Hnk$7SMF?LH>mj z%D#tDVgi#L^(l2Vd-xSMVk2U2RHr@vd`<^->z>cuB8m_#dv0rZs5`glnDOqXwJZ)0 zc3`Hx)&pv_JMFI+A!D-YF5V~S-Ri5Oz@dr;2La-WO63>5za~p2v0t%t9%~=Ep(0eB z{<$p27pRl$MIOqnS4;UfR74QhQA}KY6=B&`fV3immu*EiR4_9kNP|2yNkbNUsOiok zbaaSNMgqU=M@5X%+~;P#i@oK$%(>rgdGB1r-Imt5?h*G|Tkb}n3-7&YXYA~sqW8eI zw%p?@<~H1oScuMB+L;@9WWupwSy}B!4lgfsTA;uJyKKX<&Wsi5RkgA8@s9@>V2qiu zV%hgLNjed)R3y3Mp;Y?f7lBW9twV_#*k*FQd5#?D2c1ztNbiLl8)6_c{3sG?rY}sp z_i;AmdJl+>zq&SzOucDi?Y!f=b`N;N$vG~%Y1%gqcU#)n8*!R8Z=?9%D!8g+Q%iSQ z-8^|n1WO?#B*?-b^vSF=`sh z<4a?)N)rFCFHd%1AKD|&3`8M8axez%60DnE#hGd7hQ}riUQenUG6M^(Bua{Aj&NOx znT(VMjz3m+H7V>SYG_ODOxxI?Ig&Pnw~{WzYG~Nlnf4teYHFz6Mb;ecVP94wl+mqz zvd&f6{(0K*4`K2N(z(h{)*1kJOx9rak)7rS`FGYw)?hm(qiNzMq6r7)JBCLE zo{ifX-MPa6Q^QnzkrT+H{#|Su8-OFz&ao677ayaL#l4=WPR2IO(?HG4@$pUDYqGq= z-g$}9F;DEBx*l>?E2zM>bd`MPA%=H+fVly~mpVVsZ z_I#G+lTT9him#o!Xllx`H+z^3DfheX8ukpEbic#aud&E)L#zPnOS1Nx<#`cis7q9=~vk0jt z^lI)ca2FPoh?OlYn2h9yG1%+Po@d+n70ybt27yYpru<0ISoSFN zq=QBSUywv3l}*4?KFEjph2~o@QM@Dp@#xS$bshe6G=FsdoY!|GEB4&Qrh~8OyQaCt ztip#RC;C61+4qVC|3&ZK`fxzoTOG0({j;?9;<*vKp;+P1o#R0*O&ESlq(p-J0p~1Y z?H|cm^TUL%@5GQiXJkL?+KbjM;g00-9m392q(=+)kH28)7FNy$MgJ;ZY!EnS@-}4; zWDE0#^X`xi+4npG(H-^Upuk+d1wkJ>;ULkU-;RodpAs zE}MmLV~HRlq-yG_U@84@Xr)!SV7wI2FDtVhiA|y9JYI8YERx6)nHbgt-O%D9$loL- z{cXzU;?(!BVVzT~ zUdA#-{t9rngGAImht$8>*s9IM4Uxo74h+KaqmY=2@nN8Kd9A6|wXq6QUd#;OOw~Q+5smZ8WANH`o@h_&{H4<1dE{$9;(&@EtcMBl zCFoX0QWF?nP5!}D%`=xOz{YZ~zA@H*3TtEQV5e+aWYdZME0A{CuXUFd0Q{XHlo>SPXqS*VncTlA}7F9BJP#unbk>f~h*F$Oa}F$~Bv$O;gx zM`@EZ82!=?T40tmib&F+v}k=AxWLTdGBycRuJ<0TH(Ri`&a%qgKB|c$UJ&fUii=Fc zt~f)ha$UbAxVXB;8+-w`N#rJ6f~oOLYDyoVunS{jyxXuLTGc>@hj8A@%fvnA%W1V4 zzo6Y_10t@f*VC$`i>sW|XwvK&8XB`;ZR(h2#V!2r@p!Um?pHZeV#YHCmBM2aT-p+E z8X6^pb+L&-3y^{lO$_p5|3aM@Cf9cZ+l_C7(UCjwx7YU-6|+?Ge_(A>Jn1nk`Y_p9 zdD+4ALIA9xA4X$o9$nG#G2=wxITDtl2;_Yj zN{PS}^YcA&7R{vbc6LxPAHN613tw6b>5}6e^b$YudHRy9R1u#j6i7b+fYHg{H=By~ zHvZ&&7hd}L0B&2pcwpRCAuLviRhPj43!CG&3(o(Ggv^7Wc_RXKxzlAI2CF4ilImyI z20o?AMsIs#*X9qNTY#zDWGIkYlmG>po8$EV;D!Auq%baZ2?P zJ1ew?Wx~=0|I;Jm;-QT$K%P(8>wYnzHO~1*J0U`k%>_cR;4G{O$N3SdTf@Yzjd^bH z4<0YsdL=Ng6wL11vbiW5oG**A!);&VAxHTt+p27bHRpdDu&k9(OiMIhP#6VDItDX0 zB_;g%mVBbVMAQiYMi6RvX`j94pcu#K-TN1^&K3Y1WhBr^Z+IVE6 zf}xIAz^LOXW*CRnc4)=8P!CJ~4Gkd$+D1VrS5${0NH+Bjz$-y3a0*9QxKW15!o#D; z35R&YFYi{TE)tgoDr*yD8|Gx+6^@0=WKeoivYB%EZfzrFE>U@0bx(=icY(oWe=o2- zxGjz4yk#529NF*L@40_Oyudci7Rf&o^Q}KaEje|lZ$Y%pg2mSs2azmYHzA%k^;@}p zoXpSH;P=k=M}wOISbqM!4fiwn`q>h)(NHll?Y^sKKEe6@Ai(9JV`G!eV(p-1A^6Fi zrk0{%ND}pV0yP?#(r}ET(4I`T?fRKH|HjOoP&0BpOhhbT>G$gRyf+5=6Hq}{#bmdY z=UU3&uM6MP8i0EkKa!^xj4M6Mbi5o?B$Nb9$Ozeft(MZNWI;J2r%(sBfs)cA7gp9X zP+_H*s|A7i{oEz8vc8QXsC(noNKTMUMV(KG{U#wv9o>fEur-IIwa>-SG>utk5a>?; zq4clk!Jbv2hDS5;Ad(dCha{X+h#ZHb0Z39ivx`7W12r&72#k+Z^p($UL=;W!9avV>1Hi|TdbBFWchvj>66D#o~Qy= zKl!DP3t#0*0#NwD6n<&pOW3plXaLJsCNz7Xz%yWC=J`wzje$=>%nnUg9KJxb4gs-J z!K^8znsu5&>OV+%DEmVL*pwt-%yo1~O^Vu8orurWVrm#|?od%GnQ{WcYM~Ez6^YD_ zp3JUvL3>u0n?QjD_IG|quGH<)7XaJBU$T2?u+a5#PF7fTxS~zv`q@3$-8x*k@9o|- z?rW?u?SsdW^32AvRaHDL^FEGkuZ1RFpMbD_7;q zwMtjiW$;>rB!{cybd^$Th&CyLcO1O)V9(M&v~=A<9p4aXV~et)chkB+vdD$Y3aB;< z6Q?TFlX=^0w#G<#E~5Mf@$zLg|4C0`mc@ApCnioB9k-PpFVZC|vHM{Ok&(OHR3wt} zIe(ID;=4qV3wo$Ll1MS;n-PFT?RF5&@iB@_xrY1{Bq!yr$$8a|t1uLq6#XnB(+;ax zHg1R&?^6c{tAL*;o%`5Ml@Vv_LDfN3e`nlVPk832)yBYZ!JA`+m)|8{7w0)cW>*7n zaQ7~Uv<(lUGRT@jvG0F@Z{M!8?STQHz^*JByYFMDR;A5+KnNRp9wFn8g1O4w|CtZE z+KcbbAbGQDT#*m)O6*T*k+kV>|U= zX&T)JBeXT%=_Dx2fM5rD`^${!KyL}RI1;@n50rIQMOBQ zsm>^WUMWe<{5@1vXtb(2Uw;9g`5X36=rz9NVz=@YCRCkE&Q^lY$H-#sKNlLQ(~v~$ zE83)Iwd}Vvh}@KbE!OE65>K+DP?qBs7zq)QP`aidM5iluU^nR-XvV&SNJe*mO8(^b z_h2|GZpr1AYmUPN$t;qs^Xmw*WWR?USG#IlEUuKcgl5h_hqO|Ro$A+RtR*&_N~&cG z(*pZHvOxj11;DvR&UeLXi>1L$l4@&JohCh61nnnV7@ei5sj^mseF&bB*9(5E$0DUc zPBXS(0X^7Qqf7!oelO%jWad+&4iR~BjnYlNd(tKyH8U$KK}R2hC|Es zZwG6rl^P_v0=Z6cPdSURdY5(N1}EYzU5h%bMW4M8sYb_#Q_GR`P-F1$o>==uErr*Y zo3kkV>?)~Nq{{1tuclt&%!RZG)~pZBAkdOV8-3z(lZ2RZHS>blzG^9SBI2 z$Wy^7gciR{j0vrWJ5!V5z>Jm^obi6Nd|W0+$xsY5C52ny(w-ZH$|sw%^KVgO64c2l zCHt8PS9m&?kqp-O%C6%na-*Uq!VS(W<2aYXN&Z5SiZOL`&GL2=m@&-g8}1mSpIFLt zBhZ7GZc6?|0U^M1qEPYyB#p<}q$X=A)0k8gD~}ePK-u9~Nr_2QX*WLUQdNBa45t>- zhNN~a80II}=M4Zes-STvAMaE!IC!|gaoA8tL1q`KT6`i*x(k|$rQE5j=1!gy>q?#T zdVA+8p!9~1Vop2x(^rzsC&oA(TaedgN~*x&N{ zBb(`ExBXrNH*Gn6IuG~mgHGuG-9MxGbcu%xW}0W3a{QZMdb!n}Plcf`WW97t7E2HIajns-8Urm<$ddbg^B5#UKoeOChyu%iDe}&3(aPFSI|m}ls{a%-teA|w>Huj z>q;r2iq@5pe&Ovnt<9Lwn$mEXD8&xKAOlQd@^IHV2I8RH8v7@jkKqi(k$;F0WC>?YQV>AVri@C&HK^lXa4gA*h!mFMvnWQQ zO{gelVW_+Rsy!`_+uU(Ui_x#hIIRR7;Rj-+qGzObZ6h%`l&2DIPArWm$69?bHZK>- z$JHe{@oqeB$pUjK7&>1#JY_;pIICr3%916$9XUy0LXU2(pxuw2L2thn>H<=96-HzL z51(10A~;1+YUop7_apGA6_}w&EdsDX-GHLrCsYD)cQbemJ+_7~UHJ)*^6x~~xYw50 zqelJ^G3E5M-=7uWU}!K^GYE7EVr(nycK zE}0B|ZjWlr)1=Aob+&``Cekwx_3aMaPz;rnh$3@eX-E)AU^9=!Imi7RT@v?V_Ub_L zIrV06_}$g$^%}^&(mjp2o=ZO&Skm>M4S%)*)(_atPDDuBlKUrD#U(s<%D{-5i#?4b z<=uL`a(Y@K&8xhpG_|~=<3(3sdhh#@9SMLPnuS0w<*%wZi@byC_tY2tZ|&b}1KhEn|CXx*;#$F{0om|x z*fpR27Oxoxf1ef*+U*M9(1J(G3>}aJ>UZ}JSq*Sor^Itts$n~u_xD$xVSAN%dK~ho zt{~GeY(VL^vw}k;k*z6on8C~K8_l!OIZPBb$=DRnE5{u2=6iWGAt^=xQ9!Q0SFb>w zo<;wm9gEWK1_3E+pQwYzzJr}yQn|smTw)2-Izp%2>8?~`E4>v+-%n9|XZV1;-s-QR z{svNM`*cY}vm5BjO*OLZAfVUIk1v~)^eCTL)2sCXZ3pm9vT~58;o&YfX5z+mP@pA? za|AyNld2KTXXSxhc$Y7W%gta3`#lxZnew?jc$W{01KL?~sIqTYe0_3K^Q2;yl-EUGfV!Ti~pHSDrAVa%eP zMU5$?{B#+5&%sa38zjnOJWEkOpw(e#E_)v#4J4sFp4k+ilp-h#v3wx%vpcO-GJJVz#(OXa=K=j~DO z2`e_4o9V#vUY6P6|2Lx)ejcJFX%)7n7P(QPeGhyHP*;-N*wUo1iL`mzVIFc9@XP8N zG@HrBS=P1dV|aN6S4vwCSxS{p3&n09L6wuGT|KUpz*63dI=fhQMz|jjL+5X@>LOQc zc?PHI+A94}?>5sRX#p<}u6-VlC!G#?PDXJERb`_A3|cKywW|J9=FR=_lp{3-E%Vr- z2kj0W&Aa`yneuYHqljm(7mgZMAaa%FugTF;y+WkK zEpI9YynW-K5fjS`(m8xvTu{sI*i|%y6r6iMYj}2_w%p`bw*-{#lV~Kz$#Q4bMTQJ37R|A* zzspu_WUMFJ_*A#H1GV7D1-$zJY>v4ja+0_>FU{-h2x1|U(o;O4M8sOB$yJb_U`1h| zrnMN`5f?ufF?amLT=+*bbwpPE3MAw3JM;- z%&!lA5gc#;4MKueV&(x;4-;iDXw}mfm)=viInN_v%F6geeN0JobTNNLd{JCMRpg3j z@w)yUO)*u`m8G%U`-k>Bj@EZjQOs-qFZ@%9Ebq|8-O6WwOe@$k>=`1p{9OR_wu+}?bHSYvvu}N#Pgg)#YL)hn z%kEl3YyN!MS@Yy2BL8+C_TuEkW=PG$d8_uGLb_Ko`L{jNM3vlaNaq+i=>W>=0$TIW z42VMEuH=AfA3&NYPj^$z8=;Vo&ZL6$6`g{P%=BwJZuc%c&#GFYG6#S%K{8m>hswNSHsV#?eocYaGolv6^G0)wXl zVsqF0Z<1tZUJ9`XS1xrv7$&e*lJwg#BV&rFcndK`3EsBxuFfS3ER*8~hE(AdAvHf>6Q~|IR_>yqC3hmdpUY zjTHGkipf%;_465_E2nhFLmOgUh-e(Mx7<-U@P+#XJ4g2HLB+gQ+;3L%n>}aHW2L~@ zUh6IKeD%sx;$7Q{(5ve6Lwio+A=-DM&CjB&!0Vi%##7_DB2gVQy}6WM8GEc{1jy}r z_$x$LSrV&6Av@X(?-HF`2Xkb~*l7p%qMaH(E^Yv!#zq}5oit;;RMRan!lOn?F`nVfc&I^Qrr9tkJ=BBEu#3;{8Q!_j%YGG-f>kE+>Umm0h z1pkN^P`*0_mUz_L0}5(L$qW`z52Nj|PW093&)uDY1=>NWx!}X_L2RYG1%g`A+oIM} z0)n-3n}J$CH+Rzs$7Dfu2aX^_A5%9A0&e~L5UPri;B&eB)|3cT0t(3It@5&7*gZqk zhUW>y)zDzl~nN7JK4J3{|_;bl3o=JqElYAaD*P@5imq0C3OqmoXx zcdm3whEv(4U!82R3wOA&1qJO7OkZNdO^2_ofoTu5j0-%XX+S_-X=1da;G1&^fkuIY zXWjnI8pWnNE-ovp%QsM5tn#88Q2jl~*qQVtq*JP~#^!-O(v}@|QMsN#0r-HwXhHUR z(q=Q(U>@jWtf0om)kt;BbNPGSF

    Yo;2%cN}|d2U}x+G8H<^A=RABg94RN2{cr4UK=T3=7|VHWn`M?m}WCH zRXwb9N}rA-F|&eO(pnFa4Jk0XU2DoFVFtrRBInvEWf~%~?1m`p!)z!kJUT}G+lq08 zAr?IOZBK%by%AbWCFoVmG1^(gk$z_s08wIFny;$3aCAN+M^c=YATKvF^Ton&&T#Qw zwzeQZom5*K5yR;8#s`V!CWyeLI2;K^=l=5?B3h^ykxq5vc>79Qiv1jKZsHW+Wqp1D zW|TZ7PPlGof2zDIvJkc)GY{_{5xr zU$}yMJF-PV*n*x}^b5C_&tHpC>I~2|#i8jX<3jHCc}D{ZFdMCp3*!l({uOb-j%1bc zF2TerAKkGdm13IbE$Cb|{suI(MV}P2oy@wVI}I1ZpJQ!9tA>h0O(RBgm^xz_;8`Pi z7k=mFecO^LbI4RrM6yuvMq=kSPOq^rl$fDsBilmemieGi8^p8RrYtOW4k(Uf)!`Y8 zG7MgHhJITynb-9BAykMU{Te((-S2m8Wa#RM%-UrPr$%aJY%O0PW*e)SQMR-C9RvZp zoGUmtf{6UH&-g|Nb9q)B^3GnkK{6?|kd0(3$=60b>*;3w8AY7$?sV9>k7&x0?k(Fr zaPlrj6Bf*NBw|S6ptoFe&Z{@+><}dJTz>SFxhNUT1hY`KYjlnJncZf-{p0WI{%FWZa zg*^0-XJ-c<95X6M4DE1A+9jrR_WX(Yj1;pLLNvqY1qX;dT6@xJxx|jrC>xv~M`bX< zRj@`O;`qSmEp{5WD5zhC-cZ#7qB7o7DqXg&#L60pF<}(QCIRM$Q47|UKk~!#lPgyq z>7P~g3gv@x}1b1)oaA?9n=zCkSR~gzqQmws*02;|p2o`^FZ28s##&Qa(21RsoLIl)OQDCQi z8V;6vYiZesT1Wp^kX*=$@x${g()d3GQ2Abd0wZbIX$oQ@#z@R=6&j!X`vzCh=Wclg z1MZeq5AGZ+5)2PSS1KiKQD@ytNR4ba`~BI2f;&Rz67rG7k++0K-?7thift^?h_a+v zw*%2?mv^0-3Na!6IblU#3{Kv)$$193aNaxiYL6(jL_xX&%V_6W>|&-m#T`W~bukV} zmot`?cu6+4`1@d|Dy~nnyq}RuULABl06$j%34Nu30eRak2++fbaqe6>L~FTYuwK?G z<0L)7Ix+s+bBthe$q602VqCjZ%x)ztK+W)5;WcEiy5nsLu(uw&2mKljpB-*k&1~yn z?BM^msj$0=b6$FPF>LxzWzO{x6TE89ff`8NR##H5NQTB0O%I+I8e5noJQ@L0!rMs$ ztsDNsf?JQA!@SL_*nS6r1$O69UOj!577Z1LVu-zXFRzz@?b5=8GbHQ#J93ht`6+);k4t9YOg5;aqFjbvdfsG@*A{)FC2P~Pvhy7+& z#rWdec?)+>i7*1W?$7$!(=G}C zmXgSRErM{FM1J;!5I!>IR69`N?Jgd>pm*`Sb^uI;_Py~8hkbhH1r9TQfvwbR>M;%( zECXVE8XCst58v|gP{}BqmOr}ReDQTab%64Y8LD`6k>sp0y(a}w>>)wjmH&jWCMc}a zQ9x|YVVb%Xl@NH-h`x~kXmqR-?{g55nqSOkxM*hUO!^&#Yqp-1=|V|;rPTC1%ZAb9 zX}gbjcQq#q4|?#&~f<>F=UY0@^7?e{E2|A z&E{v@VTSgXiC1ap-3J$z?XIJIO6xNhmtK6TGJm7ZUt(&;=aP-pJbL+T#In`6@zD}o zEnM&Lw3-sDGc{Kuw(*rrXWCT8Y{c8zi1zPkIzt~I3L16-+_u9)8Keh_ZocS)p`VUHK@A>Ul6cyD?0>LU$%kr4+HHI=DNzVj z|9p{tf{&%n@5JfDGb#v5ccT`Wu+~L;LLGz+CHd!7SlLhEguw=ksG#ii*;O{HV=WC{ zGO?xMXT_ST72;$?-EHQHC)FM%x8Xf2`A)dnb`^(_iuS7H&xO4@@f0d>;3bl0NHXM(OdcpO&J#;Y#v@kCKxt8gvBB%Ng`BG zSR#kGx4KeCM1dsh)hj7oWbYFj+K>hewSZ05KA(xaNuYg6zb4R zDTs`)1a(}7j$)pjbd4~}VI{O4D4hDjxK%+{q@b%w=vRbY%vh-fBgUo~U-tz4}V z*~9Ve(m(|=doj2ICbdqNA`KK(LCjDzU?`T>M!61Hb$f0Dk)WbzM3M7AZ7U5Z}ea6QgOuQ#m@9c7SgSyN`Lyka^Ccuk%K}aNOTOr666n=X0#`A zb73m0C16*LSG;VJYY*6I*<%%ZrEeaK#+{4tmQDe=4uUeVh$UJ>yIUvuwA$7l$6uck zEH}n4NaTY5jFA|>#ST1Ri*Sb4#Ur-^7~4l86id=+qXFa{Vs|{6z6rq(hkBV~lyuPy z8Uu??_?H2(848hyN5`U)5mMTi1k|8Ze!= zN~l=K({`g-SAtOs*i{6|0d+YEr<3QDMr))D$Y;#7sg?zx0};%w97cE4Bj1l6!9km8u!#XhmKQZoXp;nU)iGt-YhFnr{ za*gZ;bi@yck>I=cq<3EE9XA@>zy<-t(s|jfBr!0+8YgY?u|qQSuvkyFA%#2E-jJd) zjHvKGlS)F=-A}$o)Otc&4k7~Wn07Cq-RD$oyunO3NgXO{MJ~eYPhpE36Ip-u9k-%Z zdd`Qn>CX+hBhsOa4Ah)a@IO=Nra=m_ThT$Y>}*i>FiUk2yBW94j}_6Zb;Pzd8E1^O z#4(*RFQ`wS5s>A{#bKq&%33%A=oSe z#S3o>-&33!B+(zl>Ih7&omSdSv&#}%n*Wz7TInS}E8<&`C6zEcSxp8z9=ETRIx52| z{Cc6xe`|2NDZksd+^8zpgv00J55?xpOAwS=qhqM3DGU@bdf;#YgKrA`1vehquiHnJ zQdPH+jcp&!QZ2V@bzWvRe#EOlcbFE;G@#oX7t#-;EHA-8V=M_HLm$ZkWrwZA==N{e znLQ6XDQGpPkD<#t9M{cLYs4BPipG|dhevc(Ygj>yh|n)zu5pQURYHW3l`*=_%C3dn z58JXdn|0%kN4$&i1rhbXd;6}0tzJy&^>Jr$s8Ccn;D{K#*5?>rAMD7F?aqdzW5d#vMXeSETh{A+kX>r+oq zETV)E&94@gosfR^r{M`M|7KvwTToa9%RIxTh$QnBK5>uYTg@ zmr>IlBMt)*QN$i8Zw{@zoTJ*d^&(sG=r(5RdO9DiOC0}Vm67jXP?@}Ml$^-KXs;rf z+-h+6M)XA>r$34{&uHgH?L3;c`($P(S^3{`p;K4SrHHXn!j=?uqK2{js zxC73;=PEsb~xWW;i3-oeEj|$vYTV<$F>UkG%;d=yY|d1X>MO!$0l zDzXVPYJ|;3rcg9{RxJeXe43F-8b9@tk52R9Ww`N@wXmS;Jc5q0hUZMyc65iIxdtft zPaWMc%dM5JMF8C`@H~(fVz7C+vIjw*;edhQkepTX=85IcFNH}Q`0)7|I?xadn`P>+ zY$GsRw>FqoiVW4aaHoFz0hIT!Re7{D&oE@~Bh3|k^QS^_f|wc3@>YS9vM*;vUU9F2 z{>qghTGpx_7z>Nuz;2!Z*44_IQQWVcb(TMU*?Ka|FR$%2Qs`O~A%1q}lpnf(%ah zuw*ayZz9}+w6Qnx{xxe+@9Ytx>;EaLjphbmn@En}& zj#u!HG;WeJsikTfJL_nW(KeU>!C4!RLiFYsx)N)gwW`vWPPJUx7ISsb+yb#HAV1h& z)&V-3-|Or)K{+n&@Vk2RA?9$f0g?UeAR$Mmt);C7TuuF}W5M%j$aVe{cIrb0hf7AO zyYgH&yvqR=h9)xNk9Go!()A)fYA5<~X-6(r{stZfUK#Biz*c@HcLjRCM6t|)X03aF zML~6i224UeQNzP^a_+0v$5&jp6|0mnF!%~5LuAEJ`=RriMk(C`SbamXbEIbc{!Ywi zjUosaVsM?&$WlUO_^mM3S8U59aFDc^OoSsk{QqM?ZDh z)fBxYab<~7W#7qYjuX-+aq_A+l;^O|M&}C^3yVsrrb0X=?epb%d)ZebnnSj#bWAWZ z?M&iumxPy674DLf21op(ww8D)kcMo?>?rtZ{-1#_PhkFJ3UyTCPSKTN?I5OQRtY9r zysX`O0#9NL{hfW*n!Vn*b==1f7rh{NI~aYwQY!DPuduHM0me};24{nft;aswVJO>ADB@hSf@e{GW>5}$@7PW|Zm)G`=HlJ3+=()MiE#Uq z)1t?9C=0|pwW9Xy3A)A~W4&Wn3jQ8gUD(dV9|KiA`ty*7m+#iqOP*lbtxKpJZq24@ zoIVz%(zQwFRApgBOrYy=)4^=l{%B|dCK|s6ZDR1hvQOI%yAtkZW>x4IpEuevduZ-S zmadz}Q7Wbq!9yw3#sFx`G1@gsm!1S3As`oMjvc-SO#5)|L)4$pt2zpI3~NqYQG%v?uG{c4B<`E7)gdxpM)hBKu z$3J^6S^JOc+@V`^aJ^>GF(5XAF7O==ySwr93+R5b_TT0@*SQwYj*(iaTbsA&EHZcq zjVBy1yhpSh`FnlgyVl~3WbJTuotwR`9~Hm0y@h;A86<&BBz~FUQn64gRjgb!SI^+# z_4lsODGYB-$N=7ct%%?H=Teci^xxG_&%4R4wxK(MPI8V$>+y#!S5qy)`kAECI_JCJ zt-ZOCd`05wzxlj*@>z58gl{c3^@yF^uY{<&*;|515Y%hxuhCbsxA(n`;sIKZOdE=>F|lC`PKCZgk(br(FFJ6Pfi6TqLWm8YAWn3*Xyl zvY4Q^ZOS;N+2xzY+&kaTE2*whE2Pf$?~4iWLQayt3f7b|F>!y`M%QNd&KMm^x#W#1 z_J4PkD7P!4LMUaTO>OU@ss!1K{Q`DUZ>fKOs`3ni_}_T+EqdNuyPy0T{ZD@bH!jS4 zZ*>rLY*HFd(!jc3Z=~-@{px3}xsPDYISsEH5)GHzcF8;|p03m}CpTzeNRjZ;2PEl- zwMwqPWir3^z=r-oi#LuEUu zICL_PRu~c&s6RgsbFnmkT(2fbEP-zr*Y%#YW%O=I*05jbn#4;}p#onnu$vp)o2{eg zJeUdwCa00Fgg_s2b`etOP|bDYXYT-fK!d;JkTT-&pA{p}TPq9=`JKoxf?KtBvJjb? zyvaX2zmnb9N(MM|Y~`2?*4sI5=mU!TWOG0JF~agC#vN9ovCf|6;*uhPDuh*9dOEs% z?vZGs7q4L-{asW{4_YqztTv+Jp`Dq$4lQFdw~sPe;F%24-WKXPi+agg_}jWb%wliQ z_3IPymSYsk_3HydflSntvNI!;W-OXmqLCuRS_06t%;LMW#S-*Wov+4~W2mB}o?^Zr zQphbm{iJc>8Ec*-csk|^Z&uo*DOj#{r|LRVI0fg74jew|AOE9t)fvF5*RRN2zk{Du>k|9WHYH?qmO z0Y-T7J&s`-wd<Y&*K5(7tqk#!dQW!s&r6p)z_oQ>A(9o`Dk zG{t%`+J>HV6;LzU`0|#E^0C|UofXRl2a84YDf|V_MdRjkMC!Ty*vfHS>BByWLNgX{ zrbq;qC&1xR-xc7DB!+hoW)zJTwMM~eEC_|MPcS;QDXr+ZrKgxHK_Kg>r*IKDQ(PI& z4OwM5s)ycsbl`%=;@Ew+2z0D7SL{jmrIoZuXAkp1&@+!HA`3H$^_by@%a&4r)9tRn zkxdV-q|>rUcPPgCW*q!PkWK95#eo!Fd1dqyG6vAGrRyL-(A|+92ZdtFYbrpF74=FAEdbqTuEC00K-i^t{Wi53XSU*5$> zXJKsl@-#AVvlHI~BYz%2AHGLVzEkz_v(5QM_%jH^@T1T_ognwKJINk$n_4drsvBV= z)#qN?VioX}g>A;GljGp)x36IQ5Dgd2B(qa;gso zThB1S-U_vHgX**1a0yM?W~cJv_b~c^y+Q;pMo4LJHTzWgdRzK(^(pXPVaVQyIB%?9 z&og@O6w|{sxjvRA$FiGY5jzqsC{n0(itn2W6Z3K@0lT2B&FuKfHfJv?9zkCOt_+jz z&0dej7Wapw4OfTzQSfyz6FMjb!BtGdJ}Xo-y$b$Bb;>Q>c@QI*f+qHwPq)LZC4*$Yuic# z8a1f?=rg#mxl5rRE^@_me~vRtu!fmWCSSv&VH%7x^C8awgI*=dtrD^ht?$)s>jc%an(xSrw_W0+T+OA9z9*drdN z#CxPIt>p6!$Rqi1`6iTG3@yF5zLw*+F>V#L?XBJHgPd8J^{h9{ ztH%&YRX!1QRNUO1Ot`+uL=%d}LY`?tRrelfeU(Zk?&(R2zqwd{@m2lPiHu!pJbUI+;=EcwLUmB&2h%jDtc)G=>fIu2dbeK*?W zuyA9s8CfyjgrF?On;=)?+6aseYvA}oj^fJzXRPK9gkhVuj1&voq?gIW4eEGpM|F7W zCGfxBkDhMbJ>I-};rr1EX2Ub_DYIoW!OfBE4~%vB{8{tCMSo_igPp^9t(7Li#Ax4w zdhJqbPg^-Pl3!PAl~QrwH-||WI`Zp{@^=j15NyDw^B|t0fEEcGEfo8QM)K)A6Vp7sC|bQ-T$-Q6tw#nn3HPB;YM!vb zActV4+91dDl89$*_m=JJqVyt-HNU>pdi>ZfiI50X`1{dg?E6?BzsxK+V)tE}=dbWQ zlQ|FP%6*3g9W+=vLXgZ{I=hr|2Vf-O4Yg|jz5#Q3g>zcC6I7ao>f9F3nIm`AGh#w- z{g(t}k;*|#g-&Nh^v`q>^f}SHC>U49mVwPriDR<2%-%vV-&YbX8YjSoXHjV#$AMd< zO>@!}pm0n^^Tvy(_VbbL zN>j6lML-Lo^FEQX33K(1O`x;G<%Rl-^RcAWxslqS^?I<97xMy80xNz-Jo4WC1!WDj zsF}3&W-5!8h2z4H%wHAR&4f3HxZ;NPS|Qyz+6Nt%eD)?4hmM zJ4}JX)V2GjO4K9}3{2n_x(y*eb`~kvV`*W`#`*|QK0<9>QXb0nr-S5w>#E(l%?GUc z<*EAJV?R8xQ9*6p=K|m4pwRgGI>8{mZBY;QLZ|YFC|s-Z0fHK zDQ#&&U2*Hd+t{t7`3PetTeFWFmnOx%nyq1QA-uTeMb!-F$pJvbiHzQe?jR`@|H9!h zEGwmXx2CN|F3G5f82G>JBl+qtTR!YhNptAdBG~U4HDI9m9)!+u72sGx>5|=&jJ8Y< zw^VUpXlNM4S2W>H+M0MzV14C&z@F>coCxDbB8ue>L>ZYn2XmFG?BM#;gZkLf)}yDZ zRO>pfo=`d5G2r&X4vDaaKLzJaEn-2NpG#s z9|oE$W7{y1CfZ=(?dQA4-d0&XfZ~p3M8{YioTN{4yiw$pX+Qix1#BI^Vq*7ji zZgCB1{$9clXW%aAS%WxvM`RjEH*%u!&Hcz&DFET2=RMhK!R-n5`|Hn|nK? zxyF@a8ZFo|%JK^==-b2xBt5+y4$KfVsO&rB|Appea#G}qL14p;vM}Fz^oa49&`!wn z@6UH`XsC3M@pW7fD85gKl?t$?&^b~izO);5%>$as=_~ACyg^?~Hm-lPe0ds$jqxXv z1^yapf|}QE)E|AuVfI0tI&ifyH4Ovtcq@q%@zW0Q$G(z|#}poo!NJDo*!Ln9pUEtY zglG`^5`5fRDGlq2fuZp#vvJ5W5!*CYTc8eMCf5iQ7SK^Z)luz3`N<p97&zv?pDduBAUILz6!rgX+yHm0DfHp=t0kR(J1A*QX*tOF3UJ-Dr78#3 zlfJpkX0cRD(W`wM2UqE2U*gwJZY}NoIbu^r4XI zwFf4eorjhd7SKt1=4AcaeB<(Le6o~w-JUEIW3HY-V+?t3voPbCrcDjzNyqt^o&*-A zxiG^O@U4v3q&Ds_9yoFJOHaQ>dQSI9_grAPuUKNFoqf0+s<>T7`JXT}He4;h!c0=6 zuId5u-714ESBoMDb7Fr<>f^_kubcyM1m#_soX9*_GU_X~NL$}h>YZM7(=<%+kyopz z@S?_>_s(Wh8?gmsE+ z!a!TWEK675jfjLRc=#p%$6;MqI&}mt4f|JZXg!j^<*{n7Klc^TJHc|{4=-(}h}xFq z(t|CK5*YU)Chnxmu2s@pie{UmY0| z^QQqnt#dmfdc7Z1Ih+EU%0BncfYrB4=MIX;a((g!dhPiM0hK{29m-d=Nvd`CC@(Zl zD+SN^9%EFXue6n2oNUi^rk7;}ao(}77aG&cf9(Zk6QW>5VVTiz<^NYZ*L6iJMde2E( zF=4)b{`Oex9*aJ9(4I&~e&ikos%Xxa3N1aI48g)`wQ`m97_1g}udlDW*UBXCJ3uR6 z>CS3JJ4&;`SfGdLV0q%E*sodMWNHuHT7y{!!t;CBLkxo`=A{}*VZ}WadG+k+pg0?g z-j)6emae)zEj_)h8$#VmINeW2TPGf8RJ1KE4iL9%tun}u zi0(kimXKlm`TAe}+*o2VD(X!wk0`6MSn?&>iqXBsn>1syWfY61fFo;}`|8QZbL?uG7h#)fo=qdPLYxNI@My%qOln>JV6l!K*%R#U733aC(*Z&7Kb zf3U&*uFDS39&#S@U{?NbjsvPse6@V}3--BmBYeD?mCx7Q@x%D-*H+6zIv9=9Yxm`61}`@F^voao^CS`uZ7GFn|)-x35lIqrz(AD?cuKa z)H+o;$JVZH#dF((6O&n%XDBxLkxMi-#TxF(nQN(EgFfL&rwxK9`0uj*_*N4W(VD&6 z_-M?MT=)Jf2C?p7qrlROPm|6awr#sw9bsE1a6nUMTBBpGO7Wd^AKS?}AT8hcyWQBIR2ogHDay-J#gR|BTb zq=c-Wm~p+KqH20houNH(-6btaGL2s4xl5h61T)3dfjg#-Xtv!j1CYLaM@{4Og*yN{ z#1z~}NC5)0sIypt4#2n2BCw^{UpZ8+>1byslL`5Ha$%#4V3-GXrQCp3Z0KiaN(J!H z(cOiQG46$Hqlm{kdpu)$CEqK(Y7r+*hJlSFNWoGoCb5s?b5j+QzcQtJ-cdT}*G|Jl z+ZC+}+z5?Jv-Rn_&4;JZG{sq=XSBEC4IedlTaHg|^FH}^_yEE=)2dx#w41i5Vs|k( zdFa%*BO66+@1YteyqUS!`s7&9l)=4xz^#P3R-CWClI`K`I@8&U%BI4|aCG*bmD2Qd zI^AN$Nk-4Ob{V_W7{tM9npZZmanV;Yv)Lzn^={fI^14l|$N#;v<=w6wN#~ZHzOJoZ zogIB!=+{3KDPIZwdCQK?!FR9TOvi8W>QL_AF`?d$UGM@UBINl9y>^j?BFS3zKv);u z?yqB&>@SrMxhb&Pre9JxqkScEXfRoXF+LSt8DfBjya7FU6oo(-B$EnLOnV2ly3GQ} zeUOn7f(R7=E*{KCcoLZfT~B1~&w<`3;t4J8wwVf?pp47Xw>hEF$(S?v9Zkuvh(h~UIp1QG9sLSJ zAP^*R3s<%I1LLV25SJ?-+rTZ7_Xw^ba&8f)vB0@S9NHLfN9|)a0Q3D7fDV{Q5gl|8 ztngsT@;&mCof?2K*Rs*Z7@(pw7!1ydA*l!gB)j7I2+IOKW4z}4dt{&4f-(vHIO(l*mj$p`Mrk9-mYC2xbb^ z;|g#q0&rM;?j6ki>=(aegb1i8S=;+w2mG+koz^rjh?VT(6l_zu0#vq1T+)pmL!?92 zaN#47ZW(bwPBACc&5M*-WoVmI-@j9Qm_K5|mr5kMC&{{BNL%E3%>`_y3LB%<3+@ao?Wp7^AV{(vEZ@D*`0^Gv z&gW`f&~0^NS^-OZ>*>c?UwqmH5N=ZM{eml%uR^>opPeFSr&-xgGq+{FGd%w=LV>Zf zG@d}<=8KG*#glkTr`a9tDVF8;Ds&p%*>~xcjK$9C1r-?IL-tPm;rSJ5&_XM3GkAo< z%5+F}@(9O=0h3{~0q8x(ZYR_m=Q&YYO4mrJyB)3OAG{|?)u9pboUFTeQ=fyo{wSsn zB-jf?-?}vEdgIvj^rX3JsraVD+L4A4ZvOzhIV|`yahgGpHs?iYTk4er(3v=vx16P`0V(_o_gsu@E z?2GsKRmC^-V~h)FpU~Jtz$fT2$(XDG$n0k93uG_cnLEoAJ73~V4KwIg?Xy=DoS*j` zy2%L%Uw)q-?H{RBfIsxe$qp0H!gjVAMd+^#x1!Q6i# z>yATpvZb1d(<>}^VvevOt{>mz?k(Gs#?9yT=TlKfhHe6y7qt)2hV|=i#Pr#2N3mtD zYWdTbF>aODxl!WUm~9D+t7kFu^wRAV}k$l_H5W8=fEBC?uS zAH#m**0LB(J3A3Fn6Y3FdnekyFl=vHO+GwZ@yfT3r&#MU%41hXtYwJp)#{+c5sT;) zM_V9!h&qq$j3U|=;g98-zLN@0x;rFz=;(#Aof8E zEKT)i-^u9I=CBnbI#vYU%>a~zP*AO0O0!I4b8w|yWk~}+e=jhCbueQvcHb?OPo2-? zH60KMZZ?_S1q$coN0W03vOAp zwL%b1sejula$z|t9A#|MDZ<=sj}Vm5-y_NY89e}&(b%?Mj)lI!ri|$xzaxJ4m{*q9 zQzQugmBrhD{6~Z_bo@v5Az*WDw}Kz|2{UTVljCl7Qp{(W&lixp&JB^;8%rjIH{UAS zdmN*tHs=nBS%4i%lEZoUiQkp9i4R!tG7fUZL$1Bcb zZj=(pjoR^Hv-%~8Bsxd9YMT=N5R#SPp3t>)=8D?73^zyOSFh~^v3mgKQCZq?7BSyY zZs_lT1^sHU3zce4Lx$0A>jB~OXPbWh*807LTC$cQ#Mb#R1BUbYF%SlXtzj_coZ;4z zwH&dwE~L%Ch^S^@L`bP!)pTo#q`XRL$bdvpiX0#D!0rt}EyQ}0du`x}|Bs_8uyQqW z4jjdGH~Tm#-F23JyPMU~ucy&|T?CNwYr=nU&%28IO8?<%ZdivNQt(FB!O=_eImPxia&;08LGilZUbrFTyU?YTOKadhC6CC<{3Pl zFtBsmbH(+A;`-WPx_)~hpC3vSCJy6%Q8X2;OX_$YNSYl|*J!P7hGL>nMujuG^4VGa zTAx4E`ew-qG=17OntIctLzDssiIIT;ke~$wm#(aEX4L}qI>i5JHP%`Mj64)?xoS+4 z`#Rd+A7AsU6sMiVcIwrkGvFljPV@#>REgX2syrFWY=fz`OM4ibX`s2{<18+hNW>-`MJy;bDfg2iBED(Ou8 z2k<|SM)Wllo~RTlW++AeH&AdI%|1#Qw$6!xs9r@E`d?4osg;uO?^5N^N~+0diuYG@ z{6|X?-t${clKEBm{O4hIDg{z9SgMA`)KqJ6E~aWI;|}O^VA)^6)BfKBpWUQ8Sbd@c zyjwmf3=Q=TmJYs`R?=6&31hdUjq;3>49lC(zpNNQ&cucAXxv^)O)Xm+oPW@p4O@g$e5$+n%ht5`sjJ5G&cV;;YbNq|mYaF%QyTG|s@1^7g_KWkzs6~+}S6rsf_F6;+Xq%OT7l>zNao+9ppaO zoYxUC>hxG$(XlbSu>uawn?-jy8i&ald5^j_pgoneg!9?36DJiaF{5i;(`(9n;MjvK=U+S%8U zSP@92TCOc9(A9Zli6&0C=4f*I)V`kX5ZNZlsjC=n&PKox3#Lw2Pv}jk2lXwPtWXv5 zouaWfyOYRUFF$Hrbo#|P`7qvAW&FUW@Y-ms1&W_Q|PTEuI`qKiAPz|PU<6gO2&uYwn7UrF0-Ju%87jKR8DYviqt!@i&$E3?BA`LCOpBQZ;XZ4QyLoDOE|ry znpUZ>lZUvyUHz=Fa0RBW@rkXu*jp;uA#r{p$wHpBuwTqCU;Nsg%mb$LxJ93i2AwaK zwiYVG2Xhrk(9G9_0|msL<^XZ(AjZ?q+>UNHaqGh#+g^RV@hD0TmmyFos+kd0A`x*< z*t*H>+K)qH;zs?t2b)?}Cx~?Ic3r>%!}OpkmQFcGXVi~h7PK6H%#_ym6fOvnTPs~0 z$qnr)t82j~vOPRNDrMY3OntMfXIl~_>CN}&M5i^G^lk>CTLGP<82cdIJ5nI{M+C4; z;IF&7>@&B&P^OGPge*q+d;*oii0*aJh`c3!3^Z{2X;;SHqK}={^=6&t;K-`DY-QOy z6}yBiA{w5iavCMk+%<{_!Cxu zRz1H4lvxu2`&3m>3ZWwr18=olDpvL67#rxP6ZQFXJXcU$fOMmr5ySeDD#E%W{1gqU}}_wQk*6dU`Y`ojsk{&8kXHbFU@C9Ni8+ zZUj$Ko2p;0Lf&9`dS(sRjn4ea;$#znonW!$j7qW^VaUHF)p<)J*7p$ zwm>eLK{GUF1}dLeP$gGD?>(Ziz_1(F7eNGR&b+j094Hi14HZ{^e!lVPWSER$1fgpb zruV&%>*JSQ{P_a*OH%}?YpR6Dt-otb?(iDuL@ktQ32y*Q190BS-UuWG1B}mWfoKfp z7oB?+iF(t1l_2kM@ksOD*??kup$J6yefS871Ba_os`n~DheU%%pd}{t*r8kZ8#kZB z^e%sX3C%GyOCW(blSnxIa1Pi(*0)(PGoil+%K*EcUA{F5=SuhV+SYfpcRA6yGR>MG zV~R^E&eyc$$N7ds*2`*-dI(p^)Iz(@3$!u=_RTgNpsaI6=vwH(2@tfA&!L^iJ3ZK+ z&fc>1ossO}JaLWtx1b^(rZ>gySCVP^+76CsD3OXDSdb^-P_bX9VX5h2RJtZs(^z$Sg{lXAp)WfWz>3oa(<`E1I0c={pMh zR%ohX_{50 zo$>nO!^XrDKBxR+>&cB4Ih0vSn1QV+hzz=o-%BG@@gE&^&47A+f6veFAA@J=ossIH zp7j4^?@ha-II@J{`OL4#(LC?_NVL!j7@KyV5t0B6+D0Yp?&I#aPO2&;)wonuuB>7i z56=+>VPO#9jUBTX8@#Z1V-uKjo}c1Ym84HSKjFPgWMnLvr4rD%ds;f(M#{KxW4m$V z#*Mp_=skbwSRfreJXj$sTn>VW2BUXA)vY)YH|k)v72VX^boY2`@vBEh>nJCfP-+$z znTxGDdzuwE5eSqFZnf)1^iEpjSQ+MW`H?b5eq(@u*B=jzU+K}fflubeZ@MHs^%LEm zwnTGd5HZh?MZN$nCc=Q1(-Bogj@sNQoX94s5jt26a3RK<;KIdDGH~AO{GuvYsmaN6 zUTJT>82W}SKKXEQ{-Ua@h)}yLOBbVf7my*l-LS!tpn5uY7O)2MA}a|7jtOS4CSCBG zDz5?Dv3-7iMcX!E8YI^NZab!AiEl3>%}bUgi0g!rRdFKR{$`J;>{YQ~~QnNJTg>oi=2R;bI;b z8&{Du9aRM*ndOn`w)71-hHj7Yq9C0CZxyz0oE?RyYWdPn0Jh#WSYe(x`j&$Hc>n*9df36!KVq2=$1 zn`ruW{;-wrh0Mt^Xso+!KddB~wSOmqg9hstlby#G$%rDnlmfl zTE2F8>Bg)TCzpg9NlsiLBAhOPX_SZePC;jCpvuso(?peGBrKlzGI605siMFcCU?e! zEfmFJ&#i_8gd#aw!jb?9LWP*}t|%Tg((~vhS8$E;$%N`7ec~~)FZ&(xTqrIYY2lwJ zg-H|EHg*giLt(Rt9nV_mh|S5cCVOD?XlaIx*@42jN8*eUz_#IAHeU?#NjExabhT%xGwXW;hM(`!;iHu!-%t5=R}JnP(c%Aq!|V+= zTQ)(bA3KeBqBTWMxehEY8Ri;{74v(2kHSSu51pS*0#mm_A!KsCSCkTNnELi3d`&QU zA#D?k$e^vRGd#HC&(jD0Z5aQ%ZD1JwyQ6P=cph`qhM2o(ij2~f-SXWG+WwduRH_vW zM(Lu$qIVzZ(<+bOtKRy;N{}r<1PjNE0l-S&oMQ#%($h~W7d}H7j2htlla-Tqm(O0V z%$~8(;mxEgu$B;ZC#KRXmCeAJEor*Dzb{S?AWpje3}>R@V@_+2acL7?Jvxmh9mIg4 zqg?AXXQGhFH;bEcvor4In(-WI#@hnsSyUNWIfHhV)HEHhbd$GEN01hV^LxGG5Dv9# z$L}kTr;Qk&6ZdN9u{_1mQEtvIZ40uP_8P<=ipX&!mKT zQswd^V28GC63m`F{=;>Mgb0p!T5-0@Gv+u_-J>abA|W)y=wA>BK2Xo979RcDp&tnm zASMVpw3n}4#3T2kAaBkUTYzM~roVY=qqszy|ObBsX(Fj8@rWdaMKCWuJlz~%@w%@z9@;9hkrT(miS9_Dn8&-d`apF7M7gMEDgg?&Hxn9P`>BHA zSPHW)?NlvY7^ajRW|TO3^F2!{D7m^y+wyQTQLY$H3)>t;t)PISMp@Zu#tT-!emQ;b zFAq*S95~p5&V*??t%rr6teqc<+VzV=P};$z9nqzoT-q63x`|6SMVGd>iH6%^aEtOz zqrB+3S-c6+`@NWiGcW_UKSPaqV2!11AfBy=H_Aw>68&Ytcv?)e5E102VHw`s+6qu~ zcu}2KcqBInai973{Jo{8m#t@&Fj^@G!DGfk*J*OO{u=EB$y^Rq5_jf6NP@!*ekW(` zW0l#D79TyWIa;R>N`6-3h6wq|9aI5dd4CDLvyRi%U$_z^;mo!=A0e+|6+X}%INGfm zc9t6M?b4keDGY|pGJn*n+D!sYL~|&=z-1NA3}@pOr#-4793~MJ;RtWxryZ+KKV3#5 z>S&e~C(i=4;q`=trO~-ff@S4 zF5U0h5<5LOg}6EsjZq}43zD*`@6#jRX%26~r&^i`#|F4!4+4S3j6=$WAr_8Eb5%{9noaL$fe8to@`#%ieABU zOG7yhkv{in_1mjf>6?=v_>2~L1!y5TCq2IL0t>u8XVsvWeNNv|xqaR?7$G1$2}zZ35gqrNkV%BQP||5(>!~}8CKz=ESiSeGgTJU(~QWj1SeR;)0`^RqKbX?G<&%< z7?>L{MdpJ?;zDV27+NPq*ySVDgp=8@T3H8Y+zxa3K2$^m*|0d+qwwD%csr+DxqvLi zOK+!Whkkv!3tL$mse=Had1!n*5XVX5rYKPPL1Ovhbj)K-s00i!kodzsG%OyY!k?df z=u)>5#z0+I6CY_0h0El3@706Sh}XjyEYD1YG*o0?9%NZeHY+U?;uL~@3f(-gk@@qw za|xFWa^haRr$htvd*d9Y?!(IcFRjuM)GdqRlRsF+6etzS79M_z7-d|G0dgTRKzXNM6=T0wRL=MSq#C&nR?&kMBKC4iNJG(f4p3&Z`k zLB-gBzBrdJ3oAq_kdeLU?e*O9`^UvgBMJ06vqNJ6nNi8IEJVf=yg>5=go=qwHan2d zWlH%XNEJT2?el{w1`z`ho~9E-U)V;_Z^6{XLu>SlYF94JZ+qeioV}=(oK7Ddw}PP; zfK>XzyCd2O|8$IRkWM39$C_e>6M22$r$XA&5i&9e{!aD5SNd}c-Xm;6s zMYQEB7d@B@ak)YR3kXWh6FZIz_atiSxOe$Rw%7xyn@f5X$RULCag}2zhmlozXSc6aSTu+F}HGWD*qpuzFeVPiVCC|hPoj* zYb%j7U?lWpA^yV8i$~wLLWZc?ycnHd7rz(J++03%vpRou>D~`cW7l9$Q>>D3h(mkL z+BZKrL(7ZkMys2YQIzLO{HWbkFG3#a?W}>e5bg5q8p!xDTwo2^&Gws zYvtP}XgP854;_bcSi=}~0>XxpfF)8%K_&Xxbr_%XlFx>gpc`+L6taQj=uBKC^uO z;?mJa)r)s5s1dkFjgjkk<;hn|=N{T^!4>muz6787dTDyvo{OyOPq}=bT>Nsra_f}- zJSxz5g$x2!r>Ax2c!2~CG!Mhl;G`b?e);UZ%Ip!qW&zUUg)8zgv%x6jG($e@ME^&ejv|(@L=i5JVqWla}T%rade%B{kMDxeL0rDfh*2sEQNE18+!a6 zR6*d!XDc(a%pC;r(yp~)m5W6oBU@CLOdqUXJ)*h*??H|ZazPNBo5cpDmUX;?6cC2* zG$jByUIt^2ma$BZ_y(NZAR+(^X-WGuH zrZ%B;Nky}JWiOZNPq!D}d&ss(;@GF_vRFiPlbHoVM2n}ERG~~p)cS1%M=OV^4~g9Yc2>eX=DnbmM*cJ9aPjOS;3 zIiX8WFIVS3a~k2uQu{V3A%k`(t^D$}4;LREv<`h3iK@P%*$LElx)va?wh&ku6IWoh zfn_(sah+roCzW_Geqcanz_)OHZ82&eK@gSs!IGR8m;UxPbX^s!LZdtwkzQ}<{U6|L z;yBJuM_e_zCr9(!#108uM9@`*_K}p=jm4quKALCFB6v!`9Ha{;+@DR1qI%eV>7|Jq3v!omw;^e|-1R~DL!+Tc9 zwvdLyq-Y8y+u`mIlmq$3G#6&;By$FwH8T5jej@^4iF|HGii8kvB3$yw!N|CDj2E~q z;}ze7m_Sqh!~y&M$_5bpVyWI>)gao|LuF7`+mLDvw5|?zqZOGhC983>l1^m}YA-50 z2Bv?Vl5;KQG%(xXreUNQ8T&wtsfUs3PApD@2Qr*})l1^C!dp^3BvnNL2U9jV$X-u8 z0Aj@9_vfqXTo6tPp4 z&N#UW%avjvYM|@);r=q)wxJzn1MeJh*GIW#~H1y++z1<57skwJ0?xFZJSu z5346`u#SvM@FkH|XlBqIf-yp-VTh0s5%m1ToywDIOHVHtE@uKFuu{Kx1OOM${al$n z0!OvHd^_F4yIVP&LhIt^2Ny4#WyyN+#QO%a9d3DoldF9V_kRG4Di2zl`v4kbNZC~7 z!IzcUdE|$v&$z3b3?T-=(S%fR`)WjSfd8}i7BBoLEI-HL^5l0K}S;_Zg1g1H)l_a2Y12b@7v*;0}%dRDU{XpxQ<56kbNC z8P;dtGGvM?na1Z*ej+)V)J01L_=sqB4Hz`O85z|xxYmyP#Sc5{)Eu_bM&tuFb6K` zPY30@rqGg6_%uV{cyOrl-Lzqin05E(%cVFKcvz~h2feyVm9SMIG3Bx)(A|^KWdd7! z>qe(?`-#q$7;L~xXUbC?Lp!EWBI$@j(vO)!cp0M01d7i1eqiKr;s-zK8uG9-$X<5r zTe#++R@DSGI5e9LpwR`r2FUng%h%2V!Kq?d zo3)b+pw9vW400qFj^Uy!iWtCHVyk>NMT^s-(rIC-7^>!Cu;O>|)8j#$Lh+^+s)>bI z#aq!-6Bpc^mrZyjboimmCT&YAj4LYNM>tTWqW=;$P#m(-RA;3#J_^^Qtoibw{yfc5 z6|A5NQ<+>@L@6|$ltdT?jBMHN=#@kfn(22$7i~gcspz8iHgc4TF6?Y0FDWOgliU-l zpLIO;!X?*Bhfw%r%nIQMz(H?sAo+@m3C0LE0r@t=fJW$!FBg6mqBL+TwBID&``fYN z?@%C$#fTX%$dDEvhHlIoCBlq$;lVMzjJ+nJJV)5`F`XVR3WsBUI^qs6JJIwQeknio zresEf(&zz9JyEonO3Fk<3@DqQNR*16J5^&N(bT~4QJD+F*OVra$00o&0IJ==ZRE^;WtQ$phi1AZ95mbd}V&Yf>y`xq)X zQWz;#A(649qOC)+x-H3yK#_)p9&XDph1$tl2`S#(9iboT5v&C&Tx zdns>U0i$M+R8#rxQw&UDnN;PoS-0Q^a_9$VD<^HctLV7PWq%O0-&qmR?ZE>pWNudp z4Qj=j6Wg{xLfx>HTMws1(XbibO(lLZ592IGE91zp5Uv_tF_Y3_`_0^2m_N+|e3TZB zb@yyJuf}P>chdgMRHmdRF+c@;@B+1b?i9wtu)`OY^fwuy<5b^d0#)5QEAG`gVayy6 z5SxR9@%2uL#mWXjk%2M9VIq$ZEq_xsuyR91u4U^cLI7~^q%cGx8(Y|c61{YgQ;ba( z*!e6vY!(A2(D~X6oWw&wkwNC}dCW*gsdPAr9LInE%j5HA$aqYR1bvkE0-6bmCufIm zM))0tOkTRu?ilVHLawlM_`DU0hOT9#=rd!n0AH5LR#gz)C^swZx+&n7#l}U@8Gs2x z&R9UGY&mhcdNI7p^Ko+jd*laNbeTM_CzP0rndY4K+w**uQX>19AR7H@+N?U_UaUF* zYCx60!a*+I@1;YsS`DqNKqp2FKcWY6zw-@FG!#2gqMT;S z==IoYhT0>y#!+`nLg?-+RAAQO&}cFs+Ui4*iHl9(r4kb>kZ_>}Z>Y$*w}dN`;!vYP z<2!qIzF3rb*w}wYC0n5Xi6S03wftu=YZ*gXUNok;If)iC`Yl@|Z}$EjI+JF-7N)gz z{(Z#JXEB%GX0@a{;V6rX)1WyB%Sb%Y(HQ02jpoDE5c06)Osq{&4qYk}rTt7ax6Uj) z`FP>M3AFLlB*V@jHgZl1RfmWMbv_FvzdvU(2P~?JY0Tq$}9}rkMDmOUEWP2 zlq6;rOaJ7PKiKuz(KrYl5aVrJ2qCPpzdz^ddVHkQMpVvdO59Go-#7{+lZg$~DJ)?L zI+A~{`I!Ar_c62l%UqF>nN85_Je@(9Tu#zyY8(Af8E9$BfnHf)R5Nb)X1=<7nO1G- z#+TI(A7FA`;E4zCIF0Sg*UmU^COWpXcQn}v6!OB+Fwf=Bs%#-Kj*J_z{+( zDZiw*AT-AL>WQ06bEn!jw6{?-?-Td}4s!X-H4_Kw9CN@XX%QbkifBbbh?Y3?aOK)( zix)nqOwYj`8x?TeUR&FSj<&XiM>p`qJbMC|5YwHB6L)OZ%T16j3-+y^Lx@1SrV6kp z%be2l_?^nbnOF$XG2Z{8dt{vfmB`debZ-;&&P3Cb3FVFI>4(5~BOrF>VZULp9y&5^ zejN?<25h8E%4N^rpQ2%UGVVm8mv`jSjgNjgayAa=O$F$jHTc{F`vl$iC}Pd1RGXGo z$@{8jjx9a;mg@nfwEf?^ud|g1pH(nhui`g0fU(XfUcNvJY3d)t(xCC6RR%?GmFdSz z_dY-+;>^+Nxli%;+fPgs+bLLaE=9@SuYIVS3Nh_tFofVLvHZn%XfkGZr6;8AJ4fQn zMQ1TK8NM9iA%oiGLnjx1L{CSdV-9GjeUnW?UW&!Dt9L7U+;mwQ?4Bp*s^?BK9Pes# z_n_5cFh>lBzd!xPN~;T#5U}OPUsXT(*({~V)xJC$`V#(M(If~ z#Ojl;s#mU7Z+))ci$WP*x~?g(stBIikF*GdC;WO~(TF=7RY26xp*TG;?61 zModWe)SHu;k{9@uES`IUHd9xxI*lVcwmCexO)>CdSr?CeyZFtqrMri!pZ@4zt>x+S z%LhNkIIp)phaOfReD&w)_gD$T2C>I~3;#HhF5UTp;oPSliQfmGO=HVmR%^qYH(@oCQd2)|1y0Xhr)cpcfr^bOIg*F&(AXRGJWh%soN zb?r$iwM|B_mnTO|dB8BBH*j4cNS=Ao6>>s58?-5V@H_FB+3or`N zT`FXeBTy5vAXK$63XDT6)|x@I`W!@;8lv2R)k~+Ur_bSTp%}8jG9_N}lEQbHh50$* zQF-PD!~f;+1@v{J@VerOY5oi527G#>U$T4I?gnLGHZgS^rx(cN4@*jp{KMAMfD%taNmSdj}l0+|`-|VNs`e@pQ+5 z%jKr}=r{$iPv9%j^0^tlbsI}m&XGw=aVjLfLr-|~GsoeKmg+n(p6ZncAi4;b^dsmU zkIv|)zLaSY)mE~=etTRR93JJs+S{GV^{=3|y`jbC?+>fUeUEO6_kQ5IYL&5UKJ|8z zSQ~OF42-hhTveokyWcI&e{EL;(%b_(Jqhd}Y4Ho2IoOpH?#tlpKyO!4_=??99G9`H zs@z_w6xXU4*OXgIO@=4L!h;iVLxaxZiX49khn8K_;`ySX7;ev%6z(m+qxiNMm21yK zZB8odDU)E=aN_0yj|+FgOVYzf$WEEck*8g~4W!KE&U_MxlxdxLW5YUe?!(b;8V~rH zi5x`?d_x?sq;*8AChizqEnp&Qxi89K)6$R8xFn`W^HO45djAL8k{}398E!tKhFPw^Ft@H;IfEOo5-xZ=4jNJGjN zE3Y}>G!XN%GMBQr6=ySLQM-14)RDmRYlUPBDF%iF(0JUX$Ehg$(%)9B#|E!S=x z1!>6XPK;P}yZxeC7eE}lCN8`d@mN^!;F;)3Pq^ySX*duqs9xSfB2S>{g(zU+vO{vQ zW?>MsYT~SAjq$taymBDou1=5fc?Il z01tuWL7}~wO}QBqssiLkzgl>5E*i6VUIbuR_F)poMaoQGG_m@39_pJVtOhG?R6)Yf zp}kbvcLo0N%F)~1ljw4WQOa>-GmIig!g)|ni&b*7S!|M@2t>RZmi~#I>aFquP$f@^ z9w0a`RjbiXNFW4h5r_sh;7=HkwhMXMD`fNgRruvYHy59L9|vFb_T=C8RQT#g*Fln8 z!9^YOaWW$ljcAVM7&3_|6>|z=Y*QN%S{(&kMt=Ziyg{O#Ko%3gRwjFqd@|svYBUM8 zQ<^H!FL|Tr%Ty9;3^h2;D6mZoY^t2;wT52DxFd;q*iF4HpV;Lj=oPv@f&3exDlHGPj{Z1<&S?h_5#62>;|<;{GP~4jwvWz zVVX7p1v8Y-g^@j&nb>)mbx6jp0^8W>g1(=hXjyo$j&cSGl`aHjn@I*TNyw#HB(Zok zheQys!X$fGO=hArBX%T{0?y=6aTp0*7}x|}+aD}Ez9J$>1i^KU!`?F5+}(!(Y4OTI zb{F)yoH2|xm+stJx;d>_Afov{XQa3V^)w@oiEM_9HG2m&0S29wCNR9Mcs)HguV*PM zctw&`^SK~FC3?@FJ7vY1mHAaH`Q*iCb1H>7sVUO5wPYzZO*AKewqYoIPgZn`LikuP zI4H_9tjyR@xm2Lsvm9)J)3zBl{$Y-J0wSjY66bU{HqH&Jp^iG*K9GxQ7y_=^Mv(1H zLnj%sFSB091@8X9%w*;V!^@f)kj0Ou_2OK9yD&7c4dW~;4w#Lh(JsX*pg6VHEqc2P z6Gb--TWYEhxGPg@$HnP5{6F@4u>=x)z@iy1_`J?j#m5Fsd4#-+>a<4a5&WQGCF`T&e5{1n8xNkO?81CD?J)z?)^D=~tn3v5G@59+;r?;pZ z;a)cbmQ1Mh3Og(0XS%HFQ zd7hT;{{T|I&L_%f|4iCJHpWGrrRjQ#&J~pBF{EF==uYj{!VpJ=9tJ6;$R>sOHh;-5 z9Dz=8u6Xm_x!3PzVx+YQ!RWe!#OQ1Y47E)^5LuO%D6AX9sbzv1!&crGT&1t%O^HPm zNgV>wOi#fmtk%$YJ9LtB-evP6Sn<|(OL-8Y4mi4xI9ka+ez^Gc8N)jwrzSi9jf2LE z^N*|y5*S-I1QU^UO(2n&R&zul7(0Wn0f|Ct;7z8~;Am`EaG+(qm91WF=Ux7Ez_FSN zvzP_BLX2!?R=zHoM$e$!FqK+Fnn9r@qWipZg6M*8Sd)tQ1ZAwHnGdu!?$FRwF2psCLGzB)TXRERJ9ne6^Gpt>?CnfD;MQ?Z@xB;14k0DJ-`qJ55Y+8P9vvS zfh!VIM3bf}!3>rq^xBBXLm*1U`Frvdh;&h$L@4slUa8zYY$%VEFobkbvb0O#(PLdW zs9a6CYNuvp806x4k{_4u%>eD`svww)0n}LkLAdeWi7p-_GCK98F{iOrWnn}`n3D`} z*d5f z7>-0s6*m#4G7eqc$U9LuT-uItoDS>)Kl4wbS<;rdd;(<+Mw*J1TdNu%f-5*8V(wFaku9ynu2j z^vZEK#5r?1hJdD=)|iIa%$OkjMCtcO7Lr>2;X%)q7i+Ry7@|5L${fnZVL z1(ZBp5sJt_yb?D{Q@mm@sfZI{Z%q~43XY7yU3M6a8u`LZ5Vd+JCXS3vBkQsiP{X?v zo8v%35RW4o$?hE4JSTcI408{FMgucEs`{jK zb9w>-(H7eV;x$lkShh%E8*{c4lyca@&zF{dIt}=ksF<^ge#n>*++mCfarcM{2Qu2y zPxq@wKZfHEwVGs0&H+_rT~?z)U8DtSn;VYoIZrijHDjKGTE{trF?J?qsxkHIa4|1< zUx-{UHsL5{U-qbYHl24TVWAGZ_Aaj5 z0S8z2`1^~G9xmO!3&Mgz7;JZT>I5d&`1Y#cn|F_3=-ShF`PM8IevBe=nnyg00fofT zpBFwOLANke!^TWU0soGUZmE`Rg|=O|geI4vGO=_4~YNl;t_>(5N2o&k3JU5t=z z6!~qOgS@d3qdI1cgLmjjjlHwW+iz1D|~hjycj>*_p%5~ zGxgq0p{u1G&c1Y>THUujTE9#`9Zr}#o!Rp?%5qF~lxWudRDfS8He59xrx-8Cn6=D60$5b)A zt1p71a>`RQAmZr{DIWz65AOv+<_98*#O#sEamv6#(TH?N{(~L}M>sY1^t^7~r`om|V zQB>L64c2?gN`11)`jo4z&H&>u@zpG1yU0Y&EA!DB3|i#BHjuNpylTuK^mb*vVks1P z(bPQ5^Z>t zbz7~0r__ZHE2l7CA?L-G0i01=h*v+lm~m=ulBU#@*t$-Wn&Jz2!VfMMQqL2ui_z=I z8?;izx^_~P?pk+GX_Jg1uNhBAnL$dKtxX5-v6xjF5lOS{8kVh_GAzk!Ed%?q66bg~&R=zmQM?L!pM#`ToJ|X2z%f`T1uhqng*cD9 zWs$ZxKa0)=q;6WrR#?TUOb(a--Dtxr)ig!gJVt6SL!)mER!zg@WeY)SHs+A;;->=+ z`~Qe=Ve}LdVK0-<^<;dtEz!{Z@2jV8RUS`k1SR0eBo33Wl5XY_a7|`ITvZ>2tfUS+ z9z5(;@F2}lmeMtsFR4}*1nuphJ$LdtA*jL{y(VTG}fvT8XSb7M1MJd z1&t6LX?nnS;D2`bFSN1XDhJ*`V;43B(k%;v| zKIgw8nv1Y+NQiiF|9$zBA03`)R=F~MnAh5P3dOv9iU04*7p_v@FlEBb7ks_qQw+Pq zo*smZuNn4c*y9!VD?K{wsNg^++T2N$ly5c~nPNQk%f%TD9W%6lHZbxfZte%xnCZrk zX<(2OVj2GX^2Z-IZz0#c^XZ?QckxZuI}kbP@G*LoeAPagp=C(hUoL(uPzl2W3UM2^ zme_drBxV9k%OnKs>-t*Fu4%!@_IkxYI(!QgAv`(-)K_i4}}TOpZ96#$uY*mcDnSgXyX zA#20pYWBl?as_YpbbETu5eExD!{g}^Ji3cBhE5lle+D2%)E$73#q}+{uwT}HFoWTn zg2G>peE7?ekAuR>i6fPhT4YDeI62jypO9fEiIy!hItk}<=+Jn`EShcy>ttDOQz@rk zvl6dS?7~E<=y^GgUiDx(}4=Ww4XwY2aD<% z=^Ai&B-QD8JzEYsmlVq+aL7RmYe6%=3({ml#;IDE|9tVvLH+4<(sK(zqm?U1tj4f> zI}i*PFMjoC`ONob=-JVHg2Runq8~K@*MF>@_^9$o%cJM|Z;M;n!u&km*H6vq7Tx(2 zOaifSv_qbmt6otpQ9!&%%W`y8ys4M7Go6GWS2_~|i^NfxrVtz_AksS7o`qH$hbYiXe?Bct7-JK-#s!krctJB`)* z-(l>XOIH^!Ug7-ghPfe3jU3tH{1ISm&^?XJdc2aG$p-ekk?=;EvhF;wK+{Aei;ii2 zX&ZV=huH@%ozVvEPGA_)AlA>~wG(hl(n*3Sl92e4Buy-yCjkTnXaG}8FTHHsuhL88 znjd;n`QQR-q8}UzQFv3`ZowVPWJO3a3sm!hDFkLb1Yk`~$_-K#F5UUDdiI1~v}KH( zj<;-pe;vHN(%ZESBT%F!-D2z5{*s3o5fwujdjIFby7CM3w_~86*1xB{~(X83y zARwX$h1EDkYts}77O?1Zx0k2SI}F)qf>JE3o`EjMGN9*DfdnD=y=w9C$9fo2Shc}7 z65)xq$4{_dJ}P3~NI1e)kXVhe3wv{=V#f1BJ_fty!fk`DLLeqA3kY@Ve!)$7lDB;L z1od4A{iDhC!pvh)%n!!G%m~HdPw#3ho3IDcMrGzZ_4R-&MIi#lt6?Fw94K8Rh&4MB zG&qtZDCT#i9cZ#TmAeY)X(M=+j~D}8O>iza|8KUmwPVxfZ7`5WmAUVh&wW)n{-|;p z?Vqq{Q+o#$@hy>yOyNE%wOA@52U`)khsrU*+GM&hi>bxBhQOcA(dN6tj#fD|BAho% zs8KVjurv~B`epKx7Fd+CCIk8dVWQ-EMGV?2b8lplCGi zxWdT8bkH~@IPWx3X}e(Fgp?#DX5VleE_;Q09L7_$JN1VeJ`r`W#K4<0?ocu_j>LG_cL?c965tjn#d zl`UCVK2^x1yuoAFyQ-rizWu5C_aO5T`&P3SzB+r_GIcEiE6L}4tc%XsxL6<0RUUn^ zeCacC!ge@)De87=>x-SPbvRyDHfxMa>~|!3L1Sb05rI5Dv-`^;j);|P5cg@r+?cj z{y;02zz*;clJ%V<(imPlj+F=xc3=mmakzJ&$q3{Tn15QqAkeUes{MKTy~R(@0slcO zQx5KS@msW#p;GiqMdbqa$#l)YF>Wj6qJm&%rp&nt-T1pz&1J!0I#>FCQNix*C#>WsLyTrt}^L5BYn zHZkmxVQpvSMbjccmvjX6kzmZzXaosr797t*h*7H>(~W0XT@4dY+qwfyTi5;5+Ry)h zpO)5^)_)y#_wDrDv{(G=w9&>tasRfpb#4rQ$M5ZJ9qk?e);o+E;o3`+xIB-s7)q-o$&oL+<(Z&W&yV)V`@>)26nL&7JM-u>W7#w7K)2 zoVJ&_|EFBv&y2^z0oeHX|Gf3jq{owz29iZ@B7=Ew8tI%*jC3cIptQx5N+K<(2CFPp z++Qf=qe|RzX)@}&?@uN<$Z}-qc&QNiJr((xo?w%BDeHYWJeIvbLF%6{Xsej}1CTAHmzCw2?iE^mq81vGltgotmljHcL7b;@* zW(rCiuZ?Y+vhJ9l^!!3Hn;C;KbjVV4SEfIPNBZ7KS{=nIcz6}{uH)n;@qV$cY3&UA zyO94nZTYW#P5yf+^4}}E{I_XKN6W@nQ371sI{(1(-!A5&FK++WkpDW`+cpLA-=@UdlS21ff6H3v5Z08ST3K(Ki*YCp}=i|)nf(5~LW zWbf~XLGHn?ikVZ%X~5Q<(fr$9&Y^hX)Cs52=TLu5c6T~Ax3xX*ymb8@{zxSHh6WRQ zZwB0bnW^%WLjlln@yTG(w|lYWIlD02J2KEmJxKQVzR}xn^kc9LGHB7sk2}LMpsT}) z+w8tcb|(9Wb|l~I8tvYRa}qrjP(eH>ktH@r_6|w*UQy{v5p7_dcBiw$Uat<# zDM0>#KNLdEOH+jXBG9Fu&BMLN>2*_+4(DYF+CsAm-vL6!XC+dgJ6oJxnQa<6G%jFU zfUQn0Pk;K33%iU=L@=H`CW>}4X&`-WYTY`RFXSIwfuf4)Tk?ZxyKo za;46WWJyWWzy+l~7g*)yg(L%Kmn)YRNF{Ob9v*fH#O{JT8y!mqJt= z(VY#yb4VAAzhG$2a*2K&hxYx+twHQWCj}y$4}a|eQE)P!O*^dSFYb5HI@?*_8b6XT zfXvm^OIeZRZTKvHYu2R9h#$E;>%;YdVbT&9z2Sk0?$ETX&p^`=3*79eKt+t@S184I zGG?9fV>HjJZ;+@{|Fp*~(vmmTpqqEfUU9$GS`7U;>wzX}VM9;w)glAp>PAb);vSc7 z5EEs$$b$b=ncV@l2EJ~s;*ufg!5QPA(0pl-9+oXgUQuf)z>~Pkj9$j9e%3ALQj-4a z+d2wfZ(qU13)6}ODR~Ue39ysQe|pFy+=82eqY*l%(Mm85+)7b(di`^b?Mt?7K~2P zOMRq(BaW#&3K= zMKO~gYT<4M-tVL_Ko6j9g^fJnm7Kkk8MwvcQGmLDfI=sLXVKk1I5$wgP;^R@E=&cK zwbVQ*s15zVh#2VlR1psJ9HtM6nJs~5B~~BeY39?qNDNy>W#wxsbs8}ffE*=uPCgmLvdZ50XOGP zc<5&cKnOQFnej0o8%Umb``eRAdp^~oxJz$)`#GJZcqw(p;Vy^2xahduj0n)Y4#iQt zOUmS!l9psESmlSt^W@S(LQ z9-dMQK+28 zLcYXzO5!X3+!TYVcVuK}L>tZ<>dcTcr#_$J0?2cwPbzjGlN-kvT2xz^P+RMb$llt# z@lRXzO(}Z-bpXVuyVS?^Gi1xgvU@2u7hI+#SP zF+=I`GIdP*b5Ca4Gp6(9kvg$!jnn`7q)y%0&tX1UQVzszG2z{q&(FuzM*A;@`QLsh zln3W8mC7?%(tZI0s|K1!N5*Fr4f5Bf5rF{C)Lx_Y0MY+I?;^D&T*d%?(XkzdLcB&{JHU&UpV7A{rb9DedIwyb7OBs zK@>DWdo!g;ryOwtiWTk~XE?aLiQ^FE2SqAs7SG2>AT|nOHC~BZNP8)`_2H>pn&h=| zVRj3p)licHCy!ft#Nbm~+#31#4oBrH)#Opg2S5E*fXh9!13gmv9!nUoTQtHH)q^&9 zR9?Css!0;v@>A*aP*4;#De_1-S*yhLD~k`rQ$tvpl(3C8YuSzrAU?JR}k)%T6AX!E)Oqi zMv^?V#+6>g>)RJ97G*@utCQ%Bo0GjZoPUYupTsgnVtSq>avIx+H@dm~RQ6&HKz>_Y zX@>1l?tqg)2o>6C{ep=+V4(H_ znqG>)xHSFh*0;Dnw9#1ik$|+Io}qLs$UGj3eEbZew2F6Id3>BVFY^cO+;&SK&bu(8 z%^MwzUF%!Ncf{tG(<(1vFXq@miyftRFGPHP){{N%cwZkZ=HIC$%9{Phn*E33{{w>j zrk0KEueQJP%BD5@k2U)bDTD1Ee>#B%|EaB`qkVJxn*GPGVgF&Q zwqXGxGKV|;`3dJub}kkI$>N0%t3MrsThnB@K%ksK1~YyuQI;{b@#oV3C~{KX{cdso zYmSNg=jrzl5B|S$|BHnu7b_<&FP=K`m&fPvQ+ta*&1glor&A{|jP$8HnAwqXpF5aO zU}SVCAp)&q)s7a2qyKVJNKWX;L4+qjpmVCHE-wCfO^*eQiC}{ShU=Y9z(4_TDFfgB zWWg~cOd>E{Q$lHDK zQT5y%u?`y?p6;cm7Z+~^t9a^!$YrA}DyHK6@;#@at5C=WYE*hmf;CKu{8lXue|dbA zv2xNrk(ToDr`3;7RIfb5bTDEpB4+dK_3G(c3lEMhJeaQD5|K$ox1N4eox9JuKC5Sc zUcCN@d&9(qy`g@?(zbF3TX`~DIm|J4gs2^#G4e%635hZ4xvan2gT_NJkoK1LmNsEM zlo`*V+-JoE*tzas;Cm+LMHQ`JX0&EY^nxyaysMcvaeUi#u?7~QGe$X=G+hOSi-E9E z&*!rHw}zGvffGw6jV^jyb#sm2t2ubGXAoJ|`+77>3go}YkKY1mEYj3NWmZe~?^J$1 zEVf%~X{vx{Hu1{jzJ2>z02k1E@|)LiB0+~VVDF-~`4A3sei_@v5BFg+Azwp#cE3#CBhfNb%` zM^PwJ_-e{eH+$SHx`nEbO(YvKdQ2Fz`!S6Uovsq!!K;H!0BuoWBcpyFHJT3EnKz~e_6|;@})Am z;qn+9X_S`xZ-&wF>87%~Pyiy4YW6~9{*g%D4ARh_T;R1)i}10bZ}5$-{=S}M*T@c$iWaked^&5w4Gtv-diC@t>mnWT!VN>5QTHOX z*%2zk@wdA4U-27weK>u#N|R;Gc&ZGZEqM0Tc~>V@pG-oz@(kn)^>7_iTma5~`3sRJ z>Fk}#sV{>xzL=88=ygDv<`JcK9pnqoQE>qEFkh9)xhda_$UU%k1&td44CU-k?p-E21I;X>q9qUS$Op2T` zF&_+SK(wwy)w9(D)c&&Fg!P)Ct=Z9!D|2^woT4X6H?UX14S@6BD(7nS$m!)NXsec1 zSNx0FBO*lnHUGag{qNte|6j+JjrXmvb^_B9Pfpcx80&(A znN8H1&2Q+dWq#Y#-XR=!poJv15OHhxW?xgTFfXjdnA&~o@d12x@n07et$+Rg{+I} zs(oR=BKc(%7#UY8Q<(IMjEujO+==*QNPG1ygMj-Vy$tHq1%adFr)R_olizHvvb`GH zT;JQg5%)ws?ZvLe7(pc&N?QrP816jyz3#s9Jv8ly1I9n1H?HU-5JDY&WGL;n`>cHw zEUB(O?)3JpG>Mbmz85xw_Vm^4*$PvKJ$q5}w$h}%Jca8>qN}yHn+)@Y-AwUU^ipS0 zNbyr|92ed)1?*V9ARdkUrg(v*d*lzpqeFoYdlJOoEzL1y8{1yp997oaog7x>8KVfq z8Wv#$RaoBKyMhi2&71us#u<+gCh3!5WAIlg!fuhC$~?!F6Jcn|G_y*l5gqkm)_S{D z+d_fg87h}RvXXyt2P3qBwQLB(VN;jITOPUJSTjO>YF5WvqEiWfwYMOe7wF>*wMa&* zn5Di^LmP{=mvVzT1%6jxBY9`Icfet<@D&HhxkZy)Ke9~`M09<@n+kU`{1MG)BKtE` z@N)Pxz%li}*gQ>>ooe$C|*FyRs^W7fk4ioVCMZ85V4_w2J18zXoD)W-RFLncag z&(NV2d&0SFwS!J=Q8ZZh-bS|MXC`t^o`3 zox7?)5qZ&D34xGBpl2=+q!%s#e2QKG95_2G)*Ni;1^WVr`vL~6qp$}aJ8llNf)!%N zO}wqvGQW)Bt$sy$WGk#GkFD0Ku3OzbwS4qYn$7V3^P)tDOOG6k~N4xF*F1P|kih z_0m8j=;Woh*D?)zI`t3A!cCd2`l?`tIiKWR#R;L^xa4O=&swDx~i4^A<*EY$m>l;#=*;P2K z=trYAxvRh;Hl{kotEerRm7LY4t@YD2O9MrBuOajOmB`K+!InIXD-aT0V>yS5Q}ieZ zKmq-qUUS;^wQY3%>%W}eK(T1m5k4Kw<;Q3VGY_pRLi<4X5OCS zorN92#${g`y_SiV<_JF4q*v$7xoaQ-H~O?IM)Mo|f|tTbB$VgP+h@6QxwyB`8_JHv?!+MrE5PyHp9qd>;b+*8m9l6+g0lPQtI0<#ustOguuh3hS+O5-i-YS zbf=$Y>S6AwzV0d#ltTke-m}pnV{7Dvg_hM<*E*G8D2Rl@C;opsX)-C|Y_r3<5sai{ z3Jg+h79lr8tH_*a9U1n(76ohpDFk1gLX3nGLmYWt)fV^6773nB7znl|pj&m#;OrIC zvX(($&HiuA{x8b@@6|0^*8IQM?Ehr`$4M`neP$ED72^MI?reX>jQ`)+xn}?OtNDM6 z)i!*;`@%qmP68p&11gYTBBTE+p${FxsYm^H(3uiZQ}};OGrbq@C&QzE2y#xNl*_5* z(r_UWHJuV>^~PWNT8HFaZ?}(;aedE!ja`Q@z#7P>64oV&1%=429lvk=H?QOa?zD&A z>^|2}$H%TQWg%#bFf+b}Iqi*=Cnkb~1yf{~lS5Cnmzq`Jx$P)F;%3ciNhx3P*Mi4)zW1h%D>wA4>H0L>5s%b>TaS{h`cSp}7M0v6iiZ zq*`IE5dIzD7!3#^h+7^#($U_Lf#mP;zcfb0>k}t%%4rmt*_(mbQMC%(6KG^C>#4Eg z3CSCy?QLyl*n9dI5~Wq8qa&gUe2lHqHJIpYHho<2V{DC{-2>Y!uh<^Aa)mV-b9u+} zQ*HqR2ES9rTp4W8LMwz|x;crQTVMca6BFuJC=_9O4{nPz#!hXD^}Z&rCoeUbkMei! z&0&;k@oa%WavfeH7b`jW?4}LEJ@&+OOGe!;ey8ze(KFvmXG#=*K14^}Svo#?lFHhy z#KXlr@f0qHad(%B+23>v&j!E_y`rxSWlLLAG|EXYGcj4(8i|t2VsUnCY*I20sMEs)wKWPSlUm?P zuBQ3S?Md!&i~d%ffc9jH`5ZliL16~TiH*15QvRCL@J822`|Eq$YOac$c$JI1?6p54_HClvC>HV8e%N&pb)@2zPoIR2-2O6{uk(h-dcnZtvRNKbq_w z8rfgmWy$&lP3wWMimu=8T+JdhWT{o-W zgPjLuw2!nx-X@}&C^#V736>4YQ5!428*>iD$U*-IcXVav2t}n#?$9V=lc@xewU2RcZ^mh$yCGO<`uaS44zZg}Q^grO*b##YZ7gD`Z) z);K_&PT0CcgHK0d)KQ^Kk=`hpf7BwY)27K)FJOL%N*j&7(!X{$--KJH$6Hfa)p3^^ zeUMFg4QY$k*KaN)Y&`xf@wgs5|2!>G}teFMEiyGND5)>?FI;#t<57n=tu zms=V03e~0JTg*X3DjKh3oueeaV^Emz5G|AxZt^CbVjkRvO1S*89+EBFif0x!bDza;G^Em7ZsoBjm37=Xk{_9?qj8jO=%C z5-E?R&w?Rlr_AKj{F17(R@}JC=HdB6>5Mm8xcN8@CZ&C+O$qlA7jDk^0{UE_AYJ7A znd0tBeNYu?&n6)N^Ajk&bS>7{%;9Y;V@o3_4ylE(nkpjKT6*LOb&4J%pRD@idXeAKxP_k<#ISfdW!Uo|v zveW#wD=r4Ty-`{!HJ}tLG7vCI_w)je8W2uk5YKkVNW~cqLdg}veT_Pl@fObN6KiHy zGk=VOqgEvtAN?-O)*AW-M;qWD)EMEvyZZY38=79o!JJDcx$)>J({`iM%b1ih;hV*( zPA&6!!Ram+i>ML|Pyu%^LA35-NGd9*^QfWZd*Lyb!8ErSJPhdcSY6*yX{KTl(ZH;b zVS)+xNh9Z2?VjSaqE^XCk%C+#msC!crd9Q}H$c^lC(?%YAfb*b{A*#q!ugfDt=OLb zgInyZ+5fEB|NPbMe>T0+(XqCf*6e@qTdMFp!M|3t|7qLY-eKDRwBe^U`=4LK{s&iE zl|8$Moo=#A;maW3ff>5!=KOJ)0V2`_2&*?H*d)9=U)Yb2=B0cppKa1@fk+t`;zyT` zthYgH#&02GYqkW+7xydCHn27nO<_7Kj!V6dyEr8?i#Fr+(n)L|9frGrUxL%F<%JvS zycnCDf53?SNEH)kF0ZSek$B|l$GnfG3YZ3$DvMh?UZ*y1MA2PTEuu;){F*PJWy-Id z_ZEjXD*9Jns=U9xQwLo$dCSR5rbsHjC*xw5jpTFTJLrlD=-B(O;KHSyJv6Bu`dg@m zw1*mOo1vw(9o(F9K{jU1!-)(Iwi7y3FtDj!aHYj_rwRU1ACUDF(*fy3(4g_!_t(~A z11aM~L_9Hvf9W^na8_fL4l1}Zug$2&q^XOo8MV9A39G~QU?g}j#MMz=4PO{pMNo=H zSmJrF79rN4tiLttfYIz(1$C&)T@QIE)U@*AuY2|vrkr?Q9#ful!=-y}nhdL`ni@E=+?rVFgqw*08 zJEn91!-iKNBbF)Sw&yjOL=l07$kd<`Ogc>PLFQyKTt`P={3z0IlY!|}29~9O_}beB zwlzKX)?W=d)XxDFr8LoxX=AXSX+%l6jK8kw;nwtjYx=+cx%$5?ZEc&^Hu0MNFHm@J zhC5#vuC7uaxI+B@jhik1zs}B0Yx!S)HUB?rwGB_eZZ1bDPBGL@l=4M)!VB`j-oCnc z>Ii3o6{$JjUzh-LK#jk@&MCMsht{pLmG^E|X74(KZzP=R@q-HwXDY`}i@ai7x_JKZ z!qcnOgLf*&XR61(l^MktRpr#&;*Gn1o<106n}t8BCr>Ut#jlkMKUc53FDg*ZGR|KX z^kBAn@pARz1(E-=wR-Xt=JyiW3Pn~@nb`?51#%8B>KLb=U7Y{8`q@PZ%$Wr%9~~E& zmo8mhn7=1xqcZcL^4YP7e5&m&BK0XJXtU-^B(N1JTaTaS45>>uzO0=5kboJCJ0x<| zf=Jof;Vi#Dhl$5dov0qXR=GZ>PCxdMMz*Syr)@DQPrHW(2D%1&62c$FPJC(uJZJjT zzbgf6H_GEKn)v-%3RZJD26~cxJ;{Nt-^*5kT!P$|L?)P!w0d#6a{b2gr%x-7zQp8N zM1hN+T&~WZ61grT@D6qj^eUJ)Z`ASfmQ^vw;1MLls6ZN&c*4D22bP}RM0ePmb`W)f z-Vl?h14AE>Y~*;DyBKo>x2^xkIMvzHPNK)D%v}vqv&PNVaM$Q)??}*q+CPO~)zQm0 zx<=HA4_8z2uR4(I97>ETbP*y6bJVVcCD`YY1VD8Kx1!8%4r`$Qu@e-BEPSQ(#B`(2 zq~Ef3ab$+z$|rXg9!$fc8C%!cy&D#C`STOiE04`wyg|0&Xrka|crA}kSHAl!I(IQ8 z^NrvLR+3B+<4@8DRb$e9+s zU7W+Ln}l5o!3*;<+{@QFRq2^~m`3x{S!+_fB8JK^{pzDef^Dm9p{T87fUTX4d?iXE zymo$akruom!S71svFfE8%(jA2)VCYd79%s7V~f3LSpHwz0ioWWq{lFCaWqvb8P_?n zxK5kLm*>we-M;Q@Zi`1Am#sVkxs|m%z~2csag#|&$M+Pp1M^9v*c!X?bc5l{>ebmF zEbsZO>!Wq2mx@6ngpCiX-(D3Pflz5#)y3JMd(gi;38F8TDP`Pj=08^m!1z)#f6rd3 z+&BhTLra!GLcMe*u-jdjKS5XR$_H1Lo;=}vx#4a6;k|_ikKjv~)fg_{0@=00ytMMp z=)`7cjy3`}^a)xbdUG@<=j4E7|Mg70CbqO!10QE}W=w)P-v3^Q$aJ@u)xwB}w~ zY2)S5T=&TC9(3XtrcQqoG*`Vp4`c*FPxZo&)zf#Qq*%^6|K)qt&n|-03j6xe;#ZH5 z((WEn<f1tY zI;|&oH#wt>Ea24X8Y(i(&?v)@x8VfDk-yoaV|%b+lO`! z_BeXZ^cCl8!qXGQ;22k!xd`Sodu93D_0U#Lv zf&fh}&L1}3z9|>G!$o|luiSnp&IKJI!ZEta?a!9a&4el8pX2PH?CdM7oL@K5tIyih z;qcj;{*0Z|WI86F6A?Z_^p3M zRW=sRkvdOCS?fB1F=mdaoj7^q!3>;FHR$EpmnN0<++tj_bd+*~NUuORr%tF+_Omdu z`npvvq|uX33jQl{Efhr6`H2=kD~~<_cFErsf0$pKzbvIXypi8M1h>%Go`ZZ5?Qvec z__Zz^#t*Mh^!QqolmW$FvV7Qwe(0rqv31y;2#nOahWnhx%8?m3O%@)Xg;6y9YC_`D z(_0JkpI6S^tX%jE)}!+N6XaUo%~w7<7A??Ko_t(6I>#D4Db`g^e!X;OUKh(UxwN-W zfG_@dt@8L&0BqZUd1KQ$WN40wN{QL~(1YsSZOgB6asI~Q{H^7KbCnZEnmKft!|ELV zrfFsAzR(y%nM_TklNqrPTC}j0`+W=g%=Da5-zqg-|~}?t5@F{&XMr`N5NmH|B9>pfgv0f+{)zu@xU5v`bGv0o;5H zAi+6HS8py}e+07I^0`x$*?SSU4std~s%LR^dR}6PxOY6qrMe`OoJP{6oXXWuo>-NuLErEQmuL3er%;jM>+4%j--uJYZw=N(_|9WPxq!x8 z+-<3ICW9yDxz*DTk@HTUf^Jrhz|4IiB?46hV4*+=0%HEJJcgRcdq}R}yDwCRAul}m zx-xTU@y9FGvv*XfMHM7gxB!Gom_!eB9c}>Cx+=U z_>^8gbdxW7&@VTgZe_KYBVT0MOinq%E05m;G<@&HJq%~z+4;)V<<%qo<2EkMVrg zesaK&h!JaE%OOJiix07JW^vf+KdAkGr)~e=zGnabQtbaysiU)_rQ?-N zoo!pz%>UQy{{#E~LNPz){gv|nz;542_WzqU0V8PJ*hcw((En%6{{OH4qlLd%*#di& z*4C{-82r8YB8D$5qG#q_cfTJ*_;{zBFQH)*MJn{2AV@r1GJ|k|P}~w7SV;y z96n`A-G9n0xGA7(IHgrQ+57~Pc5uRL*w_bF_osBz`}I#~O0;6Q?ppnUDeB$lrpUXR zBBQ`H{A~<23A@q>T+E&R?XBG-{oA*qXQ^Kv^GijM$~83!zgQE*gCa!QkT{m4J_3ST z^XFXi|6KF`T=V}7{69N4Z`ruE>DS~x&e!Xg^2KKt|5lLyIy*MM(r)H|>{yfkejWeM zaJ3cni{cn4V!2_0YT@vyrhyy|;=YM2;JyH%XkLk(Ame2AV5UKA#VMl<$li+o+b7#p zFGmTaLFA#Z(7O-{Wk&JcOFJ&wJY%>Ms*B;(cMf!Q^V6?^!tqm+-jqiX=l4!#Qj-oG zaG5>OIR%C~LXnBw9HF92-!ualTHo=um;EqbNusxV_ekI9ADrQlzQOLk;r`wP1%8jx zFbnU_VRgiVy>Il6I9bodu=Dy1QO-S1IS%vLB>X-HyeW)ymkA~`yWjawub9V)pa{Jf z)2^{l6gdP&x(1wdd8z=jRKj@aO~N5`ClIgPYoZBXD3( zgLz<`-tLjE(Y~Rwng8cK4F;obpc>Hnv5*S7efz!CEX{2>Q}HDlY7yj?VfN&oP?}cD#MNPvC-yHn5VJuUsSrO;Utcc%gRwPEA9EP)?Im{gz9uSzGE>(bEitSA+ z;pp75(Z&HE83+6#a2!yjF8oEyt!u19aCQmTV2}vvau|--;Fd@0?p)@bGLtJvaJf=u z9M79DFKa{>ognY5<;JzkSX$}W3y9yU!50FryImnm(NGXGcq?|tt1hfPf?){$q30x? z%%owAwE68cuYtFlTiROF*|HnqP(Z@_Gh7cq@M?rv+~;_Od}^{O+5rwEwiomA-N!d4JrI(MDu%t?6b-jHu%NSItw=~O=P*vC`U63p;^X z1dCN;iJ~S#Uo%*gB=paZShFBOvb}D2Z7M0t(@a@LxXocb%3H zN0_|0C7AsnCvgkUqx@6MnyBC$h$6Ovn<<9unkJi#A6mJ|6&Uz>K~?5f7a7Pyii684 z$`yR#2TLfP8x$Ov$ZBg03L$!_40nADqv5&=Q^`5H%n?DcL1!dJr7sr3urJou#u<&E z66u`F>2HG?fwUhM`<#}I@88-blvYQ%7SYAOZ``~PXZ+yaD-vJs#iTxEk#{$|U`f0! zrZJMtg0~?u0H|6<#x`*G8XQV)AL#{=4X)P-%%`LG9D0FQp18`rZzkX99ZBHji>-D9 z0um;I7*Cv%D{bJ|-qqKS-OCeSrbKEHK}zKU)o{k`@iMj7sGF16VG(wY^9oTSyrP$d z8!)A4_4DOoN=+Q5TPpGUVvP>g^cR*Hn*wmoWhz~O%|?T?ObSTgKtS`gH{*MnmvJ~x zajwN$co^yeUxbkCrJ4o5V@^W#%xT1l3U-~Q@oB>SsSv$N-lLPAh9%?2s@oz|bczXa zCif@w8xlX!;$-8LyD#p>iTp;*?M(>9b_ax#mtsukfM^s*5;y555IzlnfSEhMsl=CEA3Iz`IASavX)>>V81 zy<=xGG2GS7$ufm5F`gG#`86e(#fY>AWl)80D{)yOP-5h$Fvbg#MXgz~s25G5^o);*xncQT= z>Zt9d>@O#z^>BZg2K~yp&)_v9WvfHsKGeWRiL|5e6)b_``8HH&Xv*a3r1PGi``?tV z&M!UJK6(+mAq#YpROZFp6m{F_a}8D8tG{kw*l(;)JXOn+A%>_!Iqc=r^a>;`rN??G zIvhs~L2I&TG(DR#=?f<3ymmSNTO@8dN6$*z0clG_&FfZ6*xEWpNtRjf|7Y*pyQ4Ug zJ@4Oqib8wLbYmeTAqk8OzOp22twGX}#CT>IpFWMcB=ykh)^@dctVid7#{yyV^7w(l zV4E3Z7>{|3XD-GF%!j$EZs{+7h0Tb_%*xEls;-s<_S}(o@1U-#d`Ct`L`M9g!Ud&( zq`@29Q>3RzVzx*zVJdu%ENng2E{9WMS+*FVH_L4otXJM@=0%FbK{W}bVOUuzP`9^` zs+3gDiBgz-NegNAFzk@5uywH#G2ADf=RiwV-e7j)Ux+*))v7R)*^p5zwlwgsoG4ii z71m2&y2@00;f2XMfE|JNI@+hsK%a*y9wQL8MaBBH*g#6~vWEWaDVMV+Y-_=E4DLkA zlowDMD^BFiaTqWo@=O`8%tE$g?cQizH3b|SWD3H5uyYlZk!Qu%0mTD;rJ`0E9@a(9 zkPDA}KbEgdfg1svIXM0U%PP)M|M3c08-=lf&7rkRW#gz* zZ>n@G!)<_o$1s8X57Oq)U9MtO?S_@&W<~cny=DYI{jX0#jBPhUMa>*fGMKtBT^&To z5WFuj?m@(K(HA7F%4-!yG;V>+*?5q(kdVp*-q}iNItvDAFpGfS3e=Gm<_;>$J(LvV zb&QSUxk?97OHe7zj!z{z;CZlZHjwDS-A7v8O2wmYG4B?~U73^<_Cj7Q706GceGWvu z0ilf!5A54F+Cq#zoAbijFdCg^+;Nzv9HnIgUT-QG@S=r1j5R6glMX$c^-LoVwm_Sj zr-0MC1Ws-u*}cT;&1K47wke(1T(pkMjU8IO%pYlkRiZ1QiB(u?EVhy)X`~vovQRL% zN)Fr=%}ELWp4~PVI&saI4vrUi;5kEs`+sYyu&l}~R%&?TWy`|bLweUiRrw+sI)O~V zELd~_QC7X$+(t(KJjgWTz%`|t5u>%@cz&kfM%zXsCCz|(k#Z+=y^!W4?AGzj_zrCE zsjLU_Cc3rY8Js0Nh+0wdDkVGJn&cQsQCXds`uc}Q`g>Uq`+`Z!xd7pWc7lVRo3KM^ zHG8m*EI);2SI$0*rDJUN3*sU;Y*v9>$DC}Q39&r$GbxkFR+wymc$O)dnN%v6%~aDW zrn4!XPRCQn>Pg}?x;6&$K+!!GoMy1Y`5lks>Ec^2@?*B~E8;puI!lX-6fRM)=~FJH zox>+Y>e<*kli1ak*BjEch7mWv5Rbg+Sl^S&kT$UstGv;O)=FtWtF|_+?Peh9u@yy8 zsJhfsd@x@mXf~{=N}0*RB{*ONx#SCiBfu^KhX~y@0WB5fMxgp&gOx6Da15U z$WDd?D77>SQ!v+@vmImdfS98k5qnS_CJ^9^P)JAOgxkhR9h9+>fU;hvV=pA$2VOAi zARzVZ-#_$bzdQ!>o})V)t*1UGj!ESbXDx?bC2+7sKzHf;?O3PGuwWgLVm9J`H{yRS z@xNU=TQ}l=H{yTs*+gY#^|8P8N=d6j90YqNC-Y&CE!DPapi=5+zB4-4Vo`VZk>?2FChD!FF50 zV~m?y3ib>S_cH~B3U(+3duCY49Bg9OEYr)n39Vt7UCl-u6uNzoZUkN&X5q1sgM+=i zr){lD;juDf4ZOI$X#a0|_lwzSSBpZ@HKkYz6;kSD5MP2z11piimC#p6S}?uHAPk7! z>gr%}J=|j2LTs=ijJnJhox>-1U0UGRY(8g=k~`=z-WKG~l;2NAeE(XxG&^G}FauCo zxGB8uP~Vi7OgSDJ9r#T+G%XuW$rgm7Wl=%KOW07s>9~T7ikJpJ9t6p0kwtkAwv0WX zYQR%AqEUz)6Gyru3VA1{50}6U4j<_>0BbE*zfV@qjsa>SIs^wZRJM0^z13}B{p~?l zQPB=!CY6Sf)-0=|li-}nTv*p+hlk6h$ug{hgcwIxOZAl0Xc*B;Q<68$@Zvl}fh1~C zwhUnl!Bapyh)6W>{7$Sv*YtQGkE!=CCM#trkM|HCwUys8|kC)u<5|nQX=`6QftKNs&K59pzNdXf+k?DEzeB$Y42Wr*2jSXf&=lrLT&qG~ZIM;Aw?zacw&J!*w7sY}7t+ zw7n8fAMcYT5Y%;#fP%4_3FIkchUg!mrL4oaJ=Q7vu%#$TZQGCC30?kOcixT?x5{2= zOKL5yVG6+9lbo%Z>cCd)U1TK7vpMrtJ=WPGC{&3@Yh$jc8m(nmr9v))L+hO_gKlIl zH#>3Z{UAGf*FNMj_BhdyMbGr7qCd}9jtex~h7M;db}UM0w5(l{nOM{6>cXS!yQPa{0ewCMjygv$Sk1i0RgImU zo$0j=fBFb(zX8e?+JKFgF)7cpo}1P4`RPVR`aGHW>-ov4ZTkTv)EN^uVf*++n)fp@ z^S;utB18tOr#Y|}h`KI_6=`g7sisUli4I$!ul8eO@*^h|3QJLyZN>g+F{K7jMb=!6 zXr{-%K(QC4)<$)Zk3I>_DH9W^nXBIiGZb)G&G@TMMP!Y2Q_LQmK>{cQix4Pxt0I8t zm2I3#esPOEGn;I&mBmZ4)+%j0%f*h`@8nM#AS*nREzh<8SeOU?O=_GlDKP#QP$<%- znZQyDFAJ~LGd6oXquFZE-5LUg5MH&FOnfEE#hG3+D*!J^>d3k=h2THX#dm>xWf~y1 zY8D7F-RWs2-$VugMn#8YLv-?D>=X1}) zv*G`_;r|)^(^1rlg z_<#N^{-1KSWAeX%6DMVTY0&?2HBOd|WI=F-r8UGUfaVe^x9K& z$lK$z=}*bqZjaNhKkn%}FaQAeJB&JphQ`>_4)W;%D@_J_Bwcz$(1{m|rB5L!J^iC? z?Yo+7&jG7G^n7Hr2Z8f#FAx|%^rF9)VDG~(`r11?+g_3|yc#^c)9aQi;4hTi{AYM{exrF{h##5wVyyP6Q@^0{u|qouA4 z(M)$F9K8O*Jw5{=b@By)+@ohPYv9n1_P4sZLznKbYR4>=AOeuy@q|}FY#38e<=-R* z*=?xOSYTWk@>*u1d}&(VAx2e3pQYr@r_?j7_-zpZwK4TaMhe5NO|wp`5iw>6h8SQR z5*}PklZb|AZ;plu$aYe>io~iTOkWS3moz3>^1ZDA7Y+CL*AO3>tj|aJr?S@;Hr=f8PuaAMvKhxOok-AZj=qd* zH3}jzxNFf+41-mGuQI_`kt5PpfyZXYF9wYIIK{M9T!R_c>$nW%ZW zoZ+;?yuD}&dVXGxJus956r;pM*k6Q~qap?9@MAofDm>}%S)35?Yqy-AIDuwuc941= zq~A8o-RO^j)^7YOmCa4(i*S2VE|n_U-3c%642wV5xpfp9P!0HaPc?-3rImd`&n+=JUn8}dG3ZJyVYb8_(d5ZAw$a{tV zNOf%M>QIsK8=OSS=+MX{s(ns0kztn?Ds1y%t2jhua(oc71I`-60tIR`>x1!O++-P5 zu64>hx01ms?Xy;Yh_HWx?ugu?dQu$xChYAW8k=6%dJGL}T+PTNMlkLKKnCO4LU6@6 z#*4aM!SRS~i#MDk?WAZEFDKdJA{Lt_3K9BPnK$94%pj>5V?h_lRAC|6Ge69Zrcl1W`s z00I60c}R@o5jWQq-dw1DpU@0F#pAwI&i_C9o*!{+5hcqhx@+{_Rq%s z-_LRXr>wTB*o?leg1~Us9{|V%$uGjbBQw_CFb3qiiyhF5~>HKtgwlAeup z9OW0kLM=j(w>Q~Q=83lT#IVu?0!_<30Ts(3po^V4t$OX!V=t6YHxxZjV|k zbu;VMPp)enxl$MS0(RS~Q9RzWkRqkXrvIp$j;)tX-po`v>$%!=eok~J{knOTyaN0r!|Ul*(+|UKM+ueo4Blb$Hiq5uHby-z_@o$m{(F&^*V?)ST6Lu6gQdIN$3Zca3 z*6M6&vsn#bIH}ts0vt)wA*ilihp0BaKM6u5q+Lr0?rPqhk{DI%UuE@}kpv zyrZ=>9a+Bj^`61kn5Z9HzAYW-4YHq-MewtNSVYvU33ebQ2Dto}yovGyl#W0Su!#!Z zTNQKORQ3oZm4CH=-_S@u`;*_48@a#i8;=$x1NTqV#XJudv3D;#7%n}8dmhzR10>Uz z_r{+C)r5MQlkGM_-{MM9bcijN#6xSi&m#4xT7%-E!@9)I5c#r!ZUR(^XdYF^#=EBJ zozfFPREALU>IeKM1cu?G20Gi1f>U59DM{D`khzlgTpSHlix3YO&nL-D56MCa&2ldA zHzDbU%U9d!L{G1Y@}NI4+s{nrk}bw$KeLHD5S;~o)t_p-kq#swl5n2Mj7yz|Up{J4 zstp9Ra+nAq9NLyJ5D1O9*+#G<#s&`b4;>t%1PZKy^6X5-mJm!%KFwl-%etxVwWuL@ z%E<`Hl=bQYnR=_7w=ik+90sMURGcgcP)M2eL=ePiev-{4qaV%dbIEwp#I@OSZ4Ddtp6??XoXiD6^2`57sa$qD4@SlCKy-n@SXqvNy5&8#G z)UZOKmepMdAEX-Fof6m4gmi3-btgu2vEp1`MAu`4AoPvR?lN2x9Emj$cF#NhX2PeIR0Da z|Jl{Gt7~IRZuoz2jt(+{$Ipnyy+G>te{`|`jQl_CJKH)p{6Bs!{||k&4KEOsGJCZv zs!#zpetKo) z46n9!_1)^H_m-c2UcGRW+WqPARj7BH=*+eI{`HgpeezW8Z}6Jg-9O!eZ3!gabN9{{i<5@mbfBvEW`TI*xp0YZ8*0n45 zcx!Df0Gr=3UYa?@%HC+xp}^6 zm3l!?&K4`lQY$@+a5BqUWCr>&2YP-(ZSH6n7kxw(kVB?=?WF(Jt(A|T`j5W0+yr19 zJ$-#6qL!`>y$;$)b!s^{+CMVbbD&>#CFqIVc6F+FqyM++P}C}DZzdRwxWAUw1cRY1 zt(Iq-era*uKRwSl3ga$}%}5@_c7DWEjjBCt>k_q7y_|7^UF^!v7?z) zLaZc|I!oY+gfnP~o-KUlFFs-wtX%$Qb>SbO3c$RXVKZy1f-mKJ)o*Xm7^oV}iwS*f z-CWdqat`+CJ^#|z{-t}Yjxe=rUQExAr%4YFl0SbDJk4LY?%#T!5kY91S8w0&uU|G@ zKDfb-uLfU!gVB~B1 z)w{Jzr@2Mi=6Izpy>(fZ9)G!V@=vwJEA(aU>bs$Z(vq_+|JU~*V4u2JyR`^ISvb9N zLzvtWFpShhv!$WT=EwlXeAGoW-D(|USH1l`N427|E{&|O57U9GBuWaFkHNh$EWN=h#cI%t_RMzh>#DV**`3vE?q`T6n8(LSdaB0&0& zgW$4#V46bx0?Wi#XOdpXGSvYlvcyClAr-+QHEliF_W{cmf3d!OpBeRkJ>0_>D=gQbVx5a(d5 zfc>4g1APM{PD}@yLh{ZORyJRBnU__ zLEVm!Tb33t@IFDW=WoV{meX!|(v^0h1^)*&cMEXb>{)txz4q~y+J*aUz^wOp-t1w* zNA0hV{7V<8;yBh~9WgBrT=w1h)W3E+3Hw3fr(_O%(0I0C$1P&@rE}FgH-kl?lVs(O zw}Ed12R_FX;q9bJI`ZOf`PSF|#SdsSF{T#pL~-0Q`Eia={9iCNTJP4Nz5i+cKRd$y zKW!WSKhMSgXQ$Qwr?ahX!~JK&{|BBCGcA>mF$T6e1eiMhKOJ2=J5B$e)~=2G4?m0l zkG|T* z7|gk)V8B#FV@#ZP#(IYppbdzlD3@j@r=XkCG5a7>cgLCX?CmDko*s0JrWh1}6M*=9 zz>HC%q>66kSgCx(N%7QnvU_Q&0_1B}E4`KFgJf8;yhx5^RxnCq0VM|X`t4xY$Wp(Q zA@H#_j%CwiK=?G^bJJL!4P)^rBc}m!qTk`~8ya~N#OVD)y*>LiI2+3Nw{5S$I7v}$ z+bZKT`I)qGgD0$iiNRlsXR=XC%Zv*U3fHtO!?C^p)os5+D3*x2Vc zpbZIVvM+*gpb~M-PV2}>ZUzD&oYb)?7ts5Wu4SAk#=~44u#YMm>W2BsRLqk=#Ted7&2_Wv4 ztfS;<*CfV8uq|H5Zy^FPMm8|8eaL`|3D%>N z2@EDU24U)A^1^Pr6N5~jt7LmrDus+VX%#Pn?ib|r+q-!ndmIKo&ZBwN{+KeWg&k@c~DW2~b=VLNl>n6yni}XqYgaDkO}u zdXO#&k`swn#xg+304m1Duh|aEk9)CcfVw(>VgUGu3A;thMi~S19ev@z7xGx9BUz

    ${rI@b>^c((qtuPwe(s1~j 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 z zHEfjvv`zpBF<>LdDy(8=fC>*``!nqVvIA(hQ4zaZ37B*E9(&^aDsMH|WB9|qs#nP} z-o9EBpONgDAt1AsOOkK5FE7n7%oqnJ$dwKdIGglaSZiF#w=@3MK3+_e zJ=e2suoblptj}8Q&h_4!UFb=qsZ!|RK?zH((T+$*#cXJxT{Yjq_d zKyq?AQ!s80RkNAmG|o_6dRqCdP?%CV_Sy-qqGzu=_~rnEFnBMYQBsb96;TL{I*kx? z+R?d&L1a63VC>t_zwwFT9is=lXMoQ=mdRHPLyoHkHMq6|RN~|VcUp#V$SC>ZR4AX4 zoO1b;4B^iA8nU!XL~a>teHICnOdphiI%#&2Oodp@nF+Scdjk{ zc%NDYX0AKy)zANJ>Gof6zG4vE$|6T1pA5<(!q%dc5swC$uTM2yDbA!>+QI@kHOh-T zBJOoSPp}x4Pap|UH@nqJ(sgKQAQYo#LWTUD)Wr@t0Z~jmNLqxMr-$|{Ri4X%8*#!; zcG+~*_j78~DQk?=^F^SO!60MGb|HKL4p9bR#2?8fl20?q#RGf5J3&NuIlb-5m`kB#Z(?BZIeLVwv_BAUs z(6e{fKKnRPb^?qW6f)-|$ffuRQYp@EFk)_%Y6fu{S2v-|3LYo;D#Z^JWKoU^QFNjVl6b^zjHa6M zcJ18Rzq>6cHc#5?K!{P;0h*~Pqzsyc)&plo4?quVfHjgrXUplCN@>2F2A*`LLLZ^% z!zYi})5`rwDOnvjmL55lo`6qiWxN-#Zd>JhvbrgNdmIZPO7LKjxo+g_c_9c z#fn;E<1I8j%>4!QLQj|HrwaM3b7U#WHq8an9Q<(E&k4q)VD{(4XA8;}n*)P+lAAvc z5Sa{UPn)xvs9Ew(FittZ)v-;Y85DyAGd7n*jX=04q~?oZG1ev~p6;sF77ISfkNtfx zPj4ze)8!X)`Ajj$ZmVXJQLc*ndn@_!b+A%S1vqMb9u-}c&-N(2_RkZtH88a$$W#_ZHgi-QPUVaA1pDRq%g11N3MWvGQRPl7)?D(`(7ng7F-Twr#sMz1 z=@;_giN{z3L=+tNTt?;6It4k0zYbX8E)bqN)YpvA5!j$t))Jy)kx<83u;?Y`O1b&M zd{r$FTnRMRQg%CNnS)Wl6WXm#_@Uzt$$1vmnBi#{<;KYqz?5;&J|1%HQCvlSR3r={ zoRp(YdAmb;dok^;Pto(Y(PjKs3%jeP5dmCF(d$b;fKAT-O)s3 z2)0UyJc7YQiD-I9JP?AsQFRv5y{?@1j-V2=7^U#3I`J=Un^B|ekB>XyBUk6Ztjrz#;6%{)-o8oqOwkT z9b(WxB=)i1hqnA~KE-GP`zlT?{MEsSsP~t`k=SWH!urAnPxN$m_wGgZ2d$Co{7;8V zZNWxylFbif8UCeDeCZco2E>=0;>#}aWw-dUM||0PGPJMWpflN9uk5Z@_SY*r?3F$C z$}W3lpS`kE0HkZlokY(`@Jw63`$#9H8q(OX*CW=MPtRhX`uQB325GPUja5Buf#)xdMnMU{!+3Sphc~d zAWi|>jo_h(0Tw0CmVk_Jo#lCsqwU3eC%NQ_>lug4<8#J zotPLMX{R~vTlYNUqFf+$>3k)SpKnieaAm^K;2sCR`It-kke$PFYld6{ZOJ5}C^TS1 zy2j#3@@Vv!w;nRdntDQLM0O4E`iX>WY&-f=?eO|B1^7UqC+Ar>piO&g@OCuK2HuEl zajt5*UsL(P8D8E~n=ZUiJ0&I!n?Y}radQE~t=eLgkw+RMSYeoYe1~;htNDBZSQ-jC zCb)FL;5?4!#(wW{HnaWS39hU=X)GljFPfP{J#>dm`0g_4z8TL2Y& z;R6XD3~w%_E}<2WoWGeK$Q0t#~n?;cEc?#kYU9UGg(rB<-c+GSI`3gW@ z&4OWK8dfAs3*3N0ogQK3#FE8g2W5)s7F<@s5SPyr=NG6v^azBmiLt^h&o3sQ8Vu?; z-8*~sdg$m2au->Xx;%fOhFNAc9ZjV)=jCf=;AAmu5h2Bc{|6&Wh?{(sS~AM}NERn( zQ2AEpA9deFjR{#QFRC*Y1|6EQ3KvK4Z4?DT4)uA0V!y(iU`eH4@w;g3_+|!%kSPKl z=X^LhP{@UD%8RZh^~rJX6toQQ?Cm@047wfR)spio1iEg-o}ewc)q_V#M;LHxE%=Q+ zYw0W(ITiE~LHhxGBctOig<`%cWB6xkBpLvqywbEV^@L<{N74YZ6bat^nmd5LfihTw zrIQ{~zygPb4HwuBy#3J7{BgIh>@_8tOg4?=AC^ua_S&2YcVvtr5Y1iHntReY!Wai} zmf7AoHhOp;1uo5?%TGQ>I}q{QIU{KCoWp=irp>i=mjD$U zv8~=h%4OchM#JzFSr;49iYIr1sy;sC33p_-qcV%M>Tt*&TsO`BakR|l$@>RguV9sP z6532+=jDf2v>+HNPdr(b2uV^SF;BAMM(@24AbxffdL*x3Jlmm5a=80ieIhB4;b90nX3&Fr|`WL zFWujoa@5TtGVxm!auJ&aUWyF16eogGWYnZMp^zfOABDv^V=%b}V_-A~aE5 z6{VSS9BtP2{|`On*q(|y=3?mQ)?i!xYzNxE>W+#}=U0#F4~61C)X)+v`oa+wec>r~ z%{?Tj#QKGna59}VvIN@(QZuMu;9-_?=1EOzwpcMy)|3uML{Q)}&|)aiM6CN$O#_QP zOq6)~nURAOYh=VHt4Aa@tQ$($q0VPd<)$&BxjT{%ywqbXWePzg9{kZtwB`J%z@P@- zTdGRYW@TR9=~BEv%_XJB(ka^}3Zr1xiP$GE(h9<_D%`F`IaRA0FP?Ohx{zH$3nrrT zMv+~@5BM^TE|Bx+pEjGR_&J@&!|Q5= zbPJrG!&$lP`xWKVb_=a=l11afoG!4!E!38B7prfQ4sB}OnL-;V;}+G<)hC80Q45S2 zV9~FL4P($Ht46*G2(&uehBlvdVLpvLOc>82oYU|rMC(k6IgzncoV?}aV4HwCMm8s0 z7}emL0I^P3yvgWmnZ%P0Fv=KQw9Kal-EI&3ZPIaX(sozT@I`T5iEw{V&5XRSmK4+&j6ph2Jlv-UjY9d7A$9fs53=~IlrkX zKf*rG#}XLl#o)Xyx4j>?3)>wnY#P-#uQLkj5IUk816 z$MSm$9bnmcH0YiPv3X0U^MrmBv>sg3dFIoA-A8_t1707_x*hAslmVij2OngI<2G9a zq*^=X@q#<_!%yg{d3bAg?iiorxOo@G06ANs5jz@j9RI=ERq^@~bBj>oi--Z4clZ$Q zyc_dXBv-|In9En^GPUgNx&nSohJp0Pk31!2)rJ!2#Wuz$HAecF4lsGdV~n=PSnqw} zCmb(cC*Iv+%(L)7?Nlj&#r@&Ee9pJS*TGHhyZ1o}Bk7HHMaq_#wmLB&HVdZo8^4Z) zSiej$hFPJ9?3!DM8=k9CdmgzIHhM?{wc!oBc7}{r6bK}IWOYnwQJ-MP2(S>K^*tAM zH;2cL&~O@gXeId9)MCxA8rN}H!O%bq)`02aOCX_Q=xNzP1T-hKVR5FfRw}VL9{ZTT z?3Nsp?ntn+mp_3Z4th(m2debF&Y*948OKP4Wd)y5_MxXM9aJc~Jd47o(PRp%yFj5V z^pG;d!Pd-sCOv~4`oh|1flMW^B9pb)iWI>Ep)P*boV8IWtyZP9p-yUDoz&4DW3x7V zqppL3O`*ye+SzK|pJs^q%R%>BRnzp#=V0f=SDHJliB71A zaHhko<%2nxyh1vE**35HD|A;!2F8>bwY9Y2pPluyr#MWSfxb0(jTM;-y)mGl8&K;g z6vQ2AE26=F2(ur5TRZvq|2TfVl}*tS*Zy!g^mUx=Bh4sBPUL52mz}Y)ZHBo$R#|YU z&|J$k1!oF%Bi-QeNammas$QiAWf_MVabSXlI`^JV-YSjcKeyJ1n?;U-qwi zNB55Zc`UQ=G>A!lWqtbSVSiztJw5#c!FPP#+tb(E_X}^~VE|wrO`*{JFa9(C`u2Ep zwfvkv)Vq6cPw(FTo}E42z5RUy{XPAgezEcQZ~uqqCxsBN?f^~mN8iYRf&_5x7J?UajTwrS94N+9Qm|htF7oLteQ$>lX^? z=jTf`Jp*dK2=c2;j4-ccbI+8;3D5kJu^{tIW}i?17_9!Jd1CYIi3)q9Pan7@4BczLcN8G1e;=sW(tbPSbcsbJL?geWNR1H=rei)>1fUEBP`K1Xu|e&k1j{*EQ`u*YQ~Sxeo8-Ad7-tt)rm2}%36(Zd~|r^Sr}qL zEz_%)`StMFw_MniK?u%>8BP|Bp{WSNoVTIm!8 z4h;~N4q5d9717RGe!^~MZ{pD`K4n%#NhDsY6ti>X1ocWUQ`#o9+vHC+^CO5Xy0r># zg8`%Cxnf5$CP7q z&R<@>cVqd(R~nbjE&cO+{nESjZ{DxJbp5Bh7moaD0vLgbk^1G&>sKz-U;W^xyBGi8 z*_WuXH*eNozutK7yOr0zhA&G$+-_XG2r^=YWhkNMsP#X+Qory~{m$+BmG>XKc7@f} zE`o+kSk;VR8E876nJW0!i_CnjG)MC!>s-|;z#2@KQN+~Vp#c@dZT(^KbTvI)$W&*o z$NB@b{#I(G>W+i(Wqk7JM9Ax^KUbcuguKk>rqh{RE{~(H+Jj@R4fgX{KT}Qv+iO(G z{;!FnN9@w4r>mx(NhpK0iqnsl(sGxqI3Q<2D5~%mOe6kcy!{}@PSbw9|ZvF z&CzyrdG@bDPHYJ7ILe)kH9g1_=B zRiuXfUZU~+o%-vad7Rj$QCkCqpoRm7TJJS({9n3@frJC#D}tM+(@><6pF+2)bRvP2 z!_Os!P)9hN&z+c@NCPcRA2>Xc9vev?9{$ZqC4}Ph_gj4`m5n_16-KisCO6o!~j79K^9ppJ#TKcRw}3Au%OFJ`m17TcD}4X z@{4%ris4@u-E#OP5c+6j*l_wnTw6Ca3v$C;YigdA3yX zpBAs?U=J@~XH~q5TSJGS7kkdoQRCGwUar6Shx(syHQs*%$i~Eo2aHbRt;DC#n@KDLLB+&=wi&n8@~!yv1+jlY)frAL50NIl-IGPN;iJ=gE7S# zCf$`7fZU_#2L=KdvM97O*kba2@Bz_+7Y60;#8&vJYYBtI>r|4WxpXQ_`h%}8t=v54 zjg5HhTxz_3v;O9n^&1!K=dWWi#*yPM;FW`7Ki&Nh-*kEPD__^opIf={15%5dmw_A4 zbp0;n4R`&PnDBFrcW%KOc-+&qmpxhf;rI0me_XzOA0DRJqm}!gK%wQoehH7d;1O&3 z!8`Zsx4&F@?H~19fAD&}r60a#h1lDrA1<%Fd~fN_HQ8R{!n?Ae`rWhjFTUNeeCMtD ztslia{wF1VhBMKt|9GBFoK1>eDr!|e$@-fY8vl6br@NO(QOO@Z`1liexXH2e$O#<| zQ*$$EftGTl!GsgH=Va2M2MyIK)27rk%AR$w15|oL8-@MX0?1Sw7Y&w-m+5Ud`rvoh zHdlAN4h|9qWYpB2y6cPK8mJ|aNyQ-*dBm8>z$HRt1?DX@BAEs*#d28QosX7x9 zvPoJ5^ev7;uS>{<&9)nNRpYbQ>aV>jo?TQ?n`mLV;xk4<9vMQ&ttNEiBjbEDgqNZ= zqP^se5cy4yW0&K2lZ$*fA#zNrFRwo&&EHlH(o*7 z)cEELkooIZZUVlmwO8)H-?;jTd9 zK<&`C?1J;t)A@y9rMTRmCflU&`3>SKpCN7$IC^ffmGxfqI&cN%t8iezHXlAdc@&t) zL+Odh@v$RMd1q2;NwiF*F~gowcFh}SH!*2I5WHJ&_r^pH`W*s0j1QSgW} z3Ov>T6m#Y9$(>Qd&=HS6Unnp<+bd$j1Pj417nT9O3NDK$j4Gn>4IXz_OY;?A5c9c| zWanjs80~$MNG@vtUrZM=GfJkqC~_1uM+ksE#l|DtCALXkuorTYa%A#JlDLiTEr>nA z_+_*ClidtY)s*$h>{)TUeeq76w3s*{csF-tS9=POT?mbX$@!++~D>vUUqdyqK{S_agS6zhJ z&ruK=?#=T;zED6wRTiVhuce-MTrBWbKEJ;F1!o523gMYZDaJ}9r&bsA`*v@PvoIjwYIIa z?08KS-*ksCRq|SL1ox&lkZhJs>deE|3UFmgoFKvLs=Vb);?2AD*KQ-XeE&UD{Hvxh zy_ajbeS4xeDi16T1$7{;M$w|>z}RMySMbiH$WkmzdYCY=1(hMeObTqhx(hB z8s7-osJCAzWvG3Mn#+_tK_|TEWTtvbs+71ciYj7idvg!7Inh9Nu&FKGxdSXP3iVg7 zFaQ3p%YXSjdjjL+?69hPf}uY+cfWrAGVGds(PKp$pIvC&{u8vtrFi_GS?>6h@4jC@ ze_{FdSHPsR#z2ro-S~cQ`SZUn-+g!avvZOqu!sj7MQ}*?IdN~W2J_`1yfc*lF=Eg#)UUE34$adK?)RIp}KFa;bKZoh1ud` z^J{(r-&mKI!mf)E2}PwKJ6#>NO!hiqT)q>ou}xMn(Os)%r)OXtyZ=wM1Qd;yRa6$A zj2jSWboC-@wDB&S9N)pgvvlVge}|{a$1m5fpKE-4t#SKJz_rE?=a>KcHnXFEcm@c2 z{u&{ftL4AD8o&SX@;e_;1C4iXH7?(%|MNSB_aOc8ikk!(QO@Hrejbl-i6DZqOLWO3mnpo z3-2;mE36cw6-)yRgWwCRGl}%i$k@2onWKzuC8AuFgn2$rj2svqA4x+=Me~%yM7}So zVgm}p%#7-FD#tSZy)cWO0tt4^P?AbCB3Gyp%3VYVY@AsxZ7tK)6=nBr+CEF=M~Bgx~H{?~t5N2X|Qchlx}VRN(`qCM9U>{<|}tBJw1yW&D- z3#F)ayxcAqEknN~3@5V+Ey8?Fs>pTS`_A_YBr}ohygyoq= z`#$UqWk~};fT~cWx-fEu1ri3=C2DOB6AGG~q0Z8__*fE z%P2!m(14THjgwYrycIoE9ZD0aO04!F1WryRcPzZGzykAN5QI=Af}x>Rd0)RaFpCXS z2EHH>NW!y3TU41!(h`cSzJeXm?#ZF<2f_WbrPv=DjMcSaiY2*c7?XpW#sV%3CG0>^ zRFAIp7o1Z`pi#^v5Mw=33Wfq)pBOqEfHf zGhfD4Zd)PEWZR|Ne{8&a?ZMmUWE=tBESYhU#grD_10;JL#^-8;pUqm0Shw1l6vr&Z zk-->(jP!;w{o-5oyJrcFtyn~i_#iGJJCM-ae3;D=Z&Unwd~9-*LfA-Y*1n@}Q;pCm zVPDvI$QCyC?r8~Bjtn{sEr`gV&>9k2>#rTg99Ax-cln!lNpHoa9*~h#!3Sid#>KBz zKEEXB!Pt(Ya7>b&ROf+vy9wDnGEfA{A%p`ei0*v4a^v&mH*TRug@}!)*VoOlk4bK< zTTL$0ggH^IzuQwQkj%-McE-jdf&1Zdpq``J3bE68;?+nLCMB^MWvYm=ceJP^5DUW|qA!{C56Hf;x0cUH~U6l}P$Js3@yeB)1 z^^z(>rbi4^$HFwH>Qm)@0VY*pL(!ga|APmwAu2O?<6e6EZ>m)fy@1_I5$MPQ-B?mX zc{|1jsU1SrH0L`HpUtsOAB$!Yo+HPfu<33rn&>8a{O~m{kXff_HLX_5X#JsQ z4LUG>e8f9i=Go<{Ka;AEtEv_rZ~z|G}4s0E}!ewNabxU+{Q$QXfiL_{E} zz`T)yE7JA5z@~l&WTNr6m%OnNp#JrXmzV!?lTok6l{c4u{D}MheDmk!&(Xzx<>og_ z|GbEY(%6W0+u4OlXxQibKls|UpLvO>9ue}Da5`o0`nK`zEjR}n7v61L{BileZ!g_LA2fJa|I;VR`GB?{ ze<5E*aVkwNcR&HVlr%$l*TH(RdP5Yh-nq;5H(up7vajyZ055TMA1*1I)T@7A{`%bi zXYXCx+c=Iy;r+~CF~V6<00oi&Nl`K(NQahahsTo0N2Fr=$U1mHU_inG0R#g`Vq`v# zbCEAu%ho226DPJ~CywpijV14HHjynk{xPpWQJ?Y`-ma?dp6;HW!2qOWJEnIdVrKeU zU0q#OT^G%Q>1({cvdIN;ud*WYk_>dorRv|tz#>DzLTkz)oPfF1)qZtt{^hTN8ApS? zX?RnO5PxAg+l+9zZCN~N4D%Sy=D0cf8Ko0n+S1xG2IgG=y!`lIm3BM6~(prF5;nl&JLIET`>7XpZtxZ^U z-Os{r$b7FgsecS_Ts6e^o7UfI4XdA`#;o~nsDm~>7^Bv{hPUsVR*8lK#$v_=yV4YW zQT!bkJrK>PZ;xTxUfY)$XELLTB~Qdspp ziK2DE!ZSg`cMWK|>xwd(_&zN{|3!dPyjWDYsjsyO>S&;OyZE?Zyw(sx`xcI1Hb<3o zV0;n##8xDTgaOwZ1qi`!Izk4&&p6YWVCwJuqSgFCeDFWGd%{($7 zIYvp0J`HwTMbE_7@RF%TtGEfdv`T@4eZz%hF5rKGU|$)>UiQReh&#HN{v)ZFAkcxTmU z?xAv-{ql6Rs@G2TVB);k`D!?av|hYIraLka$OzdY#o-2dpZqt}`u1>y!HDJkFn_>l zL5d^^zHc!%7>-gEu<#$|t9-tGLC1c<6jlt5uo7SgC9SE1@`065CQz%~i~FlYvwm7z z;XGd@g5lGe=*8((qS-vHt#JOX62aW*pbh2fDiJK5)P8Oy}7kY4^|Be^u?oLjlq~RLgiRo8G$1B_u(DBr zLqXGsiKC<6%$mE#fbAwDCXD*_n6iHqrYxYMldO(pZ^D#ygYt9z@pL=p>vo&B+a>;P zw|Tr>;`4Ti*Lx)V-b3d39u?pB5O}}A_`eD5Jo;wvQvz0*@6;_P&N@;AiH|hIPDYyR zV8jNp)+!22BX3<@7aRwS#6kBssY|A%qrb( z<~5+9@Ic08vCYahANlRvqx1rn5i@0^&t7o@ABGojIAOB6nGeV&#XIs0itdA@zA7W2 zdPo7nhwfxc2yF4%Td7AIB~p#8 zh@l_0|8}kWvw!>h-QPgmM{q=-IB4Au{-b;Cn(!6Af9Drl@BQ@Nm%j)EJLGh}!Ot^( ze3_@f2&W}c$}53iy_HmU#gyiFXVFYWXrqE&cVX(NFcp;Ha%a^+Md+P^{&r!Cr!Zxc z;cREsHic=J3{N|&imA6+Db&rbhhC|dE-A#vE>f8kLxB|TVAo576s0w?c-Muhjlxt# z+DoOVRX=3D_LUq#rI2_u${3m;|AkS`rvB02DuwMjp8>qzLX|tlTYs=UH9BE#Z_z59 zxN4jpK5wz~IMKQr%cnrKP=!rsftc~i@Jw@)O1i-+KjsRh6%d%&5e!j~`nf5i;J6(I zl>(E7iv3g-K}9MRc4!Pxu~udL=m7Ob+Kn~?TOZa`94_Br0WIuwW@r_ufI?7^T;^+T zU%Z2{!CoQXdL~@UfKgP5=8j~C>WyPk)dz21+y3g!?r-0_f9GxXFN8w+%}-fv#Vw6D z;9aaXn@W9j$NTGlZ-4bN)DXQgIiGMt5$wMs5+yE+sdNow0l=tS-B(_E@WKCdfAq%v zkMEcob`(rGtdH`IW{n?9Wy}t_EhppV%}}zNu?P0x?Hk=!{$d*#ZeR4lWk8WAbu3T& z+BQr%7K)F3=i~c#KHa|g0YjC0U%mt(<`C)3zM{vv{pFvwuKyn5ZCWdvJhEI@;AwT3 zV2~>qB6uEiijf>fURca7?MOmtjpG_zf&kROiogmSlCuf^IF;>Nf8F}eA9sKB&eo^D z4~NO-PP~6rLaGc&C9n`v4xYjsr}|O2@dIpEtwvPhxhn_aZk&ueKO%R0R_^%F)GS}V zTLE1E=H65dV*n5GE-Pb;UaP7MFoQ$^V*%zY9?fZP(JKFb- z_JNM}Z~g)PXjHRHC!G@z_H_?tJ-(b+Z77KzG0V zYLdb^Q+5sLN+hf2sV+_|oOxpYNyvENIEit(g&ZgJOPDHNEnkNWOh}nuhGM2=78!#n zi3U_)|LEC!;bl^cB>|zg+jMUQTX(52zr+U13XL%`2)de7im$YuG}<3d>HjP(oN-3r zlx15B0`m8aNs8OenEm|^Zr=OqT@{=Zl2M(x&o8=luhVj6aNKIE=k$rOa==~=rxM0ucfD>cD(pO~FLWw)WQZOtHbDS!;cP3V63 zc`N{PhTH_Pc^@2Hknk|>W-#^MYZjhJrsv{CRo%%d@}P$PI`&LdVYQnX=D5<%08UaLW7OsR&xAybY#Xnc|btAu>q zy3CADhfrhX`E;M>&b>RYQ~Z7cDnEKCiWLUf#Y^n&zkbQ~me@~QZ{A|ehgc0(xO?j* z+IN)yfT}~u?VEpNOzndg?`;3=U+>+1-D!1dt~XvRVNCIHO8VgT z;GHV_swajeQSO4=1as&3z@)TFNA!MpGI=LbHh zWJ$}q+(+g$!Pa8Kd1nU+*n(}+`0_hS!xj>SdY>3FYjL0GDro;|3f>_B^=^HB?~B*9 zQ%pwo<`MxVRk`(f_lq~#na@GbjsjYmdw2fGksgWC{a0Vvdgo7;0DFAUfpNkqi!D<0 zK>wVTD=Ll_zmz;&{8xCqjE(rG3uaeI^7TsjW)QaYd&(f_uzzeKdJx(P=f9F?T#wUD z8Fs*5G{BPT3Z!CN8-f(2Y%;w;SC@dCVJ0rmNn(zgj_2~_l)=|RAQaS}(CUlijXWnb zPvXLNXO9a36BS9@*^ld^SALVkIajquX8%;Mc zlTdgoHtdA>IdgSvY;1E=Z<_*2`VI4xxX@aaRY_3t-2}fXkT0O6Ayw~atQ)Avn1lkn z7K3}v{0swy>&SJvwokh4g_Y+S*FDePCZQ7R73X7Is`ynI7eaOCy`?s!NAYfazPU<9b+8Wb@*HvL9^YBf*7uZR?F2-8bG6Iuc-Nw*T{kK#T|&QOI@-l9-fl45L-rACt;zkgerX4p z0qvqtwFd^RlXw*p5ZgaBAgNYl&RkZ2hE6H%G8TN4ZA5ukkbG+cxPfv!6|UGyNOy$- z1(#l$Rfpg7D@W&XCjk+{ORbG&8`9=MWc5T`ObtPk%^u82u$GPO3qeywUZn#~9=sOW zSIWs;eQ+#NFXd+$*76P_h^4NB!XXRQ!~U{8em(UU%~$a@>|(klGi=0>sU*uGM9xp9pDg-U`fJ}M$ZTdJp}N2Eq~m({hxxj^k% zDhoOFm-ki@yKri(Kq^X^;!k6Q9hp8y2E$K6Wsz4C&c*I)Z&CgMh*15vubA}l;Mdo- zZ^>(ZZ3kdw9jEuPE_#pViTP7=&PWBU$Sat3*9T(aazdS4rKxF>uy@>I&`&OAqTO&^ zZsqu2VAI$+0hjQtD4ph$5>V2)D-m;nJ~JN z&uMGEG5*}8&kGWa=*FO!XbIh9jAp?7B}Ow)Oo9zOW{hTZua_7N>J>!OhVzWkiRwfU zqYJgT=s@#B2+TqAgo!l?t%g4f-KECpN6Rk~-GL}7S~jwa$jWCr>nm={sH}KRi2BMa zvx&zWjhfMb=5QmL&|b!91U+%&9)O1!mAGS$1SmbG;&{{Uf6H=F3aPQY%IJw*q)b) zo{PpxCARRj6YzBJ_J{XBzHVf%?ll>MV^eu?(vZe%VKLZ1A8;{UuX{i!+#5UIq_q=v zfGI=$olRKxt?e=0FgM${E3C7#11&K&vC}m+{MCCda;OV?yopOTdw?0Ux@QKb*uE2e zk2%`>>f=pL<=6(8AFm!YKjMtU{4C!7$qr-AveSijN||M~&aZJ$@oA|wndxVmy09|9 zM4^F&`f0PeIa!b^w5bLX{qlm#t&U3t`#SwmTPnWP;?GdZ!N(HIJf{>BrCZ4+ZeJuejS!fpGjPw(CN zL-*}Z$lLJV?VsJd4Hs^x;Q*V8GAqh$2(N0lGdaV>^7=37o{lG|7KcQghl|bWPLAj# zDGH%+RHfSTlu~dkee@Pw2EPCD_D#Jgzw|3tTfzaE+m(`w2;C&=w}()FQ{EP~uN2z3 zSO8%p!?=0rzVvqY+8=%Ih44NN#}jqvio<@-YZ;y-lUtba)a-_vzEB{MF+G;y2fs37 z)>iupAdmhsC0jAPQNrLTb&BmPDA@6}P_N>`uVo>-r`0(`^d=FB0hes2%rL34Z_D+c z^+r_f)p~D*tWby@XYg9|T%C+r!0pGsZSxig}Y zey$#{d>D$Z;?PZ}enA>}dx{_Bz=D>G0asoutVK)Kz#J!L2FD*i=1B z{?hgPZ~kuUl^geN-%)+^l+CHp7NR$P-(z^GPj*Mzd4O%dZM3SIT#dgI%sAWNV59YY-E2!VkkPVh;B@t?QWf=dE zE4jt|r`=$id>k%8+E>PS5}=;`O*_aAUPWhi^629G6%V_0x3%hit-H3Lt+##iZ(svT zUUToi-2LiT;Dqqek020Hv0Qe#FMr97qV11A>b~)>6x>_7Dxy_3lR;Dv2nk!?Ug+z{ zupJqeSHQXuC2Q7G_Zp86e*g8)w%&P_HiCNO?IUoir>q||o(Cll#YZfVG|oU#E7a6G zY+}XM`R>NK6tK zDo!gI+z~YKqUEcM1E3zRk-i+bU<~WXF$j)ah?z`|N3@RjZhuNu*wSsk{AcNXIlldu zYmECxMxX5NyI);<@WCDKQF8L^>}iJ;hTZ+!_wU{Qf&w7lyZf8%n_oTn)lH0k%%Oh; zCQ3$DNdpsv5j$gP;T@yvN3xGi2>aa$d5FXz)oA?N(+(`nS>Hy-Pag+=v?LUGZyh%- z7Vm9^i6*eiYK_uGvD%>nY1G&jls$yGutG7LzpC?s`tHc%^UIpmT1~@gV|bmqI>1=& zs6OOZ8xefLDqZi>ojMF6=Zm!r=Ji!1;@E^@4Q{iG7NMV5Bg$pCe&zkb3yxZfE;y9S z=NDeET3oAj4m>M@%O?k~BsQr7*U zBcOij^xWeucfD~b5YNKV;#us<&J{{12q;o^>u^~3UT+pZwrHTk7(>7~NCZIqZ^rDF z2mV-bSF80TY?xtx?1uD|50Rcg8Ndfmkfvp=mV*bL(QAdBsNNcO>-U;=^v+bGvYS{z z9H5#?C}L%e#gp?&;xYB4+de@FKj7(mte2XbME@1eG9WkQw%BqSfGE~C3e|d{VMk%?;HHz*!bA^|6VL! z`JM}S{c!ro(0^fnGnvUL|2MqPW+t)||KwbG6aeTjk)Xx8|BkNz#1Us5u3qxl!$-2& z>B+-WN5&p|EIWN<`pDkS{SN%cj)rEV&JH|p9B8^*>VW6{xYsJ-bEVxJEA7VqpPr&U zet7y2?ez(<=ch9h)0uzD9%5U5YI<^Viha)>o;o!7Pfq4h?*H|o=T$4=upU3eYV{_toyr_wK*`891V&4Jn2W0JnaA$$INf_ocT+!?DzP++yAot<(G6*Nn!Rr{8)xY z;h``v?i3_4TwG#uHR`Q~{#UhLs&$xbmJrZbOBgSK2StDcK9w3Rm%T)V%rZo4Mll^* zM@97ss9bQWAaOu_i%3LZ#zs3XqSzWXvAW^E3>f#-c=j=E5@kT@s;%bQzXCT z*(aI6B33DZx8BY!Mv~1V(x6^z>zAKxUB5}0yWs6^_TtEhwXo4ZgLdm(>XrH`6Cb7&+>6ul@J-k1)~>+^A4LLPd9K{&DtlqJTpffj)9Z z`e@bwM;;ny_l-Yp{qCpIB?=aVEmosdSoc=XPaK-QkPFn`dgnz-5c=TFx3_QI+WN~Y zTR*ym)(bfW06e5oGys5DX|q?M!lti0<^r?#!EBp;;d`@ZPJ$iC8VY~8!1Vb5wfTd( zV0ua>2FL}|Z^IB!KTXlYdF*&?=KR(mdgkS7>+700AD^5!4c;NTD=90Zvfa<#&|)n^ ztO!KJWf<`{jRkbn0GuNPFGce*LfAH{PP9mhk0UU&7bD0;YZb z8qF;&&0`=M8Y2khlAhC&Cxe85elfY6w+2>AN&`gkqv}08qDt8k>F)7i5mhzDGF}on zG-F1;ZZS?{oc&?khI(Ozu`FR5T`pEN_yl)anxM&T7}q^{9}G>fioR-40X0+{J;q*g zT}fbhc^`UZbD_;v)QFofpi9M?7#P>|mLWea`=dRMfSqEcti}8ipDr^wz%{FxI}r4LE&JIOA-0XSlvpDc9kao=VC6STcq50BVpa-pRuMojbdb9Igo6BYU$n zx10nhrX6~X@5vUzfDfdvC|xX2oDhiRnp6;4sJ)=(unGUd ztewWTQ?hZlUQY5iwpbG4Saj$f+z%%q4{&_1!lG06s;iI@qt;;Z3~?B>;;ILit-KcI zWx>f zz1o^xT%0=-V_a0OS8FHO@Z$^(%k^q(`RutfCwjMq#d@_h_soe?y_P6W5T~@{Lb+OrVm=05P06x1z+`L&$b=X70rD+)0adl!!G2y@?rutuSK}>Ud2VVIUlB_K1;1 zK_jP%s=g!~F7i5gQ@57P`aDI5?nH~+4xb|C>c`bW106^)f*GcaN~{8C$KS0}L5I zlLaKj8>ULOpqin(1OSgKNdX!WB6$kWC|YBGm6i-agr*wSplrpAryP#1)&O?~2C6$6 z@-Y2Jq*0;{jZf$FLYn^tvak;LR z&DpnX}vSX?NFyCw*%k@HU~PvAF|kh{Eny} zQWc>z_mEhQSo-2`3PWPi zxfv6LS1Lmic2Gs}4N4eXBm-E?*^9sZHfrQnfxv*Ur&Wk9Jjtv7)s@p&y zoX}S~m5STa{6yr#$jV0B^{|Nm#P9^9%JkDOI^c2Ww_s5*?+XKSUng3qXdOI7dI@AA zpL)sM&IoXIv}s3$acI((k{K*M2$WVS7swVfdW`PlorA&emhkRMkbK^2NKTEpg(u8> z8PV>T)|MYO&9#R6x6;eA0787j$jlERCT^?LZ&uXsU4~ay_H9P|Y3$7gEw$Zx%>5=x z?`X^MM!q?_PGjjYegjRMN9X4|&s{H8QJs=^e7(H7Vf_-u&I;eWw2u1jZNe3UY^%Th z3!}GgOfj<2;74Os4)(Y2zrkDZX#nm{_h3YXoRGcgx$Z^#)-+6-?0c@yEnwScx>kY> zXL`!OF+PCYP+)oU!rm(OqlfAte_kcPlOr#u;!VgPjt2?)D8-4d+6*W2;z?jp<6C^YR5w8My4=wF~+Js9y1~n?qI_qNk4MQ+i|c2LjH51BHX2%`$CU!1nx^}e zTScQ6kXM?K3{1JL5e(Q_KwA>vHQeY3};>w0dKLIsxg69uqCobd$<1vb5 z0IhpP-GDNQIfd2XbVzxJ(X7+)gJ{T+%EsiIR16W-qMA|$bG}u&z~*(}xy*rFY$4}mBG``oU<7QpuIr9RtC?6TNw<{m~NX8pRUq! zTI>%DyMqB_Hj2|%)>AC+=`l=Ng)8u=)EMjiY~FtWwH!@&ceQe7F`n5TUiUhK*B=&M zKLiB?MgQQ@MIN3Tad1bjy74ZNAc$VuEks&gs^!78pjOcJ7R^>;wZ-}(E7D@NWsH;nYT9Lm5!V+nkO8_6SR3_v&iHcuFGnb`j7 zo%^5gn9F`V0(BhxLJ#@#oDuU}yY5Om>LNPBDn}m~j6T$q3~zL(QPr|b=_V)v+d|sQ z3)*(0&A`PS@^E}({++*hInlUW=kcJ?GJk)q)^YGoJ(Vz~nlwy6**_`2tCUTXqryEH zOI|lwwg6XkkwwSFVFgcio&bOwe!lak?mM69W7H6?g2Pj{V&d|OmOscZ9&5o-4T5#l z^;R}q&WOPoq@$}1)(!-3taqB>%0MF$hfFLZwu=#vC}{@fQ0GXMg7HCZdcQa$q_I&P zoj}x-cB@$TSa%fXog3O%Ez8I@#W(yiK^HXdQ&7k^HZy0=P))JX3u83gu)w=94aA&$ zfT^%4AQe6%4AJcn4^j4Up!t?e6|&?Jz{sW*fToqrU}!5v18hWggGS3PIE83`**9)U z1X%|w#`iTt6@L!qt>~f6L^(wRMoIpsq|$6!p|WYmKU*V*g_#%r4f1N7SUjiV1BB~( zc7E>ENlRGx5P}W4FeI&}G#H5x8m*2xKxKwFJZI!q7dsu*3jDz*1S+kokOn1yAcU$u zrM4Lw2Pt{)d>qLBbmFmE3cZfQX=&%qLuR%7p_!c5x0=-&{5Wkr!s9gZ{y;K}>MV4I zv4R$I{t%HbS(=-BssQmaauJ+ZrR~;g!Oarh;L_Z(x-|?!aIP87x2e#5^lV$C+Di*o z;=Evl2vJ^O{Eld)Kg1C2pD7HZS}`(4eOI|Ez+PmY6c!=KGKDeY*yZ&wCoWK&H-6+twc1>NSs3HZAV0vzhXs#RU#Vd63#8N{kP8@1hp1yrI zf^5qOKbA8#g;9U1B3u5C-BB7voJUYkz!I*kA=`_u>|t*tpd*+ljPcxPIJIJH6*wo@ zD#x7tKkS5T62F7A-+ph8X?8qBm@Jtmsmg3x&QpI3#!1@0RZ@ueuf_i%w{zW9Z2p8( zkJxMpM95|+s~!4$vk~pp-30lGuY5YHAkGf8EAl{d4l13eRm>dKKJ22NWk9`&g~S>> zOvtL(RwnGI^?_~CM_7z^?1M3g8T+BrGQXSnrT|Q!rc8jb4hBOIjAfLgIq-#?FZRBD<_?K_|U=c2pewIQcTX{Y-?Jpa$($-`{_Yx#dBGLwg<_wxUI z9r=I!6<2~AFIS88rL|&xVaZtn3~`;O+zn@ml`F2g&b*ctNTl20nSvPuGC6_ifV)3? zzkBN?CImv3h);jr{qZLlvGo4OKYH-)trHK&zZ zciY7oR_-U9l}i4frG+yoQKV34h*E5ks@yDS-rxcv>J6G1UAdPt85Mw7hV3u5f1dG{e@}6LZ8UYs~~p&!0It z_e_C3^3t@X3G5D1-F*1*{XhS{d-s>!Pk(j)Paoa8{a+7$`BnFekJO$|&pyMOIW>1i zO@Pc+N%jMU;DMoz_MVA7@Cj-jbh4=wb^OT(-FJWGhyUd;;!a*y{lvmb3_RkpVeQH8 zoU!`;17o=z9}En*)P|ZtT_lqyfo06E3p$9jNE4$N)dkakIFXq_^Iz`&^6l;4|Hsywce*d%*?#d__mzKR#0)9ae}A&|Qy?9jzEQCCg6BN=!|RL= zuw5+ko8AB5=Dn}py?6UMMDG3lf84+O*7mJ`?Y{j9Bp-Y2t*zHz4d!D&;#vUZ1He2< zSj~P(b!trye*>fOuBq82-<^GMAwqE?0qE0hN9L=77T-Dl-OX7d2QDc*1m_X1CLV&M-`_C`^j|ICwB{pK-o=!B?7DqpF}zi1lGh zJhAoOPanMaKGGRDVs2aytnGU7qFaE?;V&$ckLAL$-vu@{U1Ngzl$B?X3Dngq0s&+? z4Qxj?kl63xtp`-*6>Ql-KK{ejdp8Uc1<4BZlSj#l(=4_;m#Cbcfg9cwJn(zM7uB+N z{=#`Xsk)%u3$T)!B1pD`Dj@b1{_=u>t3<9A$OJXzbqGe@ski;*q=A+i%?(m8FD;)v zd2W#_m}Rf3ei_Q9j6Rg6+Kr27O2ulipGhdq0G}3Dj#B3erPxlQ;T)BdR+X;pR=w2R zNCMQb*af&ky9f&zLhVNxwO8&3Wxey^<%1qc2p>&9gDu*2 z#$WF+ZjI3DGr~6&vwVdcq>*noYzQVJ>=Ay6^*XPepD@R(nN2MYR*j}aPJ!k+>-uy? zvKjA1;}ev~R0hKCr3m`1q{4>zCtljZ9;6**gACW)dYF<95Jh=`y6^8V+4bK&EM1W@ zZ~gjK_r^z@zkKHtH5&jM3(P?o801dh7j}>cjWW@Hvq9r_;;S#&a&Nu$8LYV8C7Zjl z2!X(3un~%Fbx;ib(!teZ2pw$9-xQleA*~@j?6WadE$Sbc94fHx-VV^gMwaj0d7W_Z z-tA8zPvF}hGC11zOAB3ENSXg=H_fBn7xD4_!OPdXcfKI_L4MiSf6m~?n4j*=-zeB9 z4=Ed$9eQx(0%wbQ9%^Xj>7-jUoia}mh=76>Bi01D80b}DVTjV2Obp*-rS&GBCDjXZ zQ(G-?IM&NCq-=iB>Q0g+^?j){Ah(kCE}M$7;jy$XMn6agVUh3#+^T**wv10Gwo4J; zzDcnk)CPbVOw!KWDS{^aU|m)kaOnnr+8KG?!&n;lR3K-~g_Y+aSDebdK&e#J zrMTZ@VYXaeLV0|-!CQjbY?0d=O*fI&1_!U;j3xm-3F8|*1}{Zqiylpu8tb4Z0_GH} z^5=M!nY3B-WL11JE1v1Buehy1ujJEOC@LMxSMi!akGc+IF%T`tH)aEmGx6H2zE<== zbHv~%>+@H&YNaf?X?;<+Gxfc4u?vT3Pb`E^83@jYDmRXB;;TteQYdC50su(odjhvwqSs;7 zgA`EP^30=L7y1!sm|q!`;b-q}fB9t($^hnS;e;U;NqESRljc#r<|@D@WO9RY1UL+y z#WM2rH_!Y4s+tx@~d%aMFAl)wa9t11<@Va#l~eZK7K9?5%bb zrBb@;~a-z^qDPt-(*a7Gc(6fIW+d7tCcfDWb z9Jh6>pXsuxd2hMZak2S9z^t76wod)eQ5~AW1T1w?iBB^A)~`P9-g@c5&;R(~&aby` zet7Tpbx4$b>n@mRYf^t)xDn@Jg&BV8f9SGa zLswVrNpus`EfKTdTQtx(cSGq(b_rw;!AYnlN$|hEs)nAWL;(X&Xbv?(_*$toR>C-J z*=iU`u>mF=TssWb0k__~Md(80pA=AQ6flf3YdIC)uaGN_z=q`ScVFp#^y97f-r0KR z)xY0;ReBd9>Pl`y9&_r&FQ2W?ZwwDRme&P-qpQxhzg6t4Bmyxi`dP@Rqro!Zbl5EV z@rvUs`gGWeV#Dzll&{?VJ0IV_^C?`U$%Nw`Y8P5)Q_4e8tx=CBjb}Ja6)s7@T z(QUCq^aAil8fTyxhLDW3vw19pCkIO#yz)yaWmPshqr4Arx&F+QQrf|w5Gn=t{%(%XNJoJ;7?> zL4!<{wn@B#Qc;7B$SZ9fS_Giw$vlAEzDwfz&ZKmUcqU*HBC(@jrSTp?wUWw$NSRL@ z#OlG%;U20D0Z0l^(3G5E)EGpp3Es3QQh~WNu~ipTV?-4@V%HVU@uqb0Xfz%B49&ql za~Om9SoSAs4lFzF)@@WQsWZ-%Q~+23r)Ax6>v+(c*_nwBJ42Sp-Ov9*=4qPoN{FXC zzyM6aNf~-Di^d~$#z8o3x3yla7ulp$ldQp<=m!8P+Nbt)T^8FPo)tXL8kPo*JWRd^ zyofe+$Uy?|0KX2>vj|YATT=D17VAO70LwNon>Nh(nfwmg@f-g^z1_d_3fMXS=_9m6 zr+OkZF9bs=cG_!Pc!He=*Hr87Iz;l{dgpgr@BEetlGH9V`r0+ou4t-z^CzTZ28;5S z|GoRy|K!${*f~R%dw1V|@Z!&5H?ZZuf9GvyeZ?&=pIYJ#1Sedm39C;~d-`CPOdDgd z-};Qqxwn4x7lmKb6j+T;X$`lvWK?Yj_9=?cqNr22Qf>bam1tJ5|3~afoVe@`QG6+* z4odI^z4uiUL;X^FU4ikah`leJ>yO`1QtvC6_9%USl>Q%@mUCjIs+uHm9`BzX`{Ym8 zjfPRb5aJ~@hvBr#rnQVOslk<`g=#$l;xQm;uqD7$FHKba#Q?O#-!1Pyc>BX$x{iQv z>^Sxa($PqtvWvRxF7#n&Vz*-lBt2zrpiQ5<)XbPF057ZL+mGd^sl2>Tk0 z!11EG#U|cLkg7hM4`uj;PsuO{z)L@J9$NN4bbvsM2omaUSBU;8Hd9XXJ&F~Fjpr%0 z9G{rg?@GI6_?G#q*dPHqV~qU8FE&`WXfJ?|d43++l*qbgP*^myFpsbi!{sqdcN-&0 zS{&|Pj`_a(FbKnpn5VHjkJ(`CqT5fOMdgI>he? zUV{(l`=0~hR&dbS{_5qeJ0E^cv^<1bwB7Y4{*FbhW$6ei4ZuOevU|6$Z~gjj_dooC zY@rECV8Zmu+uMKrZw3r{FKv{~#5F{k6!@`;%K>mB9-H4NU)+nx z(T;w5A^DWg-rc_SOTtEOJFHW=n>665pgEP`pTCz^5_LDQgI) zLYfsNK>NNCeD?53Qx(!2{aqou)pv%rF(S|vK_vUok+lcH29uHSc6f9$@u)Lii{~B> zL0U1C5R~Js9Sp>)5M3L1XWaB^X>)jS!XRqcM8E-`>0Z;?}2sqygUh@;bx?RCrO1b{%sj4rK!2O2UT9 zMo^f_JT~2f=ZmU7k(oLYVC#I@ENt#`C&H(0OlUIxeCAG^WJ6kxRg?~G@?2B*db=AP*h1`@XlO3#Z34kr$LsNis=hzn5~Rwbl&)H14}q} zMX-eCoxI5V1oJeH#PJc|m`aNf+I{2SyVriSee*W?ISco!*EsX|*=;6B-~Z@N_wI{S zk@kjf9QO9suWzY=k~wyK@&O~U5Zm|t+ug5z(tZ7ROzzgKv2<02eyu#<`5lGmrfC$S zyF9Rld4oGLoktPbSd$rlMFuyZCnk_X12|VP`)GGpc~iW`(t!hC0Fh7z~OgNI_EPcThHd(3{kQFA>{BF$oC5YNW| zeFvghX>{u49np0Ld*)rb2l%&JF3tegVBvkR9?BW0^p3uSl05VuK`uJ}g?=1xCn##jbEdlK<#K zwYmHJN4S7vfUn;@xP9|)_rJVJv)X$1ClB7f0g=h4GZ`@Ny>pH7WI$N{H*SGW?WMQ> ze)rW;e&5AYh+txiO4+SAg+ixZy;3M}99nObIYct7K{mku<<`s9N(`>3FU6ouNQ^5U z8ql-yQ=-W3FjSGt6^o-XcYOaWRhV5NQLd11NO5mLb|ZArHzsZosdd72a)Yw~#E(+= zEQ(!aJL;8bvkg}4)Y=8^1gehc$+m9z5=ru^9uZSDzoU z@ZCQ8VLd@tlgcc8#pjOL9?5L-#&#uU5;E9IZmuw%(7f1*y3*`%wHO4N$N-~&DAt8z zkUfnUmXTW37=kW^CZ(c!w|Uo~7!hw7!?~K?D=`SrBk{$Wr!7pm8i_gjwPLgmHsr?8 zFBjgjCF8bz{eiLfyftP0O%-lh52m*(!LtNX3=lmlL|3Wb%K8K>2(+loOtFw=fJ?3B zj_M5v76i%oHd#iL~G&IOi*#O%%mmdfrA#Ov>v(f{TJKruxi^r$jJ zpQyu*VsOL3Bh!iv#)SG~Pqe%uyh_C8DfPPWD$xgvDC@eVvR52!vUiC-cs{c_dzT0@ zap4Ffs(0!a>y69xggB1aqJ%*^DqOji@2%a^MM@=r0rEc3rVmYJG(Z0g97vB{~!nInhx(!YNf{%gBl+Z(^^ z6}--hS87$85GlzUhu0V!Z)cg`TcGGZAkQF=ISmN+l}>VNz23yCISp++O1;U16CL7C|RwaUMie8H9vP|dC55?dl~r2T83zUy zYi!QNRX2@eE0l`0nimE)))Bnn(8F7Q`bP0Kugb_7qS1UldmI!2Ggx3GmCfchwM@!Q zm$iepZRI54A--wjhtySS7k(S{sBD9Yoplh+c>kNaB&uRHjHlI3nuvfCNmE%G276nn zi=H`}&_ku3vrKT}xUMUl;n!fBDwwGQjVvo+eQj`??A5G3Q+K6P73gc9q%kG^&Q2Tb zda=%i(89I~E!SfrQ+lP?YE{`g{@A{veHD*7^5CXoQWUIkqt1}4odz#!w^V3#>fk8H z9zAc3p=hmEDAw3sPM2zKvEFGG*zT`-Yp&lG(X9gCr_>1cT_7qTTIRc>f@&`DQtlnF z)!i`L?9dK}k?`70xJ8!3uzyOnlwz;ag0CC}%LA6|wpdN4J)0PHD$)Xq#HK<+6RjU>?~h zkjQZI_k&K=^-69C0Tlj{4u}tI7g*^Z|0c$(lZ0F}?G2+!{q?NTnS%$#NOWpsoD{Hy zIa%RYR;?sWI+HRfQJ$hd1rHsS&^Fnj6^GUaT2T*C%3sMwzt(76^pX;Y$&q5pXg!sN z29hHyfe)g?A_v%t-)E3LAzL8gML0;5v!8*L0Z2QF4l18h9OkIr=fAJWJ}8UrX>2*A z&l|!YR@i)5BaM>SD|K8AwX65A%dlo zV03*I;z*}e&Efg%w$~bE_?aBxeWbL}rgGH22S-KwN)D-E6_M9#lrFmMG)Ej@de~9Y zYSapq7R1J9%rrH``YN{JE~lxmuW>!^ee<(o9BQ z7uheuP*JRotfVojLz(Xl#=8XpPVi1~u+yIrh1jg{K~>8>t0#tO;OCK){e~Et%L^`7 zMG_&)ST~8b7iCdGcMVbHH$-_r=K?R~?*Umx&Rjsv0G}fJT_!$sjJ;qIS*H%DXC0~d zxX!zxCv!C7eP9IIUV#Hlup>hb1F$JDr7p=K@U(t`5;?4n~Rkg`maJOZ4 zk=Lu|ksw)Xi%&$+#Zyr7qAvhV>d3ueNIs9-gf^9MHMFz9;8 z#NzDI5{UYpV$FHlU0Ff`rXewX=l4(obBz_#wg&k>#TN)t+JO$#nsS1-2c8A z`v0k*{(oXm|Nltz|3_5)|72$JvFzBPLz73Q4^8b|0DQ;w|BWVE*f#1ryab5W|7Q+o zGm}F9KRt1n?f;3)#Psx@{{NBa|0Vxe^_3`$17nAq2biGh`~fF;kujh3gPOWZMB)wE z#plegg^SfX=uF{{{3vCxGUO_6Z1{RSe5xY#bk2M3jrr2 zJE$_2rF!&84nnhCm16=qp0NC?E93nv6*)f{lq*R&d*H8HzJLs$Ij<3|#bED_sFL7C0#HXdWY_082gA zTq}A^&RJk`*x9+c6feCG8n0laJoXdxVja+4@@F|3{w(|B&w^(r`=;PxlsizlK+TAC zmg|(tnG4$oB;{=Vd7U`5urz<>Nf?_l^gO`8(A2ax*!F4GiX|~70SzB9P(q^a{8740 zC}#MR#=v7tRN;tVw%@3g3!M9e_~imq{JRYf<^o_CG?-IIWC4rz)!0F9eWO6Q6aimU zL>0^HRU{bLNI(*ybnD*(ZIy#MtNc~Qd9#MgTnJ2yN07HRb37S5W7x4yau_QCzG<$t zjVfH=UC3WeJf6uW((K;}{C5)nox*<);lI=P?_vD+2>hGPB*5Yh2m>qxBMI>5=<*WW z1+oQyYW~d0C49%IghoERl3Qo1-vB|3|2+Db{AreUi>=xQD~f-QPS9Tw6O!(i6j*Xq zw0NW3YvsY>m#`#@f-H_YFULFg%-o5TUuFU=FB{Fg73-h~A)3H-L=;hUg_Qw{g)!hc zebwYREQP*>K=Gib>iW7{uCfmDIKiAy^ny8Xp0ASt5yrL>1>h>CQO`@D<}=3?w3`v{ zkL9z&!xG&2$>TO6Fyps!=(xF2W)w_^0q}W{Ku*1(Mj3wK06_s(WRhHyiFH00g#^#( zeR`N`5D*wG^hc2TLC5X5IEK8)@W@JtCR1jU{G{Lw>c<5Yp#y_8qqHnD4k(@PW1TBI zm3^eMP^But8dt$2`0>nRAR7}QZmh^l1E)kjq5M|CS?PEHcR+~0jBD^bhhHmklVKA_ zh#G-eBO;2G6d5bPR=?_&a{;Ou06Z1scIFZEZ-~t1f*=TV!6vnlO!*&l95wKq0FSp6 zehs(=AjKL&4Jp>f4;Sp1tZ1=sYb{K4APmvjH0Z`H5W1_= z)M;#0Yv#XzArBq>I)FUF1f{Gjq# zD%HGW`3ZxfMNk1T-_T7TZzn7I#q6|D12UF?aoC-j>&-ZBy~NgeeCgy<<8*H_&bDIB zMf^$Ao*idWliPwU&oH{QuO@U5Iv#tCI>mCM!?x@wfdL6W4+cs7H(QNz2Pu;y1+MYs zXJ(wqX>q#x155LhZJZXwAz*q=v0et6?+Ac_SureCqn;BY7h8(`o#*Na!3iKJROckI!&rY3jId#(3Z$lt0)y@Lclz|I1w%IsRPgx%zWg52OJ}#!d?X!&yfx zVXb1PW3bHia?(4$KE_4&8E=fT>Ku5kzIh-m-=_{vTu2Q$G>HvXv$cBZeD(sOTWSnL zRndG{y#r&wZ-jCGMp4J|%9R4O^6Ub~!Mt#`6nXLQvWeY)Nl^#eMxpQT!ngbB|X zt$0N+n)socFP6)2C6vZHpDO4dM(0D$4zJA~*=HRU(3WFdTqfDSGV}<15fSi0s}`Bu zvQE-ZSP>Nd7+DDW4oc-l%?tlm9jU@5#wSQ`xbp zBbmnz@A-d!=k33^o&Szqz@z2=i9?y}6qo-GO-*GEf&cg6sXh7sk=lPPEEZ-@&Mq#` zk$1xE{29~o%eU$(mW$0cw*m7VvS%0P^~k=?gzfYE8P>;{*;CG8)5EFQtP1xyCQCJ1 zN&Q{h8EK*423)YDRXY$SpLxYq>9xlnb1evdR(A97Ptc!AX}NLH))lhj&Inx8rLKy$ zGSDi#%ELe4sv&^{^-INi$*qxRgl0)o^_s;tlN;sjZKbSD0VKB6RSedPcJSb-*>Zp2 zov)NHjFIzBKAU5bP>b=T!e?Ys+*Tk%h&8^i6jk-G2 z)Kw0Q=ksKlgQ;4RV4|?r@Y-miP$^z?pG%~lOMnZJ@&-&60^{a>Kj>%IsMp~FPYyi& zyk*4HE%(uQUNKbi9frNND)^O1H`5`ws_ej>9`B-nQ)ADndmnqk3Ac;h#j#2~sXQ^s zn%^6Ora_iupuszE37^Y(;Shz=x0m+h3n)>nG0|VXVHn1EdWdc-aU!eRdcf$abu{;2 z&;&HY*DJ*`0W+!|^@kP3Pxggvx!zT2U|98XwcK7~A0ErFhc&mlx&});nd#L8`^G^n zELCWAE*b#J=P$#ht^uTc-c#RlK;`o-Gzd&4aelZ0+~x$l){Nz1dsB`99NRjKaN)Ie zKTA$m_I%BS5A{XG3Xwd8;VPGJcstrjH`Qu6;L`%*K~G`Q>fl~Uq$eiQiB5v-t`f~e zI#F6LC(^^LS@e}raBjt|Fu^fjB9$nf-s=#|JEA8VY7!e0l!2U;IUM|lP%s4h%jan* z3V3|?T)b;8RDB~~Ew~1VNh8BUSPUZf*;&C02P+_7zcqTaa1?O1x zL;wo~I)lJ62298xy}?+h%Wm1HN2~M*3>svE zdz@*MEzQuDzBk9H;xHCcP1506+CJs;RkRnPx5E0Ip3sVpDE8RF1Ie&D3=wNil|4gtakL=zys>a}GOf-X|h@M$j&qFa-luwz$_ZB)L9qvxHGZJ@!;YP z!hoH0NY0q?EjVGp-~mA>jGEhxPH9aw<&0P^&3u-%lpoPzP>rNejLBXY^VqUuB!wYI zw=#`SFTu*F!69RR6Z=0%RC4f7qhY#(lX>3k2DJ5)QHUt z3SR~c1nuTfPyp8x8fnbW1u!v(sz&u30;7jQ}sG|*<7R3N|5za;Q zP!bFwvMXT9vF9qCeU5nRty&ei}Ae;_)Yh}ROML~gCPf#GlRXbRA5 zHPB^|irYd6pnb30F$!m@G=($ewB@oF7EoYG@(ME!+o+Iot_2nY?6j=QPY&^hkRlPa z6aI(Gjn>7SBdE92XjNCi&&_F8*^08_mGU@(b(~4&JUw$%}iOr!P8U~SVXBwRV4w+2f zp#amTNu2Q&H{lCuMS~$KpTjK4$JRbeM#bPKHx}d!(XCh>2CpKh_ zvw^(&G+N78&X!m8&{e3_=&Y_e(9}4iFXKd6$2nac2dbLmb;oJfI2aI;ofGXfc1Dzi zvj%CmIR2we2OI)^q!|X7@gKUahBJTClcz-RNWeoATwerC#Cf2chT=?(eVSU}X&$b+ zj)dID1Zr~TO2WL*EHYg6fWOk$L9$nxhQ^p71F#1X2;hFxj~gX@s<=m{h9eCgUXoIJ zoIO!HL#?86QN4%|ohItE z^7-}91125`8hGCQ5>;c^2Pf1qLLbKBlOG>`FmVQ97T{kj$IioEbUp&wA2C*3l&87b zpcGh1T5}6BU_1%a!S*4XIy#1%q_96c*OelnvctKhxwGTT^QY$)&Ml9ho?SliJ?En9 zHbHaKW`b6m({(TBa5G8b=wVn+x#3b`Xd0jNy-xe54&1py%tLTPm8vRi0V9v$$pNAY z>jmwerT-s_48h}p-;5O6Yi`{BM<3S;ZFe2DG+$JMRwMLII z;QNn8gJ#eawud}MmmwB_2+bC}j*DRChMb3oUlv&Qi()Z}DX`TeY`#U)d0+Uc@&w~8 zS7Z_fm*oI_;*p`9pPZYI<^;1~+YXL0f5?52HH8!q1bp9Nwp^aJT9Bii6%tKBh#axS za;O7nK_WiJ?^Pv9U_=CWcd@j_HojCTNUvVeB&|HOC?izkMK<^f^9cdP05t+|0N-~BB!rfBZKoT&JKV9#5ZN$hX1FB?_IT|7tRpoy5 z59b(Al^-j`GHO1qZYEHP?oj|NR{FWbOvd(dG;4dC9Xn)u4X%}sO&^|kY})qqxkMH; zdC|%fHbP%>0uQ7%v6|+GF6( z-ZCRgNqTtFZBvKyZFfD{8iU&thDgdizX2U8(uIM0U1-jB|oq-{ww2N?v;O^k9zf(@$4Hi(;}+ipL~fKYBqvU0gvE0>Bbd5KCy zLq>tZ#4D}UQkr(!2)HZ-qC)i@5ei~VK$u*h)4I(ESxrEX`TRucsxU$lxBtRpDsd^B zNF6t9$5Jyv!=6-51YX$hIU2VEJbZq?2hkBktBs4t5%`Ij1Vq9}C?-V5Gc%COM8>=@ zdX~G(G6KAaB9bduAzhyf-6#St1jev2MXV2%e5Z1IfgJYyKlb83?8SdT|Bs33iHV6r zW7CH+lY8+WzVq=PK>FTs><6*`4<9-d8vkKxg6IF6m^^fNVgmF3O;7Ime|&r6KOpLS zYhpiq8=T^$M{ktFmJH4u=~K>2`A)s^#jXP4QF~@b0R}7Re$DvGhXH>aJPb(7O?w+& zFboLDNBu_uF%v$?02u09KimbqWrac`aY$T}53(b!Ns(R9GjCjZ6I(-u z)OZ2px0D)K1C&nBrJnOf9z|RYNcl5BSdB;OzF(_W+|ov=W<(m0uYELEUhOF2%@AMe zo>*46>@h^saAByJmuq0pNa?2@Jdnz*KUnB9ig>58qFQ{8V-HMu0Q{93A_4onUcGj8k{c<1~GVq+SL1<{!*@(Q8!5KY@ z%@BQJ_PbRmLXx^m;ElgQ=xI;>-;@8pgYy5>#E~P}BV&gTPfkou?*)MPuE&3n;>1IZ z|1dRm=!4XHwi)xX zKDMUEIT+FJaQu|5IU`Amf3+hs`sB=9mU>(AD^${2Fl^nM#ZtAsL6N^@Omj*aj6ch1 zpGk849IfAfV(-#ur)%x{=q)&?_~(hn{*_$?fD1i9hoph$qpZ{~Xe| zMqRK2qkxiYEMdAXg%^ryVn9yOxU<&6fO+xp;UB$rO|p4<5`pBDt&o`WW6J zE5-78d4-=c%4(^KhbSd+Gw&xWX010<=0yCo)y;q{mARGJPI9hdDwcfalCP46?1p0E(yXfbZ4mf%# z6HJbPzl_@|K$2c6V0`yYjH!V69WFd=U-4Sl&%coNO%KzK%*BvKlWqPJT9Vhl7@{T^ zw?OO|9r^I4x>8QdcG*LIG@J8bE$ZQAIV*|jlN*<13gpIRaXVZoAA`K9q8}eOjP%kB za>Z)fI(6Od#rHfgAZIuSSfCq87ZDAEo~4=-zS?^#b=A+ujD6+x+NMhcS!dNX?|ius zpm6ZcAHI-w$PnxNkZiC9$YMKJmX1kesU`I0t>_ z`M0nZnbaiBUX{>8BTDvjHrCQb%5+`y-!{|gXfOq~!?99iyvB+-J)L|LNSWL`DT$+U zJLfBPEd%z1q;X}ipJ3C#<-mEIfo0ox5>j|*pn;(Xld!yOD3#Ne88ZXQ>2zv-gUiK> zE^avRJ8q?ytEG#}8%>wzf%4=$@iU(nev$r_a);&QPt}yNp4UdAj|+lH(TwY2vX@|N z+_EPyQQp5t*(+r+A@sg3_%6mz&pp1haN?=CWwRS1h`6_k-bTF?)>k^P5i3gfK4r{jhKDQV zqmvVmxf{2ArF?-Q04KnCHbe-hA~rbDBSDlgR)j*K_p#zBSvFZo<<{NxQgb6IcRhrw zs>tXt@U!ODLD}tpKTj_&_^a*r_reQWe|grQp3UBe6&+Ntd4eDcY;W4a3V_(0{gY13 zMh`u~S9$iaN*dyM#Y=8EFGx$k&zMo)qVGG5g}G}ZUlXFRN2jNFuA}qx;^4sx`6T!> zH~7fTXD%@MU#X{yo4HNpK*Ix)jN~BwxpK;kkn^;lWpL3o(o7o$bt5eag=P*+E1^BI zsyvM5lWgwdKw|B+swHs1OjFaT6dfW}z#y@BvP^#+4}1B9Pvg!!LSZM*AElQrlR9eLv*lM-Q`tNO#tHvFqXzht}6ml z$V_IER0jYq;_bx>E>S6O8kysA!C(v+A;FL1H{1+~Cn04STi~LYqaFjP1Y#v5OtT!5#=J8LoDW`% zJ+~PML%0GX;K!aA1kH>sV9(xDaYq=SDi|`v(zhOnNNH2g0XjgpC`7dyj5=^pU8n5$ zWxdlz*!gUXj!I~?uQmevqaSct8px&s>tHQ6k8Uqf8 z&=_548FDWJppn@%*61;3Im^~4J3Zrgj4y>~S1|W91}KD#Jf4zx z9rQ#_qvdp(WrzY+cP~>|(?maWjlxrLgxcBwEnp&j$XLrm;V7)o6#ZP)DQN^)O=x8q zMrWsH99-pM4HOPADxt!MxHXXDYeT>b&txV;5-$`VlU1gun3Jbo;9Rue^Z=yKg3y`3 z%qM5`s6sRdbmjCeR-53B3Fj)j<0`Ds=|=8JB^NnH|FDeT6yFA-_DVk@vw3hZMx>q? zV=*I#1d(bY09r;CvuqnqWM&ADq*p$qMQl_mX(a;LCbGoOE1r*usk^)oGiK`!N0sJ1*F7MHqRX*G)FQW0WhG}!+)tEFUE56=sM zbIEOg9~|txHXxJL=b4GL&}SkA4%e)`@{T(6C0r|46Uv3~;OA1M4vxDBfkaBjx8Bvn zEKD?*U^@&$Y^hGp4v*>!<{2_rBdB^4dgK5ZI3SZqCq}dEpX}J71cYh_RDLeOe)_)u ziOrnFzyA<9^7rzChefgL8!Vpxp{fUi7(8#06lTvpY12zM>ZKQ6gC!yImruf!5A$c1 zr>6>xKS>?SM1MaT$;f0g&hjK9`(m!9&w9O4$7p9IuwyPe>kUTx8+9hlKwq2=f~HH3 z!8Cn9f-A%a<8*JGQlhw1|-qJ&Pv-biSS^NPA} z$O%2#X~vqqayQhS{me|$bY|HO%unJL>|3kpOP+za&_xrQloHqvMLD*IG%kuj#@Y1n zN@{pG5Vg3NUP(o+rmCi%@YU3zVGp%U$E1b{b~H{fiJ{(bh-~7WE}eR5VyenKytaek zYI(3h4AqH|r_6XVu=8X9DiO?(ojxvY)36Z6@wP#9Fyo2cY%Cj>l?+k<$xa%o)i~@; z3^Hb%YHS53Gc!Ciu+KB{5TYnTuyttzYnkI0VB-`v-E(V|QJ|o#a0OO6p`v;*Oj{TM z3nQ)#S`4wBhkuV|k7Vc<+k&7MaxDCyI@e6jFsjRAZ4HWMiHzV6s+9on_OUap!b5y` zZN>+*80Ui{+}}a8g}+#y{eV~>_%UrZlh$nPLKiA4!gP5g-%%8Cr%|tMptiz4Xah!g z$FeAF_l*fmcAA)&Q7jbw=u?*=3SE(;rDm&9?vR}p9RB0W&!88WmxDm2qa_|d4#L!- zF=jcZwzyJcSOZq4tVo*?_(+`T<76$nm|K|g-Xzi!B&GSbX0767V85ILR}Z8QB-sD1 z@V_(ce_8gw%>&LRap+{I*k+tv{wfCR5nGzIk;WGVxJu6R`(*YuwV9(zGK#u;Da|V# zNkx9sxm=EXfz#f$@%h!eLO&)f97K=vl~Qa3k{_+s8Y{&bn?7fZ^JpS{1Pt3i#wgZ` zt#u}3V0gAfdaUNw^Vz9QpIxbB{lTXz6M3ooNLMEFQYjdA=_uuf&7D%H+X-s$gP@{qN8Wbr zfiVTWA{B{{@)EIGC;f(BnlqA8qK``$$f-GZT5Um7Qb?|S;fW_wLLXw-RWqOlO|bJ5 z1C1isPR2fzcs33FuHy6znpIQ!90u+x+i9GNIy7G{gSQ&B8mMC609r?Oq}|%k4wleM zOw-iTzx-9NhI9QJ_W1mn5UTo}{$q?WV~E^xn=S^s_f4cor1b|523E+2A<`F(xkn$W zJtb5@%eYMiqnR(!R!k*Fo*W zt|(k>cPYp6q42=-&=@f~K4X|jKl2fm3%9kwfbPkaG!{!|*#BW@N<=UsELsmOMpGf` z8*i1<%J`tRw7sPt83!d*WF#uSa`ab}lDb zDdhWXMJ%gYgKI9^szN)#Hb#977uGbRV8&=76}H5@LG-?1RjtEq)ZG{;$Vx>p6oE#O z4-hY`ds2AP@f{fw2~=w*3`v(47UxeCmY)flbcJk{Vp?n0-!htep9te>2W_m8ome0^c4L9@^{ZS zR=nY1{;;yqc0EOfE(#RZs;g`HJYP({j7B-Eiv^F0f(y&Dr^GhY$`WxoMh`rJX;4+$ z^B~P0@vm9cX4z=>M+E2ZV|*-EBwJq&<~;J=*h#xwonVwRMxynodd$Bo_z=g ze>?&14vCqBS1&fbwMILThKBweH%*~tOfxGOK)ARXxCc#A_t}|DDnh2!N&x^Bh7{A8 z60Zikjys2GTOMv1md-uCbmHv%qQB+Q&KvLQs~5&#dY9ak+R(84s-`&d3t;?U|8ew~ zxU0z1VxW(SR)8A>1S&$pNRiK16lujDE! za!yIXmBn(oEYE85)$a#J%p7 z_EXwnuNeSma_ZyJL)zmbI{E`gy~zuZmlw?`pLyX0{%bOIHOLfTQbfrR%n*wZ$Wf@7 zcw?SIzk_VbH>A?b8C-&2Wg=x5jVm0m(}O`^^Uyho5OxD5mYK<>20Li!&SbsVZdI?$ zI8*+qdBr*8h+%sUU%#|^j;0;o%_}X9)ac%H9PUpTayaglQmx}*Rz63(L*~FOi+qVL zTD-{|KB3YdPqe^O3we2IQbHy4)CyE4kxGxS2^BZ|!n5!w%Zh?(6(P3sH;6;%q{iiR z^?f>xF?KB?YJ?ZJBSNoBPmFg9CP`fkE{vUQ6l>U%;t=66Wol$tEC=l$}D6^9Z z?r_yU(L*~O2;UHx+Wn#zC|9Zv$o0vE}IW6MzqHXp=Uo zfEV)+`$&CRPxFLMWingv&L6puv*xLU$RL&oF;^8c?PflSe^Y+E7JIg}Bb?g=Mi%q7 zoSeh-Yk`GBhz#)#7dEh9HcPgAXwIXMh7vWXt0 zvS#kb(d!S8bjHP2i^tFsl_I5KEZxzh4a1--*=dF_DxnXdZ43 zT!yM9BuJ!QctQUt-lqhX@EAP+g|M~|uk@y#OOVwK!XCdf@TXFQfe}r?1yXQOYA-1t zWzC_9kTI+l!(>(z@EJZDL0fR~7$((Md9W^U|E9OiMy*=fDA3^H`X+yMj4Ur0AG)~k zG~0-a3#aB!JWFP%g~hWA%X24|=T4@_gwps@qt=GoyKH7GQ%R4R>y^)9%noVw#yY5$ z1Fe&pj?y|B#tnNGgE%j>nbQVu+P~4omKl;^&8^i65M-PnfI00LBVGUh*?aT$IF9RH z`2LMg(Hh&FX|QL<03g~!T?hn8JSGVQ08Kj--{D}U2h-AQobCY$L3kePW^op8H*uEh zIB}fViQmMLo%g+qEyebCd9OfHf8{H@XQ`^LUSQvP^ze52X z`Kt_;r~QgW%bONZE{G>552QulH~U5T7t7$2+Tm42k3OeKp)h->NOPTX#zdT+*oPju z@FjktC~z5p-os}F4WbWH4QR-;66T|H`{6&ThY3hWK?rk*)zqg{Zc#<`Y4wYvB1~%@ zMK*%-$+i)D2ojpHYNr`Qs34L=QfNMfhP2LMA;H^IEod|~T06Al-`b_XYuJ$s7hV$y zk&c*{We~Q(%Cx$Z0XJXoy4QZYfsnHCiwa>e1RGv5X@g8!is<=i^h`W@d>3N*;HWDI zxaoR~vm?nxOAB{L-d?lp6Hb)c{0qmY){e5SmRDq~$Q?{AW7Mj~7C}pZQXTD3)$#qF z9&1*q2OLrMP#vW!<2$d}aWZL3_fQ8$Ndx=4lCgHHx z&REsxg+b_uJRXad(JuKM2Nc?!>+2vx=5rw|pm~$PjLI6A5sMifl+Y+h&7{mQ2l`Bk z5+tGTAw~#y`!a{C6|<4K!L$rz}Mxy0N*nHNfltjucCow}NjT|}}Sj}x~vhmr1LCYx6$w7;a zd48&g!uLvWJlVMDN+6h7Q+pdy3g$AHDPt{IB=;>YUR}h90ugjBU}s|eJ!hZ8t3Yxd z_DBLAcr68mmqw9BDsf2RWv}69T*}U{U@6BHsW=N?eyxiMQ;RSh2A!52Xx6$uDn zOm~|Uh~2`#!D-hOJ$M{Ig3lfv3ak#Req?+SdKbHP!q&#CtJhUyF4o8hq`5c5AUV&= zx)JNKm@D7R_|v+WnC_byk0HGd#i%8HMOke})d7q^FJMIMP*8i~RgZxy)#a_B*`o+a zAr9{Op1u#un?Y1F=#F>PYaX6SBDH$Zw<#hCFWIJi5*7l_x#lIVXK334vp>wma)A~g zZrVXavfbnt!xngSP$A2>SVvbz0>N+te7wubu3yz9rczWt5!cLo7NIOghoeOMLiswn z)<$d$*}xCFMcmPrRr7{CX~2l?QO$^!3^6qI>0?HEu=u4x8`nWe+Q*nvSaWRN$*^C6 zPj7;?P1My`c}lRjWDjfMHF0Hob>kKx*;9 z(ZJ1#Ot}IZFB|9JVNsgIkdNp{m`i$6{U`T~K*f|zKGO{3F% zy_Cr$<#Vj(UKpcKkmU6QE)7B`5pDqaqDEwu{Bl+)u1c!Qr;FuS1RcrTQ%Hm`GWLw# z;i_U?z*PGAp#cP;Y_O~sYZ>S3yY6f zFi+8mA{U3oB!1X|;TD@^Yb3zqIBZ7yg+w(}PVjNfF3!Xr7icmRjk`o-y#6BUi;c-YC zxm>z%0WCrB%M|ujeyV79Mkh0np%_e)A{9?3HI7e=O}I^l({uM-T%71!$ML40#)w~) zvzZrvHtc^Zar@s=YXAFE?0*+S_P^DoOA3hr3& zQrE^cY}lz|`eL>{Y!TbR@(k>l7o3-!gB9KASX~1&J8VON;GA|7JNbn5> zOq9h6n{7TVG|d7!GQm2$B25HkuL@qbS*b0`(mEm==_Hu1>pW_^`!GY$Yp`o|=I9nh zcC@gIQ6|RC@!=JB46FBWd#H8*RTHx&RB!nG5wrteGL7K3Img#Cf|3QY z@`!Y>03Qqc?}##1`~q}s+-&)HGmU9XvSmI4rIHAAH_L>`-qT1mjaFFD8AwIVLB_)N z*h`+XnH5A63!=0j3sEF{fH?>Ga4(V1z^LkVb0&~cqMP(0O?{?GiE`hTYWpTYjGa%o|C zxlmnLT)ebYP3Qb8?*EA~sGNtWM0}F|pXGA7T9N*r3k!=d|10n^_5b{j=>K_EhfRi| zPIB4&6g)Cxj-j(XG^3#`UtlCl)$t|*P6@X&-Rk{?n7q#!N#>E~F^!Da96zgpr1Zq- zJAQZA#_Jt$n;E(ApEW=@DB( z?OtNLT-;uO0crNgGL$SrR}9*lB2=M*>n5mm4iBkJw)ym8FeGb3wapOrPPVvXm(WFw zr6ySW8O(9R@r=$yjj5gHXeSaZE*h{#Fs}?$bEpMel1=&~D%wyTHXR5PQS@ zkbVN-LtnC0jO|FNo4+Qg=Wvw3C7KsS5SE8d4<@q{1YbE9CC^BJvy@4e2i6%A2My3hV|r(~s~A*t-x)~X zFLA++D&B!ZT|Z-QW)pQTbgl0NV=Vf_7SMAsJAAw$2Px?^`weG+MmS`^Cr#1%Lr@to z3B&v)FGFW4mFyv=Eo3ZOFq3q25kg&9A_c`^+$JuuZJw()K@|xF#XDNE&)%hI*q?0* zF@P~lhInmESMwB4#3No1aZ?G1!(dGh1-%y7q^Kd*8LMxsGQ?bh=srczDGO4_;5K`x z6HZt1L>l*=3VFhBK)XZqdJPwmW=4XQ1cjwH;@vhx$cG@cTz zS%xr~0U|V$CX?~v3(t*qe zKvY}>9Tj;&8uUv%KMz(wx7W+JVaex1^}tyRLn)A=&~@CgfzcII%*FzVm+3|?r;NB3 zT-@!$st%2=CyvC_8f3PM$u(S7Es#ttGhEg~Ne3PP6iH$6o*l+piGUF%v}W=2Kp6P# z93e1Du|SgN4ag9fSx;^7bA^+bf%|=PnALCWk3LM|dA62~VwS}_lh@+{ww^A6thtzAu+kh%L^-(Y#K%*PBg zM;jZS`zVjr@#F;PO~$ZogZ&(ai_~0nrK}gNjakwM4q%@NXv_3pdjFH&|D5Okr?RxT zP^uP6<>l(~!csbe)B7K~|B+zF&w3AZiv8b0rBdblpUP5sVX^w3VD>LotLgpEOS%71 zmpr3h(+5qWU+8A$d(Lb}x%^Ublq%;l)VubSm8NZPgU^12nvYmT|<-Iu0rBzHJI9fnf3Y zl$*yhZCXh}XyDa@eGCQL@k;qf+TL;c%~2P$!0U8eCEr8pz8$n?9(Uz- zsO>WTx88iJSx?jzg+_a*_ezJ=Pip6|*XCzy;5_6fA_76xHPALH+%OS#7Cq2>b%Q9X zB|H#}J}S2G79A%~Mh$7qlt7RE1ojDbV$W4rgkUc%6OnV4eGIt{T8I=DzRSd;+E71p zQ_8od4V-!835hH6|`kf-cX3iFw3r>e~EwV#~TN zUX)%hs`v!rL4!^!P_;QI5u3UBB|G7oH<|Vmx8CBta#`L&!#mToV8Z$FPwXpGyyxhvz>OI$2 z3SLl!l8F5Jlq&H)OU#pkHaq2wmi!c*tkLf@Q|ph^6y{^KoA{P)6jV7f`~(mr_Exx6 zRzhdt>T_o6i8WF+ldBY4&7rW5G?#bbrbr@T%*q>VAIp8-29Tb zy_izfYw@}wJ&Oid-(HXca)p6|7;jYiUy1jdc_E#MukQYTdwuoF&GkaR{i5do zjQ#)8Qn|+a|7xkWScCmPZ2uRQ(*6HS+5a1NoV^{!gX<1Gybq&$0px6z{?FmN1ElPusL$sh^KqJMo z6OX&KhCv&sNo*C#>_C{{PzllxExB+`wF<@^HjRXGuuPBbjMgk*G@l4SlB7L^77~g} zA4kt&+fg(w+1}mUk?jNiE*Mu4)I|l*%*kM*7T!Qw(o_kztk#s6)g~hkL!-wn*Tbtw zM6>OQ$iK>vX~e&iqHl6Q?8E?^VeW7T`A(0nQaPj`GB9lMA0isfP?*0NO{PPK7*cc$ zsk|OAZk%;=ejyGgW?&IO6dw6qy!GYNtRi%w?S=z(lUw9)APbT+p%`#`!Pvm64={CP zA|RcBZ?QI*nm*1S7QPO;AhuCN9u8XF@et;%$2&O{RJlmoJC-_FVvkr*m_&O8nuNvM zZ{So!b`mCUKv;b9u!$t}hB%iMY8!AohBfFSaE~Gy3j8L|OW>;}XD2UJ1O6W=-bX3k zHgpbS%HME14%v25L5K!KE|-*PGUyN6Aa-L$fa>e+P`-ahT_M5H4ya?GTmjUb`nLdaBpD5O(0fNzT zTofftNF+8L<4RV7_4p==H-T-74Y;rDpc$W+jG>#z;rETc1Jam{f@Kbx(C{BLiI6R# zxg>Z|F(Isb520g9OJ-vO@VY(n+@(&S_ z9wz~4Ffdd*)q=6(IL7@5Qopy<{2j6+}&wu>CzxH3w(;m@`llQ;z_|N|PlkfiE zqYwTO=s|0FQ7ykkmNjd}MdRt$|LNq9e)9O+-#PjApFjED@1FeXPfz~vn+DDHB2E0q z-~Z;xAN{cS_-}u4@|)i|`TDOO|Jl#6!T-}%;)5C4TrmV1NK28TmTLYln7 z$vAT!-YPu#=}$lU#n&GH^$#Ea?GJ(WkH7!Zr@wmt(^5LJts6F}q4^H0yo0I?b zW9a$GH$DKuJ^9=BfHWt+{GY&#PyXr`C*S#oX#V3r|Cgsf`P!2ozW?<7A3gqye`F3k z`O&{V{qH~i_ka5deps)r@#JFsH^zo!#{ZZwfA83Kl;sIKmMa1ee}T}fAr!1eERd>f#yH{^It+& zp8mt{Kl!UaKl!~MfBcs}D4u-#zkUpzxlz*AN(9ifxPnG(+~dnqYr=e@%O&_ z-`UGvTSfV216d#zLJ zRMl1Yt^0X;w&HVhSkv=8$I$)u$l?3&s`=Z5TqIhlqcOo20Gn=Z*3mYy^ZGvau@j*3 z`>o}-?|TEl<9^3S$o%{1ZpY{A@S?|dQ&+RYmiOnokomrLmHBb*oQ0Q>^%}l3uC&&x zqu2qAjRD?$@qGaZOV80E=+J&*nV+w!vG0dpzrEgHdLSIRN?`_Na>EF(wgFEGx?MGF zh}+(e7d^r1W5Q;eE6v5d*Ed@+lBggPoiz<))8PpOUblw4gOl~N@A$qiDT~4et0RB|zSqx3Q^4&b!A?ZjmkifVnaHt$ z$9G0HfPd!gMyN@HUKJ){NyEIZIW-&5z5lEWg};;2`(_K5Y9qMcqih)prcT8`SM&{F zIMTJ>RyzoQ{5q7}`MB+O>h$34DcVEtABCs;lr=d*3 z+qA#*5zRE}Th6djUyM_c$CI-#)jS=SsTQ7xj`WuZ2gZ44at19GAQg1;pUHFf3~{h1 zgRVVA3)kz|rj!H%Zl%5Sx3+oL!-dUti5mAsaGJrR37$-13!-g<>& znPIHUFwUcZ&iQiZd*;fe%u{q9$VMp!TgQDy% z5u+qkIDR3#FZLd)IJTmtdwsRl;BZ2|LwJgICN(EgyS~9N@F(l|smrwQ;k3EibDBb< zM%O+3`m$WTpVeCsW_35TH5;lO6st?KbhcIRk{!n{O7A{I(!dGFa*bNYqB-}%O zO=y&1X-DVKr5Tf`-%v;$8M*TiGUeX8j;c!i;PH7 zrm?=e$q3_&o?#vgCpd8{Bll&(GQ&Mdh&l~6v2>LMQKW(eUT9VJcAi#M2>wu2>L56I zHjW*v+MgL00Y>EgI;23cM%3uAbR67Ogn?>@Lmg;!J$t2vXHW*>K?ps0UM%9mjM+(K zkFvP$@Kca&8&fw^c&#NvT*(kk(rH$uN z$%)j9kfUP0bMIXD)oWOXkj7$tqd#ib4ltp5oZH4@ucS~0v}jKf}h^4dR2E&HAcS2fst|V zq!k}vvQ@Ac+;t-2W#4EC zx$$Zi8r^FbEmF636z%sTSo97fIC6LGNx!v+$ZvQ0L#G)c%N6UcE|_@ygB^7<9a5jj zEF@AB0*DrCuzXJGbv+=Q(4}z<-?m>Gt@%?)G#Ee~U;#)kmXO_P#mS7mYt}3Jy-yrj zf?X_-=86XYVon0{T?OcRj$a>L4_(#aVHKA=QakxW3{( z@?&BvR{0ki2pe-ttGb0rn+5zDaw`@C{X{hnWPM#(y^A;!U0B9a1GwGo^A!=CnoGX? zBZ4*nUi>;(=x6}z$gk)x)&I*4Yi{Yo`1Sat{kO-hhm0q??xb++G$BF>tE;B;DHqrf zFSYI(lOfTrQd=DYv>vl)OUrGcFAZwIk1vc8+Jk=c_AopW;^`J=a9bdek}t1_PnTBn ztyAZ|Gc#vhDxvWU!r?ZLBlI8A=kf{H)Q90b2LU1O9!MZjBR;A`dU|Lu7B01j%6T$< zKk>w)*F<<>vLt&=GS>8@e%C++ibtUcM^9=~_00run@EuY)8imuO7}Q;@kG<%^7iZE zlBt2%+Zhqs`Kvfs zjXdoYiS1-xRCDD;e*~{0gn}wXbX?J)kML9d$mndw0v))YoHbF2E&Kq9VH}zqluRlW zx$_7GMJQezSA_I$=sAltBo`903M=oM{*st&%mo{#HT}G_Y}N2~5KK0$J-4=5NRHfS zqCNFr2B<0`LooHpSx=QmGjWQOY&tfge5Em!D|99l*_zD9^T73{KWrUv4iW*)pr(*} zU6Q+*+zFU!;+=x6z$qB^b8z?_bL_m0M^KhVI8MdoXPt>J@(ob^=J`nvnmqMHJVhoz zo{@5)3lvx@)GiJV9`>X$VwMQ55uWMQ{ycf^PGSg3C~?Z;YTM90_r!eNFQ68nC^;?$ z>y9$Ig7{YhjbkP2v_(YMTTL2= z#B>u_Jh|ijsYs0dZp`cCP4J3FeY|t!|}RCjpekw)1C*y~2*0=i~WfH6R_Q zpckrvBHkR|2Pf))qRk&YmAYw>(9Xz5@o(@5t z)KAW!M$X=+&@1twUg%BeOU$ilE0L@~ODw;cyJVKriC>s&)$!FfWvuo``^!+;(kufQ zU4b#<3po*w!b5EsT+7$fE!77!F< zG5PB@ih3|zGkth;>Z%yCRJh0LvfAFQ4cka+=jRC~4cSq+fpthI;s-b8w{)othJB2azd#!Xz`By^t=G?a84xpuc+64{crS!pHhi z4k{0ktMHuic*{rfbIju8#k{yi(M%>?ci?&`(6oFCKO!Ymrv{7fby!5eHpNEDi}p8u zYJ5c|{C1Guo-6~?s;r}rUsIEjsJwfOVOZu|6&nlnV?+g+b3mDCY^<$`eCDlZN`jFm zn%kzs? zp+0ztyyZH@4PQq^LsPb?8M+$ByaXuk@xiJe3DPP#cHfg6v1Zh2U|8|0+8ajQo%I6e?dm-+0LqWMn28Y3xKwI^jC-Y z`k{f>hdoEUf?3)_Am2i!%N*B)3hsK=gL>EA8p*LSbrvHv_vn`f#s9iMo7a79`gO9s zX>qBg+hae_-dpOR(EP6=Ps| zrm4LV8<9*@p&f8Ohj1in9oBazFmb%9kV_)2-EfICJ0Tr=S6yB)kqbncsa-Iupt|iG zq*(hMxiY@Y{F-P60%Iv8~3#oZfwN?H%BCrP0)FEbV?t}HkRVTmNo z%-KIeCWZUQB*?M32y6VU|hD$wiEPzQ8Jz8OT5~V9!#_zA)rf2MUJc zp+nTpOQ5WwEDCF)&ql<%a?mQEs6K&yGan0vh2Mv06khmsTAvUSG38Vfo#rvc6B`;m zBd(AQ-1YmL6GYt)t-!Vk6z9h#J*j(FfC9w#NdHt&G)_>((L84FSH;R9<?4iTe6=lfd zmeD0Ra=@&fg{{hvhnK)Sd5sMee|M13jHv2jPBU*{h+e=&+{reSl!IZlo3S(=5MG4K zo4kC={KaY!^mwc%lGse^Kh_lNgh(LtO_<_B@=_ZiILg|>{7A*ZmA?v;ZYQt7FYC4V zaBfz|8T;hU$Ba!&tbjgljiTzXo|wg_Nd>&lGCgG!WY1=pMAB~Hl&t)d0d@IGBFQpwi~Px2XsXa}khyy<+E659CU^cGN7RQf~il7Rae zWh*0|iubPYzZ)zMUD;MM+L~1M3o1r)Or;z&OwzgW8hhx2kR;Gr+>Ri-FNc!V{<)M+ zgK!9DXJE6nU+m}UgT7N0p~492^Jua_3{KN%Ud`pA2L9SBTp}BAM@@`8Jt3-=P4GWZ z5I&Sdhuazk7k!S5@NoB#g?f5bXchLFj-7@E;_*OC!J3wg(Xe`;oaifJB6GNi(6Ea3 zAvXax&cMdMX|bu<8Medh*uc5qQ52)>F7PQ1LuD^pS~I3D0C(NqpRDB%Fiqf6xA$Z8WNo>$R5X5iMV#um5?NDknvpP^x z@bF`LGWQRp3i!(nMb1kQ*7bW>uD6DgrI$FVz50eHCRgp3 zrME8bf^*4et?^VQ?~C<*R|*DxR6gF~X3cSuH7+hN!UWEK+QpW9oAt8I=svQmz9pG)u2d$Vv%gkBirS4r@n3Olv*}W57{S zw;h*sk&qpV37T}xg$^8P;Vs9CgNjk`<|(f8REKthS~yn(80>ter+LtV9?W@8w6$is z^vB>}M4r8O@GbfF1^?6#uap7-&vekg@Dl|)5~%4_6MofDo=jPq|@vRl+E-RgP>D%ZllS9j_UfyzcTa+(h1qv0H-XI znVayg+|a6`R==2S`xxL1>9#wO2O6pL4#Z!btK!|FRxBvUelJa8WkI!=eOG{5Ff-O1|N$>Qy*IT}u7vfJ3#$ri#Nd&M2V zOT;l;J4%4t&DVi2Z(+?&+H_kxUOsOVNk(U7T`=~fTRTL6+c;>3+_o)Q!#@WAA@f7; zBfq*`JKBWwa9#o?|#5U*cTh7J^IU|HmVfb=3WE#WL1p;BY*p2e*GT%3_L_Xx=U@~0npkMQ z8?fygUft&?WF?eY4ULd{Y)ay!o9O;*e&{asj>a%|emGHCgn~BZ{GFP-f^@INI9ilz zMe9kNy;ta3kb^!>zw?gyN)Mx;?P94^54fyKzwwWWiyOwqpSyC!&lgm{SKI9lO$v1i zI&?&nR8x=zU6yPO{WlMIW9UGS=aww-w`p6w658tx49wB`yf3vfbu8nMuP@czZ(W+} zwgBSc%`_0O;ZdFhBC88=`08uNs^+*iuj;F4Dtfi!hoVSzQq;%EP3TYFczZ<^ot~yP zORJskCV!1sBHfAD*j&BcJK$he-swp{=taww-#HgOQGPU0UK^C}U-EM=_Xu5`Mol%d zza8NdC*tDpUZOr*LD&?wrI*zJ70gBX1=!#!AELDK1#eLL^ zOwp*1O#3Bo(Dekze>&rIBe88%z?OZjqC~B8CaSCNd6HoqYHl}sF?c166bA)3%DZ_- zT|q-Z8VhAyDVgz(X9`s+mJCkM=opd{MbAY+8rF5o8fp1vXeh$YKO@E5@vnRj{@A%8 z1mP<4d__oGk@F!SO}x6DS9#$hliE(5@^`r^rD)WzsjeGY2j<)j50HF+BWW&lb$aUB zn!2}I>+7@`w(VXRr@ii=h4}NxRkaKiM{pRmItKJ-GAx^9=E`48FJ?=qXX8C(mWqG9tFpL9 zvTS#qvs4*^A_k!IY9}-MR<)jHdZvpG@toAzu7!ZV?Gsy_eH$%Re#iYT^`Zl?azlsRf=VNAG880LJWW}!$W`Bb^! zIk|*;VG%pJ54zXtMe-*i{*>d89Oh%S@twj1p~J^ik8Fy~ag)iWr@wbY%J@sEQ;R4) zIT(Z8q1WcU+kW}}{CxZzUN^3^jif|SLyGoWoHtpSw^_3abhE5gDmV^h?~F=_?N*PL zxN8BunibQBKjXaM?3-Z=;GO@`Gc-Rxuds(KcBCc!;#+h3Evq}NGy0ih|J|chwS4$p zqf!1tP{!Q++zl5I$@o`VGznixc5b z;6I1JKuyqs6`!>zdoe`4+K*o?t!S{l3=>#LfLFQiJ3^ng1#7#!qm1C=XT=deUxXB#BTcTjcGBnKm|p8e!Y_LtmnK=lSq(CGhJwQ ztT3&69vok7J=L(X+gM-PRBo@nUOid!q@!?ei)kHzB$--2EGG^Am^q%oO03kw0-@$w z711?QS?A7`;xERFcMGObfdvmkJ2$zfE(D;Nf5EyU#KAjYh+xb~idRHOnF?jC|9~CV ztLd+8FjXKd3d=@_R8yADS?nMv=dW_{;$+9tzlb6`$$Zqo^B6g;pFAPM8>DfC7RFCJ&kVu1Xv+#LwL6xTz-P zevo8o8!)uY{v>^YlDD~8!(Ux*al{*=Duz`VgpCZ{2>Znb%|7Wa%-&+4>1{}%rRXg@e%j zF;KZnA&KGmK=@>GXdKY-OP$p&Z4IQ@oat}f*Q-=iByiaMUDPDgPwsM6IT=ajqru{N zcg}uDMY-v`x~)4q#!Sc%v50Vi&g^EQbo730P8o#S`G=jy&ljzeo+GK0Wax;bqICt2 z?~m~u!1HGG0=Lyu<_Rwd|Iw#wo{~=dNl%l7HPV$Y^(_}4z#HqN=Y;D7Ed(mAR}-o( zR%j$bhopHymRkbWpF;GvtH+f0U7Eo1c|}JC2gfqDs%@oCf#Tn!ygErPp_0mCB4Dq) z5%tsEY0JnEl*nebOxVwNAqTIww>{xm3c{(=S^i<#bDMNWPge|#>!5H^3R5JTseJZ} z887M4>7YHw{$JgJUHim&gN*GNa^vk!?ZLq%{iPKeBqPpBYwA)98pSyuXZo|)o84jt zysUfM*xX-(yjnI6=(laS>>EQX%ca=@X z3pov0xw%~ZpC?*7JZv~paq2D|rUhVzlx57iu`V6TySOekQFnwP?Duv9`!mqSq^s)L zh{1mB+;T_`GVQ$WWBm%xl-pGyi}kt~^0659yM+$kPVwolouvGRk)J)V?FzYRTI~ek zVfmquXAdrqgFv#Fjsk8miqm$#H(g?hSu~3mF8hO4|B3zNs%+EBx6&+7{jYz^yK^t% zyXduMK?68{&06|#gAn0pg=Dcq#({Ws!TMctRRzwXD>uKeb@kPlgJ4*ArS)X7$2SC1 zD|wnZ=}2K_V|hbfMFpv&2GdY)+dtdbB8Ek1T|r0H4H7qs$dMcc-~~AV(M>b!O}}qV z7mnClSMFy1`r!Hj`XqLRp%CYsMl!DfzmvXv*}4G?B_DvFkgPlZ0+5Pm1=P^fDbdpv z)$gKh0}22$t6X+jA+Dx48S_0O-@~@{s46Bp?ogu05=)yW6A4j=v`V&hB*O zcaQVQI43Ypg(SmB0tl|c{sQqI|c-oMk`bWza#I47))Ba)3ZR>s4bQ?_kY6h5qqs+IbJhn`Vnp3+}?fjB;rnTbUYl*N`cTwALlNAS{MUgy1 z2$gapg;v}L{|XqVy-K_r7Awh^JnaT!{7 z&Hy3Y)pIQ2ynt-p!DW4!6UQ%)?qocHCFhHurH!@4RXtC0)YSEcN2ta)6)X0Xp5w$m zNGBS#0c|uwp!P?uIFWw#X{Y%ri1g4lZY%N1<*ageq{{A_fN17Cgg~>W=Y|6}NG?E< z3)66T`Mo1-7Y4W0N5fxSQljTe!nXxW(6SKkez5#VI)=(^=%8G07as3!);sHLlgyCy z=n?TruG^qQBz5Dv@UbI%@$H(YQBKEzhAtVAA{lYy#N6Hg@q1ANo~;(Yh&CEt_wn1d zPDvy7RX2id^)-n)X=q5H9pH%tU{0H4k80XnG}p^TwX0uIy5r`{K*WNT3xK_^N_|B1 z7gVcr2cx`Lyo%afyX7Cj^hn-wrs&=X=tf3_sR%i!DMB3-uhd? zS{ahytrF^rQ7>c4y8p!?b+_mbLmM>yJg{hWmJBGFnOn%z5XVSWwdZan=;+O-P(A|5 zJ)H?F89X0?pZzxz=Swjss3<_%({OWV)=sVfixl79!*Q*mj*1GHXSeDv;uDZ)Yn`Jv znguI-X5EH;mdi3TcURa-)lD>oKP|Cs)^KTRR?t7RpV6iMjP<1hD{$Q>^HBx^T`8DN} ztzzA~h0IGLArO&EYiEP%OA^jnyfV1Py24|jMX1b<$iO(}V&**`L}z)8eicG(SK z#uJmE60lm6b(7(Hp6MljY7(m6BQPa?8t%R_W~iC%p(aQnRbH8t z*7cnQBHDkkD^Qe^RaObM(eV#wnGm_a%r4EB$Ul0^}%GAP{|b z9mQsTt8iFzHQRGm36XBrTOGF<3vEoid-+o@DQF*>vEE1t2u7MOqt?m7A1k5Z2~A2L z)C5^j0}aie_zZ3Im>-+8Z!Do#^m2%)01ol5#=5I@n?-z&5-zFcvM#Z~XVs+jk(v1pKhfsbLVA(}l z`g|F*-ST+^ZAMWU3ydD`$h8npi*Ipc@pXRo133gVqv74aJ9*Hv2ETpVhVH=k%C;Ue zoZ$sWb`djB8CXiR$RvUJB(j`9r`t6=d6jcaA+#YkL5!%3dZQ7h?tCWlD<8}v1l=&0 zofy6HN2k)M>;lW-rkdSkkOiF#E4ZFBalzAE=A_MUORFHzH|XflU8SVNz+yc0A+FTL*dRAr4K81T zJ*TqsESOix2|RRqti1B*@^dVWV!^oXapK5QW7ZG6lwn}eJ54-_im%GPbIt)JX8bgB0%;ue!1?s7K6P9nxX&TlMzag~Ef%-;^n_pD7g;ON@xeukl3vv0!C zj|H3Z*C8TeMZkTF6b%!XkG5+|2?ABba13HXDQxJh9E5W}5c4`}(iz;ks>5npBS^^>V<7IJ%jvv5fc=`^-9!zUD8Hbm4J4Ui>jbAz97XUVg%y++ESxQE;(hqezt_>u;1K z&N|7UMGBr`ezG|2yVCMbCj9ULld-}Ub{visTXGb_`5(W2!Topa73UrZ$bDKw5{B(lq%O}R&Z-MFe z+F@ST*PVrF--!q*;_n3oYro6i<5IUjam}0Rq-O>j;5sym1g!JBB4qK7DlVW%w^v<` zn^exP(gqt+5SSjq&%V-HNBuWmEC>@PZ}3{ES_g;txFI;5GH*@9@e&ar)np4~sTr>0 z#tQaW@i0!`ufEv&5^QV-7uU3^*u9P!W9Ub1%Zfjs?G}^-2i&)HLu;)g1QKzziwm=` zsVT{;BIp+M`_@)|&vLxH0E_d?FXL64ID^PkTg z(L}JLB1x(zz?)SKfJOCAh6|z6F&RyZm=8Zm^?n5ODRqp-E-kX(Q$!UtYz({4Ca*ny zPhI%5GC0l)-pSkf#KVR9{d{pD&+*{Xjz<^u)B+Z<*$sX)=j@i5Ih9)F#0@Atk}Je0 zoum|cHh^&(*xUs=uy_MEp`d-oI$u6wr~fiF|H6a6&_WQqDu0QC9hzm>i5fSSKcD4^ z1YL*jfcAN6A>qtmHWlg$No_2i1~uQ%DN3=H|7o6O*f`1SvJvK+bM+oVK1mfJ;o5NM26POl;22WuUoTNlD0$2~&i<&wiM_SzqU)$;K2 z5;m#9_*cGNw)3b6MhneNb+8^>=5q&+&eBei~mV=U9NmxEvm%TX7Gvxs7z!7@GQD$_24tl2k# zh|(;~5ANTwe_klh-hA5uzVaV{@%j0Fp|V;fZTc09GQbW^Cjj9Cps&;{I}NC*SE8l? z^kDNA0Ct410Z&JlfP}BlKvhEUG)pbb9WXRCU*{runj~zTp9W8hZPm8fWu>hz)?(7r z)zy?WNVmxRwNV)F%y6NOWMHt2l zx)6xDgUrC!ZLPQ2%v%Uah=H7f+X@N%DwhjBVRPt1@A4;@pnTI9*T7xJK=a?5Qdk5f zv&X7{6R{brADKHj3RK2Es)Ld8zO3g?#xf4ay2po0MuYWB4&V=e@ck4sGR07ho#+t` zyaKAQlUF!$LHb1^nm{AsPWfSWiYiYgmuVz*JOnv*TXbu(Tfy`vefZ3^=8Lm zZv0+=2E?4$!mGN$E%;phOJYiiL2|D(H31Y|g$y}zumi6BHx|tafypqVi?qKi@|gPl zpYS$t(bc}(o~Hu;-O6^0mAWcteAX9;*wD9Doo47kJvxB=7ciP0n%t8(j@Rz7N0F0s z@`Xcp9b0>3%1=*cB{t;X7?OHY``ea4|0(-#kyN|COML^+z4_O*NBa88ne| zdwI8PcXiIz0yX;wgdpS+YVv8N%~!!JefIca`)wf?RMeJeg##-JmaJZAzzk6iLO5go z#oW$I*l>kIpSU3mT(gZCS1fpKP+>lZHmT+&$)bkhm%2qq(ar9O3lZHbExJ#Z73Jeh z?wg;KzY<3Vr6$S_i(bIJJZ;`4+&g^LPPEmzU;QuP?;R1C<`^W@$Ldgtm^?Xp61A3d zGx^<#|4|9jPFeX0Nl&^~{h}q}`RD!6IZKD(`REro#!@fKB{Pm@22Y0=*FF4mOww%y z%>~D@>q?Xb>E8MEy0amX7LU0rE*<}7Jtng+2aes({R}9`Lc)M|4{w& zXiNW}>c8{yJ!n~py3gmwOz+{{0_ttXMOb0EWBm`;5B!lZ8oaZ8fWwq;-d-dn( z%YQW#`@x|=ZvlU^=xsMIqQw@f=Qbpp)xegKImer}Szqof5st<)N)cGTtCa7S4P!%~ ziu9*K-fP)EpPvHAniHZ2!&7G3Q?*vvF=Fz{uUD z4I73dYAQdpzx_B_CAnHd3>;k9hia{Y-~R*gAA+uq_oCP&h!i6IABaEJWRX|I5lo7_ zmNO?!K=U|^zJJXr>$tRUgq3SeNQ%c9tE`KMf1;jIa%MwD(*!p)%(#VkC_Kb91d-=>dsDylMGlz|L&;gMgu;_`9&)EZCi=Co2kT42ZT{c4O7gS(tL#>m>i zj`zV}?YQP{8ccft2}eDfP2yawbzZPiB`U6X$*GR^ocljKKg7n>fm@NnDxxyTW|hD{ z){zfFL^C9_*S|N`Fs`kSsDd|s9Kdk-ekmR*6&#P5VmQU$db(b}(8-KZBOs?}^AaRk z!>};*hIz3rKnWT6<$4wVF75UXUnAa>376`D5BN`E?W01oNWn73>3jw{NsO7*NVApP z?kn!iDP%CWYD5d@kEfal)Of&~KGY__=%gLXo9YQ###on}a0Ta=N>*%}{V5ZQ`uDE> zSMIlu-#ZV;;OLT_5?J!u=ABbLhn-EP&_@Fzzs%jJl9Dh0{89##bG<-Yt9FG_U^*GZ zaBg}oFx*kH-~ zII~2G_&EwSD>cryoUR%pR(kCGZ@5QWkgo#7bQ0Od{!n@dC@Rgl#5fg;Up`31l9CQ1 zPaT$WR>%NR!U^SHEY=9UY!5Xmrx*(%Ib?qpYy6&BBm-VQ?D{kgP;|z=C!zGI(M-2j zSa}aZNsSzBLwot2>+t?c#0!#<6k5xmbwlR?^GcO(!|?|<8u4NN_TuGzB%Zzc%8S)b zs6zqo8=s1(+1k6c&b~2GD~-76mmZ9!#U6w&G>dpL+_v6W7eY=KD8@U_Qahz=@jf>& z`kTwJ1f7grDS3~VoiBsS!>hdkx(GSQj`?#l_1DQ5H$!9PWM&(AWOT2+QrJCuSXMJZ zG^oIl7`2EdMeso8=J_Um+31jIQlk(K2%vjf8N7=|ni20!TB&m#FKiiAx)=eZxd^ZotXgPrw; z+YLMA`s;{|@DMAN6I~qlzJN^e{|a#IXK;vN!*KAn5g!QheGY?bxBupaJZf${i7=+g zS&_<4X^{0ak2m-hfaiY%U#7ll;g7(QPE;Cz0L#4wVTEt`0raQ)=#Sj!R{`S7>B;oI zhimX8TyGC_H1Qhe0|u6Xbg(rTZU^XFImk-Y-OkX3a7o3hzkIu**Vua+k%OD-Q9KC! zVGa%cDrs^sK;|IY7#=yVwW3wSkFPYT$RBneaE$7_(K;L5uFhj}eh=)uS`U|uld^SO zd7PNFS!^!?p+>kF=+6ax|3B^?)=}^ulrn-WIDN!o$f3XBXuSh*b@-n-LaPZk;Xmqm zyFGXLmH+N2)qyYW=qU%?kfXWcfGTEs|8c!%v^wnShYDpVU)gtomrRMKpMgPEW6-PK@qnp8$tqGlmkcYE+HhD>25UJR2VY$f5;x*j; zo5P?b9>E8HD2>z?ujv_j)Kx-vQ@T8(h^g0<9#OgeNtC4HIi0pHZvG5s*;Y&#oYa^3 z4AzJC;((>$dk%vZx#=)QtW$rQsILQVjjSjdmasz7nxViyBTD(y>=?Q&Dg%PRj8jnO z`R_x}4Tl>Dge;BVR9es>i(A!s13Lk%SU`UdsZ8yvh@8Z4obnLEg9%hOFC9dE$`5bt zU(l4F&`<;o#=gItDkCb5&rOT69<8BHF44qM>rV5Kd1>zwJrx&)LVAfxWH;l%zodP& z{jj!KOuEqm@6_Rh@+pVzgKy~yQF`HeTyslN{aVJ-N;9=WK1ky=tCj#e>HVzFsVYPU z&(n4gTaR_6u;QEG86c9VYx5{sSV+XSqTV&9T~^lD3%3W+^fEq3dTIX-q`y;87zj-) z3lR#>8&jsb$P=kxv@xAME7|36qec-0wfYAuw~EQR>K`QiQ`U=7R?Ti@2arc3YmwpGcG#> zAYyz}_VK$n`VJst(6SFO+1^l{mx(O;vC4h2fc*LPYPS}b8;rmR9nRrDXkaa4;QE^* zX){R#WtG1)q|Ky)e2WoZk`obLNxTw?7k*S zJ@sGo{fbW4`>;4I-?1LHTv597Koo{q2cjUDvbB(1q2~$Cwhj*Wh$rnh)bDuVZ={E8 z{5&Q)r;xU`!-pUT!Ct2($1@ty+*u5}()uQ}uHeAotn3%jsLIQmcXhm_f=puYfv3CB zq;%m&{&~`Px(<0cI!4bhg2*OYfv^OlMb=3K(-a0MFw%h?bx<5!k1wyyD z^+b}ax}CzW4}|!WTSvYM<(J@>WK1bK9daIMtu;0^Hf~|ic}G#u9a%6xJEXG5DxVN8 z{#vxEobbLDSoHw2_Nn;YzeG&0z003nOlA~y*>6NPMC&=+GH)>BbB@qihuIGQctv0 z!CVzV5JLg2cZ3J+ybY{Y&io0z(_c*ysan3eO>mTHmFkLl>X6nhZE=^AzxF)Sqj@w+ zX!DLenRzU>B$Fo=Z+{BqVJ;XMEvTPz>kc9)d;G<3=WgVHv2$kSEO{-0-lUSO)777c_JS1?}=f)t&ytp53 zE>U6|6T3`0s>c>4X32uLOOU|qPZlqDcvf&aE;cwgY^t_rK?Zba5<)oW3)~63%W!{Ol834frWyeM|kQ<-7x^ zE&(YFbV@0TRJT7>tbT;|qb&fh>gMfRSLk~!_Fcq3p|6XHxp!`FZEbGvu5$@XpKjQA@fopC zZ?1j?BeSo5)wsQJYqwfyz>6S3dw2Wxx)$4=qp^iv+}vsGZUO<;zO<9;dr%GhCsYG| zYHY1Ae^2Z&vZNKtKi#4f8slj z5NH-DaQiC+5pRd-0&h2NZR~CUYy9^5cH{P~8=Grig5lfRy}rG^3SGIqyB8M8&kwhO}9J@OrR0qGVOFbazR$F}3tq3`M(fdaJPlVk)L_)`{e ztawm{x^*J4VsrBnnplQNv5iQC*r2+uV%JEqQ_IrBtpF*YxS%uaG_u?}^u1R`Q z5xQwg3G+=W-qLv-&iPS1A}h@YoE7=YveETs@SGTGD4}5ls@>oS*KR8pZvajWIc^hA zF~P*MM^gji&8~1bN~{Ko9!(E0H>*gFeL1aA$?;PQBW?*Y2QmDn6evZF7RB##Zij+7 z@2>CcHb83M;4mPH%OX)E2}HAju=F}Ba=0n=nd>}_XXo2ZziEpAP59ivXB!FRQq*Eu zoTeASYE8{+ys^5o-q`u-&MqiE8Sl{ZoqlFYsw?YX-dJ02+}ylnWZKSw+j6F*+}vF? zGDE+a@SUrIwe0Fd zI2dXyP}}3gJDQMUDZ+F?O#epHxAb>oXWs>4j6I;4GibY=1ol&em5KFW&3hDF&lPc@ zx@Hg$P7KDpCBiw;p9%k=U}8oj`l74C5Q>RsPwk-F$z8md)Qx&Q-eEl)rWR3EcKGzT zWpPSO28tGxv8y`MJ!1)@q30*jkzX;t%V=a?c*#ztnhfRVsgT!NLqu1j(+aCZAa{;k z!V`>IBVhS?Ry9Yi3b|*`iC*AKl)!o)WW+8i%!=ehiz$6LS8ss!7vofs8YS5@mXuM< zw8Ba7Me7>_sS;|8Rdey8swfoMX`H`|1QCh^{1QYlRg6JByr7BkeFSYdn#10B*lf3& z;bAtTLQoG{X3y!rj7RwEn&Yo=(2n4nj5|*%7`_%U)MrIdQ!HeODA@96C~6uMO3k8D zZw-C7b4Z$K zhp?)}EA1KQb;COxw8Z32ntt6gOfw$gaEQG4+7^lH#}78utm1Nrkp)J?pGsxpuwV42 z@A%zeo3ml80?MY1|77gSwG-a@*x8;lfC;X}1+x|UII-n5WublGz&MDug9%0-hIoViS-D>P?ZEUaJ)P_v^w*1CMe4u!~NZd3TZ8{qE zSX<9pYC^T-L=u@GwW)22sN~;5noiq@hdvsQ=%)~jsyaQ6q^fyfM`DhP?YJJYEwnSG zqJ=o4cInD@;y#&j>;O-3`Ul}L%<%cqDYaZ35BnQC+liGy%J~;j&$iQY zaA^>AJVRIF8d9*Xa2+>!#r5tqUEdw-i@LOuwUVY6C6>`0jMI7D-S6H3mKfh`!o&HY7kWB*l2J;2iY-=f^beH!s!%IW=YYX6n~OV|H&{eNle zzw-aCE?!zn5#V3>^&fZhV}A&W0N#pupOpXCQh6cb|6Q(CtLggx>DhmUl!3@`C`N}B zH}dnl_(waq*MAz1=;xY#6V5lH+S#}j7}HpMP;7~tc{3L(&6KC)^P>a$aLw`Q@5Yr# zLVGSKQ?y}+B1wmmh0o_>Ipi_@IkIfwk<(;A!Hn1NPDph`bWDc5Hm%4DEAhC0)V{iU zV`p8nh@#(`c^kgjxPdSD#Qi_+`k(rLe`@Q0qW|~urP^Y;{HN=`TK_R@_)CfZBK*J0 z3$=9pPxt@nzjXhfuKzD>{~w(HFP3VTQYnzG|6=|3oc^f$67XN-`G2{V#(z)O|MXwF z{-^8zr?URns+AP~C0+mJ`hOK3ws$voo=pRIhV_3D=YP8Xr|W1hnr70A< z&GEqTJmhCg)^mJ=BO6$P-7UmuvFDf&Ire!r>z9w_M7lb*yuc_vJM<=(gYvDh<8d;9 z{4#cW^|phc61TTE)?jW82hPCH4V;I@?d=1@4(4nXRK@?dohQF*X!A0_VsMh9kiWCg|6T4Wmn)mT1gs)+sVC#1r!ME z$GhYDUCMqD@|flklvn^-`3|o6xrI{IETB)WM9i^|p@@!GKs>3dP)ZJqvT}|^I1tcF zDBg*evJfprU>`m5xgYRA*iu*;Ch`iNu$p4)2T zmZbPr^PtHalq`^edz|&5)FM5@yO!t4SNM2r-i60|@4g!6W^q=O#rt2FxUR%g(9?+l1p?+D!!ssDD!XQ_&vgOKBp#=X|&RQZ73a!@APw7-)qQ}SxY|A zL^4`E5NgKGu=O^GiX-7$y}7l1t6sLnueHrvx7OEoH*Q_4ml$dSt)zh{=8@lZc^Vz= zKw1aBAA2-Mj*i7R#FA9)W1N1*LzvjZhlM-N9#>xHKggbz)-PMq7e}HVrUnpq3*P2T zi(uQl`rUgrCMygFATQy8US};Ba!ybfO}uW-DM*BufWVY(Je>F-Md#;>^I3}-fnEvP zayuqZ_#j93!;&+y_W&CS7jEL;dA^BcpCaW_l!1L4nd=N=J^sF)o)C_ySKhBs+p+kqZf&-f7k z+jIw>G3>Ps1jm|;9V2^D2_Ajb7lco2SUs2_cPZWo&c-)nXDv(^z5>$cUZf+Yg`77&r7u4>BhoLaJk zv{=b@+($l=Qjj#O@=}AFs!nPGVsmUYY5GR07rD64qO5v**qZc#i3|IVzut53@r}cc zHpuQ_6ZO&p4vbJDPHC}}0)j2Lo6px)$-bhstU&LG^3T(BtL-*>!~HcJzxK*&Q?oL_ zZGHre%Tr_XEgnsndpzd?#=+Q~P-c!Wlo^KE?HmFzfE!n`(a8}kfL5VUV3v~%FSt>_ zHV=mW`hy8@7bhy{owmd~K@ebi&g1AA^uAg+3MyIKaYkG=*KFOrM^ztp+yM;f;Zb;@ zlRC|@kS3A&KN`EkF(mGfK;K8Lh0=SZ{2&EUmI(5ZTuf!bY*~Q2CZQGDYL;PzA#JjL zSt^v{(2O3TtI}Y(hsf@ha9A&H?;BrGrz zQVD`s1b6odNtVe7QQ#cVB0ys@fbTu%wLyZ=VClwe`+vGbL5To7F?Jo?WLUT}Mh8d_ zHau!A_ITHYyPSzPeNk?&9QB72poEy8$GQe0%D4gL2PGV->MmZCkX7MAMblR90RTftri-d{!Yf%2hIu-J@gISD?UVA2 zzq17Ywo*O5ryA=KP5%G(zHGUXV@vG4zoME~(S=eMHm)Kdben2YQcJyw?8SE|m@EKA zqC}toqX4pbAv`+5kM@%tj(M?T!Vh-LjKhBL!-T^><9lcP7d}g7R%R_&NUE)S#g32& z6tZ$TdGh4hPtBI-WUINc7()EG-}BobC4<}pr?WQ2u3$w-a!E&XY za7e48ub9j!xCx};;Ry(^TH56-2#7RlK@_xl{vP7GfJH9(!08lmG?RpA)Xbc8YQi*1 zYQ7`?43M^~@0vkBwY9o&H*R|7#-o>B2;||A`>x&DnpS1Y#vV`$n&V{dRB`wBdZ8gY0R+d7^}y z7SG4}EY_u*E+oyLo+d9vjwSgX!Uw-m7+knaP)MdH5*t6lWzTXu5?vy}Tv!92=R$1+l-+_|=G$XQgma&I720=;+SwV@O0W;%uU@P(e zu=i~bMnnZO{n(g}ysMgDg8z#&h%Uema0?{(+QWx_NqrMbgtn-3<$Fd6r%I_cV~x+E zy?UYGHebpyyL-zA2y`CYuA;A6S*nB(=gTtSXa=XFc^3J(V_nn5OZkBxp+;O zNR1irt$f{;Io&-#=*{b+w+4vJ-Y6^o4VOnVnY%ue<>o9dd&KFuI~rV(sC9s7Qm_YS zXPB81moaBB(JFT|N#hAeTm^cUCt2e^CDvp=Q@@H{YvOO}_jb?s0DEikyc&&g((Abf zoDEWLQc^}}L{>NRJR~WvXdmOS$*r2L#1V!wmpQZoLTXuAG{3|k${A1q$ov(@U;sUO z1Wk01tjt579&Xeu5()@NEO)oPFdQH$y9_RUAl0OxBT@gYMo-9#qEYXt>QM= zz$h4wg53!&0d=rRDd;o=pUB)tUA=?Uy9CgJyYE>y=yeMCyErbyExsKHM(wy+Z*wwr z?C8140XaM{w&z_#}M@O<2zN6o}IBi8Mu zsDv2Et={bT5AmQ6CJ`L(0bnhr!Pd2KtfV7Y1!HIu!txoQ_jKUThYsBG#F}a{^F*fc zyI_|DOoFkGO1Yi~A|nC;&@gCU+$9;AODB-}wS@*GZHQpWG*4S$Y6y`_TFxe+!#_h1 zR_8p)HsFs~QElZTyjecns#${;in4H#3yBIPEYXd;&?mzV-t>Sl{>bviur%a^nWZOYW-^L|zMJt`&6p z>UNhe8^#EL>{9j!0=h{=)WTfZv)c_&LcOjnH9gEARbLTWWV!CTH6&~lxN6Biwy>*jWwas&jVr0R-#L$LGqUHC9_0ZgX1FP*l~qQ z5uK5Q-U(HS8HTD1-YfPc0_X~1k4#c4EA!oG((ilo2pq^QBcc#R(KN?Mno@_4O1$|I zu%&*X;;uXHag5Ss#zt3r!g$zBv2W7mDf}*~c?|@ylIVsEpQ5HLP$*KWL;Z$?bTAng z2WQ2>s6&>}5pn0&(i4lwDQ&UU8Cb0H8TP!kPZ}X11l^O>J0q*v6jh^UJs-W^lbvTW zXw=kXFqtrjJw}df7@VC&WmIA;vfbuQTi8$;9dazF)mdV38FPT?$HEXzeZh!QnptMd z1m_0~ur9hUNn^4Bv?S=i7T$4-SAWwTKt}KmcEAL_qVK5RWhZ1EsA5$K*E)o*+w*Qh z#*x(461QKP=cExdGN>V+^XSpTbOQrd9G#weQNj>xc9i%%hJur#-Z*tPy`f9nPuXGR zaJ^=ElW`Z#5N%i%Ftg}CJsDb9P#x}c*v*JCfZGP8U4qaG1FWL6a~<**y5W=21@1j* z4FZ8WuPIh{L>z_I7}_$gY0tm(drP$QKMnzbBilV9lW1WdKvfC{R|V(s#x{kj!3GIC z7oxlLZ&3&d%RRsXnlC6c1mjxvU%wPs_(JHDSOLVkKI9U${*I_1Gm__e=F^55eNjLY zDa;~PB;i-w{`$*2|2*Z=5BzDS2fv26TtK>vwIl&`Gnvk7b`2+g_KEiQnmCpdWNh0uER)OZ*nMUl%Yb-bwC8lWx|q*bJMJOTZD zX0ZS`AZ?42V#e~CXH0CldGWMZ|GtnUAOK@>pwxEUE1?eXYAKB!O}8%CK`ZnwgL4*% z(OWpc!*VACn@@!c)R~AI@=-dZ-MYk{6()sxzkd64+gAA?-wuevYb2thME^l%I z=yl!^gpq*-hrz&}aG}p?jYT6{&>>O2_R{1W)-Z$fyR=2`T+j z{YD@K?r3o7kKh^*@_HUzrKAgIWNDxzEFn@6Xt;Pne{T@lFqwxB=_{_DJ~+~;4nCLQ z^3d!hk_U^C(v7u&dZ(^hVC{xm8AE6$ZmpzeLOh2`p2AR{5`Pz+E=?yTp=1*WGjKxj zfQ~M}D?xwkzo5&s^g!asuZ1wikyC=Vj>vHdQ z)e;h!kdmZSwyfPDd$b%h9piqJws6QO(UCUXNCM++0; zrz?w4LLsrfEda`IQZN&mSO9f!&dsN@ z`W*4PEA|+udpij}Pk_6*>_*PHiv+hgzy|Rpy7?mNnYXIyn6)Pos`~S; z7ZoJ1^NtjExt{ug28mA^Dsbhtt;pnKiU1LAW4bMcy+QlJ0#GVNh=sPX-`vSU#_>bY zf!)XOHXyW0KPzkkI4FGaKcW~G!HjG6XH(H;X3v^J$H9HP$Hww(rY3bk$w-tKf}YF)JBSk z8nnOGji{Vutcr1Xz7}#LZVC?mc;4^(odBlMyKW={Wmu^d&jAfqvGH$kA)MZsnZx*_ zx$$U;*sE+05ZzNnIlQK3>e7Vbz@9i{sHUREji8wnf~NaK%v9Z^?k66`mL|L9(Dnx5 zjvtP!;Rq0|J?PaeuRVs*`Kr>dZq8%nT9_>k0fs_d05cc?MzQJ&F63}<)$`$;B8#!u zJ(tbhIbIhcDM7AN2K0jQJep&Mz{wKU%{^vIYvK%vK9i4|PJMANOPo2Q`z6}Tam|Ei z{zre*##El{p$Mz!X=h!a74Wx)L-I$&Bx2QtFX1f4-#CvKBh0bqwwjHMGpF!B zK745QtvIgwMLTEoQzbr1x~;T?vpudfOXzjmk4kbb+?`2nTXP$8Y=fo;7m9o&thf$& zI@3;id^0GB9mkl{%#NXFK#FLJ{2pnx)ux-qm8?CU#o$leA`Il@UBbT!Fz334+~@zk z&;Omu|6SeP+TPhIZCAH9D_i&ZzkhrAzwa{Z_pURZHk|+Mjq3J& z{_p$z-}m{y@AH4(=l{OX|9zkT`#%5ouOXVA5k}C3 zBhxQw-4-5dJt8$DU(erBf~X>S7SY@A`dcKbP6>lP3ggBTBeI3kNdeH)&^0CrS3F?a z=tIPzY6USJ^i+F`xK^;g4EpC*G-@|Kq6ZP;Ok+(@t{~L1lC3@YF+3uLghk1}0L_{9 z2>r}#0qo+H5|UdmEUdGQ;c-CTVn@(9@0ccX*j5c7Us8Xo>|bJ$jynNJox##NORwZA zDzYI2W(HWWHwL!3MHF@%jC(#X!g+&_F{WsIH5grBY&<|Uq)9BXp}&C7Q=YriLZ>DX zVYWO9nNerUql~tMG~#6I>C9}E#0~c^I>CslBG^Frhm&zx6FFQsDnM-`RH#aa%y=rm zwfcSt#|D5vv1q5M9)tj19Qi{p7!@^|UmAwzr&0yDN*u0nZ-_Xr_|B2Z3tH&o5K&j7 zfv^S1DhcE@9VM>|GS|b~oNjRS%R_W0Z&tn>w5vVyet7f_GoJIbm^3EyJUJIWm#7F=b`jyWJJRx&4-((G<5Y1Wr_(F=4=DZ-_7sC1YsT z#m{?us{(nL1oD-`fp9c))D{3c6(1_X5#ERFJ1YmgDpk`jcD=83`7WXj%Z6gIM}qW5 zQ0GtlJ}8_iWdx(_O|J)p!or~UG#?04k$XcH1ci#t9Uvr zI=^ryNXDFaT9oAB{Njw{`Ni4PbJ*wwr+JmLya-)#&xrJzK=aBGZAT*_x}dm1!LDb7 zC7O|aiMNEWNE{ID)M=-9fpa=a&uB?1l3-<(x5^5W7E8V1fD%v-ZpRa$H&U_Zwfx?V z86$O4W8g3Ly&e0bKE6gdUnZk=d~*&tz$oJDvTk`I@fW(udng#7Uk08vD~Lpri%H}! z_8!c+KGn|QF_%fyC;<5`kHiYn+eZWq>D(Mg&Ij&~`3GW}_C(ZTm){CtiwqSr4QujP zd+`Q2!g@%#=kfW#_kqled(q;6K9%8Q$<9~4q|{ZDh|ZhWcg9%};MLqBPP zrDgJxnKg4zp9*IIZvbE-Bho;yV-f0JDZ4-1M!8H4N*YjM6Q zl>@+#PwM3|iZV|)E@Q3!AV&@p`JmG0K#_QIo23vDY^xYG3Q-kVrnE>egt!ZmRir{% zS%)%JKg^u@i6*nN;%3NYUJnmq)p=r5UdlNUYm~Oa$d(DX=W^n!2TKWU^GfX`#JAjg zEPs9)kln@UcvlcnXPM;~R$F1Vkh)|aDFT&vHw*O{YvMd)j~+d|O~%3b05Gp>av~XsFvoT*p%McM>`B=tItaIIwz*oW!l&|=?^*+(upX?dR@hF)16o=+twZh)cQ<2?Kc@SpNq;4Z6TcH4@sWwQivtVC?9*I??OIPyOXcSx~(^=@A)i;-; z<}-9Fh*R_eiBrFzAmvW+;X8y<&F&2PBEm=}8eBdJ$|ux)BpLdpFZm^zsZ|69ktszX zA&c`W$wkBxJ(mrWjp{<>Mn2||k}xRiC`Bf*20MkDH&MggPKv*=7VeYC?V4o*jbpKz z#HJiY(%K+qw?L%7jdcBs*noa%g_^M#bTC;-beBdJwL~;4m&ksO>99&d&cU=%uuHbH zq=IdQFj*z4x4lqHY$odQiF2vMc*^H8p@Mxt&p|ff{2{7AbZbHV4w3#Y#p#qmAAMA! zTDjcrgmB8?77Z@ZGh>{Q6il=8k9v(v3qR>6&_2|#ZDs5q^-_uhm>FMX-1tr$g!0X5`864XPKZuZQ{5Y$h&RJ{G!~TkA0j3FL z(1_K39gJzL##DZ)iFHF`>UdVSQ%(n&mA!G?m}s+J=4tEM=z^S`;dzH#sW|0(|cj#L>#R@TS) z>_v>+$Uhe;9ij&h4ksYeL1Upk0p=&5wC?CyUb5bHeX-AF_d{=dDi=vCF{8s z;2-qSf0$-~-bh6nltVIc`f*o62~>LU;Pmt~>OKgEeXAW<#Ue=UXTe9yI3x5cEp*QB zBLEdXtqD)(+_r;`FCJkDNGw$gynPv;oS>`4PezjwDzEzH&oJW$4-ocpq-YXQkrE1e zh}h*B#2XO3#_$1_{*2tmt-`5vD7U0X`Kdzy)D#sWp!|d1diUI-LMWC$?1HR1LT4iE z8WVk52xpfg%G*8`cY=|uQ*z8b2P1{cZs5DFpm7*86f7Xft;pRFf)iOIIyrdtomsk`n2|*Z;4FruEGfrRW4x7S0PEg z;xy5qM@Qdc(0Y5qUxx$Ag@JCuF69;Q+x&wBf;AbQkAPDYMI8EYmO8pv%|{8RE-)~z zn}Zq12P2Tk(d36{;)QKGbL>d3V$M!$Ru51ZFszIoqXA9;RwhXX(jwRT_U+3TXa;Bh z0NSMx@xF5%di|gc;(k9MlpvrZ;&r)15UGO!tzq*{W9p_4E^vPD&GYiR=VgU&GUy>< zv=wS)%8JZB2d=gM`lV~(38hhaza%9M!r_DlO@`RTBjTFM9sdl(6Teer`HZM2fRj2W zKkxCiMj{Q|Qd31#=ah`rSCT3yA4C8N>?<)&b=$nUJDQ zM&gk|*%qt>6HId#ihA*p8%|mvbYhB&en9(YiTW#eB=AD%4BAoo&Ee~pZ{D699=zFm zeu#fwAHD_F23K|pXTcvu-C$Ts?T5vFkE)1xj54mwn_t!vVXK~8Svl$)bH7VOC8un? zkx?53zQAcj{KXB_({sdCQ$$iBqFb~)QZ968o%$UE>$;c!?&ZJR#eZ*ZZ>*O#D%Gvc z%J#kd_nVXdv;f&pCjV6{J8=3${C9Pyisyf8eP{h%{`++C-)E84u+p*EGLrhTpZfW- zAOB35gOd%+m~E61p@|XEd~yPp9Jwi3b_wpGQn@W7rK9pVI=S*&lb{U$*Sf*lWDVwW z8&C8oWeUxp?tg+yo1>*E)Y!EriDPx3&VuwGnW(8=8uxwE2bRADCV&73mLITMK7_v^`QrM+V zf==U7VMfVkJfkr8!ljGPVa~uD(n}aW&jxexYF+gidp%#cvhNsOjxU-pN^n-VFoIyo zm|{DQj%>#lqQ2mkBTZt3ar=DisSxk zHa)=7dZ{8}uo^*1)6W%oH=;OeaA9$(PZ`#UR~z1JuIX!1gLywuIECq*0hbv3ao5RB zs-fq>anm)P*CK%~eLw{JDdH-As$o}xXyP-ne(Mvn@rg}y!|>7)=Cm*ybSdSsYJk0( z4QNDepzVO)YrtY$gapU5s@S*Wdhwt=#M6S8c_JJZUU%vtM#2JxmJ3Lb7Uk{~$|}6a zesApA+~Thq<_B8thmt zLbo3^D#WMIL8mD{ehf%7h2Ok!4UYQbzUEGkm$pkjd$JR}d-z?k4q!R-!Jdn}gkrRX zV*!wcfR457QB`kqhs7#}!m9-J>R~6MM>3fS)i;zx8NSqKGxr(DM1ww28-CMp!@;D5 zE^1qWPzt(?k0_uPu3P#Q<~ ztKOjHVj_cmN~JWS&j%rY2K0A$!dDS9+f+n zQ!!!Yny6c|Z2-d2QElo+ZExrkanlx%B+-cLXXxv#?hxRKo<4;W=P=TpIg2Scx)XWh zc9+5KNv)sL7ja~W^s2}#Ha6cPL&x(Z1LjcHriw< z_eGqzd73Jl_KJ1lR)0cO5>(hv@7n59UTGth4e?cGogRN|T=oT7mdS!d z6NAQ$CSe0Hqwxfq!Klb@SeAKvR+qU}Yz#&k&Bnjzf2M0)DDx_aH=OA~Jj z5(J6NG$oH%ICjTPL@=1?mkoH?DMbSc)^l6%*aKL>FU1!BMc$4tTim-AO#K2`sN)bi zY2dRuGE>+W@xCP{ehxl(+>l@EK8UqelH3XBvvKJxRGw%uF>PGieun+SEKO*r0y)zd zGhn|kl!F`;>&9bgWXbvsZhi51W|o_R{XhoA^?NS7;Nplb?VKyN!sP|Icu&zUlq-ni zLP~IU0I0y13PzS1xRl)P_MU0K4*mZ|TK`|Y*Z+SK{r`^X|FyljUaD+t?|xCeSO5R^ z^#8&WrifW#N|-wBllXsaZ0#ujugdm1<$vA2*Z+T#f2aakLm73gX043_FO0fgIEacW zA(3(bTSNA54KV}t>hIyYf~WA-20fP!NAQ5yO?)P>37@g1WleorX;5n3@h|r^UjeNr z_|Zc*1nlgKQgypjS&KQ-5nr!yX%03YvL8f<*xbR zc@QQ?LfZy*^rW%Au3mYdy+|!&NM~72Os)D-!7Vx0HNmKK@HZKh0iXa0V02vyhy9dS^HDIq#-0GQTh;aAyZ7H+AMCyyk6%Y${qTJM`>Sen z(b^67u6~#tZe2~j+245l#rpT#-<^Ng>z9B3`1|L(>w{O(%U9q0)wADs_M`XX!*7qg zi^{P5errD*Y(3umsk<9pH5$eSX`4@vP#G9T1h1FR-^NW_L720D@QZ-is@qX1!NxAJ zBL+TXZOa@KS#_&4f10B9rI^hHU|-+#Nmaj^Z*f8P)MmtQ>|J%0D`>$lIm$=h$f`QdhGGiP@dw%pYgQ?cCH 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 ++ return wait_socket(sock,ssh,ms)>=0 && esp_timer_get_time()channel)return; ++ /* libssh2 retains ownership only on EAGAIN. Its session owns that channel ++ * and the client's local-disconnect callbacks make destruction nonwaiting. */ ++ if(libssh2_channel_free(shell->channel)==LIBSSH2_ERROR_EAGAIN) ++ ts_ssh_disconnect(shell->ssh_session); ++ shell->channel=NULL; ++} ++static void shell_notify_close(ts_ssh_shell_t shell) ++{ ++ if(!shell->close_notified){shell->close_notified=true; ++ if(shell->close_cb)shell->close_cb(shell->exit_code,shell->close_cb_data);} ++} ++ + /* ============================================================================ + * 公开 API 实现 + * ============================================================================ */ +@@ -114,6 +140,7 @@ esp_err_t ts_ssh_shell_open(ts_ssh_session_t session, + return ESP_ERR_INVALID_ARG; + } + ++ *shell_out=NULL; + if (!ts_ssh_is_connected(session)) { + ESP_LOGE(TAG, "SSH session not connected"); + return ESP_ERR_INVALID_STATE; +@@ -154,10 +181,11 @@ esp_err_t ts_ssh_shell_open(ts_ssh_session_t session, + /* 打开通道 */ + LIBSSH2_CHANNEL *channel = NULL; + int rc; ++ int64_t deadline=esp_timer_get_time()+10000000; + + while ((channel = libssh2_channel_open_session(ssh)) == NULL && + libssh2_session_last_errno(ssh) == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 1000); ++ if(!shell_wait(sock,ssh,deadline))goto setup_timeout; + } + + if (!channel) { +@@ -168,6 +196,7 @@ esp_err_t ts_ssh_shell_open(ts_ssh_session_t session, + return ESP_FAIL; + } + ++ shell->channel=channel; + /* 请求 PTY */ + const char *term = get_term_string(shell->config.term_type); + +@@ -177,14 +206,14 @@ esp_err_t ts_ssh_shell_open(ts_ssh_session_t session, + shell->config.term_width, + shell->config.term_height, + 0, 0)) == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 1000); ++ if(!shell_wait(sock,ssh,deadline))goto setup_timeout; + } + + if (rc != 0) { + char *err_msg = NULL; + libssh2_session_last_error(ssh, &err_msg, NULL, 0); + ESP_LOGE(TAG, "Failed to request PTY: %s", err_msg ? err_msg : "unknown"); +- libssh2_channel_free(channel); ++ shell_release_channel(shell); + free(shell); + return ESP_FAIL; + } +@@ -194,14 +223,14 @@ esp_err_t ts_ssh_shell_open(ts_ssh_session_t session, + + /* 启动 Shell */ + while ((rc = libssh2_channel_shell(channel)) == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 1000); ++ if(!shell_wait(sock,ssh,deadline))goto setup_timeout; + } + + if (rc != 0) { + char *err_msg = NULL; + libssh2_session_last_error(ssh, &err_msg, NULL, 0); + ESP_LOGE(TAG, "Failed to start shell: %s", err_msg ? err_msg : "unknown"); +- libssh2_channel_free(channel); ++ shell_release_channel(shell); + free(shell); + return ESP_FAIL; + } +@@ -212,6 +241,18 @@ esp_err_t ts_ssh_shell_open(ts_ssh_session_t session, + *shell_out = shell; + ESP_LOGI(TAG, "Interactive shell opened"); + return ESP_OK; ++setup_timeout: ++ shell_release_channel(shell); ++ ts_ssh_disconnect(session); /* pending open/setup must not survive as a usable session */ ++ free(shell); ++ return ESP_ERR_TIMEOUT; ++} ++ ++esp_err_t ts_ssh_shell_request_close(ts_ssh_shell_t shell) ++{ ++ if (!shell) return ESP_ERR_INVALID_ARG; ++ if (shell->state == TS_SHELL_STATE_RUNNING) shell->state = TS_SHELL_STATE_CLOSED; ++ return ESP_OK; + } + + esp_err_t ts_ssh_shell_close(ts_ssh_shell_t shell) +@@ -220,117 +261,51 @@ esp_err_t ts_ssh_shell_close(ts_ssh_shell_t shell) + return ESP_ERR_INVALID_ARG; + } + +- if (shell->state != TS_SHELL_STATE_RUNNING) { +- return ESP_OK; +- } +- +- LIBSSH2_SESSION *ssh = ts_ssh_get_libssh2_session(shell->ssh_session); +- int sock = ts_ssh_get_socket(shell->ssh_session); +- +- /* 发送 EOF */ +- int rc; +- while ((rc = libssh2_channel_send_eof(shell->channel)) == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 100); +- } +- +- /* 等待远程关闭 */ +- while ((rc = libssh2_channel_wait_eof(shell->channel)) == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 100); +- } +- +- /* 关闭通道 */ +- while ((rc = libssh2_channel_close(shell->channel)) == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 100); +- } +- +- /* 获取退出码 */ +- if (rc == 0) { +- shell->exit_code = libssh2_channel_get_exit_status(shell->channel); +- } +- +- /* 调用关闭回调 */ +- if (shell->close_cb) { +- shell->close_cb(shell->exit_code, shell->close_cb_data); +- } +- +- libssh2_channel_free(shell->channel); +- shell->channel = NULL; +- shell->state = TS_SHELL_STATE_CLOSED; +- +- ESP_LOGI(TAG, "Shell closed with exit code: %d", shell->exit_code); +- +- /* 释放结构 */ ++ /* EOF/ERROR changes state, not ownership. All allocated handles are ++ * consumed here; callers clear their handle after this call. */ ++ if(shell->channel && shell->state==TS_SHELL_STATE_RUNNING) ++ shell->exit_code=libssh2_channel_get_exit_status(shell->channel); ++ shell->state=TS_SHELL_STATE_CLOSED; ++ shell_release_channel(shell); ++ shell_notify_close(shell); + free(shell); + return ESP_OK; + } + +-esp_err_t ts_ssh_shell_write(ts_ssh_shell_t shell, +- const char *data, size_t len, +- size_t *written) ++esp_err_t ts_ssh_shell_write(ts_ssh_shell_t shell,const char *data,size_t len,size_t *written) + { +- if (!shell || !data || len == 0) { +- return ESP_ERR_INVALID_ARG; +- } +- +- if (shell->state != TS_SHELL_STATE_RUNNING) { +- return ESP_ERR_INVALID_STATE; +- } +- +- LIBSSH2_SESSION *ssh = ts_ssh_get_libssh2_session(shell->ssh_session); +- int sock = ts_ssh_get_socket(shell->ssh_session); +- +- size_t total_written = 0; +- while (total_written < len) { +- int rc = libssh2_channel_write(shell->channel, data + total_written, +- len - total_written); +- if (rc > 0) { +- total_written += rc; +- } else if (rc == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 100); +- } else { +- ESP_LOGE(TAG, "Write error: %d", rc); +- return ESP_FAIL; +- } +- } +- +- if (written) { +- *written = total_written; ++ if(written)*written=0; ++ if(!shell || !data || !len)return ESP_ERR_INVALID_ARG; ++ if(shell->state!=TS_SHELL_STATE_RUNNING)return ESP_ERR_INVALID_STATE; ++ LIBSSH2_SESSION *ssh=ts_ssh_get_libssh2_session(shell->ssh_session); ++ int sock=ts_ssh_get_socket(shell->ssh_session); ++ int64_t deadline=esp_timer_get_time()+1000000; ++ size_t total=0; ++ while(totalchannel,data+total,len-total); ++ if(rc>0){total+=rc;if(written)*written=total;} ++ else if(rc==LIBSSH2_ERROR_EAGAIN && shell_wait(sock,ssh,deadline))continue; ++ else {shell->state=TS_SHELL_STATE_ERROR;return rc==LIBSSH2_ERROR_EAGAIN?ESP_ERR_TIMEOUT:ESP_FAIL;} ++ if(total=deadline){shell->state=TS_SHELL_STATE_ERROR;return ESP_ERR_TIMEOUT;} + } +- + return ESP_OK; + } + +-esp_err_t ts_ssh_shell_read(ts_ssh_shell_t shell, +- char *buffer, size_t buffer_size, +- size_t *read_len) ++esp_err_t ts_ssh_shell_read(ts_ssh_shell_t shell,char *buffer,size_t size,size_t *read_len) + { +- if (!shell || !buffer || buffer_size == 0) { +- return ESP_ERR_INVALID_ARG; +- } +- +- if (shell->state != TS_SHELL_STATE_RUNNING) { +- if (read_len) *read_len = 0; ++ if(read_len)*read_len=0; ++ if(!shell || !buffer || !size)return ESP_ERR_INVALID_ARG; ++ if(shell->state!=TS_SHELL_STATE_RUNNING)return ESP_ERR_INVALID_STATE; ++ int rc=libssh2_channel_read(shell->channel,buffer,size); ++ if(rc>0){if(read_len)*read_len=rc;return ESP_OK;} ++ if((rc==0 || rc==LIBSSH2_ERROR_EAGAIN) && libssh2_channel_eof(shell->channel)){ ++ shell->state=TS_SHELL_STATE_CLOSED; ++ shell->exit_code=libssh2_channel_get_exit_status(shell->channel); + return ESP_ERR_INVALID_STATE; + } +- +- int rc = libssh2_channel_read(shell->channel, buffer, buffer_size); +- +- if (rc > 0) { +- if (read_len) *read_len = rc; +- return ESP_OK; +- } else if (rc == 0) { +- /* EOF */ +- if (read_len) *read_len = 0; +- shell->state = TS_SHELL_STATE_CLOSED; +- shell->exit_code = libssh2_channel_get_exit_status(shell->channel); +- return ESP_ERR_INVALID_STATE; +- } else if (rc == LIBSSH2_ERROR_EAGAIN) { +- if (read_len) *read_len = 0; +- return ESP_ERR_TIMEOUT; +- } else { +- if (read_len) *read_len = 0; +- return ESP_FAIL; +- } ++ if(rc==0 || rc==LIBSSH2_ERROR_EAGAIN)return ESP_ERR_TIMEOUT; /* no data, not EOF */ ++ shell->state=TS_SHELL_STATE_ERROR; ++ return ESP_FAIL; + } + + esp_err_t ts_ssh_shell_set_output_cb(ts_ssh_shell_t shell, +@@ -359,124 +334,40 @@ esp_err_t ts_ssh_shell_set_close_cb(ts_ssh_shell_t shell, + + esp_err_t ts_ssh_shell_poll(ts_ssh_shell_t shell) + { +- if (!shell) { +- return ESP_ERR_INVALID_ARG; +- } +- +- if (shell->state != TS_SHELL_STATE_RUNNING) { +- return ESP_ERR_INVALID_STATE; +- } +- +- /* 检查通道是否关闭 */ +- if (libssh2_channel_eof(shell->channel)) { +- shell->state = TS_SHELL_STATE_CLOSED; +- shell->exit_code = libssh2_channel_get_exit_status(shell->channel); +- if (shell->close_cb) { +- shell->close_cb(shell->exit_code, shell->close_cb_data); +- } +- return ESP_ERR_INVALID_STATE; +- } +- +- /* 读取可用数据 */ +- int rc = libssh2_channel_read(shell->channel, shell->read_buffer, +- sizeof(shell->read_buffer)); +- +- if (rc > 0) { +- if (shell->output_cb) { +- shell->output_cb(shell->read_buffer, rc, shell->output_cb_data); +- } +- return ESP_OK; +- } else if (rc == LIBSSH2_ERROR_EAGAIN) { +- return ESP_ERR_TIMEOUT; +- } else if (rc == 0) { +- shell->state = TS_SHELL_STATE_CLOSED; +- shell->exit_code = libssh2_channel_get_exit_status(shell->channel); +- if (shell->close_cb) { +- shell->close_cb(shell->exit_code, shell->close_cb_data); +- } +- return ESP_ERR_INVALID_STATE; +- } else { +- return ESP_FAIL; +- } ++ if(!shell)return ESP_ERR_INVALID_ARG; ++ size_t n=0;esp_err_t ret=ts_ssh_shell_read(shell,shell->read_buffer,sizeof(shell->read_buffer),&n); ++ if(n && shell->output_cb)shell->output_cb(shell->read_buffer,n,shell->output_cb_data); ++ if(shell->state==TS_SHELL_STATE_CLOSED || shell->state==TS_SHELL_STATE_ERROR)shell_notify_close(shell); ++ return ret; + } + +-esp_err_t ts_ssh_shell_run(ts_ssh_shell_t shell, +- ts_shell_output_cb_t output_cb, +- ts_shell_input_cb_t input_cb, +- void *user_data) ++esp_err_t ts_ssh_shell_run(ts_ssh_shell_t shell,ts_shell_output_cb_t output_cb, ++ ts_shell_input_cb_t input_cb,void *data) + { +- if (!shell || !output_cb || !input_cb) { +- return ESP_ERR_INVALID_ARG; +- } +- +- if (shell->state != TS_SHELL_STATE_RUNNING) { +- return ESP_ERR_INVALID_STATE; +- } +- +- LIBSSH2_SESSION *ssh = ts_ssh_get_libssh2_session(shell->ssh_session); +- int sock = ts_ssh_get_socket(shell->ssh_session); +- +- while (shell->state == TS_SHELL_STATE_RUNNING) { +- bool activity = false; +- +- /* 检查本地输入(优先处理,提高响应性) */ +- size_t input_len = 0; +- const char *input = input_cb(&input_len, user_data); +- if (input && input_len > 0) { +- activity = true; +- size_t written = 0; +- while (written < input_len) { +- int rc = libssh2_channel_write(shell->channel, input + written, +- input_len - written); +- if (rc > 0) { +- written += rc; +- } else if (rc == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 10); +- } else { +- shell->state = TS_SHELL_STATE_ERROR; +- return ESP_FAIL; +- } +- } +- } +- +- /* 持续读取远程数据直到没有更多数据 */ +- int rc; ++ if(!shell || !output_cb || !input_cb)return ESP_ERR_INVALID_ARG; ++ if(shell->state!=TS_SHELL_STATE_RUNNING)return ESP_ERR_INVALID_STATE; ++ while(shell->state==TS_SHELL_STATE_RUNNING){ ++ size_t len=0;const char *input=input_cb(&len,data); ++ if(shell->state!=TS_SHELL_STATE_RUNNING)break; ++ if(input && len){esp_err_t ret=ts_ssh_shell_write(shell,input,len,NULL);if(ret!=ESP_OK)return ret;} ++ bool activity = len != 0; ++ size_t n; + do { +- rc = libssh2_channel_read(shell->channel, shell->read_buffer, +- sizeof(shell->read_buffer)); +- if (rc > 0) { +- activity = true; +- output_cb(shell->read_buffer, rc, user_data); +- } else if (rc == 0 || libssh2_channel_eof(shell->channel)) { +- /* 远程关闭 */ +- shell->exit_code = libssh2_channel_get_exit_status(shell->channel); +- shell->state = TS_SHELL_STATE_CLOSED; +- return ESP_OK; +- } +- } while (rc > 0); /* 继续读取直到 EAGAIN */ +- +- if (rc < 0 && rc != LIBSSH2_ERROR_EAGAIN) { +- /* 真正的错误 */ +- shell->state = TS_SHELL_STATE_ERROR; +- return ESP_FAIL; +- } +- +- /* 只在没有活动时短暂等待,避免 CPU 空转 */ +- if (!activity) { +- wait_socket(sock, ssh, 10); /* 减少等待时间到 10ms */ +- } +- } +- +- shell->exit_code = libssh2_channel_get_exit_status(shell->channel); +- shell->state = TS_SHELL_STATE_CLOSED; +- +- return ESP_OK; ++ n = 0; ++ esp_err_t ret = ts_ssh_shell_read(shell, shell->read_buffer, sizeof(shell->read_buffer), &n); ++ if (n) { output_cb(shell->read_buffer, n, data); activity = true; } ++ if (shell->state == TS_SHELL_STATE_CLOSED) return ESP_OK; ++ if (ret != ESP_OK && ret != ESP_ERR_TIMEOUT) return ret; ++ } while (n); /* preserve CLI's existing drain-until-no-data cadence */ ++ if(!activity)wait_socket(ts_ssh_get_socket(shell->ssh_session),ts_ssh_get_libssh2_session(shell->ssh_session),10); ++ } ++ return shell->state==TS_SHELL_STATE_CLOSED?ESP_OK:ESP_FAIL; + } + + esp_err_t ts_ssh_shell_resize(ts_ssh_shell_t shell, + uint16_t width, uint16_t height) + { +- if (!shell) { ++ if (!shell || !width || !height) { + return ESP_ERR_INVALID_ARG; + } + +@@ -488,13 +379,15 @@ esp_err_t ts_ssh_shell_resize(ts_ssh_shell_t shell, + int sock = ts_ssh_get_socket(shell->ssh_session); + + int rc; ++ int64_t deadline=esp_timer_get_time()+1000000; + while ((rc = libssh2_channel_request_pty_size(shell->channel, width, height)) + == LIBSSH2_ERROR_EAGAIN) { +- wait_socket(sock, ssh, 100); ++ if(!shell_wait(sock,ssh,deadline)){shell->state=TS_SHELL_STATE_ERROR;return ESP_ERR_TIMEOUT;} + } + + if (rc != 0) { + ESP_LOGW(TAG, "Failed to resize PTY: %d", rc); ++ if(rc!=LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED)shell->state=TS_SHELL_STATE_ERROR; + return ESP_FAIL; + } + +diff --git a/components/ts_webui/src/ts_webui_ws.c b/components/ts_webui/src/ts_webui_ws.c +index 5d0ca91..9bc83dc 100644 +--- a/components/ts_webui/src/ts_webui_ws.c ++++ b/components/ts_webui/src/ts_webui_ws.c +@@ -179,11 +179,11 @@ static void power_policy_event_handler(const ts_event_t *event, void *user_data) + /* Request errors must go to the requester, never mutate an existing session. */ + static void ssh_request_error(httpd_req_t *req, const char *message) + { ++ TS_WS_TEST_POINT("request_error_encode"); + cJSON *msg=cJSON_CreateObject(); +- bool ok=msg && cJSON_AddStringToObject(msg,"type","ssh_status") && +- cJSON_AddStringToObject(msg,"status","error") && cJSON_AddStringToObject(msg,"message",message); ++ bool ok=msg && cJSON_AddStringToObject(msg,"type","error") && cJSON_AddStringToObject(msg,"message",message); + char *json=ok?cJSON_PrintUnformatted(msg):NULL;cJSON_Delete(msg); +- const char *text=json?json:"{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH request rejected\"}"; ++ const char *text=json?json:"{\"type\":\"error\",\"message\":\"SSH request rejected\"}"; + httpd_ws_frame_t frame={.type=HTTPD_WS_TYPE_TEXT,.payload=(uint8_t*)text,.len=strlen(text)}; + esp_err_t ret=httpd_ws_send_frame(req,&frame); + if(ret!=ESP_OK)TS_LOGW(TAG,"SSH request error could not be sent: %s",esp_err_to_name(ret)); +@@ -263,9 +263,10 @@ static void ssh_poll_task(void *arg) + xSemaphoreTake(ctx->io,portMAX_DELAY); + esp_err_t ret=ts_ssh_shell_read(ctx->shell,buf,sizeof(buf)-1,&n); + bool active=ts_ssh_shell_is_active(ctx->shell); ++ bool failed=ts_ssh_shell_get_state(ctx->shell)==TS_SHELL_STATE_ERROR; + xSemaphoreGive(ctx->io); + if(ret==ESP_OK && n)ssh_send_output(ctx,buf,n); +- if(!active){ssh_close(op,"closed","SSH session closed");break;} ++ if(!active){ssh_close(op,failed?"error":"closed",failed?"SSH channel failed; remote result is not confirmed":"SSH session closed");break;} + vTaskDelay(pdMS_TO_TICKS(20)); + } + shell_resources_close(ctx); +@@ -328,9 +329,10 @@ static void handle_ssh_control(httpd_req_t *req,ts_ws_peer_t peer,const char *ty + ssh_shell_context_t *ctx=ts_ws_op_data(op); + if(!strcmp(type,"ssh_disconnect"))ctx->disconnect_requested=true; + else { +- esp_err_t ret=ESP_ERR_INVALID_STATE; ++ esp_err_t ret=ESP_ERR_INVALID_ARG;bool active=false; + xSemaphoreTake(ctx->io,portMAX_DELAY); + if(ctx->shell && ts_ws_op_is_open(op)) { ++ active=true; + if(!strcmp(type,"ssh_input")) { + cJSON *data=cJSON_GetObjectItem(msg,"data"); + if(cJSON_IsString(data))ret=ts_ssh_shell_write(ctx->shell,data->valuestring,strlen(data->valuestring),NULL); +@@ -339,12 +341,18 @@ static void handle_ssh_control(httpd_req_t *req,ts_ws_peer_t peer,const char *ty + if(cJSON_IsString(signal))ret=ts_ssh_shell_send_signal(ctx->shell,signal->valuestring); + } else { + cJSON *w=cJSON_GetObjectItem(msg,"width"),*h=cJSON_GetObjectItem(msg,"height"); +- if(cJSON_IsNumber(w) && cJSON_IsNumber(h) && w->valueint>0 && h->valueint>0) ++ if(cJSON_IsNumber(w) && cJSON_IsNumber(h) && w->valuedouble>=1 && w->valuedouble<=UINT16_MAX && h->valuedouble>=1 && h->valuedouble<=UINT16_MAX && ++ w->valuedouble==w->valueint && h->valuedouble==h->valueint) + ret=ts_ssh_shell_resize(ctx->shell,w->valueint,h->valueint); + } + } ++ if(ctx->shell)active=ts_ssh_shell_is_active(ctx->shell); + xSemaphoreGive(ctx->io); +- if(ret!=ESP_OK)ssh_request_error(req,"SSH control could not be completed for this session"); ++ if(ret!=ESP_OK){ ++ if(!active)ssh_close(op,"error","SSH channel failed; remote result is not confirmed"); ++ else ssh_request_error(req,ret==ESP_ERR_NOT_SUPPORTED?"Unsupported SSH signal": ++ ret==ESP_ERR_INVALID_ARG?"Invalid SSH control parameters":"SSH control request failed; input was not replayed"); ++ } + } + ts_ws_op_release(op); + } +diff --git a/components/ts_webui/web/index.html b/components/ts_webui/web/index.html +index 25eb98c..d4aa9c9 100644 +--- a/components/ts_webui/web/index.html ++++ b/components/ts_webui/web/index.html +@@ -41,9 +41,9 @@ + .modal-content{background:var(--bg-card);border-radius:var(--radius-lg);max-width:600px;width:95%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg)} + + +- +- +- ++ ++ ++ + + + +@@ -247,7 +247,7 @@ + + + +- +- +- +- +- ++ ++ ++ ++ ++ + + +diff --git a/components/ts_webui/web/js/lang/en-US.js b/components/ts_webui/web/js/lang/en-US.js +index 8eaf87b..cae057d 100644 +--- a/components/ts_webui/web/js/lang/en-US.js ++++ b/components/ts_webui/web/js/lang/en-US.js +@@ -3699,6 +3699,25 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('en-US', { + + // Terminal Page + terminal: { ++ sshCapacity: "The result channel is busy. SSH was not started; try again shortly.", ++ sshCreateFailed: "The SSH session could not be created. Try again shortly.", ++ sshOpenFailed: "The remote shell could not be opened. Check whether the server permits interactive sessions.", ++ sshStartupClosed: "The SSH session ended during startup. Check the server before reconnecting.", ++ sshStatusFailed: "SSH status notification failed. The connection state is unconfirmed; reconnect to check.", ++ sshOutputIncomplete: "SSH output in this page is incomplete. The remote result is unconfirmed. Check the server before repeating commands.", ++ sshClosed: "The SSH session has ended.", ++ sshClosing: "Closing the SSH session; waiting for confirmation.", ++ sshConnecting: "Establishing the SSH connection…", ++ sshReady: "The SSH shell is ready.", ++ sshServiceStopping: "The service is stopping. This request was not accepted.", ++ sshControlUnsupported: "Unsupported SSH signal; the session is still active.", ++ sshControlInvalid: "Invalid SSH control parameters; the session is still active.", ++ sshControlFailed: "This SSH request failed. Input was not replayed.", ++ sshChannelUnknown: "The SSH channel ended unexpectedly. The remote result is unconfirmed.", ++ sshWrongOwner: "This connection does not own an active SSH session.", ++ sshBusy: "Another SSH session is active. This connection attempt was rejected.", ++ sshRequestRejected: "This SSH request was rejected.", ++ + connecting: 'Connecting to device...', + connected: 'Connected to device', + helpHint: 'Enter {help} to view available commands', +diff --git a/components/ts_webui/web/js/lang/zh-CN.js b/components/ts_webui/web/js/lang/zh-CN.js +index cfebef2..1e2f124 100644 +--- a/components/ts_webui/web/js/lang/zh-CN.js ++++ b/components/ts_webui/web/js/lang/zh-CN.js +@@ -3663,6 +3663,25 @@ if (typeof i18n !== 'undefined') i18n.registerLanguage('zh-CN', { + + // 终端页面 + terminal: { ++ sshCapacity: "结果通知通道暂时繁忙,本次 SSH 连接未启动,请稍后重试。", ++ sshCreateFailed: "未能创建 SSH 会话,请稍后重试。", ++ sshOpenFailed: "未能启动远端交互式终端,请检查远端是否允许此类连接。", ++ sshStartupClosed: "SSH 会话在启动期间已结束,请检查远端状态后重新连接。", ++ sshStatusFailed: "SSH 状态通知未能完成,连接状态尚未确认,请重新连接。", ++ sshOutputIncomplete: "网页 SSH 输出不完整,远端执行结果尚未确认。请检查远端状态,不要直接重发命令。", ++ sshClosed: "SSH 会话已结束。", ++ sshClosing: "正在结束 SSH 会话,请等待确认。", ++ sshConnecting: "正在建立 SSH 连接…", ++ sshReady: "SSH 交互式终端已就绪。", ++ sshServiceStopping: "服务正在停止,本次请求未被接受。", ++ sshControlUnsupported: "不支持此 SSH 信号,会话仍可继续使用。", ++ sshControlInvalid: "SSH 控制参数无效,会话仍可继续使用。", ++ sshControlFailed: "本次 SSH 请求失败,输入未自动重发。", ++ sshChannelUnknown: "SSH 通道异常结束,远端执行结果尚未确认。", ++ sshWrongOwner: "此连接不属于当前有效的 SSH 会话。", ++ sshBusy: "已有 SSH 会话,本次连接请求未被接受。", ++ sshRequestRejected: "本次 SSH 请求未被接受。", ++ + connecting: '正在连接到设备...', + connected: '已连接到设备', + helpHint: '输入 {help} 查看可用命令', +diff --git a/components/ts_webui/web/js/terminal.js b/components/ts_webui/web/js/terminal.js +index 0f66d25..ccd3a51 100644 +--- a/components/ts_webui/web/js/terminal.js ++++ b/components/ts_webui/web/js/terminal.js +@@ -54,6 +54,7 @@ class WebTerminal { + // SSH Shell 模式 + this.sshMode = false; + this.sshConnecting = false; ++ this.sshDisconnecting = false; + this.restoring = false; + this.restoreTimer = null; + this.destroyed = false; +@@ -149,7 +150,7 @@ class WebTerminal { + */ + setupInputHandler() { + this.terminal.onData(data => { +- if (!this.connected) return; ++ if (!this.connected || this.sshConnecting || this.sshDisconnecting) return; + + // SSH Shell 模式 + if (this.sshMode) { +@@ -306,26 +307,31 @@ class WebTerminal { + */ + connect() { + if (this.destroyed) return; ++ if (this.ws) this.disconnect(); + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const wsUrl = `${protocol}//${window.location.host}/ws`; + +- this.ws = new WebSocket(wsUrl); ++ const ws = new WebSocket(wsUrl); ++ this.ws = ws; ++ const current = () => !this.destroyed && this.ws === ws; + this.pingInterval = null; + +- this.ws.onopen = () => { ++ ws.onopen = () => { ++ if (!current()) return; + console.log('Terminal WebSocket connected'); + // 发送终端启动请求 +- this.ws.send(JSON.stringify({ type: 'terminal_start' })); ++ ws.send(JSON.stringify({ type: 'terminal_start' })); + + // 启动心跳机制 + this.pingInterval = setInterval(() => { +- if (this.ws && this.ws.readyState === WebSocket.OPEN) { +- this.ws.send(JSON.stringify({ type: 'ping' })); ++ if (current() && ws.readyState === WebSocket.OPEN) { ++ ws.send(JSON.stringify({ type: 'ping' })); + } + }, 15000); // 每15秒发送心跳 + }; + +- this.ws.onmessage = (event) => { ++ ws.onmessage = (event) => { ++ if (!current()) return; + try { + const msg = JSON.parse(event.data); + this.handleMessage(msg); +@@ -334,9 +340,11 @@ class WebTerminal { + } + }; + +- this.ws.onclose = (event) => { ++ ws.onclose = (event) => { ++ if (!current()) return; + console.log('Terminal WebSocket disconnected, code:', event.code); + this.connected = false; ++ this.sshMode = this.sshConnecting = this.sshDisconnecting = false; + if (this.restoring) this.finishRestore(false); + + // 清除心跳 +@@ -351,7 +359,7 @@ class WebTerminal { + if (event.code !== 1000) { // 非正常关闭 + this.writeln('\x1b[33m' + (typeof t === 'function' ? t('terminal.reconnectIn') : '5秒后尝试重新连接...') + '\x1b[0m'); + const tryReconnect = () => { +- if (this.destroyed || this.connected) return; ++ if (!current() || this.connected) return; + if (document.visibilityState !== 'visible') { + document.addEventListener('visibilitychange', function handler() { + document.removeEventListener('visibilitychange', handler); +@@ -366,7 +374,8 @@ class WebTerminal { + } + }; + +- this.ws.onerror = (error) => { ++ ws.onerror = (error) => { ++ if (!current()) return; + console.error('Terminal WebSocket error:', error); + this.writeln('\r\n\x1b[1;31m' + (typeof t === 'function' ? t('terminal.connectionError') : '连接错误') + '\x1b[0m'); + }; +@@ -384,8 +393,10 @@ class WebTerminal { + } + + handleMessage(msg) { ++ if (this.destroyed) return; + switch (msg.type) { + case 'connected': ++ if (this.sshMode || this.sshConnecting || this.sshDisconnecting) return; + if (this.restoring) this.finishRestore(true); + this.connected = true; + this.prompt = msg.prompt || 'tianshan> '; +@@ -403,18 +414,25 @@ class WebTerminal { + break; + + case 'done': ++ if (this.sshMode || this.sshConnecting || this.sshDisconnecting) return; + // 命令执行完成 + this.writePrompt(); + break; + + case 'error': { + const errMsg = msg.message || (typeof t === 'function' ? t('terminal.unknownError') : '未知错误'); ++ if (this.sshMode || this.sshConnecting || this.sshDisconnecting) { ++ this.writeln('\x1b[1;31m' + this.sshMessageText(errMsg) + '\x1b[0m'); ++ if (this.sshConnecting && !this.sshMode) { this.sshConnecting = false; this.writePrompt(); } ++ break; // request failure is not an operation terminal ++ } + if (errMsg.indexOf('Not a terminal session') >= 0 && this.ws && this.ws.readyState === WebSocket.OPEN) { + if (!this.restoring) { + this.restoring = true; this.connected = false; + this.ws.send(JSON.stringify({type: 'terminal_start'})); + showToast(t('promptRepair.terminalRestoring'), 'info'); +- this.restoreTimer = setTimeout(() => this.finishRestore(false, true), 10000); ++ const restoringSocket = this.ws; ++ this.restoreTimer = setTimeout(() => { if (!this.destroyed && this.ws === restoringSocket && this.restoring) this.finishRestore(false, true); }, 10000); + } + } else { + if (this.restoring) this.finishRestore(false); +@@ -446,6 +464,7 @@ class WebTerminal { + + case 'session_closed': + this.connected = false; ++ this.sshMode = this.sshConnecting = this.sshDisconnecting = false; + this.writeln('\x1b[33m' + (typeof t === 'function' ? t('terminal.sessionClosed') : '会话已关闭,请重新连接') + '\x1b[0m'); + break; + +@@ -593,10 +612,9 @@ class WebTerminal { + startSshShell(params) { + if (this.sshConnecting || this.sshMode) { + this.writeln('\x1b[1;31m' + (typeof t === 'function' ? t('terminal.sshSessionInProgress') : 'SSH 会话已在进行中') + '\x1b[0m'); +- this.writePrompt(); + return; + } +- ++ if (!this.connected || !this.ws || this.ws.readyState !== WebSocket.OPEN) return; + this.sshConnecting = true; + const connMsg = typeof t === 'function' ? t('terminal.sshConnectingTo', { user: params.user, host: params.host, port: params.port }) : `正在连接到 ${params.user}@${params.host}:${params.port}...`; + this.writeln(`\x1b[36m${connMsg}\x1b[0m`); +@@ -627,29 +645,66 @@ class WebTerminal { + /** + * 处理 SSH 状态消息 + */ ++ sshMessageText(message) { ++ const keys = { ++ "Missing host or user": "sshShellRequiresParams", ++ "SSH result delivery capacity unavailable": "sshCapacity", ++ "Failed to create SSH session": "sshCreateFailed", ++ "Failed to open shell": "sshOpenFailed", ++ "SSH shell closed during startup": "sshStartupClosed", ++ "SSH connection status delivery failed": "sshStatusFailed", ++ "SSH readiness delivery failed": "sshStatusFailed", ++ "SSH status delivery failed": "sshStatusFailed", ++ "SSH output delivery incomplete; remote command result is not confirmed": "sshOutputIncomplete", ++ "SSH session closed": "sshClosed", ++ "Closing SSH session...": "sshClosing", ++ "Connecting to SSH server...": "sshConnecting", ++ "SSH shell ready": "sshReady", ++ "Service is stopping": "sshServiceStopping", ++ 'Unsupported SSH signal': 'sshControlUnsupported', ++ 'Invalid SSH control parameters': 'sshControlInvalid', ++ 'SSH control request failed; input was not replayed': 'sshControlFailed', ++ 'SSH channel failed; remote result is not confirmed': 'sshChannelUnknown', ++ 'This connection does not own an active SSH session': 'sshWrongOwner', ++ 'Another SSH session is active': 'sshBusy', ++ 'SSH request rejected': 'sshRequestRejected' ++ }; ++ return keys[message] && typeof t === 'function' ? t('terminal.' + keys[message]) : message; ++ } ++ + handleSshStatus(msg) { + const status = msg.status; +- const message = msg.message || ''; ++ const message = this.sshMessageText(msg.message || ''); + + switch (status) { + case 'connecting': + this.writeln(`\x1b[33m${message}\x1b[0m`); + break; + case 'connected': ++ if (!this.sshConnecting) return; ++ this.sshDisconnecting = false; + this.sshMode = true; + this.sshConnecting = false; + this.writeln(`\x1b[1;32m${message}\x1b[0m`); + this.writeln('\x1b[90m' + (typeof t === 'function' ? t('terminal.exitSshHint') : '(按 Ctrl+\\ 退出 SSH shell)') + '\x1b[0m'); + this.writeln(''); + break; +- case 'closed': + case 'disconnecting': ++ if (!this.sshMode) return; ++ this.sshDisconnecting = true; ++ this.writeln(`\r\n\x1b[33m${message}\x1b[0m`); ++ break; ++ case 'closed': ++ if (!this.sshMode && !this.sshConnecting) return; ++ this.sshDisconnecting = false; + this.sshMode = false; + this.sshConnecting = false; + this.writeln(`\r\n\x1b[33m${message}\x1b[0m`); + this.writePrompt(); + break; + case 'error': ++ if (!this.sshMode && !this.sshConnecting) return; ++ this.sshDisconnecting = false; + this.sshMode = false; + this.sshConnecting = false; + this.writeln(`\x1b[1;31m${message}\x1b[0m`); +@@ -725,6 +780,7 @@ class WebTerminal { + this.ws = null; + } + this.connected = false; ++ this.sshMode = this.sshConnecting = this.sshDisconnecting = false; + } + + /** +diff --git a/tests/ws_subscriptions/test_operation_adapter.c b/tests/ws_subscriptions/test_operation_adapter.c +index fa881f7..4a98321 100644 +--- a/tests/ws_subscriptions/test_operation_adapter.c ++++ b/tests/ws_subscriptions/test_operation_adapter.c +@@ -68,11 +68,15 @@ static int adapter_create_caps(void(*fn)(void*),const char *n,unsigned stack,voi + #undef heap_caps_calloc + #undef xTaskCreate + #undef xTaskCreateWithCaps ++#ifndef PROJECT_REAL_DRIVER + struct ts_ssh_session_s {bool aborted;ts_ssh_config_t config;}; ++#endif + static unsigned control_writes,control_signals,control_resizes,commands_submitted; + static void (*stage_hook)(const char *); + static void stage(const char *name){if(stage_hook)stage_hook(name);} ++#ifndef PROJECT_REAL_DRIVER + struct ts_ssh_shell_s {bool active;}; ++#endif + static unsigned aborts,variable_writes,session_destroys; + static int remote_failure; + static void (*remote_hook)(void); +@@ -92,6 +96,7 @@ BaseType_t xTimerPendFunctionCall(void(*fn)(void*,uint32_t),void *arg,uint32_t v + assert(timer_queued<16);timer_queue[timer_queued++]=(typeof(timer_queue[0])){fn,arg,v,NULL};return pdPASS; + } + static void timer_pump(void){while(timer_queued){typeof(timer_queue[0]) q=timer_queue[0];memmove(timer_queue,timer_queue+1,--timer_queued*sizeof(*timer_queue));if(q.deleted){free(q.deleted);host_timer=NULL;}else q.fn(q.arg,q.value);}} ++#ifndef PROJECT_REAL_DRIVER + esp_err_t ts_ssh_session_create(const ts_ssh_config_t*c,ts_ssh_session_t *out){stage("create");if(remote_failure==1)return ESP_FAIL;*out=host_calloc(1,sizeof(**out));if(*out)(*out)->config=*c;return *out?ESP_OK:ESP_ERR_NO_MEM;} + esp_err_t ts_ssh_connect(ts_ssh_session_t s){stage("connect");if(s->config.cancelled && s->config.cancelled(s->config.cancel_context))return ESP_ERR_TIMEOUT;stage("auth");return remote_failure==2?ESP_FAIL:ESP_OK;} + const char *ts_ssh_get_error(ts_ssh_session_t s){(void)s;return "fake network error";} +@@ -100,6 +105,7 @@ esp_err_t ts_ssh_session_destroy(ts_ssh_session_t s){session_destroys++;tracked_ + void ts_ssh_abort(ts_ssh_session_t s){s->aborted=true;aborts++;} + esp_err_t ts_ssh_shell_open(ts_ssh_session_t s,const ts_shell_config_t*c,ts_ssh_shell_t *out){(void)s;(void)c;if(remote_failure==3)return ESP_FAIL;*out=host_calloc(1,sizeof(**out));(*out)->active=true;return 0;} + bool ts_ssh_shell_is_active(ts_ssh_shell_t s){return s&&s->active;} ++ts_shell_state_t ts_ssh_shell_get_state(ts_ssh_shell_t s){return s&&s->active?TS_SHELL_STATE_RUNNING:TS_SHELL_STATE_CLOSED;} + esp_err_t ts_ssh_shell_close(ts_ssh_shell_t s){tracked_free(s);return 0;} + esp_err_t ts_ssh_shell_read(ts_ssh_shell_t s,char *b,size_t n,size_t *out){(void)b;(void)n;*out=0;s->active=false;return 0;} + esp_err_t ts_ssh_shell_write(ts_ssh_shell_t s,const char *b,size_t n,size_t *out){(void)s;(void)b;(void)n;(void)out;control_writes++;return 0;} +@@ -109,6 +115,9 @@ esp_err_t ts_ssh_exec_stream(ts_ssh_session_t s,const char *command,ts_ssh_outpu + (void)command;stage("submit");if(s->config.cancelled && s->config.cancelled(s->config.cancel_context))return ESP_ERR_TIMEOUT;commands_submitted++;if(remote_hook)remote_hook();if(remote_timeout && host_timer)host_timer->fn(host_timer); + cb("value=42\n",9,false,arg);*code=0;return s->aborted || (s->config.cancelled && s->config.cancelled(s->config.cancel_context))?ESP_ERR_TIMEOUT:ESP_OK; + } ++#else ++#include "project_driver.inc" ++#endif + esp_err_t ts_keystore_load_private_key(const char *id,char **out,size_t *n){(void)id;stage("key");*out=host_strdup("fake-key");*n=9;return ESP_OK;} + esp_err_t ts_variable_upsert(const ts_auto_variable_t *v){(void)v;variable_writes++;return 0;} + esp_err_t ts_console_exec(const char *cmd,ts_cmd_result_t *result){(void)cmd;memset(result,0,sizeof(*result));return 0;} +@@ -121,7 +130,11 @@ esp_err_t ts_log_remove_callback(ts_log_callback_handle_t h){(void)h;return remo + size_t ts_log_buffer_search(ts_log_entry_t *e,size_t n,ts_log_level_t min,ts_log_level_t max,const char *tag,const char *keyword){(void)e;(void)n;(void)min;(void)max;(void)tag;(void)keyword;return 0;} + httpd_handle_t ts_http_server_get_handle(void){return (void*)11;} + void ts_http_server_set_stop_hooks(esp_err_t(*stop)(httpd_handle_t),void(*stopped)(httpd_handle_t)){(void)stop;(void)stopped;} +-static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){(void)caps;if(close_during_create)((ssh_shell_context_t*)arg)->shell->active=false;return adapter_create(fn,n,stack,arg,p,out);} ++static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){(void)caps; ++#ifndef PROJECT_REAL_DRIVER ++if(close_during_create)((ssh_shell_context_t*)arg)->shell->active=false; ++#endif ++return adapter_create(fn,n,stack,arg,p,out);} + static void drive_all(void){for(unsigned i=0;i<12;i++){ts_ws_op_poll();pump();timer_pump();}assert(!timer_queued);} + static void setup(void){start();memset(s_clients,0,sizeof(s_clients));s_server=(void*)11;s_ws_stopping=false;ts_ws_op_enable();transport_server.closed=peer_closed;for(int fd=1;fd<=2;fd++){reqs[fd]=(httpd_req_t){.handle=(void*)11,.fd=fd};current=(void*)3;assert(add_client(&reqs[fd],WS_CLIENT_TYPE_EVENT)==ESP_OK);}current=(void*)1;} + static void finish_all(void){drive_all();assert(!ts_ws_op_busy());stop();assert(!live_allocations);} +diff --git a/tests/ws_subscriptions/measure_project_v3.py b/tests/ws_subscriptions/measure_project_v3.py +new file mode 100644 +index 0000000..139b558 +--- /dev/null ++++ b/tests/ws_subscriptions/measure_project_v3.py +@@ -0,0 +1,23 @@ ++#!/usr/bin/env python3 ++"""Use the actual fixed-SDK compile commands; no target execution.""" ++import os,json,pathlib,shlex,subprocess,tarfile,tempfile ++root=pathlib.Path(__file__).resolve().parents[2];build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));doc=root/'docs/repair/ws-project-v3' ++commands=json.loads((build/'compile_commands.json').read_text());result={} ++with tempfile.TemporaryDirectory(prefix='ts-v3-size-') as d: ++ temp=pathlib.Path(d) ++ for rel,typ in [('components/ts_security/src/ts_ssh_shell.c','struct ts_ssh_shell_s'),('components/ts_webui/src/ts_webui_ws.c','ssh_shell_context_t')]: ++ entry=next(c for c in commands if c['file']==str(root/rel));base=shlex.split(entry['command']);result[rel]={} ++ for kind in ['before','after']: ++ if kind=='before': ++ with tarfile.open(doc/'baseline.tar.gz') as t:source=t.extractfile(rel).read().decode() ++ else:source=(root/rel).read_text() ++ src=temp/(kind+'-'+pathlib.Path(rel).name);src.write_text(source+'\nconst unsigned char v3_object_size[sizeof('+typ+')]={0};\n') ++ obj=src.with_suffix('.o');args=base[:];args[args.index('-o')+1]=str(obj);args[args.index('-c')+1]=str(src);args+=['-fstack-usage'] ++ subprocess.run(args,cwd=entry['directory'],check=True,capture_output=True) ++ nm=str(pathlib.Path(args[0]).with_name('xtensa-esp32s3-elf-nm'));nm=nm if pathlib.Path(nm).exists() else str(pathlib.Path(args[0]).with_name('xtensa-esp-elf-nm')) ++ symbols=subprocess.check_output([nm,'-S',str(obj)],text=True) ++ size=int(next(l.split()[1] for l in symbols.splitlines() if l.endswith(' v3_object_size')),16) ++ stack={l.split('\t')[0].rsplit(':',1)[-1]:l.split('\t')[1:] for l in src.with_suffix('.su').read_text().splitlines()} ++ result[rel][kind]={'object_bytes':size,'stack_usage':stack} ++(doc/'target-resource.json').write_text(json.dumps(result,indent=2)) ++print(json.dumps({k:{x:v[x]['object_bytes'] for x in v} for k,v in result.items()},indent=2)) +diff --git a/tests/ws_subscriptions/project_driver.inc b/tests/ws_subscriptions/project_driver.inc +new file mode 100644 +index 0000000..efe9497 +--- /dev/null ++++ b/tests/ws_subscriptions/project_driver.inc +@@ -0,0 +1,69 @@ ++/* Real project SSH client + Shell; only libssh2/socket/clock boundaries fake. */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "ts_known_hosts.h" ++struct _LIBSSH2_SESSION {bool local_closed;}; ++struct _LIBSSH2_CHANNEL {LIBSSH2_SESSION *owner;}; ++static LIBSSH2_CHANNEL *driver_channel; ++static int driver_channels,driver_sessions,driver_sockets,driver_writes,driver_phase,driver_reads; ++static bool driver_eof,driver_write_fail,driver_write_again,driver_resize_reject,driver_close_again,driver_partial,driver_read_fail; ++static int driver_socket(int d,int t,int p){(void)d;(void)t;(void)p;driver_sockets++;return 10;} ++static int driver_close(int fd){(void)fd;driver_sockets--;return 0;} ++static int driver_connect(int fd,const struct sockaddr*a,socklen_t n){(void)fd;(void)a;(void)n;return 0;} ++static int driver_fcntl(int fd,int cmd,...){(void)fd;(void)cmd;return 0;} ++static int driver_select(int n,fd_set*r,fd_set*w,fd_set*x,struct timeval*t){(void)n;(void)r;(void)w;(void)x;test_now+=(int64_t)t->tv_sec*1000000+t->tv_usec;return 0;} ++int libssh2_init(int f){(void)f;return 0;} ++void libssh2_exit(void){} ++LIBSSH2_SESSION *libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*a)),LIBSSH2_FREE_FUNC((*f)),LIBSSH2_REALLOC_FUNC((*r)),void*x){(void)a;(void)f;(void)r;(void)x;driver_sessions++;return calloc(1,sizeof(LIBSSH2_SESSION));} ++int libssh2_channel_free(LIBSSH2_CHANNEL*c){if(driver_close_again && !c->owner->local_closed)return LIBSSH2_ERROR_EAGAIN;assert(c==driver_channel);driver_channel=NULL;driver_channels--;free(c);return 0;} ++int libssh2_session_free(LIBSSH2_SESSION*s){if(driver_channel){int r=libssh2_channel_free(driver_channel);if(r)return r;}driver_sessions--;free(s);return 0;} ++void libssh2_session_set_blocking(LIBSSH2_SESSION*s,int b){(void)s;assert(!b);} ++void *libssh2_session_callback_set(LIBSSH2_SESSION*s,int c,void*f){(void)c;(void)f;s->local_closed=true;return NULL;} ++int libssh2_session_handshake(LIBSSH2_SESSION*s,libssh2_socket_t f){(void)s;(void)f;return 0;} ++int libssh2_session_block_directions(LIBSSH2_SESSION*s){(void)s;return LIBSSH2_SESSION_BLOCK_INBOUND;} ++int libssh2_session_last_errno(LIBSSH2_SESSION*s){(void)s;return driver_phase==1?LIBSSH2_ERROR_EAGAIN:0;} ++int libssh2_session_last_error(LIBSSH2_SESSION*s,char **m,int*n,int w){(void)s;(void)n;(void)w;*m="boundary rejection";return 0;} ++int libssh2_userauth_password_ex(LIBSSH2_SESSION*s,const char*u,unsigned int l,const char*p,unsigned int n,LIBSSH2_PASSWD_CHANGEREQ_FUNC((*change))){(void)s;(void)u;(void)l;(void)p;(void)n;(void)change;return 0;} ++int libssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION*s,const char*u,unsigned int l,const char*a,const char*b,const char*p){(void)a;(void)b;return libssh2_userauth_password_ex(s,u,l,p,0,NULL);} ++int libssh2_userauth_publickey_frommemory(LIBSSH2_SESSION*s,const char*u,size_t l,const char*a,size_t al,const char*b,size_t bl,const char*p){(void)a;(void)al;(void)b;(void)bl;return libssh2_userauth_password_ex(s,u,l,p,0,NULL);} ++LIBSSH2_CHANNEL *libssh2_channel_open_ex(LIBSSH2_SESSION*s,const char*t,unsigned int l,unsigned int w,unsigned int p,const char*m,unsigned int ml){(void)t;(void)l;(void)w;(void)p;(void)m;(void)ml;if(driver_phase==1)return NULL;assert(!driver_channel);driver_channel=calloc(1,sizeof(*driver_channel));driver_channel->owner=s;driver_channels++;return driver_channel;} ++int libssh2_channel_request_pty_ex(LIBSSH2_CHANNEL*c,const char*t,unsigned int l,const char*m,unsigned int ml,int w,int h,int wp,int hp){(void)c;(void)t;(void)l;(void)m;(void)ml;(void)w;(void)h;(void)wp;(void)hp;return driver_phase==2?LIBSSH2_ERROR_EAGAIN:driver_phase==4?-1:0;} ++int libssh2_channel_process_startup(LIBSSH2_CHANNEL*c,const char*r,unsigned int rl,const char*m,unsigned int ml){(void)c;(void)r;(void)rl;(void)m;(void)ml;return driver_phase==3?LIBSSH2_ERROR_EAGAIN:0;} ++int libssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL*c,int w,int h,int wp,int hp){(void)c;(void)w;(void)h;(void)wp;(void)hp;return driver_resize_reject?LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED:0;} ++ssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL*c,int stream,const char*b,size_t n){(void)c;(void)stream;(void)b;if(driver_partial){driver_partial=false;driver_write_fail=true;driver_writes++;return 1;}if(driver_write_again)return LIBSSH2_ERROR_EAGAIN;if(driver_write_fail)return LIBSSH2_ERROR_SOCKET_SEND;driver_writes++;return n;} ++ssize_t libssh2_channel_read_ex(LIBSSH2_CHANNEL*c,int stream,char*b,size_t n){(void)c;(void)stream;(void)b;(void)n;driver_reads++;return driver_read_fail?LIBSSH2_ERROR_SOCKET_RECV:0;} ++int libssh2_channel_eof(LIBSSH2_CHANNEL*c){(void)c;return driver_eof;} ++int libssh2_channel_send_eof(LIBSSH2_CHANNEL*c){(void)c;return driver_close_again?LIBSSH2_ERROR_EAGAIN:0;} ++int libssh2_channel_wait_eof(LIBSSH2_CHANNEL*c){(void)c;return driver_close_again?LIBSSH2_ERROR_EAGAIN:0;} ++int libssh2_channel_close(LIBSSH2_CHANNEL*c){return driver_close_again&&!c->owner->local_closed?LIBSSH2_ERROR_EAGAIN:0;} ++int libssh2_channel_get_exit_status(LIBSSH2_CHANNEL*c){(void)c;return 0;} ++esp_err_t ts_known_hosts_verify(ts_ssh_session_t s,ts_host_verify_result_t*r,ts_known_host_t*h){(void)s;(void)h;*r=TS_HOST_VERIFY_OK;return ESP_OK;} ++#define socket driver_socket ++#define close driver_close ++#define connect driver_connect ++#define fcntl driver_fcntl ++#define select driver_select ++#define malloc tracked_malloc ++#define calloc host_calloc ++#define free tracked_free ++#define TAG client_tag ++#define wait_socket client_wait_socket ++#include "../../components/ts_security/src/ts_ssh_client.c" ++#undef wait_socket ++#undef TAG ++#define TAG shell_tag ++#include "../../components/ts_security/src/ts_ssh_shell.c" ++#undef TAG ++#undef malloc ++#undef calloc ++#undef free ++#undef socket ++#undef close ++#undef connect ++#undef fcntl ++#undef select +diff --git a/tests/ws_subscriptions/project_stubs/ts_core.h b/tests/ws_subscriptions/project_stubs/ts_core.h +new file mode 100644 +index 0000000..b3a531d +--- /dev/null ++++ b/tests/ws_subscriptions/project_stubs/ts_core.h +@@ -0,0 +1,4 @@ ++#pragma once ++#define TS_MALLOC_PSRAM(n) tracked_malloc(n) ++#define TS_CALLOC_PSRAM(n,z) host_calloc(n,z) ++#define TS_REALLOC_PSRAM(p,n) realloc(p,n) +diff --git a/tests/ws_subscriptions/replay_project_baseline.py b/tests/ws_subscriptions/replay_project_baseline.py +new file mode 100644 +index 0000000..f1e73b4 +--- /dev/null ++++ b/tests/ws_subscriptions/replay_project_baseline.py +@@ -0,0 +1,31 @@ ++#!/usr/bin/env python3 ++"""Replay frozen pre-v3 product source; no checkout or mutation of working source.""" ++import hashlib,json,os,pathlib,shutil,subprocess,tarfile,tempfile ++root=pathlib.Path(__file__).resolve().parents[2];doc=root/'docs/repair/ws-project-v3' ++with tempfile.TemporaryDirectory(prefix='ts-v3-baseline-') as name: ++ dst=pathlib.Path(name) ++ with tarfile.open(doc/'baseline.tar.gz') as t:t.extractall(dst,filter='data') ++ for file,digest in json.loads((doc/'baseline.json').read_text())['sha256'].items(): ++ assert hashlib.sha256((dst/file).read_bytes()).hexdigest()==digest,file ++ (dst/'components/ts_console/commands').mkdir(parents=True,exist_ok=True) ++ shutil.copy2(doc/'baseline-console.c',dst/'components/ts_console/commands/ts_cmd_ssh.c') ++ # Console header only; do not replace the frozen callback with today's code. ++ (dst/'components/ts_console/include').symlink_to(root/'components/ts_console/include',target_is_directory=True) ++ # Dependencies outside the frozen affected units are read-only current headers/vendor. ++ for p in (root/'components').iterdir(): ++ if not (dst/'components'/p.name).exists():(dst/'components'/p.name).symlink_to(p,target_is_directory=p.is_dir()) ++ with tarfile.open(doc/'baseline-fixture.tar.gz') as t:t.extractall(dst,filter='data') ++ p=subprocess.run(['node','tests/prompts/project-cross.cjs','--baseline'],cwd=dst,env=dict(os.environ,CROSS_OUTPUT=str(doc/'baseline-h1.json')),capture_output=True,text=True) ++ (doc/'baseline-h1.txt').write_text(p.stdout+p.stderr);assert p.returncode==0 and 'CONFIRMED H1' in p.stdout,p.stdout+p.stderr ++ # Same current lower-driver assertions against the frozen production, separate from H1. ++ for file in ['test_shell_driver.c','run_shell_driver.sh','project_driver.inc']: ++ shutil.copy2(root/'tests/ws_subscriptions'/file,dst/'tests/ws_subscriptions'/file) ++ for args,label,marker in [([], 'no-data','ESP_ERR_TIMEOUT'),(['--eof-only'],'eof-release','!live_allocations'),(['--cli-exit'],'cli-exit','!ts_ssh_shell_is_active(shell)')]: ++ p=subprocess.run(['bash','tests/ws_subscriptions/run_shell_driver.sh',*args],cwd=dst,env=dict(os.environ,PROJECT_BASELINE='1'),capture_output=True,text=True) ++ evidence=p.stdout+p.stderr;(doc/('baseline-'+label+'.txt')).write_text(evidence) ++ assert p.returncode!=0 and 'Assertion failed:' in evidence and marker in evidence,evidence ++ print('CONFIRMED production defect:',label) ++ p=subprocess.run(['bash','tests/ws_subscriptions/run_shell_driver.sh','--metrics'],cwd=dst,env=dict(os.environ,PROJECT_BASELINE='1'),capture_output=True,text=True) ++ assert p.returncode==0,p.stderr ++ (doc/'baseline-allocation-metrics.json').write_text(p.stdout) ++ print('CONFIRMED H1 and lower-driver business counterexamples; source hashes verified') +diff --git a/tests/ws_subscriptions/run_project_bridge.sh b/tests/ws_subscriptions/run_project_bridge.sh +new file mode 100644 +index 0000000..9609ec6 +--- /dev/null ++++ b/tests/ws_subscriptions/run_project_bridge.sh +@@ -0,0 +1,11 @@ ++#!/bin/bash ++set -euo pipefail ++cd "$(dirname "$0")/../.." ++: "${IDF_PATH:?NOT RUN: set IDF_PATH to the project SDK}" ++build=$(mktemp -d /tmp/ts-ws-adapter.XXXXXX) ++trap 'rm -rf "$build"' EXIT ++cjson="$IDF_PATH/components/json/cJSON" ++"${CC:-cc}" -std=gnu11 -g -Wno-deprecated-declarations -Wno-macro-redefined -fsanitize=address,undefined \ ++ -Itests/ws_subscriptions/project_stubs -Icomponents/ch405labs_esp_libssh2/libssh2/include -Itests/ws_subscriptions/stubs -Icomponents/ts_webui/include -Icomponents/ts_webui/src -Icomponents/ts_security/include -Icomponents/ts_automation/include -Icomponents/ts_drivers/include -Icomponents/ts_console/include -Icomponents/ts_net/include -I"$cjson" \ ++ tests/ws_subscriptions/test_project.c "$cjson/cJSON.c" -o "$build/adapter" ++"$build/adapter" +diff --git a/tests/ws_subscriptions/run_project_v3.py b/tests/ws_subscriptions/run_project_v3.py +new file mode 100644 +index 0000000..5fb597c +--- /dev/null ++++ b/tests/ws_subscriptions/run_project_v3.py +@@ -0,0 +1,19 @@ ++#!/usr/bin/env python3 ++"""Local suite entry; no device access. Preserve every subprocess exit status.""" ++import json, os, pathlib, subprocess, sys ++root=pathlib.Path(__file__).resolve().parents[2] ++out=pathlib.Path(os.environ.get('V3_RESULTS',str(root/'docs/repair/ws-project-v3/results')));out.mkdir(parents=True,exist_ok=True) ++commands=[('host',['bash','tests/ws_subscriptions/run_host.sh']),('operation',['bash','tests/ws_subscriptions/run_operation.sh']),('adapter',['bash','tests/ws_subscriptions/run_operation_adapter.sh']),('control',['bash','tests/ws_subscriptions/run_control.sh']),('reviewer',['bash','tests/ws_subscriptions/run_reviewer.sh']),('f1_f2',['bash','tests/ws_subscriptions/run_f1_f2.sh']),('runtime',['bash','tests/runtime/run_all.sh']),('certificate',['bash','tests/certificate/run_host.sh']),('prompts',['npm','test','--prefix','tests/prompts']),('release',['python3','tests/release/test_release.py']),('shell_driver',['bash','tests/ws_subscriptions/run_shell_driver.sh'])] ++if '--browser' in sys.argv: commands=[('browser',['npm','run','test:browser','--prefix','tests/prompts'])] ++results=[] ++for name,cmd in commands: ++ with (out/(name+'.log')).open('w') as f:r=subprocess.run(cmd,cwd=root,stdout=f,stderr=subprocess.STDOUT) ++ results.append(dict(name=name,command=cmd,exit=r.returncode));print(name,r.returncode,flush=True) ++for language in ['en-US','zh-CN']: ++ name=('cross-browser-' if '--browser' in sys.argv else 'cross-node-')+language ++ env=dict(os.environ,CROSS_LANGUAGE=language,CROSS_OUTPUT=str(out/(name+'.json'))) ++ cmd=['node','tests/prompts/project-cross.cjs']+(['--browser'] if '--browser' in sys.argv else []) ++ with (out/(name+'.log')).open('w') as f:r=subprocess.run(cmd,cwd=root,env=env,stdout=f,stderr=subprocess.STDOUT) ++ results.append(dict(name=name,command=cmd,exit=r.returncode));print(name,r.returncode,flush=True) ++(out/('browser.json' if '--browser' in sys.argv else 'host.json')).write_text(json.dumps(results,indent=2)) ++sys.exit(any(r['exit'] for r in results)) +diff --git a/tests/ws_subscriptions/run_shell_driver.sh b/tests/ws_subscriptions/run_shell_driver.sh +new file mode 100644 +index 0000000..fb52e4f +--- /dev/null ++++ b/tests/ws_subscriptions/run_shell_driver.sh +@@ -0,0 +1,19 @@ ++#!/bin/bash ++set -euo pipefail ++cd "$(dirname "$0")/../.." ++: "${IDF_PATH:?NOT RUN: set IDF_PATH to the project SDK}" ++build=$(mktemp -d /tmp/ts-ws-adapter.XXXXXX) ++trap 'rm -rf "$build"' EXIT ++cjson="$IDF_PATH/components/json/cJSON" ++extra=() ++if [[ "${PROJECT_BASELINE:-0}" == 1 ]]; then extra+=(-DPROJECT_BASELINE); fi ++python3 - "$build" <<'PYCLI' ++import pathlib,sys ++s=pathlib.Path('components/ts_console/commands/ts_cmd_ssh.c').read_text() ++a=s.index('static const char *shell_input_callback(');b=s.index('static int do_ssh_shell(',a) ++pathlib.Path(sys.argv[1],'cli_shell_fixture.inc').write_text(s[a:b]) ++PYCLI ++"${CC:-cc}" -std=gnu11 -g -Wno-deprecated-declarations -Wno-macro-redefined -fsanitize=address,undefined \ ++ "${extra[@]}" -I"$build" -Itests/ws_subscriptions/project_stubs -Icomponents/ch405labs_esp_libssh2/libssh2/include -Itests/ws_subscriptions/stubs -Icomponents/ts_webui/include -Icomponents/ts_webui/src -Icomponents/ts_security/include -Icomponents/ts_automation/include -Icomponents/ts_drivers/include -Icomponents/ts_console/include -Icomponents/ts_net/include -I"$cjson" \ ++ tests/ws_subscriptions/test_shell_driver.c "$cjson/cJSON.c" -o "$build/adapter" ++"$build/adapter" "$@" +diff --git a/tests/ws_subscriptions/test_project.c b/tests/ws_subscriptions/test_project.c +new file mode 100644 +index 0000000..b7b63f7 +--- /dev/null ++++ b/tests/ws_subscriptions/test_project.c +@@ -0,0 +1,40 @@ ++#define OP_ADAPTER_NO_MAIN ++#define PROJECT_REAL_DRIVER ++#include "test_operation_adapter.c" ++static void emit(httpd_ws_frame_t*f){ ++ printf("{\"frame\":%.*s,\"fd\":%d,\"bytes\":\"",(int)f->len,f->payload,sent_fd); ++ for(size_t i=0;ilen;i++){unsigned char c=f->payload[i];if(c=='"'||c=='\\')putchar('\\');if(c<32)printf("\\u%04x",c);else putchar(c);}puts("\"}"); ++} ++static void close_during_error(void){ssh_shell_context_t *ctx=shell_task.arg;ssh_send_output(ctx,"last output",11);ssh_close(ctx->op,"closed","SSH session closed");} ++static void fail_error_encoding(void){fail_allocation=allocations+1;} ++int main(void){ ++ cJSON_Hooks h={tracked_malloc,tracked_free};cJSON_InitHooks(&h);sent_hook=emit;setup(); ++ char line[4096];while(fgets(line,sizeof(line),stdin)){ ++ cJSON *j=cJSON_Parse(line);assert(j);const char *cmd=cJSON_GetStringValue(cJSON_GetObjectItem(j,"cmd")); ++ if(cmd && !strcmp(cmd,"finish")){ssh_cleanup();if(shell_task.fn){shell_task.fn(shell_task.arg);shell_task.fn=NULL;}drive_all();cJSON_Delete(j);finish_all();assert(!driver_channels&&!driver_sessions&&!driver_sockets);puts("{\"finished\":true}");return 0;} ++ if(cmd && !strcmp(cmd,"eof")){driver_eof=true;shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} ++ else if(cmd && !strcmp(cmd,"output")){ssh_shell_context_t *ctx=shell_task.arg;ssh_send_output(ctx,"stream",6);} ++ else if(cmd && !strcmp(cmd,"error_close")){barrier_name="request_error_encode";barrier_action=close_during_error;} ++ else if(cmd && !strcmp(cmd,"write_again"))driver_write_again=true; ++ else if(cmd && !strcmp(cmd,"close_again"))driver_close_again=true; ++ else if(cmd && !strcmp(cmd,"reset_driver")){driver_write_fail=driver_write_again=driver_resize_reject=driver_close_again=driver_eof=false;driver_phase=0;} ++ else if(cmd && !strcmp(cmd,"setup_fail"))driver_phase=4; ++ else if(cmd && !strcmp(cmd,"queue_fail"))queue_fail=true; ++ else if(cmd && !strcmp(cmd,"queue_resume")){queue_fail=false;test_now+=100000;drive_all();} ++ else if(cmd && !strcmp(cmd,"send_fail"))send_fail=true; ++ else if(cmd && !strcmp(cmd,"send_resume"))send_fail=false; ++ else if(cmd && !strcmp(cmd,"encode_fail")){barrier_name="request_error_encode";barrier_action=fail_error_encoding;} ++ else if(cmd && !strcmp(cmd,"encode_resume"))fail_allocation=0; ++ else if(cmd && !strcmp(cmd,"write_fail"))driver_write_fail=true; ++ else if(cmd && !strcmp(cmd,"resize_reject"))driver_resize_reject=true; ++ else if(cmd && !strcmp(cmd,"drain"))drive_all(); ++ else { ++ int fd=1;cJSON *f=cJSON_GetObjectItem(j,"fd");if(f)fd=f->valueint; ++ cJSON *msg=cJSON_GetObjectItem(j,"message");char *raw=cJSON_PrintUnformatted(msg);incoming=raw;reqs[fd].method=1;current=(void*)3;int ret=ws_handler(&reqs[fd]);current=(void*)1;incoming=NULL;cJSON_free(raw);assert(ret==0);drive_all(); ++ } ++ if(shell_task.fn && (((ssh_shell_context_t*)shell_task.arg)->disconnect_requested || !ts_ws_op_is_open(((ssh_shell_context_t*)shell_task.arg)->op))){shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} ++ ts_ws_op_stats_t st;ts_ws_op_stats(TS_WS_OP_SHELL,&st); ++ printf("{\"state\":%d,\"writes\":%d,\"live\":%u,\"channels\":%d,\"refs\":%u,\"preparing\":%u,\"unsettled\":%u}\n",st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j); ++ } ++ return 2; ++} +diff --git a/tests/ws_subscriptions/test_shell_driver.c b/tests/ws_subscriptions/test_shell_driver.c +new file mode 100644 +index 0000000..d6f6f8d +--- /dev/null ++++ b/tests/ws_subscriptions/test_shell_driver.c +@@ -0,0 +1,56 @@ ++#define OP_ADAPTER_NO_MAIN ++#define PROJECT_REAL_DRIVER ++#include "test_operation_adapter.c" ++static unsigned notified; ++static void cli_output(const char *data,size_t len,void *arg){(void)data;(void)len;(void)arg;} ++#define CONFIG_ESP_CONSOLE_UART_NUM 0 ++static unsigned cli_interrupts; ++static int uart_read_bytes(int port,uint8_t *b,size_t n,unsigned wait){(void)port;(void)n;(void)wait;*b=0x1c;return 1;} ++static void cli_request_interrupt(void){cli_interrupts++;} ++static void cli_printf(const char *fmt,...){(void)fmt;} ++#define ts_console_request_interrupt cli_request_interrupt ++#define ts_console_printf cli_printf ++#include "cli_shell_fixture.inc" ++#undef ts_console_request_interrupt ++#undef ts_console_printf ++static void driver_closed_cb(int code,void *arg){(void)code;(void)arg;notified++;} ++static void make_shell(ts_ssh_session_t *session,ts_ssh_shell_t *shell){ ++ ts_ssh_config_t c=TS_SSH_DEFAULT_CONFIG();c.host="192.0.2.1";c.username="u";c.auth.password="p"; ++ assert(ts_ssh_session_create(&c,session)==0 && ts_ssh_connect(*session)==0); ++ assert(ts_ssh_shell_open(*session,NULL,shell)==0); ++} ++static void empty(void){assert(!live_allocations && !driver_channels && !driver_sessions && !driver_sockets);} ++int main(int argc,char **argv){ ++ (void)argv; ++ cJSON_Hooks hooks={tracked_malloc,tracked_free};cJSON_InitHooks(&hooks); ++ ts_ssh_session_t session;ts_ssh_shell_t shell;char buf[8];size_t n;int64_t before; ++ if(argc>1 && !strcmp(argv[1],"--cli-exit")){make_shell(&session,&shell);size_t ignored=0;shell_input_callback(&ignored,shell);fprintf(stderr,"CLI exit: active=%d interrupt=%u\n",ts_ssh_shell_is_active(shell),cli_interrupts);assert(!ts_ssh_shell_is_active(shell) && cli_interrupts==1);ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty();return 0;} ++ if(argc>1 && !strcmp(argv[1],"--metrics")){unsigned begin=allocations;make_shell(&session,&shell);unsigned opened=allocations;assert(ts_ssh_shell_write(shell,"abc",3,&n)==ESP_OK);unsigned wrote=allocations;assert(ts_ssh_shell_send_signal(shell,"TERM")==ESP_ERR_NOT_SUPPORTED);unsigned rejected=allocations;ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty();printf("{\"open_allocations\":%u,\"write_allocations\":%u,\"unsupported_allocations\":%u,\"close_allocations\":%u,\"retained\":%u}\n",opened-begin,wrote-opened,rejected-wrote,allocations-rejected,live_allocations);return 0;} ++ if(argc>1){make_shell(&session,&shell);driver_eof=true;assert(ts_ssh_shell_read(shell,buf,sizeof(buf),&n)==ESP_ERR_INVALID_STATE);assert(ts_ssh_shell_close(shell)==0);ts_ssh_session_destroy(session);fprintf(stderr,"EOF ledger: allocations=%u channels=%d sessions=%d sockets=%d\n",live_allocations,driver_channels,driver_sessions,driver_sockets);empty();return 0;} ++ make_shell(&session,&shell);assert(ts_ssh_shell_read(shell,buf,sizeof(buf),&n)==ESP_ERR_TIMEOUT && ts_ssh_shell_is_active(shell)); ++ ts_ssh_shell_set_close_cb(shell,driver_closed_cb,NULL);driver_eof=true; ++ assert(ts_ssh_shell_poll(shell)==ESP_ERR_INVALID_STATE && notified==1);assert(ts_ssh_shell_close(shell)==0);shell=NULL;assert(notified==1);assert(ts_ssh_session_destroy(session)==0);empty();driver_eof=false; ++ puts("PASS real Shell+client: zero data is not EOF; EOF then close releases wrapper/channel/session/socket; close callback exactly once"); ++ make_shell(&session,&shell);driver_write_fail=true;assert(ts_ssh_shell_write(shell,"x",1,&n)==ESP_FAIL && n==0 && !ts_ssh_shell_is_active(shell));driver_write_fail=false; ++ assert(ts_ssh_shell_close(shell)==0);ts_ssh_session_destroy(session);empty(); ++ make_shell(&session,&shell);driver_partial=true;assert(ts_ssh_shell_write(shell,"abc",3,&n)==ESP_FAIL && n==1 && !ts_ssh_shell_is_active(shell));driver_write_fail=false;ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty(); ++ make_shell(&session,&shell);driver_resize_reject=true;assert(ts_ssh_shell_resize(shell,80,24)==ESP_FAIL && ts_ssh_shell_is_active(shell));driver_resize_reject=false;driver_read_fail=true;assert(ts_ssh_shell_read(shell,buf,sizeof(buf),&n)==ESP_FAIL && !ts_ssh_shell_is_active(shell));driver_read_fail=false;ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty(); ++ make_shell(&session,&shell);driver_write_again=true;before=test_now;assert(ts_ssh_shell_write(shell,"x",1,&n)==ESP_ERR_TIMEOUT && test_now-before<=1000000);driver_write_again=false; ++ driver_close_again=true;before=test_now;assert(ts_ssh_shell_close(shell)==0 && test_now==before);ts_ssh_session_destroy(session);driver_close_again=false;empty(); ++ puts("PASS real Shell+client: fatal write/timeout retires channel; persistent close EAGAIN falls back to local session teardown without waiting"); ++ for(int phase=1;phase<=4;phase++){ ++ ts_ssh_config_t c=TS_SSH_DEFAULT_CONFIG();c.host="192.0.2.1";c.username="u";c.auth.password="p"; ++ assert(ts_ssh_session_create(&c,&session)==0 && ts_ssh_connect(session)==0);driver_phase=phase;driver_close_again=true;before=test_now;shell=(void*)1; ++ assert(ts_ssh_shell_open(session,NULL,&shell)!=0 && !shell && test_now-before<=10000000);ts_ssh_session_destroy(session);driver_phase=0;driver_close_again=false;empty(); ++ } ++ puts("PASS real Shell+client: partial initialization/open/PTY/shell-start failure and bounded EAGAIN all release owned resources"); ++ make_shell(&session,&shell);before=driver_reads;assert(ts_ssh_shell_run(shell,cli_output,shell_input_callback,shell)==ESP_OK && driver_reads==before && cli_interrupts==1);ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty(); ++ puts("PASS Shell run: local exit requested by input callback stops before another network read; close still owns cleanup"); ++ setup();cJSON *j=cJSON_Parse("{\"host\":\"192.0.2.1\",\"user\":\"u\",\"password\":\"p\"}");handle_ssh_connect(&reqs[1],j);cJSON_Delete(j);assert(shell_task.fn);ssh_shell_context_t *ctx=shell_task.arg;ssh_cleanup();shell_resources_close(ctx);shell_resources_close(ctx);shell_task.fn(shell_task.arg);finish_all();empty(); ++ puts("PASS actual WebUI cleanup twice uses cleared handles; original operation/ticket/target and actual lower resources drain"); ++ setup();shell_task.fn=NULL;j=cJSON_Parse("{\"host\":\"192.0.2.1\",\"user\":\"u\",\"password\":\"p\"}");handle_ssh_connect(&reqs[1],j);cJSON_Delete(j);assert(shell_task.fn); ++ ssh_send_output(shell_task.arg,"accepted",8); ++ assert(ts_webui_ws_stop((void*)11)==ESP_ERR_TIMEOUT);assert(driver_channels==1 && ts_ws_op_busy()); ++ delay_hook=stop_progress_shell;assert(ts_webui_ws_stop((void*)11)==ESP_OK);delay_hook=NULL;for(int i=0;i<32;i++)if(reqs[i].sess_ctx)close_peer(i);ts_webui_ws_stopped((void*)11);empty(); ++ puts("PASS real lower resources survive stop timeout; accepted output and terminal drain on retry with no new business message"); ++} +diff --git a/tests/ws_subscriptions/verify_project_assets.py b/tests/ws_subscriptions/verify_project_assets.py +new file mode 100644 +index 0000000..20e4116 +--- /dev/null ++++ b/tests/ws_subscriptions/verify_project_assets.py +@@ -0,0 +1,21 @@ ++#!/usr/bin/env python3 ++"""Verify final optimized/gzip files and reproduce SPIFFS with the fixed SDK.""" ++import gzip,hashlib,json,os,pathlib,subprocess,tempfile ++root=pathlib.Path(__file__).resolve().parents[2] ++build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));web=build/'esp-idf/ts_webui/web_optimized';src=root/'components/ts_webui/web';doc=root/'docs/repair/ws-project-v3' ++sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() ++result={} ++for rel in ['index.html','js/terminal.js','js/lang/zh-CN.js','js/lang/en-US.js']: ++ p=web/rel;gz=p.with_suffix(p.suffix+'.gz');assert gzip.decompress(gz.read_bytes())==p.read_bytes() ++ if rel.endswith('.js'):subprocess.run(['node','--check',str(p)],check=True) ++ result[rel]={'source_sha256':sha(src/rel),'optimized_sha256':sha(p),'gzip_sha256':sha(gz),'optimized_bytes':p.stat().st_size} ++assert '20260926-shell-contract' in (web/'index.html').read_text() ++assert 'sshControlUnsupported' in (web/'js/terminal.js').read_text() ++with tempfile.TemporaryDirectory(prefix='ts-v3-spiffs-') as d: ++ image=pathlib.Path(d)/'www.bin' ++ cmd=['python3',os.environ['IDF_PATH']+'/components/spiffs/spiffsgen.py','0x300000',str(web),str(image),'--page-size=256','--obj-name-len=32','--meta-len=4','--use-magic','--use-magic-len'] ++ subprocess.run(cmd,check=True);assert image.read_bytes()==(build/'www.bin').read_bytes() ++result['build']={p:{'sha256':sha(build/p),'bytes':(build/p).stat().st_size} for p in ['TianShanOS.bin','www.bin','TianShanOS.elf']} ++result['spiffs_regeneration']='byte-identical from verified optimized directory' ++(doc/'assets.json').write_text(json.dumps(result,indent=2)) ++print('PASS optimized syntax, gzip identity, cache key, and byte-identical SPIFFS reconstruction') +diff --git a/tests/prompts/project-cross.cjs b/tests/prompts/project-cross.cjs +new file mode 100644 +index 0000000..c902f24 +--- /dev/null ++++ b/tests/prompts/project-cross.cjs +@@ -0,0 +1,88 @@ ++/* Bidirectional bridge: final production C frames -> actual JS socket dispatcher -> ++ * actual onData/start/exit requests -> real C ws_handler + operation + SSH drivers. ++ * Network/libssh2/xterm rendering are boundaries; no lifecycle logic is replaced. */ ++const assert=require('node:assert/strict'),{spawn}=require('node:child_process'),readline=require('node:readline'),fs=require('node:fs'); ++const path=require('node:path'),{harness,read:sourceRead}=require('./harness.cjs'); ++const read=file=>process.env.PROJECT_WEB_ROOT?fs.readFileSync(path.join(process.env.PROJECT_WEB_ROOT,file),'utf8'):sourceRead(file); ++async function engine(language,browserMode){ ++ if(!browserMode){const h=harness(language);await h.ready();h.load();await h.run(`i18n.setLanguage('${language}')`);return {run:async s=>h.run(s),close:async()=>{}};} ++ const {chromium}=require('playwright');const browser=await chromium.launch({channel:'chrome',headless:true}); ++ const page=await browser.newPage();const errors=[];page.on('pageerror',err=>errors.push(err.message)); ++ await page.addInitScript(language=>{localStorage.setItem('ts_language',language);window.WebSocket=class{static OPEN=1;static CONNECTING=0;constructor(){this.readyState=0;}send(){}close(){}};},language); ++ await page.route('**/*',async r=>{ ++ const url=new URL(r.request().url());if(url.origin!=='http://fixture.local'){await r.abort();return;} ++ if(url.pathname.startsWith('/api/')){await r.fulfill({json:{code:0,data:{}}});return;} ++ const rel=url.pathname==='/'?'index.html':url.pathname.slice(1); ++ try{await r.fulfill({body:read(rel),contentType:rel.endsWith('.js')?'application/javascript':rel.endsWith('.css')?'text/css':rel.endsWith('.html')?'text/html':'application/octet-stream'});}catch{await r.abort();} ++ }); ++ await page.goto('http://fixture.local/');await page.waitForFunction(()=>i18n.isReady()); ++ await page.evaluate(()=>{const f=document.createElement('div');f.id='fixture';document.body.append(f);}); ++ return {run:s=>page.evaluate(s),close:async()=>{await browser.close();assert.deepEqual(errors,[]);}}; ++} ++async function main(){ ++ const baseline=process.argv.includes('--baseline'),browserMode=process.argv.includes('--browser'); ++ const language=process.env.CROSS_LANGUAGE||'en-US',e=await engine(language,browserMode); ++ let c;const records=[];let exit,err='',pending,chain=Promise.resolve(); ++ try{ ++ await e.run(`window.sent=[];window.lines=[];window.input=null; ++ window.WebSocket=class {static OPEN=1;static CONNECTING=0;constructor(){this.readyState=1;}send(s){sent.push(JSON.parse(s));}close(){this.readyState=3;}}; ++ window.term=new WebTerminal('fixture');term.terminal={write:s=>lines.push(s),writeln:s=>lines.push(s),onData:f=>input=f,dispose:()=>{}}; ++ term.setupInputHandler();term.connect();term.ws.onopen();`); ++ c=spawn('bash',['tests/ws_subscriptions/run_project_bridge.sh'],{cwd:path.resolve(__dirname,'../..'),env:process.env}); ++ c.stderr.on('data',b=>err+=b); ++ const done=new Promise(r=>c.on('close',code=>{exit=code;r(code);if(pending){pending.reject(new Error(err||'C exited '+code));pending=null;}})); ++ readline.createInterface({input:c.stdout}).on('line',line=>{ ++ chain=chain.then(async()=>{const m=JSON.parse(line);records.push(m); ++ if(m.frame && m.fd===1)await e.run(`term.ws.onmessage({data:${JSON.stringify(m.bytes || JSON.stringify(m.frame))}})`); ++ if('state'in m||m.finished){const p=pending;pending=null;p?.resolve(m);} ++ }).catch(error=>{pending?.reject(error);pending=null;}); ++ }); ++ const step=msg=>new Promise((resolve,reject)=>{assert(!pending);pending={resolve,reject};c.stdin.write(JSON.stringify(msg)+'\n');}); ++ const sendNext=async()=>{const message=await e.run('sent.shift()');assert(message,'frontend generated no request');return step({message});}; ++ const start=async()=>{await e.run(`term.startSshShell({host:'192.0.2.1',user:'fake',password:'fake',port:22})`);return sendNext();}; ++ const state=()=>e.run(`({mode:term.sshMode,connecting:term.sshConnecting,restoring:term.restoring,connected:term.connected,lines:[...lines],sent:[...sent]})`); ++ await sendNext();await start();assert((await state()).mode); ++ const before=(await state()).lines.length;const afterSignal=await step({message:{type:'ssh_signal',signal:'TERM'}}); ++ const s=await state();const recovered=s.mode&&!s.restoring&&!s.lines.slice(before).some(x=>x==='tianshan> '); ++ await e.run(`input('x\\r')`);const next=await e.run('sent.shift()'); ++ if(baseline){assert(!recovered && next.type!=='ssh_input');await step({cmd:'finish'});await done;assert.equal(exit,0,err);console.log('CONFIRMED H1: actual C request error leaves op OPEN but JS exits SSH and next input is not routed to SSH');return;} ++ assert(recovered,'request failure changed active SSH mode/prompt/recovery');assert.equal(next.type,'ssh_input'); ++ let cs=await step({message:next});assert.equal(cs.writes,afterSignal.writes+1,'next frontend input must execute on original C Shell'); ++ for(const message of [{type:'ssh_resize',width:0,height:20},{type:'ssh_resize',width:80.5,height:20}]){await step({message});assert((await state()).mode);} ++ await step({cmd:'resize_reject'});await step({message:{type:'ssh_resize',width:80,height:24}});assert((await state()).mode);await step({cmd:'reset_driver'}); ++ // Another page cannot input, disconnect, signal or resize the current owner. ++ const n=cs.writes;for(const message of [{type:'ssh_input',data:'wrong'},{type:'ssh_disconnect'},{type:'ssh_signal',signal:'INT'},{type:'ssh_resize',width:80,height:24},{type:'ssh_connect',host:'192.0.2.2',user:'other'}]){cs=await step({fd:2,message});assert.equal(cs.writes,n);assert.equal(cs.channels,1);assert((await state()).mode);} ++ // A rejected duplicate start on the owner also must not terminate its live op. ++ await step({message:{type:'ssh_connect',host:'192.0.2.1',user:'fake'}});assert((await state()).mode); ++ await e.run(`input('\\x1c')`);await sendNext();assert(!(await state()).mode);assert((await state()).connected); ++ await e.run(`input('help\\r')`);const local=await e.run('sent.shift()');assert.equal(local.type,'terminal_input');await step({message:local}); ++ await step({message:{type:'terminal_stop'}});await e.run(`input('help\\r')`);await sendNext();assert((await state()).restoring); ++ const restore=await e.run('sent.shift()');assert.equal(restore.type,'terminal_start');await step({message:restore});assert((await state()).connected && !(await state()).restoring); ++ await start();assert((await state()).mode);await step({cmd:'write_fail'});await e.run(`input('x')`);await sendNext();assert(!(await state()).mode);assert(!(await state()).restoring);assert((await state()).lines.some(x=>/unconfirmed|尚未确认/.test(x))); ++ await step({cmd:'reset_driver'});await start();assert((await state()).mode);await step({cmd:'eof'});assert(!(await state()).mode); ++ await step({cmd:'reset_driver'});await step({cmd:'setup_fail'});await start();assert(!(await state()).mode && !(await state()).connecting);await step({cmd:'reset_driver'});await start();assert((await state()).mode); ++ // Failed notification encoding does not change active request ownership. ++ await step({cmd:'encode_fail'});await step({message:{type:'ssh_signal',signal:'TERM'}});await step({cmd:'encode_resume'});assert((await state()).mode);await e.run(`input('z')`);await sendNext(); ++ // A control failure crosses output preparation and a genuine close: exactly one terminal, ++ // queued output precedes it, then next frontend action is local (no automatic replay). ++ const crossing=records.length;await step({cmd:'error_close'});await step({message:{type:'ssh_signal',signal:'TERM'}});assert(!(await state()).mode); ++ const crossed=records.slice(crossing).filter(r=>r.frame&&r.fd===1).map(r=>r.frame); ++ assert.equal(crossed.filter(f=>f.type==='ssh_status'&&f.status==='closed').length,1); ++ assert(crossed.findIndex(f=>f.type==='ssh_output')f.type==='ssh_status'&&f.status==='closed')); ++ await start();assert((await state()).mode); ++ // Direct request notification send failure cannot recursively change the operation. ++ await step({cmd:'send_fail'});await step({message:{type:'ssh_signal',signal:'TERM'}});await step({cmd:'send_resume'});assert((await state()).mode); ++ await e.run(`input('q')`);await sendNext(); ++ // Output accepted while HTTPD is unavailable follows the existing original-operation ++ // failure path; capacity recovers with no new business input, and resources settle. ++ await step({cmd:'queue_fail'});await step({cmd:'output'});await step({cmd:'queue_resume'});assert(!(await state()).mode); ++ await step({cmd:'finish'});await done;assert.equal(exit,0,err); ++ // Old socket frames/close and callbacks after destroy cannot change new instance. ++ const stale=await e.run(`(()=>{const old=term.ws;term.connect();term.connected=true;term.sshMode=true;const fresh=term.ws;old.onmessage({data:JSON.stringify({type:'ssh_status',status:'error'})});old.onclose({code:1006});const held=term.sshMode&&term.connected&&term.ws===fresh;term.destroy();fresh.onmessage({data:JSON.stringify({type:'connected'})});return held&&!term.connected;})()`);assert(stale); ++ console.log(`PASS ${browserMode?'Chrome':'Node'} ${language}: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero`); ++ }finally{ ++ if(process.env.CROSS_OUTPUT)fs.writeFileSync(process.env.CROSS_OUTPUT,JSON.stringify({records,stderr:err,exit},null,2)); ++ if(c && exit===undefined)c.kill('SIGTERM');await e.close(); ++ } ++} ++main().catch(e=>{console.error(e);process.exitCode=1;}); diff --git a/docs/repair/ws-project-v3/cumulative-files.txt b/docs/repair/ws-project-v3/cumulative-files.txt new file mode 100644 index 0000000..0b9f186 --- /dev/null +++ b/docs/repair/ws-project-v3/cumulative-files.txt @@ -0,0 +1,340 @@ + .github/workflows/build.yml | 43 +- + .gitignore | 3 + + build/TianShanOS.bin | Bin 2154096 -> 2161568 bytes + build/www.bin | Bin 3145728 -> 3145728 bytes + .../ch405labs_esp_libssh2/libssh2/src/mbedtls.c | 2 +- + .../ch405labs_esp_libssh2/libssh2/src/userauth.c | 2 +- + components/ts_api/CMakeLists.txt | 2 +- + components/ts_api/src/ts_api_automation.c | 1067 ++---- + components/ts_api/src/ts_api_cert.c | 110 +- + components/ts_api/src/ts_api_ssh.c | 215 +- + components/ts_automation/CMakeLists.txt | 2 + + .../ts_automation/include/ts_action_manager.h | 10 + + .../ts_automation/include/ts_automation_types.h | 12 +- + components/ts_automation/include/ts_rule_codec.h | 14 + + components/ts_automation/include/ts_rule_engine.h | 13 +- + components/ts_automation/src/ts_action_manager.c | 585 ++-- + components/ts_automation/src/ts_automation.c | 120 +- + components/ts_automation/src/ts_rule_codec.c | 502 +++ + components/ts_automation/src/ts_rule_engine.c | 1959 ++++------- + components/ts_automation/src/ts_rule_store.c | 400 +++ + components/ts_automation/src/ts_rule_store.h | 11 + + components/ts_cert/CMakeLists.txt | 1 + + components/ts_cert/include/ts_cert.h | 49 +- + components/ts_cert/include/ts_cert_time.h | 17 + + components/ts_cert/src/ts_cert.c | 913 +++-- + components/ts_cert/src/ts_cert_time.c | 42 + + components/ts_console/commands/ts_cmd_auto.c | 1 + + components/ts_console/commands/ts_cmd_pki.c | 17 +- + components/ts_console/commands/ts_cmd_ssh.c | 15 +- + components/ts_core/ts_event/include/ts_event.h | 9 + + components/ts_core/ts_event/src/ts_event.c | 210 +- + components/ts_core/ts_log/include/ts_log.h | 2 + + components/ts_core/ts_log/src/ts_log.c | 443 +-- + components/ts_core/ts_log/src/ts_log_preview.h | 59 + + components/ts_core/ts_service/src/ts_service.c | 13 +- + components/ts_https/include/ts_https.h | 13 + + components/ts_https/src/ts_https.c | 164 +- + components/ts_https/src/ts_https_auth.c | 25 +- + components/ts_net/include/ts_http_server.h | 6 + + components/ts_net/src/ts_http_server.c | 55 +- + components/ts_net/src/ts_time_sync.c | 13 +- + components/ts_pki_client/src/ts_pki_client.c | 83 +- + components/ts_security/CMakeLists.txt | 2 + + components/ts_security/Kconfig | 8 + + components/ts_security/include/ts_ssh_client.h | 10 +- + components/ts_security/include/ts_ssh_log_watch.h | 9 +- + components/ts_security/include/ts_ssh_probe.h | 17 + + components/ts_security/include/ts_ssh_service.h | 57 + + components/ts_security/src/ts_security.c | 6 + + components/ts_security/src/ts_ssh_client.c | 960 ++---- + .../ts_security/src/ts_ssh_commands_config.c | 81 +- + components/ts_security/src/ts_ssh_hosts_config.c | 65 +- + components/ts_security/src/ts_ssh_log_watch.c | 739 ++-- + components/ts_security/src/ts_ssh_probe.c | 63 + + components/ts_security/src/ts_ssh_service.c | 646 ++++ + components/ts_webui/CMakeLists.txt | 4 +- + components/ts_webui/include/ts_ws_operation.h | 61 + + components/ts_webui/include/ts_ws_subscriptions.h | 21 +- + components/ts_webui/include/ts_ws_transport.h | 131 + + components/ts_webui/src/ts_webui.c | 16 +- + components/ts_webui/src/ts_webui_ws.c | 1503 ++++---- + components/ts_webui/src/ts_ws_operation.c | 276 ++ + components/ts_webui/src/ts_ws_subscriptions.c | 1046 +++--- + components/ts_webui/src/ts_ws_transport.c | 658 ++++ + components/ts_webui/web/index.html | 169 +- + components/ts_webui/web/js/api.js | 113 +- + components/ts_webui/web/js/app.js | 3100 +++++++++-------- + components/ts_webui/web/js/lang/en-US.js | 368 +- + components/ts_webui/web/js/lang/zh-CN.js | 338 +- + components/ts_webui/web/js/router.js | 79 +- + components/ts_webui/web/js/terminal.js | 87 +- + docs/CERTIFICATE_FIX_REPORT.md | 254 ++ + docs/OS_RUNTIME_AUDIT_2026-09-23.md | 145 + + docs/PROMPT_REPAIR_REPORT.md | 34 + + docs/releases/v0.5.2-validation.md | 51 + + docs/releases/v0.5.2.md | 69 + + docs/repair/ws-control/README.md | 79 + + docs/repair/ws-control/adapter-tests.txt | 13 + + docs/repair/ws-control/baseline-adapter.c | 287 ++ + docs/repair/ws-control/baseline-control.c | 20 + + docs/repair/ws-control/baseline-evidence.json | 6 + + docs/repair/ws-control/baseline-results.txt | 3 + + docs/repair/ws-control/baseline.json | 81 + + docs/repair/ws-control/baseline.tar.gz | Bin 0 -> 935282 bytes + docs/repair/ws-control/build-artifacts.json | 10 + + docs/repair/ws-control/build.txt | 30 + + docs/repair/ws-control/certificate-tests.txt | 9 + + docs/repair/ws-control/changes.json | 18 + + docs/repair/ws-control/changes.patch | 862 +++++ + docs/repair/ws-control/control-contract.md | 28 + + docs/repair/ws-control/control-tests.txt | 5 + + docs/repair/ws-control/current-v1.txt | 1 + + docs/repair/ws-control/current-v2.txt | 1 + + docs/repair/ws-control/diff-check.txt | 1 + + docs/repair/ws-control/f1-f2-tests.txt | 23 + + docs/repair/ws-control/historical-f1-f2.txt | 4 + + docs/repair/ws-control/historical-g1-g2.txt | 4 + + docs/repair/ws-control/host-tests.txt | 23 + + docs/repair/ws-control/operation-tests.txt | 2 + + docs/repair/ws-control/publication-adapter.txt | 13 + + docs/repair/ws-control/publication-control.txt | 5 + + docs/repair/ws-control/publication-f1f2.txt | 23 + + docs/repair/ws-control/publication-gate.md | 13 + + docs/repair/ws-control/publication-reviewer.txt | 15 + + docs/repair/ws-control/publication-webui.txt | 51 + + docs/repair/ws-control/resources.txt | 300 ++ + docs/repair/ws-control/reviewer-tests.txt | 15 + + docs/repair/ws-control/runtime-tests.txt | 13 + + docs/repair/ws-control/webui-browser-tests.txt | 56 + + docs/repair/ws-control/webui-node-tests.txt | 51 + + docs/repair/ws-control/working-tree-status.txt | 15 + + docs/repair/ws-f1-f2/README.md | 101 + + docs/repair/ws-f1-f2/after.txt | 23 + + docs/repair/ws-f1-f2/baseline.json | 96 + + docs/repair/ws-f1-f2/before.txt | 4 + + docs/repair/ws-f1-f2/browser.txt | 56 + + docs/repair/ws-f1-f2/build.txt | 33 + + docs/repair/ws-f1-f2/certificate.txt | 9 + + docs/repair/ws-f1-f2/changes.patch | 1012 ++++++ + docs/repair/ws-f1-f2/diff-check.txt | 2 + + docs/repair/ws-f1-f2/final-manifest.json | 41 + + docs/repair/ws-f1-f2/host.txt | 25 + + docs/repair/ws-f1-f2/pr-update-gate.md | 11 + + docs/repair/ws-f1-f2/pr-update-regression.txt | 23 + + docs/repair/ws-f1-f2/pr-update-release.txt | 5 + + docs/repair/ws-f1-f2/pr-update-reviewer.txt | 17 + + docs/repair/ws-f1-f2/pre-fix-source.tar.gz | Bin 0 -> 961554 bytes + docs/repair/ws-f1-f2/prompts.txt | 51 + + docs/repair/ws-f1-f2/resources.txt | 18 + + docs/repair/ws-f1-f2/reviewer.txt | 17 + + docs/repair/ws-f1-f2/runtime.txt | 13 + + docs/repair/ws-operation/README.md | 120 + + docs/repair/ws-operation/adapter-tests.txt | 13 + + docs/repair/ws-operation/baseline-g1-g2.txt | 4 + + docs/repair/ws-operation/baseline.json | 125 + + docs/repair/ws-operation/baseline.tar.gz | Bin 0 -> 1007908 bytes + docs/repair/ws-operation/build-artifacts.json | 10 + + docs/repair/ws-operation/build.txt | 33 + + docs/repair/ws-operation/certificate-tests.txt | 9 + + docs/repair/ws-operation/changes.json | 29 + + docs/repair/ws-operation/changes.patch | 3215 ++++++++++++++++++ + docs/repair/ws-operation/design.md | 50 + + docs/repair/ws-operation/diff-check.txt | 1 + + docs/repair/ws-operation/f1-f2-tests.txt | 23 + + docs/repair/ws-operation/historical-f1-f2.txt | 4 + + docs/repair/ws-operation/host-tests.txt | 23 + + docs/repair/ws-operation/operation-tests.txt | 2 + + docs/repair/ws-operation/public-headers.json | 46 + + docs/repair/ws-operation/publication-adapter.txt | 13 + + docs/repair/ws-operation/publication-f1f2.txt | 23 + + docs/repair/ws-operation/publication-gate.md | 20 + + docs/repair/ws-operation/publication-operation.txt | 2 + + docs/repair/ws-operation/publication-release.txt | 5 + + docs/repair/ws-operation/publication-reviewer.txt | 15 + + docs/repair/ws-operation/resources.txt | 369 ++ + docs/repair/ws-operation/reviewer-tests.txt | 15 + + docs/repair/ws-operation/runtime-tests.txt | 13 + + docs/repair/ws-operation/webui-browser-tests.txt | 56 + + docs/repair/ws-operation/webui-node-tests.txt | 51 + + docs/repair/ws-operation/working-tree-status.txt | 26 + + docs/repair/ws-subscriptions/README.md | 116 + + docs/repair/ws-subscriptions/changes.patch | 3573 ++++++++++++++++++++ + .../evidence/allocation-finding.txt | 3 + + .../ws-subscriptions/evidence/baseline-red.txt | 14 + + .../repair/ws-subscriptions/evidence/baseline.json | 11 + + docs/repair/ws-subscriptions/evidence/browser.txt | 46 + + docs/repair/ws-subscriptions/evidence/build.txt | 10 + + .../ws-subscriptions/evidence/certificate.txt | 9 + + .../ws-subscriptions/evidence/diff-check.txt | 1 + + .../ws-subscriptions/evidence/final-manifest.json | 39 + + docs/repair/ws-subscriptions/evidence/host.txt | 25 + + docs/repair/ws-subscriptions/evidence/prompts.txt | 46 + + .../repair/ws-subscriptions/evidence/resources.txt | 17 + + docs/repair/ws-subscriptions/evidence/runtime.txt | 13 + + docs/repair/ws-subscriptions/evidence/tsan.txt | 1 + + docs/repair/ws-subscriptions/pr-update-gate.md | 19 + + docs/repair/ws-subscriptions/pr-update-host.txt | 25 + + .../repair/ws-subscriptions/pr-update-reviewer.txt | 17 + + .../ws-subscriptions/reviewer-fixes/README.md | 73 + + .../reviewer-fixes/baseline-r1-r3.txt | 3 + + .../reviewer-fixes/baseline-r4-r5.txt | 11 + + .../reviewer-fixes/baseline-replay.txt | 14 + + .../ws-subscriptions/reviewer-fixes/baseline.json | 42 + + .../ws-subscriptions/reviewer-fixes/browser.txt | 56 + + .../ws-subscriptions/reviewer-fixes/build.txt | 30 + + .../reviewer-fixes/certificate.txt | 9 + + .../ws-subscriptions/reviewer-fixes/diff-check.txt | 2 + + .../reviewer-fixes/final-manifest.json | 94 + + .../ws-subscriptions/reviewer-fixes/host.txt | 25 + + .../reviewer-fixes/pre-fix-source.tar.gz | Bin 0 -> 68524 bytes + .../ws-subscriptions/reviewer-fixes/prompts.txt | 51 + + .../ws-subscriptions/reviewer-fixes/resources.txt | 21 + + .../reviewer-fixes/reviewer-fixes.patch | 1830 ++++++++++ + .../reviewer-fixes/reviewer-tests.txt | 17 + + .../ws-subscriptions/reviewer-fixes/runtime.txt | 13 + + .../reviewer-fixes/ts-review-ws-round2/core_stop.c | 53 + + .../ts-review-ws-round2/evidence.txt | 11 + + .../reviewer-fixes/ts-review-ws-round2/review.md | 45 + + .../reviewer-fixes/ts-review-ws-round2/run.sh | 11 + + .../ts-review-ws-round2/service_stop.c | 161 + + .../ts-review-ws-round2/starvation.c | 13 + + .../reviewer-fixes/ts-review-ws/evidence.txt | 3 + + .../reviewer-fixes/ts-review-ws/review.c | 200 ++ + .../reviewer-fixes/ts-review-ws/review.md | 48 + + .../reviewer-fixes/ts-review-ws/run.sh | 7 + + docs/runtime-repair/IMPLEMENTATION_REPORT.md | 64 + + docs/runtime-repair/REVIEW_FIXES_REPORT.md | 57 + + docs/runtime-repair/VERIFICATION.md | 83 + + docs/runtime-repair/baseline-notes.md | 17 + + docs/runtime-repair/evidence/artifacts.json | 26 + + docs/runtime-repair/evidence/build-summary.txt | 8 + + docs/runtime-repair/evidence/certificate-tests.log | 9 + + docs/runtime-repair/evidence/host-tests.log | 9 + + docs/runtime-repair/evidence/resource-sizeof.txt | 16 + + .../evidence/reviewer-fixes/build-source-check.txt | 1 + + .../evidence/reviewer-fixes/certificate.log | 9 + + .../evidence/reviewer-fixes/configuration.log | 1 + + .../evidence/reviewer-fixes/resource-sizeof.txt | 7 + + .../evidence/reviewer-fixes/runtime.log | 13 + + .../evidence/reviewer-fixes/ui-final.log | 1 + + .../runtime-repair/evidence/web-artifact-check.txt | 3 + + main/ts_core_init.c | 81 +- + main/ts_https_retry.h | 27 + + main/ts_services.c | 285 +- + sdkconfig | 1 + + tests/certificate/README.md | 68 + + tests/certificate/extract_lifecycle.py | 27 + + tests/certificate/generate_fixtures.py | 30 + + tests/certificate/run_host.sh | 26 + + tests/certificate/stubs/esp_err.h | 1 + + tests/certificate/stubs/esp_heap_caps.h | 1 + + tests/certificate/stubs/esp_http_server.h | 18 + + tests/certificate/stubs/esp_https_server.h | 10 + + tests/certificate/stubs/esp_log.h | 1 + + tests/certificate/stubs/esp_netif.h | 1 + + tests/certificate/stubs/esp_tls.h | 1 + + tests/certificate/stubs/freertos/FreeRTOS.h | 1 + + tests/certificate/stubs/freertos/semphr.h | 1 + + tests/certificate/stubs/lwip/inet.h | 1 + + tests/certificate/stubs/nvs.h | 1 + + tests/certificate/stubs/nvs_flash.h | 1 + + tests/certificate/stubs/platform.h | 64 + + tests/certificate/stubs/ts_core.h | 1 + + tests/certificate/stubs/ts_crypto.h | 1 + + tests/certificate/stubs/ts_event.h | 1 + + tests/certificate/stubs/ts_time_sync.h | 1 + + tests/certificate/test_api.c | 42 + + tests/certificate/test_coordinator.c | 75 + + tests/certificate/test_lifecycle.c | 46 + + tests/certificate/test_material.c | 131 + + tests/certificate/test_service_stop.c | 44 + + tests/certificate/test_service_stop.sh | 34 + + tests/certificate/test_time_cancel.c | 39 + + tests/certificate/test_time_retry.c | 47 + + tests/certificate/test_ui.cjs | 42 + + tests/prompts/README.md | 21 + + tests/prompts/browser.test.cjs | 132 + + tests/prompts/harness.cjs | 51 + + tests/prompts/ownership.browser.test.cjs | 303 ++ + tests/prompts/package-lock.json | 59 + + tests/prompts/package.json | 15 + + tests/prompts/regression.test.cjs | 171 + + tests/prompts/static.test.cjs | 28 + + tests/release/test_release.py | 57 + + tests/runtime/README.md | 7 + + tests/runtime/extract_engine.py | 9 + + tests/runtime/run_all.sh | 16 + + tests/runtime/run_codec.sh | 9 + + tests/runtime/run_engine.sh | 10 + + tests/runtime/run_log.sh | 20 + + tests/runtime/run_service_watch.sh | 11 + + tests/runtime/run_ssh.sh | 8 + + tests/runtime/run_store.sh | 9 + + tests/runtime/ssh_stubs/esp_timer.h | 3 + + tests/runtime/ssh_stubs/freertos/FreeRTOS.h | 1 + + tests/runtime/ssh_stubs/freertos/task.h | 1 + + tests/runtime/ssh_stubs/ts_core.h | 5 + + tests/runtime/state_stubs/esp_err.h | 3 + + tests/runtime/state_stubs/freertos/FreeRTOS.h | 8 + + tests/runtime/state_stubs/freertos/semphr.h | 3 + + tests/runtime/state_stubs/freertos/task.h | 7 + + tests/runtime/stubs/esp_heap_caps.h | 6 + + tests/runtime/stubs/nvs.h | 6 + + tests/runtime/test_codec.c | 33 + + tests/runtime/test_completion.py | 55 + + tests/runtime/test_configuration_protocol.py | 53 + + tests/runtime/test_engine.c | 77 + + tests/runtime/test_log.c | 115 + + tests/runtime/test_probe.py | 21 + + tests/runtime/test_rule_reload.py | 36 + + tests/runtime/test_service_protocol.c | 147 + + tests/runtime/test_service_watch.c | 64 + + tests/runtime/test_ssh.c | 89 + + tests/runtime/test_stop_protocol.py | 78 + + tests/runtime/test_store.c | 81 + + tests/runtime/test_ui.cjs | 31 + + tests/ws_subscriptions/README.md | 37 + + .../ws_subscriptions/baseline_operation_adapter.c | 163 + + tests/ws_subscriptions/replay_control_baseline.py | 21 + + .../ws_subscriptions/replay_operation_baseline.py | 42 + + tests/ws_subscriptions/run_baseline.sh | 29 + + tests/ws_subscriptions/run_control.sh | 18 + + tests/ws_subscriptions/run_f1_f2.sh | 36 + + tests/ws_subscriptions/run_host.sh | 40 + + tests/ws_subscriptions/run_operation.sh | 9 + + tests/ws_subscriptions/run_operation_adapter.sh | 11 + + tests/ws_subscriptions/run_reviewer.sh | 30 + + tests/ws_subscriptions/run_reviewer_baseline.sh | 27 + + tests/ws_subscriptions/stubs/esp_console.h | 2 + + tests/ws_subscriptions/stubs/esp_err.h | 1 + + tests/ws_subscriptions/stubs/esp_heap_caps.h | 1 + + tests/ws_subscriptions/stubs/esp_http_server.h | 1 + + tests/ws_subscriptions/stubs/esp_log.h | 1 + + tests/ws_subscriptions/stubs/esp_timer.h | 1 + + tests/ws_subscriptions/stubs/freertos/FreeRTOS.h | 1 + + tests/ws_subscriptions/stubs/freertos/queue.h | 1 + + tests/ws_subscriptions/stubs/freertos/semphr.h | 1 + + tests/ws_subscriptions/stubs/freertos/task.h | 1 + + tests/ws_subscriptions/stubs/freertos/timers.h | 12 + + tests/ws_subscriptions/stubs/platform.h | 119 + + tests/ws_subscriptions/stubs/ts_api.h | 1 + + tests/ws_subscriptions/stubs/ts_event.h | 1 + + tests/ws_subscriptions/stubs/ts_log.h | 1 + + tests/ws_subscriptions/stubs/ts_webui.h | 1 + + tests/ws_subscriptions/test_baseline.c | 25 + + tests/ws_subscriptions/test_control.c | 142 + + tests/ws_subscriptions/test_event.c | 59 + + tests/ws_subscriptions/test_f1_f2.c | 107 + + tests/ws_subscriptions/test_init.c | 68 + + tests/ws_subscriptions/test_lifecycle.c | 35 + + tests/ws_subscriptions/test_manager.c | 212 ++ + tests/ws_subscriptions/test_operation.c | 58 + + tests/ws_subscriptions/test_operation_adapter.c | 287 ++ + tests/ws_subscriptions/test_reviewer.c | 55 + + tests/ws_subscriptions/test_reviewer_core.c | 51 + + tests/ws_subscriptions/test_reviewer_http.c | 23 + + tests/ws_subscriptions/test_reviewer_service.c | 30 + + tools/check_release.py | 22 + + version.txt | 2 +- + 339 files changed, 30581 insertions(+), 7726 deletions(-) diff --git a/docs/repair/ws-project-v3/current-allocation-metrics.json b/docs/repair/ws-project-v3/current-allocation-metrics.json new file mode 100644 index 0000000..6d5f009 --- /dev/null +++ b/docs/repair/ws-project-v3/current-allocation-metrics.json @@ -0,0 +1 @@ +{"open_allocations":5,"write_allocations":0,"unsupported_allocations":0,"close_allocations":0,"retained":0} diff --git a/docs/repair/ws-project-v3/current-cli-exit.txt b/docs/repair/ws-project-v3/current-cli-exit.txt new file mode 100644 index 0000000..6e5503c --- /dev/null +++ b/docs/repair/ws-project-v3/current-cli-exit.txt @@ -0,0 +1 @@ +CLI exit: active=0 interrupt=1 diff --git a/docs/repair/ws-project-v3/current-eof-release.txt b/docs/repair/ws-project-v3/current-eof-release.txt new file mode 100644 index 0000000..0e095a0 --- /dev/null +++ b/docs/repair/ws-project-v3/current-eof-release.txt @@ -0,0 +1 @@ +EOF ledger: allocations=0 channels=0 sessions=0 sockets=0 diff --git a/docs/repair/ws-project-v3/diff-check.txt b/docs/repair/ws-project-v3/diff-check.txt new file mode 100644 index 0000000..0c564d3 --- /dev/null +++ b/docs/repair/ws-project-v3/diff-check.txt @@ -0,0 +1 @@ +PASS git diff --check diff --git a/docs/repair/ws-project-v3/final-inputs.json b/docs/repair/ws-project-v3/final-inputs.json new file mode 100644 index 0000000..016a622 --- /dev/null +++ b/docs/repair/ws-project-v3/final-inputs.json @@ -0,0 +1,853 @@ +{ + "head": "568b871f64902f88b3c68148ce072eda218fe9db", + "branch": "fix/v0.5.2-reliability-and-prompts", + "sdk_head": "30aaf64524299d3bde422ca9a2848090d1bc5d0f", + "build_command": "idf.py -B /tmp/tianshan-project-v3-build/build -D SDKCONFIG=/tmp/tianshan-project-v3-build/sdkconfig build", + "build_sdkconfig_sha256": "1340e033b5865e39dd6b8c3516dffb27d01da5aff41127c69b583cbfb99acef0", + "created_utc": "2026-09-26T15:50:46.400805+00:00", + "sha256": { + "CMakeLists.txt": "73a24128dd9cb60d9e980787b80ec9f32e3b9f0b873c83ef17ee8ee75152fecf", + "components/ch405labs_esp_libssh2/.gitmodules": "467fd072f917e5068f5b2a846127b7b82f386fb5b238156aedf38cce2631ab9f", + "components/ch405labs_esp_libssh2/CMakeLists.txt": "defbc67e892a2dc88a98689c81d71703c494df741da1281a971a32c19d71ffef", + "components/ch405labs_esp_libssh2/README.md": "d4baa8a5f5b154b4c4543c11f32300572b3acdebc26c613749be1cc5957b1679", + "components/ch405labs_esp_libssh2/libssh2/.editorconfig": "286f4ce9ddba0c0725cc4d37055e5988ac22c61c1b36bb6ee1a6a895d419f411", + "components/ch405labs_esp_libssh2/libssh2/.gitattribute": "50641866adaa8d562ba65baca87f2f3ce91f61ca40fc21753fe8f35d6013befc", + "components/ch405labs_esp_libssh2/libssh2/.github/ISSUE_TEMPLATE/bug_report.md": "bc14bd2401eb9dfb7a3d762adffd5e455817705f387800ea7b6c38c1f1408633", + "components/ch405labs_esp_libssh2/libssh2/.github/SECURITY.md": "e694a8bc825fde44c30c1bd56465a04872a901406bb83c83055d20bb592485d9", + "components/ch405labs_esp_libssh2/libssh2/.github/stale.yml": "25a2e801cd260d70243072d3e5506c511bd720f3f6ef9fd7fa007b7d1c7ea8e1", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/appveyor_docker.yml": "da1c0951a12c434f05836f1789f15961c6fcabc603e647430a05a34b0424a24b", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/appveyor_status.yml": "4c5246d62039581107a7d02ce6e6add044316c0b74c1539a6e14b184d50fc52a", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/ci.yml": "5fa3a7f5a9fa332495ea33881713679ff28330a367cc4323488a987a3125ea9d", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/cifuzz.yml": "84b5ae690289c4db4b8cdd1907e7a3d63c8df5c3cc1ddd2d43633df7821b2e5e", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/openssh_server.yml": "0cf892551ec733d936325e69d4a4384666fd61c0227c39bb74887d805b180cdb", + "components/ch405labs_esp_libssh2/libssh2/.gitignore": "6c7cfd1ecdb57b89fc5b0fadc59727fd6cd3ed803e448e5811b785e54acd1a6a", + "components/ch405labs_esp_libssh2/libssh2/.travis.yml": "0230a26255749c26837b5dc54c9811565a1f2092bca181db030255d0d857769f", + "components/ch405labs_esp_libssh2/libssh2/CMakeLists.txt": "2798ced9569334a34eee6fed8037cc69d5a3b6b3af6ccb8f27fac5f6b39dc4b7", + "components/ch405labs_esp_libssh2/libssh2/COPYING": "859e60d760a3446ecaf777339f1eef98c527aea40714384d24b882a83ffdd23a", + "components/ch405labs_esp_libssh2/libssh2/Makefile.OpenSSL.inc": "8e82af68b172ddccf94c65c1b4e38b69b3b7f027cc14a54b6d660c5f2bcd4de9", + "components/ch405labs_esp_libssh2/libssh2/Makefile.WinCNG.inc": "79243be1029a0df52a5e79b3dceb80ac462f2e735e25445e38852610bee62f34", + "components/ch405labs_esp_libssh2/libssh2/Makefile.am": "af1c3b9cc5b46c35fc5556a458b819ca320bfd2646ff13d2bbc3fa0bf21e658d", + "components/ch405labs_esp_libssh2/libssh2/Makefile.inc": "69ed9dd108033552385a3b6257f47d1cece33490fec25c14ef208b3b8f9c9273", + "components/ch405labs_esp_libssh2/libssh2/Makefile.libgcrypt.inc": "3d71dbe94c906d07c70eb8c7eae80fe5ae014565d7a9446bd39b659e91b73b71", + "components/ch405labs_esp_libssh2/libssh2/Makefile.mbedTLS.inc": "18bf8364aaef158a27b65be88ac1fd74af0cbd336930b6ce611b62dab77feebc", + "components/ch405labs_esp_libssh2/libssh2/Makefile.os400qc3.inc": "ac9b0e1731f7dfa20e3987e108a4c5896e6095638ec545c8f2ac64c35b63a455", + "components/ch405labs_esp_libssh2/libssh2/Makefile.wolfSSL.inc": "d6288360c49d5246ba3757304e2c4850d96651d7dfe2d2583a8bee2fe9313665", + "components/ch405labs_esp_libssh2/libssh2/NEWS": "9418b9c8dcafc633c2c16372b2b21ceb70a06243756af21eff173a4b379101d1", + "components/ch405labs_esp_libssh2/libssh2/NMakefile": "2d1cbda9bccd886de3c99dae77f09ac75a7f09f1834272b4a9154d2a0ae9a81a", + "components/ch405labs_esp_libssh2/libssh2/README": "41df43a8f24ec77082fc4c4609bd54b17e0a610e6bb319171ec1fd4d31a24d02", + "components/ch405labs_esp_libssh2/libssh2/README.md": "d7595097b84462de1f273ed1628315f47b23dfaff070af2bfb14f38e22ec13b8", + "components/ch405labs_esp_libssh2/libssh2/RELEASE-NOTES": "9a88e3e26281797ee09f09cd04e4bd753837b02366dcaf34885b800742bc862f", + "components/ch405labs_esp_libssh2/libssh2/acinclude.m4": "c461e884733a19f15b603aec9ac590218ec0fd93e34cd48b279e2f0af5dc70f3", + "components/ch405labs_esp_libssh2/libssh2/appveyor.yml": "984dffbbd4503ebd67359d660d51198c420dab745efef074fbae126aa3fa8492", + "components/ch405labs_esp_libssh2/libssh2/buildconf": "c2102a17b8f50f0d56d20639c05c70347a4e6ac5dcec351c6f851371e2a68a71", + "components/ch405labs_esp_libssh2/libssh2/ci/appveyor/docker-bridge.bat": "f72fdb40e7a9c3aa5c5fe5fd6a4a008463f1f3b991e0875f19eb5a9a2e8fa3cf", + "components/ch405labs_esp_libssh2/libssh2/ci/appveyor/docker-bridge.ps1": "e8947a221954fd55ac060300bf71b512869a087694f4116ad40ffcfa5ede8160", + "components/ch405labs_esp_libssh2/libssh2/ci/checksrc.pl": "879e805b57e2e86f6894a6a4e395daf1c1c048ee5984e109be74afc750782567", + "components/ch405labs_esp_libssh2/libssh2/ci/checksrc.sh": "a435be07f99eaac5b59f9cf68d88e3541c9fbed09177d0874078c22547edd5e9", + "components/ch405labs_esp_libssh2/libssh2/cmake/CheckFunctionExistsMayNeedLibrary.cmake": "60a8d1afe9a3b71cedb782ac6187a9a041d2792006a7eb3379bc42a9fcb95a4d", + "components/ch405labs_esp_libssh2/libssh2/cmake/CheckNonblockingSocketSupport.cmake": "443b9824a1d7f7cc0a9c1b740ca9824f82f73ac7f0294aa2c1e3192aa3cb5e0d", + "components/ch405labs_esp_libssh2/libssh2/cmake/CopyRuntimeDependencies.cmake": "5a146613512f467192e7917561b305e31d52a85b3f216d5e3c6ca6d2261e9b03", + "components/ch405labs_esp_libssh2/libssh2/cmake/FindLibgcrypt.cmake": "af65a3a8ea63eb935b1602b2b75c7c993558f9118e8c12cf9f2d4614977d8c53", + "components/ch405labs_esp_libssh2/libssh2/cmake/FindmbedTLS.cmake": "db4ad3046a838c325ff39f3f083a2de39c3bcde4c69670610ce27b23c758c50d", + "components/ch405labs_esp_libssh2/libssh2/cmake/SocketLibraries.cmake": "857615772ee6a1b79826eb18889def1a626296262db78def698286930e3c6cbf", + "components/ch405labs_esp_libssh2/libssh2/cmake/Toolchain-Linux-32.cmake": "fc7c2718c2e628fe28db38406fb57e9380d202dce8b4d615ef8b818984c37a32", + "components/ch405labs_esp_libssh2/libssh2/cmake/max_warnings.cmake": "1a14b62c40d327d69ad1531e3372523310e642779da33c3865e6fc67df46835b", + "components/ch405labs_esp_libssh2/libssh2/config.rpath": "aa48652ef1709d015f0e627eb5d18d1c198d81c29d5f89a81362512fcba72b01", + "components/ch405labs_esp_libssh2/libssh2/configure.ac": "37d7a8fe37f7c5a7329f289030d2dc0571aa759d285ddab0a5b16ca27b1462b4", + "components/ch405labs_esp_libssh2/libssh2/docs/.gitignore": "b523bfc0065b99350f41f5f745f0be7698b3f5be00251e6c1016a5b620edcc7c", + "components/ch405labs_esp_libssh2/libssh2/docs/AUTHORS": "12228e95c6b41c76d00b6ca8f2bf7bfb3372f3f32b6c62f34882530b9406f26d", + "components/ch405labs_esp_libssh2/libssh2/docs/BINDINGS": "c711b535a9462815d564995eb84b997261fb9a2db4ef82a8c9b3f926dd7498b2", + "components/ch405labs_esp_libssh2/libssh2/docs/CMakeLists.txt": "713fa1933cf53a12a7ccafea3e8d9187c35967159e7e460a775e91e8a7df2464", + "components/ch405labs_esp_libssh2/libssh2/docs/HACKING": "5d2563866dc4fcc8a4ab352676e3d64b918b75e0a73ce7776b9eef7e8949d3b0", + "components/ch405labs_esp_libssh2/libssh2/docs/HACKING-CRYPTO": "ce85a00c816a80b24fa998598bfecb58ed9ea389a368c15eacf2e27d56f1be25", + "components/ch405labs_esp_libssh2/libssh2/docs/INSTALL_AUTOTOOLS": "6ca4765ca5ca117514e41067ce05cc24504aa29eab9a76bb9cc1ecc87c3280b1", + "components/ch405labs_esp_libssh2/libssh2/docs/INSTALL_CMAKE.md": "266b25dbe613f02e4662467c23ad80bb42a35ef9d579933ddb2d7b1d038089d0", + "components/ch405labs_esp_libssh2/libssh2/docs/Makefile.am": "5e734a3e68bf57a13404770ace3e4595e0a6c215526d2942a5fba3ebf3109828", + "components/ch405labs_esp_libssh2/libssh2/docs/SECURITY.md": "4314c11322a9970bed60130a2e11a0eb79c9de719a7c7c2cb227356d9771ba2f", + "components/ch405labs_esp_libssh2/libssh2/docs/TODO": "e3a304f76129bdb90371439567dffe2a8841e3a5c326f71000490a11241bc9b0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_connect.3": "5fe15d3e781382a8e935048dd266a89e9c3b63800d4714ceec6c78c512e49f20", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_disconnect.3": "e2d1a3af99d888e310c6e22227e11b0a42f1d265451a9e13ac787fe0b8075426", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_free.3": "332b5fb986c013ba363bd18d5e39c01a047d79fb22acf673291f1e19b4d8292a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_get_identity.3": "acdccde633dda1740ba043fb3f2b3aed884923c74ff3e2ad2f01d5a6b87955f1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_get_identity_path.3": "148b43bc669d3300b3fbf09ae57050a15ce074c8730ecef78e97ee9309ea179f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_init.3": "09029ddc71d63085dd6ccf92062ce6e31f0d54a1eb40d06587713814ddb4ee5d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_list_identities.3": "a498d332ea55486eb1c234468a8cf3c1886eb6b98bdd527a1b44fd06683e7ea2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_set_identity_path.3": "b60fb7e972fc2b420ff0a7452ddbf12597dbc9cb075920da16ee9c0eef7f8425", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_userauth.3": "d2119c63fa5bd1a05385bd176a1c8d2ee0139aebec92addd1601edc948f17855", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_banner_set.3": "1bd7a8bd59cb74d90cfed26c41701788afe7c0a667f686c5154cd0615d586422", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_base64_decode.3": "c48f88f5a6405738bc146161bf442e02c02073e0b9957f5d4bc3bd425bee82e1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_close.3": "e348d7548693066f863dde9a6c7dd21bf394aca51c1cae1c4999309eedfb4451", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_direct_tcpip.3": "3a67560c5846880066344d5581840a26a8509854fcf20fda79f9b2156e58757d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_direct_tcpip_ex.3": "5a7665c77afd8aa509c03d5059ece42adb912979e0fab608034e4554e3106439", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_eof.3": "7ad4590d1dfccf35bd2f7393e0d14b4247c3108ee2f48685b505c0dd9516e011", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_exec.3": "e7f79363e4fa61ce0c00f59e4e97cbc3101f55e2025b1156551aaf50c8522b87", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_flush.3": "fcaf2b8577ae6b8196313977d0686175a807fcccd3f3fce433028384da0f7bdd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_flush_ex.3": "33fb6e5de6afa0836e6439ea4c552ff4101a6f48bb73242f4868b181d40bc28f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_flush_stderr.3": "4f590d465d647b416c583c2b16693a3364e84da2400dfe7f9ffe1928577ca3ae", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_accept.3": "4f0621fe2a6aef5fefd50197974beb6e6c89dc41841b1d6052f885a773557ed8", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_cancel.3": "230ff1688acf2f4a7ac5d687ca46bd39458192a0662b3b8fa6edd8217c25117f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_listen.3": "fac440afa8233b6d3982b349d56c177ba9fec09464f1c5a5bf40ce32d600197d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_listen_ex.3": "49c5374f3b5c56213fe9a43ef4592cd51097cd1c9017fcb3be97c94847e8efcf", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_free.3": "a7e649756ff4a20b0f5bb6bc9f4647ecaff885c8745e9c304cc697c2c677196b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_get_exit_signal.3": "89557c3203331e1d21773b557659a0f21e1ecbcee90c372de3b6e159c7b78a7d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_get_exit_status.3": "d374651f3f72f3f179c37b4a44b815a1bdd998f803a121fc8bc5544c397224c8", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_handle_extended_data.3": "c8ba2c032cd2cd8fc5877845df624712457dcf1c092975f3c713fe75794fd42b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_handle_extended_data2.3": "17269accf920a28af6bd14770f94067083e2dfa56df4e08663844d0cebb78052", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_ignore_extended_data.3": "c00c30e1aa01c699c92c30c98e9ab8e543cb2fb23376b650627c56ecc3a1f275", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_open_ex.3": "a4153c3de3d2cb9a2faaa39eeb9b638c829db2cf4aa4a0e0a2cbd51098626e79", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_open_session.3": "63ee8e3220149933ebf5219335cf5b9fb107e23808137f782e8846b191ecf629", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_process_startup.3": "1023352b8152e5a1a2ccf2bc899e9539fbecaa2dff69ebb68ada088da38fc6b9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_read.3": "1ddb492b078cab328e718563f2fc5dc3fd737078ba272d078f94e554e2938080", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_read_ex.3": "931e1fad6ff1d629ed2b523c75e645a16344be8afebc0e2f50144ac8394146e2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_read_stderr.3": "6b3a6db85f2fdb26a07b95d6046127f3d5c709e6ee4bd72d66b9109e10ca8e1b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_receive_window_adjust.3": "01a3e1d79fce062cba8fefee6b8fe7ca81a1ad7a3c8cccf12801d7f80fd6265a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_receive_window_adjust2.3": "451f2632b8c786a16e87940f2fcb978e9d88fee27cb997c192c9e671b72b27eb", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_auth_agent.3": "9217dcc14a2c6bee93f5754b2fed7827b3dbb8efc335d7fbf4908e8a531570b4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty.3": "f7b4d6780a1b6ed5518e425751f55d9930a5bfa8e92dc0458ccdb06d7786ecbe", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty_ex.3": "ab2af9c02a3d127ba99cf27f0496643eb30810edb38a94f7df488f41041ec105", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty_size.3": "5ae6ade5d71da8ce3a31fd804c32600f54a3385b07cb8ed6ac90157a9a1ada26", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty_size_ex.3": "4b296b3a64b71c1842c0f12c70fe866734bc18f51e3907acfa3f04c4a997bda3", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_send_eof.3": "a83be7ac2b428f6d41df423e38c52d01f86b9fcafde2010336c7a57323808b6c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_set_blocking.3": "767637f9629f9b7bbbe24c3f3e13be0a83174f1542a63fe7daba350beb369447", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_setenv.3": "fc8773714c44358cf215d80dfdfeea082cc84ae0f33575d17a7825ffb785b02d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_setenv_ex.3": "d4641d1a3054af1fb1aa4819de5ce002b434e56745118d843adc70d902505447", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_shell.3": "e2986078e39068dd61d6d3df0d9e54adb0a489e55ba8051ae6ce3ad5f3c2c191", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_subsystem.3": "16e48c8ad515baef23e1ea94895cf0d2c6d397c133adcbbd20300304b64cab4a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_wait_closed.3": "8f7ad8093832b4b343b04eefe492e94a18be6f496e2074037f93b99683296663", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_wait_eof.3": "a96b063c1d90129420db176063ea4cb66f1b913a2d2b5ada2f3364eeda2d6543", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_read.3": "085331a4fb18dd396b016629ad241a7bf03afe78b0a09fec701aa8be526fab2b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_read_ex.3": "9faf5e32cc4e1fe69fa2e57dc31cbdf3f0e7bfcea339f3b7196f535bbe6be2e2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_write.3": "6daa6fd8d4f74957c709695bd74a741e7808e057cda1a0954e76f92f793d61c4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_write_ex.3": "052d12745f7a8a634ba0b3b36cf0a592c2425caf0679aaaca4776b664bd2d5c0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_write.3": "30bfc0efb86bf513f721200a89c9139687d58483826924b9b401797de74b6387", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_write_ex.3": "da8e46fcba16a2bca466d1397d8b06f03703c4cb7e7b799d582941e125c999b1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_write_stderr.3": "e15a48affe5a5044a2b70bf6fc1e3c6a1dc61c10c4440db4828080fe55e5a0f2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_x11_req.3": "e10544721e6dae96d4542abe07b43767ae6fff49a5bc87381aaf72be7d45f51c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_x11_req_ex.3": "ece17b293092b2319ea237a2855a4b9b7c89c6954ecfedbd837d3d02ce4d7a13", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_crypto_engine.3": "da0d23d0aaf5762db26587138ea9db2bd87eda7f00b326d459424f875bca01d6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_exit.3": "104af206d55e98ffa72ae0c5a505523220c8d6e1de27a37a5139093476d5ede5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_free.3": "8abbc67b852f9fabe09eb84540b610304d896721a04a4bee1e9d0e8f8f08c999", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_hostkey_hash.3": "82070c7634690b4bddc49f3c83b343c6f792c902e0e48247d055eaf3284f80e6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_init.3": "926b4044a52cf71dac8ac23cdf51d6e76bc92f5a3a72c65371549e18826c1cc7", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_keepalive_config.3": "7ebbb7cdc900d6d6188afc537c05c60a115030609d96571ac447ac396991adc0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_keepalive_send.3": "86ac214dd4c086239d59ac6582926f72544c788ad2fbf3ccc4e678b4109d32a4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_add.3": "29a052f853cd3f19efc12612d4e3224271bdc91b10cf6b73e866d7018d25f07b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_addc.3": "c5a2b8510dc1df43311f17073e7e720232f7a7e25d9ba7ae80efe2f26a133297", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_check.3": "2059d72130dc5b99c6faa8b399166a8495cf02b71313d6648778b11b0adab631", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_checkp.3": "88cac561cc381008f64d4c879bbe626afd669090648441c134cae83a5ea082a9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_del.3": "34fbfa29546d2bf0edc380270937658f818d2600e4bdc658d5ce28c7d255e1ef", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_free.3": "3e319da43cb185d73dc215a75351f330de2194608a1b12b8e0b623c900d4d96e", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_get.3": "fc04784b136786dafb210e018e758d5272c8d9d531c4fc5baac9f7b90f65bfd2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_init.3": "509721c49287e0232b3cfeb41a8d4b44a45a195222a5694baf9d728c77225abc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_readfile.3": "6d72d5be2d5dd56b125c1107632c58d5e8a692871182f3f883f5662f39d7dfff", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_readline.3": "e259eaedbe587c06a74ada7c1cf5bf28a168edfff2a60919985aa6c7a15e56f1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_writefile.3": "5ef6daaf96128c0b756c9faf38b5fd60697fa93504a5cb9ce7139a3dc14f7254", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_writeline.3": "32c23d5b4393297935c3fa6e03d57a3bc1d904e5e469cf775bb0516f9f885147", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_poll.3": "c4a377bc2be1c2789de7a57fa42baa51cfbb0bf4121153ee9cd5201507a8c2b0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_poll_channel_read.3": "5b3df35e57c3252fc63e819c69cc6405bdfd14c546b5cfc2a521563bcc9cb420", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_add.3": "2e7c2772fb78b750b5aa94c7bd38c100e52493f6fb050762af924e26ab2605dd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_add_ex.3": "76e23274e8b4756b03359b0fb5bcd05becba4cca1212ae2c164a32c2f10ee50f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_init.3": "5643aa57554f8daacbbff9e539c68cd1093172bd86d859109e6446ccc91a85d4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_list_fetch.3": "975705aa9fc187961fbab91751a5f41412a30d73d65bfe54862285061afc6c29", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_list_free.3": "5eba2104f91fb101014441df437c695b9b0b1e106b6268d623f886de6c237503", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_remove.3": "69423e4d9d6b76388f6160eb473e82449700569d449911163609c8b1c629ed43", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_remove_ex.3": "5c1632ac1685361577a4ddfd1f6257ecfc012225e1e8c2b126f93add0b5b6190", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_shutdown.3": "b152e6c493896da374b7b93468b23d7012e6232db06c331c158f9057b8053994", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_recv.3": "e3af95d4147fb29a893ee80c8af430b7df1d77048d814c5005243c02fe221e18", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_recv2.3": "9fc689585ec209d13e5a7c5db6750e07b171103bd29d3522424f6d812473b95e", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_send.3": "0b72a5932217f8e561840de2ce3e5077bb40e7631b1dfb6f439d4a2413f83cfd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_send64.3": "3225083c74987af71d4a2947a7852ac810fd87ab12532492f286d7e7d7547456", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_send_ex.3": "07818e45119b15208123655f945e1927c0971d21ae6d410fd26944b86cd41745", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_abstract.3": "56b29e317d2676d842f3854d8ffd89723a40992897b962d9ae07b56b2373a727", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_banner_get.3": "78804fe78c70c1fcc408a493564c989f3d3da36bf56d14344df150bfc65570c5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_banner_set.3": "c058557ca5d9633b560e05492212b52ee3f6477dae79f75c8ab4996828d88f09", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_block_directions.3": "0006e5c9788d8b2c3976274b715ab712fedb6ee4d3caa09071b62b846b7d44ed", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_callback_set.3": "6c33ad4047e740e5d020ba14cc5ce06beb0bf02b4b2f88c1ab7fd79e6e5f1b8b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_disconnect.3": "382845fee521c18828a9611c286919218fe51a4a3185f37f5c6e8a10a081db66", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_disconnect_ex.3": "5ed79115477f25aa8cf5998bf46eadc2383fd6e4eacee32622d961d4080ffa11", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_flag.3": "18317502888f1b7da8ef132500e009c8eed72cec5ddffbeda575a4c5093d8b74", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_free.3": "7fd404b4fb4c5e955cb2b8fee9b72a89864351e63c553e56a80dfc2af8bf200b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_get_blocking.3": "947a5fe43a518c13ba5049d820084ec6eede2bc3687923e67b28a75297431378", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_get_timeout.3": "4e808b2407358466171f2546c5220def1db4460a16d1f24c60a4a5186d6c0606", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_handshake.3": "fcb9fc145dc6f3b29871dcbe9c3d27529790e1cd3e20643c8aacb3d3d628fb5b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_hostkey.3": "0df40e6f599dacefcebf30b19331e4ce0abfad5bce75f5cffc8f4b7947bca5c6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_init.3": "ce1a0e9ecc5a17d607437b01f4ee94d5a0d8c5dbc8a04f1e26d3b74daedae57a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_init_ex.3": "2c169699aedd0f9ca16fb71a90618738dcdfa5b2b70d857a39c60896ba62b86b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_last_errno.3": "fe92e9c94ecb5fa33bbf51f866bb62bc4a1e5c3ea153dbaf34aa6553cd477ebf", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_last_error.3": "b14e30dc25d7daaf46ef119176af947efabfad29eff7f726635f2adb6260e97a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_method_pref.3": "6946c31e6d51b612852bed10d4ea869093a048f6d41131addbcb9c4dbbd767e5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_methods.3": "d8c8dccb3183da86943815b18ce7c903e07b02714d6ed8c27dfb782f852de8df", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_set_blocking.3": "33c01981b30ead73c614fcb6f7f224a39d6e849e6a9bccc9b8dd463719e1a39d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_set_last_error.3": "147c7ad527163e73f3fe285d16c980de60bba09813535a7623a1e0a037cfd1cd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_set_timeout.3": "eae71fab2f62942d4e5b66d93a7f49347a08ad1afdfc9a81ce8fcc0d0a9b0068", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_startup.3": "425118593ad0eaf0688c686d9b75f12b7cdb23d330445077907c6e2023cfef77", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_supported_algs.3": "a2fe37982e0f274bcaeea77ad33ca8fa06ea9377aa4e8196c3a8a827e2906b74", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_close.3": "95f03395996cb7b2652cab241a7d91d0c57bec6d4d8f8097b2932acb56eb7bff", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_close_handle.3": "c813fa985be5105cc3cacaf23dc01f0442628c005e629115992a280597301368", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_closedir.3": "1230d8cc661c016991f32b757b11ee6ddd1ac551e5522c5e009f21ef624dfdc4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fsetstat.3": "a7ab72ebfca8d295a2b48f2c14d831568042ef6a0528e590faa99f5e2dd00675", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fstat.3": "e354ea4b96d512a34db42be2eaaa2c7fb0bfed554e726aa79db7f45ade1f9dd1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fstat_ex.3": "2446ac64b425dbaf115b37d29107b66fc0291c2ebd17898669c406a4fd57b78b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fstatvfs.3": "a10a9bf1dda75b0e97966ed003d183728a8ded895eece58e458980bc742f7a39", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fsync.3": "bee468765b5d4a09a3b473eba0cf436328f29806953bc1f998d8bc97d2a3049f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_get_channel.3": "90e527f9eb6b0d17760328f6e3842f74d1d173fe88a7c9ec2357ca471e9c0f41", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_init.3": "585d782936f71157d141474c94c897d7ea292580445550c25c8fd44f5e03052f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_last_error.3": "8e7b2fa2c5fe4792a39a5c1c24baf041c970e3021511b36e59979ed64a18b4c7", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_lstat.3": "a01353b26374401029f5094a24beca08988ea201ca2197fef2b14f30bb2658e5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_mkdir.3": "14e04b070a6c351e2af6bd68f73a408e2982e9a358d5d2af5a46d8b422d27ce3", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_mkdir_ex.3": "44c17758d2b0336f94c4004bdd2debf9e1632ba12c6db6df495c09a71a58e59f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_open.3": "af9a8c90999412d3371218f59859ff91c6a83eabee75f1712adf94c5bceaf1d6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_open_ex.3": "11661fbcec142d9afee722f5ce779bd32f6e0a2b2dc45558c3bd47292105231d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_opendir.3": "62639f60918835e08f3c00d708cb32af319b9a56d3c2cb33ad409b60b347b31d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_read.3": "1d0435c740470b8a6a427da4331b576833eead72f9d976001d8a1f55fcf24815", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_readdir.3": "0e98293f67ae019adf8c5e17fa9f31f3e34b082c55ccd2119ee424f30c337fc7", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_readdir_ex.3": "7f9a2bda1d49d12040796015a842b592decfb076230ee9c8260c31e7b12dd2cc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_readlink.3": "1834815d254c351664cacf38c06a4b232f099787cc09a41ef719a1ff242e4064", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_realpath.3": "6b8e75bf89724998c414487d93f8c4899a3b1f4deba50806a798fdf9f9405bab", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rename.3": "eb87a9b1c94f38913c0cb62a3a474fe8c8f3cb0a874c61ced396a2d8bb92e510", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rename_ex.3": "12d2e70027755937df6de8b0836f75509f4fc5f1a5428fe5a92ae3eb23ff4b54", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rewind.3": "4caf86de2f35e2925ee637a68f7cfc2e76dab54571ada06495a0574e549c6a7c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rmdir.3": "86a1935b7bb291041eaa7c0788f417c6398b39fd208b6bb478329299ae72a49f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rmdir_ex.3": "17029aa15ef3e1c862731a7ee52e8f730dc8951e62e1c0539b922dbcd66810b0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_seek.3": "546a134db735df610032fa982d3c8c1013ced779e21faeff261d71041bcde8bc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_seek64.3": "07df7a2c8c9d75b198fa60909baa31e1c883002337a4c6b7a1b3a9c6ceb3a594", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_setstat.3": "39c7f5d489ea5ceb51bd9c7de237464f5c510f3ce0983e57f7b69207ef957e01", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_shutdown.3": "48bf057f1836924e3e5009890cb6e63ec9d11d0aa19abc258c75ee7c7bd097b9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_stat.3": "7fa4495645b580c216ca2279168b6b2f7c9c73a973dabf1997c02a0409d8c042", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_stat_ex.3": "fd19ff075f44a1713d765330d069fd63cffd8b2dbc09ce9170d926f25d5f70c3", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_statvfs.3": "5762f9ff7d56f44164db57fd048daa60173794c4e7a58ab2fb255e29f0ca2bb8", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_symlink.3": "ae7ea167057c307552405124ad54ee488db7354e7caa974334e88f5b2104c88a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_symlink_ex.3": "7e22a39bb97548428cddc8a9cf3bc7a1ff57cde878b337a7e177730bf5c51d01", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_tell.3": "ce22525601570f33d91469170d43470a8a9decf0b35ae82c2cea72fff1dc8d8f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_tell64.3": "db5faf0fd28de4738e3062555c1d6981c2b272d7b89bd85e3e83d2a03237472f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_unlink.3": "d8c4c60c41e81149fe14a4a00cc114d3f7bb4799ceea4895c67d79363da3ae7c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_unlink_ex.3": "64b0723444b716d2b809a3b481024523fc8c62ab45d3ec4274040abf824cf611", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_write.3": "a4706e9d6dabcde2aeccba27f7d7d5a3cef33dd21f4bf66bf5b181c3e8a3f9ef", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sign_sk.3": "7d35515c97ed9fcb5c6a43da9f3fc4feb1c5fabd64cceeca0a790bd0df955b28", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_trace.3": "636417e1798bce85c2058cad56493919c608d426acaac409ec1a489bdef90fe2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_trace_sethandler.3": "b37355eff49dacc9916818db61258f21665fb68993e57ca9040db056453bf8bd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_authenticated.3": "81115e3ac2549eadafc5ab8c73462d1c5565593106c4d995a920f718e5dd451e", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_banner.3": "1a7248076b5f48794ff638a3f44e88e297548d8e664b792fd6ec3ff9c5017c09", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_hostbased_fromfile.3": "265670d504f8db399e9253af673264b92ae8cc3593912e9b2e6aee436d02fdfe", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_hostbased_fromfile_ex.3": "a71631a3eb07ac88ee21beeabaf6aaccb7e93378c98eed228fa27f1575b04a64", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_keyboard_interactive.3": "17d55c3ba83fc9b7a2fa1dbf0e0d1886deb87616298b6bf424b5ac7d63d0da39", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_keyboard_interactive_ex.3": "09774448b68977b58a745775d5f568077960a9da178f5a2e570359e16b327354", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_list.3": "af6928a269c96480a6ea3a3452af7029577f69485fee36ecdd9dde48b4956a5d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_password.3": "4c8103bb95903b0b2ee6c2b1d0b3eac150ab31314ec023424ab564d29b1678a9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_password_ex.3": "0834a29c814a2d617369a2463429ec244fd116bce0abe8f1b6e61aaef35db3eb", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey.3": "874ece028410feb1bb33d481ab2789e6fadc9a9974cf4e0a72517b4c3fb81861", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_fromfile.3": "6864fc6411955179866986cf95f75ff41a022a4b60ceb177cf503da45a67b88d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_fromfile_ex.3": "060d36d8a06538035e0d7c678f78db16d68ad6f930c958ef3c1bd46f96f9ed39", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_frommemory.3": "5022660ab3c6c7f596b92e887debb3c580dc21f64be71b76c83c033c0fe36ef9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_sk.3": "5c779cca1464db0aebd956fc3fce989c0637e6e91dce4114991b457e2cb616dc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_version.3": "d3feeb9f870be0dacc7616c44dffae9abddcd22eec9cc8c18a0526af723ffce8", + "components/ch405labs_esp_libssh2/libssh2/docs/template.3": "740b501cbdd74773bdb93c8a4d1ae1e175f3593c0eb93844ea2cad0c61e14463", + "components/ch405labs_esp_libssh2/libssh2/example/.gitignore": "519ee26ed4fcf44a7ba26c65a50f13b343da0a0da55f14f94889b902a3a61939", + "components/ch405labs_esp_libssh2/libssh2/example/CMakeLists.txt": "f8cc011f16f189f485ed9060d71de862616c254dcfc1fafe49ff6425a4d89757", + "components/ch405labs_esp_libssh2/libssh2/example/Makefile.am": "0e7c6f2ea9a65a6eb253d721cabc8df573cd4d2606ddc7bd7499b701380157a6", + "components/ch405labs_esp_libssh2/libssh2/example/direct_tcpip.c": "1a335122f9e28b3883587768e8332f3883b462def477f8651b83fc1392e96dca", + "components/ch405labs_esp_libssh2/libssh2/example/libssh2_config_cmake.h.in": "115c1b79ea918a83de959f0f50eb98c2ce252b21b566b9ad56f3c23b68e48ae7", + "components/ch405labs_esp_libssh2/libssh2/example/scp.c": "87736832ddc36e80b52ed6b7f1c87eedcb57d739c80dcff5bbf2d610bfc7f7c4", + "components/ch405labs_esp_libssh2/libssh2/example/scp_nonblock.c": "dfa78c57e18acdb437f3a643dbace70802aa7d2d504adcd47ed63f744189e822", + "components/ch405labs_esp_libssh2/libssh2/example/scp_write.c": "3a3c4dfb3c4688558716a364cf0f4d8b767bf30c59cc6b352394a2d698370930", + "components/ch405labs_esp_libssh2/libssh2/example/scp_write_nonblock.c": "8071bf056b72eee39bbb1ee173193a79e6ac8a2812724b3e31bb919c6b8ba370", + "components/ch405labs_esp_libssh2/libssh2/example/sftp.c": "6a0bcb5ec7b3066cd040bfc29243fcb36f8375575db17415974a20c29892f6b8", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_RW_nonblock.c": "a2eac2e5433d8e63fd416dd8d0b1424536b4dae701360bf9ec3024495d8c6eb9", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_append.c": "e9aa3ad34d7c9aa119a841e16e99657aa28596b184ff38d09df3a1319dfbf9bd", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_mkdir.c": "51f94316a6fc8ce1c6de9bff0599fa95a950a1424e94b676410d76b1e1edc879", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_mkdir_nonblock.c": "0fb08ab3d217af555d7512693a56c63094642247054def280cbcb08e2a3612c4", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_nonblock.c": "c7236ccc7897e1abd3d9176a33cbd059327d30fc95c7803f7e5f99bf3c448a3f", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_write.c": "7e972aa778422c962ba0ebd2fbae109865b334e33c371ae94a8634e74ffd5473", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_write_nonblock.c": "6b18c9371c2ed1e22b005232f80b99959cc68f2e0dc1351fa73d678e7c64a329", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_write_sliding.c": "b88419136786cd31709d9466b0e4a131b990bbd425096276e5699559863d4bd7", + "components/ch405labs_esp_libssh2/libssh2/example/sftpdir.c": "d186de774a29db36a87fe2f66011acb5c5847316791c98f39dc2749a4c448209", + "components/ch405labs_esp_libssh2/libssh2/example/sftpdir_nonblock.c": "6282ae10e701e48063a793ab2e7a819be77f7267dd7ec29264339c41c5dad8ab", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2.c": "2789139110316e87a06b4d6132fb86081c545084358a3ddf6bb5128423eaed49", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_agent.c": "3184d5a396a9067279ec16070c699a8baffdc02c70930f8cbecbd1cbbd489d84", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_agent_forwarding.c": "2db3d78ce1c5bdb2453f7d22cdff09cf1dc3e40aceb8a54faffe6f76af88d1c3", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_echo.c": "91c519486541145f579c550fddb5ffde5933ba0aaf22366ee8aec50c0cfe4933", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_exec.c": "67afd0ef23627c87eef2e4424967eef26f8154ce50c357cad85f7d3764fcd5b9", + "components/ch405labs_esp_libssh2/libssh2/example/subsystem_netconf.c": "9b076de4366e11ca81e88d60f6dc41ff3ad897d3096f148ce4ce00102d7256b0", + "components/ch405labs_esp_libssh2/libssh2/example/tcpip-forward.c": "0a929eec2a7274e7592ded5f63230de45c1f30578ce92ea14a010a33b231ac42", + "components/ch405labs_esp_libssh2/libssh2/example/x11.c": "310b0aef741a513db213a895fbf772076e35c2ee83eb4ad1f300493ef6b5b436", + "components/ch405labs_esp_libssh2/libssh2/get_ver.awk": "ac9314659d618e57f0d57e9cb2dc5ab14ca342f099de6738e93d58b91f698f14", + "components/ch405labs_esp_libssh2/libssh2/git2news.pl": "26cad7a3870941f21348bfdffd05fff7a1e1c650b8e38fe469bab3a2a221f26c", + "components/ch405labs_esp_libssh2/libssh2/include/libssh2.h": "2d36bee9e1f99a333cd21c489f649f574fb1c615165da1cd2fa50f5186315f64", + "components/ch405labs_esp_libssh2/libssh2/include/libssh2_publickey.h": "2d419bdfbc155cec62cc23d7cb87f3d9361c4f26ce3b3910c74cef715bd2e70b", + "components/ch405labs_esp_libssh2/libssh2/include/libssh2_sftp.h": "8a0c63c323edc42286cc608f9a53cebe46ac91432e1080a8520ab69d3caeadbf", + "components/ch405labs_esp_libssh2/libssh2/libssh2-style.el": "14bd86ae83b499f88b47f57cee18f1a7f4f41650e16e34af4b8ff03970c3c059", + "components/ch405labs_esp_libssh2/libssh2/libssh2.pc.in": "a2c375f048235970c995e4a091fca2cb500574151c356f7682d44deeb90623a0", + "components/ch405labs_esp_libssh2/libssh2/m4/.gitignore": "b96df5710e539dde8424e3c38174598386aeaff62e4b4a3a878a3f8290a7f9fe", + "components/ch405labs_esp_libssh2/libssh2/m4/autobuild.m4": "37dfd034b5ea52bede69c54901b818a461ae73e2ab1e28c61c229a87f24a1817", + "components/ch405labs_esp_libssh2/libssh2/m4/lib-ld.m4": "18c4c458009da32c9daf0ea332a539e5edc82ba009b6c2faac004626313f00e5", + "components/ch405labs_esp_libssh2/libssh2/m4/lib-link.m4": "d7aab3772e5b60d3ec57ae8dc66d9b762f5c68ef1e8516df25fadfa8bdfef379", + "components/ch405labs_esp_libssh2/libssh2/m4/lib-prefix.m4": "4797426d11dad1e5e4fdbc8bcbc8b10d9750f47bcb74e4c07a953a15265e902c", + "components/ch405labs_esp_libssh2/libssh2/maketgz": "a4ef1a17c664f3bf350ca4357219a6df4af7d0b27c4588fccf5f1e630f54d2dc", + "components/ch405labs_esp_libssh2/libssh2/nw/GNUmakefile": "d6afc1888b0fdfcb50b29a3d7080a4183de41a444c7063db93a1b56d533d8dd8", + "components/ch405labs_esp_libssh2/libssh2/nw/keepscreen.c": "f95e6f4851f16bde13e51a1f4f6f405a142c6a7940beda74de8058db2f170ef6", + "components/ch405labs_esp_libssh2/libssh2/nw/nwlib.c": "d81b0ad6d05938507ebc3c0510021e889a2d68a74d50709df981d2339798eb78", + "components/ch405labs_esp_libssh2/libssh2/nw/test/GNUmakefile": "fb00a4a6776f14c1789ac8abc0b0136b79813177221355fbd3c5b1907da938e2", + "components/ch405labs_esp_libssh2/libssh2/os400/README400": "f5ce6d4f86e2334f5c271020195fb0964083e19e2f44dea4c4d62e7a9bc9f4da", + "components/ch405labs_esp_libssh2/libssh2/os400/ccsid.c": "07d12155f5b9b2be9e5477fc2818a7e98183eedc247370de04d718eef506fdb8", + "components/ch405labs_esp_libssh2/libssh2/os400/include/alloca.h": "f2b4c60ed1f78832b9141cb64e5d1d8e187d90afcb5f9f1d56dcf3f9e185d236", + "components/ch405labs_esp_libssh2/libssh2/os400/include/stdio.h": "ce35104d75377458c0c38aded5375141abf22e71215ef7533a482ceec279c731", + "components/ch405labs_esp_libssh2/libssh2/os400/include/sys/socket.h": "05599c77ea5f79337a77e7b24f4d63f40b929884141fbb66f356d825c09c8dfb", + "components/ch405labs_esp_libssh2/libssh2/os400/initscript.sh": "b27631198e5eea8048684f8fae95ef27eef1f712742265022bf4eb1ebfe589cd", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2_ccsid.h": "13a0b3c9165d7ef27ce242c64ae191f876a1fdd65f0b4d768cc3235c2509910d", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2_config.h": "313f35a0e84d1474dbdb3173585e53c417956a8f92365a75d5ae53faf179345e", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2.rpgle.in": "0ce3e5bb7c33bb6dcf960af6267b4c0e3cc16259ae881724624c9fafbcc090e6", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2_ccsid.rpgle.in": "439d9e4c68c9b20a618e305e51f54f817a9cc51dd37b62f5792232048ed3ff80", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2_publickey.rpgle": "b138035c36feb1816c6a99b1d98daff7997b05d02325cad1d9909f983e4a330e", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2_sftp.rpgle": "7d6fcfc290b07c8bafbbdfcf61e19456ab6961afe23a0aa142110052a33e7ace", + "components/ch405labs_esp_libssh2/libssh2/os400/macros.h": "38360f3613c00f49178996cf53d2519009a0b3fab161db7aebff143149730c5a", + "components/ch405labs_esp_libssh2/libssh2/os400/make-include.sh": "c75efa9eba5bcaa1e75f60110dd463c2c6866b486186db705d49518c1b0fd8cf", + "components/ch405labs_esp_libssh2/libssh2/os400/make-rpg.sh": "41cce97d1dec97571160c98967db4ab27af9c7890cf4f7aa238b3d6b6aa69eee", + "components/ch405labs_esp_libssh2/libssh2/os400/make-src.sh": "c750bd85a5153b10c61c069a7d1ec253ec3587554f2da60a144dc4246ff50e67", + "components/ch405labs_esp_libssh2/libssh2/os400/make.sh": "07f221c0d6a9e7b1c55e5d1cc8e3babe7edb6b4bad3063827b55265bec9456e4", + "components/ch405labs_esp_libssh2/libssh2/os400/os400sys.c": "2c9bc9de576376b0a37c401c64b59990e2f74ceafdb0a8c6555fb8de5be2b01a", + "components/ch405labs_esp_libssh2/libssh2/src/.gitignore": "b9193860f4137ca619b15f6f76ecbbf8df6210fc9a5ef2d53c856279e2b848fd", + "components/ch405labs_esp_libssh2/libssh2/src/CMakeLists.txt": "00462a0ce4e94446ee6c32616518db7f0539b90980d4d4a2929c295ff9dc8ece", + "components/ch405labs_esp_libssh2/libssh2/src/Makefile.am": "655563161c47286f17fd9d992f15115630e3910828e838f11759bd70bdc91357", + "components/ch405labs_esp_libssh2/libssh2/src/NMakefile": "bad4819608f02f282aae84462a7c3f1d1b199ee0fc86abdc9ab7326ee6482576", + "components/ch405labs_esp_libssh2/libssh2/src/agent.c": "29c2a52cba4eeac57ed9a3808cdefbc4e9e07f269152dddcc7038896eacce424", + "components/ch405labs_esp_libssh2/libssh2/src/agent.h": "1348e28650ce7f4350e4e1b92e26d7c45e729fe3b9cd68db716e40a64ea15269", + "components/ch405labs_esp_libssh2/libssh2/src/agent_win.c": "1c8d67a82e21c539c62f3a0b4c715fba81ca40cee588588d5e4f1abb389966b1", + "components/ch405labs_esp_libssh2/libssh2/src/bcrypt_pbkdf.c": "604344b6447e2da31608c00e432b3cb62cdbf11f25c6ba3c64f539a9f771436c", + "components/ch405labs_esp_libssh2/libssh2/src/blf.h": "b54edc453639a810289315bc3d4de37bc67bd0537260e1df7f8f21f5f1c36c6b", + "components/ch405labs_esp_libssh2/libssh2/src/blowfish.c": "23d5952bb059823ad3a3174d641655135991a9e849fadd00634516b977cbc17a", + "components/ch405labs_esp_libssh2/libssh2/src/channel.c": "0d23d9583e2f14c8f660d614ce16e8f48a41421434db588f19a953ad100ac3dc", + "components/ch405labs_esp_libssh2/libssh2/src/channel.h": "3be8e8b444461111fe0d35b21137ffcd4f681c1357616e0db4908bd434e97bbc", + "components/ch405labs_esp_libssh2/libssh2/src/comp.c": "0fd0cfb6b74e2d94a2da15b27e8e99e42f277dd12fd27ccf17bf566ad8009993", + "components/ch405labs_esp_libssh2/libssh2/src/comp.h": "7aa028c23316132522362bc9f397e22bae94e9e620eb80ac12a2009278532926", + "components/ch405labs_esp_libssh2/libssh2/src/crypt.c": "04e3683e3a16046aa7736b2401bdebea1feffc1e7fb928952dbd53adcc5a493e", + "components/ch405labs_esp_libssh2/libssh2/src/crypto.h": "9f53448f79e67731c2819b04e911228d47cb6792fe82ee818816f795cb40ffdf", + "components/ch405labs_esp_libssh2/libssh2/src/global.c": "9551963ca2fb9c321703db04952d9b05e2e6049e12d8bf6ba6e9291920b87a37", + "components/ch405labs_esp_libssh2/libssh2/src/hostkey.c": "563747e8648e09002894c1d2c93544013b17bfb3468c3e04a010306254aa865b", + "components/ch405labs_esp_libssh2/libssh2/src/keepalive.c": "acc373252f0624126226e2528897757da61c870374d5905df29a17fa185214ef", + "components/ch405labs_esp_libssh2/libssh2/src/kex.c": "f71ab4c2ba89fc4bbb560faaf955227297ece57378a984a7c67b41ef867aec1e", + "components/ch405labs_esp_libssh2/libssh2/src/knownhost.c": "2ef607c0bb2ef7ec9a4cf41158813ca8c62c55ace046a02a2b862cfdede25e75", + "components/ch405labs_esp_libssh2/libssh2/src/libgcrypt.c": "209ed04c45e4f9eeb903083853c23708d5748bcf77125664d613ffefdc2219dd", + "components/ch405labs_esp_libssh2/libssh2/src/libgcrypt.h": "7414cd0c7075c66402bed0c09fa082b40a264e50b443bc4d2d1f79991d8e5f8f", + "components/ch405labs_esp_libssh2/libssh2/src/libssh2.pc.in": "46db28ee6987b9f399c0e3b02dd5374fef2831fd4051109a478e85832e1913df", + "components/ch405labs_esp_libssh2/libssh2/src/libssh2_config_cmake.h.in": "07fe4470fd1643c51e5f2a868b053d733aaee891f1f886f4b8b848fb70db76cb", + "components/ch405labs_esp_libssh2/libssh2/src/libssh2_priv.h": "ea15b0d55cc80ff943c381e5c4758b1d6be9653b797a520ba50b8b85c5ce1818", + "components/ch405labs_esp_libssh2/libssh2/src/mac.c": "3ff6c3d22e5e9a0cc2d69b2f840606f560b83b9d40e276927d0854c20ec35b27", + "components/ch405labs_esp_libssh2/libssh2/src/mac.h": "ead9c368cf6700776d6083363a275e26d0e89de665b40b48fed1f5cd6d783b3b", + "components/ch405labs_esp_libssh2/libssh2/src/mbedtls.c": "0198525ff6b9255a7e3ab058d687fc041b3e704d1cb22584d32d6e8e57f3f133", + "components/ch405labs_esp_libssh2/libssh2/src/mbedtls.h": "c053528583d0eb839746addf0d399f86d20dfdcdac05ef977ec622f418e1177b", + "components/ch405labs_esp_libssh2/libssh2/src/misc.c": "6963f62e19e09399f871d7d3f87b16b8ea3810c8e5c38c3794b1c69efd3c1603", + "components/ch405labs_esp_libssh2/libssh2/src/misc.h": "ced7fa5c4d17e22c4f3f5407046ea0bb764ff11ca700257bfdc7728a0a89a9e9", + "components/ch405labs_esp_libssh2/libssh2/src/openssl.c": "88fa09c6324935ecee4c42f59cf5b07d069c3cc8492ab312404660fc23a7bf81", + "components/ch405labs_esp_libssh2/libssh2/src/openssl.h": "5140dd590337240cab5d2b2a4f11bb6e80b451f4e18cac77c973995b71ae49c6", + "components/ch405labs_esp_libssh2/libssh2/src/os400qc3.c": "130c4c3d3d202c4c1576cfd4fff5744e41908432ac79d8481363efe110938301", + "components/ch405labs_esp_libssh2/libssh2/src/os400qc3.h": "0e9f256b38da841315e5d82939ee52c8c947b6d1efda65f44d26cf2cd74b8db6", + "components/ch405labs_esp_libssh2/libssh2/src/packet.c": "55a13ba8b444f8cd62a9f0da3f07f982f5faf46fbf6df3bb825df1472db4c870", + "components/ch405labs_esp_libssh2/libssh2/src/packet.h": "cbd3fe922ff28675f6f39b31131d7832a07263356d0e7d55197e40d5fe244577", + "components/ch405labs_esp_libssh2/libssh2/src/pem.c": "d1adf7211b744554b8c41180c87e8d0aca2a7babceee91c75032e68655e41e22", + "components/ch405labs_esp_libssh2/libssh2/src/publickey.c": "3e1579cdc688dee088294975ee4b09316cc68cd9083ea6170a8d4726d820ea6c", + "components/ch405labs_esp_libssh2/libssh2/src/scp.c": "ef7120de5d824d9d4135b846021af8f42c44ff790dacabc8c4d23bb702abd81c", + "components/ch405labs_esp_libssh2/libssh2/src/session.c": "359f57b322d50a97ac7732bc84f22d9be9e336017a2cc9d050b06779be701bff", + "components/ch405labs_esp_libssh2/libssh2/src/session.h": "c3918ff057ebdb51116d7552e27b9f7d18461e1fbba4c1b635465dff909d4623", + "components/ch405labs_esp_libssh2/libssh2/src/sftp.c": "10a9f0076259b593fe45e71bee3b7a28ddeadfe8077a77fbbff4701cba7533f7", + "components/ch405labs_esp_libssh2/libssh2/src/sftp.h": "3b4d6460b857e32707116814f1ddc10dbfa5f804e407883e77bdad6c36db8c14", + "components/ch405labs_esp_libssh2/libssh2/src/transport.c": "77251235630878e6221516c1205b32ba786f15bd4d9afead8156a471e4312b4a", + "components/ch405labs_esp_libssh2/libssh2/src/transport.h": "4a57bc5ecc21db41729319d8fd34808f042cfa7d155be306ec2165f2d81f010c", + "components/ch405labs_esp_libssh2/libssh2/src/userauth.c": "80114428918476778385aed818ab2686a4691cdabe3b029e6d57c27431b91b22", + "components/ch405labs_esp_libssh2/libssh2/src/userauth.h": "7d930eb690721808c6d89ba917045827118a3b98b04333935d8e91b49f651b84", + "components/ch405labs_esp_libssh2/libssh2/src/userauth_kbd_packet.c": "d809a66f078569a118a944d69222ddfb5afcf0b529b245bb70725f7973a440ea", + "components/ch405labs_esp_libssh2/libssh2/src/userauth_kbd_packet.h": "f86686c43cc9ba1d9f6c8b62d801f753f350c9a3ddad3df42014fee8a2dc5eea", + "components/ch405labs_esp_libssh2/libssh2/src/version.c": "d766fe3f653d73f5a20110e7424224e788f5a42a7deadfaa8391b5a3f0694b90", + "components/ch405labs_esp_libssh2/libssh2/src/wincng.c": "c5cd20cd35a939c0b58a3311e29a8b3ba45101467a9673e693f783a31e7a636d", + "components/ch405labs_esp_libssh2/libssh2/src/wincng.h": "b9895f00d224866aac9ea1cec71ea72a2592ecd9411028ad1220869c4647edfa", + "components/ch405labs_esp_libssh2/libssh2/tests/.gitignore": "a76314b370eee3d3c44c53f5c64c9687e898909dcd3acca35aa3d483abe26e0a", + "components/ch405labs_esp_libssh2/libssh2/tests/CMakeLists.txt": "eaed8e184360a676fc5de691646a4049f7072eba226a1cef50c11cba0b55a687", + "components/ch405labs_esp_libssh2/libssh2/tests/Makefile.am": "2cd881e6ed013014f37ce5c318f39461745514c109f17e58db6bf88376908542", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/host": "6eb0f1bb23d7877ddcd502159e6673c053b5ea1846630f21651ab58ea25d7a6f", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/host.pub": "0e2479a973fbaf1f7f5dfebb111e2b199ee59c0dcfdf646d26760eba0b8b2aa8", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/sshd_config": "2ad4ea47ddb633c7a2e000f2d6619d08bf643591f26a7a0b92d0befe518ee951", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/user": "776aebc0c12e466e4b65f1a44ae5235dd70687ab03f283aa3d9a6df70d3bdbbf", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/user.pub": "39bc4445c24c32fe5e64a6ee02025f3508b4334b2813e1a87c40d44ebc5f8c1d", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa": "2e5b8a618e853eff7b3e0d2928203529fe18a3ae62b46a82ccd48a750819b8c2", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa.pub": "12aecbb237794fc79d4a96cebad1c4badaa1902b3f1788cca83b28a1f977b895", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa_wrong": "21f66160d72789400c5420f460fb716cde82b5afc5c09f3f7512d310e3c8e0b2", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa_wrong.pub": "0274eed003e62413aa894abad044296c6fb3cc19450457a282674ed3836518ea", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ecdsa": "8fb4d570516afc175869de7686125a828e18c38ddd4c2524c5a8d05c95ba7e7d", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ecdsa.pub": "bc756bc47e3afd11437cd40ebe8ce5c8fca92ee03c6e3f01b6c5b44001bbc7c6", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519": "18e808415d2f344a20b7cefac12f0df0af4e404f446f5c690000c21987ce8795", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519.pub": "e52bcbcbdcdbf547a121e92bbb6f5342375719988e33ffe7f228dd2b935c98ba", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519_encrypted": "fd1e9378f94f2d5514e16f32fcf175e8303433750c81f2def3814d5bd44a13e3", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519_encrypted.pub": "7ceb4062d5fe17f190eb32c894e4cfd76e00db7c1b16de7516df8f910649469d", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa": "9d8f4c955624a4af6fcb754e74e2abe1d3e7fe6340f6063617cd58bf122a2d59", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa.pub": "4293f28b7033d459618b277374d7e932869964de131bba1d427030cb5e70c297", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_encrypted": "fc3872744c7bf6db2df4ab2ea5701370cd8bd39367d659eaeae49b2dbe7bca34", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_encrypted.pub": "1f340ccab8b86e51d4ee7585d61d5e49e3a32338ba9eeca65988a1d751112c5e", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_openssh": "a146196a5b2189b40bc00bdcd1958165106ca21e72a7d02c0a7f95a6dd926487", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_openssh.pub": "d564da6c612286603a83af006c3a6efe53885a2417aa25f234818612e16bea66", + "components/ch405labs_esp_libssh2/libssh2/tests/libssh2_config_cmake.h.in": "193a748944f6bccd3787b1c3958ddf95c1c7ad9b25e5b8f4b42cb48987e34668", + "components/ch405labs_esp_libssh2/libssh2/tests/mansyntax.sh": "71c56796eaa4008910b3d67b885b9a7e2c018d0f88be4bb290334afb9ff23bde", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_fixture.c": "60c179e44b04a81f1bbf09aed2cb0f0dc85345070fe83b97ddf8c29219fa5d68", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_fixture.h": "21935165166ce4518c6534070cc506fcd85ece95238fef29e6b0be784c05d7c0", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/Dockerfile": "bf498e530751418dcd88ba439ad3f84837a7fa2d0f6ed2d2f2351a1097c11550", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/authorized_keys": "58c4cf998535eb4123eddf7cae7da4413eed50e3827320187380ec7925fcf61e", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_ecdsa": "14e72246d3990d345c30cd3d06c5c7ba9496057d94da2f5a6f14a7c636663206", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_ecdsa.pub": "2925ca6bb4d280aec3dd68041efc2f06e959295932a26f73a263c939c03e3220", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_rsa": "7297a4c658d398564d75964e503da94e845a0d709f64b393e3017e66dee0fb4b", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_rsa.pub": "338886a78519130b9bac71b7e8f370256d5b3c9d249fbfd2d7da90dd1574411f", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ssh_host_ecdsa_key": "03753b2b4942081d1f33201a193487ebd5a577e0bfde45f7e03a1de5ae404688", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ssh_host_ed25519_key": "18e808415d2f344a20b7cefac12f0df0af4e404f446f5c690000c21987ce8795", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ssh_host_rsa_key": "11a57dc115ca17203d6382ad6fdcd8df33bd0f23ff6bf38ee4a697260ffd1a11", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/.gitignore": "b768be5cb4da9a7050fae93fe7b2c01073cfbc5ff40cf88ad63b6f58d0202292", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/Makefile.am": "049665a167b9f4cd664b12884ae4470c0b0b2077931a056ed55d61784b230d88", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/ossfuzz.sh": "6fde8ca30e3dfc0ade9da4d06f5e34f73a51c6fea72e3a1348cf5ced10b73d80", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/ssh2_client_fuzzer.cc": "cc7f1e67065aa6938b7e9bf8aa237d1414052c1b91ed222e2baa61e5def9bb69", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/standaloneengine.cc": "f6eb3ebf7e14252339a21fb887a08b2e7638a7ac77f706ed80508b2c0d54d81d", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/testinput.h": "ce435e13e87abeec0a297ef3b566268496ecbd517c1d09dfa2232dcbbec9be2c", + "components/ch405labs_esp_libssh2/libssh2/tests/runner.c": "696b83fd77bca60560c1609212c59ad986bf151cf72520b63d23643111a7ce4e", + "components/ch405labs_esp_libssh2/libssh2/tests/session_fixture.c": "975103411a50f033df3b97b9a50136b39185dcb521765f7a6cdc52d5438e4b55", + "components/ch405labs_esp_libssh2/libssh2/tests/session_fixture.h": "d4f098a586b5f7dd0f3785b86933c08096bc12a2e55f07fff470db6fc7bbd076", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_ecdsa": "796da5d8d420f644f47feffffb0357ac99b299471e4d757f21b6cc8bfefe8f0d", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_ecdsa-cert.pub": "0f2e6d1b46874a01cc36ed766533301622d64fa88988575ca77eee56da7b3952", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_ecdsa.pub": "d6b6f80d9117f896b99933eba19b012f55068ed8b77956f1a7b0510026c2876f", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_rsa": "934d51f8e803a1c10125653a14153e6838ee9081f87eb6dbbf87f8f214a43264", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_rsa-cert.pub": "29091d3911e30d80149525c8c288e66c5a8a99fdb3816249aad5c5886df0ce5c", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_rsa.pub": "4b742a4f19b1b468d939792135ce6a7b831dd0c8f737321c09a1281d7eb49427", + "components/ch405labs_esp_libssh2/libssh2/tests/simple.c": "4afdeef598aa669b5cd0e7388dcf2e579f2c0f9c954face71d366250101d270f", + "components/ch405labs_esp_libssh2/libssh2/tests/ssh2.c": "3a8605fd3dd6151c569bc12c07ecdc33de7d704b6224da2dedfe3c76494e015b", + "components/ch405labs_esp_libssh2/libssh2/tests/ssh2.sh": "7bbe65ee20f4e47e9264bd74700cca16ee066aba5fb9e4e42f46e1cfdae4930e", + "components/ch405labs_esp_libssh2/libssh2/tests/sshd_fixture.sh.in": "c8b93076f66222f73329472ec151b210e55b39024de5d3c18a4c609b65d13b7e", + "components/ch405labs_esp_libssh2/libssh2/tests/sshdwrap": "21649ba440cd534f4bfd52c0a8de339565768b373c172dca106cffcc8bd06e09", + "components/ch405labs_esp_libssh2/libssh2/tests/test_agent_forward_succeeds.c": "a5b9f9009c6818b86f235debc2ee15de5ceb0cfe1d9b539270167058afb4e6ac", + "components/ch405labs_esp_libssh2/libssh2/tests/test_hostkey.c": "f1059c3ac304332342f39f32288afa3f61f9bdbd5d617fe6052491b20bc0672b", + "components/ch405labs_esp_libssh2/libssh2/tests/test_hostkey_hash.c": "e745d8b4ad92c858dc588e3494e183f47d591c1ef2a13b63e2122f478545093a", + "components/ch405labs_esp_libssh2/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c": "32dfdccb447dfc0b17423cfbff8971771bf260fdb72e3c7e23ec6f62105c9fd2", + "components/ch405labs_esp_libssh2/libssh2/tests/test_keyboard_interactive_auth_info_request.c": "3e3bd0ab170d9d782a08540755030a4b1e1ad5129003381e0f19543b1005c438", + "components/ch405labs_esp_libssh2/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c": "db57b8ed26a1314d5ef534036f383b12363d88ce54e0377086a298f276e9481c", + "components/ch405labs_esp_libssh2/libssh2/tests/test_password_auth_fails_with_wrong_password.c": "e3d588d9c6850ab69bd7674d2027563ff9f1491740637506d80875e66609974d", + "components/ch405labs_esp_libssh2/libssh2/tests/test_password_auth_fails_with_wrong_username.c": "c91608bdda3a83a62876725ae2d7002ccb3332bcbacfc9c9578e7488c0ed4cef", + "components/ch405labs_esp_libssh2/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c": "80d253225d68bcb7dc4b94b53374aa4de86c6995481de0974b6284bf87a91583", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c": "104b08aa9bb5f1006e07e59dece417a2d6a5f60ef6c3f8dc62b6a8af95d413e0", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c": "4b397de742f0d2fb15e86d20451f109fedd1ba28b0622496a2d030f9e9f9ea5a", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_ecdsa_key.c": "53bd6d99a243aaedc20f7de5c974c7c04e38090a415d338cef2d7357d7644912", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key.c": "207f499812271669d2a9ff5a286761a45840de9230c07bf72426fcd59a682317", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c": "4dd0a8251a41d0dd68490fb7abb9b0a1cc190af1603815f3050e29e2a7d6bc8a", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c": "6e5c107ad53c144892c54459f89ef2cf8a25cbf977bbd978e4517cb5959a2565", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c": "dbc95a803a54364604ab379b512fc98c33d791a1df4e33e4027b881ecc2e75ed", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c": "93cdd2513af42d46552baa273401910dedd014951f836175ec98b827532c5b6e", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c": "4e6d3ace02cce1ba8c1b4b6e5d774a8a4d259eef8314fe6c3ae0d6003a87dcd8", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_ecdsa_key.c": "f16a0dc74d16f0d27f10867f0ddd5b306fc4b16b2bd8e401a5451ce71c7649f5", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_rsa_key.c": "e8744ea49f5e4be9798d7ea2a93fc05bd6d4519a4bbda40dd80c421a7cc33ce6", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_config.h": "1c5c4ba6ab33bd1d9e4ce0d84e1107ced89d27a80e8505e1b428fa942edefedc", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_example.dcl": "7726a5d4f07d522aa712da8a6ca7b998cd93ca950aaa544a5eed1790dc69c775", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_help.dcl": "9d04ddc32831abf63b7e042dd0677da83599f11497d364b02cbe780419e248e4", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_kit.dcl": "e7c23c9db4583f6944cd8973cd813a6d65749170417b8384f94db69597f81f1d", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_lib.dcl": "1549134cd4a4bdf2543f900ea9c811de1c67895e1e830f7ddfb384e7601f56a4", + "components/ch405labs_esp_libssh2/libssh2/vms/man2help.c": "ae61cab505a4a9c87bdd103506ba9a36fd7ba92714edd9f67d022d8a9474e6bc", + "components/ch405labs_esp_libssh2/libssh2/vms/readme.vms": "30b5d682da37cf16352152daa682cb04c56e1044c77fc4c4da77bdc9709c33b8", + "components/ch405labs_esp_libssh2/libssh2/win32/.gitignore": "06c9a331f6578cc30ba460b468e23c59fa31f5ef07c7525f5cf1c6b262d32d3e", + "components/ch405labs_esp_libssh2/libssh2/win32/GNUmakefile": "776238af38e7fb1ac52fe22c261f28e7127152184d7f561fc3ccdbc92e22b28a", + "components/ch405labs_esp_libssh2/libssh2/win32/Makefile.Watcom": "475b8b37143bad986386ca1d2c777e9f8e46d0172ca4e9f70c613c84bbdece4f", + "components/ch405labs_esp_libssh2/libssh2/win32/config.mk": "e2172a92c5b5b9f2215c5c11128009cb6ba8a1f25402990c1f7e8ae78449d289", + "components/ch405labs_esp_libssh2/libssh2/win32/libssh2.dsw": "b497be91f342d18d34c61b8e3d1d9a200c3c17c306e16a71621c467f545ca083", + "components/ch405labs_esp_libssh2/libssh2/win32/libssh2.rc": "29a25c29ed977ba78619a59bc858508caa6f0849607c02da8fa7fe71b6fb7195", + "components/ch405labs_esp_libssh2/libssh2/win32/libssh2_config.h": "d5e704c80aca43c33698bd45059eecde05b098049192bb9f0640af593cdb2cb7", + "components/ch405labs_esp_libssh2/libssh2/win32/msvcproj.foot": "d2cd7c9492045f6a9384010e9cca3c91e2a60c2e54f64680f72d94bbfcb387d2", + "components/ch405labs_esp_libssh2/libssh2/win32/msvcproj.head": "e0739f82a357ab5871aa44790521d50a80b74b5fe638c59ffb41b97c98404930", + "components/ch405labs_esp_libssh2/libssh2/win32/rules.mk": "5f68dc0a3ef0f61d783289c98c00419a0a76a2b866ecd0f86404ca1d3effc12a", + "components/ch405labs_esp_libssh2/libssh2/win32/test/GNUmakefile": "e2c77b03fa88a88d90fe1dcb6c095935ba99b03b56a78f101a373ff208e1369a", + "components/ch405labs_esp_libssh2/libssh2/win32/tests.dsp": "9c206fcca8e6ce5bb88c2278aa7d74ab8cf740d687779ffc66161ea4cc00afc0", + "components/ch405labs_esp_libssh2/libssh2_config/libssh2_config.h": "4d564e905c0f8a3eb92e55df2874b2b9ff8e589cbd6033e466129f107a3dd35e", + "components/ts_api/CMakeLists.txt": "f1cd2808b27affc21540be76b960bb87044b96be6a9859257563469b3724ef32", + "components/ts_api/Kconfig": "f887aa9f114a9715e286ca3d55fe77f98560cbb1cd9b4c63cd55dd5830386b64", + "components/ts_api/assets/lpmu-agx-network-setup.manifest": "8a4e7f5de0570f69c2a6a33cb2ee6c28afff763d364c7999cf70a76bf418769b", + "components/ts_api/assets/lpmu-agx-network-setup.tar.gz": "77ac9410a62eea50b2a5079d3a7adb1012deee1188c03e0a5cfb4609e4e5f636", + "components/ts_api/include/ts_api.h": "06e9e6878b7624461d9f690cecc169e684075454429e9fc21ae09f8563d6ac69", + "components/ts_api/src/ts_api.c": "56635fcd468d3f39fc06a04f6bca4dc319b8ab125b2dd93b3050bc879cf2bc14", + "components/ts_api/src/ts_api_auth.c": "be45df1d19803e7771d70f19bd5cf970f6ed51b3b20f55ad73b529fedf19c66e", + "components/ts_api/src/ts_api_automation.c": "01ac4e75a4e64b51eec7b6e5c8566c01a86ca9fe58bd3774929515f0178a3d7d", + "components/ts_api/src/ts_api_cert.c": "25af390ae3ed16eff746b2b49c3fd5893d418dc91c6106b5dbe1511f2885b7ad", + "components/ts_api/src/ts_api_config.c": "1eaf82f2f82c228de7e00c86fd3d500883107917014a5e506cd24fb60d13c667", + "components/ts_api/src/ts_api_config.c.bak": "d5f055134e303f3d724bcb65e3da8417b2d20876b2909b93403f7a3bba1d7a1c", + "components/ts_api/src/ts_api_config_pack.c": "5aa2d353b773bbd06b6235e579b540c17211534ed5440c4adfb40112f4c96968", + "components/ts_api/src/ts_api_device.c": "7f3714eb9857d069bcf6861a271ce95ed21a86b4446a99fb889486e085e5b7d5", + "components/ts_api/src/ts_api_dhcp.c": "45d3b4ccb5d6bbb3f68e424b5762daa8b0743da1575ef200b315468d65b071b2", + "components/ts_api/src/ts_api_fan.c": "41e8d20c253867f334e9b9517258c7abd6f2f34c935ca4632d27f6a627385432", + "components/ts_api/src/ts_api_gpio.c": "a508837fd3c59b00ba6df75b97e9ad496bc633b44db0167fd703b9d7cfc67284", + "components/ts_api/src/ts_api_hosts.c": "d65c9183c5064a177e594cf57a98142263542de501564d76134730b178483719", + "components/ts_api/src/ts_api_https.c.bak": "a1200dac515be89fabc14dc850c36c9df92f66834876ee25064477444b17de0d", + "components/ts_api/src/ts_api_key.c": "7b06d396f2d49f4bf17bea6eaf45f96a73712502778f912c725bf46b8aea8ca1", + "components/ts_api/src/ts_api_led.c": "d46955f01a5ee7c364c0b549cd4f035857295570f3f7be7ac8d271f684c99849", + "components/ts_api/src/ts_api_log.c": "4887b2be40a0ef3a534f86a66c1a24a7a3f3f3d07446380b7d0c65d62095cada", + "components/ts_api/src/ts_api_lpmu_access.c": "c0e2a0bf52d476a11f922213b2bd4de475cc793c6a3710aa705ffde7101b6571", + "components/ts_api/src/ts_api_monitor.c": "a33e2d70b807d8be2a752ee2a95d3e42991d3d3e84622bd725ea8680fd68420e", + "components/ts_api/src/ts_api_nat.c": "87f254d083090678b3d96fe5923dcba919405ff336608b2a29220692e21cf255", + "components/ts_api/src/ts_api_network.c": "41f60810337f7cb7ebea6646d50878aa753b7942cfa45007666d47fa26162a8d", + "components/ts_api/src/ts_api_ota.c": "0052993718bc857ac770dbbbc9b6067f8db1eefbddee5d5fe9da33b299d4bb78", + "components/ts_api/src/ts_api_power.c": "dc65cbe9c56a8478913f148ef21315878e2d9aa13518d2b20a407e05b8b2d1b3", + "components/ts_api/src/ts_api_service.c": "54638eebb7c4604713e597c1f058791e13833dd407aa9faf906dc4afb767e0ff", + "components/ts_api/src/ts_api_sftp.c": "af147747910dff5c70a21c423284764aa48ccdf0b69ec51307a080567c30c334", + "components/ts_api/src/ts_api_ssh.c": "edbf7f6a4c80f3b15a75e7b39096ca0e6fe6c98ab1cc5c3e3091b5c947646ff7", + "components/ts_api/src/ts_api_storage.c": "2d609316f08eaa00de84649cf52e38fc4c9558d10dce855dfb6c44687e12eaba", + "components/ts_api/src/ts_api_system.c": "e9668b91761222e6ef4f840feeda118e45f769ca9c86c8e9c5c6749b150ab31d", + "components/ts_api/src/ts_api_temp.c": "76dc78ecc8dac1b468e75e239ef57bef6ff84945510d626b291973f12f4b4b62", + "components/ts_api/src/ts_api_time.c": "0ebaa8796a37b1d965b51f9cf5b470d768b74a34c79c6e11184f082979c20fe0", + "components/ts_api/src/ts_api_ui.c": "ca2f0446c6cb0e42b4880fd48be4b7a52fe666a0eae3d9e828ade9289ab7358a", + "components/ts_api/src/ts_api_wifi.c": "54b7eebeced862a7bc75ef17acd9e5bb46faef526373c1a6300564a36bf0b4db", + "components/ts_automation/CMakeLists.txt": "5f6513d53d29951ea58531984c1c4a23d8cf9444ff9784d305cccbd13190472d", + "components/ts_automation/Kconfig": "38cc856f0951f867e771084ad7e22a8f237c4a10358f9f285bb4f4617d1f3df3", + "components/ts_automation/include/ts_action_manager.h": "af18f369c569389caf2ca033f34b234a18b724577334cc5731f9d0d449f85485", + "components/ts_automation/include/ts_automation.h": "fec1551e90c8b0e0acb0b4355c695d90213d94247659db99670c9782c69bdc08", + "components/ts_automation/include/ts_automation_types.h": "e2c9becd036d1322fdf5f40ae67df8a6d23c53f411497368e61fbe557a9d597c", + "components/ts_automation/include/ts_rule_codec.h": "501ed7dbec67e52807997cc905b41bea86d71f119cd4b31b9f460c0e0ba54a26", + "components/ts_automation/include/ts_rule_engine.h": "70d0d72afb2ebeffc278e1c844663049a5624cd2365311c0116f40f057b76a74", + "components/ts_automation/include/ts_source_manager.h": "42f2e1281ea0644a47013d3eb1a35cf6ecfc6115627b75c8fda3dfb7b4e0f78d", + "components/ts_automation/include/ts_variable.h": "136b371f4d0fab848c8c2ae15de4993b8786479af64e4c87974c8e26d1be009b", + "components/ts_automation/src/ts_action_manager.c": "837efaaa4e418681f102b9ae1b610dd05513a53fd820cbf8c55aafb00b2fc849", + "components/ts_automation/src/ts_automation.c": "be565cb980d822cbb6081a32d07e560dccbde6a254a06d0d06c10b92b9113ba8", + "components/ts_automation/src/ts_rule_codec.c": "aebb9914c282aeda99ca089ec1ed2af93efac865ee9b0e2a57d9c6abec9f828b", + "components/ts_automation/src/ts_rule_engine.c": "73e6627c2ed8aade04c3d102186fdb837415d223864a1080f9b7714d7c39b06e", + "components/ts_automation/src/ts_rule_store.c": "e96b4119e512751272ca8dc58fd553052895ecc5c742db9c47c34bf264d7772c", + "components/ts_automation/src/ts_rule_store.h": "ee248de2197d6027037980166f8a90a240214ec2c7a17c0e4097c0820e3add95", + "components/ts_automation/src/ts_source_manager.c": "4287f8ce547c360db5c30af83f62123864831730bd0fbc5b34feb522957beb0a", + "components/ts_automation/src/ts_variable.c": "9740db1f2a06a2526354cf573c1ebdd3c512bab9f9175aefaca38f8eac5c4dcf", + "components/ts_console/CMakeLists.txt": "844bd8be8bd6d63b6c0ef8118cf32b291562982346fdc7246a0d9fd03a586aee", + "components/ts_console/Kconfig": "8b835fb6fc27abc7491581c4f320ec600f70aac4874afcc78b98e280eacbaff4", + "components/ts_console/commands/ts_cmd_auto.c": "e57b47ab327f04911afe72b14edd3685db9c9bdc9a6fe46f90298483a1fd4754", + "components/ts_console/commands/ts_cmd_compute.c": "0d6395aaeaa7a93109ea25c71f53f3af11f7bb5efc1ddca05298a30460d0134d", + "components/ts_console/commands/ts_cmd_config.c": "28dc46db153b4b3a68024d5bc3ec37001df4d6d4bf7cf41e1800c4be30005d77", + "components/ts_console/commands/ts_cmd_device.c": "f3d82977bc6f499f45c04cdb02aebc67756251bc7683270823e40bfad5160b8f", + "components/ts_console/commands/ts_cmd_dhcp.c": "53609fa0ad1af0b5b91eff63b65c87a367f6fd8edec3c68cdcb30dc2f2f84145", + "components/ts_console/commands/ts_cmd_fan.c": "599db48798328646ce71fb26f19734ecf4e634fce9c4aae1da1241d92fd8f9f3", + "components/ts_console/commands/ts_cmd_fs.c": "3f236843d1b1982d48311c4ff5c6ade2e07819cba35b2823dd67e17b77aad5e7", + "components/ts_console/commands/ts_cmd_gpio.c": "33959a8512d0cfaaffd038ed3449ace567764a813fafeedbb722b1fd41dc6dea", + "components/ts_console/commands/ts_cmd_hosts.c": "645e96c17ca441cbd8cae5caf0a3b81d66f7aa9a62972efcb7d86d9acc06f040", + "components/ts_console/commands/ts_cmd_key.c": "78dd3af63ba9ee2f4e29b4b9142d17f860415ebbc5852b0bff9856c5cdb048ce", + "components/ts_console/commands/ts_cmd_led.c": "8d535e208a3ae3777468edcff5b5a01211fd1e02f600777ecf29905cf8669676", + "components/ts_console/commands/ts_cmd_monitor.c": "526c49802f6f34d4b9f5d0504eec76a3a2e06163df2bc3dee6d73a873a404b18", + "components/ts_console/commands/ts_cmd_nat.c": "cd4de61f4135904a1b063f8bcfacdfca177f38fe14f69bdac8fd6052cec0af27", + "components/ts_console/commands/ts_cmd_net.c": "5225f73d760d6da98719bf0c3551abb4366d087174487fb3246169fc232200a2", + "components/ts_console/commands/ts_cmd_ota.c": "403179e5d864a30af5289014fe2ce677cab9cecf6876802baa32d0fdf1cfd932", + "components/ts_console/commands/ts_cmd_pki.c": "85bfa318ace72dd40ac9208a3ad8af11afb33120e2e2b61de3594f2e5be4b16e", + "components/ts_console/commands/ts_cmd_power.c": "77ec359cbe492d3fb90318716c142c2408901f5e50a3c4a14073933cab7ffa8c", + "components/ts_console/commands/ts_cmd_register.c": "33adbed296353e1deb9f97efbf1139ad4c8a7ecbfa3cc661c2236f31529c4630", + "components/ts_console/commands/ts_cmd_service.c": "bb62b73286bec5d6c5f184ad8ddde9657b96042ca4ddbf75dbc60c2bb9fa3388", + "components/ts_console/commands/ts_cmd_sftp.c": "12ef96104441fb58dd07aabcfa32e28dc2617957324460700c75ea43d91e4181", + "components/ts_console/commands/ts_cmd_ssh.c": "7878385dce3d19af0a45e5dd5f264c95ce7cc0a2ee5afcd47d326adbf359c722", + "components/ts_console/commands/ts_cmd_storage.c": "9c7c581d9cbf82ccf5b91eea4c5f4683aef82ac4378bc750394f3236fa479114", + "components/ts_console/commands/ts_cmd_system.c": "1ed44e7f13f4aca20c352d734dea23150346ffc46645dab9f62e9baaac45d2db", + "components/ts_console/commands/ts_cmd_temp.c": "fb163a57281fab7d5a7732e2be9dfde0ffc169dc05d720123d0ee4fe9e6b7a0a", + "components/ts_console/commands/ts_cmd_voltprot.c": "975cf460bccc27660cc93bf0130d2bbd385369616b8ecbb48ff32096f16db3ae", + "components/ts_console/commands/ts_cmd_wifi.c": "c3042a507001b54a14b3f8ff5f32ee5d38b305d156c3267cfac2a23f2e3b3824", + "components/ts_console/include/ts_cmd_all.h": "2f76f6ec1ba074d28deb15efb4d0272607604d0b809a52fdf506b15d5659cb52", + "components/ts_console/include/ts_console.h": "f107554abcf4de2655e2bb129f5bece338ca9126e89a546b102a9bff9d92400a", + "components/ts_console/include/ts_console_args.h": "98084002ced0297f0f92824510271e56af90199442518c392d1fba3907cf624b", + "components/ts_console/include/ts_i18n.h": "9ce79a7c63c72fc49899b7614bf9a751808183de90b5ba2a228e2fffea1f1d9e", + "components/ts_console/include/ts_script.h": "a7f8c453393ac94e2c4d562b1bd8a715a21884ab7fbf1f2e19ea5acbf1ea2abf", + "components/ts_console/linenoise/linenoise.c": "ad81b74f8d3482c1dfbb37c34dac1b40a401ac5384a9c3348046ec66fa51e679", + "components/ts_console/linenoise/linenoise.h": "67d0d645bd392175ee75d4e94f2cd1bdf0eb086679d5fd77a6b90c449dd6d94a", + "components/ts_console/src/ts_console.c": "00407de9165403958c3a33c15425a4a527045ed00ab72820c3d011df52c1a6c7", + "components/ts_console/src/ts_console_args.c": "2d47c6c9ab6bead1302cdb2fcdabd14d6c0304e88a3418997965993c7e471863", + "components/ts_console/src/ts_console_builtin.c": "80eef72644309badf1181b6e98e3dc336ade99baaedfe9fba95d83df82bdfb2e", + "components/ts_console/src/ts_i18n.c": "c3d384a39ba32f27f142accb8dd17b06ca12722546332058add1490eb4f5d994", + "components/ts_console/src/ts_script.c": "034fb13082dda23578b2b20800812b59cc155fe77ed788a2247903c834b9c8f1", + "components/ts_core/CMakeLists.txt": "326c89b533f1a3a18f4a567695ef66aeca7ebe2b53ff9363ca466208e0e65905", + "components/ts_core/include/ts_core.h": "9504ead739f5011bfc7864103464bcd7d8c06eab2242d89391203164e9210197", + "components/ts_core/ts_config/CMakeLists.txt": "84e0791274bf45e4fa2c3373bfbb8f6ddcb2883c3dc7234a15fffd905a2dff9f", + "components/ts_core/ts_config/Kconfig": "7d319983a89dac10bd815eb94af1b0665a471e68709c6500ae298756161931c3", + "components/ts_core/ts_config/include/ts_config.h": "4945666dbcc7eb507f5a740061340a692e5add4ba3a4e5e421bd656d8b24b4ea", + "components/ts_core/ts_config/include/ts_config_file.h": "2d3bab9796164c3c2d945f2abd44e38dbdb37243283a62790275fe7872e65b78", + "components/ts_core/ts_config/include/ts_config_meta.h": "b649ab500111f98ba9035c525a625fc7ca21e0e553db1c978e03b35f24d43826", + "components/ts_core/ts_config/include/ts_config_module.h": "94873dac21ab86cc2f4eb4d7265588457e97e4386602773a3228c49b864bb472", + "components/ts_core/ts_config/include/ts_config_nvs.h": "2ec4ec9940dabd37df9de6f69d314583e1e77546c17fd67ccb5673a50be8a142", + "components/ts_core/ts_config/include/ts_config_schemas.h": "1b7de493a6e88d10155b558510e6ae4a72e31fbc1f77510c98b1ee8912ed94c1", + "components/ts_core/ts_config/src/ts_config.c": "c9a7b95660bfb29539cf323acd0ba66db8359a094347ea23740766a3b9721aaf", + "components/ts_core/ts_config/src/ts_config_file.c": "c61d01fec4b55560963a7995885c375f084dc54ee8ab52b47288eb68cd4403c0", + "components/ts_core/ts_config/src/ts_config_json.c": "be09570bcc58ef2dce1b4cce5968d2a0ce5a5ba0451295278ff16a66b7c32428", + "components/ts_core/ts_config/src/ts_config_meta.c": "ecf781cbcb200e56689bdaea34216cd033bf477eb1087eb1b03413334d2c92ec", + "components/ts_core/ts_config/src/ts_config_module.c": "f2c74dc811a31d4b5d0be2f2105f937ddddc5f52345763715e6fcaa6a74fbb8e", + "components/ts_core/ts_config/src/ts_config_nvs.c": "8dd95d5c09611a856e49770bc30ec971bd313cf759d833a6f97605f1dc6ef0c4", + "components/ts_core/ts_config/src/ts_config_schemas.c": "522aeba7427df30b89ab3ffb66b8637d3cf0c247af7133cdf2c04d45930994da", + "components/ts_core/ts_event/CMakeLists.txt": "c7f2d8ef1c3ac4e5bbfda512be49c5ade6acebf651ae8913e36e3f7e4ddd7506", + "components/ts_core/ts_event/Kconfig": "b1cf0bc9fa8ad38744b11d594a6f3aeb077a8ab88950c9695058e95aaea18929", + "components/ts_core/ts_event/include/ts_event.h": "16a1e76fdf93b97fbb5de2d0bd9d87d2ab8b3c9a55b1e63f1708860bc0632e4b", + "components/ts_core/ts_event/src/ts_event.c": "197c0aa5d942b10ce56fdb1245f42470e76e2827af183f905733ec84cd7faa56", + "components/ts_core/ts_jsonpath/src/ts_jsonpath.c": "115117f7a1281562ede7fe5666ba313cba8819742c8c22547a1ff0d0c9252c6f", + "components/ts_core/ts_log/CMakeLists.txt": "d149529554e03487f45cbf2f04d2989a996b328d94818614a91dfcba97c2697e", + "components/ts_core/ts_log/Kconfig": "35cb224534047beeb071dc83802e4c4532849b38d87e5feb75be5eea0634c972", + "components/ts_core/ts_log/include/ts_log.h": "beca44f4bde1ecba236f2a15d6a9bdd8037b3bb29f395e25b2f8ba4696847b57", + "components/ts_core/ts_log/src/ts_log.c": "c0cb7132cc80baa5ca03edb1adb13b0dfaa136bd4a0fd958307a43960be47b6c", + "components/ts_core/ts_log/src/ts_log_preview.h": "9e05ef9413323fc1ebe476e8fd73cf959767ceac9db7b4a5ddce17839e49b509", + "components/ts_core/ts_service/CMakeLists.txt": "ec3f90c75a8342547444c03165f61c9e9d5dfd1441598ede2aa93cf1711fac61", + "components/ts_core/ts_service/Kconfig": "3ab9397356f4485ed636b1af167714b75fc3d219386b8774ffe3bae6cfbd4675", + "components/ts_core/ts_service/include/ts_service.h": "2bbabd7738c2fb19880e45c0df169e3d5f6a226bbe1affdee030a7ddf8b2dd87", + "components/ts_core/ts_service/src/ts_service.c": "326b3ab1d4a61eba8b9bf43af26039fc4562092cbea19709764104278c79ec2b", + "components/ts_drivers/CMakeLists.txt": "22ee0589081126d02231d52d9e6526b095a4b5c13ce2cc97cb1e5666e848b8ca", + "components/ts_drivers/Kconfig": "55bfa04880f382bce54b4aae233d0f23488bd94ce8e3fac01ceee49477034427", + "components/ts_drivers/include/ts_compute_monitor.h": "b85ce79f490986e6b64ec3b12bef425576b5dec0121c0237f8cab34aab772703", + "components/ts_drivers/include/ts_device_ctrl.h": "0d203054b4b8dfe970d408c706fa1e123973b9bdc52583eec63162eee25a8879", + "components/ts_drivers/include/ts_drivers.h": "56d740b76b1401407f81099e521cd514e617fb1cdd3aaf9eab727a86dd327fd2", + "components/ts_drivers/include/ts_fan.h": "2a30df271570bff942383c46e368f232db484627bbbbb29b77a49a2155304cba", + "components/ts_drivers/include/ts_power.h": "1961071837745a2e5db6290e65bd4cdf8465a6e42b181b24f13ec642a80cc45d", + "components/ts_drivers/include/ts_power_monitor.h": "1e1b1f246f6cea8d05881e9960d2db7fd25c4185544ff8659dd8556d8f68636e", + "components/ts_drivers/include/ts_power_policy.h": "1f8475392cbaab61e90470ee0a246a67f4f8760392026318e2a56ea1058cfbc3", + "components/ts_drivers/include/ts_temp_source.h": "195c577b4f4e51efe4ad19315679dac3944f53eb72bbc94392717b3426067000", + "components/ts_drivers/include/ts_usb_mux.h": "4dde492aa085eab2024a12477036b80583b9e00a6ee3200164ec6b2b5a3b5080", + "components/ts_drivers/src/ts_compute_monitor.c": "dc396f53de43ce72b5ca6c0301d8ec82056648adce0952e0b1012e7b6a794587", + "components/ts_drivers/src/ts_device_ctrl.c": "c30a1cc807542077bd8302a9c6a4be07f286f76acb66e95f787ee9eb5fbdb279", + "components/ts_drivers/src/ts_drivers.c": "e21d531fd3bdf7024fbbd0ac7162d17602775fbe4fe237a3e0fc234ae3ed247b", + "components/ts_drivers/src/ts_fan.c": "4771e2094228dc6586be30910acc60ef44ec16f852684834eb81776e1d867431", + "components/ts_drivers/src/ts_power.c": "02d30bfe6140dcb78a0a0b26e36de7902864b323f64e5d3b6f9d6493b0d5dcc0", + "components/ts_drivers/src/ts_power_monitor.c": "22e16a8a2f0629c28f2c2f2f4d7ab259d2013be1e13943da2d0866d1a379b1d7", + "components/ts_drivers/src/ts_power_policy.c": "bc0daace30a1b4c5c14fe839f03f9af9817e9597661292be4cdf6b81e3e68957", + "components/ts_drivers/src/ts_temp_source.c": "986d608503653d071ee8e06f04560eb74403d2839add61742cc05c004b5fb153", + "components/ts_drivers/src/ts_usb_mux.c": "76687b9f9bcb1081eb2cf08ba6dd49136b3262e806db6be0756d4981bcd34470", + "components/ts_net/CMakeLists.txt": "d6aaac5a04b06bd536336820df0d5eb8c87e27b3087e5df41e640508314b163c", + "components/ts_net/Kconfig": "ddc14968f72310808d23b849248c7cb49411ed43e0f3c268060fb60da2f26e06", + "components/ts_net/include/ts_dhcp_server.h": "64e5e854f9b8fd7182f92dfafe594f3d8f1288ddecbbbec2c89b3aabee950c51", + "components/ts_net/include/ts_eth.h": "9f8952c77ade85741afb38aa48f3fb689a94164a2c598eb6c7df9344948cf8ce", + "components/ts_net/include/ts_http_server.h": "025cd54548f90be15b30d40c62250592a008b8d1e8f0dc1682ae9bef42768174", + "components/ts_net/include/ts_https_server.h": "f4c25017722b69f2f1bae48df34aa595f15d186ad3ec652b7be9d034e184bc79", + "components/ts_net/include/ts_nat.h": "1721b9c499ca0da09eb402d7db9211604a7a3414b6e2e7cf88169f872365a229", + "components/ts_net/include/ts_net.h": "2ddcd9233f0f5f63a83fdc6f3d09de3118b5b1cced5d9b009b3126c3b872a98b", + "components/ts_net/include/ts_net_manager.h": "6ad22613972f51af05eb6d468c04763808d92c1d6a6b0a7225911b24f9c0d9a5", + "components/ts_net/include/ts_time_sync.h": "e3ebf9da5b0c7b30a50a67fe07547e2c7fefd588474552579f4a2bc15ace8ca4", + "components/ts_net/include/ts_wifi.h": "25614f917387174bbbb7618010885353008e4488262303b314b87b78ae9f0905", + "components/ts_net/src/ts_dhcp_server.c": "800f32ac5097d4d73807496713a59488adfc417a1ea3be627a097cb4c9da0279", + "components/ts_net/src/ts_eth.c": "d2350045f8abe2d3bc1c046a51c5c0016b601f69bfe99ff2bfcdec8cf26e47fe", + "components/ts_net/src/ts_http_server.c": "0c8449fb396246074ef9deb404b2d5f98610f4f22f3c1ce70bf2774711dbb6ad", + "components/ts_net/src/ts_https_server.c": "50e9e0498aa7265739b99d9131eef726149fac255d20f152190d289df16b8ec9", + "components/ts_net/src/ts_nat.c": "e5accbee0cc4b7d0feccecc080b23726af94418f5f2c9645df785eb142a1eb24", + "components/ts_net/src/ts_net.c": "2f363e1c6cad3437449c742f42db70240cc34105942cfd2c2f3a854b226b8f92", + "components/ts_net/src/ts_net_manager.c": "4184c6e23f68b160a511fd8c44baa8133c04596fc00fcec459389ec61c14789f", + "components/ts_net/src/ts_time_sync.c": "d83f4591d1c45de7a89af7126c9921301a06ce2a6cb3890c5d302d491811db56", + "components/ts_net/src/ts_wifi.c": "54fdffed9cde1145b5dccc5e9419a72c94f83fbc395b225e76098be09b01ba3d", + "components/ts_security/CMakeLists.txt": "cdc8e21b6985899e65385ce4b2c92958cc540f19f3445255301b20ad71241c88", + "components/ts_security/Kconfig": "c3d0036c138f0bf227f73558802a24892694e5f8328ecda2ab8007e0aa219a06", + "components/ts_security/include/ts_crypto.h": "371ac3b950f7185eaa21a710c4e823ed806ab337d573cfffdcfe58656aeee8c0", + "components/ts_security/include/ts_keystore.h": "55831771c42ae32640dc6ce1d7755f3487149f71f42d1f1ca7451af2ff675f40", + "components/ts_security/include/ts_known_hosts.h": "4b1244556d046e0057ba0d372498f92d263e43183975d5e55d0bbaea669b0934", + "components/ts_security/include/ts_port_forward.h": "a249f758369a81a7db44f71e4aed0511cd4f5aa932cc4bde33b29c393b5d39be", + "components/ts_security/include/ts_scp.h": "5801a44ef598560d9eef3265ec5b891b494e2682b3049834d3694abe0f86f175", + "components/ts_security/include/ts_security.h": "01cf0f2c1ee2599c0d733ac5d7466e73358fe5483aad23d654c2e6b99c039f35", + "components/ts_security/include/ts_sftp.h": "6d0c9ab1ac7dd3eab5d820798f543be18e2de1d43028dc72ca088b3ec13ab1fe", + "components/ts_security/include/ts_ssh_client.h": "ceb00ed29965279a154e061638b58769e148ea370f5435de48c90c1c8d90f928", + "components/ts_security/include/ts_ssh_commands_config.h": "d1fa1bbc2762bc4accf697db09959396cb5d82bb67ba1806a0cd4f9b45305352", + "components/ts_security/include/ts_ssh_hosts_config.h": "48d27c0cdeb6b0f462d41eaef281b6f2afe6e460b810a61f2f98278d0609280d", + "components/ts_security/include/ts_ssh_log_watch.h": "08677f37f9ee0a3620f6ed38770c4f1977d3b70787e96e57db0f934de5c5452f", + "components/ts_security/include/ts_ssh_probe.h": "697c24c0ff5244397d3483997357a81311cbd24b718d64b845efd96e19979e43", + "components/ts_security/include/ts_ssh_service.h": "73fbddabe3eaed6a191b90b1644eb50eb440509723c92f4a61788c2306596102", + "components/ts_security/include/ts_ssh_shell.h": "0594cdb6f555becc8878609039106e4d986a926be559691dd7785ec7d5d3af0e", + "components/ts_security/src/ts_auth.c": "b4456d19bb701f5be50c08bb8024c8b24eb97820fd47c72c9fda6e1ff334b78d", + "components/ts_security/src/ts_crypto.c": "5ef1140c4f122a49a531de1bff5c48c80067bdcadf2139553c35a59fd5404587", + "components/ts_security/src/ts_keystore.c": "0046e9a9f13a4dd73f932a2861b787c6264ad1597694b3cdc8a9b9eca251ea1d", + "components/ts_security/src/ts_known_hosts.c": "72e2c0c5723cf9fed7c589e46152b5806c4bdcfba565b862305d2fb299ec3844", + "components/ts_security/src/ts_port_forward.c": "b2dafd8ffc849f684cf0a9f332864876951d2d9ee7fd8a69ce7704430d00853f", + "components/ts_security/src/ts_scp.c": "cf328d792705cf8d6b00ecc3b8369ae8360fba977a3147e0a2eef6634a08cff8", + "components/ts_security/src/ts_security.c": "1c4bd91f4ab676be0739b60b826e026a84baade609369995c845b1991a1e2c49", + "components/ts_security/src/ts_sftp.c": "e05a3cd229dcf4344cfcc785755e075b52f94a4276411abbbfb6e7716793a899", + "components/ts_security/src/ts_ssh_client.c": "071b875b4029cc9d0d9e5538ce7a05921a07ec57d09faa45d295fccb7625552d", + "components/ts_security/src/ts_ssh_commands_config.c": "f12fdb5169de9e52db02590bf9d821bc08291b6c24e62f4f81bc54b03574e6da", + "components/ts_security/src/ts_ssh_hosts_config.c": "36d70ff90bef5b0efdf1195c614a33a70b7ed521807c28a2a3b4d918265b2056", + "components/ts_security/src/ts_ssh_log_watch.c": "3843930a4337ea56092d37e1ade0651dd1f6a14c3f5596d33bc83a7880712f6b", + "components/ts_security/src/ts_ssh_probe.c": "810b235d84659426a3181ec594a345e2fd0ac7fc7c1ce765c34265ad1bc05843", + "components/ts_security/src/ts_ssh_service.c": "fc345627f4f2c9417dd0e74fb47b3d77e2cc9f41fd9537bd2f633b0260e5e01c", + "components/ts_security/src/ts_ssh_shell.c": "87412b746f3a18a1937b479592e446eb737cd1f4999c316b662e5435d88ab46c", + "components/ts_webui/CMakeLists.txt": "53e02258893758d55edf0debef2e0694b154ecccda65ab3b5bb5d34770c39d45", + "components/ts_webui/Kconfig": "6a1fc77d34f7c635b44a922f4c7c9fb96832a9f6bb433967c26e3bdc451ae286", + "components/ts_webui/include/ts_webui.h": "374e230b4f0d016adb2373acd2e6431cf537eaeb8f7f84efcf53523d6dad0402", + "components/ts_webui/include/ts_ws_operation.h": "4a31681f9e5d0041d2627b5850b23c083e1b0ca3b876acf959adab5955611512", + "components/ts_webui/include/ts_ws_subscriptions.h": "edcfedcdb48cc47bdd776218d43f362f4f2feb84f0a8bd347b465e3dd751e3ae", + "components/ts_webui/include/ts_ws_transport.h": "4c7b996ed4e6a578ce7daa1a02a13729795bd4dca2e66eb8b49895b6f59f36ee", + "components/ts_webui/src/ts_webui.c": "6ec898b4c78fbd19e469dd45d4f890ce5bf32708a38217c516ba595c00683686", + "components/ts_webui/src/ts_webui_api.c": "c8225f3fc36be3446947e205932a3d43340665d687b81c23c16556f3be8dc9b8", + "components/ts_webui/src/ts_webui_ws.c": "cb8f801a18672c24636fe744cacf0f1e0379f75b579bcd4869bb9c9d8e541949", + "components/ts_webui/src/ts_ws_operation.c": "504ce5caa9375a792692eec681a86bf4515aa5c2d28e758d67df08117b6fe865", + "components/ts_webui/src/ts_ws_subscriptions.c": "9f8d2f33a374d6992a1ef119cd20a791244e44abc8d7cd66dc906b4896f764fb", + "components/ts_webui/src/ts_ws_transport.c": "e2eaeb31d00d7996a84badc669ca5587628c63b044c9a8014e587e84b5ab37f8", + "components/ts_webui/web/css/style.css": "30dab8799ed2a8b0a5da49ec84202b30f3c951779ea4533e847a53b2ac9b8dff", + "components/ts_webui/web/favicon.ico": "1ea04b690d7fe816da5efb405c13f9cd953366026eb3553e214de8d5df0d3648", + "components/ts_webui/web/fonts/remixicon.css": "b2218eec4e02513f0feef46f74f13c852152f54eafd83d1274057e3895f0ea1c", + "components/ts_webui/web/fonts/remixicon.woff2": "e92dc38bfb1d15dbb9d9ca9e645754f68e7c5b224e33c45a17048bd0cf2407a6", + "components/ts_webui/web/images/README.md": "f4429665c315cdabc2a935caf0f1423632dd7cbff84f34914965969217102237", + "components/ts_webui/web/images/favicon.icns": "bdc873fa7bff5e1888d80273f99f22d97d3719d4b17419e68e64eafd85c2b039", + "components/ts_webui/web/images/tslogo-128.png": "f09ac97789726872277a0399338cd9bfd0493752de930aeb6b2c6f7b0a864c3b", + "components/ts_webui/web/images/tslogo-256.png": "55dc7df59429c23fdc531baba002b7b23f5a4f2be0f29b2ecc5098f3df059da7", + "components/ts_webui/web/images/tslogo-32.png": "64e4bce72f2b13c81bef5b46ae919abeeb47f98571cf5e55460385880731810b", + "components/ts_webui/web/images/tslogo-48.png": "41f959e327dca63386a2f254b8a245a6fa151904a06eae93ae6c449277467f70", + "components/ts_webui/web/images/tslogo-512.png": "b7508585c46e16fcc7d42c52459ab55df32716aea85a10a560cd64de7cceb8e8", + "components/ts_webui/web/images/tslogo-64.png": "a0809405c5632eb4bf1f1b4783175c2b92b25fc522f5b0682a35d3cfa1c58752", + "components/ts_webui/web/images/tslogo-original.png": "9fb0ee8532c2d572d8b235f7586d225f00609cf8defb98b59cf55ae749e83ed1", + "components/ts_webui/web/index.html": "cb1baa1bfbd2fac00a5fc55caa5442da07ab83b99996af52a41fc5c7e6e98092", + "components/ts_webui/web/js/api.js": "6fb266abb3780a0d402d86ad95a3644b8e1f488136ad44dc18ddd83caaa8dab4", + "components/ts_webui/web/js/app.js": "ad63a38112eab45af87da091f3536156614db526bb85f2c83bafa7867439230b", + "components/ts_webui/web/js/dragSort.js": "7c5b9159cb8bb88b35222424db6d8bd822d3960899d5c090c17955700d6590af", + "components/ts_webui/web/js/i18n.js": "2eed1c54b4ef89bc2e4221a3fd900e88bd8d7a11064a04d97dcc3decfdeedbd8", + "components/ts_webui/web/js/lang/en-US.js": "58beed2b903407387d884c99f38eaef578e74be916175b53745d0d5ececadc10", + "components/ts_webui/web/js/lang/zh-CN.js": "bb3d3b4b28c8c146fdb1c437bee84862806ed915af8cc0aa2388deb6a9e9ef89", + "components/ts_webui/web/js/router.js": "1e73ca3bf272a54aea8c516809e09e10f257b620bf66311bbbe358693fe377d5", + "components/ts_webui/web/js/terminal.js": "6d93870c3b33b1888388f3a288cfca581a3034a2a212e1e4130853d1aceda581", + "dependencies.lock": "8829663e7e611b621579e0f8d27d10b3d80e9a969d167e875f7b78597399a482", + "docs/repair/ws-project-v3/baseline-console.c": "4b4edc6e2be0dfedda745d998232bafe99e12496d2ddb8af9f4bb04a5a1bb526", + "docs/repair/ws-project-v3/baseline-fixture.tar.gz": "46c8e84c0eab0da717f5755a43f2c6b1cc6aed9219018de38cd8fa27fb279608", + "docs/repair/ws-project-v3/baseline.tar.gz": "a7853d50f409423c086b7102d979c6b5a6cb1744dadb40b73de47e4390b46599", + "main/CMakeLists.txt": "c229d6b43e670fd75469edd541ad9ef51e0be3985b824ffe21e17cb8a006767c", + "main/idf_component.yml": "3f13a29a2b12e63ea4917315fa77f3481a0e26e976ffd90246312765105a4e58", + "main/main.c": "63dbd073aac40ae7ab31e92f2d52ad3f27c35fa71ade79f18c306f582bcaf40d", + "main/root_password_reset_main.c": "12d485ef6308067aaf112d8bcef71f09ba2ac60aa83a99d576635b102dadbd6c", + "main/ts_core_init.c": "ad9b89b44eef49a72117197da3e2d44a0a9ba73cbf5d1a4c7c6a7e123ea41e1f", + "main/ts_https_retry.h": "8237eca2d52e4424f9ba44674bf9202f93bd43c10f401446c17aabbcc2e5532a", + "main/ts_services.c": "697ae1b5d5472c60a93111ae21585ea23d7ccabce8e4f89b96e5982af10d7639", + "main/ts_services.h": "9631bcb3efdf01739163fde59553f50914da4eacbdb2f3f7eeb72e51a4c83c1b", + "sdkconfig": "1340e033b5865e39dd6b8c3516dffb27d01da5aff41127c69b583cbfb99acef0", + "sdkconfig.defaults": "153efe0e103cc3d7d3d6e330b931e2565a1dc92132af057b9caaf31d13c45d4e", + "tests/certificate/README.md": "7bf3264601fb4f4ae4cb66ecf7abbbeb6fd397e252fc8199d85bae154c2cec8d", + "tests/certificate/extract_lifecycle.py": "3504100b259375558fc0cd24511bd3467ebba6808c8ce9354f94b5889ea7589f", + "tests/certificate/generate_fixtures.py": "aabf3b99598eaa3c8c9e819ebbd216efbf31ccf1d775ad4df39651fa3c0dc91d", + "tests/certificate/run_host.sh": "3001b2faa766c3394e0cef4a5f6f6b09211d90efea23dc582d7d867844905982", + "tests/certificate/stubs/esp_err.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/esp_heap_caps.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/esp_http_server.h": "3b4e383c6b7f5e2f4325e900d489478f102fe12af0ee4a95edd61276ee49e626", + "tests/certificate/stubs/esp_https_server.h": "f9bccd26c2c5601e735a974931e3aa1d406f759c02fde1952584ab1d8a81a44b", + "tests/certificate/stubs/esp_log.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/esp_netif.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/esp_tls.h": "928ef7af73cf8b4fdbe9b851f3e062ba858fdfc6f1833e8a90dc5645e0ed60b9", + "tests/certificate/stubs/freertos/FreeRTOS.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/freertos/semphr.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/lwip/inet.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/nvs.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/nvs_flash.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/platform.h": "638ae2aa0b9bc57fed9f1e0659ea9f54a524c854d0300ec7f8c338422977b59e", + "tests/certificate/stubs/ts_core.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/ts_crypto.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/ts_event.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/stubs/ts_time_sync.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/certificate/test_api.c": "8ce88089c351c9cf03c43e2476c272fdfb8f15541e3afd78527177afd6ba21fe", + "tests/certificate/test_coordinator.c": "d4defab81ea03df0f914c0cdeb957201c5742c36b264a2c66c8f02bf9dfbd767", + "tests/certificate/test_lifecycle.c": "48ac2284a0197245c27037fb9406bb838c5e4b97e10835f8f861f6865752f11c", + "tests/certificate/test_material.c": "316499dd0a2424b0aab17d4e22b982ca0ae26101f5c21e050cff66a4a4b676d5", + "tests/certificate/test_service_stop.c": "ff3164f1846931e633d870634de8d4d6de8eebc5b94b703ad4b235ec8a7affbd", + "tests/certificate/test_service_stop.sh": "24848edbf13b1cd3624051748b11715b2ca11acc2b2dca709ce5342d11d8a8f0", + "tests/certificate/test_time_cancel.c": "ac166250ca51ed675329c05b533a025d10c8e4b808140e6c45b1c4bf5aba533b", + "tests/certificate/test_time_retry.c": "cf5892bb531da37e7b8d8177ce788efd9b20fc8617dbe3436d23fece8a392aba", + "tests/certificate/test_ui.cjs": "4223157b9cf73a7f0835a795c53951d0105947621709f3ab720bfbc77cfffa83", + "tests/prompts/README.md": "ae4c5e8cca1dae0c7ec4e54d51b58977a6e15a743fdedc32215111ddc4bd5b13", + "tests/prompts/browser.test.cjs": "59e7f77387e015d7d8b3ed926750f1fbf6328059d52b82bb79cbf973b590a1aa", + "tests/prompts/harness.cjs": "7c176507bb17c57abf22d73c5399b34cd8e221fb9663c4e5efe7ac3d168f944a", + "tests/prompts/ownership.browser.test.cjs": "1938411e7cc76ecc190b3469c58e58fd8aaa4a080ede60989190b4abd1147903", + "tests/prompts/package-lock.json": "8bef9925fb843348d3bf83eea1953314108e97f1db9c5972f4e8bf6741269a7a", + "tests/prompts/package.json": "180e0ffb285f1258b7a87ba2688e88c7c454ad7a4de3a9c56daa4c5346a7eae1", + "tests/prompts/project-cross.cjs": "7928610e031f5e0b6ad001f14f0dd5ac39f534dfea253108747f433ae5e92a76", + "tests/prompts/regression.test.cjs": "c372b74e125b361103defe66017c3eeb286fea9975cf4f3167ed5cf981050516", + "tests/prompts/static.test.cjs": "e8a08a747786a84efc6b976545e6d929ec3cf40278c0166b9bdb6b7a8fa810fe", + "tests/release/test_release.py": "e25d21c5d1a49c7c5045b43b70a8c2a58e7a7b0cd174cbd0de22260651a8063e", + "tests/runtime/README.md": "63b78f7e2b2dc6573fc02af35309ddc9b7fd70b359b5bf977051d9b907a58646", + "tests/runtime/extract_engine.py": "305506441b6015504934691dbc8c015d1a7261439ccad8ca36ce9e98cc554060", + "tests/runtime/run_all.sh": "e3020ad2de3b71a57add48332b7b001441f0a05c90fa9b27f3987bfd7360495d", + "tests/runtime/run_codec.sh": "b5aa59598d87f0e9f3828db781a7e37209bb85d343b30077c8aeedb65e54a7ca", + "tests/runtime/run_engine.sh": "f01b742ecdef37d53d704c7d71b1bc3da08d5cb94995e4e9d41bf89f6d51d7ce", + "tests/runtime/run_log.sh": "bb93124e157753f0c625392895b9e2c4123150d4822163d52ec7cef1287e992b", + "tests/runtime/run_service_watch.sh": "1abbbf9c0a3663b0384a907afccbb232721ace5eb52bc808eb9e62a7f6f186b1", + "tests/runtime/run_ssh.sh": "195c42d63b8fffd628d351f511bd577b2669af4279a0a393cc6975ae9fda3fa0", + "tests/runtime/run_store.sh": "5318c61a4fbb3481af4c945cda4cff1a220ab713d872cb24f54cb60705f328b3", + "tests/runtime/ssh_stubs/esp_timer.h": "82a7c14acf5d1cdcbea1b23bab880c69562da88013adc34ff5f2ae2115fb08d1", + "tests/runtime/ssh_stubs/freertos/FreeRTOS.h": "b3adf106d95b8934f690943f2921308b90be5b766c4c8ba250c792de56400201", + "tests/runtime/ssh_stubs/freertos/task.h": "b3adf106d95b8934f690943f2921308b90be5b766c4c8ba250c792de56400201", + "tests/runtime/ssh_stubs/ts_core.h": "12b3fb536445082148e1e0e99bf14fc2b5c543ec212c725a904007210fb6b5b1", + "tests/runtime/state_stubs/esp_err.h": "568bb564e6e567e055990894741eb97246bc07eea4754eb0bd1985c455ef9f1a", + "tests/runtime/state_stubs/freertos/FreeRTOS.h": "5320da8cd50f171f0cf9ed5578748f5d0bf1485bacc2bd25e7ee01fd9fbd3dbc", + "tests/runtime/state_stubs/freertos/semphr.h": "12824e4dc80489b9e8f6205400dd8690c817a599b67ea049b1316459889d35d1", + "tests/runtime/state_stubs/freertos/task.h": "3861b64b31ed63d72e09b26fb04394804c5a3edb45c32e1837f8ed39a39a2a29", + "tests/runtime/stubs/esp_heap_caps.h": "ae408378b6f415e879e2530ecb9e64aa304b76957cd5726f9c54cd672e7d2d39", + "tests/runtime/stubs/nvs.h": "260376fc612ee376562a83298df57771766c77c7e9dc51882ac105708f0b3834", + "tests/runtime/test_codec.c": "63fe28470a7893797d68310d37531200f41d840cc08a5a0213e78bd8ee307e64", + "tests/runtime/test_completion.py": "ebd2b5d936019196aa390190d0c063b1c33a73a9eb309d88b39471ea198b74c2", + "tests/runtime/test_configuration_protocol.py": "e57b3e83ef08b5ee75ea2dc63427c39e0d14163bb9e1cb8f278adad863d605b2", + "tests/runtime/test_engine.c": "22c8d14d18a5ecda0148ed5594ef2300bbcb0bb14c478eda1677510a4d7c5994", + "tests/runtime/test_log.c": "b25800aa17328586173e1e8662e71bac0fa9d6db1671942d68e99d01a6fb631a", + "tests/runtime/test_probe.py": "326504cc98b3e50e3433608f5b80d7f4cbff9066d6d6da48042b199eb9817edf", + "tests/runtime/test_rule_reload.py": "8999ff799c246ab5d2d7e67fc177239e5c19c39b28e8c2048f966ba83d674c6a", + "tests/runtime/test_service_protocol.c": "5e9783aa45015e5d86772073524ea7f7b51da4f0886efd65f12fc8bc93a1c6bf", + "tests/runtime/test_service_watch.c": "74f127b262ad52bb8479886a30d491e17c88c0511dddcbed4de26aeb7e6525aa", + "tests/runtime/test_ssh.c": "a031d28bb3921301ec5e22093700dc50a0ba16225743b686792eccb390cf5bb6", + "tests/runtime/test_stop_protocol.py": "67a64d27d74c91b66ac045febc0b7b165dd17612544587ecef738d60cb0dd727", + "tests/runtime/test_store.c": "cf54744603a08dfb940a79654a7a6ef47d67fe8eff438b69dbf6cf53820b0f37", + "tests/runtime/test_ui.cjs": "92ad6bee1264fc7822f953a979ca0ba1f32a0f9d3c5338ccf765f2d2776379c4", + "tests/ws_subscriptions/README.md": "e2a186d0cc38c5a2df86207cde9f371365b95e678908b15943a7556fe57e5ada", + "tests/ws_subscriptions/baseline_operation_adapter.c": "0b0703b144fa8fc7d412110e55b4d7d2010196e9422deb78ff00185059a5af05", + "tests/ws_subscriptions/measure_project_v3.py": "ee2d07f747bef0acdb64a8479b8aa7bba8dcd7d0f63c7d9d0cb5fa63c9fde1e4", + "tests/ws_subscriptions/project_driver.inc": "f114c2259edf06a8e7d1693d01c500ef52c7cc3be33796610dccfe18f8820234", + "tests/ws_subscriptions/project_stubs/ts_core.h": "8f68e35b813b7df0619258a88d000993d7e5b17174fd48b23057fdc23562a900", + "tests/ws_subscriptions/replay_control_baseline.py": "aefd5ff8bc6ced036c9fec466bef70bddb8b66949b4eed3994cdd109fe2f255f", + "tests/ws_subscriptions/replay_operation_baseline.py": "ba26a739d9dfb4b30b4e10ac0b3955994738820b85a156406dcaaa9518382cc3", + "tests/ws_subscriptions/replay_project_baseline.py": "aa1886bcbcdcdb189d751e2b7486324926a1ca82a525010d75b304263bb2a828", + "tests/ws_subscriptions/run_baseline.sh": "2b5a8288cc2d94276588589eea6b45b8fb028fbb93c5911efff668b8d7d953c0", + "tests/ws_subscriptions/run_control.sh": "e2853acc8652b99dfccca85d25425b870996e7bfcb03a5cfe021b76e66d0139e", + "tests/ws_subscriptions/run_f1_f2.sh": "8e804b7a5c66663a62da53f9027b175722034e5cce77ba152aba8ad13b527935", + "tests/ws_subscriptions/run_host.sh": "2a1aee658ec0c45fb94163d9671f72579cf8f15fb36532aeef4a5f1d4bfd90f9", + "tests/ws_subscriptions/run_operation.sh": "bf9d6db03b483d4b74db26e464efc73b673648ef82565edf987e6f275c9ee6c5", + "tests/ws_subscriptions/run_operation_adapter.sh": "1a5b900b4c6aae1619b86a285b6371a683263304db90a81d82477d8fb750d3f5", + "tests/ws_subscriptions/run_project_bridge.sh": "ae17f7a34e725e283652aaff12544b2d80d6b1a80baf6c49ec3ec520e5b5a35f", + "tests/ws_subscriptions/run_project_v3.py": "d7547e29d4da73cf644e5e26330e6c4467c7e424f77bed3c8d7c90945ff4c82d", + "tests/ws_subscriptions/run_reviewer.sh": "2a957bb5d4e0ca0c357ec32fffb23aa60c75019b60cc4c5c33d468d389013ea8", + "tests/ws_subscriptions/run_reviewer_baseline.sh": "6ea73543f64c6de65f59480300cf2d73ece85b798a7a430df5b55f2adae1bb96", + "tests/ws_subscriptions/run_shell_driver.sh": "a689485f668d9c11cb2ecd3b9274b2ceabc0fc6a791cffffcfa923733c70bd19", + "tests/ws_subscriptions/stubs/esp_console.h": "f97fca9ebf2a497277d9ac5af3581a2e83789b4acf3e8b125e0f36fb27210151", + "tests/ws_subscriptions/stubs/esp_err.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_heap_caps.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_http_server.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_log.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/esp_timer.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/FreeRTOS.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/queue.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/semphr.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/task.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/freertos/timers.h": "fd6abec4a547b6e9caed8f0514a08ead4223303736dade89179bb8812a2a5d94", + "tests/ws_subscriptions/stubs/platform.h": "de005401b26f9dce9028db4bbc656ea72e55730535769be4ddf31ccec072c2dc", + "tests/ws_subscriptions/stubs/ts_api.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/ts_event.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/ts_log.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/stubs/ts_webui.h": "f7223107a5221902365ce989ae1b9483cef3925e75c0f739e439a4ed432875cc", + "tests/ws_subscriptions/test_baseline.c": "1197573bdf34c4bb7d2aa86f9742ae568199db3a6927211081251345c5070442", + "tests/ws_subscriptions/test_control.c": "7e70ad841a86f6c39a1274f715502991e37c7aa1b7802f7b3dcf805a6aa7d917", + "tests/ws_subscriptions/test_event.c": "88273dfb16120f29254912729dbceb9cefe025902b5d8e1fb4602f5b09500636", + "tests/ws_subscriptions/test_f1_f2.c": "7d4907e42f3a9c7110055acb6ca667abd62a5f16712306c7dde6b85ec285c9b4", + "tests/ws_subscriptions/test_init.c": "49b7ade237c4fe5df5fe683f4ec731c222cc4939b91b19d976471e99d29173c7", + "tests/ws_subscriptions/test_lifecycle.c": "187359b892e11b98d3491f3ee60aac5cda9e157c65fbd262fe0fe466d5f943d3", + "tests/ws_subscriptions/test_manager.c": "a1b46f3ad3a877a5cfd1235e7253418aec965c442a5c21ab811a68f1e70be8cd", + "tests/ws_subscriptions/test_operation.c": "c28fd00d191f92bbe8722033a3dbf5d7c6bcc54e054c06acff4429fce149a4e6", + "tests/ws_subscriptions/test_operation_adapter.c": "26c0101af525910b184b076a9fc849d237c0072455fb7883db11d5cf18bb1cb8", + "tests/ws_subscriptions/test_project.c": "c8026c5105688edfe0e06e502bddcd7e44fcafb2def960bec53d773b6135e675", + "tests/ws_subscriptions/test_reviewer.c": "65916f6af7fb3fe00d00bf6999a55f441422b35d4d95b3f801d9cb9b0f591c54", + "tests/ws_subscriptions/test_reviewer_core.c": "7669567ad82171ae32102779e4fc98c4b88871f9e9f761600a21623378882ef2", + "tests/ws_subscriptions/test_reviewer_http.c": "2b9696ac9dd86be96db383392d3bcf61f81a5ab2e881933d767aad8f91d30c00", + "tests/ws_subscriptions/test_reviewer_service.c": "3fa82db0882b90d69450ddcd7a50e5904ae60e2cab8e62ea11656ac4c21e2890", + "tests/ws_subscriptions/test_shell_driver.c": "629ccb086c696e74b65c7ec7054022d65e2c6891cb8af246d9438b2fffd0f547", + "tests/ws_subscriptions/verify_project_assets.py": "0ed7406a6927115f4574187158e53bd085d6cf3afc2962254c62133c839c9c43", + "tools/bdf2fnt.py": "dc156a74f206b95efd2eb5887251c55ef9c41b85330240fe2615231ddb084ca1", + "tools/build.sh": "2cb7ce21128f336eccbb75fc553341a34bf3ef3e65e4f5b99c5b09b476703466", + "tools/build_root_reset.sh": "2a59ab3eb5ae0d075ee9bf3f17582fb779c9f39c6814969bf99ded81fbf4202f", + "tools/check_release.py": "4a3a7c34bd1a0c67e9ed8d38e7daf53feb73b289826260af09fd20704d2c4d05", + "tools/gen_version.py": "92c1db10137f2e2ef8ffde87a8143e25a8bef1ab89b939a911b2ed1bdb7f650d", + "tools/minify_web.py": "34e84dee8c141abbbc130956aa089df01ab3df78251bc89f66f8177cf2f619e7", + "tools/ota_server/README.md": "649596da0058c8bd7dce3388161711183e53078f3ac82401278f7f44c4d4e290", + "tools/ota_server/ota_server.py": "9a3c8826315fababa41b20f4f7c8ad37e3f7e507cf3633d0b5c15abc8df78356", + "tools/ota_server/ota_service.sh": "1b5145c396c94629a1605efd3dfc7ca34941a0d182327b09a168a31495972d5d", + "tools/ota_server/requirements.txt": "4dc664dd1442dea748a7c57a4645d2f0d7d4d0b7b9c9353f628c1cf1e8a6bb2e", + "tools/ota_server/start.sh": "d91b14128fe69285848c02aa42b141a3c3c958c6743c42ca2c8e48f8bb50bdb6", + "tools/ota_server/tianshan-ota.service": "f51c57579dc4e9c5bada13fb5476e9f0d7a9c8777c92278cfe5caabb9e900432", + "tools/pki-server/.env.example": "1d72a9b1c85627ebe631e709eecbf1b8c2408afddb404e0c30113a5f837470e0", + "tools/pki-server/.gitignore": "edc02d8bd09f62823287a0f4c1f90c003838d875810ba6705ba5ab70ef643643", + "tools/pki-server/README.md": "acc80cf8d621a3b1dbd4605e4a8d8d580cfe9111957e6224c0545ae578585aad", + "tools/pki-server/app/__init__.py": "d6e959bfc8628a76e60f18377a176c3c201b55d0d42c4d068d43c353f077417d", + "tools/pki-server/app/ca.py": "fc3ac5216f92393647f25f95b881e423e9cdfa0ee5272c1b8f93ae45d66f9f90", + "tools/pki-server/app/config.py": "afc6635c27892a257dbcd1bf9b815fa7353654d5d11a483a2b79cfd0c9c09c94", + "tools/pki-server/app/database.py": "80355d2a94962a2ef36c27c719f543dd8f7094554a01aca8d3b85041781546a3", + "tools/pki-server/app/main.py": "43b93ec82f7ba9aaa9589e25a0ab0576e74eb00b28e8b9fc842ee1ae4f524dd0", + "tools/pki-server/app/models.py": "b38b398d22b4ed6bd1796c461e29dbf3e538aba4b601e9725214f988ccd2ded3", + "tools/pki-server/requirements.txt": "8ccad71c5aefadd47d5b9aed26b9ef339ab64c815681e702c270328984f841b1", + "tools/pki-server/run.py": "46fa2c73203879a8079c32e52ece0a2d146a7c2ee502ecbee9a0ea40b998ceb3", + "tools/pki-server/static/.gitkeep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "tools/pki-server/templates/index.html": "4bf66c95d18289512f20c27e124b01d5d42de90ae86473f471e9bbbb63ab9f91", + "tools/pki-server/templates/login.html": "0a15f2e1a947ba11e9316f046830152178f3d4fe5f55561399a2f671c09ecd9f", + "tools/version.py": "15ce939bf632dfd2ce006a46cc8e31f9186215dbc824f6ba4a07ebfd9bee5315" + } +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/impact-contract.md b/docs/repair/ws-project-v3/impact-contract.md new file mode 100644 index 0000000..6664eae --- /dev/null +++ b/docs/repair/ws-project-v3/impact-contract.md @@ -0,0 +1,39 @@ +# v3 项目影响及端到端契约(先于实施建立) + +本轮基线/PR head 568b871;PR base d6ed947,main。只本地修改测试编译,现有三项未跟踪目录/文件保留。累计 PR 差异见 cumulative-files.txt,不把目标分支旧缺陷当本轮反例。 + +## 功能与依赖覆盖 + +| 链 | 真实入口和消费者 | 本轮覆盖与理由 | +|---|---|---| +| Shell/普通终端 | router /terminal -> WebTerminal -> /ws ws_handler -> SSH control/terminal handler -> operation/TX -> terminal.js handleMessage/handleSshStatus -> 下一次 onData/exit/restore | 深入。请求 error 与 ssh_status:error 的副作用冲突,模式、提示符、输入和恢复需双向验证 | +| Exec/自动化 | /commands、/automation -> ssh.exec_stream/cancel -> executor -> ts_ssh_client -> match/variables -> app.js handleSshExecMessage;rule/action manager、service/log watch | 保留本轮前状态/取消/匹配;控制与生命周期全套,runtime 检查真正 driver 的取消/总deadline | +| Shell 下层/CLI | ts_webui_ws 与 ts_cmd_ssh -> ts_ssh_shell open/read/write/run/poll/close -> ts_ssh_client disconnect/destroy -> libssh2 | 深入。0 字节不是 EOF、非 RUNNING close 泄漏、EAGAIN 无限等待直接妨碍错误分类与 stop。组合测试不得 stub close/free | +| 遥测、日志、保护 | dashboard/widgets -> api.js subscriptions -> manager -> TX;power event 全局广播、terminal 角色/log level | 相邻共享 TX/角色回归,保护配额、公平性、旧日志代次不改变 | +| 停止销毁 | ts_webui/service/HTTP/HTTPS -> ws_stop -> creators/producers/event/log/worker/timer/TX drain | 深入相关 shell cleanup;R1/R4 及证书生命周期套件覆盖共享依赖 | +| 保存/证书/文件 | router 配置、security/pki/files -> api.js request/requireApiSuccess -> API/service -> app.js | 共享 API 帮助函数不修改;运行时、证书和全部提示 Node/Chrome 回归 | +| 其余硬件/网络/LED/风扇/电源页面 | router.register、app loader、ts_api 注册及 main/ts_services.c 服务注册 | 本轮不改硬件/API策略,保留 host/浏览器冒烟;不宣称硬件验证 | +| 发布物 | ts_webui CMake WEB_ALL_FILES -> web_optimized/minify/gzip -> www.bin;HTTP 静态 no-cache index + immutable JS | cache key 配套更新,核对原始/压缩/产物;版本/工作流不变,release 测试保留 | + +## 消息与用户行为 + +| 事实 | 生产条件/对象 | 兼容消息/接收者 | 前端状态与下一动作 | 资源 | +|---|---|---|---|---| +| 单次请求拒绝/可恢复控制错误 | 非 owner、参数、unsupported、明确可恢复下层错误;实际请求 peer | 既有 type:error,message,只给请求者;不借 ssh_status:error 伪造终态 | SSH active 保持 SSH route,不写本地prompt、不恢复、不重发;connecting 无 active 时结束当前失败尝试;普通终端保留原恢复契约 | 请求 borrower 退出,不关闭有效 op | +| 新启动拒绝 | 参数、另一个 op、容量、创建资源失败 | 请求级 error;已有 active 不变,真正 waiting attempt 返回 local | 只清本次 connecting;可手动重试;不抢别人会话 | 未接受 op discard 或不创建 | +| 创建后真实启动失败 | 原 op connect/shell open/readiness failure | 原 op ssh_status:error(唯一终态) | 清对应 SSH,恢复本地终端路由;无自动命令重放 | v2 close/settle/cleanup | +| 正常退出/真实 EOF | 原 poller/服务 owner | 原 op disconnecting 非终态、closed 终态 | disconnecting 仍等待关闭,不提前写本地prompt;closed 可回到本地 | 票据/投递先结算,真实下层对象释放 | +| 致命 write/read/resize 或不确定写入 | 原 driver state ERROR/CLOSED,部分写或 deadline 不能安全重放 | 原 op ssh_status:error,说明远端结果不确定 | 退出该观察/会话,下一步手动检查/重连;不重发输入 | 有界下层 close,保持原 v2 资源协议 | +| 输出观察失败 | TX done -> 原 op failed | v2 fallback ssh_status:error / ssh_exec_error | Shell 退出观察;Exec 业务不自动取消 | 原引用/终态不改 | +| Exec 取消/业务结果 | 现有 exact ID/first cause/business end | 原 cancel/done/error | app.js 既有身份匹配、不确定提示 | 原 executor/timer/结果排空不变 | +| stopping / 普通终端错误 | 原 WS admission / terminal handler | 既有 error | active SSH 错误不切 local;普通 terminal 的 Not a terminal session 恢复保留,仅 local 模式可触发 | 不重开新业务,不递归提示 | + +公共 ssh_request_error 的调用点分为 connect 参数/准入/分配和四控制入口;不会全局改终态 helper ssh_close、startup statuses 或 operation fallback。通用 error 消费点为 terminal.js;真实状态是路由依据,不新增按英文/中文文本识别 SSH 生命周期。已有 Not a terminal session 兼容恢复只保留普通终端上下文。app.js 的 Exec 消费者不复用该 Shell 路由。 + +前端所有 socket 回调、重连/恢复 timer 和销毁绑定当前 socket/实例;旧 socket onclose/onmessage 不能污染新连接。WS 关闭清掉 SSH mode,重新连接只启动本地 terminal,不重放远端 connect/command。 + +协议类型字段保持:error 本就是请求错误,ssh_status:error 为已接受操作的终态;本轮更新消费者副作用以匹配这一区分。旧固件会把请求错误发为终态,新页面不能安全猜测旧帧;支持同一构建固件+www、刷新并重连,不声称混合版本全兼容。保留同连接 Shell 缺操作ID边界。 + +## 反向审查补充的同链依赖 + +CLI `shell_input_callback` 的 Ctrl+\ 仅登记 console interrupt,原 run 不观察;纠正零字节 EOF 后必须同时兑现用户退出。采用现有驱动状态上的 `ts_ssh_shell_request_close`,仅改变本地循环,不释放句柄、不代表远端已停止。CLI 原 owner 继续 close/disconnect/destroy,WebUI 继续原 op 关闭入口。真实 CLI 回调编译组合测试与独立 baseline-cli-exit 反例覆盖。 diff --git a/docs/repair/ws-project-v3/optimized-results/browser.json b/docs/repair/ws-project-v3/optimized-results/browser.json new file mode 100644 index 0000000..a3ad5bd --- /dev/null +++ b/docs/repair/ws-project-v3/optimized-results/browser.json @@ -0,0 +1,31 @@ +[ + { + "name": "browser", + "command": [ + "npm", + "run", + "test:browser", + "--prefix", + "tests/prompts" + ], + "exit": 0 + }, + { + "name": "cross-browser-en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + }, + { + "name": "cross-browser-zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ws-project-v3/optimized-results/browser.log b/docs/repair/ws-project-v3/optimized-results/browser.log new file mode 100644 index 0000000..31d53bc --- /dev/null +++ b/docs/repair/ws-project-v3/optimized-results/browser.log @@ -0,0 +1,56 @@ + +> test:browser +> cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs + +✔ zh-CN: real index cold start, safe toast/file text, current websocket state (787.428042ms) +✔ zh-CN: initial language failure blocks controls and retry recovers (349.116875ms) +✔ en-US: real index cold start, safe toast/file text, current websocket state (383.910375ms) +✔ en-US: initial language failure blocks controls and retry recovers (401.842708ms) +✔ delayed language package and rapid switches keep the latest requested language (348.494791ms) +✔ terminal resource failure presents retry; a rejected cached promise is not reused (489.072667ms) +✔ zh-CN: package confirmation treats names as text and applies only on explicit verified action (329.183375ms) +✔ en-US: package confirmation treats names as text and applies only on explicit verified action (403.808042ms) +✔ initial delayed language keeps controls inert until the real package arrives (370.800083ms) +✔ failed language switch preserves the loaded language; retry clears failure and stale toast (434.553792ms) +✔ terminal can initialize after failed resource load using newly served resources (432.639167ms) +{"case":"successful retry","language":"zh-CN","failure":"/sdcard/a.tscfg: 应用失败: 设备处理请求时发生错误,请查看详细原因。\n详细原因:fixture failure","afterSuccess":"/sdcard/a.tscfg: 配置包已应用。","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure zh-CN (815.186ms) +{"case":"late completion","language":"zh-CN","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: 正在应用配置...","errors":[]} +✔ review2: prior completion closes new package confirmation zh-CN (282.880042ms) +{"case":"stale file list","language":"zh-CN","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close zh-CN (282.666375ms) +{"case":"successful retry","language":"en-US","failure":"/sdcard/a.tscfg: Apply failed: The device encountered an error while processing the request. See the details below.\nDetails: fixture failure","afterSuccess":"/sdcard/a.tscfg: The configuration package was applied.","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure en-US (321.934167ms) +{"case":"late completion","language":"en-US","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: Applying config...","errors":[]} +✔ review2: prior completion closes new package confirmation en-US (303.012958ms) +{"case":"stale file list","language":"en-US","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close en-US (357.993833ms) +✔ R1: endpoint-specific logout and HTTP errors zh-CN (226.695334ms) +✔ R3: late validation cannot revive an old apply entry zh-CN (203.878709ms) +✔ R3: previously opened confirmation loses validity on reupload zh-CN (228.214042ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts zh-CN (245.214375ms) +✔ R6: fixed upload destination and separate refresh failure zh-CN (220.98825ms) +✔ R6: out-of-order directory success and error do not replace latest list zh-CN (266.538083ms) +✔ R1: endpoint-specific logout and HTTP errors en-US (306.436666ms) +✔ R3: late validation cannot revive an old apply entry en-US (313.097333ms) +✔ R3: previously opened confirmation loses validity on reupload en-US (266.622042ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts en-US (235.827459ms) +✔ R6: fixed upload destination and separate refresh failure en-US (250.113167ms) +✔ R6: out-of-order directory success and error do not replace latest list en-US (243.153708ms) +✔ R2: authenticated startup initializes once (278.597625ms) +✔ R2: obsolete system loader cannot update new page; failed navigation retries (403.263042ms) +✔ R4/R5: newest result wins over late success and late failure (221.988833ms) +✔ R3: overlapping writes to one path cannot claim current verified content (239.142834ms) +✔ R2: disposed page only removes its dashboard callback (257.872375ms) +✔ R2: stale finally cannot unlock the new page read (232.894542ms) +✔ R1: delayed sign-out does not clear a newer sign-in (213.767084ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements zh-CN (298.448541ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements en-US (342.619ms) +ℹ tests 38 +ℹ suites 0 +ℹ pass 38 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 8291.951292 diff --git a/docs/repair/ws-project-v3/optimized-results/cross-browser-en-US.json b/docs/repair/ws-project-v3/optimized-results/cross-browser-en-US.json new file mode 100644 index 0000000..c68e2d7 --- /dev/null +++ b/docs/repair/ws-project-v3/optimized-results/cross-browser-en-US.json @@ -0,0 +1,714 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "state": 0, + "writes": 1, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 5, + "writes": 3, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "state": 0, + "writes": 3, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/optimized-results/cross-browser-en-US.log b/docs/repair/ws-project-v3/optimized-results/cross-browser-en-US.log new file mode 100644 index 0000000..238358d --- /dev/null +++ b/docs/repair/ws-project-v3/optimized-results/cross-browser-en-US.log @@ -0,0 +1 @@ +PASS Chrome en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-project-v3/optimized-results/cross-browser-zh-CN.json b/docs/repair/ws-project-v3/optimized-results/cross-browser-zh-CN.json new file mode 100644 index 0000000..c68e2d7 --- /dev/null +++ b/docs/repair/ws-project-v3/optimized-results/cross-browser-zh-CN.json @@ -0,0 +1,714 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "state": 0, + "writes": 1, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 5, + "writes": 3, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "state": 0, + "writes": 3, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/optimized-results/cross-browser-zh-CN.log b/docs/repair/ws-project-v3/optimized-results/cross-browser-zh-CN.log new file mode 100644 index 0000000..e4df6f9 --- /dev/null +++ b/docs/repair/ws-project-v3/optimized-results/cross-browser-zh-CN.log @@ -0,0 +1 @@ +PASS Chrome zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-project-v3/publication-control.txt b/docs/repair/ws-project-v3/publication-control.txt new file mode 100644 index 0000000..4a2046f --- /dev/null +++ b/docs/repair/ws-project-v3/publication-control.txt @@ -0,0 +1,5 @@ +PASS actual WS controls: all four foreign controls rejected, owner controls work; borrowed original pinned, fd/epoch/server reuse and late close isolated; owner stop drains +PASS accepted cancellation persists through task/key/create/connect/auth; cancel/submit claim both orders and result freeze tested; duplicate/old/zero IDs isolated +PASS USER/TIMEOUT/MATCH keep distinct results; service stop busy does not cancel business, accepted user intent survives stop retry and all resource ledgers drain +PASS output failure seals observation without cancelling business; later explicit cancel still reaches original executor without rewriting terminal; earlier timeout retains reason +PASS actual ssh.cancel API exact-ID validation and accepted-intent response; ended operations reject without wildcard control diff --git a/docs/repair/ws-project-v3/publication-cross.txt b/docs/repair/ws-project-v3/publication-cross.txt new file mode 100644 index 0000000..8f47257 --- /dev/null +++ b/docs/repair/ws-project-v3/publication-cross.txt @@ -0,0 +1 @@ +PASS Node en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-project-v3/publication-gate.md b/docs/repair/ws-project-v3/publication-gate.md new file mode 100644 index 0000000..b417061 --- /dev/null +++ b/docs/repair/ws-project-v3/publication-gate.md @@ -0,0 +1,16 @@ +# v3 提交前独立审查 + +结论:可以推送,范围限已验证的本地修改。用户在实施交付后明确授权更新 PR #42。 + +当前基线与 PR head 同为 568b871,原 Fork 分支 fix/v0.5.2-reliability-and-prompts。以追加提交更新,不重写历史,不合并或发布。 + +审查依据:最终 runtime diff、实际下层 EOF/释放、四控制入口、请求/终态分类、JS 消费及后续输入、冻结反例、完整验证记录。843 项最终输入哈希无变化;v2 controller、TX 与采集预算保持。未发现本轮明确的阻断问题。 + +本次提交前重新执行: +- run_shell_driver.sh:真实驱动 EOF、部分写、EAGAIN、CLI 原输入回调、资源释放和停止重试通过(publication-shell.txt)。 +- node tests/prompts/project-cross.cjs:真实最终 C 字节经生产 JS,再进入下一次 C 请求通过(publication-cross.txt)。 +- run_control.sh:原 peer/ID 归属、取消各阶段、原因区分和停止交错通过(publication-control.txt)。 + +同一输入哈希的完整主机套件、中英文 Chrome、构建后消费者及 ESP-IDF v5.5.2 独立目录编译保留实施阶段证据,本次没有重复完整编译和所有浏览器测试。证据快照与 patch 保留历史空格;源码及测试差异单独做 whitespace 检查。 + +无关 output/、tmp/ 与 runtime-repair 未跟踪文件排除;不修改版本、发布工作流、硬件保护及匹配规则。真实设备、双核调度和网络性能仍未验收;完整 peer 不解决同连接缺少操作 ID;发送成功不是浏览器 ACK。新增 C 回归尚未接入 CI,远端只能据新 head 的实际检查报告状态。 diff --git a/docs/repair/ws-project-v3/publication-shell.txt b/docs/repair/ws-project-v3/publication-shell.txt new file mode 100644 index 0000000..b96e08c --- /dev/null +++ b/docs/repair/ws-project-v3/publication-shell.txt @@ -0,0 +1,6 @@ +PASS real Shell+client: zero data is not EOF; EOF then close releases wrapper/channel/session/socket; close callback exactly once +PASS real Shell+client: fatal write/timeout retires channel; persistent close EAGAIN falls back to local session teardown without waiting +PASS real Shell+client: partial initialization/open/PTY/shell-start failure and bounded EAGAIN all release owned resources +PASS Shell run: local exit requested by input callback stops before another network read; close still owns cleanup +PASS actual WebUI cleanup twice uses cleared handles; original operation/ticket/target and actual lower resources drain +PASS real lower resources survive stop timeout; accepted output and terminal drain on retry with no new business message diff --git a/docs/repair/ws-project-v3/registries.txt b/docs/repair/ws-project-v3/registries.txt new file mode 100644 index 0000000..eef5301 --- /dev/null +++ b/docs/repair/ws-project-v3/registries.txt @@ -0,0 +1,68 @@ +main/ts_services.c:627: esp_err_t ret = ts_api_register_all(); +main/ts_services.c:1032: .name = "hal", +main/ts_services.c:1044: .name = "storage", +main/ts_services.c:1056: .name = "led", +main/ts_services.c:1068: .name = "drivers", +main/ts_services.c:1080: .name = "power", +main/ts_services.c:1092: .name = "network", +main/ts_services.c:1104: .name = "security", +main/ts_services.c:1116: .name = "api", +main/ts_services.c:1128: .name = "https", +main/ts_services.c:1140: .name = "webui", +main/ts_services.c:1152: .name = "console", +main/ts_services.c:1164: .name = "automation", +main/ts_services.c:1186: ret = ts_service_register(&s_hal_service_def, &s_hal_handle); +main/ts_services.c:1194: ret = ts_service_register(&s_storage_service_def, &s_storage_handle); +main/ts_services.c:1202: ret = ts_service_register(&s_led_service_def, &s_led_handle); +main/ts_services.c:1210: ret = ts_service_register(&s_drivers_service_def, &s_drivers_handle); +main/ts_services.c:1218: ret = ts_service_register(&s_power_service_def, &s_power_handle); +main/ts_services.c:1226: ret = ts_service_register(&s_network_service_def, &s_network_handle); +main/ts_services.c:1234: ret = ts_service_register(&s_security_service_def, &s_security_handle); +main/ts_services.c:1242: ret = ts_service_register(&s_api_service_def, &s_api_handle); +main/ts_services.c:1250: ret = ts_service_register(&s_https_service_def, &s_https_handle); +main/ts_services.c:1258: ret = ts_service_register(&s_webui_service_def, &s_webui_handle); +main/ts_services.c:1266: ret = ts_service_register(&s_console_service_def, &s_console_handle); +main/ts_services.c:1274: ret = ts_service_register(&s_automation_service_def, &s_automation_handle); +components/ts_webui/src/ts_webui_ws.c:990: .uri = "/ws", +components/ts_api/src/ts_api_ssh.c:2415: .name = "ssh.exec", +components/ts_api/src/ts_api_ssh.c:2422: .name = "ssh.exec_stream", +components/ts_api/src/ts_api_ssh.c:2429: .name = "ssh.cancel", +components/ts_api/src/ts_api_ssh.c:2436: .name = "ssh.test", +components/ts_api/src/ts_api_ssh.c:2443: .name = "ssh.copyid", +components/ts_api/src/ts_api_ssh.c:2450: .name = "ssh.revoke", +components/ts_api/src/ts_api_ssh.c:2457: .name = "ssh.keygen", +components/ts_api/src/ts_api_ssh.c:2465: .name = "ssh.hosts.list", +components/ts_api/src/ts_api_ssh.c:2472: .name = "ssh.hosts.add", +components/ts_api/src/ts_api_ssh.c:2479: .name = "ssh.hosts.remove", +components/ts_api/src/ts_api_ssh.c:2486: .name = "ssh.hosts.get", +components/ts_api/src/ts_api_ssh.c:2493: .name = "ssh.hosts.export", +components/ts_api/src/ts_api_ssh.c:2500: .name = "ssh.hosts.import", +components/ts_api/src/ts_api_ssh.c:2508: .name = "ssh.commands.list", +components/ts_api/src/ts_api_ssh.c:2515: .name = "ssh.commands.add", +components/ts_api/src/ts_api_ssh.c:2522: .name = "ssh.commands.remove", +components/ts_api/src/ts_api_ssh.c:2529: .name = "ssh.commands.get", +components/ts_api/src/ts_api_ssh.c:2536: .name = "ssh.commands.export", +components/ts_api/src/ts_api_ssh.c:2543: .name = "ssh.commands.import", +components/ts_api/src/ts_api_ssh.c:2554: return ts_api_register_multiple(ssh_endpoints, +components/ts_webui/web/js/app.js:175: router.register('/', loadSystemPage); +components/ts_webui/web/js/app.js:176: router.register('/system', loadSystemPage); +components/ts_webui/web/js/app.js:177: router.register('/network', loadNetworkPage); +components/ts_webui/web/js/app.js:178: router.register('/ota', loadOtaPage); +components/ts_webui/web/js/app.js:179: router.register('/files', loadFilesPage); +components/ts_webui/web/js/app.js:181: router.register('/logs', () => { +components/ts_webui/web/js/app.js:189: router.register('/terminal', loadTerminalPage); +components/ts_webui/web/js/app.js:190: router.register('/commands', loadCommandsPage); +components/ts_webui/web/js/app.js:191: router.register('/security', loadSecurityPage); +components/ts_webui/web/js/app.js:192: router.register('/automation', loadAutomationPage); +components/ts_webui/web/js/app.js:2034: if (selectedName && !availableTempVars.find(v => v.name === selectedName)) { +components/ts_webui/web/js/app.js:2068: tempVarBindings[index].name = name; +components/ts_webui/web/js/app.js:2110: const varInfo = availableTempVars.find(v => v.name === b.name); +components/ts_webui/web/js/app.js:2431: let existing = availableTempVars.find(v => v.name === bv.name); +components/ts_webui/web/js/app.js:2870: if (result.data.devices.some(d => d.name === 'matrix' || d.layout === 'matrix')) { +components/ts_webui/web/js/app.js:5169: if (result.data.devices.some(d => d.name === 'matrix' || d.layout === 'matrix')) { +components/ts_webui/web/js/app.js:5202: const isMatrix = dev.name === 'matrix' || dev.layout === 'matrix'; +components/ts_webui/web/js/app.js:5430: const deviceData = window.ledDevicesCache?.find(d => d.name === device); +components/ts_webui/web/js/app.js:5514: const deviceData = window.ledDevicesCache?.find(d => d.name === device); +components/ts_webui/web/js/app.js:5976: const deviceData = window.ledDevicesCache?.find(d => d.name === device); +components/ts_webui/web/js/app.js:16116: const firmware = files.find(entry => entry.name === 'TianShanOS.bin') || +components/ts_webui/web/js/app.js:21061: params.uri = document.getElementById('source-ws-uri').value.trim(); diff --git a/docs/repair/ws-project-v3/results/adapter.log b/docs/repair/ws-project-v3/results/adapter.log new file mode 100644 index 0000000..7febc5e --- /dev/null +++ b/docs/repair/ws-project-v3/results/adapter.log @@ -0,0 +1,13 @@ +PASS G1 same observable assertion: old rejection callback cannot corrupt replacement Shell (whole production unit) +PASS G2 same observable assertion: pending A fails while B prepares; B settles before terminal, no output follows terminal +PASS B11 timer delete/barrier retry retains original params; busy stop recovers without new business; late timer cannot abort replacement +PASS bounded timer drain retry exhaustion is retained and explicitly resumed by stop retry +PASS B09 observation failure still executes actual matching and variable updates without aborting remote command +PASS original timeout and stop-on-match business abort semantics retained +PASS original cancel ID contract, user disconnecting status and frozen terminal recipient snapshot +PASS no recipients: no observation JSON/payload allocation; business executes and tickets retire +PASS task-create and allocation failure sweep: all actual contexts, credentials, output buffers and reservations reclaimed +PASS output encoding allocation sweep: no partial protocol objects escape, original ticket/resource ledgers drain +PASS healthy stop drains original Shell within bounded wait, worker self-stop rejected, timer barrier callback-before-return remains pinned +PASS timer allocation/start failure cleanup: no timer reference leak; underlying SSH deadline policy unchanged +PASS complete production WS unit: Shell output failure/close/startup failure, Exec task/callback/match/variables/timer cleanup and task-before-create-return; destroyed=84 diff --git a/docs/repair/ws-project-v3/results/browser.json b/docs/repair/ws-project-v3/results/browser.json new file mode 100644 index 0000000..a3ad5bd --- /dev/null +++ b/docs/repair/ws-project-v3/results/browser.json @@ -0,0 +1,31 @@ +[ + { + "name": "browser", + "command": [ + "npm", + "run", + "test:browser", + "--prefix", + "tests/prompts" + ], + "exit": 0 + }, + { + "name": "cross-browser-en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + }, + { + "name": "cross-browser-zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ws-project-v3/results/browser.log b/docs/repair/ws-project-v3/results/browser.log new file mode 100644 index 0000000..a039eed --- /dev/null +++ b/docs/repair/ws-project-v3/results/browser.log @@ -0,0 +1,56 @@ + +> test:browser +> cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs + +✔ zh-CN: real index cold start, safe toast/file text, current websocket state (729.437291ms) +✔ zh-CN: initial language failure blocks controls and retry recovers (272.524792ms) +✔ en-US: real index cold start, safe toast/file text, current websocket state (325.275125ms) +✔ en-US: initial language failure blocks controls and retry recovers (356.387875ms) +✔ delayed language package and rapid switches keep the latest requested language (275.792084ms) +✔ terminal resource failure presents retry; a rejected cached promise is not reused (372.424292ms) +✔ zh-CN: package confirmation treats names as text and applies only on explicit verified action (289.534792ms) +✔ en-US: package confirmation treats names as text and applies only on explicit verified action (357.364958ms) +✔ initial delayed language keeps controls inert until the real package arrives (266.181584ms) +✔ failed language switch preserves the loaded language; retry clears failure and stale toast (349.318334ms) +✔ terminal can initialize after failed resource load using newly served resources (446.691125ms) +{"case":"successful retry","language":"zh-CN","failure":"/sdcard/a.tscfg: 应用失败: 设备处理请求时发生错误,请查看详细原因。\n详细原因:fixture failure","afterSuccess":"/sdcard/a.tscfg: 配置包已应用。","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure zh-CN (679.726708ms) +{"case":"late completion","language":"zh-CN","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: 正在应用配置...","errors":[]} +✔ review2: prior completion closes new package confirmation zh-CN (217.10475ms) +{"case":"stale file list","language":"zh-CN","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close zh-CN (193.948375ms) +{"case":"successful retry","language":"en-US","failure":"/sdcard/a.tscfg: Apply failed: The device encountered an error while processing the request. See the details below.\nDetails: fixture failure","afterSuccess":"/sdcard/a.tscfg: The configuration package was applied.","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure en-US (247.410375ms) +{"case":"late completion","language":"en-US","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: Applying config...","errors":[]} +✔ review2: prior completion closes new package confirmation en-US (289.153166ms) +{"case":"stale file list","language":"en-US","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close en-US (264.067041ms) +✔ R1: endpoint-specific logout and HTTP errors zh-CN (203.259833ms) +✔ R3: late validation cannot revive an old apply entry zh-CN (186.349208ms) +✔ R3: previously opened confirmation loses validity on reupload zh-CN (225.070834ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts zh-CN (170.0385ms) +✔ R6: fixed upload destination and separate refresh failure zh-CN (184.442416ms) +✔ R6: out-of-order directory success and error do not replace latest list zh-CN (179.461334ms) +✔ R1: endpoint-specific logout and HTTP errors en-US (248.38575ms) +✔ R3: late validation cannot revive an old apply entry en-US (259.659292ms) +✔ R3: previously opened confirmation loses validity on reupload en-US (292.953208ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts en-US (381.539709ms) +✔ R6: fixed upload destination and separate refresh failure en-US (374.5865ms) +✔ R6: out-of-order directory success and error do not replace latest list en-US (342.098916ms) +✔ R2: authenticated startup initializes once (403.996458ms) +✔ R2: obsolete system loader cannot update new page; failed navigation retries (290.781875ms) +✔ R4/R5: newest result wins over late success and late failure (306.662292ms) +✔ R3: overlapping writes to one path cannot claim current verified content (394.631792ms) +✔ R2: disposed page only removes its dashboard callback (316.358291ms) +✔ R2: stale finally cannot unlock the new page read (303.17125ms) +✔ R1: delayed sign-out does not clear a newer sign-in (357.729166ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements zh-CN (440.745167ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements en-US (461.678583ms) +ℹ tests 38 +ℹ suites 0 +ℹ pass 38 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 8605.612583 diff --git a/docs/repair/ws-project-v3/results/certificate.log b/docs/repair/ws-project-v3/results/certificate.log new file mode 100644 index 0000000..9512e4e --- /dev/null +++ b/docs/repair/ws-project-v3/results/certificate.log @@ -0,0 +1,9 @@ +PASS UTC/serial bounds and bounded retry/control policy +PASS material: real SDK mbedTLS, mocked NVS/allocation/events, state/time/concurrent snapshots +PASS UI: error typing, bilingual/fallback, text output, uncertain POST, button recovery, refresh separation +PASS actual HTTPS lifecycle: init/start/URI/stop failures, retained ownership, duplicate start, loaded generation, optional CA +PASS actual coordinator with simulated scheduler: fallback, duplicate events, bounded retries, stop intent, explicit restart, stage errors +PASS actual cert API handlers: JSON validation, PEM installation, business errors, additive status, active/stored separation +PASS actual time notifications/UTC readiness and cooperative enrollment stop (syscalls/tasks mocked) +REPRODUCED manager stop bug: callback failure becomes success/stopped +PASS manager stop/restart: failed stop retained, restart aborted, successful/duplicate stop unchanged diff --git a/docs/repair/ws-project-v3/results/control.log b/docs/repair/ws-project-v3/results/control.log new file mode 100644 index 0000000..4a2046f --- /dev/null +++ b/docs/repair/ws-project-v3/results/control.log @@ -0,0 +1,5 @@ +PASS actual WS controls: all four foreign controls rejected, owner controls work; borrowed original pinned, fd/epoch/server reuse and late close isolated; owner stop drains +PASS accepted cancellation persists through task/key/create/connect/auth; cancel/submit claim both orders and result freeze tested; duplicate/old/zero IDs isolated +PASS USER/TIMEOUT/MATCH keep distinct results; service stop busy does not cancel business, accepted user intent survives stop retry and all resource ledgers drain +PASS output failure seals observation without cancelling business; later explicit cancel still reaches original executor without rewriting terminal; earlier timeout retains reason +PASS actual ssh.cancel API exact-ID validation and accepted-intent response; ended operations reject without wildcard control diff --git a/docs/repair/ws-project-v3/results/cross-browser-en-US.json b/docs/repair/ws-project-v3/results/cross-browser-en-US.json new file mode 100644 index 0000000..c68e2d7 --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-browser-en-US.json @@ -0,0 +1,714 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "state": 0, + "writes": 1, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 5, + "writes": 3, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "state": 0, + "writes": 3, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/results/cross-browser-en-US.log b/docs/repair/ws-project-v3/results/cross-browser-en-US.log new file mode 100644 index 0000000..238358d --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-browser-en-US.log @@ -0,0 +1 @@ +PASS Chrome en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-project-v3/results/cross-browser-zh-CN.json b/docs/repair/ws-project-v3/results/cross-browser-zh-CN.json new file mode 100644 index 0000000..c68e2d7 --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-browser-zh-CN.json @@ -0,0 +1,714 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "state": 0, + "writes": 1, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 5, + "writes": 3, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "state": 0, + "writes": 3, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/results/cross-browser-zh-CN.log b/docs/repair/ws-project-v3/results/cross-browser-zh-CN.log new file mode 100644 index 0000000..e4df6f9 --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-browser-zh-CN.log @@ -0,0 +1 @@ +PASS Chrome zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-project-v3/results/cross-node-en-US.json b/docs/repair/ws-project-v3/results/cross-node-en-US.json new file mode 100644 index 0000000..c68e2d7 --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-node-en-US.json @@ -0,0 +1,714 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "state": 0, + "writes": 1, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 5, + "writes": 3, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "state": 0, + "writes": 3, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/results/cross-node-en-US.log b/docs/repair/ws-project-v3/results/cross-node-en-US.log new file mode 100644 index 0000000..8f47257 --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-node-en-US.log @@ -0,0 +1 @@ +PASS Node en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-project-v3/results/cross-node-zh-CN.json b/docs/repair/ws-project-v3/results/cross-node-zh-CN.json new file mode 100644 index 0000000..c68e2d7 --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-node-zh-CN.json @@ -0,0 +1,714 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "state": 2, + "writes": 1, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "state": 2, + "writes": 1, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "state": 0, + "writes": 1, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "state": 0, + "writes": 1, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 0, + "writes": 1, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 1, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "state": 5, + "writes": 3, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "state": 0, + "writes": 3, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/results/cross-node-zh-CN.log b/docs/repair/ws-project-v3/results/cross-node-zh-CN.log new file mode 100644 index 0000000..9265d9e --- /dev/null +++ b/docs/repair/ws-project-v3/results/cross-node-zh-CN.log @@ -0,0 +1 @@ +PASS Node zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-project-v3/results/f1_f2.log b/docs/repair/ws-project-v3/results/f1_f2.log new file mode 100644 index 0000000..854d7e5 --- /dev/null +++ b/docs/repair/ws-project-v3/results/f1_f2.log @@ -0,0 +1,23 @@ +PASS F1: actual Shell output immediate/deferred failure settles original operation; early callbacks remain safe +PASS F2: protection transition survives ordinary log saturation +PASS F1: actual Shell output immediate/deferred failure settles original operation; early callbacks remain safe +PASS F1: actual Shell output immediate/deferred failure settles original operation; early callbacks remain safe +PASS original peer and operation identity isolation across reconnect +PASS actual Exec callback: partial failure settles each target; observation closes while business collection continues without remote abort or replay +PASS actual Exec callback: partial failure settles each target; observation closes while business collection continues without remote abort or replay +PASS protection queue recovery without new messages; partial socket failure never replays successful recipient +PASS separate ordinary slot/descriptor/byte exhaustion cannot consume power quota; power overload counted without construction +PASS persistent SDK rejection has bounded retry and observable terminal settlement +PASS ordinary class retained with completion; busy/timeout stop preserves output and protection progress +PASS ordinary class retained with completion; busy/timeout stop preserves output and protection progress +PASS ordinary class retained with completion; busy/timeout stop preserves output and protection progress +PASS ticks cannot evict transitions; four accepted transitions retain order, fifth overload is explicit +fair system.dashboard=25 +fair system.info=18 +fair system.memory=18 +fair system.cpu=24 +fair network.status=18 +fair power.status=18 +fair fan.status=18 +fair service.list=18 +PASS bounded sustained log/protection/topic competition: all eligible classes progress diff --git a/docs/repair/ws-project-v3/results/host.json b/docs/repair/ws-project-v3/results/host.json new file mode 100644 index 0000000..0454bdc --- /dev/null +++ b/docs/repair/ws-project-v3/results/host.json @@ -0,0 +1,108 @@ +[ + { + "name": "host", + "command": [ + "bash", + "tests/ws_subscriptions/run_host.sh" + ], + "exit": 0 + }, + { + "name": "operation", + "command": [ + "bash", + "tests/ws_subscriptions/run_operation.sh" + ], + "exit": 0 + }, + { + "name": "adapter", + "command": [ + "bash", + "tests/ws_subscriptions/run_operation_adapter.sh" + ], + "exit": 0 + }, + { + "name": "control", + "command": [ + "bash", + "tests/ws_subscriptions/run_control.sh" + ], + "exit": 0 + }, + { + "name": "reviewer", + "command": [ + "bash", + "tests/ws_subscriptions/run_reviewer.sh" + ], + "exit": 0 + }, + { + "name": "f1_f2", + "command": [ + "bash", + "tests/ws_subscriptions/run_f1_f2.sh" + ], + "exit": 0 + }, + { + "name": "runtime", + "command": [ + "bash", + "tests/runtime/run_all.sh" + ], + "exit": 0 + }, + { + "name": "certificate", + "command": [ + "bash", + "tests/certificate/run_host.sh" + ], + "exit": 0 + }, + { + "name": "prompts", + "command": [ + "npm", + "test", + "--prefix", + "tests/prompts" + ], + "exit": 0 + }, + { + "name": "release", + "command": [ + "python3", + "tests/release/test_release.py" + ], + "exit": 0 + }, + { + "name": "shell_driver", + "command": [ + "bash", + "tests/ws_subscriptions/run_shell_driver.sh" + ], + "exit": 0 + }, + { + "name": "cross-node-en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs" + ], + "exit": 0 + }, + { + "name": "cross-node-zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ws-project-v3/results/host.log b/docs/repair/ws-project-v3/results/host.log new file mode 100644 index 0000000..88ff604 --- /dev/null +++ b/docs/repair/ws-project-v3/results/host.log @@ -0,0 +1,23 @@ +PASS T01 T02 T05 T06 T07 T08: demand, independent intervals, targeted fanout +PASS T09 T12 T16: shared batch, old revision cannot send or update new state +PASS T11 T14: standalone info, queued delivery cannot cross fd reuse +PASS T13: cancellation during API skips remaining metrics +PASS T17 T19 T20: queue failure backoff, completion-before-return ownership +PASS T23: ordered operation events own borrowed data +PASS T10 T34: interval validation and nonzero capped monotonic waits +PASS T15 T27 T28: no second HTTP owner, reused handle epoch isolation, stop timeout retains live resources and retries +PASS T27 T30: stop during API rejects new instance; worker/HTTPD self-wait refused +PASS T21 T22: allocation failure sweep across production JSON/TX paths; per-call results freed; allocation baseline restored +PASS T24 T25: bounded non-NUL event parse, retained paced events, original global recipient set +PASS T23: bounded event FIFO full is counted, accepted results remain ordered +PASS T26: task and partial handler registration rollback permit retry +PASS T29 T33: repeated lifecycle and notification at wait boundary +PASS T18 T19 T20: bounded slots/bytes, reserved global capacity, delayed completion cadence, separate queue/send counters +PASS T09 T14 T16: snapshot-before-collection and send-before-completion barriers with resubscribe/fd reuse +PASS T17 T28: HTTP handler barrier publication, timeout retention, single retry and callback-before-return +PASS T04 T20 T21: business-error results freed; send failure shuts down only the pinned session and invalidates demand +PASS cross matrix: 4 barriers x 5 mutations (cancel, resubscribe, disconnect, fd reuse, stop/restart exclusion); restart succeeds after every drain +PASS T18 configured 32-service escaped-name fixture: 9991 bytes within 32768-byte frame budget +PASS T32: self unregister, selected-node retirement, in-flight synchronous drain, unrelated handler retained +PASS actual HTTP/WebUI stop/deinit: hook timeout, HTTPD failure, self-stop rejection, truthful state, retained ownership and retry +PASS actual WebSocket initializer: server/transport/manager/two mutexes/buffer/URI/power-handler failures are not reported as success; duplicate/retry-state guards diff --git a/docs/repair/ws-project-v3/results/operation.log b/docs/repair/ws-project-v3/results/operation.log new file mode 100644 index 0000000..b6d8772 --- /dev/null +++ b/docs/repair/ws-project-v3/results/operation.log @@ -0,0 +1,2 @@ +PASS 16 failure schedules: encode/SDK/socket/stale peer, early/deferred done, duplicate tokens do not double-settle +PASS production operation/TX: 36 barrier schedules, ticket/target ledgers and B09 executor retention; destroyed=36 diff --git a/docs/repair/ws-project-v3/results/prompts.log b/docs/repair/ws-project-v3/results/prompts.log new file mode 100644 index 0000000..e2a9ba9 --- /dev/null +++ b/docs/repair/ws-project-v3/results/prompts.log @@ -0,0 +1,51 @@ + +> test +> cd ../.. && node --test tests/prompts/static.test.cjs tests/prompts/regression.test.cjs + +✔ zh-CN: actual inline translator, cold language, missing/objects/parameters and confirmations (16.080917ms) +✔ zh-CN: REST business failure remains returned; strict operation rejects with original metadata (6.232875ms) +✔ zh-CN: timeout covers response body; result stays unknown for POST (7.616708ms) +✔ zh-CN: toast timer replacement, priority, safe multiline text (4.855458ms) +✔ zh-CN: actual mutations do not report success or close dialogs on business failures (5.485167ms) +✔ zh-CN: batch deletion all / partial / no success with business errors (5.611833ms) +✔ zh-CN: downloads propagate actual initiation failures and retain batch details (6.254041ms) +✔ zh-CN: file names are text; upload/verification/apply remain separate (5.957875ms) +✔ zh-CN: SSH actual event handler honors terminal states and diagnoses conflicts (5.029167ms) +✔ zh-CN: background command timeout is unconfirmed and never resubmitted (5.411166ms) +✔ zh-CN: terminal restoration waits for acknowledgement; timeout/failure stay distinct (6.395291ms) +✔ zh-CN: ping results are reachability only; failed probe is unknown and no pulse replay (5.465916ms) +✔ zh-CN: websocket label matches color across language changes and power warnings persist (4.730709ms) +✔ en-US: actual inline translator, cold language, missing/objects/parameters and confirmations (5.393583ms) +✔ en-US: REST business failure remains returned; strict operation rejects with original metadata (4.982583ms) +✔ en-US: timeout covers response body; result stays unknown for POST (6.160416ms) +✔ en-US: toast timer replacement, priority, safe multiline text (5.891917ms) +✔ en-US: actual mutations do not report success or close dialogs on business failures (5.927791ms) +✔ en-US: batch deletion all / partial / no success with business errors (5.956458ms) +✔ en-US: downloads propagate actual initiation failures and retain batch details (6.10225ms) +✔ en-US: file names are text; upload/verification/apply remain separate (5.667792ms) +✔ en-US: SSH actual event handler honors terminal states and diagnoses conflicts (7.6365ms) +✔ en-US: background command timeout is unconfirmed and never resubmitted (5.151833ms) +✔ en-US: terminal restoration waits for acknowledgement; timeout/failure stay distinct (5.21075ms) +✔ en-US: ping results are reachability only; failed probe is unknown and no pulse replay (4.8295ms) +✔ en-US: websocket label matches color across language changes and power warnings persist (4.818167ms) +✔ zh-CN: upload and download aggregates cover all success and all failure (5.105292ms) +✔ zh-CN: key deployment requires successful business code and distinguishes verification (5.5095ms) +✔ zh-CN: real LED/status renderers localize finite built-in identifiers (4.929792ms) +✔ en-US: upload and download aggregates cover all success and all failure (4.981292ms) +✔ en-US: key deployment requires successful business code and distinguishes verification (4.549875ms) +✔ en-US: real LED/status renderers localize finite built-in identifiers (4.486417ms) +✔ zh-CN: widget dynamic families render real labels and literal braces in names remain valid (5.076875ms) +✔ zh-CN: unknown stop result never escalates to forced termination (5.808708ms) +✔ en-US: widget dynamic families render real labels and literal braces in names remain valid (4.602417ms) +✔ en-US: unknown stop result never escalates to forced termination (4.540833ms) +Checked 3066 references including conditional and finite dynamic families. +✔ actual UI literal/conditional and finite dynamic keys exist in both languages with matching contracts (5.71775ms) +✔ production i18n is the inline entry; no second translator script is loaded (0.088375ms) +ℹ tests 38 +ℹ suites 0 +ℹ pass 38 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 255.165833 diff --git a/docs/repair/ws-project-v3/results/release.log b/docs/repair/ws-project-v3/results/release.log new file mode 100644 index 0000000..e76e6ef --- /dev/null +++ b/docs/repair/ws-project-v3/results/release.log @@ -0,0 +1,5 @@ +... +---------------------------------------------------------------------- +Ran 3 tests in 0.003s + +OK diff --git a/docs/repair/ws-project-v3/results/reviewer.log b/docs/repair/ws-project-v3/results/reviewer.log new file mode 100644 index 0000000..5a5cfbd --- /dev/null +++ b/docs/repair/ws-project-v3/results/reviewer.log @@ -0,0 +1,15 @@ +PASS R1/R4 real busy stop: existing task and full fanout continue with no new business message; retry succeeds +PASS HTTPD barrier timeout retains worker and retry state +PASS R3: real role change drops old queued logs, including unsubscribe/resubscribe ABA +R5 observed system.dashboard: 75 delivered frames +R5 observed system.info: 75 delivered frames +R5 observed system.memory: 75 delivered frames +R5 observed system.cpu: 75 delivered frames +R5 observed network.status: 75 delivered frames +R5 observed power.status: 75 delivered frames +R5 observed fan.status: 75 delivered frames +R5 observed service.list: 75 delivered frames +PASS R5: all eight topics progress under six-slot pressure; no API collection without message/descriptor/byte capacity +PASS R4 service: stop errors retain registry/dependencies; retry drains then releases ownership +PASS R4 core: real event drain timeout retains downstream resources; service/config/log errors propagate; partial deinit retries succeed +PASS R1 HTTP admission: stopping rejects writes before body/handler execution; reads and resumed admission remain valid diff --git a/docs/repair/ws-project-v3/results/runtime.log b/docs/repair/ws-project-v3/results/runtime.log new file mode 100644 index 0000000..616b71a --- /dev/null +++ b/docs/repair/ws-project-v3/results/runtime.log @@ -0,0 +1,13 @@ +PASS actual log hook/parser: full 510..4096 output, bounded UTF-8 preview, ANSI, concurrent capture/drop, full own output, callback recursion, capture toggle +PASS rule codec: nine action types, conditions/repeats/explicit false, allocation failures, unsupported operator; rule=256 action=1000 +PASS actual rule persistence: NVS and SD fault injection, recovery boundaries, read-only rejection +PASS actual rule engine: revisions/no-op/allocation failures, stale-evaluation barrier, pinned old execution, retirement bound, enable/manual/allow matrix, recreate identity +PASS actual SSH client: pre-auth trust gate, six EAGAIN phase deadlines/cancellation, stderr-only cleanup, bounded wait +PASS actual service registry + watcher: duplicate admission, task failure, immediate finish, stale handle, cooperative cancellation, late READY rejection, truthful remote stop/unknown +PASS service protocol: stale credentials, cancellation cleanup, deletion barrier/failure/reuse, 70 replacements, missing config protection, physical identity, page-free recovery, 3-attempt budget, zero-I/O cached reads +PASS production synchronous action completion: timeout then late result, success, queue rejection; semaphore lifetime balanced +PASS actual configuration wrappers: host edit vs query, immutable target, failed delete preserves registration, successful delete then same-name replacement +PASS actual store -> current loader: normal/dot IDs, temporary files ignored, reload retains saved rule +PASS actual automation stop + engine: blocked action returns normally, leases/executing clear, async work prevents restart, independent remote ownership retained +PASS actual probe builder: quotes, spaces, leading dash, literal shell metacharacters, fail priority, exact tokens, overflow +PASS actual UI functions: bilingual states, one revisioned update, manual conditions/types, inline fields/repeat preservation, explicit false vs omitted, conflict/draft/uncertain write diff --git a/docs/repair/ws-project-v3/results/shell_driver.log b/docs/repair/ws-project-v3/results/shell_driver.log new file mode 100644 index 0000000..b96e08c --- /dev/null +++ b/docs/repair/ws-project-v3/results/shell_driver.log @@ -0,0 +1,6 @@ +PASS real Shell+client: zero data is not EOF; EOF then close releases wrapper/channel/session/socket; close callback exactly once +PASS real Shell+client: fatal write/timeout retires channel; persistent close EAGAIN falls back to local session teardown without waiting +PASS real Shell+client: partial initialization/open/PTY/shell-start failure and bounded EAGAIN all release owned resources +PASS Shell run: local exit requested by input callback stops before another network read; close still owns cleanup +PASS actual WebUI cleanup twice uses cleared handles; original operation/ticket/target and actual lower resources drain +PASS real lower resources survive stop timeout; accepted output and terminal drain on retry with no new business message diff --git a/docs/repair/ws-project-v3/sdk-env.log b/docs/repair/ws-project-v3/sdk-env.log new file mode 100644 index 0000000..fb84a6a --- /dev/null +++ b/docs/repair/ws-project-v3/sdk-env.log @@ -0,0 +1,20 @@ +Checking "python3" ... +Python 3.12.4 +"python3" has been detected +Activating ESP-IDF 5.5 +Setting IDF_PATH to '/Users/massif/esp/v5.5.2/esp-idf'. +* Checking python version ... 3.12.4 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... zsh +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of riscv32-esp-elf, cmake, xtensa-esp-elf, openocd-esp32, esp-rom-elfs, xtensa-esp-elf-gdb, riscv32-esp-elf-gdb use command 'python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall' +To free up even more space, remove installation packages of those tools. +Use option python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall --remove-archives. +* Shell completion ... Autocompletion code generated + +Done! You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build diff --git a/docs/repair/ws-project-v3/target-resource.json b/docs/repair/ws-project-v3/target-resource.json new file mode 100644 index 0000000..081f751 --- /dev/null +++ b/docs/repair/ws-project-v3/target-resource.json @@ -0,0 +1,522 @@ +{ + "components/ts_security/src/ts_ssh_shell.c": { + "before": { + "object_bytes": 1076, + "stack_usage": { + "get_term_string": [ + "32", + "static" + ], + "wait_socket": [ + "64", + "static" + ], + "ts_ssh_shell_open": [ + "80", + "static" + ], + "ts_ssh_shell_close": [ + "32", + "static" + ], + "ts_ssh_shell_write": [ + "48", + "static" + ], + "ts_ssh_shell_read": [ + "32", + "static" + ], + "ts_ssh_shell_set_output_cb": [ + "32", + "static" + ], + "ts_ssh_shell_set_close_cb": [ + "32", + "static" + ], + "ts_ssh_shell_poll": [ + "32", + "static" + ], + "ts_ssh_shell_run": [ + "64", + "static" + ], + "ts_ssh_shell_resize": [ + "48", + "static" + ], + "ts_ssh_shell_send_signal": [ + "32", + "static" + ], + "ts_ssh_shell_get_state": [ + "32", + "static" + ], + "ts_ssh_shell_is_active": [ + "32", + "static" + ], + "ts_ssh_shell_get_exit_code": [ + "32", + "static" + ] + } + }, + "after": { + "object_bytes": 1080, + "stack_usage": { + "get_term_string": [ + "32", + "static" + ], + "shell_notify_close": [ + "32", + "static" + ], + "wait_socket": [ + "64", + "static" + ], + "shell_wait": [ + "32", + "static" + ], + "shell_release_channel": [ + "32", + "static" + ], + "ts_ssh_shell_open": [ + "96", + "static" + ], + "ts_ssh_shell_request_close": [ + "32", + "static" + ], + "ts_ssh_shell_close": [ + "32", + "static" + ], + "ts_ssh_shell_write": [ + "48", + "static" + ], + "ts_ssh_shell_read": [ + "32", + "static" + ], + "ts_ssh_shell_set_output_cb": [ + "32", + "static" + ], + "ts_ssh_shell_set_close_cb": [ + "32", + "static" + ], + "ts_ssh_shell_poll": [ + "48", + "static" + ], + "ts_ssh_shell_run": [ + "64", + "static" + ], + "ts_ssh_shell_resize": [ + "64", + "static" + ], + "ts_ssh_shell_send_signal": [ + "32", + "static" + ], + "ts_ssh_shell_get_state": [ + "32", + "static" + ], + "ts_ssh_shell_is_active": [ + "32", + "static" + ], + "ts_ssh_shell_get_exit_code": [ + "32", + "static" + ] + } + } + }, + "components/ts_webui/src/ts_webui_ws.c": { + "before": { + "object_bytes": 20, + "stack_usage": { + "power_state_to_string": [ + "32", + "static" + ], + "has_log_clients": [ + "32", + "static" + ], + "power_policy_event_handler": [ + "736", + "static" + ], + "ssh_request_error": [ + "48", + "static" + ], + "add_client": [ + "96", + "static" + ], + "terminal_output_cb": [ + "32", + "static" + ], + "handle_terminal_command": [ + "64", + "static" + ], + "ssh_send_output": [ + "320", + "static" + ], + "shell_destroy": [ + "32", + "static" + ], + "exec_destroy": [ + "32", + "static" + ], + "ssh_start_status": [ + "80", + "static" + ], + "ssh_close": [ + "32", + "static" + ], + "ssh_disconnecting": [ + "320", + "static" + ], + "shell_resources_close": [ + "32", + "static" + ], + "ssh_poll_task": [ + "2096", + "static" + ], + "handle_ssh_control": [ + "64", + "static" + ], + "exec_timer_drained": [ + "32", + "static" + ], + "exec_retry_timer_drain": [ + "48", + "static" + ], + "ssh_cleanup": [ + "32", + "static" + ], + "ts_webui_ws_stopped": [ + "32", + "static" + ], + "log_ws_callback": [ + "48", + "static" + ], + "exec_abort": [ + "32", + "static" + ], + "ssh_exec_timeout_callback": [ + "32", + "static" + ], + "simple_pattern_match": [ + "48", + "static" + ], + "ssh_exec_task": [ + "544", + "static" + ], + "ssh_exec_output_callback": [ + "1088", + "static" + ], + "exec_maintenance": [ + "32", + "static" + ], + "ts_webui_ssh_exec_start_ex_impl": [ + "528", + "static" + ], + "ts_webui_ws_init": [ + "64", + "static" + ], + "ts_webui_broadcast": [ + "48", + "static" + ], + "ts_webui_broadcast_event": [ + "32", + "static" + ], + "ts_webui_log_stream_enable": [ + "32", + "static" + ], + "update_log_stream_state": [ + "32", + "static" + ], + "cleanup_disconnected_client": [ + "128", + "static" + ], + "peer_closed": [ + "64", + "static" + ], + "set_client_role": [ + "128", + "static" + ], + "start_terminal_session": [ + "128", + "static" + ], + "handle_ssh_connect": [ + "208", + "static" + ], + "ws_handler": [ + "176", + "static" + ], + "ts_webui_ws_stop": [ + "32", + "static" + ], + "ts_webui_ssh_exec_start_ex": [ + "144", + "static" + ], + "ts_webui_ssh_exec_start": [ + "48", + "static" + ], + "ts_webui_ssh_result_free": [ + "32", + "static" + ], + "ts_webui_ssh_exec_cancel": [ + "32", + "static" + ], + "ts_webui_ssh_exec_is_running": [ + "32", + "static" + ] + } + }, + "after": { + "object_bytes": 20, + "stack_usage": { + "power_state_to_string": [ + "32", + "static" + ], + "has_log_clients": [ + "32", + "static" + ], + "power_policy_event_handler": [ + "736", + "static" + ], + "ssh_request_error": [ + "48", + "static" + ], + "add_client": [ + "96", + "static" + ], + "terminal_output_cb": [ + "32", + "static" + ], + "handle_terminal_command": [ + "64", + "static" + ], + "ssh_send_output": [ + "320", + "static" + ], + "shell_destroy": [ + "32", + "static" + ], + "exec_destroy": [ + "32", + "static" + ], + "ssh_start_status": [ + "80", + "static" + ], + "ssh_close": [ + "32", + "static" + ], + "ssh_disconnecting": [ + "320", + "static" + ], + "shell_resources_close": [ + "32", + "static" + ], + "ssh_poll_task": [ + "2096", + "static" + ], + "handle_ssh_control": [ + "96", + "static" + ], + "exec_timer_drained": [ + "32", + "static" + ], + "exec_retry_timer_drain": [ + "48", + "static" + ], + "ssh_cleanup": [ + "32", + "static" + ], + "ts_webui_ws_stopped": [ + "32", + "static" + ], + "log_ws_callback": [ + "48", + "static" + ], + "exec_abort": [ + "32", + "static" + ], + "ssh_exec_timeout_callback": [ + "32", + "static" + ], + "simple_pattern_match": [ + "48", + "static" + ], + "ssh_exec_task": [ + "544", + "static" + ], + "ssh_exec_output_callback": [ + "1088", + "static" + ], + "exec_maintenance": [ + "32", + "static" + ], + "ts_webui_ssh_exec_start_ex_impl": [ + "528", + "static" + ], + "ts_webui_ws_init": [ + "64", + "static" + ], + "ts_webui_broadcast": [ + "48", + "static" + ], + "ts_webui_broadcast_event": [ + "32", + "static" + ], + "ts_webui_log_stream_enable": [ + "32", + "static" + ], + "update_log_stream_state": [ + "32", + "static" + ], + "cleanup_disconnected_client": [ + "128", + "static" + ], + "peer_closed": [ + "64", + "static" + ], + "set_client_role": [ + "128", + "static" + ], + "start_terminal_session": [ + "128", + "static" + ], + "handle_ssh_connect": [ + "208", + "static" + ], + "ws_handler": [ + "176", + "static" + ], + "ts_webui_ws_stop": [ + "32", + "static" + ], + "ts_webui_ssh_exec_start_ex": [ + "144", + "static" + ], + "ts_webui_ssh_exec_start": [ + "48", + "static" + ], + "ts_webui_ssh_result_free": [ + "32", + "static" + ], + "ts_webui_ssh_exec_cancel": [ + "32", + "static" + ], + "ts_webui_ssh_exec_is_running": [ + "32", + "static" + ] + } + } + } +} \ No newline at end of file diff --git a/docs/repair/ws-project-v3/working-tree-status.txt b/docs/repair/ws-project-v3/working-tree-status.txt new file mode 100644 index 0000000..0e1125d --- /dev/null +++ b/docs/repair/ws-project-v3/working-tree-status.txt @@ -0,0 +1,25 @@ + M components/ts_console/commands/ts_cmd_ssh.c + M components/ts_security/include/ts_ssh_shell.h + M components/ts_security/src/ts_ssh_shell.c + M components/ts_webui/src/ts_webui_ws.c + M components/ts_webui/web/index.html + M components/ts_webui/web/js/lang/en-US.js + M components/ts_webui/web/js/lang/zh-CN.js + M components/ts_webui/web/js/terminal.js + M docs/repair/ws-control/README.md + M tests/ws_subscriptions/test_operation_adapter.c +?? docs/repair/ws-project-v3/ +?? docs/runtime-repair/evidence/reviewer-fixes/diff-check.txt +?? output/ +?? tests/prompts/project-cross.cjs +?? tests/ws_subscriptions/measure_project_v3.py +?? tests/ws_subscriptions/project_driver.inc +?? tests/ws_subscriptions/project_stubs/ +?? tests/ws_subscriptions/replay_project_baseline.py +?? tests/ws_subscriptions/run_project_bridge.sh +?? tests/ws_subscriptions/run_project_v3.py +?? tests/ws_subscriptions/run_shell_driver.sh +?? tests/ws_subscriptions/test_project.c +?? tests/ws_subscriptions/test_shell_driver.c +?? tests/ws_subscriptions/verify_project_assets.py +?? tmp/ diff --git a/tests/prompts/project-cross.cjs b/tests/prompts/project-cross.cjs new file mode 100644 index 0000000..c902f24 --- /dev/null +++ b/tests/prompts/project-cross.cjs @@ -0,0 +1,88 @@ +/* Bidirectional bridge: final production C frames -> actual JS socket dispatcher -> + * actual onData/start/exit requests -> real C ws_handler + operation + SSH drivers. + * Network/libssh2/xterm rendering are boundaries; no lifecycle logic is replaced. */ +const assert=require('node:assert/strict'),{spawn}=require('node:child_process'),readline=require('node:readline'),fs=require('node:fs'); +const path=require('node:path'),{harness,read:sourceRead}=require('./harness.cjs'); +const read=file=>process.env.PROJECT_WEB_ROOT?fs.readFileSync(path.join(process.env.PROJECT_WEB_ROOT,file),'utf8'):sourceRead(file); +async function engine(language,browserMode){ + if(!browserMode){const h=harness(language);await h.ready();h.load();await h.run(`i18n.setLanguage('${language}')`);return {run:async s=>h.run(s),close:async()=>{}};} + const {chromium}=require('playwright');const browser=await chromium.launch({channel:'chrome',headless:true}); + const page=await browser.newPage();const errors=[];page.on('pageerror',err=>errors.push(err.message)); + await page.addInitScript(language=>{localStorage.setItem('ts_language',language);window.WebSocket=class{static OPEN=1;static CONNECTING=0;constructor(){this.readyState=0;}send(){}close(){}};},language); + await page.route('**/*',async r=>{ + const url=new URL(r.request().url());if(url.origin!=='http://fixture.local'){await r.abort();return;} + if(url.pathname.startsWith('/api/')){await r.fulfill({json:{code:0,data:{}}});return;} + const rel=url.pathname==='/'?'index.html':url.pathname.slice(1); + try{await r.fulfill({body:read(rel),contentType:rel.endsWith('.js')?'application/javascript':rel.endsWith('.css')?'text/css':rel.endsWith('.html')?'text/html':'application/octet-stream'});}catch{await r.abort();} + }); + await page.goto('http://fixture.local/');await page.waitForFunction(()=>i18n.isReady()); + await page.evaluate(()=>{const f=document.createElement('div');f.id='fixture';document.body.append(f);}); + return {run:s=>page.evaluate(s),close:async()=>{await browser.close();assert.deepEqual(errors,[]);}}; +} +async function main(){ + const baseline=process.argv.includes('--baseline'),browserMode=process.argv.includes('--browser'); + const language=process.env.CROSS_LANGUAGE||'en-US',e=await engine(language,browserMode); + let c;const records=[];let exit,err='',pending,chain=Promise.resolve(); + try{ + await e.run(`window.sent=[];window.lines=[];window.input=null; + window.WebSocket=class {static OPEN=1;static CONNECTING=0;constructor(){this.readyState=1;}send(s){sent.push(JSON.parse(s));}close(){this.readyState=3;}}; + window.term=new WebTerminal('fixture');term.terminal={write:s=>lines.push(s),writeln:s=>lines.push(s),onData:f=>input=f,dispose:()=>{}}; + term.setupInputHandler();term.connect();term.ws.onopen();`); + c=spawn('bash',['tests/ws_subscriptions/run_project_bridge.sh'],{cwd:path.resolve(__dirname,'../..'),env:process.env}); + c.stderr.on('data',b=>err+=b); + const done=new Promise(r=>c.on('close',code=>{exit=code;r(code);if(pending){pending.reject(new Error(err||'C exited '+code));pending=null;}})); + readline.createInterface({input:c.stdout}).on('line',line=>{ + chain=chain.then(async()=>{const m=JSON.parse(line);records.push(m); + if(m.frame && m.fd===1)await e.run(`term.ws.onmessage({data:${JSON.stringify(m.bytes || JSON.stringify(m.frame))}})`); + if('state'in m||m.finished){const p=pending;pending=null;p?.resolve(m);} + }).catch(error=>{pending?.reject(error);pending=null;}); + }); + const step=msg=>new Promise((resolve,reject)=>{assert(!pending);pending={resolve,reject};c.stdin.write(JSON.stringify(msg)+'\n');}); + const sendNext=async()=>{const message=await e.run('sent.shift()');assert(message,'frontend generated no request');return step({message});}; + const start=async()=>{await e.run(`term.startSshShell({host:'192.0.2.1',user:'fake',password:'fake',port:22})`);return sendNext();}; + const state=()=>e.run(`({mode:term.sshMode,connecting:term.sshConnecting,restoring:term.restoring,connected:term.connected,lines:[...lines],sent:[...sent]})`); + await sendNext();await start();assert((await state()).mode); + const before=(await state()).lines.length;const afterSignal=await step({message:{type:'ssh_signal',signal:'TERM'}}); + const s=await state();const recovered=s.mode&&!s.restoring&&!s.lines.slice(before).some(x=>x==='tianshan> '); + await e.run(`input('x\\r')`);const next=await e.run('sent.shift()'); + if(baseline){assert(!recovered && next.type!=='ssh_input');await step({cmd:'finish'});await done;assert.equal(exit,0,err);console.log('CONFIRMED H1: actual C request error leaves op OPEN but JS exits SSH and next input is not routed to SSH');return;} + assert(recovered,'request failure changed active SSH mode/prompt/recovery');assert.equal(next.type,'ssh_input'); + let cs=await step({message:next});assert.equal(cs.writes,afterSignal.writes+1,'next frontend input must execute on original C Shell'); + for(const message of [{type:'ssh_resize',width:0,height:20},{type:'ssh_resize',width:80.5,height:20}]){await step({message});assert((await state()).mode);} + await step({cmd:'resize_reject'});await step({message:{type:'ssh_resize',width:80,height:24}});assert((await state()).mode);await step({cmd:'reset_driver'}); + // Another page cannot input, disconnect, signal or resize the current owner. + const n=cs.writes;for(const message of [{type:'ssh_input',data:'wrong'},{type:'ssh_disconnect'},{type:'ssh_signal',signal:'INT'},{type:'ssh_resize',width:80,height:24},{type:'ssh_connect',host:'192.0.2.2',user:'other'}]){cs=await step({fd:2,message});assert.equal(cs.writes,n);assert.equal(cs.channels,1);assert((await state()).mode);} + // A rejected duplicate start on the owner also must not terminate its live op. + await step({message:{type:'ssh_connect',host:'192.0.2.1',user:'fake'}});assert((await state()).mode); + await e.run(`input('\\x1c')`);await sendNext();assert(!(await state()).mode);assert((await state()).connected); + await e.run(`input('help\\r')`);const local=await e.run('sent.shift()');assert.equal(local.type,'terminal_input');await step({message:local}); + await step({message:{type:'terminal_stop'}});await e.run(`input('help\\r')`);await sendNext();assert((await state()).restoring); + const restore=await e.run('sent.shift()');assert.equal(restore.type,'terminal_start');await step({message:restore});assert((await state()).connected && !(await state()).restoring); + await start();assert((await state()).mode);await step({cmd:'write_fail'});await e.run(`input('x')`);await sendNext();assert(!(await state()).mode);assert(!(await state()).restoring);assert((await state()).lines.some(x=>/unconfirmed|尚未确认/.test(x))); + await step({cmd:'reset_driver'});await start();assert((await state()).mode);await step({cmd:'eof'});assert(!(await state()).mode); + await step({cmd:'reset_driver'});await step({cmd:'setup_fail'});await start();assert(!(await state()).mode && !(await state()).connecting);await step({cmd:'reset_driver'});await start();assert((await state()).mode); + // Failed notification encoding does not change active request ownership. + await step({cmd:'encode_fail'});await step({message:{type:'ssh_signal',signal:'TERM'}});await step({cmd:'encode_resume'});assert((await state()).mode);await e.run(`input('z')`);await sendNext(); + // A control failure crosses output preparation and a genuine close: exactly one terminal, + // queued output precedes it, then next frontend action is local (no automatic replay). + const crossing=records.length;await step({cmd:'error_close'});await step({message:{type:'ssh_signal',signal:'TERM'}});assert(!(await state()).mode); + const crossed=records.slice(crossing).filter(r=>r.frame&&r.fd===1).map(r=>r.frame); + assert.equal(crossed.filter(f=>f.type==='ssh_status'&&f.status==='closed').length,1); + assert(crossed.findIndex(f=>f.type==='ssh_output')f.type==='ssh_status'&&f.status==='closed')); + await start();assert((await state()).mode); + // Direct request notification send failure cannot recursively change the operation. + await step({cmd:'send_fail'});await step({message:{type:'ssh_signal',signal:'TERM'}});await step({cmd:'send_resume'});assert((await state()).mode); + await e.run(`input('q')`);await sendNext(); + // Output accepted while HTTPD is unavailable follows the existing original-operation + // failure path; capacity recovers with no new business input, and resources settle. + await step({cmd:'queue_fail'});await step({cmd:'output'});await step({cmd:'queue_resume'});assert(!(await state()).mode); + await step({cmd:'finish'});await done;assert.equal(exit,0,err); + // Old socket frames/close and callbacks after destroy cannot change new instance. + const stale=await e.run(`(()=>{const old=term.ws;term.connect();term.connected=true;term.sshMode=true;const fresh=term.ws;old.onmessage({data:JSON.stringify({type:'ssh_status',status:'error'})});old.onclose({code:1006});const held=term.sshMode&&term.connected&&term.ws===fresh;term.destroy();fresh.onmessage({data:JSON.stringify({type:'connected'})});return held&&!term.connected;})()`);assert(stale); + console.log(`PASS ${browserMode?'Chrome':'Node'} ${language}: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero`); + }finally{ + if(process.env.CROSS_OUTPUT)fs.writeFileSync(process.env.CROSS_OUTPUT,JSON.stringify({records,stderr:err,exit},null,2)); + if(c && exit===undefined)c.kill('SIGTERM');await e.close(); + } +} +main().catch(e=>{console.error(e);process.exitCode=1;}); diff --git a/tests/ws_subscriptions/measure_project_v3.py b/tests/ws_subscriptions/measure_project_v3.py new file mode 100644 index 0000000..139b558 --- /dev/null +++ b/tests/ws_subscriptions/measure_project_v3.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +"""Use the actual fixed-SDK compile commands; no target execution.""" +import os,json,pathlib,shlex,subprocess,tarfile,tempfile +root=pathlib.Path(__file__).resolve().parents[2];build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));doc=root/'docs/repair/ws-project-v3' +commands=json.loads((build/'compile_commands.json').read_text());result={} +with tempfile.TemporaryDirectory(prefix='ts-v3-size-') as d: + temp=pathlib.Path(d) + for rel,typ in [('components/ts_security/src/ts_ssh_shell.c','struct ts_ssh_shell_s'),('components/ts_webui/src/ts_webui_ws.c','ssh_shell_context_t')]: + entry=next(c for c in commands if c['file']==str(root/rel));base=shlex.split(entry['command']);result[rel]={} + for kind in ['before','after']: + if kind=='before': + with tarfile.open(doc/'baseline.tar.gz') as t:source=t.extractfile(rel).read().decode() + else:source=(root/rel).read_text() + src=temp/(kind+'-'+pathlib.Path(rel).name);src.write_text(source+'\nconst unsigned char v3_object_size[sizeof('+typ+')]={0};\n') + obj=src.with_suffix('.o');args=base[:];args[args.index('-o')+1]=str(obj);args[args.index('-c')+1]=str(src);args+=['-fstack-usage'] + subprocess.run(args,cwd=entry['directory'],check=True,capture_output=True) + nm=str(pathlib.Path(args[0]).with_name('xtensa-esp32s3-elf-nm'));nm=nm if pathlib.Path(nm).exists() else str(pathlib.Path(args[0]).with_name('xtensa-esp-elf-nm')) + symbols=subprocess.check_output([nm,'-S',str(obj)],text=True) + size=int(next(l.split()[1] for l in symbols.splitlines() if l.endswith(' v3_object_size')),16) + stack={l.split('\t')[0].rsplit(':',1)[-1]:l.split('\t')[1:] for l in src.with_suffix('.su').read_text().splitlines()} + result[rel][kind]={'object_bytes':size,'stack_usage':stack} +(doc/'target-resource.json').write_text(json.dumps(result,indent=2)) +print(json.dumps({k:{x:v[x]['object_bytes'] for x in v} for k,v in result.items()},indent=2)) diff --git a/tests/ws_subscriptions/project_driver.inc b/tests/ws_subscriptions/project_driver.inc new file mode 100644 index 0000000..efe9497 --- /dev/null +++ b/tests/ws_subscriptions/project_driver.inc @@ -0,0 +1,69 @@ +/* Real project SSH client + Shell; only libssh2/socket/clock boundaries fake. */ +#include +#include +#include +#include +#include +#include +#include +#include "ts_known_hosts.h" +struct _LIBSSH2_SESSION {bool local_closed;}; +struct _LIBSSH2_CHANNEL {LIBSSH2_SESSION *owner;}; +static LIBSSH2_CHANNEL *driver_channel; +static int driver_channels,driver_sessions,driver_sockets,driver_writes,driver_phase,driver_reads; +static bool driver_eof,driver_write_fail,driver_write_again,driver_resize_reject,driver_close_again,driver_partial,driver_read_fail; +static int driver_socket(int d,int t,int p){(void)d;(void)t;(void)p;driver_sockets++;return 10;} +static int driver_close(int fd){(void)fd;driver_sockets--;return 0;} +static int driver_connect(int fd,const struct sockaddr*a,socklen_t n){(void)fd;(void)a;(void)n;return 0;} +static int driver_fcntl(int fd,int cmd,...){(void)fd;(void)cmd;return 0;} +static int driver_select(int n,fd_set*r,fd_set*w,fd_set*x,struct timeval*t){(void)n;(void)r;(void)w;(void)x;test_now+=(int64_t)t->tv_sec*1000000+t->tv_usec;return 0;} +int libssh2_init(int f){(void)f;return 0;} +void libssh2_exit(void){} +LIBSSH2_SESSION *libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*a)),LIBSSH2_FREE_FUNC((*f)),LIBSSH2_REALLOC_FUNC((*r)),void*x){(void)a;(void)f;(void)r;(void)x;driver_sessions++;return calloc(1,sizeof(LIBSSH2_SESSION));} +int libssh2_channel_free(LIBSSH2_CHANNEL*c){if(driver_close_again && !c->owner->local_closed)return LIBSSH2_ERROR_EAGAIN;assert(c==driver_channel);driver_channel=NULL;driver_channels--;free(c);return 0;} +int libssh2_session_free(LIBSSH2_SESSION*s){if(driver_channel){int r=libssh2_channel_free(driver_channel);if(r)return r;}driver_sessions--;free(s);return 0;} +void libssh2_session_set_blocking(LIBSSH2_SESSION*s,int b){(void)s;assert(!b);} +void *libssh2_session_callback_set(LIBSSH2_SESSION*s,int c,void*f){(void)c;(void)f;s->local_closed=true;return NULL;} +int libssh2_session_handshake(LIBSSH2_SESSION*s,libssh2_socket_t f){(void)s;(void)f;return 0;} +int libssh2_session_block_directions(LIBSSH2_SESSION*s){(void)s;return LIBSSH2_SESSION_BLOCK_INBOUND;} +int libssh2_session_last_errno(LIBSSH2_SESSION*s){(void)s;return driver_phase==1?LIBSSH2_ERROR_EAGAIN:0;} +int libssh2_session_last_error(LIBSSH2_SESSION*s,char **m,int*n,int w){(void)s;(void)n;(void)w;*m="boundary rejection";return 0;} +int libssh2_userauth_password_ex(LIBSSH2_SESSION*s,const char*u,unsigned int l,const char*p,unsigned int n,LIBSSH2_PASSWD_CHANGEREQ_FUNC((*change))){(void)s;(void)u;(void)l;(void)p;(void)n;(void)change;return 0;} +int libssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION*s,const char*u,unsigned int l,const char*a,const char*b,const char*p){(void)a;(void)b;return libssh2_userauth_password_ex(s,u,l,p,0,NULL);} +int libssh2_userauth_publickey_frommemory(LIBSSH2_SESSION*s,const char*u,size_t l,const char*a,size_t al,const char*b,size_t bl,const char*p){(void)a;(void)al;(void)b;(void)bl;return libssh2_userauth_password_ex(s,u,l,p,0,NULL);} +LIBSSH2_CHANNEL *libssh2_channel_open_ex(LIBSSH2_SESSION*s,const char*t,unsigned int l,unsigned int w,unsigned int p,const char*m,unsigned int ml){(void)t;(void)l;(void)w;(void)p;(void)m;(void)ml;if(driver_phase==1)return NULL;assert(!driver_channel);driver_channel=calloc(1,sizeof(*driver_channel));driver_channel->owner=s;driver_channels++;return driver_channel;} +int libssh2_channel_request_pty_ex(LIBSSH2_CHANNEL*c,const char*t,unsigned int l,const char*m,unsigned int ml,int w,int h,int wp,int hp){(void)c;(void)t;(void)l;(void)m;(void)ml;(void)w;(void)h;(void)wp;(void)hp;return driver_phase==2?LIBSSH2_ERROR_EAGAIN:driver_phase==4?-1:0;} +int libssh2_channel_process_startup(LIBSSH2_CHANNEL*c,const char*r,unsigned int rl,const char*m,unsigned int ml){(void)c;(void)r;(void)rl;(void)m;(void)ml;return driver_phase==3?LIBSSH2_ERROR_EAGAIN:0;} +int libssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL*c,int w,int h,int wp,int hp){(void)c;(void)w;(void)h;(void)wp;(void)hp;return driver_resize_reject?LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED:0;} +ssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL*c,int stream,const char*b,size_t n){(void)c;(void)stream;(void)b;if(driver_partial){driver_partial=false;driver_write_fail=true;driver_writes++;return 1;}if(driver_write_again)return LIBSSH2_ERROR_EAGAIN;if(driver_write_fail)return LIBSSH2_ERROR_SOCKET_SEND;driver_writes++;return n;} +ssize_t libssh2_channel_read_ex(LIBSSH2_CHANNEL*c,int stream,char*b,size_t n){(void)c;(void)stream;(void)b;(void)n;driver_reads++;return driver_read_fail?LIBSSH2_ERROR_SOCKET_RECV:0;} +int libssh2_channel_eof(LIBSSH2_CHANNEL*c){(void)c;return driver_eof;} +int libssh2_channel_send_eof(LIBSSH2_CHANNEL*c){(void)c;return driver_close_again?LIBSSH2_ERROR_EAGAIN:0;} +int libssh2_channel_wait_eof(LIBSSH2_CHANNEL*c){(void)c;return driver_close_again?LIBSSH2_ERROR_EAGAIN:0;} +int libssh2_channel_close(LIBSSH2_CHANNEL*c){return driver_close_again&&!c->owner->local_closed?LIBSSH2_ERROR_EAGAIN:0;} +int libssh2_channel_get_exit_status(LIBSSH2_CHANNEL*c){(void)c;return 0;} +esp_err_t ts_known_hosts_verify(ts_ssh_session_t s,ts_host_verify_result_t*r,ts_known_host_t*h){(void)s;(void)h;*r=TS_HOST_VERIFY_OK;return ESP_OK;} +#define socket driver_socket +#define close driver_close +#define connect driver_connect +#define fcntl driver_fcntl +#define select driver_select +#define malloc tracked_malloc +#define calloc host_calloc +#define free tracked_free +#define TAG client_tag +#define wait_socket client_wait_socket +#include "../../components/ts_security/src/ts_ssh_client.c" +#undef wait_socket +#undef TAG +#define TAG shell_tag +#include "../../components/ts_security/src/ts_ssh_shell.c" +#undef TAG +#undef malloc +#undef calloc +#undef free +#undef socket +#undef close +#undef connect +#undef fcntl +#undef select diff --git a/tests/ws_subscriptions/project_stubs/ts_core.h b/tests/ws_subscriptions/project_stubs/ts_core.h new file mode 100644 index 0000000..b3a531d --- /dev/null +++ b/tests/ws_subscriptions/project_stubs/ts_core.h @@ -0,0 +1,4 @@ +#pragma once +#define TS_MALLOC_PSRAM(n) tracked_malloc(n) +#define TS_CALLOC_PSRAM(n,z) host_calloc(n,z) +#define TS_REALLOC_PSRAM(p,n) realloc(p,n) diff --git a/tests/ws_subscriptions/replay_project_baseline.py b/tests/ws_subscriptions/replay_project_baseline.py new file mode 100644 index 0000000..f1e73b4 --- /dev/null +++ b/tests/ws_subscriptions/replay_project_baseline.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""Replay frozen pre-v3 product source; no checkout or mutation of working source.""" +import hashlib,json,os,pathlib,shutil,subprocess,tarfile,tempfile +root=pathlib.Path(__file__).resolve().parents[2];doc=root/'docs/repair/ws-project-v3' +with tempfile.TemporaryDirectory(prefix='ts-v3-baseline-') as name: + dst=pathlib.Path(name) + with tarfile.open(doc/'baseline.tar.gz') as t:t.extractall(dst,filter='data') + for file,digest in json.loads((doc/'baseline.json').read_text())['sha256'].items(): + assert hashlib.sha256((dst/file).read_bytes()).hexdigest()==digest,file + (dst/'components/ts_console/commands').mkdir(parents=True,exist_ok=True) + shutil.copy2(doc/'baseline-console.c',dst/'components/ts_console/commands/ts_cmd_ssh.c') + # Console header only; do not replace the frozen callback with today's code. + (dst/'components/ts_console/include').symlink_to(root/'components/ts_console/include',target_is_directory=True) + # Dependencies outside the frozen affected units are read-only current headers/vendor. + for p in (root/'components').iterdir(): + if not (dst/'components'/p.name).exists():(dst/'components'/p.name).symlink_to(p,target_is_directory=p.is_dir()) + with tarfile.open(doc/'baseline-fixture.tar.gz') as t:t.extractall(dst,filter='data') + p=subprocess.run(['node','tests/prompts/project-cross.cjs','--baseline'],cwd=dst,env=dict(os.environ,CROSS_OUTPUT=str(doc/'baseline-h1.json')),capture_output=True,text=True) + (doc/'baseline-h1.txt').write_text(p.stdout+p.stderr);assert p.returncode==0 and 'CONFIRMED H1' in p.stdout,p.stdout+p.stderr + # Same current lower-driver assertions against the frozen production, separate from H1. + for file in ['test_shell_driver.c','run_shell_driver.sh','project_driver.inc']: + shutil.copy2(root/'tests/ws_subscriptions'/file,dst/'tests/ws_subscriptions'/file) + for args,label,marker in [([], 'no-data','ESP_ERR_TIMEOUT'),(['--eof-only'],'eof-release','!live_allocations'),(['--cli-exit'],'cli-exit','!ts_ssh_shell_is_active(shell)')]: + p=subprocess.run(['bash','tests/ws_subscriptions/run_shell_driver.sh',*args],cwd=dst,env=dict(os.environ,PROJECT_BASELINE='1'),capture_output=True,text=True) + evidence=p.stdout+p.stderr;(doc/('baseline-'+label+'.txt')).write_text(evidence) + assert p.returncode!=0 and 'Assertion failed:' in evidence and marker in evidence,evidence + print('CONFIRMED production defect:',label) + p=subprocess.run(['bash','tests/ws_subscriptions/run_shell_driver.sh','--metrics'],cwd=dst,env=dict(os.environ,PROJECT_BASELINE='1'),capture_output=True,text=True) + assert p.returncode==0,p.stderr + (doc/'baseline-allocation-metrics.json').write_text(p.stdout) + print('CONFIRMED H1 and lower-driver business counterexamples; source hashes verified') diff --git a/tests/ws_subscriptions/run_project_bridge.sh b/tests/ws_subscriptions/run_project_bridge.sh new file mode 100644 index 0000000..9609ec6 --- /dev/null +++ b/tests/ws_subscriptions/run_project_bridge.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -euo pipefail +cd "$(dirname "$0")/../.." +: "${IDF_PATH:?NOT RUN: set IDF_PATH to the project SDK}" +build=$(mktemp -d /tmp/ts-ws-adapter.XXXXXX) +trap 'rm -rf "$build"' EXIT +cjson="$IDF_PATH/components/json/cJSON" +"${CC:-cc}" -std=gnu11 -g -Wno-deprecated-declarations -Wno-macro-redefined -fsanitize=address,undefined \ + -Itests/ws_subscriptions/project_stubs -Icomponents/ch405labs_esp_libssh2/libssh2/include -Itests/ws_subscriptions/stubs -Icomponents/ts_webui/include -Icomponents/ts_webui/src -Icomponents/ts_security/include -Icomponents/ts_automation/include -Icomponents/ts_drivers/include -Icomponents/ts_console/include -Icomponents/ts_net/include -I"$cjson" \ + tests/ws_subscriptions/test_project.c "$cjson/cJSON.c" -o "$build/adapter" +"$build/adapter" diff --git a/tests/ws_subscriptions/run_project_v3.py b/tests/ws_subscriptions/run_project_v3.py new file mode 100644 index 0000000..5fb597c --- /dev/null +++ b/tests/ws_subscriptions/run_project_v3.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +"""Local suite entry; no device access. Preserve every subprocess exit status.""" +import json, os, pathlib, subprocess, sys +root=pathlib.Path(__file__).resolve().parents[2] +out=pathlib.Path(os.environ.get('V3_RESULTS',str(root/'docs/repair/ws-project-v3/results')));out.mkdir(parents=True,exist_ok=True) +commands=[('host',['bash','tests/ws_subscriptions/run_host.sh']),('operation',['bash','tests/ws_subscriptions/run_operation.sh']),('adapter',['bash','tests/ws_subscriptions/run_operation_adapter.sh']),('control',['bash','tests/ws_subscriptions/run_control.sh']),('reviewer',['bash','tests/ws_subscriptions/run_reviewer.sh']),('f1_f2',['bash','tests/ws_subscriptions/run_f1_f2.sh']),('runtime',['bash','tests/runtime/run_all.sh']),('certificate',['bash','tests/certificate/run_host.sh']),('prompts',['npm','test','--prefix','tests/prompts']),('release',['python3','tests/release/test_release.py']),('shell_driver',['bash','tests/ws_subscriptions/run_shell_driver.sh'])] +if '--browser' in sys.argv: commands=[('browser',['npm','run','test:browser','--prefix','tests/prompts'])] +results=[] +for name,cmd in commands: + with (out/(name+'.log')).open('w') as f:r=subprocess.run(cmd,cwd=root,stdout=f,stderr=subprocess.STDOUT) + results.append(dict(name=name,command=cmd,exit=r.returncode));print(name,r.returncode,flush=True) +for language in ['en-US','zh-CN']: + name=('cross-browser-' if '--browser' in sys.argv else 'cross-node-')+language + env=dict(os.environ,CROSS_LANGUAGE=language,CROSS_OUTPUT=str(out/(name+'.json'))) + cmd=['node','tests/prompts/project-cross.cjs']+(['--browser'] if '--browser' in sys.argv else []) + with (out/(name+'.log')).open('w') as f:r=subprocess.run(cmd,cwd=root,env=env,stdout=f,stderr=subprocess.STDOUT) + results.append(dict(name=name,command=cmd,exit=r.returncode));print(name,r.returncode,flush=True) +(out/('browser.json' if '--browser' in sys.argv else 'host.json')).write_text(json.dumps(results,indent=2)) +sys.exit(any(r['exit'] for r in results)) diff --git a/tests/ws_subscriptions/run_shell_driver.sh b/tests/ws_subscriptions/run_shell_driver.sh new file mode 100644 index 0000000..fb52e4f --- /dev/null +++ b/tests/ws_subscriptions/run_shell_driver.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -euo pipefail +cd "$(dirname "$0")/../.." +: "${IDF_PATH:?NOT RUN: set IDF_PATH to the project SDK}" +build=$(mktemp -d /tmp/ts-ws-adapter.XXXXXX) +trap 'rm -rf "$build"' EXIT +cjson="$IDF_PATH/components/json/cJSON" +extra=() +if [[ "${PROJECT_BASELINE:-0}" == 1 ]]; then extra+=(-DPROJECT_BASELINE); fi +python3 - "$build" <<'PYCLI' +import pathlib,sys +s=pathlib.Path('components/ts_console/commands/ts_cmd_ssh.c').read_text() +a=s.index('static const char *shell_input_callback(');b=s.index('static int do_ssh_shell(',a) +pathlib.Path(sys.argv[1],'cli_shell_fixture.inc').write_text(s[a:b]) +PYCLI +"${CC:-cc}" -std=gnu11 -g -Wno-deprecated-declarations -Wno-macro-redefined -fsanitize=address,undefined \ + "${extra[@]}" -I"$build" -Itests/ws_subscriptions/project_stubs -Icomponents/ch405labs_esp_libssh2/libssh2/include -Itests/ws_subscriptions/stubs -Icomponents/ts_webui/include -Icomponents/ts_webui/src -Icomponents/ts_security/include -Icomponents/ts_automation/include -Icomponents/ts_drivers/include -Icomponents/ts_console/include -Icomponents/ts_net/include -I"$cjson" \ + tests/ws_subscriptions/test_shell_driver.c "$cjson/cJSON.c" -o "$build/adapter" +"$build/adapter" "$@" diff --git a/tests/ws_subscriptions/test_operation_adapter.c b/tests/ws_subscriptions/test_operation_adapter.c index fa881f7..4a98321 100644 --- a/tests/ws_subscriptions/test_operation_adapter.c +++ b/tests/ws_subscriptions/test_operation_adapter.c @@ -68,11 +68,15 @@ static int adapter_create_caps(void(*fn)(void*),const char *n,unsigned stack,voi #undef heap_caps_calloc #undef xTaskCreate #undef xTaskCreateWithCaps +#ifndef PROJECT_REAL_DRIVER struct ts_ssh_session_s {bool aborted;ts_ssh_config_t config;}; +#endif static unsigned control_writes,control_signals,control_resizes,commands_submitted; static void (*stage_hook)(const char *); static void stage(const char *name){if(stage_hook)stage_hook(name);} +#ifndef PROJECT_REAL_DRIVER struct ts_ssh_shell_s {bool active;}; +#endif static unsigned aborts,variable_writes,session_destroys; static int remote_failure; static void (*remote_hook)(void); @@ -92,6 +96,7 @@ BaseType_t xTimerPendFunctionCall(void(*fn)(void*,uint32_t),void *arg,uint32_t v assert(timer_queued<16);timer_queue[timer_queued++]=(typeof(timer_queue[0])){fn,arg,v,NULL};return pdPASS; } static void timer_pump(void){while(timer_queued){typeof(timer_queue[0]) q=timer_queue[0];memmove(timer_queue,timer_queue+1,--timer_queued*sizeof(*timer_queue));if(q.deleted){free(q.deleted);host_timer=NULL;}else q.fn(q.arg,q.value);}} +#ifndef PROJECT_REAL_DRIVER esp_err_t ts_ssh_session_create(const ts_ssh_config_t*c,ts_ssh_session_t *out){stage("create");if(remote_failure==1)return ESP_FAIL;*out=host_calloc(1,sizeof(**out));if(*out)(*out)->config=*c;return *out?ESP_OK:ESP_ERR_NO_MEM;} esp_err_t ts_ssh_connect(ts_ssh_session_t s){stage("connect");if(s->config.cancelled && s->config.cancelled(s->config.cancel_context))return ESP_ERR_TIMEOUT;stage("auth");return remote_failure==2?ESP_FAIL:ESP_OK;} const char *ts_ssh_get_error(ts_ssh_session_t s){(void)s;return "fake network error";} @@ -100,6 +105,7 @@ esp_err_t ts_ssh_session_destroy(ts_ssh_session_t s){session_destroys++;tracked_ void ts_ssh_abort(ts_ssh_session_t s){s->aborted=true;aborts++;} esp_err_t ts_ssh_shell_open(ts_ssh_session_t s,const ts_shell_config_t*c,ts_ssh_shell_t *out){(void)s;(void)c;if(remote_failure==3)return ESP_FAIL;*out=host_calloc(1,sizeof(**out));(*out)->active=true;return 0;} bool ts_ssh_shell_is_active(ts_ssh_shell_t s){return s&&s->active;} +ts_shell_state_t ts_ssh_shell_get_state(ts_ssh_shell_t s){return s&&s->active?TS_SHELL_STATE_RUNNING:TS_SHELL_STATE_CLOSED;} esp_err_t ts_ssh_shell_close(ts_ssh_shell_t s){tracked_free(s);return 0;} esp_err_t ts_ssh_shell_read(ts_ssh_shell_t s,char *b,size_t n,size_t *out){(void)b;(void)n;*out=0;s->active=false;return 0;} esp_err_t ts_ssh_shell_write(ts_ssh_shell_t s,const char *b,size_t n,size_t *out){(void)s;(void)b;(void)n;(void)out;control_writes++;return 0;} @@ -109,6 +115,9 @@ esp_err_t ts_ssh_exec_stream(ts_ssh_session_t s,const char *command,ts_ssh_outpu (void)command;stage("submit");if(s->config.cancelled && s->config.cancelled(s->config.cancel_context))return ESP_ERR_TIMEOUT;commands_submitted++;if(remote_hook)remote_hook();if(remote_timeout && host_timer)host_timer->fn(host_timer); cb("value=42\n",9,false,arg);*code=0;return s->aborted || (s->config.cancelled && s->config.cancelled(s->config.cancel_context))?ESP_ERR_TIMEOUT:ESP_OK; } +#else +#include "project_driver.inc" +#endif esp_err_t ts_keystore_load_private_key(const char *id,char **out,size_t *n){(void)id;stage("key");*out=host_strdup("fake-key");*n=9;return ESP_OK;} esp_err_t ts_variable_upsert(const ts_auto_variable_t *v){(void)v;variable_writes++;return 0;} esp_err_t ts_console_exec(const char *cmd,ts_cmd_result_t *result){(void)cmd;memset(result,0,sizeof(*result));return 0;} @@ -121,7 +130,11 @@ esp_err_t ts_log_remove_callback(ts_log_callback_handle_t h){(void)h;return remo size_t ts_log_buffer_search(ts_log_entry_t *e,size_t n,ts_log_level_t min,ts_log_level_t max,const char *tag,const char *keyword){(void)e;(void)n;(void)min;(void)max;(void)tag;(void)keyword;return 0;} httpd_handle_t ts_http_server_get_handle(void){return (void*)11;} void ts_http_server_set_stop_hooks(esp_err_t(*stop)(httpd_handle_t),void(*stopped)(httpd_handle_t)){(void)stop;(void)stopped;} -static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){(void)caps;if(close_during_create)((ssh_shell_context_t*)arg)->shell->active=false;return adapter_create(fn,n,stack,arg,p,out);} +static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){(void)caps; +#ifndef PROJECT_REAL_DRIVER +if(close_during_create)((ssh_shell_context_t*)arg)->shell->active=false; +#endif +return adapter_create(fn,n,stack,arg,p,out);} static void drive_all(void){for(unsigned i=0;i<12;i++){ts_ws_op_poll();pump();timer_pump();}assert(!timer_queued);} static void setup(void){start();memset(s_clients,0,sizeof(s_clients));s_server=(void*)11;s_ws_stopping=false;ts_ws_op_enable();transport_server.closed=peer_closed;for(int fd=1;fd<=2;fd++){reqs[fd]=(httpd_req_t){.handle=(void*)11,.fd=fd};current=(void*)3;assert(add_client(&reqs[fd],WS_CLIENT_TYPE_EVENT)==ESP_OK);}current=(void*)1;} static void finish_all(void){drive_all();assert(!ts_ws_op_busy());stop();assert(!live_allocations);} diff --git a/tests/ws_subscriptions/test_project.c b/tests/ws_subscriptions/test_project.c new file mode 100644 index 0000000..b7b63f7 --- /dev/null +++ b/tests/ws_subscriptions/test_project.c @@ -0,0 +1,40 @@ +#define OP_ADAPTER_NO_MAIN +#define PROJECT_REAL_DRIVER +#include "test_operation_adapter.c" +static void emit(httpd_ws_frame_t*f){ + printf("{\"frame\":%.*s,\"fd\":%d,\"bytes\":\"",(int)f->len,f->payload,sent_fd); + for(size_t i=0;ilen;i++){unsigned char c=f->payload[i];if(c=='"'||c=='\\')putchar('\\');if(c<32)printf("\\u%04x",c);else putchar(c);}puts("\"}"); +} +static void close_during_error(void){ssh_shell_context_t *ctx=shell_task.arg;ssh_send_output(ctx,"last output",11);ssh_close(ctx->op,"closed","SSH session closed");} +static void fail_error_encoding(void){fail_allocation=allocations+1;} +int main(void){ + cJSON_Hooks h={tracked_malloc,tracked_free};cJSON_InitHooks(&h);sent_hook=emit;setup(); + char line[4096];while(fgets(line,sizeof(line),stdin)){ + cJSON *j=cJSON_Parse(line);assert(j);const char *cmd=cJSON_GetStringValue(cJSON_GetObjectItem(j,"cmd")); + if(cmd && !strcmp(cmd,"finish")){ssh_cleanup();if(shell_task.fn){shell_task.fn(shell_task.arg);shell_task.fn=NULL;}drive_all();cJSON_Delete(j);finish_all();assert(!driver_channels&&!driver_sessions&&!driver_sockets);puts("{\"finished\":true}");return 0;} + if(cmd && !strcmp(cmd,"eof")){driver_eof=true;shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} + else if(cmd && !strcmp(cmd,"output")){ssh_shell_context_t *ctx=shell_task.arg;ssh_send_output(ctx,"stream",6);} + else if(cmd && !strcmp(cmd,"error_close")){barrier_name="request_error_encode";barrier_action=close_during_error;} + else if(cmd && !strcmp(cmd,"write_again"))driver_write_again=true; + else if(cmd && !strcmp(cmd,"close_again"))driver_close_again=true; + else if(cmd && !strcmp(cmd,"reset_driver")){driver_write_fail=driver_write_again=driver_resize_reject=driver_close_again=driver_eof=false;driver_phase=0;} + else if(cmd && !strcmp(cmd,"setup_fail"))driver_phase=4; + else if(cmd && !strcmp(cmd,"queue_fail"))queue_fail=true; + else if(cmd && !strcmp(cmd,"queue_resume")){queue_fail=false;test_now+=100000;drive_all();} + else if(cmd && !strcmp(cmd,"send_fail"))send_fail=true; + else if(cmd && !strcmp(cmd,"send_resume"))send_fail=false; + else if(cmd && !strcmp(cmd,"encode_fail")){barrier_name="request_error_encode";barrier_action=fail_error_encoding;} + else if(cmd && !strcmp(cmd,"encode_resume"))fail_allocation=0; + else if(cmd && !strcmp(cmd,"write_fail"))driver_write_fail=true; + else if(cmd && !strcmp(cmd,"resize_reject"))driver_resize_reject=true; + else if(cmd && !strcmp(cmd,"drain"))drive_all(); + else { + int fd=1;cJSON *f=cJSON_GetObjectItem(j,"fd");if(f)fd=f->valueint; + cJSON *msg=cJSON_GetObjectItem(j,"message");char *raw=cJSON_PrintUnformatted(msg);incoming=raw;reqs[fd].method=1;current=(void*)3;int ret=ws_handler(&reqs[fd]);current=(void*)1;incoming=NULL;cJSON_free(raw);assert(ret==0);drive_all(); + } + if(shell_task.fn && (((ssh_shell_context_t*)shell_task.arg)->disconnect_requested || !ts_ws_op_is_open(((ssh_shell_context_t*)shell_task.arg)->op))){shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} + ts_ws_op_stats_t st;ts_ws_op_stats(TS_WS_OP_SHELL,&st); + printf("{\"state\":%d,\"writes\":%d,\"live\":%u,\"channels\":%d,\"refs\":%u,\"preparing\":%u,\"unsettled\":%u}\n",st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j); + } + return 2; +} diff --git a/tests/ws_subscriptions/test_shell_driver.c b/tests/ws_subscriptions/test_shell_driver.c new file mode 100644 index 0000000..d6f6f8d --- /dev/null +++ b/tests/ws_subscriptions/test_shell_driver.c @@ -0,0 +1,56 @@ +#define OP_ADAPTER_NO_MAIN +#define PROJECT_REAL_DRIVER +#include "test_operation_adapter.c" +static unsigned notified; +static void cli_output(const char *data,size_t len,void *arg){(void)data;(void)len;(void)arg;} +#define CONFIG_ESP_CONSOLE_UART_NUM 0 +static unsigned cli_interrupts; +static int uart_read_bytes(int port,uint8_t *b,size_t n,unsigned wait){(void)port;(void)n;(void)wait;*b=0x1c;return 1;} +static void cli_request_interrupt(void){cli_interrupts++;} +static void cli_printf(const char *fmt,...){(void)fmt;} +#define ts_console_request_interrupt cli_request_interrupt +#define ts_console_printf cli_printf +#include "cli_shell_fixture.inc" +#undef ts_console_request_interrupt +#undef ts_console_printf +static void driver_closed_cb(int code,void *arg){(void)code;(void)arg;notified++;} +static void make_shell(ts_ssh_session_t *session,ts_ssh_shell_t *shell){ + ts_ssh_config_t c=TS_SSH_DEFAULT_CONFIG();c.host="192.0.2.1";c.username="u";c.auth.password="p"; + assert(ts_ssh_session_create(&c,session)==0 && ts_ssh_connect(*session)==0); + assert(ts_ssh_shell_open(*session,NULL,shell)==0); +} +static void empty(void){assert(!live_allocations && !driver_channels && !driver_sessions && !driver_sockets);} +int main(int argc,char **argv){ + (void)argv; + cJSON_Hooks hooks={tracked_malloc,tracked_free};cJSON_InitHooks(&hooks); + ts_ssh_session_t session;ts_ssh_shell_t shell;char buf[8];size_t n;int64_t before; + if(argc>1 && !strcmp(argv[1],"--cli-exit")){make_shell(&session,&shell);size_t ignored=0;shell_input_callback(&ignored,shell);fprintf(stderr,"CLI exit: active=%d interrupt=%u\n",ts_ssh_shell_is_active(shell),cli_interrupts);assert(!ts_ssh_shell_is_active(shell) && cli_interrupts==1);ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty();return 0;} + if(argc>1 && !strcmp(argv[1],"--metrics")){unsigned begin=allocations;make_shell(&session,&shell);unsigned opened=allocations;assert(ts_ssh_shell_write(shell,"abc",3,&n)==ESP_OK);unsigned wrote=allocations;assert(ts_ssh_shell_send_signal(shell,"TERM")==ESP_ERR_NOT_SUPPORTED);unsigned rejected=allocations;ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty();printf("{\"open_allocations\":%u,\"write_allocations\":%u,\"unsupported_allocations\":%u,\"close_allocations\":%u,\"retained\":%u}\n",opened-begin,wrote-opened,rejected-wrote,allocations-rejected,live_allocations);return 0;} + if(argc>1){make_shell(&session,&shell);driver_eof=true;assert(ts_ssh_shell_read(shell,buf,sizeof(buf),&n)==ESP_ERR_INVALID_STATE);assert(ts_ssh_shell_close(shell)==0);ts_ssh_session_destroy(session);fprintf(stderr,"EOF ledger: allocations=%u channels=%d sessions=%d sockets=%d\n",live_allocations,driver_channels,driver_sessions,driver_sockets);empty();return 0;} + make_shell(&session,&shell);assert(ts_ssh_shell_read(shell,buf,sizeof(buf),&n)==ESP_ERR_TIMEOUT && ts_ssh_shell_is_active(shell)); + ts_ssh_shell_set_close_cb(shell,driver_closed_cb,NULL);driver_eof=true; + assert(ts_ssh_shell_poll(shell)==ESP_ERR_INVALID_STATE && notified==1);assert(ts_ssh_shell_close(shell)==0);shell=NULL;assert(notified==1);assert(ts_ssh_session_destroy(session)==0);empty();driver_eof=false; + puts("PASS real Shell+client: zero data is not EOF; EOF then close releases wrapper/channel/session/socket; close callback exactly once"); + make_shell(&session,&shell);driver_write_fail=true;assert(ts_ssh_shell_write(shell,"x",1,&n)==ESP_FAIL && n==0 && !ts_ssh_shell_is_active(shell));driver_write_fail=false; + assert(ts_ssh_shell_close(shell)==0);ts_ssh_session_destroy(session);empty(); + make_shell(&session,&shell);driver_partial=true;assert(ts_ssh_shell_write(shell,"abc",3,&n)==ESP_FAIL && n==1 && !ts_ssh_shell_is_active(shell));driver_write_fail=false;ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty(); + make_shell(&session,&shell);driver_resize_reject=true;assert(ts_ssh_shell_resize(shell,80,24)==ESP_FAIL && ts_ssh_shell_is_active(shell));driver_resize_reject=false;driver_read_fail=true;assert(ts_ssh_shell_read(shell,buf,sizeof(buf),&n)==ESP_FAIL && !ts_ssh_shell_is_active(shell));driver_read_fail=false;ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty(); + make_shell(&session,&shell);driver_write_again=true;before=test_now;assert(ts_ssh_shell_write(shell,"x",1,&n)==ESP_ERR_TIMEOUT && test_now-before<=1000000);driver_write_again=false; + driver_close_again=true;before=test_now;assert(ts_ssh_shell_close(shell)==0 && test_now==before);ts_ssh_session_destroy(session);driver_close_again=false;empty(); + puts("PASS real Shell+client: fatal write/timeout retires channel; persistent close EAGAIN falls back to local session teardown without waiting"); + for(int phase=1;phase<=4;phase++){ + ts_ssh_config_t c=TS_SSH_DEFAULT_CONFIG();c.host="192.0.2.1";c.username="u";c.auth.password="p"; + assert(ts_ssh_session_create(&c,&session)==0 && ts_ssh_connect(session)==0);driver_phase=phase;driver_close_again=true;before=test_now;shell=(void*)1; + assert(ts_ssh_shell_open(session,NULL,&shell)!=0 && !shell && test_now-before<=10000000);ts_ssh_session_destroy(session);driver_phase=0;driver_close_again=false;empty(); + } + puts("PASS real Shell+client: partial initialization/open/PTY/shell-start failure and bounded EAGAIN all release owned resources"); + make_shell(&session,&shell);before=driver_reads;assert(ts_ssh_shell_run(shell,cli_output,shell_input_callback,shell)==ESP_OK && driver_reads==before && cli_interrupts==1);ts_ssh_shell_close(shell);ts_ssh_session_destroy(session);empty(); + puts("PASS Shell run: local exit requested by input callback stops before another network read; close still owns cleanup"); + setup();cJSON *j=cJSON_Parse("{\"host\":\"192.0.2.1\",\"user\":\"u\",\"password\":\"p\"}");handle_ssh_connect(&reqs[1],j);cJSON_Delete(j);assert(shell_task.fn);ssh_shell_context_t *ctx=shell_task.arg;ssh_cleanup();shell_resources_close(ctx);shell_resources_close(ctx);shell_task.fn(shell_task.arg);finish_all();empty(); + puts("PASS actual WebUI cleanup twice uses cleared handles; original operation/ticket/target and actual lower resources drain"); + setup();shell_task.fn=NULL;j=cJSON_Parse("{\"host\":\"192.0.2.1\",\"user\":\"u\",\"password\":\"p\"}");handle_ssh_connect(&reqs[1],j);cJSON_Delete(j);assert(shell_task.fn); + ssh_send_output(shell_task.arg,"accepted",8); + assert(ts_webui_ws_stop((void*)11)==ESP_ERR_TIMEOUT);assert(driver_channels==1 && ts_ws_op_busy()); + delay_hook=stop_progress_shell;assert(ts_webui_ws_stop((void*)11)==ESP_OK);delay_hook=NULL;for(int i=0;i<32;i++)if(reqs[i].sess_ctx)close_peer(i);ts_webui_ws_stopped((void*)11);empty(); + puts("PASS real lower resources survive stop timeout; accepted output and terminal drain on retry with no new business message"); +} diff --git a/tests/ws_subscriptions/verify_project_assets.py b/tests/ws_subscriptions/verify_project_assets.py new file mode 100644 index 0000000..20e4116 --- /dev/null +++ b/tests/ws_subscriptions/verify_project_assets.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +"""Verify final optimized/gzip files and reproduce SPIFFS with the fixed SDK.""" +import gzip,hashlib,json,os,pathlib,subprocess,tempfile +root=pathlib.Path(__file__).resolve().parents[2] +build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));web=build/'esp-idf/ts_webui/web_optimized';src=root/'components/ts_webui/web';doc=root/'docs/repair/ws-project-v3' +sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() +result={} +for rel in ['index.html','js/terminal.js','js/lang/zh-CN.js','js/lang/en-US.js']: + p=web/rel;gz=p.with_suffix(p.suffix+'.gz');assert gzip.decompress(gz.read_bytes())==p.read_bytes() + if rel.endswith('.js'):subprocess.run(['node','--check',str(p)],check=True) + result[rel]={'source_sha256':sha(src/rel),'optimized_sha256':sha(p),'gzip_sha256':sha(gz),'optimized_bytes':p.stat().st_size} +assert '20260926-shell-contract' in (web/'index.html').read_text() +assert 'sshControlUnsupported' in (web/'js/terminal.js').read_text() +with tempfile.TemporaryDirectory(prefix='ts-v3-spiffs-') as d: + image=pathlib.Path(d)/'www.bin' + cmd=['python3',os.environ['IDF_PATH']+'/components/spiffs/spiffsgen.py','0x300000',str(web),str(image),'--page-size=256','--obj-name-len=32','--meta-len=4','--use-magic','--use-magic-len'] + subprocess.run(cmd,check=True);assert image.read_bytes()==(build/'www.bin').read_bytes() +result['build']={p:{'sha256':sha(build/p),'bytes':(build/p).stat().st_size} for p in ['TianShanOS.bin','www.bin','TianShanOS.elf']} +result['spiffs_regeneration']='byte-identical from verified optimized directory' +(doc/'assets.json').write_text(json.dumps(result,indent=2)) +print('PASS optimized syntax, gzip identity, cache key, and byte-identical SPIFFS reconstruction') From 633bb94df3e1e454929a14257c06c307c09100e6 Mon Sep 17 00:00:00 2001 From: Alfred Date: Sun, 27 Sep 2026 19:39:26 +0800 Subject: [PATCH 7/9] fix: preserve terminal input ownership across power alerts --- components/ts_webui/web/index.html | 18 +- components/ts_webui/web/js/terminal.js | 14 + docs/repair/ws-j1/README.md | 70 + docs/repair/ws-j1/after-node.txt | 10 + docs/repair/ws-j1/assets-check.txt | 1 + docs/repair/ws-j1/assets.json | 41 + docs/repair/ws-j1/before-cross.txt | 13 + docs/repair/ws-j1/before-node.txt | 46 + docs/repair/ws-j1/browser-results.json | 30 + docs/repair/ws-j1/build.log | 1673 +++++++++++++++++ docs/repair/ws-j1/changes.patch | 195 ++ docs/repair/ws-j1/cross-browser-en-US.json | 869 +++++++++ docs/repair/ws-j1/cross-browser-en-US.txt | 2 + docs/repair/ws-j1/cross-browser-zh-CN.json | 869 +++++++++ docs/repair/ws-j1/cross-browser-zh-CN.txt | 2 + docs/repair/ws-j1/cross-node-en-US.json | 869 +++++++++ docs/repair/ws-j1/cross-node-en-US.txt | 2 + docs/repair/ws-j1/cross-node-results.json | 18 + docs/repair/ws-j1/cross-node-zh-CN.json | 869 +++++++++ docs/repair/ws-j1/cross-node-zh-CN.txt | 2 + docs/repair/ws-j1/diff-check.txt | 1 + docs/repair/ws-j1/inputs.json | 31 + docs/repair/ws-j1/optimized-cross-en-US.json | 869 +++++++++ docs/repair/ws-j1/optimized-cross-en-US.txt | 2 + docs/repair/ws-j1/optimized-cross-zh-CN.json | 869 +++++++++ docs/repair/ws-j1/optimized-cross-zh-CN.txt | 2 + docs/repair/ws-j1/optimized-results.json | 20 + docs/repair/ws-j1/publication-cross.txt | 2 + docs/repair/ws-j1/publication-gate.md | 21 + docs/repair/ws-j1/publication-node.txt | 10 + docs/repair/ws-j1/webui-browser.txt | 56 + docs/repair/ws-j1/webui-node.txt | 53 + tests/prompts/project-cross.cjs | 16 + tests/prompts/regression.test.cjs | 37 + tests/ws_subscriptions/test_project.c | 7 +- .../ws_subscriptions/verify_project_assets.py | 7 +- 36 files changed, 7603 insertions(+), 13 deletions(-) create mode 100644 docs/repair/ws-j1/README.md create mode 100644 docs/repair/ws-j1/after-node.txt create mode 100644 docs/repair/ws-j1/assets-check.txt create mode 100644 docs/repair/ws-j1/assets.json create mode 100644 docs/repair/ws-j1/before-cross.txt create mode 100644 docs/repair/ws-j1/before-node.txt create mode 100644 docs/repair/ws-j1/browser-results.json create mode 100644 docs/repair/ws-j1/build.log create mode 100644 docs/repair/ws-j1/changes.patch create mode 100644 docs/repair/ws-j1/cross-browser-en-US.json create mode 100644 docs/repair/ws-j1/cross-browser-en-US.txt create mode 100644 docs/repair/ws-j1/cross-browser-zh-CN.json create mode 100644 docs/repair/ws-j1/cross-browser-zh-CN.txt create mode 100644 docs/repair/ws-j1/cross-node-en-US.json create mode 100644 docs/repair/ws-j1/cross-node-en-US.txt create mode 100644 docs/repair/ws-j1/cross-node-results.json create mode 100644 docs/repair/ws-j1/cross-node-zh-CN.json create mode 100644 docs/repair/ws-j1/cross-node-zh-CN.txt create mode 100644 docs/repair/ws-j1/diff-check.txt create mode 100644 docs/repair/ws-j1/inputs.json create mode 100644 docs/repair/ws-j1/optimized-cross-en-US.json create mode 100644 docs/repair/ws-j1/optimized-cross-en-US.txt create mode 100644 docs/repair/ws-j1/optimized-cross-zh-CN.json create mode 100644 docs/repair/ws-j1/optimized-cross-zh-CN.txt create mode 100644 docs/repair/ws-j1/optimized-results.json create mode 100644 docs/repair/ws-j1/publication-cross.txt create mode 100644 docs/repair/ws-j1/publication-gate.md create mode 100644 docs/repair/ws-j1/publication-node.txt create mode 100644 docs/repair/ws-j1/webui-browser.txt create mode 100644 docs/repair/ws-j1/webui-node.txt diff --git a/components/ts_webui/web/index.html b/components/ts_webui/web/index.html index d4aa9c9..59265c7 100644 --- a/components/ts_webui/web/index.html +++ b/components/ts_webui/web/index.html @@ -41,9 +41,9 @@ .modal-content{background:var(--bg-card);border-radius:var(--radius-lg);max-width:600px;width:95%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg)} - - - + + + @@ -247,7 +247,7 @@

    电压保护设置

    - - - - - + + + + + diff --git a/components/ts_webui/web/js/terminal.js b/components/ts_webui/web/js/terminal.js index ccd3a51..8fb1240 100644 --- a/components/ts_webui/web/js/terminal.js +++ b/components/ts_webui/web/js/terminal.js @@ -477,6 +477,7 @@ class WebTerminal { * 处理电压保护事件 */ handlePowerEvent(msg) { + if (this.destroyed || !this.terminal) return; const state = msg.state || 'UNKNOWN'; const voltage = msg.voltage ? msg.voltage.toFixed(2) : '?.??'; const countdown = msg.countdown || 0; @@ -535,6 +536,19 @@ class WebTerminal { } if (notification) { + const canRestoreLocalInput = + !this.destroyed && + this.connected && + this.ws && + this.ws.readyState === WebSocket.OPEN && + !this.sshMode && + !this.sshConnecting && + !this.sshDisconnecting && + !this.restoring; + if (!canRestoreLocalInput) { + this.writeln(`\r\n${color}${notification}\x1b[0m`); + return; + } // 保存当前输入状态 const savedBuffer = this.inputBuffer; const savedPosition = this.cursorPosition; diff --git a/docs/repair/ws-j1/README.md b/docs/repair/ws-j1/README.md new file mode 100644 index 0000000..9690543 --- /dev/null +++ b/docs/repair/ws-j1/README.md @@ -0,0 +1,70 @@ +# J1 电源告警显示修复 + +结论:**J1 已修复,本轮要求的本地验证通过;真实设备与远端终端显示仍待实机验收。** 本轮不对其他系统功能作无缺陷承诺。 + +实施基线 HEAD:`8ad39a9b1ca39d225f94fb4db602fb2ee7438d09`,分支 `fix/v0.5.2-reliability-and-prompts`。开始时无 tracked 修改,原有 output/、tmp/ 和 runtime-repair 下未跟踪文件未纳入修复。实施阶段未提交、推送、更新 PR、合并、发布或操作设备。用户随后授权更新 PR;提交前审查见 [publication-gate.md](publication-gate.md)。 + +## 修改范围 + +| 文件 | J1 必需的改动 | +|---|---| +| components/ts_webui/web/js/terminal.js | 仅 handlePowerEvent:销毁或无 terminal 时返回;完全采用指定 canRestoreLocalInput 条件。只有本地可交互时走原恢复代码,否则仅另起一行输出原告警 | +| components/ts_webui/web/index.html | 沿用 TS_ASSET_VERSION 和查询参数方式,缓存标识更新到 20260927-power-prompt;无布局改动 | +| tests/prompts/regression.test.cjs | 在既有 Node 测试中追加中英文状态矩阵,执行生产消息分发与已注册输入回调 | +| tests/prompts/project-cross.cjs | 在原跨层链中追加 J1:真实 C 保护通知 → 生产 socket 消费 → 实际输入 → 原 C Shell → 正常退出与回收;原 H1 等断言保留 | +| tests/ws_subscriptions/test_project.c | 仅测试夹具增加 power 命令,调用生产 power_policy_event_handler;输出原 op identity 供断言归属,不修改任何生产后端 | +| tests/ws_subscriptions/verify_project_assets.py | 原校验器硬编码旧 cache key,改为与当前源 index 标识比对;增加既有风格的结果目录参数,避免覆盖 v3 历史证据 | + +[实际 diff](changes.patch)、[前后输入哈希及范围记录](inputs.json)。已比较 terminal.js 修改前后:handlePowerEvent 之外完全一致;index 只替换缓存标识。后端 SSH、WS/operation、队列、引用、取消、采样、保护、版本和发布流程均未改。 + +## 行为与测试结果 + +修复前 J1 状态测试在活动 SSH 上失败:连续两次告警产生 8 次写入(包含清行、本地提示符/缓冲与光标),期望仅两次通知;实际 C 跨层反例也出现 4 次写入而不是一条通知。见 before-node.txt、before-cross.txt;这两项是业务断言失败,不是编译或环境失败。 + +| 场景 | 本次验证结果 | +|---|---| +| 本地 abcd 未提交、光标在第 2 位 | 连续告警均保留原 clear → 告警 → tianshan> abcd → 左移 2 位序列;字段不变,无自动提交;一次告警只恢复一次输入行 | +| 活动 SSH,连续告警 | 通知可见且另起一行;不清远端行、不写本地提示符、不回放 abcd、不用本地位置移动光标;状态及发送列表不变 | +| 告警后继续输入 | 实际 onData 产生 ssh_input;跨层返回真实 C handler 后,原 operation identity 不变且 driver 写入增加一次 | +| 正常退出 | 实际退出键产生 ssh_disconnect;请求后以及 disconnecting 阶段无本地提示符,收到 closed 后才恢复;真实 C channel 最终为零,原全部资源结算断言通过 | +| connecting / disconnecting / restoring | 均不恢复本地输入行,告警不改变任何指定状态字段;原受限输入仍被忽略 | +| 连接断开 / socket 非 OPEN / socket 不存在 | 不恢复本地提示符、不触发恢复或业务请求 | +| destroyed / terminal 不存在 | 直接调用告警处理也不访问销毁对象、不抛异常、不发请求 | +| 已从 SSH 正常关闭后再次告警 | 根据当时真实本地状态恢复提示符、缓冲与光标,不沿用先前 SSH 状态 | +| 原事件筛选 | countdown 31 不显示;30 及原保护通知仍显示。告警文本、颜色、翻译和 switch 分支无修改 | + +状态测试使用实际 terminal.js 和实际注册输入回调。Chrome 跨层加载真实入口、语言包和 socket 消费者;SDK 最终消息 bytes 来自生产 C 保护处理及传输层。SDK/网络、libssh2 外边界和 xterm 渲染仍为既有测试替身,不等于实机运行。 + +## 本次执行记录 + +以下均为本轮重新执行,未用历史结果代替: + +- `node --test --test-name-pattern=J1 tests/prompts/regression.test.cjs`:中英文 J1 状态/输入/筛选断言通过,见 after-node.txt。 +- `npm test --prefix tests/prompts`:40 项通过,包含原回归及新增 J1;见 webui-node.txt。 +- `npm run test:browser --prefix tests/prompts`:原浏览器回归 38 项通过,见 webui-browser.txt。 +- `CROSS_LANGUAGE=zh-CN/en-US node tests/prompts/project-cross.cjs`:两种语言均通过,保留原 H1、归属、生命周期等断言;见 cross-node-results.json 及对应消息证据。 +- 上一条加 `--browser`:两种语言 Chrome 跨层通过,见 browser-results.json。 +- 使用本次构建目录的 `PROJECT_WEB_ROOT=.../web_optimized`,再次运行双语 `project-cross.cjs --browser`:通过,见 optimized-results.json。证明打包后的消费者也具有 J1 行为。 +- `git diff --check`:通过。 + +C 夹具使用 `IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf`、`DEVELOPER_DIR=/Library/Developer/CommandLineTools`。跨层记录通过 `CROSS_OUTPUT` 保存到本目录。没有新增测试框架或变更依赖版本;独立控制/取消全套主机入口本轮未额外重跑,相关生产代码未修改,且现有断言未删改。 + +## 本次构建及静态资源 + +固定 ESP-IDF v5.5.2 / ESP32-S3,独立目录:`/tmp/tianshan-j1-build/build`。 + +```sh +# 在固定 SDK export.sh 环境中 +idf.py -B /tmp/tianshan-j1-build/build -D SDKCONFIG=/tmp/tianshan-j1-build/sdkconfig build +IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf \ +V3_BUILD=/tmp/tianshan-j1-build/build V3_RESULTS=docs/repair/ws-j1 \ +python3 tests/ws_subscriptions/verify_project_assets.py +``` + +构建成功;应用镜像 0x215120,应用分区约 31% 剩余。见 build.log。该日志包含 SDK 的刷机用法提示,**没有执行刷机命令**。 + +[assets.json](assets.json) 记录源码、优化文件、gzip、固件和 www 的哈希。JS 语法检查、gzip 解压一致、新 cache key 检查通过;用验证后的优化目录重新生成 SPIFFS,与实际 www.bin 逐字节一致。中英文优化资源跨层回放同时通过。支持固件/www 配套更新并刷新页面;未验证设备实际浏览器缓存升级过程。 + +## 未执行及验收边界 + +本轮要求的本地项目均已执行,无缺少环境而跳过的必需项目。未授权实机,因此未测试设备上的真实电源告警、真实 SSH/xterm 光标呈现、网络时序及缓存升级。实机应确认本地行中输入、活动 SSH 连续告警、输入与退出、连接过渡状态和更新后资源缓存的同样行为。没有发送远端重绘、回车或查询;远端提示符仍由远端输出决定。 diff --git a/docs/repair/ws-j1/after-node.txt b/docs/repair/ws-j1/after-node.txt new file mode 100644 index 0000000..b189c8e --- /dev/null +++ b/docs/repair/ws-j1/after-node.txt @@ -0,0 +1,10 @@ +✔ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (15.974625ms) +✔ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (5.388041ms) +ℹ tests 2 +ℹ suites 0 +ℹ pass 2 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 63.776708 diff --git a/docs/repair/ws-j1/assets-check.txt b/docs/repair/ws-j1/assets-check.txt new file mode 100644 index 0000000..4c96e4a --- /dev/null +++ b/docs/repair/ws-j1/assets-check.txt @@ -0,0 +1 @@ +PASS optimized syntax, gzip identity, cache key, and byte-identical SPIFFS reconstruction diff --git a/docs/repair/ws-j1/assets.json b/docs/repair/ws-j1/assets.json new file mode 100644 index 0000000..9f8cd48 --- /dev/null +++ b/docs/repair/ws-j1/assets.json @@ -0,0 +1,41 @@ +{ + "index.html": { + "source_sha256": "ad6e0ed5e11c34b8797877be912ea2e42a5dc632b6cdae1b915222ea6ea6315b", + "optimized_sha256": "ad6e0ed5e11c34b8797877be912ea2e42a5dc632b6cdae1b915222ea6ea6315b", + "gzip_sha256": "cb9d819710e9d2f39b409dd62b60c6d717bcb8f2f7e38fdf6f3aa8427896c90c", + "optimized_bytes": 26685 + }, + "js/terminal.js": { + "source_sha256": "8bfa9622f6fafb8cf1c88ab1081b47fa32df0fdd1814acdf67bd7708326ec0a1", + "optimized_sha256": "541da884de013c0028d59b06db25c9f3a399a4fe955e9998d52c8330a8ed6551", + "gzip_sha256": "cdeaedeffea9ecc872c3ee6ca4c8a9b004d02258c6bfb7b858d183d71d92f64b", + "optimized_bytes": 20034 + }, + "js/lang/zh-CN.js": { + "source_sha256": "bb3d3b4b28c8c146fdb1c437bee84862806ed915af8cc0aa2388deb6a9e9ef89", + "optimized_sha256": "81b0fed5b0ac73d51d9c37204c9f62e035a79bbf5b5610d37fc8a936faf9fd64", + "gzip_sha256": "219dd01fe4313897ed2bc739fcf9cd4cd862995647bb5cadd30361490a326bbf", + "optimized_bytes": 137314 + }, + "js/lang/en-US.js": { + "source_sha256": "58beed2b903407387d884c99f38eaef578e74be916175b53745d0d5ececadc10", + "optimized_sha256": "e9963046086616fecc9ba662df94e736a98c1430865e0caa47292b3690ca0ad0", + "gzip_sha256": "1e3f3e14884f76f4301275a8b4ba96951ca79f39b70b3d0b082faa0012f6776c", + "optimized_bytes": 143161 + }, + "build": { + "TianShanOS.bin": { + "sha256": "a26590324dd730d33c3ab1ea2149fcbe3d53fb7d698ca9c211e4bcd95e737bc5", + "bytes": 2183456 + }, + "www.bin": { + "sha256": "80457119106c753b8273aaec7c9a8e3e640bbac60447b6059d8b42e084baa132", + "bytes": 3145728 + }, + "TianShanOS.elf": { + "sha256": "0d50d71dd4d38fca6f786565106ea77cc9ca14d9523d8a2fc61fd11bd9fd1436", + "bytes": 18286808 + } + }, + "spiffs_regeneration": "byte-identical from verified optimized directory" +} \ No newline at end of file diff --git a/docs/repair/ws-j1/before-cross.txt b/docs/repair/ws-j1/before-cross.txt new file mode 100644 index 0000000..8abb7dd --- /dev/null +++ b/docs/repair/ws-j1/before-cross.txt @@ -0,0 +1,13 @@ +AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + +4 !== 1 + + at main (/Users/massif/TianshanOS/tests/prompts/project-cross.cjs:58:9) + at process.processTicksAndRejections (node:internal/process/task_queues:105:5) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 4, + expected: 1, + operator: 'strictEqual', + diff: 'simple' +} diff --git a/docs/repair/ws-j1/before-node.txt b/docs/repair/ws-j1/before-node.txt new file mode 100644 index 0000000..3850809 --- /dev/null +++ b/docs/repair/ws-j1/before-node.txt @@ -0,0 +1,46 @@ +✖ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (19.361916ms) +✖ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (4.840625ms) +ℹ tests 2 +ℹ suites 0 +ℹ pass 0 +ℹ fail 2 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 68.423167 + +✖ failing tests: + +test at tests/prompts/regression.test.cjs:174:2 +✖ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (19.361916ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + + 8 !== 2 + + at TestContext. (/Users/massif/TianshanOS/tests/prompts/regression.test.cjs:191:11) + at async Test.run (node:internal/test_runner/test:1113:7) + at async startSubtestAfterBootstrap (node:internal/test_runner/harness:358:3) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 8, + expected: 2, + operator: 'strictEqual', + diff: 'simple' + } + +test at tests/prompts/regression.test.cjs:174:2 +✖ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (4.840625ms) + AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: + + 8 !== 2 + + at TestContext. (/Users/massif/TianshanOS/tests/prompts/regression.test.cjs:191:11) + at async Test.run (node:internal/test_runner/test:1113:7) + at async Test.processPendingSubtests (node:internal/test_runner/test:788:7) { + generatedMessage: true, + code: 'ERR_ASSERTION', + actual: 8, + expected: 2, + operator: 'strictEqual', + diff: 'simple' + } diff --git a/docs/repair/ws-j1/browser-results.json b/docs/repair/ws-j1/browser-results.json new file mode 100644 index 0000000..d4d5efa --- /dev/null +++ b/docs/repair/ws-j1/browser-results.json @@ -0,0 +1,30 @@ +[ + { + "command": [ + "npm", + "run", + "test:browser", + "--prefix", + "tests/prompts" + ], + "exit": 0 + }, + { + "language": "zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + }, + { + "language": "en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ws-j1/build.log b/docs/repair/ws-j1/build.log new file mode 100644 index 0000000..0cb95c7 --- /dev/null +++ b/docs/repair/ws-j1/build.log @@ -0,0 +1,1673 @@ +Executing action: all (aliases: build) +Running cmake in directory /private/tmp/tianshan-j1-build/build +Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python -DESP_PLATFORM=1 -DSDKCONFIG=/tmp/tianshan-j1-build/sdkconfig -DCCACHE_ENABLE=0 /Users/massif/TianshanOS"... +-- Found Python3: /opt/anaconda3/bin/python3.12 (found version "3.12.4") found components: Interpreter +-- IDF_TARGET is not set, guessed 'esp32s3' from sdkconfig '/tmp/tianshan-j1-build/sdkconfig' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +NOTICE: +Following dependencies have new versions available: +Dependency "espressif/libpng": "1.6.54" -> "1.6.58~2" +Dependency "espressif/mdns": "1.9.1" -> "1.13.1" +Dependency "espressif/zlib": "1.3.1" -> "1.3.2~1" +Consider running "idf.py update-dependencies" to update your lock file. +NOTICE: Processing 7 dependencies: +NOTICE: [1/7] espressif/esp_jpeg (1.3.1) +NOTICE: [2/7] espressif/esp_websocket_client (1.5.0) +NOTICE: [3/7] espressif/led_strip (3.0.3) +NOTICE: [4/7] espressif/libpng (1.6.54) +NOTICE: [5/7] espressif/mdns (1.9.1) +NOTICE: [6/7] espressif/zlib (1.3.1) +NOTICE: [7/7] idf (5.5.2) +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-j1-build/sdkconfig +Loading defaults file /Users/massif/TianshanOS/sdkconfig.defaults... +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:54 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:56 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:64 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:66 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:82 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:84 line was updated to # === L2 NVS 加密配置(HMAC 方案)===n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:159 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:161 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:170 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:172 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:182 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:184 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:193 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:195 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:227 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmperfm1lr0:229 line was updated to # ============================================================================n +-- Compiler supported targets: xtensa-esp-elf +-- Found Python3: /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python (found version "3.12.4") found components: Interpreter +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success +-- Found Threads: TRUE +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success +-- USING O3 +-- App "TianShanOS" version: 0.5.2+8ad39a9d.09271926 +-- Adding linker script /tmp/tianshan-j1-build/build/esp-idf/esp_system/ld/memory.ld +-- Adding linker script /tmp/tianshan-j1-build/build/esp-idf/esp_system/ld/sections.ld.in +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_master.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_50.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_smp.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_dtm.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_test.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_scan.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Web optimization enabled (minify + gzip) +-- Components: app_trace app_update bootloader bootloader_support bt ch405labs_esp_libssh2 cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi espcoredump espressif__esp_jpeg espressif__esp_websocket_client espressif__led_strip espressif__libpng espressif__mdns espressif__zlib esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread rt sdmmc soc spi_flash spiffs tcp_transport touch_element ts_api ts_auth_layout ts_automation ts_cert ts_config ts_config_pack ts_console ts_core ts_drivers ts_event ts_hal ts_https ts_jsonpath ts_led ts_log ts_mempool ts_net ts_ota ts_pki_client ts_security ts_service ts_storage ts_webui ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/app_trace /Users/massif/esp/v5.5.2/esp-idf/components/app_update /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/bt /Users/massif/TianshanOS/components/ch405labs_esp_libssh2 /Users/massif/esp/v5.5.2/esp-idf/components/cmock /Users/massif/esp/v5.5.2/esp-idf/components/console /Users/massif/esp/v5.5.2/esp-idf/components/cxx /Users/massif/esp/v5.5.2/esp-idf/components/driver /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp-tls /Users/massif/esp/v5.5.2/esp-idf/components/esp_adc /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_coex /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ana_cmpr /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_bitscrambler /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_cam /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_dac /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gpio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gptimer /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2c /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2s /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_isp /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_jpeg /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ledc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_mcpwm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_parlio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_pcnt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ppa /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_rmt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdspi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_spi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_touch_sens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_tsens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_twai /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_uart /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_usb_serial_jtag /Users/massif/esp/v5.5.2/esp-idf/components/esp_eth /Users/massif/esp/v5.5.2/esp-idf/components/esp_event /Users/massif/esp/v5.5.2/esp-idf/components/esp_gdbstub /Users/massif/esp/v5.5.2/esp-idf/components/esp_hid /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_client /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_ota /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_lcd /Users/massif/esp/v5.5.2/esp-idf/components/esp_local_ctrl /Users/massif/esp/v5.5.2/esp-idf/components/esp_mm /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif_stack /Users/massif/esp/v5.5.2/esp-idf/components/esp_partition /Users/massif/esp/v5.5.2/esp-idf/components/esp_phy /Users/massif/esp/v5.5.2/esp-idf/components/esp_pm /Users/massif/esp/v5.5.2/esp-idf/components/esp_psram /Users/massif/esp/v5.5.2/esp-idf/components/esp_ringbuf /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esp_timer /Users/massif/esp/v5.5.2/esp-idf/components/esp_vfs_console /Users/massif/esp/v5.5.2/esp-idf/components/esp_wifi /Users/massif/esp/v5.5.2/esp-idf/components/espcoredump /Users/massif/TianshanOS/managed_components/espressif__esp_jpeg /Users/massif/TianshanOS/managed_components/espressif__esp_websocket_client /Users/massif/TianshanOS/managed_components/espressif__led_strip /Users/massif/TianshanOS/managed_components/espressif__libpng /Users/massif/TianshanOS/managed_components/espressif__mdns /Users/massif/TianshanOS/managed_components/espressif__zlib /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/fatfs /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/heap /Users/massif/esp/v5.5.2/esp-idf/components/http_parser /Users/massif/esp/v5.5.2/esp-idf/components/idf_test /Users/massif/esp/v5.5.2/esp-idf/components/ieee802154 /Users/massif/esp/v5.5.2/esp-idf/components/json /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/lwip /Users/massif/TianshanOS/main /Users/massif/esp/v5.5.2/esp-idf/components/mbedtls /Users/massif/esp/v5.5.2/esp-idf/components/mqtt /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/nvs_flash /Users/massif/esp/v5.5.2/esp-idf/components/nvs_sec_provider /Users/massif/esp/v5.5.2/esp-idf/components/openthread /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/perfmon /Users/massif/esp/v5.5.2/esp-idf/components/protobuf-c /Users/massif/esp/v5.5.2/esp-idf/components/protocomm /Users/massif/esp/v5.5.2/esp-idf/components/pthread /Users/massif/esp/v5.5.2/esp-idf/components/rt /Users/massif/esp/v5.5.2/esp-idf/components/sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/spiffs /Users/massif/esp/v5.5.2/esp-idf/components/tcp_transport /Users/massif/esp/v5.5.2/esp-idf/components/touch_element /Users/massif/TianshanOS/components/ts_api /Users/massif/TianshanOS/components/ts_auth_layout /Users/massif/TianshanOS/components/ts_automation /Users/massif/TianshanOS/components/ts_cert /Users/massif/TianshanOS/components/ts_core/ts_config /Users/massif/TianshanOS/components/ts_config_pack /Users/massif/TianshanOS/components/ts_console /Users/massif/TianshanOS/components/ts_core /Users/massif/TianshanOS/components/ts_drivers /Users/massif/TianshanOS/components/ts_core/ts_event /Users/massif/TianshanOS/components/ts_hal /Users/massif/TianshanOS/components/ts_https /Users/massif/TianshanOS/components/ts_jsonpath /Users/massif/TianshanOS/components/ts_led /Users/massif/TianshanOS/components/ts_core/ts_log /Users/massif/TianshanOS/components/ts_mempool /Users/massif/TianshanOS/components/ts_net /Users/massif/TianshanOS/components/ts_ota /Users/massif/TianshanOS/components/ts_pki_client /Users/massif/TianshanOS/components/ts_security /Users/massif/TianshanOS/components/ts_core/ts_service /Users/massif/TianshanOS/components/ts_storage /Users/massif/TianshanOS/components/ts_webui /Users/massif/esp/v5.5.2/esp-idf/components/ulp /Users/massif/esp/v5.5.2/esp-idf/components/unity /Users/massif/esp/v5.5.2/esp-idf/components/usb /Users/massif/esp/v5.5.2/esp-idf/components/vfs /Users/massif/esp/v5.5.2/esp-idf/components/wear_levelling /Users/massif/esp/v5.5.2/esp-idf/components/wifi_provisioning /Users/massif/esp/v5.5.2/esp-idf/components/wpa_supplicant /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- +-- ╔═══════════════════════════════════════════════════════════╗ +-- ║ TianShanOS v0.5.2+8ad39a9d.09271926 ║ +-- ║ ESP32 Rack Management Operating System ║ +-- ╚═══════════════════════════════════════════════════════════╝ +-- +-- Version: 0.5.2+8ad39a9d.09271926 +-- Major: 0 +-- Minor: 5 +-- Patch: 2 +-- Build: 8ad39a9d.09271926 +-- +-- Target: esp32s3 +-- Build type: +-- +-- Configuring done (6.9s) +-- Generating done (0.5s) +-- Build files have been written to: /tmp/tianshan-j1-build/build +Running ninja in directory /private/tmp/tianshan-j1-build/build +Executing "ninja all"... +[1/1343] Generating project_elf_src_esp32s3.c +[2/1343] Generating ../../ota_data_initial.bin +[3/1343] Generating /tmp/tianshan-j1-build/build/esp-idf/esp_system/ld/memory.ld linker script... +[4/1343] Generating /tmp/tianshan-j1-build/build/esp-idf/esp_system/ld/sections.ld.in linker script... +[5/1343] Copying web assets to build directory +[6/1343] Generating ../../partition_table/partition-table.bin +Partition table binary generated. Contents: +******************************************************************************* +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs,data,nvs,0x9000,48K, +nvs_keys,data,nvs_keys,0x15000,4K, +otadata,data,ota,0x16000,8K, +phy_init,data,phy,0x18000,4K, +ota_0,app,ota_0,0x20000,3M, +ota_1,app,ota_1,0x320000,3M, +storage,data,spiffs,0x620000,512K, +www,data,spiffs,0x6a0000,3M, +fatfs,data,fat,0x9a0000,64K, +******************************************************************************* +[7/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_header.c.obj +[8/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_utils.c.obj +[9/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/util/ctrl_sock.c.obj +[10/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_auth.c.obj +[11/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_uri.c.obj +[12/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport.c.obj +[13/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_main.c.obj +[14/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_internal.c.obj +[15/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_sess.c.obj +[16/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_ws.c.obj +[17/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_socks_proxy.c.obj +[18/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_txrx.c.obj +[19/1343] Building C object esp-idf/esp_https_ota/CMakeFiles/__idf_esp_https_ota.dir/src/esp_https_ota.c.obj +[20/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/system_layer/esp_psram.c.obj +[21/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/xip_impl/mmu_psram_flash.c.obj +[22/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_parse.c.obj +[23/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ssl.c.obj +[24/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/esp32s3/esp_psram_impl_octal.c.obj +[25/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali.c.obj +[26/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp_adc_cal_common_legacy.c.obj +[27/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali_curve_fitting.c.obj +[28/1343] Linking C static library esp-idf/esp_https_ota/libesp_https_ota.a +[29/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/esp32s3/curve_fitting_coefficients.c.obj +[30/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp-tls-crypto/esp_tls_crypto.c.obj +[31/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_platform_port.c.obj +[32/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp32s3/esp_adc_cal_legacy.c.obj +[33/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_oneshot.c.obj +[34/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_common.c.obj +[35/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ws.c.obj +[36/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/gdma/adc_dma.c.obj +[37/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_monitor.c.obj +[38/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_filter.c.obj +[39/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_error_capture.c.obj +[40/1343] Linking C static library esp-idf/esp_http_server/libesp_http_server.a +[41/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_continuous.c.obj +[42/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/sigma_delta_legacy.c.obj +[43/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rtc_temperature_legacy.c.obj +[44/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/esp_http_client.c.obj +[45/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_dma_legacy.c.obj +[46/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/touch_sensor_common.c.obj +[47/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_legacy.c.obj +[48/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls.c.obj +[49/1343] Linking C static library esp-idf/esp_http_client/libesp_http_client.a +[50/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/timer_legacy.c.obj +[51/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/pcnt_legacy.c.obj +[52/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai.c.obj +[53/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_mbedtls.c.obj +[54/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/esp32s3/touch_sensor.c.obj +[55/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/twai/twai.c.obj +[56/1343] Linking C static library esp-idf/tcp_transport/libtcp_transport.a +[57/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/i2c/i2c.c.obj +[58/1343] Building C object esp-idf/http_parser/CMakeFiles/__idf_http_parser.dir/http_parser.c.obj +[59/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_common.c.obj +[60/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder.c.obj +[61/1343] Linking C static library esp-idf/esp_psram/libesp_psram.a +[62/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai_onchip.c.obj +[63/1343] Building C object esp-idf/esp_driver_tsens/CMakeFiles/__idf_esp_driver_tsens.dir/src/temperature_sensor.c.obj +[64/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_bytes.c.obj +[65/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/i2s_legacy.c.obj +[66/1343] Building C object esp-idf/esp_driver_sdm/CMakeFiles/__idf_esp_driver_sdm.dir/src/sdm.c.obj +[67/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_common.c.obj +[68/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_slave.c.obj +[69/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_simple.c.obj +[70/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_crc.c.obj +[71/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_copy.c.obj +[72/1343] Linking C static library esp-idf/esp_adc/libesp_adc.a +[73/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/mcpwm_legacy.c.obj +[74/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_transaction.c.obj +[75/1343] Building C object esp-idf/esp_driver_ledc/CMakeFiles/__idf_esp_driver_ledc.dir/src/ledc.c.obj +[76/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_master.c.obj +[77/1343] Linking C static library esp-idf/esp-tls/libesp-tls.a +[78/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_transaction.c.obj +[79/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_init.c.obj +[80/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_host.c.obj +[81/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_mmc.c.obj +[82/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sd_pwr_ctrl/sd_pwr_ctrl.c.obj +[83/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_io.c.obj +[84/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_cmd.c.obj +[85/1343] Linking C static library esp-idf/http_parser/libhttp_parser.a +[86/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_rx.c.obj +[87/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_common.c.obj +[88/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_sd.c.obj +[89/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rmt_legacy.c.obj +[90/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_platform.c.obj +[91/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_std.c.obj +[92/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_com.c.obj +[93/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cmpr.c.obj +[94/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_pdm.c.obj +[95/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_tdm.c.obj +[96/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_fault.c.obj +[97/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_sync.c.obj +[98/1343] Linking C static library esp-idf/driver/libdriver.a +[99/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_oper.c.obj +[100/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_host.c.obj +[101/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_tx.c.obj +[102/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub-entry.S.obj +[103/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cap.c.obj +[104/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/packet.c.obj +[105/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub_transport.c.obj +[106/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/xt_debugexception.S.obj +[107/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_timer.c.obj +[108/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_common.c.obj +[109/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_gen.c.obj +[110/1343] Linking C static library esp-idf/esp_driver_twai/libesp_driver_twai.a +[111/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub.c.obj +[112/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub_xtensa.c.obj +[113/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/lib_printf.c.obj +[114/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/mesh_event.c.obj +[115/1343] Linking C static library esp-idf/esp_driver_ledc/libesp_driver_ledc.a +[116/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_init.c.obj +[117/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default_ap.c.obj +[118/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig.c.obj +[119/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_netif.c.obj +[120/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/regulatory/esp_wifi_regulatory.c.obj +[121/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default.c.obj +[122/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug_diagram.c.obj +[123/1343] Building C object esp-idf/esp_driver_pcnt/CMakeFiles/__idf_esp_driver_pcnt.dir/src/pulse_cnt.c.obj +[124/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/esp32s3/esp_coex_adapter.c.obj +[125/1343] Linking C static library esp-idf/esp_driver_i2c/libesp_driver_i2c.a +[126/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave.c.obj +[127/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug.c.obj +[128/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave_hd.c.obj +[129/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/esp32s3/esp_adapter.c.obj +[130/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig_ack.c.obj +[131/1343] Linking C static library esp-idf/esp_driver_sdm/libesp_driver_sdm.a +[132/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_common.c.obj +[133/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/os_xtensa.c.obj +[134/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_1x.c.obj +[135/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/eloop.c.obj +[136/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/comeback_token.c.obj +[137/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/pmksa_cache_auth.c.obj +[138/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/sta_info.c.obj +[139/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth_ie.c.obj +[140/1343] Linking C static library esp-idf/esp_driver_tsens/libesp_driver_tsens.a +[141/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_master.c.obj +[142/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ap_config.c.obj +[143/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/dragonfly.c.obj +[144/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-siv.c.obj +[145/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/bitfield.c.obj +[146/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-kdf.c.obj +[147/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_11.c.obj +[148/1343] Linking C static library esp-idf/esp_driver_rmt/libesp_driver_rmt.a +[149/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_group5.c.obj +[150/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/crypto_ops.c.obj +[151/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/wpa_common.c.obj +[152/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_groups.c.obj +[153/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-gcm.c.obj +[154/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ccmp.c.obj +[155/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-tlsprf.c.obj +[156/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ms_funcs.c.obj +[157/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tlsprf.c.obj +[158/1343] Linking C static library esp-idf/esp_driver_sdspi/libesp_driver_sdspi.a +[159/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-prf.c.obj +[160/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-tlsprf.c.obj +[161/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-prf.c.obj +[162/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth.c.obj +[163/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-prf.c.obj +[164/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tprf.c.obj +[165/1343] Linking C static library esp-idf/esp_driver_sdmmc/libesp_driver_sdmmc.a +[166/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/md4-internal.c.obj +[167/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_common/eap_wsc_common.c.obj +[168/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/chap.c.obj +[169/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae.c.obj +[170/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_common.c.obj +[171/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/ieee802_11_common.c.obj +[172/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap_common.c.obj +[173/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/mschapv2.c.obj +[174/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls.c.obj +[175/1343] Linking C static library esp-idf/sdmmc/libsdmmc.a +[176/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap.c.obj +[177/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_mschapv2.c.obj +[178/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_common.c.obj +[179/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls_common.c.obj +[180/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap.c.obj +[181/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/pmksa_cache.c.obj +[182/1343] Linking C static library esp-idf/esp_driver_i2s/libesp_driver_i2s.a +[183/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/base64.c.obj +[184/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_ttls.c.obj +[185/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/ext_password.c.obj +[186/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa_ie.c.obj +[187/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/common.c.obj +[188/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/uuid.c.obj +[189/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_pac.c.obj +[190/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpa_debug.c.obj +[191/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpabuf.c.obj +[192/1343] Linking C static library esp-idf/esp_driver_mcpwm/libesp_driver_mcpwm.a +[193/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast.c.obj +[194/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa2_api_port.c.obj +[195/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/json.c.obj +[196/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_build.c.obj +[197/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_process.c.obj +[198/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps.c.obj +[199/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_parse.c.obj +[200/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_common.c.obj +[201/1343] Linking C static library esp-idf/esp_driver_pcnt/libesp_driver_pcnt.a +[202/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_dev_attr.c.obj +[203/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa_main.c.obj +[204/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa.c.obj +[205/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpas_glue.c.obj +[206/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae_pk.c.obj +[207/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_enrollee.c.obj +[208/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_common.c.obj +[209/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_owe.c.obj +[210/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_eap_client.c.obj +[211/1343] Linking C static library esp-idf/esp_gdbstub/libesp_gdbstub.a +[212/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa3.c.obj +[213/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpsk.c.obj +[214/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_hostap.c.obj +[215/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wps.c.obj +[216/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls.c.obj +[217/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-bignum.c.obj +[218/1343] Linking C static library esp-idf/esp_driver_spi/libesp_driver_spi.a +[219/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/rc4.c.obj +[220/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpbkdf2.c.obj +[221/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-wrap.c.obj +[222/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_defaults.c.obj +[223/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/tls_mbedtls.c.obj +[224/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/des-internal.c.obj +[225/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-unwrap.c.obj +[226/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-rsa.c.obj +[227/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_objects.c.obj +[228/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_handlers.c.obj +[229/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-ccm.c.obj +[230/1343] Linking C static library esp-idf/esp_wifi/libesp_wifi.a +[231/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-ec.c.obj +[232/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_sntp.c.obj +[233/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip_defaults.c.obj +[234/1343] Linking C static library esp-idf/esp_coex/libesp_coex.a +[235/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/esp_pbuf_ref.c.obj +[236/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/wlanif.c.obj +[237/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/sntp/sntp.c.obj +[238/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/err.c.obj +[239/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/ethernetif.c.obj +[240/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netbuf.c.obj +[241/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/if_api.c.obj +[242/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netifapi.c.obj +[243/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netdb.c.obj +[244/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_lib.c.obj +[245/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_msg.c.obj +[246/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/tcpip.c.obj +[247/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/sntp/sntp.c.obj +[248/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/init.c.obj +[249/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/def.c.obj +[250/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ip.c.obj +[251/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/mem.c.obj +[252/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/netbiosns/netbiosns.c.obj +[253/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/inet_chksum.c.obj +[254/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/memp.c.obj +[255/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/pbuf.c.obj +[256/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/dns.c.obj +[257/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/sys.c.obj +[258/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/stats.c.obj +[259/1343] Linking C static library esp-idf/wpa_supplicant/libwpa_supplicant.a +[260/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/netif.c.obj +[261/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip.c.obj +[262/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/autoip.c.obj +[263/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/timeouts.c.obj +[264/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/raw.c.obj +[265/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/udp.c.obj +[266/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/icmp.c.obj +[267/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_out.c.obj +[268/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/dhcp6.c.obj +[269/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_addr.c.obj +[270/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/igmp.c.obj +[271/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/etharp.c.obj +[272/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_frag.c.obj +[273/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp.c.obj +[274/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_in.c.obj +[275/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ethip6.c.obj +[276/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/dhcp.c.obj +[277/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4.c.obj +[278/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/icmp6.c.obj +[279/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/inet6.c.obj +[280/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/sockets.c.obj +[281/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_napt.c.obj +[282/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_frag.c.obj +[283/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_addr.c.obj +[284/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ethernet.c.obj +[285/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/auth.c.obj +[286/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif_fdb.c.obj +[287/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif.c.obj +[288/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-md5.c.obj +[289/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ccp.c.obj +[290/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-new.c.obj +[291/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/mld6.c.obj +[292/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/slipif.c.obj +[293/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap_ms.c.obj +[294/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eap.c.obj +[295/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/demand.c.obj +[296/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6.c.obj +[297/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ecp.c.obj +[298/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eui64.c.obj +[299/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/fsm.c.obj +[300/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipv6cp.c.obj +[301/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/lcp.c.obj +[302/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipcp.c.obj +[303/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/magic.c.obj +[304/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/mppe.c.obj +[305/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppapi.c.obj +[306/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppol2tp.c.obj +[307/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/multilink.c.obj +[308/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ppp.c.obj +[309/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppos.c.obj +[310/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppoe.c.obj +[311/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/nd6.c.obj +[312/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppcrypt.c.obj +[313/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/utils.c.obj +[314/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/upap.c.obj +[315/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/vj.c.obj +[316/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/tcp_isn_default.c.obj +[317/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/sockets_ext.c.obj +[318/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/lwip_default_hooks.c.obj +[319/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/debug/lwip_debug.c.obj +[320/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/des.c.obj +[321/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md5.c.obj +[322/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/arc4.c.obj +[323/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md4.c.obj +[324/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping.c.obj +[325/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/esp_ping.c.obj +[326/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/freertos/sys_arch.c.obj +[327/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/acd_dhcp_check.c.obj +[328/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/if_index.c.obj +[329/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/sha1.c.obj +[330/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/esp32xx/vfs_lwip.c.obj +[331/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping_sock.c.obj +[332/1343] Linking C static library esp-idf/esp_netif/libesp_netif.a +[333/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/lib_printf.c.obj +[334/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/dhcpserver/dhcpserver.c.obj +[335/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/esp32s3/phy_init_data.c.obj +[336/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_connection_monitor.c.obj +[337/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_override.c.obj +[338/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/nullfs.c.obj +[339/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_eventfd.c.obj +[340/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_common.c.obj +[341/1343] Building C object esp-idf/esp_vfs_console/CMakeFiles/__idf_esp_vfs_console.dir/vfs_console.c.obj +[342/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/btbb_init.c.obj +[343/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag.c.obj +[344/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_init.c.obj +[345/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_vfs.c.obj +[346/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_semihost.c.obj +[347/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs.c.obj +[348/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_platform.cpp.obj +[349/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader.c.obj +[350/1343] Linking C static library esp-idf/lwip/liblwip.a +[351/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_aes.c.obj +[352/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition.cpp.obj +[353/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_xts_aes.c.obj +[354/1343] Linking C static library esp-idf/vfs/libvfs.a +[355/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_lookup.cpp.obj +[356/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/default_event_loop.c.obj +[357/1343] Linking C static library esp-idf/esp_vfs_console/libesp_vfs_console.a +[358/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event_private.c.obj +[359/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_wakeup.c.obj +[360/1343] Linking C static library esp-idf/esp_driver_usb_serial_jtag/libesp_driver_usb_serial_jtag.a +[361/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event.c.obj +[362/1343] Linking C static library esp-idf/esp_phy/libesp_phy.a +[363/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uhci.c.obj +[364/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_vfs.c.obj +[365/1343] Building C object esp-idf/esp_ringbuf/CMakeFiles/__idf_esp_ringbuf.dir/ringbuf.c.obj +[366/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer.c.obj +[367/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart.c.obj +[368/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_init.c.obj +[369/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer_common.c.obj +[370/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer.c.obj +[371/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/system_time.c.obj +[372/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_common.c.obj +[373/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/ets_timer_legacy.c.obj +[374/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_systimer.c.obj +[375/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_exception_stubs.cpp.obj +[376/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_init.cpp.obj +[377/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_cond_var.c.obj +[378/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread.c.obj +[379/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_local_storage.c.obj +[380/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_rwlock.c.obj +[381/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/init.c.obj +[382/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_guards.cpp.obj +[383/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_semaphore.c.obj +[384/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/abort.c.obj +[385/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/assert.c.obj +[386/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_item_hash_list.cpp.obj +[387/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/poll.c.obj +[388/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/heap.c.obj +[389/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_cxx_api.cpp.obj +[390/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/pthread.c.obj +[391/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/locks.c.obj +[392/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/random.c.obj +[393/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/getentropy.c.obj +[394/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_encrypted_partition.cpp.obj +[395/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/termios.c.obj +[396/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_locked.cpp.obj +[397/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_types.cpp.obj +[398/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/realpath.c.obj +[399/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/scandir.c.obj +[400/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/sysconf.c.obj +[401/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/syscalls.c.obj +[402/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_simple.cpp.obj +[403/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/time.c.obj +[404/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_page.cpp.obj +[405/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_pagemanager.cpp.obj +[406/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_syscalls.c.obj +[407/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/esp_time_impl.c.obj +[408/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/flockfile.c.obj +[409/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_init.c.obj +[410/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_manager.cpp.obj +[411/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/xtensa/stdatomic_s32c1i.c.obj +[412/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/newlib_init.c.obj +[413/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_storage.cpp.obj +[414/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/heap_idf.c.obj +[415/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_common.c.obj +[416/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/list.c.obj +[417/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_api.cpp.obj +[418/1343] Building ASM object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/portasm.S.obj +[419/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_systick.c.obj +[420/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/app_startup.c.obj +[421/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_init.c.obj +[422/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/stdatomic.c.obj +[423/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/event_groups.c.obj +[424/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/timers.c.obj +[425/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_overlay_os_hook.c.obj +[426/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/freertos_compatibility.c.obj +[427/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions_event_groups.c.obj +[428/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/stream_buffer.c.obj +[429/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[430/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/port.c.obj +[431/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[432/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/queue.c.obj +[433/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[434/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[435/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions.c.obj +[436/1343] Linking C static library esp-idf/nvs_flash/libnvs_flash.a +[437/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_ctrl_os.c.obj +[438/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/revision.c.obj +[439/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_gpio_reserve.c.obj +[440/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/hw_random.c.obj +[441/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clk.c.obj +[442/1343] Linking C static library esp-idf/esp_event/libesp_event.a +[443/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mac_addr.c.obj +[444/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_clk_tree.c.obj +[445/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/periph_ctrl.c.obj +[446/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/rtc_module.c.obj +[447/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/io_mux.c.obj +[448/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/regi2c_ctrl.c.obj +[449/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sar_periph_ctrl_common.c.obj +[450/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_dma_utils.c.obj +[451/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_utils.c.obj +[452/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj +[453/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma_link.c.obj +[454/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/intr_alloc.c.obj +[455/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_clk_tree_common.c.obj +[456/1343] Linking C static library esp-idf/esp_driver_uart/libesp_driver_uart.a +[457/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_mspi.c.obj +[458/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_usb.c.obj +[459/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modem.c.obj +[460/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_bus_lock.c.obj +[461/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_share_hw_ctrl.c.obj +[462/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_console.c.obj +[463/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/adc_share_hw_ctrl.c.obj +[464/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/systimer.c.obj +[465/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_event.c.obj +[466/1343] Linking C static library esp-idf/esp_ringbuf/libesp_ringbuf.a +[467/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_async_memcpy.c.obj +[468/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_wake_stub.c.obj +[469/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/deprecated/gdma_legacy.c.obj +[470/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_gpio.c.obj +[471/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[472/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/mspi_timing_tuning.c.obj +[473/1343] Linking C static library esp-idf/esp_driver_gptimer/libesp_driver_gptimer.a +[474/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[475/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clock_output.c.obj +[476/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/async_memcpy_gdma.c.obj +[477/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[478/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/power_supply/brownout.c.obj +[479/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[480/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[481/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_memprot_conv.c.obj +[482/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[483/1343] Linking C static library esp-idf/esp_timer/libesp_timer.a +[484/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_config.c.obj +[485/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_lock.c.obj +[486/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/sar_periph_ctrl.c.obj +[487/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma.c.obj +[488/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[489/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/init.c.obj +[490/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[491/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[492/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_hmac.c.obj +[493/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_periph_clk.c.obj +[494/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/lowpower/port/esp32s3/sleep_cpu.c.obj +[495/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_ds.c.obj +[496/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[497/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[498/1343] Linking C static library esp-idf/cxx/libcxx.a +[499/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[500/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[501/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_by_mspi_delay.c.obj +[502/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[503/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[504/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[505/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modes.c.obj +[506/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[507/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[508/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[509/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[510/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[511/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[512/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[513/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[514/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[515/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[516/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[517/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[518/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[519/1343] Linking C static library esp-idf/pthread/libpthread.a +[520/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[521/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[522/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[523/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[524/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[525/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/esp32s3/memory_layout.c.obj +[526/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_memprot.c.obj +[527/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[528/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/memory_layout_utils.c.obj +[529/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_timestamp.c.obj +[530/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_base.c.obj +[531/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[532/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[533/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/util.c.obj +[534/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_lock.c.obj +[535/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/multi_heap.c.obj +[536/1343] Linking C static library esp-idf/newlib/libnewlib.a +[537/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[538/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_init.c.obj +[539/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[540/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[541/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/log_level.c.obj +[542/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_write.c.obj +[543/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps.c.obj +[544/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/linked_list/log_linked_list.c.obj +[545/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/tag_log_level.c.obj +[546/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/cache/log_binary_heap.c.obj +[547/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[548/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[549/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/color_hal.c.obj +[550/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[551/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[552/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[553/1343] Linking C static library esp-idf/freertos/libfreertos.a +[554/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_encrypt_hal_iram.c.obj +[555/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[556/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal.c.obj +[557/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/systimer_hal.c.obj +[558/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal_iram.c.obj +[559/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal.c.obj +[560/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gpio_hal.c.obj +[561/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/timer_hal.c.obj +[562/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/clk_tree_hal.c.obj +[563/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rtc_io_hal.c.obj +[564/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal.c.obj +[565/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/tlsf/tlsf.c.obj +[566/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal_iram.c.obj +[567/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal_iram.c.obj +[568/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_iram.c.obj +[569/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rmt_hal.c.obj +[570/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal.c.obj +[571/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/pcnt_hal.c.obj +[572/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mcpwm_hal.c.obj +[573/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uhci_hal.c.obj +[574/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_top.c.obj +[575/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdm_hal.c.obj +[576/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdmmc_hal.c.obj +[577/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_ahb_v1.c.obj +[578/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/lcd_hal.c.obj +[579/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpi_hal.c.obj +[580/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_oneshot_hal.c.obj +[581/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/twai_hal_v1.c.obj +[582/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/aes_hal.c.obj +[583/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal.c.obj +[584/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2s_hal.c.obj +[585/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal_common.c.obj +[586/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/brownout_hal.c.obj +[587/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sha_hal.c.obj +[588/1343] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[589/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal.c.obj +[590/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal.c.obj +[591/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal_iram.c.obj +[592/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hmac_hal.c.obj +[593/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ds_hal.c.obj +[594/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_wrap_hal.c.obj +[595/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_gpspi.c.obj +[596/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hd_hal.c.obj +[597/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sensor_hal.c.obj +[598/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cam_hal.c.obj +[599/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_serial_jtag_hal.c.obj +[600/1343] Linking C static library esp-idf/esp_security/libesp_security.a +[601/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/touch_sensor_hal.c.obj +[602/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal_iram.c.obj +[603/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sens_hal.c.obj +[604/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[605/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/xt_wdt_hal.c.obj +[606/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[607/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/rtc_cntl_hal.c.obj +[608/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[609/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_dwc_hal.c.obj +[610/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[611/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[612/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[613/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[614/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[615/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[616/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[617/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[618/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[619/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[620/1343] Linking C static library esp-idf/soc/libsoc.a +[621/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/crosscore_int.c.obj +[622/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system_console.c.obj +[623/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_ipc.c.obj +[624/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/stack_check.c.obj +[625/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/freertos_hooks.c.obj +[626/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system.c.obj +[627/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/system_time.c.obj +[628/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/ubsan.c.obj +[629/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup.c.obj +[630/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/int_wdt.c.obj +[631/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/panic.c.obj +[632/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/xt_wdt.c.obj +[633/1343] Linking C static library esp-idf/heap/libheap.a +[634/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup_funcs.c.obj +[635/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_routines.S.obj +[636/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_handler.S.obj +[637/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_port.c.obj +[638/1343] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[639/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt.c.obj +[640/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_handler_asm.S.obj +[641/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_system_chip.c.obj +[642/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/image_process.c.obj +[643/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/panic_handler.c.obj +[644/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack_asm.S.obj +[645/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt_impl_timergroup.c.obj +[646/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers_asm.S.obj +[647/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_ipc_isr.c.obj +[648/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack.c.obj +[649/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_arch.c.obj +[650/1343] Linking C static library esp-idf/log/liblog.a +[651/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/highint_hdl.S.obj +[652/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_stubs.c.obj +[653/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/cpu_start.c.obj +[654/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_brownout_hook.c.obj +[655/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/reset_reason.c.obj +[656/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers.c.obj +[657/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/trax.c.obj +[658/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/apb_backup_dma.c.obj +[659/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_drivers.c.obj +[660/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_issi.c.obj +[661/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp32s3/spi_flash_oct_flash_init.c.obj +[662/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_hpm_enable.c.obj +[663/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/cache_err_int.c.obj +[664/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/system_internal.c.obj +[665/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic.c.obj +[666/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_boya.c.obj +[667/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_th.c.obj +[668/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_gd.c.obj +[669/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/clk.c.obj +[670/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_winbond.c.obj +[671/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic_opi.c.obj +[672/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_generic.c.obj +[673/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/memspi_host_driver.c.obj +[674/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/port/esp32s3/ext_mem_layout.c.obj +[675/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[676/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_noos.c.obj +[677/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_ops.c.obj +[678/1343] Linking C static library esp-idf/hal/libhal.a +[679/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/heap_align_hw.c.obj +[680/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_utils.c.obj +[681/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_mmap.c.obj +[682/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_app.c.obj +[683/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/cache_utils.c.obj +[684/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[685/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_msync.c.obj +[686/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_mmu_map.c.obj +[687/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[688/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[689/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_spi_init.c.obj +[690/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[691/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[692/1343] Linking C static library esp-idf/esp_rom/libesp_rom.a +[693/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[694/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_api.c.obj +[695/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[696/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[697/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[698/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[699/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[700/1343] Linking C static library esp-idf/esp_common/libesp_common.a +[701/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[702/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[703/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/secure_boot_secure_features.c.obj +[704/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[705/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[706/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[707/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[708/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[709/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[710/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[711/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[712/1343] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[713/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_app_desc.c.obj +[714/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/debug.c.obj +[715/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[716/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[717/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[718/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_startup.c.obj +[719/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition_target.c.obj +[720/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_trace.c.obj +[721/1343] Building C object esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj +[722/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_reader.c.obj +[723/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition.c.obj +[724/1343] Linking C static library esp-idf/esp_system/libesp_system.a +[725/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cache.c.obj +[726/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj +[727/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_client.c.obj +[728/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_keys.c.obj +[729/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_server.c.obj +[730/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_generic.c.obj +[731/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_debug_helpers_generated.c.obj +[732/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ciphersuites.c.obj +[733/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cookie.c.obj +[734/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_client.c.obj +[735/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ticket.c.obj +[736/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_platform_time.c.obj +[737/1343] Linking C static library esp-idf/spi_flash/libspi_flash.a +[738/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/mbedtls_debug.c.obj +[739/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_client.c.obj +[740/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_msg.c.obj +[741/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/pkcs7.c.obj +[742/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_create.c.obj +[743/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/net_sockets.c.obj +[744/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crl.c.obj +[745/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_server.c.obj +[746/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write.c.obj +[747/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesni.c.obj +[748/1343] Linking C static library esp-idf/esp_mm/libesp_mm.a +[749/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_csr.c.obj +[750/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_csr.c.obj +[751/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_crt.c.obj +[752/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesce.c.obj +[753/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509.c.obj +[754/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aes.c.obj +[755/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod.c.obj +[756/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls.c.obj +[757/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod_raw.c.obj +[758/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/camellia.c.obj +[759/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1parse.c.obj +[760/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1write.c.obj +[761/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aria.c.obj +[762/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/block_cipher.c.obj +[763/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chacha20.c.obj +[764/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/base64.c.obj +[765/1343] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[766/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chachapoly.c.obj +[767/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crt.c.obj +[768/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ccm.c.obj +[769/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_core.c.obj +[770/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/des.c.obj +[771/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/dhm.c.obj +[772/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/constant_time.c.obj +[773/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecjpake.c.obj +[774/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher_wrap.c.obj +[775/1343] Linking C static library esp-idf/efuse/libefuse.a +[776/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdh.c.obj +[777/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves_new.c.obj +[778/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher.c.obj +[779/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cmac.c.obj +[780/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ctr_drbg.c.obj +[781/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdsa.c.obj +[782/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum.c.obj +[783/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy_poll.c.obj +[784/1343] Linking C static library esp-idf/esp_partition/libesp_partition.a +[785/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hkdf.c.obj +[786/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy.c.obj +[787/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/memory_buffer_alloc.c.obj +[788/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/nist_kw.c.obj +[789/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hmac_drbg.c.obj +[790/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md5.c.obj +[791/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lmots.c.obj +[792/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/error.c.obj +[793/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/padlock.c.obj +[794/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves.c.obj +[795/1343] Linking C static library esp-idf/app_update/libapp_update.a +[796/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lms.c.obj +[797/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/gcm.c.obj +[798/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md.c.obj +[799/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pem.c.obj +[800/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp.c.obj +[801/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_ecc.c.obj +[802/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/oid.c.obj +[803/1343] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[804/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/poly1305.c.obj +[805/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform.c.obj +[806/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk.c.obj +[807/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_wrap.c.obj +[808/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform_util.c.obj +[809/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs5.c.obj +[810/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs12.c.obj +[811/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkwrite.c.obj +[812/1343] Linking C static library esp-idf/esp_app_format/libesp_app_format.a +[813/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_aead.c.obj +[814/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_driver_wrappers_no_static.c.obj +[815/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_client.c.obj +[816/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_se.c.obj +[817/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkparse.c.obj +[818/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_cipher.c.obj +[819/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_pake.c.obj +[820/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ecp.c.obj +[821/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ffdh.c.obj +[822/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_hash.c.obj +[823/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ripemd160.c.obj +[824/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_rsa.c.obj +[825/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_mac.c.obj +[826/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_slot_management.c.obj +[827/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedtls.a +[828/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_storage.c.obj +[829/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_its_file.c.obj +[830/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha3.c.obj +[831/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha1.c.obj +[832/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/threading.c.obj +[833/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa_alt_helpers.c.obj +[834/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_util.c.obj +[835/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/timing.c.obj +[836/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha512.c.obj +[837/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha256.c.obj +[838/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version.c.obj +[839/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version_features.c.obj +[840/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_gdma_impl.c.obj +[841/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha_gdma_impl.c.obj +[842/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_mem.c.obj +[843/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hardware.c.obj +[844/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c.obj +[845/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_xts.c.obj +[846/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_common.c.obj +[847/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_dma_core.c.obj +[848/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_timing.c.obj +[849/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/esp_sha.c.obj +[850/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hmac_pbkdf2.c.obj +[851/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes.c.obj +[852/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/bignum_alt.c.obj +[853/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/sha.c.obj +[854/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c.obj +[855/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c.obj +[856/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_ds_common.c.obj +[857/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/esp_bignum.c.obj +[858/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/md/esp_md.c.obj +[859/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa.c.obj +[860/1343] Creating directories for 'bootloader' +[861/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedx509.a +[862/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha1.c.obj +[863/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha256.c.obj +[864/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/x25519.c.obj +[865/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/Hacl_Curve25519_joined.c.obj +[866/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m_driver_entrypoints.c.obj +[867/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/everest.c.obj +[868/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m/p256-m.c.obj +[869/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha512.c.obj +[870/1343] No download step for 'bootloader' +[871/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_gcm.c.obj +[872/1343] No update step for 'bootloader' +[873/1343] No patch step for 'bootloader' +[874/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto.c.obj +[875/1343] Minifying + gzipping web resources +Minifying web resources in /tmp/tianshan-j1-build/build/esp-idf/ts_webui/web_optimized... + JS js/terminal.js: 31,064 -> 20,034 (35.5% saved) + JS js/router.js: 6,414 -> 3,839 (40.1% saved) + JS js/dragSort.js: 11,460 -> 7,603 (33.7% saved) + JS js/api.js: 36,638 -> 24,339 (33.6% saved) + JS js/i18n.js: 7,208 -> 4,320 (40.1% saved) + JS js/app.js: 1,129,944 -> 840,829 (25.6% saved) + JS js/lang/en-US.js: 178,439 -> 143,161 (19.8% saved) + JS js/lang/zh-CN.js: 172,046 -> 137,314 (20.2% saved) + CSS css/style.css: 179,071 -> 129,275 (27.8% saved) + CSS fonts/remixicon.css: 5,940 -> 4,860 (18.2% saved) + + Total saved: 442,650 bytes (432.3 KB) + +Gzipping web resources in /tmp/tianshan-j1-build/build/esp-idf/ts_webui/web_optimized... + GZ js/terminal.js: 20,034 -> 5,566 (72.2% smaller) + GZ js/router.js: 3,839 -> 1,340 (65.1% smaller) + GZ js/dragSort.js: 7,603 -> 1,869 (75.4% smaller) + GZ js/api.js: 24,339 -> 6,163 (74.7% smaller) + GZ js/i18n.js: 4,320 -> 1,460 (66.2% smaller) + GZ js/app.js: 840,829 -> 167,747 (80.0% smaller) + GZ js/lang/en-US.js: 143,161 -> 43,017 (70.0% smaller) + GZ js/lang/zh-CN.js: 137,314 -> 45,286 (67.0% smaller) + GZ css/style.css: 129,275 -> 20,658 (84.0% smaller) + GZ fonts/remixicon.css: 4,860 -> 1,263 (74.0% smaller) + GZ index.html: 26,685 -> 7,266 (72.8% smaller) + + Gzipped 11 files: 1,342,259 -> 301,635 (77.5% overall) +Done. +[876/1343] cd /tmp/tianshan-j1-build/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-j1-build/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-j1-build/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +[877/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +[878/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/p256-m/libp256m.a +[879/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/everest/libeverest.a +[880/1343] Generating x509_crt_bundle +[881/1343] Generating ../../x509_crt_bundle.S +[882/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_context.S.obj +[883/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr_asm.S.obj +[884/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[885/1343] Building ASM object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/__/__/x509_crt_bundle.S.obj +[886/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[887/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_trace.c.obj +[888/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_glitch_filter_ops.c.obj +[889/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_locks.c.obj +[890/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_vectors.S.obj +[891/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr.c.obj +[892/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_pin_glitch_filter.c.obj +[893/1343] Building C object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/esp_crt_bundle/esp_crt_bundle.c.obj +[894/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/Partition.cpp.obj +[895/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_impl.c.obj +[896/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/crc32.cpp.obj +[897/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/SPI_Flash.cpp.obj +[898/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/rtc_io.c.obj +[899/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Perf.cpp.obj +[900/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/dedic_gpio.c.obj +[901/1343] Linking C static library esp-idf/mbedtls/libmbedtls.a +[902/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Safe.cpp.obj +[903/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/wear_levelling.cpp.obj +[904/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio.c.obj +[905/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_rawflash.c.obj +[906/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_wl.c.obj +[907/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/port/freertos/ffsystem.c.obj +[908/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_sdmmc.c.obj +[909/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ffunicode.c.obj +[910/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio.c.obj +[911/1343] Linking C static library esp-idf/esp_pm/libesp_pm.a +[912/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_spiflash.c.obj +[913/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_cache.c.obj +[914/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs_api.c.obj +[915/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_sdmmc.c.obj +[916/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Flash.cpp.obj +[917/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_gc.c.obj +[918/1343] Linking C static library esp-idf/esp_driver_gpio/libesp_driver_gpio.a +[919/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_check.c.obj +[920/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/split_argv.c.obj +[921/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_hydrogen.c.obj +[922/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_common.c.obj +[923/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/esp_spiffs.c.obj +[924/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat.c.obj +[925/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/commands.c.obj +[926/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_cmd.c.obj +[927/1343] Linking C static library esp-idf/xtensa/libxtensa.a +[928/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_internal.c.obj +[929/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_chip.c.obj +[930/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dbl.c.obj +[931/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_date.c.obj +[932/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dstr.c.obj +[933/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_end.c.obj +[934/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_file.c.obj +[935/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/linenoise/linenoise.c.obj +[936/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rem.c.obj +[937/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_hashtable.c.obj +[938/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_int.c.obj +[939/1343] Linking C static library esp-idf/wear_levelling/libwear_levelling.a +[940/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_lit.c.obj +[941/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_str.c.obj +[942/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_nucleus.c.obj +[943/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_utils.c.obj +[944/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ff.c.obj +[945/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rex.c.obj +[946/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/compress.c.obj +[947/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth_netif_glue.c.obj +[948/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/argtable3.c.obj +[949/1343] Linking C static library esp-idf/spiffs/libspiffs.a +[950/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/adler32.c.obj +[951/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/crc32.c.obj +[952/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_phy_w5500.c.obj +[953/1343] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON_Utils.c.obj +[954/1343] Linking C static library esp-idf/fatfs/libfatfs.a +[955/1343] Building C object esp-idf/ts_event/CMakeFiles/__idf_ts_event.dir/src/ts_event.c.obj +[956/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth.c.obj +[957/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/phy/esp_eth_phy_802_3.c.obj +[958/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzclose.c.obj +[959/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzlib.c.obj +[960/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzread.c.obj +[961/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzwrite.c.obj +[962/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_mac_w5500.c.obj +[963/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inftrees.c.obj +[964/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/uncompr.c.obj +[965/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inffast.c.obj +[966/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/infback.c.obj +[967/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/zutil.c.obj +[968/1343] Linking C static library esp-idf/ts_event/libts_event.a +[969/1343] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON.c.obj +[970/1343] Linking C static library esp-idf/console/libconsole.a +[971/1343] Linking C static library esp-idf/esp_eth/libesp_eth.a +[972/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/deflate.c.obj +[973/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/example.c.obj +[974/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/trees.c.obj +[975/1343] Building C object esp-idf/ts_log/CMakeFiles/__idf_ts_log.dir/src/ts_log.c.obj +[976/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_encoder.c.obj +[977/1343] Linking C static library esp-idf/json/libjson.a +[978/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_dev.c.obj +[979/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_api.c.obj +[980/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inflate.c.obj +[981/1343] Building C object esp-idf/espressif__esp_jpeg/CMakeFiles/__idf_espressif__esp_jpeg.dir/jpeg_decoder.c.obj +[982/1343] Building C object esp-idf/esp_https_server/CMakeFiles/__idf_esp_https_server.dir/src/https_server.c.obj +[983/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_spi_dev.c.obj +[984/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngmem.c.obj +[985/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngerror.c.obj +[986/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrio.c.obj +[987/1343] Linking C static library esp-idf/espressif__zlib/libespressif__zlib.a +[988/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngpread.c.obj +[989/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwio.c.obj +[990/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngget.c.obj +[991/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtrans.c.obj +[992/1343] Building C object esp-idf/espressif__esp_websocket_client/CMakeFiles/__idf_espressif__esp_websocket_client.dir/esp_websocket_client.c.obj +[993/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtest.c.obj +[994/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/png.c.obj +[995/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwtran.c.obj +[996/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngset.c.obj +[997/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_mem_caps.c.obj +[998/1343] Building C object esp-idf/ts_jsonpath/CMakeFiles/__idf_ts_jsonpath.dir/src/ts_jsonpath.c.obj +[999/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngread.c.obj +[1000/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_networking_lwip.c.obj +[1001/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwrite.c.obj +[1002/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/blowfish.c.obj +[1003/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwutil.c.obj +[1004/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent.c.obj +[1005/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrutil.c.obj +[1006/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent_win.c.obj +[1007/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/bcrypt_pbkdf.c.obj +[1008/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_console.c.obj +[1009/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrtran.c.obj +[1010/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/comp.c.obj +[1011/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/crypt.c.obj +[1012/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/global.c.obj +[1013/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/channel.c.obj +[1014/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/libgcrypt.c.obj +[1015/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/keepalive.c.obj +[1016/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/hostkey.c.obj +[1017/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mac.c.obj +[1018/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/os400qc3.c.obj +[1019/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/openssl.c.obj +[1020/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/knownhost.c.obj +[1021/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/misc.c.obj +[1022/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mbedtls.c.obj +[1023/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/packet.c.obj +[1024/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/pem.c.obj +[1025/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/publickey.c.obj +[1026/1343] Linking C static library esp-idf/ts_log/libts_log.a +[1027/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth_kbd_packet.c.obj +[1028/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/version.c.obj +[1029/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/wincng.c.obj +[1030/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/scp.c.obj +[1031/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/session.c.obj +[1032/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/kex.c.obj +[1033/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/transport.c.obj +[1034/1343] Linking C static library esp-idf/esp_https_server/libesp_https_server.a +[1035/1343] Linking C static library esp-idf/espressif__esp_websocket_client/libespressif__esp_websocket_client.a +[1036/1343] Linking C static library esp-idf/espressif__led_strip/libespressif__led_strip.a +[1037/1343] Building C object esp-idf/ts_mempool/CMakeFiles/__idf_ts_mempool.dir/src/ts_mempool.c.obj +[1038/1343] Building C object esp-idf/ts_service/CMakeFiles/__idf_ts_service.dir/src/ts_service.c.obj +[1039/1343] Linking C static library esp-idf/espressif__esp_jpeg/libespressif__esp_jpeg.a +[1040/1343] Linking C static library esp-idf/ts_jsonpath/libts_jsonpath.a +[1041/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_json.c.obj +[1042/1343] Linking C static library esp-idf/espressif__libpng/libespressif__libpng.a +[1043/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_nvs.c.obj +[1044/1343] Linking C static library esp-idf/ts_mempool/libts_mempool.a +[1045/1343] Linking C static library esp-idf/ts_service/libts_service.a +[1046/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth.c.obj +[1047/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_schemas.c.obj +[1048/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/sftp.c.obj +[1049/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config.c.obj +[1050/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_file.c.obj +[1051/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_meta.c.obj +[1052/1343] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert_time.c.obj +[1053/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns.c.obj +[1054/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_security.c.obj +[1055/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_auth.c.obj +[1056/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_module.c.obj +[1057/1343] Linking C static library esp-idf/ch405labs_esp_libssh2/libch405labs_esp_libssh2.a +[1058/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_client.c.obj +[1059/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_scp.c.obj +[1060/1343] Linking C static library esp-idf/espressif__mdns/libespressif__mdns.a +[1061/1343] Building C object esp-idf/ts_config_pack/CMakeFiles/__idf_ts_config_pack.dir/src/ts_config_pack.c.obj +[1062/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_sftp.c.obj +[1063/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_crypto.c.obj +[1064/1343] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert.c.obj +[1065/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_probe.c.obj +[1066/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_known_hosts.c.obj +[1067/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_shell.c.obj +[1068/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_port_forward.c.obj +[1069/1343] Linking C static library esp-idf/ts_config/libts_config.a +[1070/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_log_watch.c.obj +[1071/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_keystore.c.obj +[1072/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_hosts_config.c.obj +[1073/1343] Linking C static library esp-idf/ts_config_pack/libts_config_pack.a +[1074/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_compat.c.obj +[1075/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_variable.c.obj +[1076/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_automation.c.obj +[1077/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_codec.c.obj +[1078/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_store.c.obj +[1079/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_service.c.obj +[1080/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_runner.c.obj +[1081/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_freertos.c.obj +[1082/1343] Linking C static library esp-idf/ts_cert/libts_cert.a +[1083/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_commands_config.c.obj +[1084/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_cache.c.obj +[1085/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_memory.c.obj +[1086/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/port/esp/unity_utils_memory_esp.c.obj +[1087/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/constants.pb-c.c.obj +[1088/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_port_esp32.c.obj +[1089/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec0.pb-c.c.obj +[1090/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec1.pb-c.c.obj +[1091/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity/src/unity.c.obj +[1092/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/session.pb-c.c.obj +[1093/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec2.pb-c.c.obj +[1094/1343] Linking C static library esp-idf/ts_security/libts_security.a +[1095/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/common/protocomm.c.obj +[1096/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security0.c.obj +[1097/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_console.c.obj +[1098/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp_mpi.c.obj +[1099/1343] Building C object esp-idf/protobuf-c/CMakeFiles/__idf_protobuf-c.dir/protobuf-c/protobuf-c/protobuf-c.c.obj +[1100/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_httpd.c.obj +[1101/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_engine.c.obj +[1102/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/host_file_io.c.obj +[1103/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp.c.obj +[1104/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace_util.c.obj +[1105/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/port/port_uart.c.obj +[1106/1343] Linking C static library esp-idf/unity/libunity.a +[1107/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace.c.obj +[1108/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security1.c.obj +[1109/1343] Building C object esp-idf/cmock/CMakeFiles/__idf_cmock.dir/CMock/src/cmock.c.obj +[1110/1343] Linking C static library esp-idf/protobuf-c/libprotobuf-c.a +[1111/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security2.c.obj +[1112/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/esp_cam_ctlr.c.obj +[1113/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_source_manager.c.obj +[1114/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp_share_ctrl.c.obj +[1115/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_gdma.c.obj +[1116/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_action_manager.c.obj +[1117/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidd.c.obj +[1118/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hid_common.c.obj +[1119/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_common.c.obj +[1120/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidh.c.obj +[1121/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_io.c.obj +[1122/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ops.c.obj +[1123/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ssd1306.c.obj +[1124/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_nt35510.c.obj +[1125/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_st7789.c.obj +[1126/1343] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/common/touch_sens_common.c.obj +[1127/1343] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/hw_ver2/touch_version_specific.c.obj +[1128/1343] Linking C static library esp-idf/ts_automation/libts_automation.a +[1129/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v1.c.obj +[1130/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_cam.c.obj +[1131/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v2.c.obj +[1132/1343] Generating ../../lpmu-agx-network-setup.tar.gz.S +[1133/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_init.c.obj +[1134/1343] Linking C static library esp-idf/protocomm/libprotocomm.a +[1135/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/spi/esp_lcd_panel_io_spi.c.obj +[1136/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/proto-c/esp_local_ctrl.pb-c.c.obj +[1137/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_common.c.obj +[1138/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_transport_httpd.c.obj +[1139/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_uart.c.obj +[1140/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_elf.c.obj +[1141/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_binary.c.obj +[1142/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_handler.c.obj +[1143/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_flash.c.obj +[1144/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl.c.obj +[1145/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api.c.obj +[1146/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config.c.obj +[1147/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i80/esp_lcd_panel_io_i80.c.obj +[1148/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_power.c.obj +[1149/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_system.c.obj +[1150/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_service.c.obj +[1151/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config_pack.c.obj +[1152/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_gpio.c.obj +[1153/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_fan.c.obj +[1154/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_network.c.obj +[1155/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_temp.c.obj +[1156/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_monitor.c.obj +[1157/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_storage.c.obj +[1158/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_dhcp.c.obj +[1159/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_device.c.obj +[1160/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_wifi.c.obj +[1161/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_nat.c.obj +[1162/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_led.c.obj +[1163/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/rgb/esp_lcd_panel_rgb.c.obj +[1164/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_hosts.c.obj +[1165/1343] Building ASM object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/__/__/lpmu-agx-network-setup.tar.gz.S.obj +[1166/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_key.c.obj +[1167/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_lpmu_access.c.obj +[1168/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_sftp.c.obj +[1169/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_auth.c.obj +[1170/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_log.c.obj +[1171/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_time.c.obj +[1172/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ui.c.obj +[1173/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_cert.c.obj +[1174/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui.c.obj +[1175/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_api.c.obj +[1176/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_auth.c.obj +[1177/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ota.c.obj +[1178/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https.c.obj +[1179/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_args.c.obj +[1180/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_api.c.obj +[1181/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_i18n.c.obj +[1182/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_builtin.c.obj +[1183/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_operation.c.obj +[1184/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console.c.obj +[1185/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ssh.c.obj +[1186/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_script.c.obj +[1187/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_subscriptions.c.obj +[1188/1343] Performing configure step for 'bootloader' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-j1-build/sdkconfig +-- Compiler supported targets: xtensa-esp-elf +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Bootloader project name: "bootloader" version: 1 +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.rom.ld +-- Components: bootloader bootloader_support efuse esp_app_format esp_bootloader_format esp_common esp_hw_support esp_rom esp_security esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/components/micro-ecc /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld +-- Configuring done (3.3s) +-- Generating done (0.1s) +-- Build files have been written to: /tmp/tianshan-j1-build/build/bootloader +[1189/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_transport.c.obj +[1190/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_auto.c.obj +[1191/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_monitor.c.obj +[1192/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_device.c.obj +[1193/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/linenoise/linenoise.c.obj +[1194/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fan.c.obj +[1195/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_config.c.obj +[1196/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_gpio.c.obj +[1197/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fs.c.obj +[1198/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_dhcp.c.obj +[1199/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_ws.c.obj +[1200/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_hosts.c.obj +[1201/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_nat.c.obj +[1202/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_register.c.obj +[1203/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_key.c.obj +[1204/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_net.c.obj +[1205/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ota.c.obj +[1206/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_power.c.obj +[1207/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_pki.c.obj +[1208/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_service.c.obj +[1209/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_storage.c.obj +[1210/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_sftp.c.obj +[1211/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_voltprot.c.obj +[1212/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota.c.obj +[1213/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_temp.c.obj +[1214/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_rollback.c.obj +[1215/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_version.c.obj +[1216/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_wifi.c.obj +[1217/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_automation.c.obj +[1218/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_system.c.obj +[1219/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_led.c.obj +[1220/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_sdcard.c.obj +[1221/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_https.c.obj +[1222/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_recovery.c.obj +[1223/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ssh.c.obj +[1224/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net.c.obj +[1225/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_wifi.c.obj +[1226/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_eth.c.obj +[1227/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_www.c.obj +[1228/1343] Linking C static library esp-idf/ts_api/libts_api.a +[1229/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net_manager.c.obj +[1230/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_nat.c.obj +[1231/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led.c.obj +[1232/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_driver.c.obj +[1233/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_http_server.c.obj +[1234/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_layer.c.obj +[1235/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_time_sync.c.obj +[1236/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color.c.obj +[1237/1343] Linking C static library esp-idf/ts_https/libts_https.a +[1238/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_https_server.c.obj +[1239/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_download.c.obj +[1240/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_qrcode.c.obj +[1241/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_dhcp_server.c.obj +[1242/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_animation.c.obj +[1243/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_drivers.c.obj +[1244/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color_correction.c.obj +[1245/1343] Linking C static library esp-idf/ts_webui/libts_webui.a +[1246/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_font.c.obj +[1247/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_effect.c.obj +[1248/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_usb_mux.c.obj +[1249/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power.c.obj +[1250/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_preset.c.obj +[1251/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/qrcodegen/qrcodegen.c.obj +[1252/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_text.c.obj +[1253/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_monitor.c.obj +[1254/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_fan.c.obj +[1255/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_hal.c.obj +[1256/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_image.c.obj +[1257/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_device_ctrl.c.obj +[1258/1343] Linking C static library esp-idf/ts_console/libts_console.a +[1259/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_policy.c.obj +[1260/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_gpio.c.obj +[1261/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_compute_monitor.c.obj +[1262/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_temp_source.c.obj +[1263/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/platform/esp32s3/ts_platform_s3.c.obj +[1264/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_i2c.c.obj +[1265/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_sha.c.obj +[1266/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_spi.c.obj +[1267/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pwm.c.obj +[1268/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_crc.c.obj +[1269/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_uart.c.obj +[1270/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_adc.c.obj +[1271/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_spiffs.c.obj +[1272/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pin_manager.c.obj +[1273/1343] Linking C static library esp-idf/ts_ota/libts_ota.a +[1274/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage.c.obj +[1275/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/port/xtensa/core_dump_port.c.obj +[1276/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_access.c.obj +[1277/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_masks.c.obj +[1278/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_sd.c.obj +[1279/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_apis.c.obj +[1280/1343] Building C object esp-idf/nvs_sec_provider/CMakeFiles/__idf_nvs_sec_provider.dir/nvs_sec_provider.c.obj +[1281/1343] Linking C static library esp-idf/ts_net/libts_net.a +[1282/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/platform_esp32_idf.c.obj +[1283/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_outbox.c.obj +[1284/1343] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_utils.c.obj +[1285/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_msg.c.obj +[1286/1343] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_mqueue.c.obj +[1287/1343] Building C object esp-idf/ts_pki_client/CMakeFiles/__idf_ts_pki_client.dir/src/ts_pki_client.c.obj +[1288/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_private.c.obj +[1289/1343] Linking C static library esp-idf/ts_led/libts_led.a +[1290/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_helpers.c.obj +[1291/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_button.c.obj +[1292/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_matrix.c.obj +[1293/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_slider.c.obj +[1294/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hub.c.obj +[1295/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_element.c.obj +[1296/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_config.c.obj +[1297/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/enum.c.obj +[1298/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_ctrl.c.obj +[1299/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_phy.c.obj +[1300/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_scan.c.obj +[1301/1343] Linking C static library esp-idf/ts_drivers/libts_drivers.a +[1302/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usbh.c.obj +[1303/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_console.c.obj +[1304/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_ctrl.pb-c.c.obj +[1305/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_scan.pb-c.c.obj +[1306/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_constants.pb-c.c.obj +[1307/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/handlers.c.obj +[1308/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_host.c.obj +[1309/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_config.pb-c.c.obj +[1310/1343] Linking C static library esp-idf/ts_hal/libts_hal.a +[1311/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_softap.c.obj +[1312/1343] Linking C static library esp-idf/app_trace/libapp_trace.a +[1313/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hcd_dwc.c.obj +[1314/1343] Linking C static library esp-idf/cmock/libcmock.a +[1315/1343] Linking C static library esp-idf/esp_driver_cam/libesp_driver_cam.a +[1316/1343] Linking C static library esp-idf/esp_driver_touch_sens/libesp_driver_touch_sens.a +[1317/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj +[1318/1343] Linking C static library esp-idf/esp_hid/libesp_hid.a +[1319/1343] Linking C static library esp-idf/esp_local_ctrl/libesp_local_ctrl.a +[1320/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_core_init.c.obj +[1321/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/mqtt_client.c.obj +[1322/1343] Linking C static library esp-idf/esp_lcd/libesp_lcd.a +[1323/1343] Linking C static library esp-idf/espcoredump/libespcoredump.a +[1324/1343] Linking C static library esp-idf/ts_storage/libts_storage.a +[1325/1343] Linking C static library esp-idf/nvs_sec_provider/libnvs_sec_provider.a +[1326/1343] Linking C static library esp-idf/perfmon/libperfmon.a +[1327/1343] Linking C static library esp-idf/rt/librt.a +[1328/1343] Linking C static library esp-idf/touch_element/libtouch_element.a +[1329/1343] Linking C static library esp-idf/usb/libusb.a +[1330/1343] Linking C static library esp-idf/mqtt/libmqtt.a +[1331/1343] Linking C static library esp-idf/ts_pki_client/libts_pki_client.a +[1332/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/manager.c.obj +[1333/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_services.c.obj +[1334/1343] Linking C static library esp-idf/wifi_provisioning/libwifi_provisioning.a +[1335/1343] Linking C static library esp-idf/main/libmain.a +[1336/1343] Performing build step for 'bootloader' +[1/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_timestamp.c.obj +[2/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/util.c.obj +[3/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[4/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[5/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_lock.c.obj +[6/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[7/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[8/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[9/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[10/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[11/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[12/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[13/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[14/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[15/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[16/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[17/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[18/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[19/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[20/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[21/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[22/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[23/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[24/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[25/123] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[26/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[27/123] Linking C static library esp-idf/log/liblog.a +[28/123] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[29/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[30/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[31/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[32/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[33/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[34/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[35/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[36/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[37/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[38/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[39/123] Linking C static library esp-idf/esp_rom/libesp_rom.a +[40/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[41/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[42/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[43/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[44/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[45/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[46/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[47/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[48/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[49/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[50/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[51/123] Linking C static library esp-idf/esp_common/libesp_common.a +[52/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[53/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[54/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[55/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[56/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj +[57/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[58/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[59/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj +[60/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_soc.c.obj +[61/123] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[62/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[63/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj +[64/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj +[65/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[66/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_esp32s3.c.obj +[67/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj +[68/123] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[69/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[70/123] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[71/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[72/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[73/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[74/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[75/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[76/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[77/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[78/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[79/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[80/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[81/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[82/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[83/123] Linking C static library esp-idf/esp_system/libesp_system.a +[84/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[85/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[86/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[87/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[88/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[89/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[90/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[91/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[92/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[93/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[94/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[95/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[96/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[97/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[98/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[99/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[100/123] Generating project_elf_src_esp32s3.c +[101/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[102/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[103/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[104/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[105/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[106/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[107/123] Linking C static library esp-idf/efuse/libefuse.a +[108/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[109/123] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32s3.c.obj +[110/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[111/123] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj +[112/123] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[113/123] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[114/123] Linking C static library esp-idf/spi_flash/libspi_flash.a +[115/123] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj +[116/123] Linking C static library esp-idf/hal/libhal.a +[117/123] Linking C static library esp-idf/micro-ecc/libmicro-ecc.a +[118/123] Linking C static library esp-idf/soc/libsoc.a +[119/123] Linking C static library esp-idf/xtensa/libxtensa.a +[120/123] Linking C static library esp-idf/main/libmain.a +[121/123] Linking C executable bootloader.elf +[122/123] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-j1-build/build/bootloader/bootloader.bin +[123/123] cd /tmp/tianshan-j1-build/build/bootloader/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /tmp/tianshan-j1-build/build/bootloader/bootloader.bin +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[1337/1343] No install step for 'bootloader' +[1338/1343] Completed 'bootloader' +[1339/1343] Generating esp-idf/esp_system/ld/sections.ld +[1340/1343] Building C object CMakeFiles/TianShanOS.elf.dir/project_elf_src_esp32s3.c.obj +[1341/1343] Linking CXX executable TianShanOS.elf +[1342/1343] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-j1-build/build/TianShanOS.bin +[1343/1343] cd /tmp/tianshan-j1-build/build/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 partition --type app /tmp/tianshan-j1-build/build/partition_table/partition-table.bin /tmp/tianshan-j1-build/build/TianShanOS.bin +TianShanOS.bin binary size 0x215120 bytes. Smallest app partition is 0x300000 bytes. 0xeaee0 bytes (31%) free. + +Project build complete. To flash, run: + idf.py flash +or + idf.py -p PORT flash +or + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m 0x0 ../../../private/tmp/tianshan-j1-build/build/bootloader/bootloader.bin 0x8000 ../../../private/tmp/tianshan-j1-build/build/partition_table/partition-table.bin 0x16000 ../../../private/tmp/tianshan-j1-build/build/ota_data_initial.bin 0x20000 ../../../private/tmp/tianshan-j1-build/build/TianShanOS.bin 0x6a0000 ../../../private/tmp/tianshan-j1-build/build/www.bin +or from the "/private/tmp/tianshan-j1-build/build" directory + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args" diff --git a/docs/repair/ws-j1/changes.patch b/docs/repair/ws-j1/changes.patch new file mode 100644 index 0000000..20b26c7 --- /dev/null +++ b/docs/repair/ws-j1/changes.patch @@ -0,0 +1,195 @@ +diff --git a/components/ts_webui/web/index.html b/components/ts_webui/web/index.html +index d4aa9c9..59265c7 100644 +--- a/components/ts_webui/web/index.html ++++ b/components/ts_webui/web/index.html +@@ -41,9 +41,9 @@ + .modal-content{background:var(--bg-card);border-radius:var(--radius-lg);max-width:600px;width:95%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg)} + + +- +- +- ++ ++ ++ + + + +@@ -247,7 +247,7 @@ + + + +- +- +- +- +- ++ ++ ++ ++ ++ + + +diff --git a/components/ts_webui/web/js/terminal.js b/components/ts_webui/web/js/terminal.js +index ccd3a51..8fb1240 100644 +--- a/components/ts_webui/web/js/terminal.js ++++ b/components/ts_webui/web/js/terminal.js +@@ -477,6 +477,7 @@ class WebTerminal { + * 处理电压保护事件 + */ + handlePowerEvent(msg) { ++ if (this.destroyed || !this.terminal) return; + const state = msg.state || 'UNKNOWN'; + const voltage = msg.voltage ? msg.voltage.toFixed(2) : '?.??'; + const countdown = msg.countdown || 0; +@@ -535,6 +536,19 @@ class WebTerminal { + } + + if (notification) { ++ const canRestoreLocalInput = ++ !this.destroyed && ++ this.connected && ++ this.ws && ++ this.ws.readyState === WebSocket.OPEN && ++ !this.sshMode && ++ !this.sshConnecting && ++ !this.sshDisconnecting && ++ !this.restoring; ++ if (!canRestoreLocalInput) { ++ this.writeln(`\r\n${color}${notification}\x1b[0m`); ++ return; ++ } + // 保存当前输入状态 + const savedBuffer = this.inputBuffer; + const savedPosition = this.cursorPosition; +diff --git a/tests/prompts/project-cross.cjs b/tests/prompts/project-cross.cjs +index c902f24..acc03de 100644 +--- a/tests/prompts/project-cross.cjs ++++ b/tests/prompts/project-cross.cjs +@@ -48,6 +48,22 @@ async function main(){ + if(baseline){assert(!recovered && next.type!=='ssh_input');await step({cmd:'finish'});await done;assert.equal(exit,0,err);console.log('CONFIRMED H1: actual C request error leaves op OPEN but JS exits SSH and next input is not routed to SSH');return;} + assert(recovered,'request failure changed active SSH mode/prompt/recovery');assert.equal(next.type,'ssh_input'); + let cs=await step({message:next});assert.equal(cs.writes,afterSignal.writes+1,'next frontend input must execute on original C Shell'); ++ // J1: real C protection notification must not fabricate local SSH input. ++ const j1Before=await state(),j1Frames=records.length,j1Identity=cs.identity,j1Writes=cs.writes; ++ await e.run(`term.inputBuffer='local-buffer';term.cursorPosition=3;`); ++ const j1Fields=()=>e.run(`JSON.stringify([term.connected,term.sshMode,term.sshConnecting,term.sshDisconnecting,term.restoring,term.inputBuffer,term.cursorPosition])`); ++ const j1Snapshot=await j1Fields();cs=await step({cmd:'power'}); ++ const j1After=await state(),j1Display=j1After.lines.slice(j1Before.lines.length); ++ assert(records.slice(j1Frames).some(r=>r.fd===1&&r.frame?.type==='power_event'),'actual C power frame absent'); ++ assert.equal(j1Display.length,1);assert(j1Display[0].startsWith('\r\n')); ++ assert(!j1Display.join('').includes('tianshan>')&&!j1Display.join('').includes('local-buffer')&&!j1Display.join('').includes('\x1b[K')); ++ assert.equal(await j1Fields(),j1Snapshot);assert.deepEqual(j1After.sent,j1Before.sent); ++ await e.run(`input('j')`);const j1Request=await e.run('sent.shift()');assert.equal(j1Request.type,'ssh_input'); ++ cs=await step({message:j1Request});assert.equal(cs.identity,j1Identity);assert.equal(cs.writes,j1Writes+1); ++ await e.run(`input('\\x1c')`);await sendNext();assert(!(await state()).mode);assert.equal((await step({cmd:'drain'})).channels,0); ++ assert((await state()).lines.slice(j1Before.lines.length).includes('tianshan> ')); ++ await e.run(`term.inputBuffer='';term.cursorPosition=0;`);cs=await start();assert((await state()).mode); ++ console.log('PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup'); + for(const message of [{type:'ssh_resize',width:0,height:20},{type:'ssh_resize',width:80.5,height:20}]){await step({message});assert((await state()).mode);} + await step({cmd:'resize_reject'});await step({message:{type:'ssh_resize',width:80,height:24}});assert((await state()).mode);await step({cmd:'reset_driver'}); + // Another page cannot input, disconnect, signal or resize the current owner. +diff --git a/tests/prompts/regression.test.cjs b/tests/prompts/regression.test.cjs +index d6bf002..2d9db10 100644 +--- a/tests/prompts/regression.test.cjs ++++ b/tests/prompts/regression.test.cjs +@@ -169,3 +169,40 @@ for(const lang of ['zh-CN','en-US']) { + } + }); + } ++ ++for (const lang of ['zh-CN','en-US']) { ++ test(`${lang}: J1 power alerts preserve local line, SSH ownership, transition guards and filtering`,async()=>{ ++ const h=await setup(lang),{run,ctx}=h; ++ run(`window.j1=new WebTerminal('fixture');window.j1Writes=[];window.j1Sent=[];window.j1Input=null; ++ j1.terminal={write:s=>j1Writes.push(s),writeln:s=>j1Writes.push(s),onData:f=>j1Input=f}; ++ j1.ws={readyState:WebSocket.OPEN,send:s=>j1Sent.push(JSON.parse(s))};j1.connected=true; ++ j1.inputBuffer='abcd';j1.cursorPosition=2;j1.setupInputHandler();`); ++ const alert={type:'power_event',event:'low_voltage',voltage:10.5}; ++ const snapshot=()=>run(`JSON.stringify([j1.connected,j1.sshMode,j1.sshConnecting,j1.sshDisconnecting,j1.restoring,j1.inputBuffer,j1.cursorPosition])`); ++ const deliver=msg=>ctx.j1.handleMessage(msg||alert); ++ const original=snapshot();deliver();deliver();assert.equal(snapshot(),original);assert.equal(ctx.j1Sent.length,0); ++ const local=[...ctx.j1Writes];assert.equal(local.length,8); ++ for(const offset of [0,4]){assert.equal(local[offset],'\r\x1b[K');assert(local[offset+1].includes(ctx.t('terminal.lowVoltageWarning',{voltage:'10.50'})));assert.equal(local[offset+2],'tianshan> abcd');assert.equal(local[offset+3],'\x1b[2D');} ++ const cases=[{sshMode:true},{sshConnecting:true},{sshMode:true,sshDisconnecting:true},{restoring:true,connected:false},{restoring:true},{connected:false},{socket:3},{socket:null}]; ++ for(const changes of cases){ ++ run(`Object.assign(j1,{connected:true,sshMode:false,sshConnecting:false,sshDisconnecting:false,restoring:false});j1.ws={readyState:1,send:s=>j1Sent.push(JSON.parse(s))};j1Writes.length=0;`); ++ for(const [key,value]of Object.entries(changes)){if(key==='socket'){if(value===null)ctx.j1.ws=null;else ctx.j1.ws.readyState=value;}else ctx.j1[key]=value;} ++ const before=snapshot();deliver();deliver();assert.equal(snapshot(),before);assert.equal(ctx.j1Sent.length,0); ++ assert.equal(ctx.j1Writes.length,2);for(const line of ctx.j1Writes){assert(line.startsWith('\r\n'));assert(!line.includes('tianshan>'));assert(!line.includes('abcd'));assert(!line.includes('\x1b[K'));assert(!line.includes('\x1b[2D'));} ++ if(changes.sshConnecting||changes.sshDisconnecting||changes.connected===false){run('j1Input('+JSON.stringify('x\r')+')');assert.equal(ctx.j1Sent.length,0);} ++ } ++ run(`Object.assign(j1,{connected:true,sshMode:true,sshConnecting:false,sshDisconnecting:false,restoring:false});j1.ws={readyState:1,send:s=>j1Sent.push(JSON.parse(s))};j1Writes.length=0;`); ++ deliver();run(`j1Input('z')`);assert.equal(ctx.j1Sent[0].type,'ssh_input');assert.equal(ctx.j1Sent[0].data,'z'); ++ run(`j1Input('\x1c')`);assert.equal(ctx.j1Sent[1].type,'ssh_disconnect');assert(ctx.j1.sshMode);assert(!ctx.j1Writes.join('').includes('tianshan>')); ++ deliver({type:'ssh_status',status:'disconnecting'});deliver();assert(ctx.j1.sshMode);assert(!ctx.j1Writes.join('').includes('tianshan>')); ++ deliver({type:'ssh_status',status:'closed'});assert(!ctx.j1.sshMode);assert.equal(ctx.j1Writes.filter(x=>x==='tianshan> ').length,1); ++ ctx.j1Writes.length=0;deliver();assert.equal(ctx.j1Writes[2],'tianshan> abcd');assert.equal(ctx.j1Writes[3],'\x1b[2D');assert.equal(ctx.j1Sent.length,2); ++ ctx.j1Writes.length=0;deliver({type:'power_event',event:'countdown_tick',countdown:31});assert.equal(ctx.j1Writes.length,0); ++ for(const event of ['low_voltage','shutdown_start','protected','recovery_start','recovery_complete','debug_tick','state_changed','countdown_tick']){ ++ ctx.j1Writes.length=0;deliver({type:'power_event',event,countdown:30,voltage:10.5,state:'NORMAL'});assert.equal(ctx.j1Writes.length,4,event); ++ } ++ ctx.j1.destroyed=true;ctx.j1.terminal=new Proxy({}, {get(){throw Error('destroyed terminal accessed');}}); ++ assert.doesNotThrow(()=>ctx.j1.handlePowerEvent(alert));assert.doesNotThrow(()=>deliver()); ++ ctx.j1.destroyed=false;ctx.j1.terminal=null;assert.doesNotThrow(()=>ctx.j1.handlePowerEvent(alert));assert.equal(ctx.j1Sent.length,2); ++ }); ++} +diff --git a/tests/ws_subscriptions/test_project.c b/tests/ws_subscriptions/test_project.c +index b7b63f7..3966f69 100644 +--- a/tests/ws_subscriptions/test_project.c ++++ b/tests/ws_subscriptions/test_project.c +@@ -13,6 +13,11 @@ int main(void){ + cJSON *j=cJSON_Parse(line);assert(j);const char *cmd=cJSON_GetStringValue(cJSON_GetObjectItem(j,"cmd")); + if(cmd && !strcmp(cmd,"finish")){ssh_cleanup();if(shell_task.fn){shell_task.fn(shell_task.arg);shell_task.fn=NULL;}drive_all();cJSON_Delete(j);finish_all();assert(!driver_channels&&!driver_sessions&&!driver_sockets);puts("{\"finished\":true}");return 0;} + if(cmd && !strcmp(cmd,"eof")){driver_eof=true;shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} ++ else if(cmd && !strcmp(cmd,"power")){ ++ ts_power_policy_status_t status={.state=TS_POWER_POLICY_STATE_LOW_VOLTAGE,.current_voltage=10.5f,.countdown_remaining_sec=30}; ++ ts_event_t event={.id=TS_POWER_POLICY_EVENT_LOW_VOLTAGE,.data=&status}; ++ power_policy_event_handler(&event,NULL);drive_all(); ++ } + else if(cmd && !strcmp(cmd,"output")){ssh_shell_context_t *ctx=shell_task.arg;ssh_send_output(ctx,"stream",6);} + else if(cmd && !strcmp(cmd,"error_close")){barrier_name="request_error_encode";barrier_action=close_during_error;} + else if(cmd && !strcmp(cmd,"write_again"))driver_write_again=true; +@@ -34,7 +39,7 @@ int main(void){ + } + if(shell_task.fn && (((ssh_shell_context_t*)shell_task.arg)->disconnect_requested || !ts_ws_op_is_open(((ssh_shell_context_t*)shell_task.arg)->op))){shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} + ts_ws_op_stats_t st;ts_ws_op_stats(TS_WS_OP_SHELL,&st); +- printf("{\"state\":%d,\"writes\":%d,\"live\":%u,\"channels\":%d,\"refs\":%u,\"preparing\":%u,\"unsettled\":%u}\n",st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j); ++ printf("{\"identity\":%u,\"state\":%d,\"writes\":%d,\"live\":%u,\"channels\":%d,\"refs\":%u,\"preparing\":%u,\"unsettled\":%u}\n",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j); + } + return 2; + } +diff --git a/tests/ws_subscriptions/verify_project_assets.py b/tests/ws_subscriptions/verify_project_assets.py +index 20e4116..bbcda8b 100644 +--- a/tests/ws_subscriptions/verify_project_assets.py ++++ b/tests/ws_subscriptions/verify_project_assets.py +@@ -1,15 +1,16 @@ + #!/usr/bin/env python3 + """Verify final optimized/gzip files and reproduce SPIFFS with the fixed SDK.""" +-import gzip,hashlib,json,os,pathlib,subprocess,tempfile ++import gzip,hashlib,json,os,pathlib,re,subprocess,tempfile + root=pathlib.Path(__file__).resolve().parents[2] +-build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));web=build/'esp-idf/ts_webui/web_optimized';src=root/'components/ts_webui/web';doc=root/'docs/repair/ws-project-v3' ++build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));web=build/'esp-idf/ts_webui/web_optimized';src=root/'components/ts_webui/web';doc=pathlib.Path(os.environ.get('V3_RESULTS',str(root/'docs/repair/ws-project-v3'))) + sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() + result={} + for rel in ['index.html','js/terminal.js','js/lang/zh-CN.js','js/lang/en-US.js']: + p=web/rel;gz=p.with_suffix(p.suffix+'.gz');assert gzip.decompress(gz.read_bytes())==p.read_bytes() + if rel.endswith('.js'):subprocess.run(['node','--check',str(p)],check=True) + result[rel]={'source_sha256':sha(src/rel),'optimized_sha256':sha(p),'gzip_sha256':sha(gz),'optimized_bytes':p.stat().st_size} +-assert '20260926-shell-contract' in (web/'index.html').read_text() ++asset_version=re.search(r"TS_ASSET_VERSION = '([^']+)'",(src/'index.html').read_text()).group(1) ++assert asset_version in (web/'index.html').read_text() + assert 'sshControlUnsupported' in (web/'js/terminal.js').read_text() + with tempfile.TemporaryDirectory(prefix='ts-v3-spiffs-') as d: + image=pathlib.Path(d)/'www.bin' diff --git a/docs/repair/ws-j1/cross-browser-en-US.json b/docs/repair/ws-j1/cross-browser-en-US.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ws-j1/cross-browser-en-US.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-j1/cross-browser-en-US.txt b/docs/repair/ws-j1/cross-browser-en-US.txt new file mode 100644 index 0000000..f832b4b --- /dev/null +++ b/docs/repair/ws-j1/cross-browser-en-US.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-j1/cross-browser-zh-CN.json b/docs/repair/ws-j1/cross-browser-zh-CN.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ws-j1/cross-browser-zh-CN.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-j1/cross-browser-zh-CN.txt b/docs/repair/ws-j1/cross-browser-zh-CN.txt new file mode 100644 index 0000000..1f8c8bd --- /dev/null +++ b/docs/repair/ws-j1/cross-browser-zh-CN.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-j1/cross-node-en-US.json b/docs/repair/ws-j1/cross-node-en-US.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ws-j1/cross-node-en-US.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-j1/cross-node-en-US.txt b/docs/repair/ws-j1/cross-node-en-US.txt new file mode 100644 index 0000000..7c3e1b4 --- /dev/null +++ b/docs/repair/ws-j1/cross-node-en-US.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Node en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-j1/cross-node-results.json b/docs/repair/ws-j1/cross-node-results.json new file mode 100644 index 0000000..5cf1c51 --- /dev/null +++ b/docs/repair/ws-j1/cross-node-results.json @@ -0,0 +1,18 @@ +[ + { + "language": "zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs" + ], + "exit": 0 + }, + { + "language": "en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ws-j1/cross-node-zh-CN.json b/docs/repair/ws-j1/cross-node-zh-CN.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ws-j1/cross-node-zh-CN.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-j1/cross-node-zh-CN.txt b/docs/repair/ws-j1/cross-node-zh-CN.txt new file mode 100644 index 0000000..4699bd2 --- /dev/null +++ b/docs/repair/ws-j1/cross-node-zh-CN.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Node zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-j1/diff-check.txt b/docs/repair/ws-j1/diff-check.txt new file mode 100644 index 0000000..7ef22e9 --- /dev/null +++ b/docs/repair/ws-j1/diff-check.txt @@ -0,0 +1 @@ +PASS diff --git a/docs/repair/ws-j1/inputs.json b/docs/repair/ws-j1/inputs.json new file mode 100644 index 0000000..dda219d --- /dev/null +++ b/docs/repair/ws-j1/inputs.json @@ -0,0 +1,31 @@ +{ + "head": "8ad39a9b1ca39d225f94fb4db602fb2ee7438d09", + "branch": "fix/v0.5.2-reliability-and-prompts", + "sha256": { + "components/ts_webui/web/index.html": { + "before": "cb1baa1bfbd2fac00a5fc55caa5442da07ab83b99996af52a41fc5c7e6e98092", + "after": "ad6e0ed5e11c34b8797877be912ea2e42a5dc632b6cdae1b915222ea6ea6315b" + }, + "components/ts_webui/web/js/terminal.js": { + "before": "6d93870c3b33b1888388f3a288cfca581a3034a2a212e1e4130853d1aceda581", + "after": "8bfa9622f6fafb8cf1c88ab1081b47fa32df0fdd1814acdf67bd7708326ec0a1" + }, + "tests/prompts/project-cross.cjs": { + "before": "7928610e031f5e0b6ad001f14f0dd5ac39f534dfea253108747f433ae5e92a76", + "after": "882a05fea9b75a9d3b959e4e7c1e44db8b89289faaa5837ab9e1779959e6a70c" + }, + "tests/prompts/regression.test.cjs": { + "before": "c372b74e125b361103defe66017c3eeb286fea9975cf4f3167ed5cf981050516", + "after": "40ced30bd90f4e7c8529ef0ccb3c89af573796a4feff7a0531095c0cf60ff82c" + }, + "tests/ws_subscriptions/test_project.c": { + "before": "c8026c5105688edfe0e06e502bddcd7e44fcafb2def960bec53d773b6135e675", + "after": "071fd81304d303ecb4c3679952ba9da648c088447aa47cf6bde120830f890d46" + }, + "tests/ws_subscriptions/verify_project_assets.py": { + "before": "0ed7406a6927115f4574187158e53bd085d6cf3afc2962254c62133c839c9c43", + "after": "555cded164a2d1f8d096b1071e06c63928c121bb05be6d44fe8da7522d0b2e6b" + } + }, + "scope": "terminal.js outside handlePowerEvent unchanged; index only cache key; no production backend changes" +} \ No newline at end of file diff --git a/docs/repair/ws-j1/optimized-cross-en-US.json b/docs/repair/ws-j1/optimized-cross-en-US.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ws-j1/optimized-cross-en-US.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-j1/optimized-cross-en-US.txt b/docs/repair/ws-j1/optimized-cross-en-US.txt new file mode 100644 index 0000000..f832b4b --- /dev/null +++ b/docs/repair/ws-j1/optimized-cross-en-US.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-j1/optimized-cross-zh-CN.json b/docs/repair/ws-j1/optimized-cross-zh-CN.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ws-j1/optimized-cross-zh-CN.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ws-j1/optimized-cross-zh-CN.txt b/docs/repair/ws-j1/optimized-cross-zh-CN.txt new file mode 100644 index 0000000..1f8c8bd --- /dev/null +++ b/docs/repair/ws-j1/optimized-cross-zh-CN.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-j1/optimized-results.json b/docs/repair/ws-j1/optimized-results.json new file mode 100644 index 0000000..b9b1232 --- /dev/null +++ b/docs/repair/ws-j1/optimized-results.json @@ -0,0 +1,20 @@ +[ + { + "language": "zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + }, + { + "language": "en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ws-j1/publication-cross.txt b/docs/repair/ws-j1/publication-cross.txt new file mode 100644 index 0000000..7c3e1b4 --- /dev/null +++ b/docs/repair/ws-j1/publication-cross.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Node en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ws-j1/publication-gate.md b/docs/repair/ws-j1/publication-gate.md new file mode 100644 index 0000000..b41d7c0 --- /dev/null +++ b/docs/repair/ws-j1/publication-gate.md @@ -0,0 +1,21 @@ +# J1 提交前审查 + +结论:可以推送。用户已另行授权更新 PR #42,不授权合并或发布。 + +基线:8ad39a9b1ca39d225f94fb4db602fb2ee7438d09;远端 PR 仍为 OPEN,head 与本地基线相同。 + +## 范围与不变量 + +检查完整六文件 diff:生产代码仅 handlePowerEvent 与静态资源缓存标识;测试夹具调用真实保护通知、socket 消费、输入回调与 C handler。无生产后端、协议、版本或工作流修改。原事件筛选及本地行恢复保留;非本地可交互状态只显示通知,不改变状态或输入目的地。原跨层断言保留。 + +## 本次补跑 + +- `node --test --test-name-pattern=J1 tests/prompts/regression.test.cjs`:通过,见 publication-node.txt。 +- `IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf DEVELOPER_DIR=/Library/Developer/CommandLineTools node tests/prompts/project-cross.cjs`:通过,见 publication-cross.txt。实际 C 告警经过生产 JS 后,下一输入仍进入原 SSH,正常退出并回收。 +- `git diff --check`:通过。六项当前源码/测试 SHA256 与 inputs.json 的 after 值全部一致。 + +本次发布准备未重复完整浏览器套件或固件编译,采用本轮 J1 实施阶段相同输入的 WebUI、双语跨层、优化资源 Chrome、固定 SDK 独立目录编译及 SPIFFS 一致性证据,详见 README。历史 v3 结果单独保留,不代替 J1 验证。 + +## 提交与验收边界 + +只纳入六个 J1 源码/测试文件及本目录。output/、tmp/ 与 runtime-repair 下原未跟踪文件排除,保持原样。没有发现本轮范围内阻断提交的问题;这不代表整个 PR 无缺陷。真实设备电源告警、SSH/xterm 呈现、网络时序及设备缓存升级仍需实机验收,未操作设备。 diff --git a/docs/repair/ws-j1/publication-node.txt b/docs/repair/ws-j1/publication-node.txt new file mode 100644 index 0000000..9e7652a --- /dev/null +++ b/docs/repair/ws-j1/publication-node.txt @@ -0,0 +1,10 @@ +✔ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (16.265167ms) +✔ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (5.204708ms) +ℹ tests 2 +ℹ suites 0 +ℹ pass 2 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 65.025875 diff --git a/docs/repair/ws-j1/webui-browser.txt b/docs/repair/ws-j1/webui-browser.txt new file mode 100644 index 0000000..d3c5a1b --- /dev/null +++ b/docs/repair/ws-j1/webui-browser.txt @@ -0,0 +1,56 @@ + +> test:browser +> cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs + +✔ zh-CN: real index cold start, safe toast/file text, current websocket state (4806.164125ms) +✔ zh-CN: initial language failure blocks controls and retry recovers (261.186833ms) +✔ en-US: real index cold start, safe toast/file text, current websocket state (323.698667ms) +✔ en-US: initial language failure blocks controls and retry recovers (340.39075ms) +✔ delayed language package and rapid switches keep the latest requested language (285.129ms) +✔ terminal resource failure presents retry; a rejected cached promise is not reused (374.057667ms) +✔ zh-CN: package confirmation treats names as text and applies only on explicit verified action (301.959959ms) +✔ en-US: package confirmation treats names as text and applies only on explicit verified action (321.459375ms) +✔ initial delayed language keeps controls inert until the real package arrives (232.756458ms) +✔ failed language switch preserves the loaded language; retry clears failure and stale toast (392.509917ms) +✔ terminal can initialize after failed resource load using newly served resources (385.423459ms) +{"case":"successful retry","language":"zh-CN","failure":"/sdcard/a.tscfg: 应用失败: 设备处理请求时发生错误,请查看详细原因。\n详细原因:fixture failure","afterSuccess":"/sdcard/a.tscfg: 配置包已应用。","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure zh-CN (4732.002584ms) +{"case":"late completion","language":"zh-CN","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: 正在应用配置...","errors":[]} +✔ review2: prior completion closes new package confirmation zh-CN (192.381708ms) +{"case":"stale file list","language":"zh-CN","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close zh-CN (179.46875ms) +{"case":"successful retry","language":"en-US","failure":"/sdcard/a.tscfg: Apply failed: The device encountered an error while processing the request. See the details below.\nDetails: fixture failure","afterSuccess":"/sdcard/a.tscfg: The configuration package was applied.","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure en-US (250.126042ms) +{"case":"late completion","language":"en-US","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: Applying config...","errors":[]} +✔ review2: prior completion closes new package confirmation en-US (283.28325ms) +{"case":"stale file list","language":"en-US","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close en-US (248.24125ms) +✔ R1: endpoint-specific logout and HTTP errors zh-CN (174.608875ms) +✔ R3: late validation cannot revive an old apply entry zh-CN (180.996333ms) +✔ R3: previously opened confirmation loses validity on reupload zh-CN (163.60775ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts zh-CN (192.989417ms) +✔ R6: fixed upload destination and separate refresh failure zh-CN (190.113083ms) +✔ R6: out-of-order directory success and error do not replace latest list zh-CN (195.161459ms) +✔ R1: endpoint-specific logout and HTTP errors en-US (273.16925ms) +✔ R3: late validation cannot revive an old apply entry en-US (245.426625ms) +✔ R3: previously opened confirmation loses validity on reupload en-US (241.695959ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts en-US (242.689959ms) +✔ R6: fixed upload destination and separate refresh failure en-US (228.44125ms) +✔ R6: out-of-order directory success and error do not replace latest list en-US (237.10725ms) +✔ R2: authenticated startup initializes once (261.73075ms) +✔ R2: obsolete system loader cannot update new page; failed navigation retries (239.543791ms) +✔ R4/R5: newest result wins over late success and late failure (224.590792ms) +✔ R3: overlapping writes to one path cannot claim current verified content (232.761625ms) +✔ R2: disposed page only removes its dashboard callback (261.315459ms) +✔ R2: stale finally cannot unlock the new page read (233.281167ms) +✔ R1: delayed sign-out does not clear a newer sign-in (230.918292ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements zh-CN (298.276333ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements en-US (359.741125ms) +ℹ tests 38 +ℹ suites 0 +ℹ pass 38 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 11145.844209 diff --git a/docs/repair/ws-j1/webui-node.txt b/docs/repair/ws-j1/webui-node.txt new file mode 100644 index 0000000..311e552 --- /dev/null +++ b/docs/repair/ws-j1/webui-node.txt @@ -0,0 +1,53 @@ + +> test +> cd ../.. && node --test tests/prompts/static.test.cjs tests/prompts/regression.test.cjs + +✔ zh-CN: actual inline translator, cold language, missing/objects/parameters and confirmations (15.437209ms) +✔ zh-CN: REST business failure remains returned; strict operation rejects with original metadata (6.145792ms) +✔ zh-CN: timeout covers response body; result stays unknown for POST (7.544167ms) +✔ zh-CN: toast timer replacement, priority, safe multiline text (4.853291ms) +✔ zh-CN: actual mutations do not report success or close dialogs on business failures (4.952125ms) +✔ zh-CN: batch deletion all / partial / no success with business errors (4.974875ms) +✔ zh-CN: downloads propagate actual initiation failures and retain batch details (5.576125ms) +✔ zh-CN: file names are text; upload/verification/apply remain separate (6.079542ms) +✔ zh-CN: SSH actual event handler honors terminal states and diagnoses conflicts (5.603083ms) +✔ zh-CN: background command timeout is unconfirmed and never resubmitted (5.138ms) +✔ zh-CN: terminal restoration waits for acknowledgement; timeout/failure stay distinct (5.974209ms) +✔ zh-CN: ping results are reachability only; failed probe is unknown and no pulse replay (5.478917ms) +✔ zh-CN: websocket label matches color across language changes and power warnings persist (4.4665ms) +✔ en-US: actual inline translator, cold language, missing/objects/parameters and confirmations (5.078791ms) +✔ en-US: REST business failure remains returned; strict operation rejects with original metadata (5.453791ms) +✔ en-US: timeout covers response body; result stays unknown for POST (6.370333ms) +✔ en-US: toast timer replacement, priority, safe multiline text (5.022792ms) +✔ en-US: actual mutations do not report success or close dialogs on business failures (5.485083ms) +✔ en-US: batch deletion all / partial / no success with business errors (5.825875ms) +✔ en-US: downloads propagate actual initiation failures and retain batch details (5.332125ms) +✔ en-US: file names are text; upload/verification/apply remain separate (5.430666ms) +✔ en-US: SSH actual event handler honors terminal states and diagnoses conflicts (8.141375ms) +✔ en-US: background command timeout is unconfirmed and never resubmitted (4.413375ms) +✔ en-US: terminal restoration waits for acknowledgement; timeout/failure stay distinct (4.351666ms) +✔ en-US: ping results are reachability only; failed probe is unknown and no pulse replay (4.789459ms) +✔ en-US: websocket label matches color across language changes and power warnings persist (4.308583ms) +✔ zh-CN: upload and download aggregates cover all success and all failure (4.797458ms) +✔ zh-CN: key deployment requires successful business code and distinguishes verification (5.053458ms) +✔ zh-CN: real LED/status renderers localize finite built-in identifiers (4.387166ms) +✔ en-US: upload and download aggregates cover all success and all failure (4.694167ms) +✔ en-US: key deployment requires successful business code and distinguishes verification (4.379459ms) +✔ en-US: real LED/status renderers localize finite built-in identifiers (4.56425ms) +✔ zh-CN: widget dynamic families render real labels and literal braces in names remain valid (4.548542ms) +✔ zh-CN: unknown stop result never escalates to forced termination (5.390541ms) +✔ en-US: widget dynamic families render real labels and literal braces in names remain valid (4.448583ms) +✔ en-US: unknown stop result never escalates to forced termination (4.318833ms) +✔ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (4.955875ms) +✔ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (5.157542ms) +Checked 3066 references including conditional and finite dynamic families. +✔ actual UI literal/conditional and finite dynamic keys exist in both languages with matching contracts (5.812667ms) +✔ production i18n is the inline entry; no second translator script is loaded (0.128375ms) +ℹ tests 40 +ℹ suites 0 +ℹ pass 40 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 256.997333 diff --git a/tests/prompts/project-cross.cjs b/tests/prompts/project-cross.cjs index c902f24..acc03de 100644 --- a/tests/prompts/project-cross.cjs +++ b/tests/prompts/project-cross.cjs @@ -48,6 +48,22 @@ async function main(){ if(baseline){assert(!recovered && next.type!=='ssh_input');await step({cmd:'finish'});await done;assert.equal(exit,0,err);console.log('CONFIRMED H1: actual C request error leaves op OPEN but JS exits SSH and next input is not routed to SSH');return;} assert(recovered,'request failure changed active SSH mode/prompt/recovery');assert.equal(next.type,'ssh_input'); let cs=await step({message:next});assert.equal(cs.writes,afterSignal.writes+1,'next frontend input must execute on original C Shell'); + // J1: real C protection notification must not fabricate local SSH input. + const j1Before=await state(),j1Frames=records.length,j1Identity=cs.identity,j1Writes=cs.writes; + await e.run(`term.inputBuffer='local-buffer';term.cursorPosition=3;`); + const j1Fields=()=>e.run(`JSON.stringify([term.connected,term.sshMode,term.sshConnecting,term.sshDisconnecting,term.restoring,term.inputBuffer,term.cursorPosition])`); + const j1Snapshot=await j1Fields();cs=await step({cmd:'power'}); + const j1After=await state(),j1Display=j1After.lines.slice(j1Before.lines.length); + assert(records.slice(j1Frames).some(r=>r.fd===1&&r.frame?.type==='power_event'),'actual C power frame absent'); + assert.equal(j1Display.length,1);assert(j1Display[0].startsWith('\r\n')); + assert(!j1Display.join('').includes('tianshan>')&&!j1Display.join('').includes('local-buffer')&&!j1Display.join('').includes('\x1b[K')); + assert.equal(await j1Fields(),j1Snapshot);assert.deepEqual(j1After.sent,j1Before.sent); + await e.run(`input('j')`);const j1Request=await e.run('sent.shift()');assert.equal(j1Request.type,'ssh_input'); + cs=await step({message:j1Request});assert.equal(cs.identity,j1Identity);assert.equal(cs.writes,j1Writes+1); + await e.run(`input('\\x1c')`);await sendNext();assert(!(await state()).mode);assert.equal((await step({cmd:'drain'})).channels,0); + assert((await state()).lines.slice(j1Before.lines.length).includes('tianshan> ')); + await e.run(`term.inputBuffer='';term.cursorPosition=0;`);cs=await start();assert((await state()).mode); + console.log('PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup'); for(const message of [{type:'ssh_resize',width:0,height:20},{type:'ssh_resize',width:80.5,height:20}]){await step({message});assert((await state()).mode);} await step({cmd:'resize_reject'});await step({message:{type:'ssh_resize',width:80,height:24}});assert((await state()).mode);await step({cmd:'reset_driver'}); // Another page cannot input, disconnect, signal or resize the current owner. diff --git a/tests/prompts/regression.test.cjs b/tests/prompts/regression.test.cjs index d6bf002..2d9db10 100644 --- a/tests/prompts/regression.test.cjs +++ b/tests/prompts/regression.test.cjs @@ -169,3 +169,40 @@ for(const lang of ['zh-CN','en-US']) { } }); } + +for (const lang of ['zh-CN','en-US']) { + test(`${lang}: J1 power alerts preserve local line, SSH ownership, transition guards and filtering`,async()=>{ + const h=await setup(lang),{run,ctx}=h; + run(`window.j1=new WebTerminal('fixture');window.j1Writes=[];window.j1Sent=[];window.j1Input=null; + j1.terminal={write:s=>j1Writes.push(s),writeln:s=>j1Writes.push(s),onData:f=>j1Input=f}; + j1.ws={readyState:WebSocket.OPEN,send:s=>j1Sent.push(JSON.parse(s))};j1.connected=true; + j1.inputBuffer='abcd';j1.cursorPosition=2;j1.setupInputHandler();`); + const alert={type:'power_event',event:'low_voltage',voltage:10.5}; + const snapshot=()=>run(`JSON.stringify([j1.connected,j1.sshMode,j1.sshConnecting,j1.sshDisconnecting,j1.restoring,j1.inputBuffer,j1.cursorPosition])`); + const deliver=msg=>ctx.j1.handleMessage(msg||alert); + const original=snapshot();deliver();deliver();assert.equal(snapshot(),original);assert.equal(ctx.j1Sent.length,0); + const local=[...ctx.j1Writes];assert.equal(local.length,8); + for(const offset of [0,4]){assert.equal(local[offset],'\r\x1b[K');assert(local[offset+1].includes(ctx.t('terminal.lowVoltageWarning',{voltage:'10.50'})));assert.equal(local[offset+2],'tianshan> abcd');assert.equal(local[offset+3],'\x1b[2D');} + const cases=[{sshMode:true},{sshConnecting:true},{sshMode:true,sshDisconnecting:true},{restoring:true,connected:false},{restoring:true},{connected:false},{socket:3},{socket:null}]; + for(const changes of cases){ + run(`Object.assign(j1,{connected:true,sshMode:false,sshConnecting:false,sshDisconnecting:false,restoring:false});j1.ws={readyState:1,send:s=>j1Sent.push(JSON.parse(s))};j1Writes.length=0;`); + for(const [key,value]of Object.entries(changes)){if(key==='socket'){if(value===null)ctx.j1.ws=null;else ctx.j1.ws.readyState=value;}else ctx.j1[key]=value;} + const before=snapshot();deliver();deliver();assert.equal(snapshot(),before);assert.equal(ctx.j1Sent.length,0); + assert.equal(ctx.j1Writes.length,2);for(const line of ctx.j1Writes){assert(line.startsWith('\r\n'));assert(!line.includes('tianshan>'));assert(!line.includes('abcd'));assert(!line.includes('\x1b[K'));assert(!line.includes('\x1b[2D'));} + if(changes.sshConnecting||changes.sshDisconnecting||changes.connected===false){run('j1Input('+JSON.stringify('x\r')+')');assert.equal(ctx.j1Sent.length,0);} + } + run(`Object.assign(j1,{connected:true,sshMode:true,sshConnecting:false,sshDisconnecting:false,restoring:false});j1.ws={readyState:1,send:s=>j1Sent.push(JSON.parse(s))};j1Writes.length=0;`); + deliver();run(`j1Input('z')`);assert.equal(ctx.j1Sent[0].type,'ssh_input');assert.equal(ctx.j1Sent[0].data,'z'); + run(`j1Input('\x1c')`);assert.equal(ctx.j1Sent[1].type,'ssh_disconnect');assert(ctx.j1.sshMode);assert(!ctx.j1Writes.join('').includes('tianshan>')); + deliver({type:'ssh_status',status:'disconnecting'});deliver();assert(ctx.j1.sshMode);assert(!ctx.j1Writes.join('').includes('tianshan>')); + deliver({type:'ssh_status',status:'closed'});assert(!ctx.j1.sshMode);assert.equal(ctx.j1Writes.filter(x=>x==='tianshan> ').length,1); + ctx.j1Writes.length=0;deliver();assert.equal(ctx.j1Writes[2],'tianshan> abcd');assert.equal(ctx.j1Writes[3],'\x1b[2D');assert.equal(ctx.j1Sent.length,2); + ctx.j1Writes.length=0;deliver({type:'power_event',event:'countdown_tick',countdown:31});assert.equal(ctx.j1Writes.length,0); + for(const event of ['low_voltage','shutdown_start','protected','recovery_start','recovery_complete','debug_tick','state_changed','countdown_tick']){ + ctx.j1Writes.length=0;deliver({type:'power_event',event,countdown:30,voltage:10.5,state:'NORMAL'});assert.equal(ctx.j1Writes.length,4,event); + } + ctx.j1.destroyed=true;ctx.j1.terminal=new Proxy({}, {get(){throw Error('destroyed terminal accessed');}}); + assert.doesNotThrow(()=>ctx.j1.handlePowerEvent(alert));assert.doesNotThrow(()=>deliver()); + ctx.j1.destroyed=false;ctx.j1.terminal=null;assert.doesNotThrow(()=>ctx.j1.handlePowerEvent(alert));assert.equal(ctx.j1Sent.length,2); + }); +} diff --git a/tests/ws_subscriptions/test_project.c b/tests/ws_subscriptions/test_project.c index b7b63f7..3966f69 100644 --- a/tests/ws_subscriptions/test_project.c +++ b/tests/ws_subscriptions/test_project.c @@ -13,6 +13,11 @@ int main(void){ cJSON *j=cJSON_Parse(line);assert(j);const char *cmd=cJSON_GetStringValue(cJSON_GetObjectItem(j,"cmd")); if(cmd && !strcmp(cmd,"finish")){ssh_cleanup();if(shell_task.fn){shell_task.fn(shell_task.arg);shell_task.fn=NULL;}drive_all();cJSON_Delete(j);finish_all();assert(!driver_channels&&!driver_sessions&&!driver_sockets);puts("{\"finished\":true}");return 0;} if(cmd && !strcmp(cmd,"eof")){driver_eof=true;shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} + else if(cmd && !strcmp(cmd,"power")){ + ts_power_policy_status_t status={.state=TS_POWER_POLICY_STATE_LOW_VOLTAGE,.current_voltage=10.5f,.countdown_remaining_sec=30}; + ts_event_t event={.id=TS_POWER_POLICY_EVENT_LOW_VOLTAGE,.data=&status}; + power_policy_event_handler(&event,NULL);drive_all(); + } else if(cmd && !strcmp(cmd,"output")){ssh_shell_context_t *ctx=shell_task.arg;ssh_send_output(ctx,"stream",6);} else if(cmd && !strcmp(cmd,"error_close")){barrier_name="request_error_encode";barrier_action=close_during_error;} else if(cmd && !strcmp(cmd,"write_again"))driver_write_again=true; @@ -34,7 +39,7 @@ int main(void){ } if(shell_task.fn && (((ssh_shell_context_t*)shell_task.arg)->disconnect_requested || !ts_ws_op_is_open(((ssh_shell_context_t*)shell_task.arg)->op))){shell_task.fn(shell_task.arg);shell_task.fn=NULL;drive_all();} ts_ws_op_stats_t st;ts_ws_op_stats(TS_WS_OP_SHELL,&st); - printf("{\"state\":%d,\"writes\":%d,\"live\":%u,\"channels\":%d,\"refs\":%u,\"preparing\":%u,\"unsettled\":%u}\n",st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j); + printf("{\"identity\":%u,\"state\":%d,\"writes\":%d,\"live\":%u,\"channels\":%d,\"refs\":%u,\"preparing\":%u,\"unsettled\":%u}\n",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j); } return 2; } diff --git a/tests/ws_subscriptions/verify_project_assets.py b/tests/ws_subscriptions/verify_project_assets.py index 20e4116..bbcda8b 100644 --- a/tests/ws_subscriptions/verify_project_assets.py +++ b/tests/ws_subscriptions/verify_project_assets.py @@ -1,15 +1,16 @@ #!/usr/bin/env python3 """Verify final optimized/gzip files and reproduce SPIFFS with the fixed SDK.""" -import gzip,hashlib,json,os,pathlib,subprocess,tempfile +import gzip,hashlib,json,os,pathlib,re,subprocess,tempfile root=pathlib.Path(__file__).resolve().parents[2] -build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));web=build/'esp-idf/ts_webui/web_optimized';src=root/'components/ts_webui/web';doc=root/'docs/repair/ws-project-v3' +build=pathlib.Path(os.environ.get('V3_BUILD','/tmp/tianshan-project-v3-build/build'));web=build/'esp-idf/ts_webui/web_optimized';src=root/'components/ts_webui/web';doc=pathlib.Path(os.environ.get('V3_RESULTS',str(root/'docs/repair/ws-project-v3'))) sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest() result={} for rel in ['index.html','js/terminal.js','js/lang/zh-CN.js','js/lang/en-US.js']: p=web/rel;gz=p.with_suffix(p.suffix+'.gz');assert gzip.decompress(gz.read_bytes())==p.read_bytes() if rel.endswith('.js'):subprocess.run(['node','--check',str(p)],check=True) result[rel]={'source_sha256':sha(src/rel),'optimized_sha256':sha(p),'gzip_sha256':sha(gz),'optimized_bytes':p.stat().st_size} -assert '20260926-shell-contract' in (web/'index.html').read_text() +asset_version=re.search(r"TS_ASSET_VERSION = '([^']+)'",(src/'index.html').read_text()).group(1) +assert asset_version in (web/'index.html').read_text() assert 'sshControlUnsupported' in (web/'js/terminal.js').read_text() with tempfile.TemporaryDirectory(prefix='ts-v3-spiffs-') as d: image=pathlib.Path(d)/'www.bin' From 3a19128d8638771c958fe47df1d6a7d339a10a4c Mon Sep 17 00:00:00 2001 From: Alfred Date: Mon, 28 Sep 2026 16:48:24 +0800 Subject: [PATCH 8/9] fix: bundle terminal dependencies for offline device access --- components/ts_webui/web/index.html | 18 +- components/ts_webui/web/js/terminal.js | 10 +- .../ts_webui/web/vendor/xterm/LICENSE-fit | 19 + .../ts_webui/web/vendor/xterm/LICENSE-xterm | 21 + .../ts_webui/web/vendor/xterm/fit.min.js | 8 + .../ts_webui/web/vendor/xterm/xterm.css | 209 ++ .../ts_webui/web/vendor/xterm/xterm.min.js | 8 + docs/repair/xterm-local/README.md | 58 + docs/repair/xterm-local/assets-check.txt | 51 + docs/repair/xterm-local/assets.json | 41 + docs/repair/xterm-local/baseline.txt | 4 + docs/repair/xterm-local/browser.txt | 56 + docs/repair/xterm-local/build-assets.json | 51 + docs/repair/xterm-local/build-inputs.json | 821 ++++++++ docs/repair/xterm-local/build.log | 1676 +++++++++++++++++ docs/repair/xterm-local/changes.patch | 149 ++ docs/repair/xterm-local/cross-en.json | 869 +++++++++ docs/repair/xterm-local/cross-en.txt | 2 + docs/repair/xterm-local/cross-zh.json | 869 +++++++++ docs/repair/xterm-local/cross-zh.txt | 2 + docs/repair/xterm-local/flasher_args.json | 28 + .../initial-build-path-failure.log | 1079 +++++++++++ docs/repair/xterm-local/j1.txt | 10 + docs/repair/xterm-local/node.txt | 53 + docs/repair/xterm-local/offline-optimized.txt | 10 + docs/repair/xterm-local/offline-source.txt | 16 + .../xterm-local/optimized/requests-en-US.json | 71 + .../xterm-local/optimized/requests-zh-CN.json | 71 + docs/repair/xterm-local/path-limit.txt | 10 + .../xterm-local/project-assets-check.txt | 1 + docs/repair/xterm-local/publication-gate.md | 9 + docs/repair/xterm-local/release-static.txt | 5 + docs/repair/xterm-local/requests-en-US.json | 71 + docs/repair/xterm-local/requests-zh-CN.json | 71 + docs/repair/xterm-local/runtime-search.txt | 2 + docs/repair/xterm-local/vendor-test.txt | 10 + docs/repair/xterm-local/vendor.json | 52 + tests/prompts/browser.test.cjs | 15 +- tests/prompts/package.json | 3 +- tests/prompts/xterm-offline.test.cjs | 52 + tests/prompts/xterm-vendor.test.cjs | 35 + tests/ws_subscriptions/verify_xterm_assets.py | 27 + tools/minify_web.py | 6 + 43 files changed, 6625 insertions(+), 24 deletions(-) create mode 100644 components/ts_webui/web/vendor/xterm/LICENSE-fit create mode 100644 components/ts_webui/web/vendor/xterm/LICENSE-xterm create mode 100644 components/ts_webui/web/vendor/xterm/fit.min.js create mode 100644 components/ts_webui/web/vendor/xterm/xterm.css create mode 100644 components/ts_webui/web/vendor/xterm/xterm.min.js create mode 100644 docs/repair/xterm-local/README.md create mode 100644 docs/repair/xterm-local/assets-check.txt create mode 100644 docs/repair/xterm-local/assets.json create mode 100644 docs/repair/xterm-local/baseline.txt create mode 100644 docs/repair/xterm-local/browser.txt create mode 100644 docs/repair/xterm-local/build-assets.json create mode 100644 docs/repair/xterm-local/build-inputs.json create mode 100644 docs/repair/xterm-local/build.log create mode 100644 docs/repair/xterm-local/changes.patch create mode 100644 docs/repair/xterm-local/cross-en.json create mode 100644 docs/repair/xterm-local/cross-en.txt create mode 100644 docs/repair/xterm-local/cross-zh.json create mode 100644 docs/repair/xterm-local/cross-zh.txt create mode 100644 docs/repair/xterm-local/flasher_args.json create mode 100644 docs/repair/xterm-local/initial-build-path-failure.log create mode 100644 docs/repair/xterm-local/j1.txt create mode 100644 docs/repair/xterm-local/node.txt create mode 100644 docs/repair/xterm-local/offline-optimized.txt create mode 100644 docs/repair/xterm-local/offline-source.txt create mode 100644 docs/repair/xterm-local/optimized/requests-en-US.json create mode 100644 docs/repair/xterm-local/optimized/requests-zh-CN.json create mode 100644 docs/repair/xterm-local/path-limit.txt create mode 100644 docs/repair/xterm-local/project-assets-check.txt create mode 100644 docs/repair/xterm-local/publication-gate.md create mode 100644 docs/repair/xterm-local/release-static.txt create mode 100644 docs/repair/xterm-local/requests-en-US.json create mode 100644 docs/repair/xterm-local/requests-zh-CN.json create mode 100644 docs/repair/xterm-local/runtime-search.txt create mode 100644 docs/repair/xterm-local/vendor-test.txt create mode 100644 docs/repair/xterm-local/vendor.json create mode 100644 tests/prompts/xterm-offline.test.cjs create mode 100644 tests/prompts/xterm-vendor.test.cjs create mode 100644 tests/ws_subscriptions/verify_xterm_assets.py diff --git a/components/ts_webui/web/index.html b/components/ts_webui/web/index.html index 59265c7..eea293c 100644 --- a/components/ts_webui/web/index.html +++ b/components/ts_webui/web/index.html @@ -41,9 +41,9 @@ .modal-content{background:var(--bg-card);border-radius:var(--radius-lg);max-width:600px;width:95%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg)} - - - + + + @@ -247,7 +247,7 @@

    电压保护设置

    - - - - - + + + + + diff --git a/components/ts_webui/web/js/terminal.js b/components/ts_webui/web/js/terminal.js index 8fb1240..b1783eb 100644 --- a/components/ts_webui/web/js/terminal.js +++ b/components/ts_webui/web/js/terminal.js @@ -4,7 +4,7 @@ */ /** - * 按需加载 xterm.js 及其插件(从 CDN) + * 按需加载 xterm.js 及其插件(设备本地资源) * 仅在首次打开终端页面时触发,后续调用直接返回 */ const _xtermReady = (function() { @@ -30,9 +30,9 @@ const _xtermReady = (function() { } return function ensureXtermLoaded() { if (_promise) return _promise; - _promise = loadResource('https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css', true) - .then(() => loadResource('https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.min.js', false)) - .then(() => loadResource('https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.min.js', false)) + _promise = loadResource('/vendor/xterm/xterm.css?v=' + encodeURIComponent(window.TS_ASSET_VERSION), true) + .then(() => loadResource('/vendor/xterm/xterm.min.js?v=' + encodeURIComponent(window.TS_ASSET_VERSION), false)) + .then(() => loadResource('/vendor/xterm/fit.min.js?v=' + encodeURIComponent(window.TS_ASSET_VERSION), false)) .catch(error => { _promise = null; throw error; }); return _promise; }; @@ -70,7 +70,7 @@ class WebTerminal { return false; } - // 按需加载 xterm.js(首次访问终端页面时从 CDN 拉取) + // 按需加载 xterm.js(首次访问终端页面时从设备加载) try { await _xtermReady(); } catch (error) { if (this.destroyed) return false; diff --git a/components/ts_webui/web/vendor/xterm/LICENSE-fit b/components/ts_webui/web/vendor/xterm/LICENSE-fit new file mode 100644 index 0000000..8f17892 --- /dev/null +++ b/components/ts_webui/web/vendor/xterm/LICENSE-fit @@ -0,0 +1,19 @@ +Copyright (c) 2019, The xterm.js authors (https://github.com/xtermjs/xterm.js) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/components/ts_webui/web/vendor/xterm/LICENSE-xterm b/components/ts_webui/web/vendor/xterm/LICENSE-xterm new file mode 100644 index 0000000..4472336 --- /dev/null +++ b/components/ts_webui/web/vendor/xterm/LICENSE-xterm @@ -0,0 +1,21 @@ +Copyright (c) 2017-2019, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com) +Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/components/ts_webui/web/vendor/xterm/fit.min.js b/components/ts_webui/web/vendor/xterm/fit.min.js new file mode 100644 index 0000000..7384f10 --- /dev/null +++ b/components/ts_webui/web/vendor/xterm/fit.min.js @@ -0,0 +1,8 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FitAddon=t():e.FitAddon=t()}(self,(()=>(()=>{"use strict";var e={};return(()=>{var t=e;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal)return;if(!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,t=e._renderService.dimensions;if(0===t.css.cell.width||0===t.css.cell.height)return;const r=0===this._terminal.options.scrollback?0:e.viewport.scrollBarWidth,i=window.getComputedStyle(this._terminal.element.parentElement),o=parseInt(i.getPropertyValue("height")),s=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),l=o-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),a=s-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-r;return{cols:Math.max(2,Math.floor(a/t.css.cell.width)),rows:Math.max(1,Math.floor(l/t.css.cell.height))}}}})(),e})())); +//# sourceMappingURL=xterm-addon-fit.js.map \ No newline at end of file diff --git a/components/ts_webui/web/vendor/xterm/xterm.css b/components/ts_webui/web/vendor/xterm/xterm.css new file mode 100644 index 0000000..74acc26 --- /dev/null +++ b/components/ts_webui/web/vendor/xterm/xterm.css @@ -0,0 +1,209 @@ +/** + * Copyright (c) 2014 The xterm.js authors. All rights reserved. + * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) + * https://github.com/chjj/term.js + * @license MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * Originally forked from (with the author's permission): + * Fabrice Bellard's javascript vt100 for jslinux: + * http://bellard.org/jslinux/ + * Copyright (c) 2011 Fabrice Bellard + * The original design remains. The terminal itself + * has been extended to include xterm CSI codes, among + * other features. + */ + +/** + * Default styles for xterm.js + */ + +.xterm { + cursor: text; + position: relative; + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; +} + +.xterm.focus, +.xterm:focus { + outline: none; +} + +.xterm .xterm-helpers { + position: absolute; + top: 0; + /** + * The z-index of the helpers must be higher than the canvases in order for + * IMEs to appear on top. + */ + z-index: 5; +} + +.xterm .xterm-helper-textarea { + padding: 0; + border: 0; + margin: 0; + /* Move textarea out of the screen to the far left, so that the cursor is not visible */ + position: absolute; + opacity: 0; + left: -9999em; + top: 0; + width: 0; + height: 0; + z-index: -5; + /** Prevent wrapping so the IME appears against the textarea at the correct position */ + white-space: nowrap; + overflow: hidden; + resize: none; +} + +.xterm .composition-view { + /* TODO: Composition position got messed up somewhere */ + background: #000; + color: #FFF; + display: none; + position: absolute; + white-space: nowrap; + z-index: 1; +} + +.xterm .composition-view.active { + display: block; +} + +.xterm .xterm-viewport { + /* On OS X this is required in order for the scroll bar to appear fully opaque */ + background-color: #000; + overflow-y: scroll; + cursor: default; + position: absolute; + right: 0; + left: 0; + top: 0; + bottom: 0; +} + +.xterm .xterm-screen { + position: relative; +} + +.xterm .xterm-screen canvas { + position: absolute; + left: 0; + top: 0; +} + +.xterm .xterm-scroll-area { + visibility: hidden; +} + +.xterm-char-measure-element { + display: inline-block; + visibility: hidden; + position: absolute; + top: 0; + left: -9999em; + line-height: normal; +} + +.xterm.enable-mouse-events { + /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */ + cursor: default; +} + +.xterm.xterm-cursor-pointer, +.xterm .xterm-cursor-pointer { + cursor: pointer; +} + +.xterm.column-select.focus { + /* Column selection mode */ + cursor: crosshair; +} + +.xterm .xterm-accessibility, +.xterm .xterm-message { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 10; + color: transparent; + pointer-events: none; +} + +.xterm .live-region { + position: absolute; + left: -9999px; + width: 1px; + height: 1px; + overflow: hidden; +} + +.xterm-dim { + /* Dim should not apply to background, so the opacity of the foreground color is applied + * explicitly in the generated class and reset to 1 here */ + opacity: 1 !important; +} + +.xterm-underline-1 { text-decoration: underline; } +.xterm-underline-2 { text-decoration: double underline; } +.xterm-underline-3 { text-decoration: wavy underline; } +.xterm-underline-4 { text-decoration: dotted underline; } +.xterm-underline-5 { text-decoration: dashed underline; } + +.xterm-overline { + text-decoration: overline; +} + +.xterm-overline.xterm-underline-1 { text-decoration: overline underline; } +.xterm-overline.xterm-underline-2 { text-decoration: overline double underline; } +.xterm-overline.xterm-underline-3 { text-decoration: overline wavy underline; } +.xterm-overline.xterm-underline-4 { text-decoration: overline dotted underline; } +.xterm-overline.xterm-underline-5 { text-decoration: overline dashed underline; } + +.xterm-strikethrough { + text-decoration: line-through; +} + +.xterm-screen .xterm-decoration-container .xterm-decoration { + z-index: 6; + position: absolute; +} + +.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer { + z-index: 7; +} + +.xterm-decoration-overview-ruler { + z-index: 8; + position: absolute; + top: 0; + right: 0; + pointer-events: none; +} + +.xterm-decoration-top { + z-index: 2; + position: relative; +} diff --git a/components/ts_webui/web/vendor/xterm/xterm.min.js b/components/ts_webui/web/vendor/xterm/xterm.min.js new file mode 100644 index 0000000..d7bd63f --- /dev/null +++ b/components/ts_webui/web/vendor/xterm/xterm.min.js @@ -0,0 +1,8 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/xterm@5.3.0/lib/xterm.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var s in i)("object"==typeof exports?exports:e)[s]=i[s]}}(self,(()=>(()=>{"use strict";var e={4567:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AccessibilityManager=void 0;const n=i(9042),o=i(6114),a=i(9924),h=i(844),c=i(5596),l=i(4725),d=i(3656);let _=t.AccessibilityManager=class extends h.Disposable{constructor(e,t){super(),this._terminal=e,this._renderService=t,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce="",this._accessibilityContainer=document.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=document.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let e=0;ethis._handleBoundaryFocus(e,0),this._bottomBoundaryFocusListener=e=>this._handleBoundaryFocus(e,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions(),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=document.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new a.TimeBasedDebouncer(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this.register(this._terminal.onResize((e=>this._handleResize(e.rows)))),this.register(this._terminal.onRender((e=>this._refreshRows(e.start,e.end)))),this.register(this._terminal.onScroll((()=>this._refreshRows()))),this.register(this._terminal.onA11yChar((e=>this._handleChar(e)))),this.register(this._terminal.onLineFeed((()=>this._handleChar("\n")))),this.register(this._terminal.onA11yTab((e=>this._handleTab(e)))),this.register(this._terminal.onKey((e=>this._handleKey(e.key)))),this.register(this._terminal.onBlur((()=>this._clearLiveRegion()))),this.register(this._renderService.onDimensionsChange((()=>this._refreshRowsDimensions()))),this._screenDprMonitor=new c.ScreenDprMonitor(window),this.register(this._screenDprMonitor),this._screenDprMonitor.setListener((()=>this._refreshRowsDimensions())),this.register((0,d.addDisposableDomListener)(window,"resize",(()=>this._refreshRowsDimensions()))),this._refreshRows(),this.register((0,h.toDisposable)((()=>{this._accessibilityContainer.remove(),this._rowElements.length=0})))}_handleTab(e){for(let t=0;t0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,"\n"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=n.tooMuchOutput)),o.isMac&&this._liveRegion.textContent&&this._liveRegion.textContent.length>0&&!this._liveRegion.parentNode&&setTimeout((()=>{this._accessibilityContainer.appendChild(this._liveRegion)}),0))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0,o.isMac&&this._liveRegion.remove()}_handleKey(e){this._clearLiveRegion(),/\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){const i=this._terminal.buffer,s=i.lines.length.toString();for(let r=e;r<=t;r++){const e=i.translateBufferLineToString(i.ydisp+r,!0),t=(i.ydisp+r+1).toString(),n=this._rowElements[r];n&&(0===e.length?n.innerText=" ":n.textContent=e,n.setAttribute("aria-posinset",t),n.setAttribute("aria-setsize",s))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){const i=e.target,s=this._rowElements[0===t?1:this._rowElements.length-2];if(i.getAttribute("aria-posinset")===(0===t?"1":`${this._terminal.buffer.lines.length}`))return;if(e.relatedTarget!==s)return;let r,n;if(0===t?(r=i,n=this._rowElements.pop(),this._rowContainer.removeChild(n)):(r=this._rowElements.shift(),n=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),n.removeEventListener("focus",this._bottomBoundaryFocusListener),0===t){const e=this._createAccessibilityTreeNode();this._rowElements.unshift(e),this._rowContainer.insertAdjacentElement("afterbegin",e)}else{const e=this._createAccessibilityTreeNode();this._rowElements.push(e),this._rowContainer.appendChild(e)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(0===t?-1:1),this._rowElements[0===t?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let e=this._rowContainer.children.length;ee;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const e=document.createElement("div");return e.setAttribute("role","listitem"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){this._accessibilityContainer.style.width=`${this._renderService.dimensions.css.canvas.width}px`,this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e{function i(e){return e.replace(/\r?\n/g,"\r")}function s(e,t){return t?"[200~"+e+"[201~":e}function r(e,t,r,n){e=s(e=i(e),r.decPrivateModes.bracketedPasteMode&&!0!==n.rawOptions.ignoreBracketedPasteMode),r.triggerDataEvent(e,!0),t.value=""}function n(e,t,i){const s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex="1000",t.focus()}Object.defineProperty(t,"__esModule",{value:!0}),t.rightClickHandler=t.moveTextAreaUnderMouseCursor=t.paste=t.handlePasteEvent=t.copyHandler=t.bracketTextForPaste=t.prepareTextForTerminal=void 0,t.prepareTextForTerminal=i,t.bracketTextForPaste=s,t.copyHandler=function(e,t){e.clipboardData&&e.clipboardData.setData("text/plain",t.selectionText),e.preventDefault()},t.handlePasteEvent=function(e,t,i,s){e.stopPropagation(),e.clipboardData&&r(e.clipboardData.getData("text/plain"),t,i,s)},t.paste=r,t.moveTextAreaUnderMouseCursor=n,t.rightClickHandler=function(e,t,i,s,r){n(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}},7239:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorContrastCache=void 0;const s=i(1505);t.ColorContrastCache=class{constructor(){this._color=new s.TwoKeyMap,this._css=new s.TwoKeyMap}setCss(e,t,i){this._css.set(e,t,i)}getCss(e,t){return this._css.get(e,t)}setColor(e,t,i){this._color.set(e,t,i)}getColor(e,t){return this._color.get(e,t)}clear(){this._color.clear(),this._css.clear()}}},3656:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},6465:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier2=void 0;const n=i(3656),o=i(8460),a=i(844),h=i(2585);let c=t.Linkifier2=class extends a.Disposable{get currentLink(){return this._currentLink}constructor(e){super(),this._bufferService=e,this._linkProviders=[],this._linkCacheDisposables=[],this._isMouseOut=!0,this._wasResized=!1,this._activeLine=-1,this._onShowLinkUnderline=this.register(new o.EventEmitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this.register(new o.EventEmitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this.register((0,a.getDisposeArrayDisposable)(this._linkCacheDisposables)),this.register((0,a.toDisposable)((()=>{this._lastMouseEvent=void 0}))),this.register(this._bufferService.onResize((()=>{this._clearCurrentLink(),this._wasResized=!0})))}registerLinkProvider(e){return this._linkProviders.push(e),{dispose:()=>{const t=this._linkProviders.indexOf(e);-1!==t&&this._linkProviders.splice(t,1)}}}attachToDom(e,t,i){this._element=e,this._mouseService=t,this._renderService=i,this.register((0,n.addDisposableDomListener)(this._element,"mouseleave",(()=>{this._isMouseOut=!0,this._clearCurrentLink()}))),this.register((0,n.addDisposableDomListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){if(this._lastMouseEvent=e,!this._element||!this._mouseService)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(!t)return;this._isMouseOut=!1;const i=e.composedPath();for(let e=0;e{null==e||e.forEach((e=>{e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);let r=!1;for(const[i,n]of this._linkProviders.entries())t?(null===(s=this._activeProviderReplies)||void 0===s?void 0:s.get(i))&&(r=this._checkLinkProviderResult(i,e,r)):n.provideLinks(e.y,(t=>{var s,n;if(this._isMouseOut)return;const o=null==t?void 0:t.map((e=>({link:e})));null===(s=this._activeProviderReplies)||void 0===s||s.set(i,o),r=this._checkLinkProviderResult(i,e,r),(null===(n=this._activeProviderReplies)||void 0===n?void 0:n.size)===this._linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)}))}_removeIntersectingLinks(e,t){const i=new Set;for(let s=0;se?this._bufferService.cols:s.link.range.end.x;for(let e=n;e<=o;e++){if(i.has(e)){r.splice(t--,1);break}i.add(e)}}}}_checkLinkProviderResult(e,t,i){var s;if(!this._activeProviderReplies)return i;const r=this._activeProviderReplies.get(e);let n=!1;for(let t=0;tthis._linkAtPosition(e.link,t)));e&&(i=!0,this._handleNewLink(e))}if(this._activeProviderReplies.size===this._linkProviders.length&&!i)for(let e=0;ethis._linkAtPosition(e.link,t)));if(r){i=!0,this._handleNewLink(r);break}}return i}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._element||!this._mouseService||!this._currentLink)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);t&&this._mouseDownLink===this._currentLink&&this._linkAtPosition(this._currentLink.link,t)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,t){this._element&&this._currentLink&&this._lastMouseEvent&&(!e||!t||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=t)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,a.disposeArray)(this._linkCacheDisposables))}_handleNewLink(e){if(!this._element||!this._lastMouseEvent||!this._mouseService)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:void 0===e.link.decorations||e.link.decorations.underline,pointerCursor:void 0===e.link.decorations||e.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,e.link,this._lastMouseEvent),e.link.decorations={},Object.defineProperties(e.link.decorations,{pointerCursor:{get:()=>{var e,t;return null===(t=null===(e=this._currentLink)||void 0===e?void 0:e.state)||void 0===t?void 0:t.decorations.pointerCursor},set:e=>{var t,i;(null===(t=this._currentLink)||void 0===t?void 0:t.state)&&this._currentLink.state.decorations.pointerCursor!==e&&(this._currentLink.state.decorations.pointerCursor=e,this._currentLink.state.isHovered&&(null===(i=this._element)||void 0===i||i.classList.toggle("xterm-cursor-pointer",e)))}},underline:{get:()=>{var e,t;return null===(t=null===(e=this._currentLink)||void 0===e?void 0:e.state)||void 0===t?void 0:t.decorations.underline},set:t=>{var i,s,r;(null===(i=this._currentLink)||void 0===i?void 0:i.state)&&(null===(r=null===(s=this._currentLink)||void 0===s?void 0:s.state)||void 0===r?void 0:r.decorations.underline)!==t&&(this._currentLink.state.decorations.underline=t,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,t))}}}),this._renderService&&this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange((e=>{if(!this._currentLink)return;const t=0===e.start?0:e.start+1+this._bufferService.buffer.ydisp,i=this._bufferService.buffer.ydisp+1+e.end;if(this._currentLink.link.range.start.y>=t&&this._currentLink.link.range.end.y<=i&&(this._clearCurrentLink(t,i),this._lastMouseEvent&&this._element)){const e=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);e&&this._askForLink(e,!1)}}))))}_linkHover(e,t,i){var s;(null===(s=this._currentLink)||void 0===s?void 0:s.state)&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add("xterm-cursor-pointer")),t.hover&&t.hover(i,t.text)}_fireUnderlineEvent(e,t){const i=e.range,s=this._bufferService.buffer.ydisp,r=this._createLinkUnderlineEvent(i.start.x-1,i.start.y-s-1,i.end.x,i.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(r)}_linkLeave(e,t,i){var s;(null===(s=this._currentLink)||void 0===s?void 0:s.state)&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove("xterm-cursor-pointer")),t.leave&&t.leave(i,t.text)}_linkAtPosition(e,t){const i=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,r=t.y*this._bufferService.cols+t.x;return i<=r&&r<=s}_positionFromMouseEvent(e,t,i){const s=i.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(s)return{x:s[0],y:s[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,i,s,r){return{x1:e,y1:t,x2:i,y2:s,cols:this._bufferService.cols,fg:r}}};t.Linkifier2=c=s([r(0,h.IBufferService)],c)},9042:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0,t.promptLabel="Terminal input",t.tooMuchOutput="Too much output to announce, navigate to rows manually to read"},3730:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const n=i(511),o=i(2585);let a=t.OscLinkProvider=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){var i;const s=this._bufferService.buffer.lines.get(e-1);if(!s)return void t(void 0);const r=[],o=this._optionsService.rawOptions.linkHandler,a=new n.CellData,c=s.getTrimmedLength();let l=-1,d=-1,_=!1;for(let t=0;to?o.activate(e,t,i):h(0,t),hover:(e,t)=>{var s;return null===(s=null==o?void 0:o.hover)||void 0===s?void 0:s.call(o,e,t,i)},leave:(e,t)=>{var s;return null===(s=null==o?void 0:o.leave)||void 0===s?void 0:s.call(o,e,t,i)}})}_=!1,a.hasExtendedAttrs()&&a.extended.urlId?(d=t,l=a.extended.urlId):(d=-1,l=-1)}}t(r)}};function h(e,t){if(confirm(`Do you want to navigate to ${t}?\n\nWARNING: This link could potentially be dangerous`)){const e=window.open();if(e){try{e.opener=null}catch(e){}e.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}t.OscLinkProvider=a=s([r(0,o.IBufferService),r(1,o.IOptionsService),r(2,o.IOscLinkService)],a)},6193:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderDebouncer=void 0,t.RenderDebouncer=class{constructor(e,t){this._parentWindow=e,this._renderCallback=t,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._parentWindow.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(e){return this._refreshCallbacks.push(e),this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame((()=>this._innerRefresh()))),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t,this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._animationFrame=void 0,void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return void this._runRefreshCallbacks();const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(const e of this._refreshCallbacks)e(0);this._refreshCallbacks=[]}}},5596:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ScreenDprMonitor=void 0;const s=i(844);class r extends s.Disposable{constructor(e){super(),this._parentWindow=e,this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this.register((0,s.toDisposable)((()=>{this.clearListener()})))}setListener(e){this._listener&&this.clearListener(),this._listener=e,this._outerListener=()=>{this._listener&&(this._listener(this._parentWindow.devicePixelRatio,this._currentDevicePixelRatio),this._updateDpr())},this._updateDpr()}_updateDpr(){var e;this._outerListener&&(null===(e=this._resolutionMediaMatchList)||void 0===e||e.removeListener(this._outerListener),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._resolutionMediaMatchList=this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`),this._resolutionMediaMatchList.addListener(this._outerListener))}clearListener(){this._resolutionMediaMatchList&&this._listener&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._listener=void 0,this._outerListener=void 0)}}t.ScreenDprMonitor=r},3236:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Terminal=void 0;const s=i(3614),r=i(3656),n=i(6465),o=i(9042),a=i(3730),h=i(1680),c=i(3107),l=i(5744),d=i(2950),_=i(1296),u=i(428),f=i(4269),v=i(5114),p=i(8934),g=i(3230),m=i(9312),S=i(4725),C=i(6731),b=i(8055),y=i(8969),w=i(8460),E=i(844),k=i(6114),L=i(8437),D=i(2584),R=i(7399),x=i(5941),A=i(9074),B=i(2585),T=i(5435),M=i(4567),O="undefined"!=typeof window?window.document:null;class P extends y.CoreTerminal{get onFocus(){return this._onFocus.event}get onBlur(){return this._onBlur.event}get onA11yChar(){return this._onA11yCharEmitter.event}get onA11yTab(){return this._onA11yTabEmitter.event}get onWillOpen(){return this._onWillOpen.event}constructor(e={}){super(e),this.browser=k,this._keyDownHandled=!1,this._keyDownSeen=!1,this._keyPressHandled=!1,this._unprocessedDeadKey=!1,this._accessibilityManager=this.register(new E.MutableDisposable),this._onCursorMove=this.register(new w.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new w.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new w.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new w.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new w.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new w.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new w.EventEmitter),this._onBlur=this.register(new w.EventEmitter),this._onA11yCharEmitter=this.register(new w.EventEmitter),this._onA11yTabEmitter=this.register(new w.EventEmitter),this._onWillOpen=this.register(new w.EventEmitter),this._setup(),this.linkifier2=this.register(this._instantiationService.createInstance(n.Linkifier2)),this.linkifier2.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)),this._decorationService=this._instantiationService.createInstance(A.DecorationService),this._instantiationService.setService(B.IDecorationService,this._decorationService),this.register(this._inputHandler.onRequestBell((()=>this._onBell.fire()))),this.register(this._inputHandler.onRequestRefreshRows(((e,t)=>this.refresh(e,t)))),this.register(this._inputHandler.onRequestSendFocus((()=>this._reportFocus()))),this.register(this._inputHandler.onRequestReset((()=>this.reset()))),this.register(this._inputHandler.onRequestWindowsOptionsReport((e=>this._reportWindowsOptions(e)))),this.register(this._inputHandler.onColor((e=>this._handleColorEvent(e)))),this.register((0,w.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,w.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,w.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,w.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize((e=>this._afterResize(e.cols,e.rows)))),this.register((0,E.toDisposable)((()=>{var e,t;this._customKeyEventHandler=void 0,null===(t=null===(e=this.element)||void 0===e?void 0:e.parentNode)||void 0===t||t.removeChild(this.element)})))}_handleColorEvent(e){if(this._themeService)for(const t of e){let e,i="";switch(t.index){case 256:e="foreground",i="10";break;case 257:e="background",i="11";break;case 258:e="cursor",i="12";break;default:e="ansi",i="4;"+t.index}switch(t.type){case 0:const s=b.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`${D.C0.ESC}]${i};${(0,x.toRgbString)(s)}${D.C1_ESCAPED.ST}`);break;case 1:if("ansi"===e)this._themeService.modifyColors((e=>e.ansi[t.index]=b.rgba.toColor(...t.color)));else{const i=e;this._themeService.modifyColors((e=>e[i]=b.rgba.toColor(...t.color)))}break;case 2:this._themeService.restoreColor(t.index)}}}_setup(){super._setup(),this._customKeyEventHandler=void 0}get buffer(){return this.buffers.active}focus(){this.textarea&&this.textarea.focus({preventScroll:!0})}_handleScreenReaderModeOptionChange(e){e?!this._accessibilityManager.value&&this._renderService&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[I"),this.updateCursorStyle(e),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){var e;return null===(e=this.textarea)||void 0===e?void 0:e.blur()}_handleTextAreaBlur(){this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[O"),this.element.classList.remove("focus"),this._onBlur.fire()}_syncTextArea(){if(!this.textarea||!this.buffer.isCursorInViewport||this._compositionHelper.isComposing||!this._renderService)return;const e=this.buffer.ybase+this.buffer.y,t=this.buffer.lines.get(e);if(!t)return;const i=Math.min(this.buffer.x,this.cols-1),s=this._renderService.dimensions.css.cell.height,r=t.getWidth(i),n=this._renderService.dimensions.css.cell.width*r,o=this.buffer.y*this._renderService.dimensions.css.cell.height,a=i*this._renderService.dimensions.css.cell.width;this.textarea.style.left=a+"px",this.textarea.style.top=o+"px",this.textarea.style.width=n+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this.register((0,r.addDisposableDomListener)(this.element,"copy",(e=>{this.hasSelection()&&(0,s.copyHandler)(e,this._selectionService)})));const e=e=>(0,s.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this.register((0,r.addDisposableDomListener)(this.textarea,"paste",e)),this.register((0,r.addDisposableDomListener)(this.element,"paste",e)),k.isFirefox?this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>{2===e.button&&(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))):this.register((0,r.addDisposableDomListener)(this.element,"contextmenu",(e=>{(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))),k.isLinux&&this.register((0,r.addDisposableDomListener)(this.element,"auxclick",(e=>{1===e.button&&(0,s.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)})))}_bindKeys(){this.register((0,r.addDisposableDomListener)(this.textarea,"keyup",(e=>this._keyUp(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keydown",(e=>this._keyDown(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keypress",(e=>this._keyPress(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionstart",(()=>this._compositionHelper.compositionstart()))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionupdate",(e=>this._compositionHelper.compositionupdate(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionend",(()=>this._compositionHelper.compositionend()))),this.register((0,r.addDisposableDomListener)(this.textarea,"input",(e=>this._inputEvent(e)),!0)),this.register(this.onRender((()=>this._compositionHelper.updateCompositionElements())))}open(e){var t;if(!e)throw new Error("Terminal requires a parent element.");e.isConnected||this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"),this._document=e.ownerDocument,this.element=this._document.createElement("div"),this.element.dir="ltr",this.element.classList.add("terminal"),this.element.classList.add("xterm"),e.appendChild(this.element);const i=O.createDocumentFragment();this._viewportElement=O.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),i.appendChild(this._viewportElement),this._viewportScrollArea=O.createElement("div"),this._viewportScrollArea.classList.add("xterm-scroll-area"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=O.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._helperContainer=O.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),i.appendChild(this.screenElement),this.textarea=O.createElement("textarea"),this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",o.promptLabel),k.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._coreBrowserService=this._instantiationService.createInstance(v.CoreBrowserService,this.textarea,null!==(t=this._document.defaultView)&&void 0!==t?t:window),this._instantiationService.setService(S.ICoreBrowserService,this._coreBrowserService),this.register((0,r.addDisposableDomListener)(this.textarea,"focus",(e=>this._handleTextAreaFocus(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"blur",(()=>this._handleTextAreaBlur()))),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(u.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(S.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(C.ThemeService),this._instantiationService.setService(S.IThemeService,this._themeService),this._characterJoinerService=this._instantiationService.createInstance(f.CharacterJoinerService),this._instantiationService.setService(S.ICharacterJoinerService,this._characterJoinerService),this._renderService=this.register(this._instantiationService.createInstance(g.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(S.IRenderService,this._renderService),this.register(this._renderService.onRenderedViewportChange((e=>this._onRender.fire(e)))),this.onResize((e=>this._renderService.resize(e.cols,e.rows))),this._compositionView=O.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(d.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this.element.appendChild(i);try{this._onWillOpen.fire(this.element)}catch(e){}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._mouseService=this._instantiationService.createInstance(p.MouseService),this._instantiationService.setService(S.IMouseService,this._mouseService),this.viewport=this._instantiationService.createInstance(h.Viewport,this._viewportElement,this._viewportScrollArea),this.viewport.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent,1))),this.register(this._inputHandler.onRequestSyncScrollBar((()=>this.viewport.syncScrollArea()))),this.register(this.viewport),this.register(this.onCursorMove((()=>{this._renderService.handleCursorMove(),this._syncTextArea()}))),this.register(this.onResize((()=>this._renderService.handleResize(this.cols,this.rows)))),this.register(this.onBlur((()=>this._renderService.handleBlur()))),this.register(this.onFocus((()=>this._renderService.handleFocus()))),this.register(this._renderService.onDimensionsChange((()=>this.viewport.syncScrollArea()))),this._selectionService=this.register(this._instantiationService.createInstance(m.SelectionService,this.element,this.screenElement,this.linkifier2)),this._instantiationService.setService(S.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent)))),this.register(this._selectionService.onSelectionChange((()=>this._onSelectionChange.fire()))),this.register(this._selectionService.onRequestRedraw((e=>this._renderService.handleSelectionChanged(e.start,e.end,e.columnSelectMode)))),this.register(this._selectionService.onLinuxMouseSelection((e=>{this.textarea.value=e,this.textarea.focus(),this.textarea.select()}))),this.register(this._onScroll.event((e=>{this.viewport.syncScrollArea(),this._selectionService.refresh()}))),this.register((0,r.addDisposableDomListener)(this._viewportElement,"scroll",(()=>this._selectionService.refresh()))),this.linkifier2.attachToDom(this.screenElement,this._mouseService,this._renderService),this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer,this.screenElement)),this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>this._selectionService.handleMouseDown(e)))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)),this.register(this.optionsService.onSpecificOptionChange("screenReaderMode",(e=>this._handleScreenReaderModeOptionChange(e)))),this.options.overviewRulerWidth&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("overviewRulerWidth",(e=>{!this._overviewRulerRenderer&&e&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement)))})),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()}_createRenderer(){return this._instantiationService.createInstance(_.DomRenderer,this.element,this.screenElement,this._viewportElement,this.linkifier2)}bindMouse(){const e=this,t=this.element;function i(t){const i=e._mouseService.getMouseReportCoords(t,e.screenElement);if(!i)return!1;let s,r;switch(t.overrideType||t.type){case"mousemove":r=32,void 0===t.buttons?(s=3,void 0!==t.button&&(s=t.button<3?t.button:3)):s=1&t.buttons?0:4&t.buttons?1:2&t.buttons?2:3;break;case"mouseup":r=0,s=t.button<3?t.button:3;break;case"mousedown":r=1,s=t.button<3?t.button:3;break;case"wheel":if(0===e.viewport.getLinesScrolled(t))return!1;r=t.deltaY<0?0:1,s=4;break;default:return!1}return!(void 0===r||void 0===s||s>4)&&e.coreMouseService.triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:t.altKey,shift:t.shiftKey})}const s={mouseup:null,wheel:null,mousedrag:null,mousemove:null},n={mouseup:e=>(i(e),e.buttons||(this._document.removeEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.removeEventListener("mousemove",s.mousedrag)),this.cancel(e)),wheel:e=>(i(e),this.cancel(e,!0)),mousedrag:e=>{e.buttons&&i(e)},mousemove:e=>{e.buttons||i(e)}};this.register(this.coreMouseService.onProtocolChange((e=>{e?("debug"===this.optionsService.rawOptions.logLevel&&this._logService.debug("Binding to mouse events:",this.coreMouseService.explainEvents(e)),this.element.classList.add("enable-mouse-events"),this._selectionService.disable()):(this._logService.debug("Unbinding from mouse events."),this.element.classList.remove("enable-mouse-events"),this._selectionService.enable()),8&e?s.mousemove||(t.addEventListener("mousemove",n.mousemove),s.mousemove=n.mousemove):(t.removeEventListener("mousemove",s.mousemove),s.mousemove=null),16&e?s.wheel||(t.addEventListener("wheel",n.wheel,{passive:!1}),s.wheel=n.wheel):(t.removeEventListener("wheel",s.wheel),s.wheel=null),2&e?s.mouseup||(t.addEventListener("mouseup",n.mouseup),s.mouseup=n.mouseup):(this._document.removeEventListener("mouseup",s.mouseup),t.removeEventListener("mouseup",s.mouseup),s.mouseup=null),4&e?s.mousedrag||(s.mousedrag=n.mousedrag):(this._document.removeEventListener("mousemove",s.mousedrag),s.mousedrag=null)}))),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,r.addDisposableDomListener)(t,"mousedown",(e=>{if(e.preventDefault(),this.focus(),this.coreMouseService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(e))return i(e),s.mouseup&&this._document.addEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.addEventListener("mousemove",s.mousedrag),this.cancel(e)}))),this.register((0,r.addDisposableDomListener)(t,"wheel",(e=>{if(!s.wheel){if(!this.buffer.hasScrollback){const t=this.viewport.getLinesScrolled(e);if(0===t)return;const i=D.C0.ESC+(this.coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");let s="";for(let e=0;e{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchStart(e),this.cancel(e)}),{passive:!0})),this.register((0,r.addDisposableDomListener)(t,"touchmove",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchMove(e)?void 0:this.cancel(e)}),{passive:!1}))}refresh(e,t){var i;null===(i=this._renderService)||void 0===i||i.refreshRows(e,t)}updateCursorStyle(e){var t;(null===(t=this._selectionService)||void 0===t?void 0:t.shouldColumnSelect(e))?this.element.classList.add("column-select"):this.element.classList.remove("column-select")}_showCursor(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))}scrollLines(e,t,i=0){var s;1===i?(super.scrollLines(e,t,i),this.refresh(0,this.rows-1)):null===(s=this.viewport)||void 0===s||s.scrollLines(e)}paste(e){(0,s.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}registerLinkProvider(e){return this.linkifier2.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");const t=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),t}deregisterCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");this._characterJoinerService.deregister(e)&&this.refresh(0,this.rows-1)}get markers(){return this.buffer.markers}registerMarker(e){return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)}registerDecoration(e){return this._decorationService.registerDecoration(e)}hasSelection(){return!!this._selectionService&&this._selectionService.hasSelection}select(e,t,i){this._selectionService.setSelection(e,t,i)}getSelection(){return this._selectionService?this._selectionService.selectionText:""}getSelectionPosition(){if(this._selectionService&&this._selectionService.hasSelection)return{start:{x:this._selectionService.selectionStart[0],y:this._selectionService.selectionStart[1]},end:{x:this._selectionService.selectionEnd[0],y:this._selectionService.selectionEnd[1]}}}clearSelection(){var e;null===(e=this._selectionService)||void 0===e||e.clearSelection()}selectAll(){var e;null===(e=this._selectionService)||void 0===e||e.selectAll()}selectLines(e,t){var i;null===(i=this._selectionService)||void 0===i||i.selectLines(e,t)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;const t=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!t&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=(0,R.evaluateKeyboardEvent)(e,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),this.cancel(e,!0)}return 1===i.type&&this.selectAll(),!!this._isThirdLevelShift(this.browser,e)||(i.cancel&&this.cancel(e,!0),!i.key||!!(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(i.key!==D.C0.ETX&&i.key!==D.C0.CR||(this.textarea.value=""),this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!0),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey?this.cancel(e,!0):void(this._keyDownHandled=!0))))}_isThirdLevelShift(e,t){const i=e.isMac&&!this.options.macOptionIsMeta&&t.altKey&&!t.ctrlKey&&!t.metaKey||e.isWindows&&t.altKey&&t.ctrlKey&&!t.metaKey||e.isWindows&&t.getModifierState("AltGraph");return"keypress"===t.type?i:i&&(!t.keyCode||t.keyCode>47)}_keyUp(e){this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e)||(function(e){return 16===e.keyCode||17===e.keyCode||18===e.keyCode}(e)||this.focus(),this.updateCursorStyle(e),this._keyPressHandled=!1)}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled)return!1;if(this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(this.cancel(e),e.charCode)t=e.charCode;else if(null===e.which||void 0===e.which)t=e.keyCode;else{if(0===e.which||0===e.charCode)return!1;t=e.which}return!(!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)||(t=String.fromCharCode(t),this._onKey.fire({key:t,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&"insertText"===e.inputType&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;const t=e.data;return this.coreService.triggerDataEvent(t,!0),this.cancel(e),!0}return!1}resize(e,t){e!==this.cols||t!==this.rows?super.resize(e,t):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()}_afterResize(e,t){var i,s;null===(i=this._charSizeService)||void 0===i||i.measure(),null===(s=this.viewport)||void 0===s||s.syncScrollArea(!0)}clear(){var e;if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.clearAllMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let e=1;e{Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t;const s=Date.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=s,this._innerRefresh();else if(!this._additionalRefreshRequested){const e=s-this._lastRefreshMs,t=this._debounceThresholdMS-e;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout((()=>{this._lastRefreshMs=Date.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0}),t)}}_innerRefresh(){if(void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return;const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t)}}},1680:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const n=i(3656),o=i(4725),a=i(8460),h=i(844),c=i(2585);let l=t.Viewport=class extends h.Disposable{constructor(e,t,i,s,r,o,h,c){super(),this._viewportElement=e,this._scrollArea=t,this._bufferService=i,this._optionsService=s,this._charSizeService=r,this._renderService=o,this._coreBrowserService=h,this.scrollBarWidth=0,this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._wheelPartialScroll=0,this._refreshAnimationFrame=null,this._ignoreNextScrollEvent=!1,this._smoothScrollState={startTime:0,origin:-1,target:-1},this._onRequestScrollLines=this.register(new a.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this.register((0,n.addDisposableDomListener)(this._viewportElement,"scroll",this._handleScroll.bind(this))),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._renderDimensions=this._renderService.dimensions,this.register(this._renderService.onDimensionsChange((e=>this._renderDimensions=e))),this._handleThemeChange(c.colors),this.register(c.onChangeColors((e=>this._handleThemeChange(e)))),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.syncScrollArea()))),setTimeout((()=>this.syncScrollArea()))}_handleThemeChange(e){this._viewportElement.style.backgroundColor=e.background.css}reset(){this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._coreBrowserService.window.requestAnimationFrame((()=>this.syncScrollArea()))}_refresh(e){if(e)return this._innerRefresh(),void(null!==this._refreshAnimationFrame&&this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame));null===this._refreshAnimationFrame&&(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderService.dimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderService.dimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderService.dimensions.css.canvas.height);this._lastRecordedBufferHeight!==e&&(this._lastRecordedBufferHeight=e,this._scrollArea.style.height=this._lastRecordedBufferHeight+"px")}const e=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==e&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=e),this._refreshAnimationFrame=null}syncScrollArea(e=!1){if(this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(e);this._lastRecordedViewportHeight===this._renderService.dimensions.css.canvas.height&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.device.cell.height===this._currentDeviceCellHeight||this._refresh(e)}_handleScroll(e){if(this._lastScrollTop=this._viewportElement.scrollTop,!this._viewportElement.offsetParent)return;if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._onRequestScrollLines.fire({amount:0,suppressScrollEvent:!0});const t=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._onRequestScrollLines.fire({amount:t,suppressScrollEvent:!0})}_smoothScroll(){if(this._isDisposed||-1===this._smoothScrollState.origin||-1===this._smoothScrollState.target)return;const e=this._smoothScrollPercent();this._viewportElement.scrollTop=this._smoothScrollState.origin+Math.round(e*(this._smoothScrollState.target-this._smoothScrollState.origin)),e<1?this._coreBrowserService.window.requestAnimationFrame((()=>this._smoothScroll())):this._clearSmoothScrollState()}_smoothScrollPercent(){return this._optionsService.rawOptions.smoothScrollDuration&&this._smoothScrollState.startTime?Math.max(Math.min((Date.now()-this._smoothScrollState.startTime)/this._optionsService.rawOptions.smoothScrollDuration,1),0):1}_clearSmoothScrollState(){this._smoothScrollState.startTime=0,this._smoothScrollState.origin=-1,this._smoothScrollState.target=-1}_bubbleScroll(e,t){const i=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(t<0&&0!==this._viewportElement.scrollTop||t>0&&i0&&(s=e),r=""}}return{bufferElements:n,cursorElement:s}}getLinesScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(t/=this._currentRowHeight+0,this._wheelPartialScroll+=t,t=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._bufferService.rows),t}_applyScrollModifier(e,t){const i=this._optionsService.rawOptions.fastScrollModifier;return"alt"===i&&t.altKey||"ctrl"===i&&t.ctrlKey||"shift"===i&&t.shiftKey?e*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:e*this._optionsService.rawOptions.scrollSensitivity}handleTouchStart(e){this._lastTouchY=e.touches[0].pageY}handleTouchMove(e){const t=this._lastTouchY-e.touches[0].pageY;return this._lastTouchY=e.touches[0].pageY,0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}};t.Viewport=l=s([r(2,c.IBufferService),r(3,c.IOptionsService),r(4,o.ICharSizeService),r(5,o.IRenderService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],l)},3107:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const n=i(3656),o=i(4725),a=i(844),h=i(2585);let c=t.BufferDecorationRenderer=class extends a.Disposable{constructor(e,t,i,s){super(),this._screenElement=e,this._bufferService=t,this._decorationService=i,this._renderService=s,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this.register(this._renderService.onRenderedViewportChange((()=>this._doRefreshDecorations()))),this.register(this._renderService.onDimensionsChange((()=>{this._dimensionsChanged=!0,this._queueRefresh()}))),this.register((0,n.addDisposableDomListener)(window,"resize",(()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt}))),this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh()))),this.register(this._decorationService.onDecorationRemoved((e=>this._removeDecoration(e)))),this.register((0,a.toDisposable)((()=>{this._container.remove(),this._decorationElements.clear()})))}_queueRefresh(){void 0===this._animationFrame&&(this._animationFrame=this._renderService.addRefreshCallback((()=>{this._doRefreshDecorations(),this._animationFrame=void 0})))}_doRefreshDecorations(){for(const e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){var t,i;const s=document.createElement("div");s.classList.add("xterm-decoration"),s.classList.toggle("xterm-decoration-top-layer","top"===(null===(t=null==e?void 0:e.options)||void 0===t?void 0:t.layer)),s.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,s.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",s.style.top=(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+"px",s.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const r=null!==(i=e.options.x)&&void 0!==i?i:0;return r&&r>this._bufferService.cols&&(s.style.display="none"),this._refreshXPosition(e,s),s}_refreshStyle(e){const t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let i=this._decorationElements.get(e);i||(i=this._createElement(e),e.element=i,this._decorationElements.set(e,i),this._container.appendChild(i),e.onDispose((()=>{this._decorationElements.delete(e),i.remove()}))),i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.display=this._altBufferIsActive?"none":"block",e.onRenderEmitter.fire(i)}}_refreshXPosition(e,t=e.element){var i;if(!t)return;const s=null!==(i=e.options.x)&&void 0!==i?i:0;"right"===(e.options.anchor||"left")?t.style.right=s?s*this._renderService.dimensions.css.cell.width+"px":"":t.style.left=s?s*this._renderService.dimensions.css.cell.width+"px":""}_removeDecoration(e){var t;null===(t=this._decorationElements.get(e))||void 0===t||t.remove(),this._decorationElements.delete(e),e.dispose()}};t.BufferDecorationRenderer=c=s([r(1,h.IBufferService),r(2,h.IDecorationService),r(3,o.IRenderService)],c)},5871:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorZoneStore=void 0,t.ColorZoneStore=class{constructor(){this._zones=[],this._zonePool=[],this._zonePoolIndex=0,this._linePadding={full:0,left:0,center:0,right:0}}get zones(){return this._zonePool.length=Math.min(this._zonePool.length,this._zones.length),this._zones}clear(){this._zones.length=0,this._zonePoolIndex=0}addDecoration(e){if(e.options.overviewRulerOptions){for(const t of this._zones)if(t.color===e.options.overviewRulerOptions.color&&t.position===e.options.overviewRulerOptions.position){if(this._lineIntersectsZone(t,e.marker.line))return;if(this._lineAdjacentToZone(t,e.marker.line,e.options.overviewRulerOptions.position))return void this._addLineToZone(t,e.marker.line)}if(this._zonePoolIndex=e.startBufferLine&&t<=e.endBufferLine}_lineAdjacentToZone(e,t,i){return t>=e.startBufferLine-this._linePadding[i||"full"]&&t<=e.endBufferLine+this._linePadding[i||"full"]}_addLineToZone(e,t){e.startBufferLine=Math.min(e.startBufferLine,t),e.endBufferLine=Math.max(e.endBufferLine,t)}}},5744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const n=i(5871),o=i(3656),a=i(4725),h=i(844),c=i(2585),l={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0},_={full:0,left:0,center:0,right:0};let u=t.OverviewRulerRenderer=class extends h.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(e,t,i,s,r,o,a){var c;super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=o,this._coreBrowseService=a,this._colorZoneStore=new n.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=document.createElement("canvas"),this._canvas.classList.add("xterm-decoration-overview-ruler"),this._refreshCanvasDimensions(),null===(c=this._viewportElement.parentElement)||void 0===c||c.insertBefore(this._canvas,this._viewportElement);const l=this._canvas.getContext("2d");if(!l)throw new Error("Ctx cannot be null");this._ctx=l,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,h.toDisposable)((()=>{var e;null===(e=this._canvas)||void 0===e||e.remove()})))}_registerDecorationListeners(){this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh(void 0,!0)))),this.register(this._decorationService.onDecorationRemoved((()=>this._queueRefresh(void 0,!0))))}_registerBufferChangeListeners(){this.register(this._renderService.onRenderedViewportChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._canvas.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?"none":"block"}))),this.register(this._bufferService.onScroll((()=>{this._lastKnownBufferLength!==this._bufferService.buffers.normal.lines.length&&(this._refreshDrawHeightConstants(),this._refreshColorZonePadding())})))}_registerDimensionChangeListeners(){this.register(this._renderService.onRender((()=>{this._containerHeight&&this._containerHeight===this._screenElement.clientHeight||(this._queueRefresh(!0),this._containerHeight=this._screenElement.clientHeight)}))),this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth",(()=>this._queueRefresh(!0)))),this.register((0,o.addDisposableDomListener)(this._coreBrowseService.window,"resize",(()=>this._queueRefresh(!0)))),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor(this._canvas.width/3),t=Math.ceil(this._canvas.width/3);d.full=this._canvas.width,d.left=e,d.center=t,d.right=e,this._refreshDrawHeightConstants(),_.full=0,_.left=0,_.center=d.left,_.right=d.left+d.center}_refreshDrawHeightConstants(){l.full=Math.round(2*this._coreBrowseService.dpr);const e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowseService.dpr);l.left=t,l.center=t,l.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowseService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowseService.dpr),this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(const e of this._decorationService.decorations)this._colorZoneStore.addDecoration(e);this._ctx.lineWidth=1;const e=this._colorZoneStore.zones;for(const t of e)"full"!==t.position&&this._renderColorZone(t);for(const t of e)"full"===t.position&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect(_[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-l[e.position||"full"]/2),d[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+l[e.position||"full"]))}_queueRefresh(e,t){this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowseService.window.requestAnimationFrame((()=>{this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=u=s([r(2,c.IBufferService),r(3,c.IDecorationService),r(4,a.IRenderService),r(5,c.IOptionsService),r(6,a.ICoreBrowserService)],u)},2950:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const n=i(4725),o=i(2585),a=i(2584);let h=t.CompositionHelper=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=n,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout((()=>{this._compositionPosition.end=this._textarea.value.length}),0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return 229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}_finalizeComposition(e){if(this._compositionView.classList.remove("active"),this._isComposing=!1,e){const e={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout((()=>{if(this._isSendingComposition){let t;this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,t=this._isComposing?this._textarea.value.substring(e.start,e.end):this._textarea.value.substring(e.start),t.length>0&&this._coreService.triggerDataEvent(t,!0)}}),0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){const e=this._textarea.value;setTimeout((()=>{if(!this._isComposing){const t=this._textarea.value,i=t.replace(e,"");this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.lengththis.updateCompositionElements(!0)),0)}}};t.CompositionHelper=h=s([r(2,o.IBufferService),r(3,o.IOptionsService),r(4,o.ICoreService),r(5,n.IRenderService)],h)},9806:(e,t)=>{function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),n=parseInt(r.getPropertyValue("padding-left")),o=parseInt(r.getPropertyValue("padding-top"));return[t.clientX-s.left-n,t.clientY-s.top-o]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoords=t.getCoordsRelativeToElement=void 0,t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,n,o,a,h,c){if(!o)return;const l=i(e,t,s);return l?(l[0]=Math.ceil((l[0]+(c?a/2:0))/a),l[1]=Math.ceil(l[1]/h),l[0]=Math.min(Math.max(l[0],1),r+(c?1:0)),l[1]=Math.min(Math.max(l[1],1),n),l):void 0}},9504:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.moveToCellSequence=void 0;const s=i(2584);function r(e,t,i,s){const r=e-n(e,i),a=t-n(t,i),l=Math.abs(r-a)-function(e,t,i){let s=0;const r=e-n(e,i),a=t-n(t,i);for(let n=0;n=0&&et?"A":"B"}function a(e,t,i,s,r,n){let o=e,a=t,h="";for(;o!==i||a!==s;)o+=r?1:-1,r&&o>n.cols-1?(h+=n.buffer.translateBufferLineToString(a,!1,e,o),o=0,e=0,a++):!r&&o<0&&(h+=n.buffer.translateBufferLineToString(a,!1,0,e+1),o=n.cols-1,e=o,a--);return h+n.buffer.translateBufferLineToString(a,!1,e,o)}function h(e,t){const i=t?"O":"[";return s.C0.ESC+i+e}function c(e,t){e=Math.floor(e);let i="";for(let s=0;s0?s-n(s,o):t;const _=s,u=function(e,t,i,s,o,a){let h;return h=r(i,s,o,a).length>0?s-n(s,o):t,e=i&&he?"D":"C",c(Math.abs(o-e),h(d,s));d=l>t?"D":"C";const _=Math.abs(l-t);return c(function(e,t){return t.cols-e}(l>t?e:o,i)+(_-1)*i.cols+1+((l>t?o:e)-1),h(d,s))}},1296:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const n=i(3787),o=i(2550),a=i(2223),h=i(6171),c=i(4725),l=i(8055),d=i(8460),_=i(844),u=i(2585),f="xterm-dom-renderer-owner-",v="xterm-rows",p="xterm-fg-",g="xterm-bg-",m="xterm-focus",S="xterm-selection";let C=1,b=t.DomRenderer=class extends _.Disposable{constructor(e,t,i,s,r,a,c,l,u,p){super(),this._element=e,this._screenElement=t,this._viewportElement=i,this._linkifier2=s,this._charSizeService=a,this._optionsService=c,this._bufferService=l,this._coreBrowserService=u,this._themeService=p,this._terminalClass=C++,this._rowElements=[],this.onRequestRedraw=this.register(new d.EventEmitter).event,this._rowContainer=document.createElement("div"),this._rowContainer.classList.add(v),this._rowContainer.style.lineHeight="normal",this._rowContainer.setAttribute("aria-hidden","true"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=document.createElement("div"),this._selectionContainer.classList.add(S),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=(0,h.createRenderDimensions)(),this._updateDimensions(),this.register(this._optionsService.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._themeService.onChangeColors((e=>this._injectCss(e)))),this._injectCss(this._themeService.colors),this._rowFactory=r.createInstance(n.DomRendererRowFactory,document),this._element.classList.add(f+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this.register(this._linkifier2.onShowLinkUnderline((e=>this._handleLinkHover(e)))),this.register(this._linkifier2.onHideLinkUnderline((e=>this._handleLinkLeave(e)))),this.register((0,_.toDisposable)((()=>{this._element.classList.remove(f+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()}))),this._widthCache=new o.WidthCache(document),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){const e=this._coreBrowserService.dpr;this.dimensions.device.char.width=this._charSizeService.width*e,this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*e),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.left=0,this.dimensions.device.char.top=0,this.dimensions.device.canvas.width=this.dimensions.device.cell.width*this._bufferService.cols,this.dimensions.device.canvas.height=this.dimensions.device.cell.height*this._bufferService.rows,this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/e),this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/e),this.dimensions.css.cell.width=this.dimensions.css.canvas.width/this._bufferService.cols,this.dimensions.css.cell.height=this.dimensions.css.canvas.height/this._bufferService.rows;for(const e of this._rowElements)e.style.width=`${this.dimensions.css.canvas.width}px`,e.style.height=`${this.dimensions.css.cell.height}px`,e.style.lineHeight=`${this.dimensions.css.cell.height}px`,e.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));const t=`${this._terminalSelector} .${v} span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=t,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._screenElement.style.height=`${this.dimensions.css.canvas.height}px`}_injectCss(e){this._themeStyleElement||(this._themeStyleElement=document.createElement("style"),this._screenElement.appendChild(this._themeStyleElement));let t=`${this._terminalSelector} .${v} { color: ${e.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`;t+=`${this._terminalSelector} .${v} .xterm-dim { color: ${l.color.multiplyOpacity(e.foreground,.5).css};}`,t+=`${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`,t+="@keyframes blink_box_shadow_"+this._terminalClass+" { 50% { border-bottom-style: hidden; }}",t+="@keyframes blink_block_"+this._terminalClass+" { 0% {"+` background-color: ${e.cursor.css};`+` color: ${e.cursorAccent.css}; } 50% { background-color: inherit;`+` color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .${v}.${m} .xterm-cursor.xterm-cursor-blink:not(.xterm-cursor-block) { animation: blink_box_shadow_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${v}.${m} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: blink_block_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-block {`+` background-color: ${e.cursor.css};`+` color: ${e.cursorAccent.css};}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-outline {`+` outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-bar {`+` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-underline {`+` border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .${S} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${S} div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .${S} div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .${p}${i} { color: ${s.css}; }${this._terminalSelector} .${p}${i}.xterm-dim { color: ${l.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .${g}${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .${p}${a.INVERTED_DEFAULT_COLOR} { color: ${l.color.opaque(e.background).css}; }${this._terminalSelector} .${p}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${l.color.multiplyOpacity(l.color.opaque(e.background),.5).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){const e=this.dimensions.css.cell.width-this._widthCache.get("W",!1,!1);this._rowContainer.style.letterSpacing=`${e}px`,this._rowFactory.defaultSpacing=e}handleDevicePixelRatioChange(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}_refreshRowElements(e,t){for(let e=this._rowElements.length;e<=t;e++){const e=document.createElement("div");this._rowContainer.appendChild(e),this._rowElements.push(e)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop())}handleResize(e,t){this._refreshRowElements(e,t),this._updateDimensions()}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(m)}handleFocus(){this._rowContainer.classList.add(m),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleSelectionChanged(e,t,i){if(this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i),this.renderRows(0,this._bufferService.rows-1),!e||!t)return;const s=e[1]-this._bufferService.buffer.ydisp,r=t[1]-this._bufferService.buffer.ydisp,n=Math.max(s,0),o=Math.min(r,this._bufferService.rows-1);if(n>=this._bufferService.rows||o<0)return;const a=document.createDocumentFragment();if(i){const i=e[0]>t[0];a.appendChild(this._createSelectionElement(n,i?t[0]:e[0],i?e[0]:t[0],o-n+1))}else{const i=s===n?e[0]:0,h=n===r?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(n,i,h));const c=o-n-1;if(a.appendChild(this._createSelectionElement(n+1,0,this._bufferService.cols,c)),n!==o){const e=r===o?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(o,0,e))}}this._selectionContainer.appendChild(a)}_createSelectionElement(e,t,i,s=1){const r=document.createElement("div");return r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=t*this.dimensions.css.cell.width+"px",r.style.width=this.dimensions.css.cell.width*(i-t)+"px",r}handleCursorMove(){}_handleOptionsChanged(){this._updateDimensions(),this._injectCss(this._themeService.colors),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}clear(){for(const e of this._rowElements)e.replaceChildren()}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),n=this._optionsService.rawOptions.cursorBlink,o=this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle;for(let h=e;h<=t;h++){const e=h+i.ydisp,t=this._rowElements[h],c=i.lines.get(e);if(!t||!c)break;t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,o,a,r,n,this.dimensions.css.cell.width,this._widthCache,-1,-1))}}get _terminalSelector(){return`.${f}${this._terminalClass}`}_handleLinkHover(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!0)}_handleLinkLeave(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!1)}_setCellUnderline(e,t,i,s,r,n){i<0&&(e=0),s<0&&(t=0);const o=this._bufferService.rows-1;i=Math.max(Math.min(i,o),0),s=Math.max(Math.min(s,o),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,c=Math.min(a.x,r-1),l=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle;for(let o=i;o<=s;++o){const u=o+a.ydisp,f=this._rowElements[o],v=a.lines.get(u);if(!f||!v)break;f.replaceChildren(...this._rowFactory.createRow(v,u,u===h,d,_,c,l,this.dimensions.css.cell.width,this._widthCache,n?o===i?e:0:-1,n?(o===s?t:r)-1:-1))}}};t.DomRenderer=b=s([r(4,u.IInstantiationService),r(5,c.ICharSizeService),r(6,u.IOptionsService),r(7,u.IBufferService),r(8,c.ICoreBrowserService),r(9,c.IThemeService)],b)},3787:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const n=i(2223),o=i(643),a=i(511),h=i(2585),c=i(8055),l=i(4725),d=i(4269),_=i(6171),u=i(3734);let f=t.DomRendererRowFactory=class{constructor(e,t,i,s,r,n,o){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=n,this._themeService=o,this._workCell=new a.CellData,this._columnSelectMode=!1,this.defaultSpacing=0}handleSelectionChanged(e,t,i){this._selectionStart=e,this._selectionEnd=t,this._columnSelectMode=i}createRow(e,t,i,s,r,a,h,l,_,f,p){const g=[],m=this._characterJoinerService.getJoinedCharacters(t),S=this._themeService.colors;let C,b=e.getNoBgTrimmedLength();i&&b0&&M===m[0][0]){O=!0;const t=m.shift();I=new d.JoinedCellData(this._workCell,e.translateToString(!0,t[0],t[1]),t[1]-t[0]),P=t[1]-1,b=I.getWidth()}const H=this._isCellInSelection(M,t),F=i&&M===a,W=T&&M>=f&&M<=p;let U=!1;this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{U=!0}));let N=I.getChars()||o.WHITESPACE_CELL_CHAR;if(" "===N&&(I.isUnderline()||I.isOverline())&&(N=" "),A=b*l-_.get(N,I.isBold(),I.isItalic()),C){if(y&&(H&&x||!H&&!x&&I.bg===E)&&(H&&x&&S.selectionForeground||I.fg===k)&&I.extended.ext===L&&W===D&&A===R&&!F&&!O&&!U){w+=N,y++;continue}y&&(C.textContent=w),C=this._document.createElement("span"),y=0,w=""}else C=this._document.createElement("span");if(E=I.bg,k=I.fg,L=I.extended.ext,D=W,R=A,x=H,O&&a>=M&&a<=P&&(a=M),!this._coreService.isCursorHidden&&F)if(B.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&B.push("xterm-cursor-blink"),B.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":B.push("xterm-cursor-outline");break;case"block":B.push("xterm-cursor-block");break;case"bar":B.push("xterm-cursor-bar");break;case"underline":B.push("xterm-cursor-underline")}if(I.isBold()&&B.push("xterm-bold"),I.isItalic()&&B.push("xterm-italic"),I.isDim()&&B.push("xterm-dim"),w=I.isInvisible()?o.WHITESPACE_CELL_CHAR:I.getChars()||o.WHITESPACE_CELL_CHAR,I.isUnderline()&&(B.push(`xterm-underline-${I.extended.underlineStyle}`)," "===w&&(w=" "),!I.isUnderlineColorDefault()))if(I.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(",")})`;else{let e=I.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&I.isBold()&&e<8&&(e+=8),C.style.textDecorationColor=S.ansi[e].css}I.isOverline()&&(B.push("xterm-overline")," "===w&&(w=" ")),I.isStrikethrough()&&B.push("xterm-strikethrough"),W&&(C.style.textDecoration="underline");let $=I.getFgColor(),j=I.getFgColorMode(),z=I.getBgColor(),K=I.getBgColorMode();const q=!!I.isInverse();if(q){const e=$;$=z,z=e;const t=j;j=K,K=t}let V,G,X,J=!1;switch(this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{"top"!==e.options.layer&&J||(e.backgroundColorRGB&&(K=50331648,z=e.backgroundColorRGB.rgba>>8&16777215,V=e.backgroundColorRGB),e.foregroundColorRGB&&(j=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,G=e.foregroundColorRGB),J="top"===e.options.layer)})),!J&&H&&(V=this._coreBrowserService.isFocused?S.selectionBackgroundOpaque:S.selectionInactiveBackgroundOpaque,z=V.rgba>>8&16777215,K=50331648,J=!0,S.selectionForeground&&(j=50331648,$=S.selectionForeground.rgba>>8&16777215,G=S.selectionForeground)),J&&B.push("xterm-decoration-top"),K){case 16777216:case 33554432:X=S.ansi[z],B.push(`xterm-bg-${z}`);break;case 50331648:X=c.rgba.toColor(z>>16,z>>8&255,255&z),this._addStyle(C,`background-color:#${v((z>>>0).toString(16),"0",6)}`);break;default:q?(X=S.foreground,B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)):X=S.background}switch(V||I.isDim()&&(V=c.color.multiplyOpacity(X,.5)),j){case 16777216:case 33554432:I.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(C,X,S.ansi[$],I,V,void 0)||B.push(`xterm-fg-${$}`);break;case 50331648:const e=c.rgba.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(C,X,e,I,V,G)||this._addStyle(C,`color:#${v($.toString(16),"0",6)}`);break;default:this._applyMinimumContrast(C,X,S.foreground,I,V,void 0)||q&&B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`)}B.length&&(C.className=B.join(" "),B.length=0),F||O||U?C.textContent=w:y++,A!==this.defaultSpacing&&(C.style.letterSpacing=`${A}px`),g.push(C),M=P}return C&&y&&(C.textContent=w),g}_applyMinimumContrast(e,t,i,s,r,n){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.excludeFromContrastRatioDemands)(s.getCode()))return!1;const o=this._getContrastCache(s);let a;if(r||n||(a=o.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=c.color.ensureContrastRatio(r||t,n||i,e),o.setColor((r||t).rgba,(n||i).rgba,null!=a?a:null)}return!!a&&(this._addStyle(e,`color:${a.css}`),!0)}_getContrastCache(e){return e.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(e,t){e.setAttribute("style",`${e.getAttribute("style")||""}${t};`)}_isCellInSelection(e,t){const i=this._selectionStart,s=this._selectionEnd;return!(!i||!s)&&(this._columnSelectMode?i[0]<=s[0]?e>=i[0]&&t>=i[1]&&e=i[1]&&e>=s[0]&&t<=s[1]:t>i[1]&&t=i[0]&&e=i[0])}};function v(e,t,i){for(;e.length{Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0,t.WidthCache=class{constructor(e){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._measureElements=[],this._container=e.createElement("div"),this._container.style.position="absolute",this._container.style.top="-50000px",this._container.style.width="50000px",this._container.style.whiteSpace="pre",this._container.style.fontKerning="none";const t=e.createElement("span"),i=e.createElement("span");i.style.fontWeight="bold";const s=e.createElement("span");s.style.fontStyle="italic";const r=e.createElement("span");r.style.fontWeight="bold",r.style.fontStyle="italic",this._measureElements=[t,i,s,r],this._container.appendChild(t),this._container.appendChild(i),this._container.appendChild(s),this._container.appendChild(r),e.body.appendChild(this._container),this.clear()}dispose(){this._container.remove(),this._measureElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(e,t,i,s){e===this._font&&t===this._fontSize&&i===this._weight&&s===this._weightBold||(this._font=e,this._fontSize=t,this._weight=i,this._weightBold=s,this._container.style.fontFamily=this._font,this._container.style.fontSize=`${this._fontSize}px`,this._measureElements[0].style.fontWeight=`${i}`,this._measureElements[1].style.fontWeight=`${s}`,this._measureElements[2].style.fontWeight=`${i}`,this._measureElements[3].style.fontWeight=`${s}`,this.clear())}get(e,t,i){let s=0;if(!t&&!i&&1===e.length&&(s=e.charCodeAt(0))<256)return-9999!==this._flat[s]?this._flat[s]:this._flat[s]=this._measure(e,0);let r=e;t&&(r+="B"),i&&(r+="I");let n=this._holey.get(r);if(void 0===n){let s=0;t&&(s|=1),i&&(s|=2),n=this._measure(e,s),this._holey.set(r,n)}return n}_measure(e,t){const i=this._measureElements[t];return i.textContent=e.repeat(32),i.offsetWidth/32}}},2223:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(6114);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},6171:(e,t)=>{function i(e){return 57508<=e&&e<=57558}Object.defineProperty(t,"__esModule",{value:!0}),t.createRenderDimensions=t.excludeFromContrastRatioDemands=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.excludeFromContrastRatioDemands=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}}},456:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionModel=void 0,t.SelectionModel=class{constructor(e){this._bufferService=e,this.isSelectAllActive=!1,this.selectionStartLength=0}clearSelection(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0}get finalSelectionStart(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart}get finalSelectionEnd(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?e%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)-1]:[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[e,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[Math.max(e,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){const e=this.selectionStart,t=this.selectionEnd;return!(!e||!t)&&(e[1]>t[1]||e[1]===t[1]&&e[0]>t[0])}handleTrim(e){return this.selectionStart&&(this.selectionStart[1]-=e),this.selectionEnd&&(this.selectionEnd[1]-=e),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)}}},428:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const n=i(2585),o=i(8460),a=i(844);let h=t.CharSizeService=class extends a.Disposable{get hasValidSize(){return this.width>0&&this.height>0}constructor(e,t,i){super(),this._optionsService=i,this.width=0,this.height=0,this._onCharSizeChange=this.register(new o.EventEmitter),this.onCharSizeChange=this._onCharSizeChange.event,this._measureStrategy=new c(e,t,this._optionsService),this.register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],(()=>this.measure())))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h=s([r(2,n.IOptionsService)],h);class c{constructor(e,t,i){this._document=e,this._parentElement=t,this._optionsService=i,this._result={width:0,height:0},this._measureElement=this._document.createElement("span"),this._measureElement.classList.add("xterm-char-measure-element"),this._measureElement.textContent="W".repeat(32),this._measureElement.setAttribute("aria-hidden","true"),this._measureElement.style.whiteSpace="pre",this._measureElement.style.fontKerning="none",this._parentElement.appendChild(this._measureElement)}measure(){this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`;const e={height:Number(this._measureElement.offsetHeight),width:Number(this._measureElement.offsetWidth)};return 0!==e.width&&0!==e.height&&(this._result.width=e.width/32,this._result.height=Math.ceil(e.height)),this._result}}},4269:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterJoinerService=t.JoinedCellData=void 0;const n=i(3734),o=i(643),a=i(511),h=i(2585);class c extends n.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.JoinedCellData=c;let l=t.CharacterJoinerService=class e{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new a.CellData}register(e){const t={id:this._nextCharacterJoinerId++,handler:e};return this._characterJoiners.push(t),t.id}deregister(e){for(let t=0;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreBrowserService=void 0,t.CoreBrowserService=class{constructor(e,t){this._textarea=e,this.window=t,this._isFocused=!1,this._cachedIsFocused=void 0,this._textarea.addEventListener("focus",(()=>this._isFocused=!0)),this._textarea.addEventListener("blur",(()=>this._isFocused=!1))}get dpr(){return this.window.devicePixelRatio}get isFocused(){return void 0===this._cachedIsFocused&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask((()=>this._cachedIsFocused=void 0))),this._cachedIsFocused}}},8934:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseService=void 0;const n=i(4725),o=i(9806);let a=t.MouseService=class{constructor(e,t){this._renderService=e,this._charSizeService=t}getCoords(e,t,i,s,r){return(0,o.getCoords)(window,e,t,i,s,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,r)}getMouseReportCoords(e,t){const i=(0,o.getCoordsRelativeToElement)(window,e,t);if(this._charSizeService.hasValidSize)return i[0]=Math.min(Math.max(i[0],0),this._renderService.dimensions.css.canvas.width-1),i[1]=Math.min(Math.max(i[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(i[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(i[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(i[0]),y:Math.floor(i[1])}}};t.MouseService=a=s([r(0,n.IRenderService),r(1,n.ICharSizeService)],a)},3230:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const n=i(3656),o=i(6193),a=i(5596),h=i(4725),c=i(8460),l=i(844),d=i(7226),_=i(2585);let u=t.RenderService=class extends l.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,h,_,u){if(super(),this._rowCount=e,this._charSizeService=s,this._renderer=this.register(new l.MutableDisposable),this._pausedResizeTask=new d.DebouncedIdleTask,this._isPaused=!1,this._needsFullRefresh=!1,this._isNextRenderRedrawOnly=!0,this._needsSelectionRefresh=!1,this._canvasWidth=0,this._canvasHeight=0,this._selectionState={start:void 0,end:void 0,columnSelectMode:!1},this._onDimensionsChange=this.register(new c.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new c.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new c.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new c.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new o.RenderDebouncer(_.window,((e,t)=>this._renderRows(e,t))),this.register(this._renderDebouncer),this._screenDprMonitor=new a.ScreenDprMonitor(_.window),this._screenDprMonitor.setListener((()=>this.handleDevicePixelRatioChange())),this.register(this._screenDprMonitor),this.register(h.onResize((()=>this._fullRefresh()))),this.register(h.buffers.onBufferActivate((()=>{var e;return null===(e=this._renderer.value)||void 0===e?void 0:e.clear()}))),this.register(i.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._charSizeService.onCharSizeChange((()=>this.handleCharSizeChanged()))),this.register(r.onDecorationRegistered((()=>this._fullRefresh()))),this.register(r.onDecorationRemoved((()=>this._fullRefresh()))),this.register(i.onMultipleOptionChange(["customGlyphs","drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio"],(()=>{this.clear(),this.handleResize(h.cols,h.rows),this._fullRefresh()}))),this.register(i.onMultipleOptionChange(["cursorBlink","cursorStyle"],(()=>this.refreshRows(h.buffer.y,h.buffer.y,!0)))),this.register((0,n.addDisposableDomListener)(_.window,"resize",(()=>this.handleDevicePixelRatioChange()))),this.register(u.onChangeColors((()=>this._fullRefresh()))),"IntersectionObserver"in _.window){const e=new _.window.IntersectionObserver((e=>this._handleIntersectionChange(e[e.length-1])),{threshold:0});e.observe(t),this.register({dispose:()=>e.disconnect()})}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this._pausedResizeTask.flush(),this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)}refreshRows(e,t,i=!1){this._isPaused?this._needsFullRefresh=!0:(i||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(e,t,this._rowCount))}_renderRows(e,t){this._renderer.value&&(e=Math.min(e,this._rowCount-1),t=Math.min(t,this._rowCount-1),this._renderer.value.renderRows(e,t),this._needsSelectionRefresh&&(this._renderer.value.handleSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRenderedViewportChange.fire({start:e,end:t}),this._onRender.fire({start:e,end:t}),this._isNextRenderRedrawOnly=!0)}resize(e,t){this._rowCount=t,this._fireOnCanvasResize()}_handleOptionsChanged(){this._renderer.value&&(this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize())}_fireOnCanvasResize(){this._renderer.value&&(this._renderer.value.dimensions.css.canvas.width===this._canvasWidth&&this._renderer.value.dimensions.css.canvas.height===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.value.dimensions))}hasRenderer(){return!!this._renderer.value}setRenderer(e){this._renderer.value=e,this._renderer.value.onRequestRedraw((e=>this.refreshRows(e.start,e.end,!0))),this._needsSelectionRefresh=!0,this._fullRefresh()}addRefreshCallback(e){return this._renderDebouncer.addRefreshCallback(e)}_fullRefresh(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)}clearTextureAtlas(){var e,t;this._renderer.value&&(null===(t=(e=this._renderer.value).clearTextureAtlas)||void 0===t||t.call(e),this._fullRefresh())}handleDevicePixelRatioChange(){this._charSizeService.measure(),this._renderer.value&&(this._renderer.value.handleDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1))}handleResize(e,t){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set((()=>this._renderer.value.handleResize(e,t))):this._renderer.value.handleResize(e,t),this._fullRefresh())}handleCharSizeChanged(){var e;null===(e=this._renderer.value)||void 0===e||e.handleCharSizeChanged()}handleBlur(){var e;null===(e=this._renderer.value)||void 0===e||e.handleBlur()}handleFocus(){var e;null===(e=this._renderer.value)||void 0===e||e.handleFocus()}handleSelectionChanged(e,t,i){var s;this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=i,null===(s=this._renderer.value)||void 0===s||s.handleSelectionChanged(e,t,i)}handleCursorMove(){var e;null===(e=this._renderer.value)||void 0===e||e.handleCursorMove()}clear(){var e;null===(e=this._renderer.value)||void 0===e||e.clear()}};t.RenderService=u=s([r(2,_.IOptionsService),r(3,h.ICharSizeService),r(4,_.IDecorationService),r(5,_.IBufferService),r(6,h.ICoreBrowserService),r(7,h.IThemeService)],u)},9312:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionService=void 0;const n=i(9806),o=i(9504),a=i(456),h=i(4725),c=i(8460),l=i(844),d=i(6114),_=i(4841),u=i(511),f=i(2585),v=String.fromCharCode(160),p=new RegExp(v,"g");let g=t.SelectionService=class extends l.Disposable{constructor(e,t,i,s,r,n,o,h,d){super(),this._element=e,this._screenElement=t,this._linkifier=i,this._bufferService=s,this._coreService=r,this._mouseService=n,this._optionsService=o,this._renderService=h,this._coreBrowserService=d,this._dragScrollAmount=0,this._enabled=!0,this._workCell=new u.CellData,this._mouseDownTimeStamp=0,this._oldHasSelection=!1,this._oldSelectionStart=void 0,this._oldSelectionEnd=void 0,this._onLinuxMouseSelection=this.register(new c.EventEmitter),this.onLinuxMouseSelection=this._onLinuxMouseSelection.event,this._onRedrawRequest=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRedrawRequest.event,this._onSelectionChange=this.register(new c.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onRequestScrollLines=this.register(new c.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._mouseMoveListener=e=>this._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput((()=>{this.hasSelection&&this.clearSelection()})),this._trimListener=this._bufferService.buffer.lines.onTrim((e=>this._handleTrim(e))),this.register(this._bufferService.buffers.onBufferActivate((e=>this._handleBufferActivate(e)))),this.enable(),this._model=new a.SelectionModel(this._bufferService),this._activeSelectionMode=0,this.register((0,l.toDisposable)((()=>{this._removeMouseDownListeners()})))}reset(){this.clearSelection()}disable(){this.clearSelection(),this._enabled=!1}enable(){this._enabled=!0}get selectionStart(){return this._model.finalSelectionStart}get selectionEnd(){return this._model.finalSelectionEnd}get hasSelection(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!(!e||!t||e[0]===t[0]&&e[1]===t[1])}get selectionText(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return"";const i=this._bufferService.buffer,s=[];if(3===this._activeSelectionMode){if(e[0]===t[0])return"";const r=e[0]e.replace(p," "))).join(d.isWindows?"\r\n":"\n")}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._refresh()))),d.isLinux&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:3===this._activeSelectionMode})}_isClickInSelection(e){const t=this._getMouseBufferCoords(e),i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!!(i&&s&&t)&&this._areCoordsInSelection(t,i,s)}isCellInSelection(e,t){const i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!(!i||!s)&&this._areCoordsInSelection([e,t],i,s)}_areCoordsInSelection(e,t,i){return e[1]>t[1]&&e[1]=t[0]&&e[0]=t[0]}_selectWordAtCursor(e,t){var i,s;const r=null===(s=null===(i=this._linkifier.currentLink)||void 0===i?void 0:i.link)||void 0===s?void 0:s.range;if(r)return this._model.selectionStart=[r.start.x-1,r.start.y-1],this._model.selectionStartLength=(0,_.getRangeLength)(r,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const n=this._getMouseBufferCoords(e);return!!n&&(this._selectWordAt(n,t),this._model.selectionEnd=void 0,!0)}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){const t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=(0,n.getCoordsRelativeToElement)(this._coreBrowserService.window,e,this._screenElement)[1];const i=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=i?0:(t>i&&(t-=i),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(14*t))}shouldForceSelection(e){return d.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,(2!==e.button||!this.hasSelection)&&0===e.button){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):1===e.detail?this._handleSingleClick(e):2===e.detail?this._handleDoubleClick(e):3===e.detail&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval((()=>this._dragScroll()),50)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;const t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&0===t.hasWidth(this._model.selectionStart[0])&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){const t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(d.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;const t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd)return void this.refresh(!0);2===this._activeSelectionMode?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));const i=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows,e.lines.length-1)):(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){const t=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&t<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){const t=this._mouseService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,o.moveToCellSequence)(t[0]-1,t[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(e,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,i=!(!e||!t||e[0]===t[0]&&e[1]===t[1]);i?e&&t&&(this._oldSelectionStart&&this._oldSelectionEnd&&e[0]===this._oldSelectionStart[0]&&e[1]===this._oldSelectionStart[1]&&t[0]===this._oldSelectionEnd[0]&&t[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(e,t,i)):this._oldHasSelection&&this._fireOnSelectionChange(e,t,i)}_fireOnSelectionChange(e,t,i){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=i,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.dispose(),this._trimListener=e.activeBuffer.lines.onTrim((e=>this._handleTrim(e)))}_convertViewportColToCharacterIndex(e,t){let i=t;for(let s=0;t>=s;s++){const r=e.loadCell(s,this._workCell).getChars().length;0===this._workCell.getWidth()?i--:r>1&&t!==s&&(i+=r-1)}return i}setSelection(e,t,i){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=i,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,i=!0,s=!0){if(e[0]>=this._bufferService.cols)return;const r=this._bufferService.buffer,n=r.lines.get(e[1]);if(!n)return;const o=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(n,e[0]),h=a;const c=e[0]-a;let l=0,d=0,_=0,u=0;if(" "===o.charAt(a)){for(;a>0&&" "===o.charAt(a-1);)a--;for(;h1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(n.loadCell(t-1,this._workCell));){n.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(l++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+c-l+_,v=Math.min(this._bufferService.cols,h-a+l+d-_-u);if(t||""!==o.slice(a,h).trim()){if(i&&0===f&&32!==n.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&n.isWrapped&&32!==t.getCodePoint(this._bufferService.cols-1)){const t=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(t){const e=this._bufferService.cols-t.start;f-=e,v+=e}}}if(s&&f+v===this._bufferService.cols&&32!==n.getCodePoint(this._bufferService.cols-1)){const t=r.lines.get(e[1]+1);if((null==t?void 0:t.isWrapped)&&32!==t.getCodePoint(0)){const t=this._getWordAt([0,e[1]+1],!1,!1,!0);t&&(v+=t.length)}}return{start:f,length:v}}}_selectWordAt(e,t){const i=this._getWordAt(e,t);if(i){for(;i.start<0;)i.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[i.start,e[1]],this._model.selectionStartLength=i.length}}_selectToWordAt(e){const t=this._getWordAt(e,!0);if(t){let i=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,i--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,i++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,i]}}_isCharWordSeparator(e){return 0!==e.getWidth()&&this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){const t=this._bufferService.buffer.getWrappedRangeForLine(e),i={start:{x:0,y:t.first},end:{x:this._bufferService.cols-1,y:t.last}};this._model.selectionStart=[0,t.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=g=s([r(3,f.IBufferService),r(4,f.ICoreService),r(5,h.IMouseService),r(6,f.IOptionsService),r(7,h.IRenderService),r(8,h.ICoreBrowserService)],g)},4725:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(8343);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseService=(0,s.createDecorator)("MouseService"),t.IRenderService=(0,s.createDecorator)("RenderService"),t.ISelectionService=(0,s.createDecorator)("SelectionService"),t.ICharacterJoinerService=(0,s.createDecorator)("CharacterJoinerService"),t.IThemeService=(0,s.createDecorator)("ThemeService")},6731:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=t.DEFAULT_ANSI_COLORS=void 0;const n=i(7239),o=i(8055),a=i(8460),h=i(844),c=i(2585),l=o.css.toColor("#ffffff"),d=o.css.toColor("#000000"),_=o.css.toColor("#ffffff"),u=o.css.toColor("#000000"),f={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[o.css.toColor("#2e3436"),o.css.toColor("#cc0000"),o.css.toColor("#4e9a06"),o.css.toColor("#c4a000"),o.css.toColor("#3465a4"),o.css.toColor("#75507b"),o.css.toColor("#06989a"),o.css.toColor("#d3d7cf"),o.css.toColor("#555753"),o.css.toColor("#ef2929"),o.css.toColor("#8ae234"),o.css.toColor("#fce94f"),o.css.toColor("#729fcf"),o.css.toColor("#ad7fa8"),o.css.toColor("#34e2e2"),o.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const s=t[i/36%6|0],r=t[i/6%6|0],n=t[i%6];e.push({css:o.channels.toCss(s,r,n),rgba:o.channels.toRgba(s,r,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:o.channels.toCss(i,i,i),rgba:o.channels.toRgba(i,i,i)})}return e})());let v=t.ThemeService=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new n.ColorContrastCache,this._halfContrastCache=new n.ColorContrastCache,this._onChangeColors=this.register(new a.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:l,background:d,cursor:_,cursorAccent:u,selectionForeground:void 0,selectionBackgroundTransparent:f,selectionBackgroundOpaque:o.color.blend(d,f),selectionInactiveBackgroundTransparent:f,selectionInactiveBackgroundOpaque:o.color.blend(d,f),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio",(()=>this._contrastCache.clear()))),this.register(this._optionsService.onSpecificOptionChange("theme",(()=>this._setTheme(this._optionsService.rawOptions.theme))))}_setTheme(e={}){const i=this._colors;if(i.foreground=p(e.foreground,l),i.background=p(e.background,d),i.cursor=p(e.cursor,_),i.cursorAccent=p(e.cursorAccent,u),i.selectionBackgroundTransparent=p(e.selectionBackground,f),i.selectionBackgroundOpaque=o.color.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=p(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=o.color.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?p(e.selectionForeground,o.NULL_COLOR):void 0,i.selectionForeground===o.NULL_COLOR&&(i.selectionForeground=void 0),o.color.isOpaque(i.selectionBackgroundTransparent)){const e=.3;i.selectionBackgroundTransparent=o.color.opacity(i.selectionBackgroundTransparent,e)}if(o.color.isOpaque(i.selectionInactiveBackgroundTransparent)){const e=.3;i.selectionInactiveBackgroundTransparent=o.color.opacity(i.selectionInactiveBackgroundTransparent,e)}if(i.ansi=t.DEFAULT_ANSI_COLORS.slice(),i.ansi[0]=p(e.black,t.DEFAULT_ANSI_COLORS[0]),i.ansi[1]=p(e.red,t.DEFAULT_ANSI_COLORS[1]),i.ansi[2]=p(e.green,t.DEFAULT_ANSI_COLORS[2]),i.ansi[3]=p(e.yellow,t.DEFAULT_ANSI_COLORS[3]),i.ansi[4]=p(e.blue,t.DEFAULT_ANSI_COLORS[4]),i.ansi[5]=p(e.magenta,t.DEFAULT_ANSI_COLORS[5]),i.ansi[6]=p(e.cyan,t.DEFAULT_ANSI_COLORS[6]),i.ansi[7]=p(e.white,t.DEFAULT_ANSI_COLORS[7]),i.ansi[8]=p(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),i.ansi[9]=p(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),i.ansi[10]=p(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),i.ansi[11]=p(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),i.ansi[12]=p(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),i.ansi[13]=p(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),i.ansi[14]=p(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),i.ansi[15]=p(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const s=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this.register(new s.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new s.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new s.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(e){if(this._maxLength===e)return;const t=new Array(e);for(let i=0;ithis._length)for(let t=this._length;t=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;tthis._maxLength){const e=this._length+i.length-this._maxLength;this._startIndex+=e,this._length=this._maxLength,this.onTrimEmitter.fire(e)}else this._length+=i.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,i){if(!(t<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+i<0)throw new Error("Cannot shift elements in list beyond index 0");if(i>0){for(let s=t-1;s>=0;s--)this.set(e+s+i,this.get(e+s));const s=e+t+i-this._length;if(s>0)for(this._length+=s;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let s=0;s{Object.defineProperty(t,"__esModule",{value:!0}),t.clone=void 0,t.clone=function e(t,i=5){if("object"!=typeof t)return t;const s=Array.isArray(t)?[]:{};for(const r in t)s[r]=i<=1?t[r]:t[r]&&e(t[r],i-1);return s}},8055:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;const s=i(6114);let r=0,n=0,o=0,a=0;var h,c,l,d,_;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function f(e,t){return e>>0}}(h||(t.channels=h={})),function(e){function t(e,t){return a=Math.round(255*t),[r,n,o]=_.toChannels(e.rgba),{css:h.toCss(r,n,o,a),rgba:h.toRgba(r,n,o,a)}}e.blend=function(e,t){if(a=(255&t.rgba)/255,1===a)return{css:t.css,rgba:t.rgba};const i=t.rgba>>24&255,s=t.rgba>>16&255,c=t.rgba>>8&255,l=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return r=l+Math.round((i-l)*a),n=d+Math.round((s-d)*a),o=_+Math.round((c-_)*a),{css:h.toCss(r,n,o),rgba:h.toRgba(r,n,o)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=_.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return _.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[r,n,o]=_.toChannels(t),{css:h.toCss(r,n,o),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return a=255&e.rgba,t(e,a*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(c||(t.color=c={})),function(e){let t,i;if(!s.isNode){const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",i=t.createLinearGradient(0,0,1,1))}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),_.toColor(r,n,o);case 5:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),a=parseInt(e.slice(4,5).repeat(2),16),_.toColor(r,n,o,a);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const s=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return r=parseInt(s[1]),n=parseInt(s[2]),o=parseInt(s[3]),a=Math.round(255*(void 0===s[5]?1:parseFloat(s[5]))),_.toColor(r,n,o,a);if(!t||!i)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=i,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[r,n,o,a]=t.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:h.toRgba(r,n,o,a),css:e}}}(l||(t.css=l={})),function(e){function t(e,t,i){const s=e/255,r=t/255,n=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(d||(t.rgb=d={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c0||a>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}function i(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c>>0}e.ensureContrastRatio=function(e,s,r){const n=d.relativeLuminance(e>>8),o=d.relativeLuminance(s>>8);if(f(n,o)>8));if(af(n,d.relativeLuminance(t>>8))?o:t}return o}const a=i(e,s,r),h=f(n,d.relativeLuminance(a>>8));if(hf(n,d.relativeLuminance(i>>8))?a:i}return a}},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]},e.toColor=function(e,t,i,s){return{css:h.toCss(e,t,i,s),rgba:h.toRgba(e,t,i,s)}}}(_||(t.rgba=_={})),t.toPaddedHex=u,t.contrastRatio=f},8969:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(844),r=i(2585),n=i(4348),o=i(7866),a=i(744),h=i(7302),c=i(6975),l=i(8460),d=i(1753),_=i(1480),u=i(7994),f=i(9282),v=i(5435),p=i(5981),g=i(2660);let m=!1;class S extends s.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new l.EventEmitter),this._onScroll.event((e=>{var t;null===(t=this._onScrollApi)||void 0===t||t.fire(e.position)}))),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(e){for(const t in e)this.optionsService.options[t]=e[t]}constructor(e){super(),this._windowsWrappingHeuristics=this.register(new s.MutableDisposable),this._onBinary=this.register(new l.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new l.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new l.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new l.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new l.EventEmitter),this._instantiationService=new n.InstantiationService,this.optionsService=this.register(new h.OptionsService(e)),this._instantiationService.setService(r.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(a.BufferService)),this._instantiationService.setService(r.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(r.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(c.CoreService)),this._instantiationService.setService(r.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(d.CoreMouseService)),this._instantiationService.setService(r.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(_.UnicodeService)),this._instantiationService.setService(r.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(u.CharsetService),this._instantiationService.setService(r.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(g.OscLinkService),this._instantiationService.setService(r.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new v.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,l.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,l.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,l.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,l.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom((()=>this.scrollToBottom()))),this.register(this.coreService.onUserInput((()=>this._writeBuffer.handleUserInput()))),this.register(this.optionsService.onMultipleOptionChange(["windowsMode","windowsPty"],(()=>this._handleWindowsPtyOptionChange()))),this.register(this._bufferService.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this.register(this._inputHandler.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this._writeBuffer=this.register(new p.WriteBuffer(((e,t)=>this._inputHandler.parse(e,t)))),this.register((0,l.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=r.LogLevelEnum.WARN&&!m&&(this._logService.warn("writeSync is unreliable and will be removed soon."),m=!0),this._writeBuffer.writeSync(e,t)}resize(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,a.MINIMUM_COLS),t=Math.max(t,a.MINIMUM_ROWS),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t,i){this._bufferService.scrollLines(e,t,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}registerEscHandler(e,t){return this._inputHandler.registerEscHandler(e,t)}registerDcsHandler(e,t){return this._inputHandler.registerDcsHandler(e,t)}registerCsiHandler(e,t){return this._inputHandler.registerCsiHandler(e,t)}registerOscHandler(e,t){return this._inputHandler.registerOscHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.buildNumber&&void 0!==t.buildNumber?e=!!("conpty"===t.backend&&t.buildNumber<21376):this.optionsService.rawOptions.windowsMode&&(e=!0),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},(()=>((0,f.updateWindowsModeWrappedState)(this._bufferService),!1)))),this._windowsWrappingHeuristics.value=(0,s.toDisposable)((()=>{for(const t of e)t.dispose()}))}}}t.CoreTerminal=S},8460:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;tt.fire(e)))}},5435:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;const n=i(2584),o=i(7116),a=i(2015),h=i(844),c=i(482),l=i(8437),d=i(8460),_=i(643),u=i(511),f=i(3734),v=i(2585),p=i(6242),g=i(6351),m=i(5941),S={"(":0,")":1,"*":2,"+":3,"-":1,".":2},C=131072;function b(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}var y;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(y||(t.WindowsOptionsReportType=y={}));let w=0;class E extends h.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,h,_,f,v=new a.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=h,this._coreMouseService=_,this._unicodeService=f,this._parser=v,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new c.StringToUtf32,this._utf8Decoder=new c.Utf8ToUtf32,this._workCell=new u.CellData,this._windowTitle="",this._iconName="",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new d.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new d.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new d.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new d.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new d.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new d.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new d.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new d.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new d.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new d.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new d.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new d.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new d.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new k(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._parser.setCsiHandlerFallback(((e,t)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(e),params:t.toArray()})})),this._parser.setEscHandlerFallback((e=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(e)})})),this._parser.setExecuteHandlerFallback((e=>{this._logService.debug("Unknown EXECUTE code: ",{code:e})})),this._parser.setOscHandlerFallback(((e,t,i)=>{this._logService.debug("Unknown OSC code: ",{identifier:e,action:t,data:i})})),this._parser.setDcsHandlerFallback(((e,t,i)=>{"HOOK"===t&&(i=i.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(e),action:t,payload:i})})),this._parser.setPrintHandler(((e,t,i)=>this.print(e,t,i))),this._parser.registerCsiHandler({final:"@"},(e=>this.insertChars(e))),this._parser.registerCsiHandler({intermediates:" ",final:"@"},(e=>this.scrollLeft(e))),this._parser.registerCsiHandler({final:"A"},(e=>this.cursorUp(e))),this._parser.registerCsiHandler({intermediates:" ",final:"A"},(e=>this.scrollRight(e))),this._parser.registerCsiHandler({final:"B"},(e=>this.cursorDown(e))),this._parser.registerCsiHandler({final:"C"},(e=>this.cursorForward(e))),this._parser.registerCsiHandler({final:"D"},(e=>this.cursorBackward(e))),this._parser.registerCsiHandler({final:"E"},(e=>this.cursorNextLine(e))),this._parser.registerCsiHandler({final:"F"},(e=>this.cursorPrecedingLine(e))),this._parser.registerCsiHandler({final:"G"},(e=>this.cursorCharAbsolute(e))),this._parser.registerCsiHandler({final:"H"},(e=>this.cursorPosition(e))),this._parser.registerCsiHandler({final:"I"},(e=>this.cursorForwardTab(e))),this._parser.registerCsiHandler({final:"J"},(e=>this.eraseInDisplay(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"J"},(e=>this.eraseInDisplay(e,!0))),this._parser.registerCsiHandler({final:"K"},(e=>this.eraseInLine(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"K"},(e=>this.eraseInLine(e,!0))),this._parser.registerCsiHandler({final:"L"},(e=>this.insertLines(e))),this._parser.registerCsiHandler({final:"M"},(e=>this.deleteLines(e))),this._parser.registerCsiHandler({final:"P"},(e=>this.deleteChars(e))),this._parser.registerCsiHandler({final:"S"},(e=>this.scrollUp(e))),this._parser.registerCsiHandler({final:"T"},(e=>this.scrollDown(e))),this._parser.registerCsiHandler({final:"X"},(e=>this.eraseChars(e))),this._parser.registerCsiHandler({final:"Z"},(e=>this.cursorBackwardTab(e))),this._parser.registerCsiHandler({final:"`"},(e=>this.charPosAbsolute(e))),this._parser.registerCsiHandler({final:"a"},(e=>this.hPositionRelative(e))),this._parser.registerCsiHandler({final:"b"},(e=>this.repeatPrecedingCharacter(e))),this._parser.registerCsiHandler({final:"c"},(e=>this.sendDeviceAttributesPrimary(e))),this._parser.registerCsiHandler({prefix:">",final:"c"},(e=>this.sendDeviceAttributesSecondary(e))),this._parser.registerCsiHandler({final:"d"},(e=>this.linePosAbsolute(e))),this._parser.registerCsiHandler({final:"e"},(e=>this.vPositionRelative(e))),this._parser.registerCsiHandler({final:"f"},(e=>this.hVPosition(e))),this._parser.registerCsiHandler({final:"g"},(e=>this.tabClear(e))),this._parser.registerCsiHandler({final:"h"},(e=>this.setMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"h"},(e=>this.setModePrivate(e))),this._parser.registerCsiHandler({final:"l"},(e=>this.resetMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"l"},(e=>this.resetModePrivate(e))),this._parser.registerCsiHandler({final:"m"},(e=>this.charAttributes(e))),this._parser.registerCsiHandler({final:"n"},(e=>this.deviceStatus(e))),this._parser.registerCsiHandler({prefix:"?",final:"n"},(e=>this.deviceStatusPrivate(e))),this._parser.registerCsiHandler({intermediates:"!",final:"p"},(e=>this.softReset(e))),this._parser.registerCsiHandler({intermediates:" ",final:"q"},(e=>this.setCursorStyle(e))),this._parser.registerCsiHandler({final:"r"},(e=>this.setScrollRegion(e))),this._parser.registerCsiHandler({final:"s"},(e=>this.saveCursor(e))),this._parser.registerCsiHandler({final:"t"},(e=>this.windowOptions(e))),this._parser.registerCsiHandler({final:"u"},(e=>this.restoreCursor(e))),this._parser.registerCsiHandler({intermediates:"'",final:"}"},(e=>this.insertColumns(e))),this._parser.registerCsiHandler({intermediates:"'",final:"~"},(e=>this.deleteColumns(e))),this._parser.registerCsiHandler({intermediates:'"',final:"q"},(e=>this.selectProtected(e))),this._parser.registerCsiHandler({intermediates:"$",final:"p"},(e=>this.requestMode(e,!0))),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},(e=>this.requestMode(e,!1))),this._parser.setExecuteHandler(n.C0.BEL,(()=>this.bell())),this._parser.setExecuteHandler(n.C0.LF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.VT,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.FF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.CR,(()=>this.carriageReturn())),this._parser.setExecuteHandler(n.C0.BS,(()=>this.backspace())),this._parser.setExecuteHandler(n.C0.HT,(()=>this.tab())),this._parser.setExecuteHandler(n.C0.SO,(()=>this.shiftOut())),this._parser.setExecuteHandler(n.C0.SI,(()=>this.shiftIn())),this._parser.setExecuteHandler(n.C1.IND,(()=>this.index())),this._parser.setExecuteHandler(n.C1.NEL,(()=>this.nextLine())),this._parser.setExecuteHandler(n.C1.HTS,(()=>this.tabSet())),this._parser.registerOscHandler(0,new p.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new p.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new p.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new p.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new p.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new p.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new p.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new p.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new p.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new p.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new p.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new p.OscHandler((e=>this.restoreCursorColor(e)))),this._parser.registerEscHandler({final:"7"},(()=>this.saveCursor())),this._parser.registerEscHandler({final:"8"},(()=>this.restoreCursor())),this._parser.registerEscHandler({final:"D"},(()=>this.index())),this._parser.registerEscHandler({final:"E"},(()=>this.nextLine())),this._parser.registerEscHandler({final:"H"},(()=>this.tabSet())),this._parser.registerEscHandler({final:"M"},(()=>this.reverseIndex())),this._parser.registerEscHandler({final:"="},(()=>this.keypadApplicationMode())),this._parser.registerEscHandler({final:">"},(()=>this.keypadNumericMode())),this._parser.registerEscHandler({final:"c"},(()=>this.fullReset())),this._parser.registerEscHandler({final:"n"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"o"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"|"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"}"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"~"},(()=>this.setgLevel(1))),this._parser.registerEscHandler({intermediates:"%",final:"@"},(()=>this.selectDefaultCharset())),this._parser.registerEscHandler({intermediates:"%",final:"G"},(()=>this.selectDefaultCharset()));for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},(()=>this.selectCharset("("+e))),this._parser.registerEscHandler({intermediates:")",final:e},(()=>this.selectCharset(")"+e))),this._parser.registerEscHandler({intermediates:"*",final:e},(()=>this.selectCharset("*"+e))),this._parser.registerEscHandler({intermediates:"+",final:e},(()=>this.selectCharset("+"+e))),this._parser.registerEscHandler({intermediates:"-",final:e},(()=>this.selectCharset("-"+e))),this._parser.registerEscHandler({intermediates:".",final:e},(()=>this.selectCharset("."+e))),this._parser.registerEscHandler({intermediates:"/",final:e},(()=>this.selectCharset("/"+e)));this._parser.registerEscHandler({intermediates:"#",final:"8"},(()=>this.screenAlignmentPattern())),this._parser.setErrorHandler((e=>(this._logService.error("Parsing error: ",e),e))),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new g.DcsHandler(((e,t)=>this.requestStatusString(e,t))))}_preserveStack(e,t,i,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=i,this._parseStack.position=s}_logSlowResolvingAsync(e){this._logService.logLevel<=v.LogLevelEnum.WARN&&Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t("#SLOW_TIMEOUT")),5e3)))]).catch((e=>{if("#SLOW_TIMEOUT"!==e)throw e;console.warn("async parser handler taking longer than 5000 ms")}))}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let i,s=this._activeBuffer.x,r=this._activeBuffer.y,n=0;const o=this._parseStack.paused;if(o){if(i=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(i),i;s=this._parseStack.cursorStartX,r=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>C&&(n=this._parseStack.position+C)}if(this._logService.logLevel<=v.LogLevelEnum.DEBUG&&this._logService.debug("parsing data"+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,(e=>String.fromCharCode(e))).join("")}"`),"string"==typeof e?e.split("").map((e=>e.charCodeAt(0))):e),this._parseBuffer.lengthC)for(let t=n;t0&&2===u.getWidth(this._activeBuffer.x-1)&&u.setCellFromCodePoint(this._activeBuffer.x-1,0,1,d.fg,d.bg,d.extended);for(let f=t;f=a)if(h){for(;this._activeBuffer.x=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),u=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)}else if(this._activeBuffer.x=a-1,2===r)continue;if(l&&(u.insertCells(this._activeBuffer.x,r,this._activeBuffer.getNullCell(d),d),2===u.getWidth(a-1)&&u.setCellFromCodePoint(a-1,_.NULL_CELL_CODE,_.NULL_CELL_WIDTH,d.fg,d.bg,d.extended)),u.setCellFromCodePoint(this._activeBuffer.x++,s,r,d.fg,d.bg,d.extended),r>0)for(;--r;)u.setCellFromCodePoint(this._activeBuffer.x++,0,0,d.fg,d.bg,d.extended)}else u.getWidth(this._activeBuffer.x-1)?u.addCodepointToCell(this._activeBuffer.x-1,s):u.addCodepointToCell(this._activeBuffer.x-2,s)}i-t>0&&(u.loadCell(this._activeBuffer.x-1,this._workCell),2===this._workCell.getWidth()||this._workCell.getCode()>65535?this._parser.precedingCodepoint=0:this._workCell.isCombined()?this._parser.precedingCodepoint=this._workCell.getChars().charCodeAt(0):this._parser.precedingCodepoint=this._workCell.content),this._activeBuffer.x0&&0===u.getWidth(this._activeBuffer.x)&&!u.hasContent(this._activeBuffer.x)&&u.setCellFromCodePoint(this._activeBuffer.x,0,1,d.fg,d.bg,d.extended),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return"t"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(e=>!b(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new g.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new p.OscHandler(t))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){var e;if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&(null===(e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y))||void 0===e?void 0:e.isWrapped)){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);e.hasWidth(this._activeBuffer.x)&&!e.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(e=this._bufferService.cols-1){this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(e,t){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)}cursorUp(e){const t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){const t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0}cursorForward(e){return this._moveCursor(e.params[0]||1,0),!0}cursorBackward(e){return this._moveCursor(-(e.params[0]||1),0),!0}cursorNextLine(e){return this.cursorDown(e),this._activeBuffer.x=0,!0}cursorPrecedingLine(e){return this.cursorUp(e),this._activeBuffer.x=0,!0}cursorCharAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0}charPosAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(e){return this._moveCursor(e.params[0]||1,0),!0}linePosAbsolute(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0}vPositionRelative(e){return this._moveCursor(0,e.params[0]||1),!0}hVPosition(e){return this.cursorPosition(e),!0}tabClear(e){const t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){const t=e.params[0];return 1===t&&(this._curAttrData.bg|=536870912),2!==t&&0!==t||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,i,s=!1,r=!1){const n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData(),r),s&&(n.isWrapped=!1)}_resetBufferLine(e,t=!1){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i&&(i.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),i.isWrapped=!1)}eraseInDisplay(e,t=!1){let i;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);i=this._bufferService.cols&&(this._activeBuffer.lines.get(i+1).isWrapped=!1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:for(i=this._bufferService.rows,this._dirtyRowTracker.markDirty(i-1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 3:const e=this._activeBuffer.lines.length-this._bufferService.rows;e>0&&(this._activeBuffer.lines.trimStart(e),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-e,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-e,0),this._onScroll.fire(0))}return!0}eraseInLine(e,t=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,t);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,t)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.y0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent(n.C0.ESC+"[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent(n.C0.ESC+"[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent(n.C0.ESC+"[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent(n.C0.ESC+"[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent(n.C0.ESC+"[>83;40003;0c")),!0}_is(e){return 0===(this._optionsService.rawOptions.termName+"").indexOf(e)}setMode(e){for(let t=0;te?1:2,u=e.params[0];return f=u,v=t?2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(d.convertEol):0:1===u?_(i.applicationCursorKeys):3===u?d.windowOptions.setWinLines?80===h?2:132===h?1:0:0:6===u?_(i.origin):7===u?_(i.wraparound):8===u?3:9===u?_("X10"===s):12===u?_(d.cursorBlink):25===u?_(!o.isCursorHidden):45===u?_(i.reverseWraparound):66===u?_(i.applicationKeypad):67===u?4:1e3===u?_("VT200"===s):1002===u?_("DRAG"===s):1003===u?_("ANY"===s):1004===u?_(i.sendFocus):1005===u?4:1006===u?_("SGR"===r):1015===u?4:1016===u?_("SGR_PIXELS"===r):1048===u?1:47===u||1047===u||1049===u?_(c===l):2004===u?_(i.bracketedPasteMode):0,o.triggerDataEvent(`${n.C0.ESC}[${t?"":"?"}${f};${v}$y`),!0;var f,v}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=f.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-50331904,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,n=0;do{if(s[n+r]=e.params[t+n],e.hasSubParams(t+n)){const i=e.getSubParams(t+n);let o=0;do{5===s[1]&&(r=1),s[n+o+1+r]=i[o]}while(++o=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=l.DEFAULT_ATTR_DATA.fg,e.bg=l.DEFAULT_ATTR_DATA.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(1===e.length&&0===e.params[0])return this._processSGR0(this._curAttrData),!0;const t=e.length;let i;const s=this._curAttrData;for(let r=0;r=30&&i<=37?(s.fg&=-50331904,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-50331904,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-50331904,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-50331904,s.bg|=16777224|i-100):0===i?this._processSGR0(s):1===i?s.fg|=134217728:3===i?s.bg|=67108864:4===i?(s.fg|=268435456,this._processUnderline(e.hasSubParams(r)?e.getSubParams(r)[0]:1,s)):5===i?s.fg|=536870912:7===i?s.fg|=67108864:8===i?s.fg|=1073741824:9===i?s.fg|=2147483648:2===i?s.bg|=134217728:21===i?this._processUnderline(2,s):22===i?(s.fg&=-134217729,s.bg&=-134217729):23===i?s.bg&=-67108865:24===i?(s.fg&=-268435457,this._processUnderline(0,s)):25===i?s.fg&=-536870913:27===i?s.fg&=-67108865:28===i?s.fg&=-1073741825:29===i?s.fg&=2147483647:39===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg):49===i?(s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):38===i||48===i||58===i?r+=this._extractColor(e,r,s):53===i?s.bg|=1073741824:55===i?s.bg&=-1073741825:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):100===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg,s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`);break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[${e};${t}R`)}return!0}deviceStatusPrivate(e){if(6===e.params[0]){const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e};${t}R`)}return!0}softReset(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(e){const t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle="block";break;case 3:case 4:this._optionsService.options.cursorStyle="underline";break;case 5:case 6:this._optionsService.options.cursorStyle="bar"}const i=t%2==1;return this._optionsService.options.cursorBlink=i,!0}setScrollRegion(e){const t=e.params[0]||1;let i;return(e.length<2||(i=e.params[1])>this._bufferService.rows||0===i)&&(i=this._bufferService.rows),i>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=i-1,this._setCursor(0,0)),!0}windowOptions(e){if(!b(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;const t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0}setIconName(e){return this._iconName=e,!0}setOrReportIndexedColor(e){const t=[],i=e.split(";");for(;i.length>1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e);if(L(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,m.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.split(";");return!(t.length<2)&&(t[1]?this._createHyperlink(t[0],t[1]):!t[0]&&this._finishHyperlink())}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();const i=e.split(":");let s;const r=i.findIndex((e=>e.startsWith("id=")));return-1!==r&&(s=i[r].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:t}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,t){const i=e.split(";");for(let e=0;e=this._specialColors.length);++e,++t)if("?"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,m.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){const e=new u.CellData;e.content=1<<22|"E".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t(this._coreService.triggerDataEvent(`${n.C0.ESC}${e}${n.C0.ESC}\\`),!0))('"q'===e?`P1$r${this._curAttrData.isProtected()?1:0}"q`:'"p'===e?'P1$r61;1"p':"r"===e?`P1$r${i.scrollTop+1};${i.scrollBottom+1}r`:"m"===e?"P1$r0m":" q"===e?`P1$r${{block:2,underline:4,bar:6}[s.cursorStyle]-(s.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}}t.InputHandler=E;let k=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){ethis.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(w=e,e=t,t=w),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function L(e){return 0<=e&&e<256}k=s([r(0,v.IBufferService)],k)},844:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||(null===(t=this._value)||void 0===t||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,null===(e=this._value)||void 0===e||e.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},1505:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,n){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,n)}get(e,t,i,s){var r;return null===(r=this._data.get(e,t))||void 0===r?void 0:r.get(i,s)}clear(){this._data.clear()}}},6114:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"==typeof navigator;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},6106:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;let i=0;t.SortedList=class{constructor(e){this._getKey=e,this._array=[]}clear(){this._array.length=0}insert(e){0!==this._array.length?(i=this._search(this._getKey(e)),this._array.splice(i,0,e)):this._array.push(e)}delete(e){if(0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(i=this._search(t),-1===i)return!1;if(this._getKey(this._array[i])!==t)return!1;do{if(this._array[i]===e)return this._array.splice(i,1),!0}while(++i=this._array.length)&&this._getKey(this._array[i])===e))do{yield this._array[i]}while(++i=this._array.length)&&this._getKey(this._array[i])===e))do{t(this._array[i])}while(++i=t;){let s=t+i>>1;const r=this._getKey(this._array[s]);if(r>e)i=s-1;else{if(!(r0&&this._getKey(this._array[s-1])===e;)s--;return s}t=s+1}}return t}}},7226:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(6114);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._ir)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class n extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=n,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:n,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},9282:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateWindowsModeWrappedState=void 0;const s=i(643);t.updateWindowsModeWrappedState=function(e){const t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),i=null==t?void 0:t.get(e.cols-1),r=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);r&&i&&(r.isWrapped=i[s.CHAR_DATA_CODE_INDEX]!==s.NULL_CELL_CODE&&i[s.CHAR_DATA_CODE_INDEX]!==s.WHITESPACE_CELL_CODE)}},3734:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},9092:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(6349),r=i(7226),n=i(3734),o=i(8437),a=i(4634),h=i(511),c=i(643),l=i(4863),d=i(7116);t.MAX_BUFFER_SIZE=4294967295,t.Buffer=class{constructor(e,t,i){this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=o.DEFAULT_ATTR_DATA.clone(),this.savedCharset=d.DEFAULT_CHARSET,this.markers=[],this._nullCell=h.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=h.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new r.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new n.ExtendedAttrs),this._nullCell}getWhitespaceCell(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new n.ExtendedAttrs),this._whitespaceCell}getBlankLine(e,t){return new o.BufferLine(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const e=this.ybase+this.y-this.ydisp;return e>=0&&et.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:i}fillViewportRows(e){if(0===this.lines.length){void 0===e&&(e=o.DEFAULT_ATTR_DATA);let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA);let s=0;const r=this._getCorrectBufferLength(t);if(r>this.lines.maxLength&&(this.lines.maxLength=r),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+n+1?(this.ybase--,n++,this.ydisp>0&&this.ydisp--):this.lines.push(new o.BufferLine(e,i)));else for(let e=this._rows;e>t;e--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(r0&&(this.lines.trimStart(e),this.ybase=Math.max(this.ybase-e,0),this.ydisp=Math.max(this.ydisp-e,0),this.savedY=Math.max(this.savedY-e,0)),this.lines.maxLength=r}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),n&&(this.y+=n),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(let t=0;t.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue((()=>this._batchedMemoryCleanup())))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition100)return!0;return e}get _isReflowEnabled(){const e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&"conpty"===e.backend&&e.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=(0,a.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(o.DEFAULT_ATTR_DATA));if(i.length>0){const s=(0,a.reflowLargerCreateNewLayout)(this.lines,i);(0,a.reflowLargerApplyNewLayout)(this.lines,s.layout),this._reflowLargerAdjustViewport(e,t,s.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(o.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length=0;n--){let h=this.lines.get(n);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;const c=[h];for(;h.isWrapped&&n>0;)h=this.lines.get(--n),c.unshift(h);const l=this.ybase+this.y;if(l>=n&&l0&&(s.push({start:n+c.length+r,newLines:v}),r+=v.length),c.push(...v);let p=_.length-1,g=_[p];0===g&&(p--,g=_[p]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[p])break;if(c[p].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(p--,g=_[p]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,a.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=0;c--)if(a&&a.start>n+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(c--,a.newLines[e]);c++,e.push({index:n+1,amount:a.newLines.length}),h+=a.newLines.length,a=s[++o]}else this.lines.set(c,t[n--]);let c=0;for(let t=e.length-1;t>=0;t--)e[t].index+=c,this.lines.onInsertEmitter.fire(e[t]),c+=e[t].amount;const l=Math.max(0,i+r-this.lines.maxLength);l>0&&this.lines.onTrimEmitter.fire(l)}}translateBufferLineToString(e,t,i=0,s){const r=this.lines.get(e);return r?r.translateToString(t,i,s):""}getWrappedRangeForLine(e){let t=e,i=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;i+10;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t{t.line-=e,t.line<0&&t.dispose()}))),t.register(this.lines.onInsert((e=>{t.line>=e.index&&(t.line+=e.amount)}))),t.register(this.lines.onDelete((e=>{t.line>=e.index&&t.linee.index&&(t.line-=e.amount)}))),t.register(t.onDispose((()=>this._removeMarker(t)))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}}},8437:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(3734),r=i(511),n=i(643),o=i(482);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;class h{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);const s=t||r.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]);for(let t=0;t>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(e){return this._data[3*e+0]>>22}hasWidth(e){return 12582912&this._data[3*e+0]}getFg(e){return this._data[3*e+1]}getBg(e){return this._data[3*e+2]}hasContent(e){return 4194303&this._data[3*e+0]}getCodePoint(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t}isCombined(e){return 2097152&this._data[3*e+0]}getString(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,o.stringFromCodePoint)(2097151&t):""}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,t){return a=3*e,t.content=this._data[a+0],t.fg=this._data[a+1],t.bg=this._data[a+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t}setCell(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg}setCellFromCodePoint(e,t,i,s,r,n){268435456&r&&(this._extendedAttrs[e]=n),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s,this._data[3*e+2]=r}addCodepointToCell(e,t){let i=this._data[3*e+0];2097152&i?this._combined[e]+=(0,o.stringFromCodePoint)(t):(2097151&i?(this._combined[e]=(0,o.stringFromCodePoint)(2097151&i)+(0,o.stringFromCodePoint)(t),i&=-2097152,i|=2097152):i=t|1<<22,this._data[3*e+0]=i)}insertCells(e,t,i,n){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs),t=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;sthis.length){if(this._data.buffer.byteLength>=4*i)this._data=new Uint32Array(this._data.buffer,0,i);else{const e=new Uint32Array(i);e.set(this._data),this._data=e}for(let i=this.length;i=e&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0}getNoBgTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0]||50331648&this._data[3*e+2])return e+(this._data[3*e+0]>>22);return 0}copyCellsFrom(e,t,i,s,r){const n=e._data;if(r)for(let r=s-1;r>=0;r--){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}else for(let r=0;r=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e=!1,t=0,i=this.length){e&&(i=Math.min(i,this.getTrimmedLength()));let s="";for(;t>22||1}return s}}t.BufferLine=h},4841:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getRangeLength=void 0,t.getRangeLength=function(e,t){if(e.start.y>e.end.y)throw new Error(`Buffer range end (${e.end.x}, ${e.end.y}) cannot be before start (${e.start.x}, ${e.start.y})`);return t*(e.end.y-e.start.y)+(e.end.x-e.start.x+1)}},4634:(e,t)=>{function i(e,t,i){if(t===e.length-1)return e[t].getTrimmedLength();const s=!e[t].hasContent(i-1)&&1===e[t].getWidth(i-1),r=2===e[t+1].getWidth(0);return s&&r?i-1:i}Object.defineProperty(t,"__esModule",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,s,r,n){const o=[];for(let a=0;a=a&&r0&&(e>d||0===l[e].getTrimmedLength());e--)v++;v>0&&(o.push(a+l.length-v),o.push(v)),a+=l.length-1}return o},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],n=0;for(let o=0;oi(e,r,t))).reduce(((e,t)=>e+t));let o=0,a=0,h=0;for(;hc&&(o-=c,a++);const l=2===e[a].getWidth(o-1);l&&o--;const d=l?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},5295:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(8460),r=i(844),n=i(9092);class o extends r.Disposable{constructor(e,t){super(),this._optionsService=e,this._bufferService=t,this._onBufferActivate=this.register(new s.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.resize(this._bufferService.cols,this._bufferService.rows)))),this.register(this._optionsService.onSpecificOptionChange("tabStopWidth",(()=>this.setupTabStops())))}reset(){this._normal=new n.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new n.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(e,t){this._normal.resize(e,t),this._alt.resize(e,t),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}}t.BufferSet=o},511:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(482),r=i(643),n=i(3734);class o extends n.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new n.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new o;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=o},643:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},4863:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(8460),r=i(844);class n{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=n._nextId++,this._onDispose=this.register(new s.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,r.disposeArray)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=n,n._nextId=1},7116:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={"`":"◆",a:"▒",b:"␉",c:"␌",d:"␍",e:"␊",f:"°",g:"±",h:"␤",i:"␋",j:"┘",k:"┐",l:"┌",m:"└",n:"┼",o:"⎺",p:"⎻",q:"─",r:"⎼",s:"⎽",t:"├",u:"┤",v:"┴",w:"┬",x:"│",y:"≤",z:"≥","{":"π","|":"≠","}":"£","~":"·"},t.CHARSETS.A={"#":"£"},t.CHARSETS.B=void 0,t.CHARSETS[4]={"#":"£","@":"¾","[":"ij","\\":"½","]":"|","{":"¨","|":"f","}":"¼","~":"´"},t.CHARSETS.C=t.CHARSETS[5]={"[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS.R={"#":"£","@":"à","[":"°","\\":"ç","]":"§","{":"é","|":"ù","}":"è","~":"¨"},t.CHARSETS.Q={"@":"à","[":"â","\\":"ç","]":"ê","^":"î","`":"ô","{":"é","|":"ù","}":"è","~":"û"},t.CHARSETS.K={"@":"§","[":"Ä","\\":"Ö","]":"Ü","{":"ä","|":"ö","}":"ü","~":"ß"},t.CHARSETS.Y={"#":"£","@":"§","[":"°","\\":"ç","]":"é","`":"ù","{":"à","|":"ò","}":"è","~":"ì"},t.CHARSETS.E=t.CHARSETS[6]={"@":"Ä","[":"Æ","\\":"Ø","]":"Å","^":"Ü","`":"ä","{":"æ","|":"ø","}":"å","~":"ü"},t.CHARSETS.Z={"#":"£","@":"§","[":"¡","\\":"Ñ","]":"¿","{":"°","|":"ñ","}":"ç"},t.CHARSETS.H=t.CHARSETS[7]={"@":"É","[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},2584:(e,t)=>{var i,s,r;Object.defineProperty(t,"__esModule",{value:!0}),t.C1_ESCAPED=t.C1=t.C0=void 0,function(e){e.NUL="\0",e.SOH="",e.STX="",e.ETX="",e.EOT="",e.ENQ="",e.ACK="",e.BEL="",e.BS="\b",e.HT="\t",e.LF="\n",e.VT="\v",e.FF="\f",e.CR="\r",e.SO="",e.SI="",e.DLE="",e.DC1="",e.DC2="",e.DC3="",e.DC4="",e.NAK="",e.SYN="",e.ETB="",e.CAN="",e.EM="",e.SUB="",e.ESC="",e.FS="",e.GS="",e.RS="",e.US="",e.SP=" ",e.DEL=""}(i||(t.C0=i={})),function(e){e.PAD="€",e.HOP="",e.BPH="‚",e.NBH="ƒ",e.IND="„",e.NEL="…",e.SSA="†",e.ESA="‡",e.HTS="ˆ",e.HTJ="‰",e.VTS="Š",e.PLD="‹",e.PLU="Œ",e.RI="",e.SS2="Ž",e.SS3="",e.DCS="",e.PU1="‘",e.PU2="’",e.STS="“",e.CCH="”",e.MW="•",e.SPA="–",e.EPA="—",e.SOS="˜",e.SGCI="™",e.SCI="š",e.CSI="›",e.ST="œ",e.OSC="",e.PM="ž",e.APC="Ÿ"}(s||(t.C1=s={})),function(e){e.ST=`${i.ESC}\\`}(r||(t.C1_ESCAPED=r={}))},7399:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=void 0;const s=i(2584),r={48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};t.evaluateKeyboardEvent=function(e,t,i,n){const o={type:0,cancel:!1,key:void 0},a=(e.shiftKey?1:0)|(e.altKey?2:0)|(e.ctrlKey?4:0)|(e.metaKey?8:0);switch(e.keyCode){case 0:"UIKeyInputUpArrow"===e.key?o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A":"UIKeyInputLeftArrow"===e.key?o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D":"UIKeyInputRightArrow"===e.key?o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C":"UIKeyInputDownArrow"===e.key&&(o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B");break;case 8:if(e.altKey){o.key=s.C0.ESC+s.C0.DEL;break}o.key=s.C0.DEL;break;case 9:if(e.shiftKey){o.key=s.C0.ESC+"[Z";break}o.key=s.C0.HT,o.cancel=!0;break;case 13:o.key=e.altKey?s.C0.ESC+s.C0.CR:s.C0.CR,o.cancel=!0;break;case 27:o.key=s.C0.ESC,e.altKey&&(o.key=s.C0.ESC+s.C0.ESC),o.cancel=!0;break;case 37:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"D",o.key===s.C0.ESC+"[1;3D"&&(o.key=s.C0.ESC+(i?"b":"[1;5D"))):o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D";break;case 39:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"C",o.key===s.C0.ESC+"[1;3C"&&(o.key=s.C0.ESC+(i?"f":"[1;5C"))):o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C";break;case 38:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"A",i||o.key!==s.C0.ESC+"[1;3A"||(o.key=s.C0.ESC+"[1;5A")):o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A";break;case 40:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"B",i||o.key!==s.C0.ESC+"[1;3B"||(o.key=s.C0.ESC+"[1;5B")):o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B";break;case 45:e.shiftKey||e.ctrlKey||(o.key=s.C0.ESC+"[2~");break;case 46:o.key=a?s.C0.ESC+"[3;"+(a+1)+"~":s.C0.ESC+"[3~";break;case 36:o.key=a?s.C0.ESC+"[1;"+(a+1)+"H":t?s.C0.ESC+"OH":s.C0.ESC+"[H";break;case 35:o.key=a?s.C0.ESC+"[1;"+(a+1)+"F":t?s.C0.ESC+"OF":s.C0.ESC+"[F";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key=s.C0.ESC+"[5;"+(a+1)+"~":o.key=s.C0.ESC+"[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key=s.C0.ESC+"[6;"+(a+1)+"~":o.key=s.C0.ESC+"[6~";break;case 112:o.key=a?s.C0.ESC+"[1;"+(a+1)+"P":s.C0.ESC+"OP";break;case 113:o.key=a?s.C0.ESC+"[1;"+(a+1)+"Q":s.C0.ESC+"OQ";break;case 114:o.key=a?s.C0.ESC+"[1;"+(a+1)+"R":s.C0.ESC+"OR";break;case 115:o.key=a?s.C0.ESC+"[1;"+(a+1)+"S":s.C0.ESC+"OS";break;case 116:o.key=a?s.C0.ESC+"[15;"+(a+1)+"~":s.C0.ESC+"[15~";break;case 117:o.key=a?s.C0.ESC+"[17;"+(a+1)+"~":s.C0.ESC+"[17~";break;case 118:o.key=a?s.C0.ESC+"[18;"+(a+1)+"~":s.C0.ESC+"[18~";break;case 119:o.key=a?s.C0.ESC+"[19;"+(a+1)+"~":s.C0.ESC+"[19~";break;case 120:o.key=a?s.C0.ESC+"[20;"+(a+1)+"~":s.C0.ESC+"[20~";break;case 121:o.key=a?s.C0.ESC+"[21;"+(a+1)+"~":s.C0.ESC+"[21~";break;case 122:o.key=a?s.C0.ESC+"[23;"+(a+1)+"~":s.C0.ESC+"[23~";break;case 123:o.key=a?s.C0.ESC+"[24;"+(a+1)+"~":s.C0.ESC+"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(i&&!n||!e.altKey||e.metaKey)!i||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey?e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length?o.key=e.key:e.key&&e.ctrlKey&&("_"===e.key&&(o.key=s.C0.US),"@"===e.key&&(o.key=s.C0.NUL)):65===e.keyCode&&(o.type=1);else{const t=r[e.keyCode],i=null==t?void 0:t[e.shiftKey?1:0];if(i)o.key=s.C0.ESC+i;else if(e.keyCode>=65&&e.keyCode<=90){const t=e.ctrlKey?e.keyCode-64:e.keyCode+32;let i=String.fromCharCode(t);e.shiftKey&&(i=i.toUpperCase()),o.key=s.C0.ESC+i}else if(32===e.keyCode)o.key=s.C0.ESC+(e.ctrlKey?s.C0.NUL:" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=s.C0.ESC+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key=s.C0.NUL:e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key=s.C0.DEL:219===e.keyCode?o.key=s.C0.ESC:220===e.keyCode?o.key=s.C0.FS:221===e.keyCode&&(o.key=s.C0.GS)}return o}},482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let n=r;n=i)return this._interim=r,s;const o=e.charCodeAt(n);56320<=o&&o<=57343?t[s++]=1024*(r-55296)+o-56320+65536:(t[s++]=r,t[s++]=o)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,n,o,a=0,h=0,c=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let n,o=0;for(;(n=63&this.interim[++o])&&o<4;)r<<=6,r|=n;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=h-o;for(;c=i)return 0;if(n=e[c++],128!=(192&n)){c--,s=!0;break}this.interim[o++]=n,r<<=6,r|=63&n}s||(2===h?r<128?c--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const l=i-4;let d=c;for(;d=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&n,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=n,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&n)<<6|63&o,h<65536||h>1114111)continue;t[a++]=h}}return a}}},225:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const i=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],s=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let r;t.UnicodeV6=class{constructor(){if(this.version="6",!r){r=new Uint8Array(65536),r.fill(1),r[0]=0,r.fill(0,1,32),r.fill(0,127,160),r.fill(2,4352,4448),r[9001]=2,r[9002]=2,r.fill(2,11904,42192),r[12351]=1,r.fill(2,44032,55204),r.fill(2,63744,64256),r.fill(2,65040,65050),r.fill(2,65072,65136),r.fill(2,65280,65377),r.fill(2,65504,65511);for(let e=0;et[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e=131072&&e<=196605||e>=196608&&e<=262141?2:1}}},5981:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new s.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(e,t){if(void 0!==t&&this._syncCalls>t)return void(this._syncCalls=0);if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let i;for(this._isSyncWriting=!0;i=this._writeBuffer.shift();){this._action(i);const e=this._callbacks.shift();e&&e()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(this._pendingData>5e7)throw new Error("write data discarded, use flow control to avoid losing data");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),void this._innerWrite();setTimeout((()=>this._innerWrite()))}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}_innerWrite(e=0,t=!0){const i=e||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>Date.now()-i>=12?setTimeout((()=>this._innerWrite(0,e))):this._innerWrite(i,e);return void s.catch((e=>(queueMicrotask((()=>{throw e})),Promise.resolve(!1)))).then(e)}const r=this._callbacks[this._bufferOffset];if(r&&r(),this._bufferOffset++,this._pendingData-=e.length,Date.now()-i>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((()=>this._innerWrite()))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},5941:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.toRgbString=t.parseColor=void 0;const i=/^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/,s=/^[\da-f]+$/;function r(e,t){const i=e.toString(16),s=i.length<2?"0"+i:i;switch(t){case 4:return i[0];case 8:return s;case 12:return(s+s).slice(0,3);default:return s+s}}t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(0===t.indexOf("rgb:")){t=t.slice(4);const e=i.exec(t);if(e){const t=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/t*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/t*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/t*255)]}}else if(0===t.indexOf("#")&&(t=t.slice(1),s.exec(t)&&[3,6,9,12].includes(t.length))){const e=t.length/3,i=[0,0,0];for(let s=0;s<3;++s){const r=parseInt(t.slice(e*s,e*s+e),16);i[s]=1===e?r<<4:2===e?r:3===e?r>>4:r>>8}return i}},t.toRgbString=function(e,t=16){const[i,s,n]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(n,t)}`}},5770:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},6351:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(482),r=i(8742),n=i(5770),o=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=o}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}reset(){if(this._active.length)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=o,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||o,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].hook(t);else this._handlerFb(this._ident,"HOOK",t)}put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._ident,"PUT",(0,s.utf32ToString)(e,t,i))}unhook(e,t=!0){if(this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].unhook(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._ident,"UNHOOK",e);this._active=o,this._ident=0}};const a=new r.Params;a.addParam(0),t.DcsHandler=class{constructor(e){this._handler=e,this._data="",this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,s.utf32ToString)(e,t,i),this._data.length>n.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data,this._params),t instanceof Promise))return t.then((e=>(this._params=a,this._data="",this._hitLimit=!1,e)));return this._params=a,this._data="",this._hitLimit=!1,t}}},2015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(844),r=i(8742),n=i(6242),o=i(6351);class a{constructor(e){this.table=new Uint8Array(e)}setDefault(e,t){this.table.fill(e<<4|t)}add(e,t,i,s){this.table[t<<8|e]=i<<4|s}addMany(e,t,i,s){for(let r=0;rt)),i=(e,i)=>t.slice(e,i),s=i(32,127),r=i(0,24);r.push(25),r.push.apply(r,i(28,32));const n=i(0,14);let o;for(o in e.setDefault(1,0),e.addMany(s,0,2,0),n)e.addMany([24,26,153,154],o,3,0),e.addMany(i(128,144),o,3,0),e.addMany(i(144,152),o,3,0),e.add(156,o,0,0),e.add(27,o,11,1),e.add(157,o,4,8),e.addMany([152,158,159],o,0,7),e.add(155,o,11,3),e.add(144,o,11,9);return e.addMany(r,0,3,0),e.addMany(r,1,3,1),e.add(127,1,0,1),e.addMany(r,8,0,8),e.addMany(r,3,3,3),e.add(127,3,0,3),e.addMany(r,4,3,4),e.add(127,4,0,4),e.addMany(r,6,3,6),e.addMany(r,5,3,5),e.add(127,5,0,5),e.addMany(r,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(s,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(i(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(s,7,0,7),e.addMany(r,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(i(64,127),3,7,0),e.addMany(i(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(i(48,60),4,8,4),e.addMany(i(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(i(32,64),6,0,6),e.add(127,6,0,6),e.addMany(i(64,127),6,0,0),e.addMany(i(32,48),3,9,5),e.addMany(i(32,48),5,9,5),e.addMany(i(48,64),5,0,6),e.addMany(i(64,127),5,7,0),e.addMany(i(32,48),4,9,5),e.addMany(i(32,48),1,9,2),e.addMany(i(32,48),2,9,2),e.addMany(i(48,127),2,10,0),e.addMany(i(48,80),1,10,0),e.addMany(i(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(i(96,127),1,10,0),e.add(80,1,11,9),e.addMany(r,9,0,9),e.add(127,9,0,9),e.addMany(i(28,32),9,0,9),e.addMany(i(32,48),9,9,12),e.addMany(i(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(r,11,0,11),e.addMany(i(32,128),11,0,11),e.addMany(i(28,32),11,0,11),e.addMany(r,10,0,10),e.add(127,10,0,10),e.addMany(i(28,32),10,0,10),e.addMany(i(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(i(32,48),10,9,12),e.addMany(r,12,0,12),e.add(127,12,0,12),e.addMany(i(28,32),12,0,12),e.addMany(i(32,48),12,9,12),e.addMany(i(48,64),12,0,11),e.addMany(i(64,127),12,12,13),e.addMany(i(64,127),10,12,13),e.addMany(i(64,127),9,12,13),e.addMany(r,13,13,13),e.addMany(s,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(h,0,2,0),e.add(h,8,5,8),e.add(h,6,0,6),e.add(h,11,0,11),e.add(h,13,13,13),e}();class c extends s.Disposable{constructor(e=t.VT500_TRANSITION_TABLE){super(),this._transitions=e,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new r.Params,this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,this._printHandlerFb=(e,t,i)=>{},this._executeHandlerFb=e=>{},this._csiHandlerFb=(e,t)=>{},this._escHandlerFb=e=>{},this._errorHandlerFb=e=>e,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,s.toDisposable)((()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)}))),this._oscParser=this.register(new n.OscParser),this._dcsParser=this.register(new o.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},(()=>!0))}_identifier(e,t=[64,126]){let i=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(i=e.prefix.charCodeAt(0),i&&60>i||i>63)throw new Error("prefix must be in range 0x3c .. 0x3f")}if(e.intermediates){if(e.intermediates.length>2)throw new Error("only two bytes as intermediates are supported");for(let t=0;ts||s>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");i<<=8,i|=s}}if(1!==e.final.length)throw new Error("final must be a single byte");const s=e.final.charCodeAt(0);if(t[0]>s||s>t[1])throw new Error(`final must be in range ${t[0]} .. ${t[1]}`);return i<<=8,i|=s,i}identToString(e){const t=[];for(;e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){const i=this._identifier(e,[48,126]);void 0===this._escHandlers[i]&&(this._escHandlers[i]=[]);const s=this._escHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearEscHandler(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]}setEscHandlerFallback(e){this._escHandlerFb=e}setExecuteHandler(e,t){this._executeHandlers[e.charCodeAt(0)]=t}clearExecuteHandler(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);void 0===this._csiHandlers[i]&&(this._csiHandlers[i]=[]);const s=this._csiHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,t){return this._oscParser.registerHandler(e,t)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,i,s,r){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=i,this._parseStack.transition=s,this._parseStack.chunkPos=r}parse(e,t,i){let s,r=0,n=0,o=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,o=this._parseStack.chunkPos+1;else{if(void 0===i||1===this._parseStack.state)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");const t=this._parseStack.handlers;let n=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](this._params),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 4:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 6:if(r=e[this._parseStack.chunkPos],s=this._dcsParser.unhook(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(r=e[this._parseStack.chunkPos],s=this._oscParser.end(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,o=this._parseStack.chunkPos+1,this.precedingCodepoint=0,this.currentState=15&this._parseStack.transition}for(let i=o;i>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=0&&(s=o[a](this._params),!0!==s);a--)if(s instanceof Promise)return this._preserveStack(3,o,a,n,i),s;a<0&&this._csiHandlerFb(this._collect<<8|r,this._params),this.precedingCodepoint=0;break;case 8:do{switch(r){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(r-48)}}while(++i47&&r<60);i--;break;case 9:this._collect<<=8,this._collect|=r;break;case 10:const c=this._escHandlers[this._collect<<8|r];let l=c?c.length-1:-1;for(;l>=0&&(s=c[l](),!0!==s);l--)if(s instanceof Promise)return this._preserveStack(4,c,l,n,i),s;l<0&&this._escHandlerFb(this._collect<<8|r),this.precedingCodepoint=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|r,this._params);break;case 13:for(let s=i+1;;++s)if(s>=t||24===(r=e[s])||26===r||27===r||r>127&&r=t||(r=e[s])<32||r>127&&r{Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(5770),r=i(482),n=[];t.OscParser=class{constructor(){this._state=0,this._active=n,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}reset(){if(2===this._state)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=n,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||n,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,"START")}_put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._id,"PUT",(0,r.utf32ToString)(e,t,i))}start(){this.reset(),this._state=1}put(e,t,i){if(3!==this._state){if(1===this._state)for(;t0&&this._put(e,t,i)}}end(e,t=!0){if(0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].end(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._id,"END",e);this._active=n,this._id=-1,this._state=0}}},t.OscHandler=class{constructor(e){this._handler=e,this._data="",this._hitLimit=!1}start(){this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,r.utf32ToString)(e,t,i),this._data.length>s.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data),t instanceof Promise))return t.then((e=>(this._data="",this._hitLimit=!1,e)));return this._data="",this._hitLimit=!1,t}}},8742:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;const i=2147483647;class s{static fromArray(e){const t=new s;if(!e.length)return t;for(let i=Array.isArray(e[0])?1:0;i256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const e=new s(this.maxLength,this.maxSubParamsLength);return e.params.set(this.params),e.length=this.length,e._subParams.set(this._subParams),e._subParamsLength=this._subParamsLength,e._subParamsIdx.set(this._subParamsIdx),e._rejectDigits=this._rejectDigits,e._rejectSubDigits=this._rejectSubDigits,e._digitIsSub=this._digitIsSub,e}toArray(){const e=[];for(let t=0;t>8,s=255&this._subParamsIdx[t];s-i>0&&e.push(Array.prototype.slice.call(this._subParams,i,s))}return e}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>i?i:e}}addSubParam(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParams[this._subParamsLength++]=e>i?i:e,this._subParamsIdx[this.length-1]++}}hasSubParams(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0}getSubParams(e){const t=this._subParamsIdx[e]>>8,i=255&this._subParamsIdx[e];return i-t>0?this._subParams.subarray(t,i):null}getSubParamsAll(){const e={};for(let t=0;t>8,s=255&this._subParamsIdx[t];s-i>0&&(e[t]=this._subParams.slice(i,s))}return e}addDigit(e){let t;if(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const s=this._digitIsSub?this._subParams:this.params,r=s[t-1];s[t-1]=~r?Math.min(10*r+e,i):e}}t.Params=s},5741:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferApiView=void 0;const s=i(3785),r=i(511);t.BufferApiView=class{constructor(e,t){this._buffer=e,this.type=t}init(e){return this._buffer=e,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(e){const t=this._buffer.lines.get(e);if(t)return new s.BufferLineApiView(t)}getNullCell(){return new r.CellData}}},3785:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLineApiView=void 0;const s=i(511);t.BufferLineApiView=class{constructor(e){this._line=e}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new s.CellData)}translateToString(e,t,i){return this._line.translateToString(e,t,i)}}},8285:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(8771),r=i(8460),n=i(844);class o extends n.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this.register(new r.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new s.BufferApiView(this._core.buffers.normal,"normal"),this._alternate=new s.BufferApiView(this._core.buffers.alt,"alternate"),this._core.buffers.onBufferActivate((()=>this._onBufferChange.fire(this.active)))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error("Active buffer is neither normal nor alternate")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}t.BufferNamespaceApi=o},7975:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ParserApi=void 0,t.ParserApi=class{constructor(e){this._core=e}registerCsiHandler(e,t){return this._core.registerCsiHandler(e,(e=>t(e.toArray())))}addCsiHandler(e,t){return this.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._core.registerDcsHandler(e,((e,i)=>t(e,i.toArray())))}addDcsHandler(e,t){return this.registerDcsHandler(e,t)}registerEscHandler(e,t){return this._core.registerEscHandler(e,t)}addEscHandler(e,t){return this.registerEscHandler(e,t)}registerOscHandler(e,t){return this._core.registerOscHandler(e,t)}addOscHandler(e,t){return this.registerOscHandler(e,t)}}},7090:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeApi=void 0,t.UnicodeApi=class{constructor(e){this._core=e}register(e){this._core.unicodeService.register(e)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(e){this._core.unicodeService.activeVersion=e}}},744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;const n=i(8460),o=i(844),a=i(5295),h=i(2585);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;let c=t.BufferService=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e){super(),this.isUserScrolling=!1,this._onResize=this.register(new n.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new n.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,t.MINIMUM_COLS),this.rows=Math.max(e.rawOptions.rows||0,t.MINIMUM_ROWS),this.buffers=this.register(new a.BufferSet(e,this))}resize(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){const i=this.buffer;let s;s=this._cachedBlankLine,s&&s.length===this.cols&&s.getFg(0)===e.fg&&s.getBg(0)===e.bg||(s=i.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;const r=i.ybase+i.scrollTop,n=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;n===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(n+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=n-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(n,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t,i){const s=this.buffer;if(e<0){if(0===s.ydisp)return;this.isUserScrolling=!0}else e+s.ydisp>=s.ybase&&(this.isUserScrolling=!1);const r=s.ydisp;s.ydisp=Math.max(Math.min(s.ydisp+e,s.ybase),0),r!==s.ydisp&&(t||this._onScroll.fire(s.ydisp))}};t.BufferService=c=s([r(0,h.IOptionsService)],c)},7994:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(e){this.glevel=e,this.charset=this._charsets[e]}setgCharset(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)}}},1753:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreMouseService=void 0;const n=i(2585),o=i(8460),a=i(844),h={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:e=>4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)},VT200:{events:19,restrict:e=>32!==e.action},DRAG:{events:23,restrict:e=>32!==e.action||3!==e.button},ANY:{events:31,restrict:e=>!0}};function c(e,t){let i=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(i|=64,i|=e.action):(i|=3&e.button,4&e.button&&(i|=64),8&e.button&&(i|=128),32===e.action?i|=32:0!==e.action||t||(i|=3)),i}const l=String.fromCharCode,d={DEFAULT:e=>{const t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${c(e,!0)};${e.x};${e.y}${t}`}};let _=t.CoreMouseService=class extends a.Disposable{constructor(e,t){super(),this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._lastEvent=null,this._onProtocolChange=this.register(new o.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(h))this.addProtocol(e,h[e]);for(const e of Object.keys(d))this.addEncoding(e,d[e]);this.reset()}addProtocol(e,t){this._protocols[e]=t}addEncoding(e,t){this._encodings[e]=t}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return 0!==this._protocols[this._activeProtocol].events}set activeProtocol(e){if(!this._protocols[e])throw new Error(`unknown protocol "${e}"`);this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(e){if(!this._encodings[e])throw new Error(`unknown encoding "${e}"`);this._activeEncoding=e}reset(){this.activeProtocol="NONE",this.activeEncoding="DEFAULT",this._lastEvent=null}triggerMouseEvent(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._equalEvents(this._lastEvent,e,"SGR_PIXELS"===this._activeEncoding))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;const t=this._encodings[this._activeEncoding](e);return t&&("DEFAULT"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0}explainEvents(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}}_equalEvents(e,t,i){if(i){if(e.x!==t.x)return!1;if(e.y!==t.y)return!1}else{if(e.col!==t.col)return!1;if(e.row!==t.row)return!1}return e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift}};t.CoreMouseService=_=s([r(0,n.IBufferService),r(1,n.ICoreService)],_)},6975:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const n=i(1439),o=i(8460),a=i(844),h=i(2585),c=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let d=t.CoreService=class extends a.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new o.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new o.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new o.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new o.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}reset(){this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;const i=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&i.ybase!==i.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onBinary.fire(e))}};t.CoreService=d=s([r(0,h.IBufferService),r(1,h.ILogService),r(2,h.IOptionsService)],d)},9074:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationService=void 0;const s=i(8055),r=i(8460),n=i(844),o=i(6106);let a=0,h=0;class c extends n.Disposable{get decorations(){return this._decorations.values()}constructor(){super(),this._decorations=new o.SortedList((e=>null==e?void 0:e.marker.line)),this._onDecorationRegistered=this.register(new r.EventEmitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this.register(new r.EventEmitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this.register((0,n.toDisposable)((()=>this.reset())))}registerDecoration(e){if(e.marker.isDisposed)return;const t=new l(e);if(t){const e=t.marker.onDispose((()=>t.dispose()));t.onDispose((()=>{t&&(this._decorations.delete(t)&&this._onDecorationRemoved.fire(t),e.dispose())})),this._decorations.insert(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear()}*getDecorationsAtCell(e,t,i){var s,r,n;let o=0,a=0;for(const h of this._decorations.getKeyIterator(t))o=null!==(s=h.options.x)&&void 0!==s?s:0,a=o+(null!==(r=h.options.width)&&void 0!==r?r:1),e>=o&&e{var r,n,o;a=null!==(r=t.options.x)&&void 0!==r?r:0,h=a+(null!==(n=t.options.width)&&void 0!==n?n:1),e>=a&&e{Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(2585),r=i(8343);class n{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}forEach(e){for(const[t,i]of this._entries.entries())e(t,i)}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)}}t.ServiceCollection=n,t.InstantiationService=class{constructor(){this._services=new n,this._services.set(s.IInstantiationService,this)}setService(e,t){this._services.set(e,t)}getService(e){return this._services.get(e)}createInstance(e,...t){const i=(0,r.getServiceDependencies)(e).sort(((e,t)=>e.index-t.index)),s=[];for(const t of i){const i=this._services.get(t.id);if(!i)throw new Error(`[createInstance] ${e.name} depends on UNKNOWN service ${t.id}.`);s.push(i)}const n=i.length>0?i[0].index:t.length;if(t.length!==n)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${n+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7866:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const n=i(844),o=i(2585),a={trace:o.LogLevelEnum.TRACE,debug:o.LogLevelEnum.DEBUG,info:o.LogLevelEnum.INFO,warn:o.LogLevelEnum.WARN,error:o.LogLevelEnum.ERROR,off:o.LogLevelEnum.OFF};let h,c=t.LogService=class extends n.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=o.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;tJSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},7302:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(8460),r=i(844),n=i(6114);t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",customGlyphs:!0,drawBoldTextInBrightColors:!0,fastScrollModifier:"alt",fastScrollSensitivity:5,fontFamily:"courier-new, courier, monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rightClickSelectsWord:n.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",cancelEvents:!1,overviewRulerWidth:0};const o=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends r.Disposable{constructor(e){super(),this._onOptionChange=this.register(new s.EventEmitter),this.onOptionChange=this._onOptionChange.event;const i=Object.assign({},t.DEFAULT_OPTIONS);for(const t in e)if(t in i)try{const s=e[t];i[t]=this._sanitizeAndValidateOption(t,s)}catch(e){console.error(e)}this.rawOptions=i,this.options=Object.assign({},i),this._setupOptions()}onSpecificOptionChange(e,t){return this.onOptionChange((i=>{i===e&&t(this.rawOptions[e])}))}onMultipleOptionChange(e,t){return this.onOptionChange((i=>{-1!==e.indexOf(i)&&t()}))}_setupOptions(){const e=e=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);return this.rawOptions[e]},i=(e,i)=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);i=this._sanitizeAndValidateOption(e,i),this.rawOptions[e]!==i&&(this.rawOptions[e]=i,this._onOptionChange.fire(e))};for(const t in this.rawOptions){const s={get:e.bind(this,t),set:i.bind(this,t)};Object.defineProperty(this.options,t,s)}}_sanitizeAndValidateOption(e,i){switch(e){case"cursorStyle":if(i||(i=t.DEFAULT_OPTIONS[e]),!function(e){return"block"===e||"underline"===e||"bar"===e}(i))throw new Error(`"${i}" is not a valid value for ${e}`);break;case"wordSeparator":i||(i=t.DEFAULT_OPTIONS[e]);break;case"fontWeight":case"fontWeightBold":if("number"==typeof i&&1<=i&&i<=1e3)break;i=o.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"cursorWidth":i=Math.floor(i);case"lineHeight":case"tabStopWidth":if(i<1)throw new Error(`${e} cannot be less than 1, value: ${i}`);break;case"minimumContrastRatio":i=Math.max(1,Math.min(21,Math.round(10*i)/10));break;case"scrollback":if((i=Math.min(i,4294967295))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(i<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${i}`);break;case"rows":case"cols":if(!i&&0!==i)throw new Error(`${e} must be numeric, value: ${i}`);break;case"windowsPty":i=null!=i?i:{}}return i}}t.OptionsService=a},2660:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const n=i(2585);let o=t.OscLinkService=class{constructor(e){this._bufferService=e,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(e){const t=this._bufferService.buffer;if(void 0===e.id){const i=t.addMarker(t.ybase+t.y),s={data:e,id:this._nextId++,lines:[i]};return i.onDispose((()=>this._removeMarkerFromLink(s,i))),this._dataByLinkId.set(s.id,s),s.id}const i=e,s=this._getEntryIdKey(i),r=this._entriesWithId.get(s);if(r)return this.addLineToLink(r.id,t.ybase+t.y),r.id;const n=t.addMarker(t.ybase+t.y),o={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[n]};return n.onDispose((()=>this._removeMarkerFromLink(o,n))),this._entriesWithId.set(o.key,o),this._dataByLinkId.set(o.id,o),o.id}addLineToLink(e,t){const i=this._dataByLinkId.get(e);if(i&&i.lines.every((e=>e.line!==t))){const e=this._bufferService.buffer.addMarker(t);i.lines.push(e),e.onDispose((()=>this._removeMarkerFromLink(i,e)))}}getLinkData(e){var t;return null===(t=this._dataByLinkId.get(e))||void 0===t?void 0:t.data}_getEntryIdKey(e){return`${e.id};;${e.uri}`}_removeMarkerFromLink(e,t){const i=e.lines.indexOf(t);-1!==i&&(e.lines.splice(i,1),0===e.lines.length&&(void 0!==e.data.id&&this._entriesWithId.delete(e.key),this._dataByLinkId.delete(e.id)))}};t.OscLinkService=o=s([r(0,n.IBufferService)],o)},8343:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,n){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,n)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},2585:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(8343);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")},1480:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8460),r=i(225);t.UnicodeService=class{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.EventEmitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version "${e}"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0;const i=e.length;for(let s=0;s=i)return t+this.wcwidth(r);const n=e.charCodeAt(s);56320<=n&&n<=57343?r=1024*(r-55296)+n-56320+65536:t+=this.wcwidth(n)}t+=this.wcwidth(r)}return t}}}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,i),n.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.Terminal=void 0;const t=i(9042),r=i(3236),n=i(844),o=i(5741),a=i(8285),h=i(7975),c=i(7090),l=["cols","rows"];class d extends n.Disposable{constructor(e){super(),this._core=this.register(new r.Terminal(e)),this._addonManager=this.register(new o.AddonManager),this._publicOptions=Object.assign({},this._core.options);const t=e=>this._core.options[e],i=(e,t)=>{this._checkReadonlyOptions(e),this._core.options[e]=t};for(const e in this._core.options){const s={get:t.bind(this,e),set:i.bind(this,e)};Object.defineProperty(this._publicOptions,e,s)}}_checkReadonlyOptions(e){if(l.includes(e))throw new Error(`Option "${e}" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error("You must set the allowProposedApi option to true to use proposed API")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onKey(){return this._core.onKey}get onLineFeed(){return this._core.onLineFeed}get onRender(){return this._core.onRender}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onSelectionChange(){return this._core.onSelectionChange}get onTitleChange(){return this._core.onTitleChange}get onWriteParsed(){return this._core.onWriteParsed}get element(){return this._core.element}get parser(){return this._parser||(this._parser=new h.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new c.UnicodeApi(this._core)}get textarea(){return this._core.textarea}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._buffer||(this._buffer=this.register(new a.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.coreMouseService.activeProtocol){case"X10":t="x10";break;case"VT200":t="vt200";break;case"DRAG":t="drag";break;case"ANY":t="any"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}}get options(){return this._publicOptions}set options(e){for(const t in e)this._publicOptions[t]=e[t]}blur(){this._core.blur()}focus(){this._core.focus()}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}open(e){this._core.open(e)}attachCustomKeyEventHandler(e){this._core.attachCustomKeyEventHandler(e)}registerLinkProvider(e){return this._core.registerLinkProvider(e)}registerCharacterJoiner(e){return this._checkProposedApi(),this._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._checkProposedApi(),this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){var t,i,s;return this._checkProposedApi(),this._verifyPositiveIntegers(null!==(t=e.x)&&void 0!==t?t:0,null!==(i=e.width)&&void 0!==i?i:0,null!==(s=e.height)&&void 0!==s?s:0),this._core.registerDecoration(e)}hasSelection(){return this._core.hasSelection()}select(e,t,i){this._verifyIntegers(e,t,i),this._core.select(e,t,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(e,t){this._verifyIntegers(e,t),this._core.selectLines(e,t)}dispose(){super.dispose()}scrollLines(e){this._verifyIntegers(e),this._core.scrollLines(e)}scrollPages(e){this._verifyIntegers(e),this._core.scrollPages(e)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(e){this._verifyIntegers(e),this._core.scrollToLine(e)}clear(){this._core.clear()}write(e,t){this._core.write(e,t)}writeln(e,t){this._core.write(e),this._core.write("\r\n",t)}paste(e){this._core.paste(e)}refresh(e,t){this._verifyIntegers(e,t),this._core.refresh(e,t)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(e){this._addonManager.loadAddon(this,e)}static get strings(){return t}_verifyIntegers(...e){for(const t of e)if(t===1/0||isNaN(t)||t%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(const t of e)if(t&&(t===1/0||isNaN(t)||t%1!=0||t<0))throw new Error("This API only accepts positive integers")}}e.Terminal=d})(),s})())); +//# sourceMappingURL=xterm.js.map \ No newline at end of file diff --git a/docs/repair/xterm-local/README.md b/docs/repair/xterm-local/README.md new file mode 100644 index 0000000..9e7c13d --- /dev/null +++ b/docs/repair/xterm-local/README.md @@ -0,0 +1,58 @@ +# Web Terminal xterm 本地化 + +基线 633bb94df3e1e454929a14257c06c307c09100e6;当前 PR #42 分支。初始工作区与原未跟踪文件见 baseline.txt;原 output/、tmp/、runtime-repair 未跟踪文件保持原样并排除提交。 + +## 生产修改与边界 + +- `components/ts_webui/web/js/terminal.js`:仅三个 loader URL 改为同源 vendor + TS_ASSET_VERSION;保留按需 Promise、去重、失败 UI/重试及 destroy 防护。J1、SSH、输入、终态等行为未改。 +- `components/ts_webui/web/index.html`:原缓存标识统一更新到 20260928-local-xterm。 +- `components/ts_webui/web/vendor/xterm/`:三个发行文件和两个独立 MIT LICENSE,完整来源/版本/原路径/SHA256/大小见 [vendor.json](vendor.json)。开发阶段从原运行时固定版本 jsDelivr 地址一次性取得;构建不下载依赖。无 map、src、typings、npm 包或缓存。 +- `tools/minify_web.py`:两个 JS/CSS 循环各增加 vendor 目录跳过;后续 gzip 不变。 + +CMake、SDK 配置、版本、发布流程、后端、SSH、硬件保护和前端布局均未修改。 + +### 经用户确认的路径调整 + +当前 SPIFFS 路径含目录最多 32 字节。原建议 addon 与许可证长路径实际导致 SDK 失败,证据见 path-limit.txt 和 initial-build-path-failure.log。用户确认后仅改为 `vendor/xterm/fit.min.js` 与 `vendor/xterm/LICENSE-fit`,其字节和版本不变。旧失败目录存在缓存的 GLOB 名称,因此最终使用全新独立目录 `/tmp/tianshan-xterm-final/build`,没有改 CMake 或文件系统格式。 + +## 版本、许可证和静态资源占用 + +| 文件 | 版本 | raw 字节 | gzip 字节 | +|---|---|---:|---:| +| xterm.min.js | xterm 5.3.0 | 283670 | 65684 | +| xterm.css | xterm 5.3.0 | 5383 | 2037 | +| fit.min.js | xterm-addon-fit 0.8.0 | 1789 | 822 | +| 合计运行时资源 | 固定版本 | 290842 | 68543 | + +两个 LICENSE 共 2364 字节;含许可证 vendor 原始总计 293206 字节。源码 vendor 与 web_optimized 未 gzip 文件逐字节相同,gunzip 后也逐字节相同。两份 MIT 版权信息保留。 + +SPIFFS 同时包含 raw、gzip 和许可证:新增文件数据合计 361749 字节(不含文件系统元数据)。生成器已分配 676/768 个 4096 字节块,未分配 92 块(376832 字节)。这是生成器布局统计,不等于运行时 ESP SPIFFS free API;未声称固定 3 MiB 镜像文件大小就是实际新增占用。构建未溢出,仍需设备挂载验收。 + +## 本次验证与重复入口 + +1. `node --test tests/prompts/xterm-vendor.test.cjs`:固定 SHA256、skip-minify/gzip identity、生产 loader 冷启动、共享 Promise、失败后重试通过。见 vendor-test.txt。 +2. `npm run test:xterm --prefix tests/prompts`:Node 专项及双语 Chrome 通过,见 offline-source.txt。全新 context 禁止 Service Worker、全部非 fixture origin 拦截;未注入 Terminal/FitAddon。真实 Terminal 构造、FitAddon、页面初始化、真实键盘输入、SSH、J1、退出、销毁和重入通过。 +3. 原 WebUI Node 40 项、Chrome 38 项重新执行通过,见 node.txt、browser.txt。原资源失败/重试测试改为本地文件故障注入,恢复后使用真实 bundle;未弱化断言。 +4. J1 专项通过,见 j1.txt。实际 C→JS→C v3 双语回归通过,见 cross-en/zh.txt/json,保留 H1、控制归属、取消/回收等既有断言。 +5. 固定 ESP-IDF v5.5.2 / ESP32-S3,独立目录全量 `idf.py -B /tmp/tianshan-xterm-final/build -D SDKCONFIG=/tmp/tianshan-xterm-final/sdkconfig build` 成功,见 build.log。日志刷机命令只是 SDK 输出,没有执行。 +6. `PROJECT_WEB_ROOT=/tmp/tianshan-xterm-final/build/esp-idf/ts_webui/web_optimized OFFLINE_RESULTS=docs/repair/xterm-local/optimized node --test tests/prompts/xterm-offline.test.cjs`:本次打包资源双语离线回放通过,见 offline-optimized.txt。 +7. `IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf V3_BUILD=/tmp/tianshan-xterm-final/build python3 tests/ws_subscriptions/verify_xterm_assets.py`:全部 vendor/gzip/许可证存在、字节一致、最终 www.bin 目录名存在;固定 SDK 重建 SPIFFS 与实际 www.bin 字节相同,容量及 flash 文件校验通过,见 build-assets.json。 +8. 相同 IDF_PATH/V3_BUILD 加 `V3_RESULTS=docs/repair/xterm-local python3 tests/ws_subscriptions/verify_project_assets.py`:原优化 JS 语法、gzip、缓存标识和 SPIFFS 重建验证通过,见 project-assets-check.txt、assets.json。 +9. `python3 tests/release/test_release.py`:3 项通过。静态检查现有 workflow 的 build/*.bin 上传与 firmware/**/*.bin Release 模式包含 www.bin。无 workflow 修改。 +10. `git diff --check` 通过;build-inputs.json 的生产输入哈希在构建后复核一致,无构建后生产输入改动。runtime-search.txt 记录 components/tools/tests 无可执行 xterm CDN 引用。 + +完整网络记录:源码 [英文](requests-en-US.json)、[中文](requests-zh-CN.json);优化产物 [英文](optimized/requests-en-US.json)、[中文](optimized/requests-zh-CN.json)。每条 HTTP/HTTPS URL/origin 均记录且断言同源,外部请求为零、pageerror 为零。vendor 请求带现有缓存标识。无 CDN fallback。 + +浏览器真实运行 xterm 及键盘;网络/设备 WebSocket 是受控替身。现有 resize 仅调用 fit,Ctrl+C 发送 ssh_input;未擅自新增 ssh_resize/ssh_signal。独立 resize/signal 控制路径由现有 C 跨层测试保留验证。 + +## 从产物到运行入口及发布链 + +最终 www.bin 由逐字节核验的 web_optimized 构建,含 vendor/raw/gzip/LICENSE。`ts_webui.c:static_file_handler` 去掉 query 后访问 /www 对应路径;`ts_http_send_file` 识别 JS/CSS,按 Accept-Encoding 发送 .gz。浏览器在源资源及实际优化资源上均仅请求本地路径并完成终端输入和 SSH 模式操作。真实 ESP HTTP 服务尚未执行。 + +[flasher_args.json](flasher_args.json) 的 flash_files 包含 `0x6a0000: www.bin`;CMake 现有 FLASH_IN_PROJECT 未改。**使用项目标准 idf.py flash 时,本地 xterm 随 www.bin 自动刷入设备,无需用户单独复制文件。单独刷 TianShanOS.bin 不会更新 xterm,因为 WebUI 位于独立 www 分区。** + +现有 OTA 的 includeWww/startWwwOta、ota.www.start、ota.www.start_sdcard 与 /ota/www 上传链支持配套升级 App + www;App-only OTA 不更新 WebUI,这是原语义。现有 workflow 继续发布 www.bin;本轮不修改工作流、打 tag、合并或创建 Release。 + +## 验收边界 + +本次必需的本地检查已执行。真实设备浏览器、SPIFFS 挂载/静态 HTTP/gzip、更新后的缓存与真实 SSH 仍待实机验收;未刷机、重启或执行真实远端命令。构建成功和模拟协议不代替设备验收。发布准备按用户授权仅提交并推送本轮范围到 PR #42。 diff --git a/docs/repair/xterm-local/assets-check.txt b/docs/repair/xterm-local/assets-check.txt new file mode 100644 index 0000000..9ca348c --- /dev/null +++ b/docs/repair/xterm-local/assets-check.txt @@ -0,0 +1,51 @@ +{ + "files": [ + { + "file": "vendor/xterm/xterm.min.js", + "raw": 283670, + "sha256": "fc1dd31b221e3e5f929486e07a80b477a8aaf9dce2b4f9c3ffe7dd25f370655d", + "gzip": 65684 + }, + { + "file": "vendor/xterm/xterm.css", + "raw": 5383, + "sha256": "832f3f2c603b43ad4351ff04970150cc7a873014276db126a6065c6dd81e4872", + "gzip": 2037 + }, + { + "file": "vendor/xterm/fit.min.js", + "raw": 1789, + "sha256": "c78e5795c6487acdf24ab436798d4a9cec3848101b281bc65b061f39db714be1", + "gzip": 822 + }, + { + "file": "vendor/xterm/LICENSE-xterm", + "raw": 1261, + "sha256": "b569f629d00f2626a8100df2a1798210535621e42164dfd426a6fe5aac7b0ccd" + }, + { + "file": "vendor/xterm/LICENSE-fit", + "raw": 1103, + "sha256": "e256f01188af527e4d06d21d06fbf785ae9c50d4b328bf03cbe0ba7f0aa4228f" + } + ], + "runtime_raw": 290842, + "runtime_gzip": 68543, + "vendor_raw_including_licenses": 293206, + "spiffs": { + "partition_bytes": 3145728, + "allocated_blocks": 676, + "block_bytes": 4096, + "unallocated_blocks": 92, + "note": "generator allocated blocks including metadata, not runtime filesystem free-space API" + }, + "www_sha256": "8b7b51a11c281121fc80b7bdd6104fa4a522af39fb698902bf717faa710d7b4a", + "flash_files": { + "0x0": "bootloader/bootloader.bin", + "0x20000": "TianShanOS.bin", + "0x8000": "partition_table/partition-table.bin", + "0x16000": "ota_data_initial.bin", + "0x6a0000": "www.bin" + }, + "spiffs_reconstruction": "byte-identical" +} diff --git a/docs/repair/xterm-local/assets.json b/docs/repair/xterm-local/assets.json new file mode 100644 index 0000000..38404c5 --- /dev/null +++ b/docs/repair/xterm-local/assets.json @@ -0,0 +1,41 @@ +{ + "index.html": { + "source_sha256": "c8b08579724612166cc4ac2568aff34661bbf2c8699cc856abfa3d778ed4ae1d", + "optimized_sha256": "c8b08579724612166cc4ac2568aff34661bbf2c8699cc856abfa3d778ed4ae1d", + "gzip_sha256": "6fac126090696747186340f090a4591b79ba7d111164f42fb9fc0aba8305b448", + "optimized_bytes": 26676 + }, + "js/terminal.js": { + "source_sha256": "5d77a7181b6127699e098f22d3c872f5e31daaa700436b6fa928f34b6aa33e52", + "optimized_sha256": "6759587f527a0c37aaf8b13f6b5ffc017a452954cd23b780b5d6254488f939dc", + "gzip_sha256": "191a0dbe459d803d2a31cd01e041a339b3ebd571710cb48be243441b30f6c692", + "optimized_bytes": 20066 + }, + "js/lang/zh-CN.js": { + "source_sha256": "bb3d3b4b28c8c146fdb1c437bee84862806ed915af8cc0aa2388deb6a9e9ef89", + "optimized_sha256": "81b0fed5b0ac73d51d9c37204c9f62e035a79bbf5b5610d37fc8a936faf9fd64", + "gzip_sha256": "18581e4123c2466a2e3d7fa232f86330850606e02e75ab777d3542d3489b29c7", + "optimized_bytes": 137314 + }, + "js/lang/en-US.js": { + "source_sha256": "58beed2b903407387d884c99f38eaef578e74be916175b53745d0d5ececadc10", + "optimized_sha256": "e9963046086616fecc9ba662df94e736a98c1430865e0caa47292b3690ca0ad0", + "gzip_sha256": "82e883f0a2a77ab09008dc4d2543b72e675749c2392c70cc175fabbba928bb54", + "optimized_bytes": 143161 + }, + "build": { + "TianShanOS.bin": { + "sha256": "9dc7abe01f06983ff6980095e90ec098ade716ea4bd1a67e9a94402e208270d8", + "bytes": 2183456 + }, + "www.bin": { + "sha256": "8b7b51a11c281121fc80b7bdd6104fa4a522af39fb698902bf717faa710d7b4a", + "bytes": 3145728 + }, + "TianShanOS.elf": { + "sha256": "9cbeca799ad830cb914e3af28d43debf4a7a1ba0bb39b16edcd1ed1bf7ada1f5", + "bytes": 18286808 + } + }, + "spiffs_regeneration": "byte-identical from verified optimized directory" +} \ No newline at end of file diff --git a/docs/repair/xterm-local/baseline.txt b/docs/repair/xterm-local/baseline.txt new file mode 100644 index 0000000..5138c94 --- /dev/null +++ b/docs/repair/xterm-local/baseline.txt @@ -0,0 +1,4 @@ +?? docs/runtime-repair/evidence/reviewer-fixes/diff-check.txt +?? output/ +?? tmp/ +633bb94df3e1e454929a14257c06c307c09100e6 diff --git a/docs/repair/xterm-local/browser.txt b/docs/repair/xterm-local/browser.txt new file mode 100644 index 0000000..b780996 --- /dev/null +++ b/docs/repair/xterm-local/browser.txt @@ -0,0 +1,56 @@ + +> test:browser +> cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs + +✔ zh-CN: real index cold start, safe toast/file text, current websocket state (636.478542ms) +✔ zh-CN: initial language failure blocks controls and retry recovers (281.836333ms) +✔ en-US: real index cold start, safe toast/file text, current websocket state (316.672833ms) +✔ en-US: initial language failure blocks controls and retry recovers (341.80025ms) +✔ delayed language package and rapid switches keep the latest requested language (246.9305ms) +✔ terminal resource failure presents retry; a rejected cached promise is not reused (384.200792ms) +✔ zh-CN: package confirmation treats names as text and applies only on explicit verified action (283.504042ms) +✔ en-US: package confirmation treats names as text and applies only on explicit verified action (321.021417ms) +✔ initial delayed language keeps controls inert until the real package arrives (241.532167ms) +✔ failed language switch preserves the loaded language; retry clears failure and stale toast (383.066834ms) +✔ terminal can initialize after failed resource load using newly served resources (384.491ms) +{"case":"successful retry","language":"zh-CN","failure":"/sdcard/a.tscfg: 应用失败: 设备处理请求时发生错误,请查看详细原因。\n详细原因:fixture failure","afterSuccess":"/sdcard/a.tscfg: 配置包已应用。","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure zh-CN (575.503083ms) +{"case":"late completion","language":"zh-CN","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: 正在应用配置...","errors":[]} +✔ review2: prior completion closes new package confirmation zh-CN (190.968958ms) +{"case":"stale file list","language":"zh-CN","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close zh-CN (198.094416ms) +{"case":"successful retry","language":"en-US","failure":"/sdcard/a.tscfg: Apply failed: The device encountered an error while processing the request. See the details below.\nDetails: fixture failure","afterSuccess":"/sdcard/a.tscfg: The configuration package was applied.","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure en-US (226.306833ms) +{"case":"late completion","language":"en-US","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: Applying config...","errors":[]} +✔ review2: prior completion closes new package confirmation en-US (263.154417ms) +{"case":"stale file list","language":"en-US","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close en-US (238.29625ms) +✔ R1: endpoint-specific logout and HTTP errors zh-CN (190.351084ms) +✔ R3: late validation cannot revive an old apply entry zh-CN (183.495875ms) +✔ R3: previously opened confirmation loses validity on reupload zh-CN (179.444125ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts zh-CN (185.503708ms) +✔ R6: fixed upload destination and separate refresh failure zh-CN (210.39175ms) +✔ R6: out-of-order directory success and error do not replace latest list zh-CN (185.484625ms) +✔ R1: endpoint-specific logout and HTTP errors en-US (246.235333ms) +✔ R3: late validation cannot revive an old apply entry en-US (270.721917ms) +✔ R3: previously opened confirmation loses validity on reupload en-US (250.586958ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts en-US (225.006541ms) +✔ R6: fixed upload destination and separate refresh failure en-US (251.99725ms) +✔ R6: out-of-order directory success and error do not replace latest list en-US (250.931958ms) +✔ R2: authenticated startup initializes once (292.264208ms) +✔ R2: obsolete system loader cannot update new page; failed navigation retries (243.894583ms) +✔ R4/R5: newest result wins over late success and late failure (240.889917ms) +✔ R3: overlapping writes to one path cannot claim current verified content (238.512625ms) +✔ R2: disposed page only removes its dashboard callback (293.29875ms) +✔ R2: stale finally cannot unlock the new page read (244.392583ms) +✔ R1: delayed sign-out does not clear a newer sign-in (231.425458ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements zh-CN (313.898208ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements en-US (354.845959ms) +ℹ tests 38 +ℹ suites 0 +ℹ pass 38 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 7115.792375 diff --git a/docs/repair/xterm-local/build-assets.json b/docs/repair/xterm-local/build-assets.json new file mode 100644 index 0000000..9ca348c --- /dev/null +++ b/docs/repair/xterm-local/build-assets.json @@ -0,0 +1,51 @@ +{ + "files": [ + { + "file": "vendor/xterm/xterm.min.js", + "raw": 283670, + "sha256": "fc1dd31b221e3e5f929486e07a80b477a8aaf9dce2b4f9c3ffe7dd25f370655d", + "gzip": 65684 + }, + { + "file": "vendor/xterm/xterm.css", + "raw": 5383, + "sha256": "832f3f2c603b43ad4351ff04970150cc7a873014276db126a6065c6dd81e4872", + "gzip": 2037 + }, + { + "file": "vendor/xterm/fit.min.js", + "raw": 1789, + "sha256": "c78e5795c6487acdf24ab436798d4a9cec3848101b281bc65b061f39db714be1", + "gzip": 822 + }, + { + "file": "vendor/xterm/LICENSE-xterm", + "raw": 1261, + "sha256": "b569f629d00f2626a8100df2a1798210535621e42164dfd426a6fe5aac7b0ccd" + }, + { + "file": "vendor/xterm/LICENSE-fit", + "raw": 1103, + "sha256": "e256f01188af527e4d06d21d06fbf785ae9c50d4b328bf03cbe0ba7f0aa4228f" + } + ], + "runtime_raw": 290842, + "runtime_gzip": 68543, + "vendor_raw_including_licenses": 293206, + "spiffs": { + "partition_bytes": 3145728, + "allocated_blocks": 676, + "block_bytes": 4096, + "unallocated_blocks": 92, + "note": "generator allocated blocks including metadata, not runtime filesystem free-space API" + }, + "www_sha256": "8b7b51a11c281121fc80b7bdd6104fa4a522af39fb698902bf717faa710d7b4a", + "flash_files": { + "0x0": "bootloader/bootloader.bin", + "0x20000": "TianShanOS.bin", + "0x8000": "partition_table/partition-table.bin", + "0x16000": "ota_data_initial.bin", + "0x6a0000": "www.bin" + }, + "spiffs_reconstruction": "byte-identical" +} diff --git a/docs/repair/xterm-local/build-inputs.json b/docs/repair/xterm-local/build-inputs.json new file mode 100644 index 0000000..ddccc00 --- /dev/null +++ b/docs/repair/xterm-local/build-inputs.json @@ -0,0 +1,821 @@ +{ + "CMakeLists.txt": "73a24128dd9cb60d9e980787b80ec9f32e3b9f0b873c83ef17ee8ee75152fecf", + "components/ch405labs_esp_libssh2/.gitmodules": "467fd072f917e5068f5b2a846127b7b82f386fb5b238156aedf38cce2631ab9f", + "components/ch405labs_esp_libssh2/CMakeLists.txt": "defbc67e892a2dc88a98689c81d71703c494df741da1281a971a32c19d71ffef", + "components/ch405labs_esp_libssh2/README.md": "d4baa8a5f5b154b4c4543c11f32300572b3acdebc26c613749be1cc5957b1679", + "components/ch405labs_esp_libssh2/libssh2/.editorconfig": "286f4ce9ddba0c0725cc4d37055e5988ac22c61c1b36bb6ee1a6a895d419f411", + "components/ch405labs_esp_libssh2/libssh2/.gitattribute": "50641866adaa8d562ba65baca87f2f3ce91f61ca40fc21753fe8f35d6013befc", + "components/ch405labs_esp_libssh2/libssh2/.github/ISSUE_TEMPLATE/bug_report.md": "bc14bd2401eb9dfb7a3d762adffd5e455817705f387800ea7b6c38c1f1408633", + "components/ch405labs_esp_libssh2/libssh2/.github/SECURITY.md": "e694a8bc825fde44c30c1bd56465a04872a901406bb83c83055d20bb592485d9", + "components/ch405labs_esp_libssh2/libssh2/.github/stale.yml": "25a2e801cd260d70243072d3e5506c511bd720f3f6ef9fd7fa007b7d1c7ea8e1", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/appveyor_docker.yml": "da1c0951a12c434f05836f1789f15961c6fcabc603e647430a05a34b0424a24b", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/appveyor_status.yml": "4c5246d62039581107a7d02ce6e6add044316c0b74c1539a6e14b184d50fc52a", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/ci.yml": "5fa3a7f5a9fa332495ea33881713679ff28330a367cc4323488a987a3125ea9d", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/cifuzz.yml": "84b5ae690289c4db4b8cdd1907e7a3d63c8df5c3cc1ddd2d43633df7821b2e5e", + "components/ch405labs_esp_libssh2/libssh2/.github/workflows/openssh_server.yml": "0cf892551ec733d936325e69d4a4384666fd61c0227c39bb74887d805b180cdb", + "components/ch405labs_esp_libssh2/libssh2/.gitignore": "6c7cfd1ecdb57b89fc5b0fadc59727fd6cd3ed803e448e5811b785e54acd1a6a", + "components/ch405labs_esp_libssh2/libssh2/.travis.yml": "0230a26255749c26837b5dc54c9811565a1f2092bca181db030255d0d857769f", + "components/ch405labs_esp_libssh2/libssh2/CMakeLists.txt": "2798ced9569334a34eee6fed8037cc69d5a3b6b3af6ccb8f27fac5f6b39dc4b7", + "components/ch405labs_esp_libssh2/libssh2/COPYING": "859e60d760a3446ecaf777339f1eef98c527aea40714384d24b882a83ffdd23a", + "components/ch405labs_esp_libssh2/libssh2/Makefile.OpenSSL.inc": "8e82af68b172ddccf94c65c1b4e38b69b3b7f027cc14a54b6d660c5f2bcd4de9", + "components/ch405labs_esp_libssh2/libssh2/Makefile.WinCNG.inc": "79243be1029a0df52a5e79b3dceb80ac462f2e735e25445e38852610bee62f34", + "components/ch405labs_esp_libssh2/libssh2/Makefile.am": "af1c3b9cc5b46c35fc5556a458b819ca320bfd2646ff13d2bbc3fa0bf21e658d", + "components/ch405labs_esp_libssh2/libssh2/Makefile.inc": "69ed9dd108033552385a3b6257f47d1cece33490fec25c14ef208b3b8f9c9273", + "components/ch405labs_esp_libssh2/libssh2/Makefile.libgcrypt.inc": "3d71dbe94c906d07c70eb8c7eae80fe5ae014565d7a9446bd39b659e91b73b71", + "components/ch405labs_esp_libssh2/libssh2/Makefile.mbedTLS.inc": "18bf8364aaef158a27b65be88ac1fd74af0cbd336930b6ce611b62dab77feebc", + "components/ch405labs_esp_libssh2/libssh2/Makefile.os400qc3.inc": "ac9b0e1731f7dfa20e3987e108a4c5896e6095638ec545c8f2ac64c35b63a455", + "components/ch405labs_esp_libssh2/libssh2/Makefile.wolfSSL.inc": "d6288360c49d5246ba3757304e2c4850d96651d7dfe2d2583a8bee2fe9313665", + "components/ch405labs_esp_libssh2/libssh2/NEWS": "9418b9c8dcafc633c2c16372b2b21ceb70a06243756af21eff173a4b379101d1", + "components/ch405labs_esp_libssh2/libssh2/NMakefile": "2d1cbda9bccd886de3c99dae77f09ac75a7f09f1834272b4a9154d2a0ae9a81a", + "components/ch405labs_esp_libssh2/libssh2/README": "41df43a8f24ec77082fc4c4609bd54b17e0a610e6bb319171ec1fd4d31a24d02", + "components/ch405labs_esp_libssh2/libssh2/README.md": "d7595097b84462de1f273ed1628315f47b23dfaff070af2bfb14f38e22ec13b8", + "components/ch405labs_esp_libssh2/libssh2/RELEASE-NOTES": "9a88e3e26281797ee09f09cd04e4bd753837b02366dcaf34885b800742bc862f", + "components/ch405labs_esp_libssh2/libssh2/acinclude.m4": "c461e884733a19f15b603aec9ac590218ec0fd93e34cd48b279e2f0af5dc70f3", + "components/ch405labs_esp_libssh2/libssh2/appveyor.yml": "984dffbbd4503ebd67359d660d51198c420dab745efef074fbae126aa3fa8492", + "components/ch405labs_esp_libssh2/libssh2/buildconf": "c2102a17b8f50f0d56d20639c05c70347a4e6ac5dcec351c6f851371e2a68a71", + "components/ch405labs_esp_libssh2/libssh2/ci/appveyor/docker-bridge.bat": "f72fdb40e7a9c3aa5c5fe5fd6a4a008463f1f3b991e0875f19eb5a9a2e8fa3cf", + "components/ch405labs_esp_libssh2/libssh2/ci/appveyor/docker-bridge.ps1": "e8947a221954fd55ac060300bf71b512869a087694f4116ad40ffcfa5ede8160", + "components/ch405labs_esp_libssh2/libssh2/ci/checksrc.pl": "879e805b57e2e86f6894a6a4e395daf1c1c048ee5984e109be74afc750782567", + "components/ch405labs_esp_libssh2/libssh2/ci/checksrc.sh": "a435be07f99eaac5b59f9cf68d88e3541c9fbed09177d0874078c22547edd5e9", + "components/ch405labs_esp_libssh2/libssh2/cmake/CheckFunctionExistsMayNeedLibrary.cmake": "60a8d1afe9a3b71cedb782ac6187a9a041d2792006a7eb3379bc42a9fcb95a4d", + "components/ch405labs_esp_libssh2/libssh2/cmake/CheckNonblockingSocketSupport.cmake": "443b9824a1d7f7cc0a9c1b740ca9824f82f73ac7f0294aa2c1e3192aa3cb5e0d", + "components/ch405labs_esp_libssh2/libssh2/cmake/CopyRuntimeDependencies.cmake": "5a146613512f467192e7917561b305e31d52a85b3f216d5e3c6ca6d2261e9b03", + "components/ch405labs_esp_libssh2/libssh2/cmake/FindLibgcrypt.cmake": "af65a3a8ea63eb935b1602b2b75c7c993558f9118e8c12cf9f2d4614977d8c53", + "components/ch405labs_esp_libssh2/libssh2/cmake/FindmbedTLS.cmake": "db4ad3046a838c325ff39f3f083a2de39c3bcde4c69670610ce27b23c758c50d", + "components/ch405labs_esp_libssh2/libssh2/cmake/SocketLibraries.cmake": "857615772ee6a1b79826eb18889def1a626296262db78def698286930e3c6cbf", + "components/ch405labs_esp_libssh2/libssh2/cmake/Toolchain-Linux-32.cmake": "fc7c2718c2e628fe28db38406fb57e9380d202dce8b4d615ef8b818984c37a32", + "components/ch405labs_esp_libssh2/libssh2/cmake/max_warnings.cmake": "1a14b62c40d327d69ad1531e3372523310e642779da33c3865e6fc67df46835b", + "components/ch405labs_esp_libssh2/libssh2/config.rpath": "aa48652ef1709d015f0e627eb5d18d1c198d81c29d5f89a81362512fcba72b01", + "components/ch405labs_esp_libssh2/libssh2/configure.ac": "37d7a8fe37f7c5a7329f289030d2dc0571aa759d285ddab0a5b16ca27b1462b4", + "components/ch405labs_esp_libssh2/libssh2/docs/.gitignore": "b523bfc0065b99350f41f5f745f0be7698b3f5be00251e6c1016a5b620edcc7c", + "components/ch405labs_esp_libssh2/libssh2/docs/AUTHORS": "12228e95c6b41c76d00b6ca8f2bf7bfb3372f3f32b6c62f34882530b9406f26d", + "components/ch405labs_esp_libssh2/libssh2/docs/BINDINGS": "c711b535a9462815d564995eb84b997261fb9a2db4ef82a8c9b3f926dd7498b2", + "components/ch405labs_esp_libssh2/libssh2/docs/CMakeLists.txt": "713fa1933cf53a12a7ccafea3e8d9187c35967159e7e460a775e91e8a7df2464", + "components/ch405labs_esp_libssh2/libssh2/docs/HACKING": "5d2563866dc4fcc8a4ab352676e3d64b918b75e0a73ce7776b9eef7e8949d3b0", + "components/ch405labs_esp_libssh2/libssh2/docs/HACKING-CRYPTO": "ce85a00c816a80b24fa998598bfecb58ed9ea389a368c15eacf2e27d56f1be25", + "components/ch405labs_esp_libssh2/libssh2/docs/INSTALL_AUTOTOOLS": "6ca4765ca5ca117514e41067ce05cc24504aa29eab9a76bb9cc1ecc87c3280b1", + "components/ch405labs_esp_libssh2/libssh2/docs/INSTALL_CMAKE.md": "266b25dbe613f02e4662467c23ad80bb42a35ef9d579933ddb2d7b1d038089d0", + "components/ch405labs_esp_libssh2/libssh2/docs/Makefile.am": "5e734a3e68bf57a13404770ace3e4595e0a6c215526d2942a5fba3ebf3109828", + "components/ch405labs_esp_libssh2/libssh2/docs/SECURITY.md": "4314c11322a9970bed60130a2e11a0eb79c9de719a7c7c2cb227356d9771ba2f", + "components/ch405labs_esp_libssh2/libssh2/docs/TODO": "e3a304f76129bdb90371439567dffe2a8841e3a5c326f71000490a11241bc9b0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_connect.3": "5fe15d3e781382a8e935048dd266a89e9c3b63800d4714ceec6c78c512e49f20", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_disconnect.3": "e2d1a3af99d888e310c6e22227e11b0a42f1d265451a9e13ac787fe0b8075426", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_free.3": "332b5fb986c013ba363bd18d5e39c01a047d79fb22acf673291f1e19b4d8292a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_get_identity.3": "acdccde633dda1740ba043fb3f2b3aed884923c74ff3e2ad2f01d5a6b87955f1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_get_identity_path.3": "148b43bc669d3300b3fbf09ae57050a15ce074c8730ecef78e97ee9309ea179f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_init.3": "09029ddc71d63085dd6ccf92062ce6e31f0d54a1eb40d06587713814ddb4ee5d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_list_identities.3": "a498d332ea55486eb1c234468a8cf3c1886eb6b98bdd527a1b44fd06683e7ea2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_set_identity_path.3": "b60fb7e972fc2b420ff0a7452ddbf12597dbc9cb075920da16ee9c0eef7f8425", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_agent_userauth.3": "d2119c63fa5bd1a05385bd176a1c8d2ee0139aebec92addd1601edc948f17855", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_banner_set.3": "1bd7a8bd59cb74d90cfed26c41701788afe7c0a667f686c5154cd0615d586422", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_base64_decode.3": "c48f88f5a6405738bc146161bf442e02c02073e0b9957f5d4bc3bd425bee82e1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_close.3": "e348d7548693066f863dde9a6c7dd21bf394aca51c1cae1c4999309eedfb4451", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_direct_tcpip.3": "3a67560c5846880066344d5581840a26a8509854fcf20fda79f9b2156e58757d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_direct_tcpip_ex.3": "5a7665c77afd8aa509c03d5059ece42adb912979e0fab608034e4554e3106439", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_eof.3": "7ad4590d1dfccf35bd2f7393e0d14b4247c3108ee2f48685b505c0dd9516e011", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_exec.3": "e7f79363e4fa61ce0c00f59e4e97cbc3101f55e2025b1156551aaf50c8522b87", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_flush.3": "fcaf2b8577ae6b8196313977d0686175a807fcccd3f3fce433028384da0f7bdd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_flush_ex.3": "33fb6e5de6afa0836e6439ea4c552ff4101a6f48bb73242f4868b181d40bc28f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_flush_stderr.3": "4f590d465d647b416c583c2b16693a3364e84da2400dfe7f9ffe1928577ca3ae", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_accept.3": "4f0621fe2a6aef5fefd50197974beb6e6c89dc41841b1d6052f885a773557ed8", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_cancel.3": "230ff1688acf2f4a7ac5d687ca46bd39458192a0662b3b8fa6edd8217c25117f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_listen.3": "fac440afa8233b6d3982b349d56c177ba9fec09464f1c5a5bf40ce32d600197d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_forward_listen_ex.3": "49c5374f3b5c56213fe9a43ef4592cd51097cd1c9017fcb3be97c94847e8efcf", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_free.3": "a7e649756ff4a20b0f5bb6bc9f4647ecaff885c8745e9c304cc697c2c677196b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_get_exit_signal.3": "89557c3203331e1d21773b557659a0f21e1ecbcee90c372de3b6e159c7b78a7d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_get_exit_status.3": "d374651f3f72f3f179c37b4a44b815a1bdd998f803a121fc8bc5544c397224c8", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_handle_extended_data.3": "c8ba2c032cd2cd8fc5877845df624712457dcf1c092975f3c713fe75794fd42b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_handle_extended_data2.3": "17269accf920a28af6bd14770f94067083e2dfa56df4e08663844d0cebb78052", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_ignore_extended_data.3": "c00c30e1aa01c699c92c30c98e9ab8e543cb2fb23376b650627c56ecc3a1f275", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_open_ex.3": "a4153c3de3d2cb9a2faaa39eeb9b638c829db2cf4aa4a0e0a2cbd51098626e79", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_open_session.3": "63ee8e3220149933ebf5219335cf5b9fb107e23808137f782e8846b191ecf629", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_process_startup.3": "1023352b8152e5a1a2ccf2bc899e9539fbecaa2dff69ebb68ada088da38fc6b9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_read.3": "1ddb492b078cab328e718563f2fc5dc3fd737078ba272d078f94e554e2938080", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_read_ex.3": "931e1fad6ff1d629ed2b523c75e645a16344be8afebc0e2f50144ac8394146e2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_read_stderr.3": "6b3a6db85f2fdb26a07b95d6046127f3d5c709e6ee4bd72d66b9109e10ca8e1b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_receive_window_adjust.3": "01a3e1d79fce062cba8fefee6b8fe7ca81a1ad7a3c8cccf12801d7f80fd6265a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_receive_window_adjust2.3": "451f2632b8c786a16e87940f2fcb978e9d88fee27cb997c192c9e671b72b27eb", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_auth_agent.3": "9217dcc14a2c6bee93f5754b2fed7827b3dbb8efc335d7fbf4908e8a531570b4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty.3": "f7b4d6780a1b6ed5518e425751f55d9930a5bfa8e92dc0458ccdb06d7786ecbe", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty_ex.3": "ab2af9c02a3d127ba99cf27f0496643eb30810edb38a94f7df488f41041ec105", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty_size.3": "5ae6ade5d71da8ce3a31fd804c32600f54a3385b07cb8ed6ac90157a9a1ada26", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_request_pty_size_ex.3": "4b296b3a64b71c1842c0f12c70fe866734bc18f51e3907acfa3f04c4a997bda3", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_send_eof.3": "a83be7ac2b428f6d41df423e38c52d01f86b9fcafde2010336c7a57323808b6c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_set_blocking.3": "767637f9629f9b7bbbe24c3f3e13be0a83174f1542a63fe7daba350beb369447", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_setenv.3": "fc8773714c44358cf215d80dfdfeea082cc84ae0f33575d17a7825ffb785b02d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_setenv_ex.3": "d4641d1a3054af1fb1aa4819de5ce002b434e56745118d843adc70d902505447", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_shell.3": "e2986078e39068dd61d6d3df0d9e54adb0a489e55ba8051ae6ce3ad5f3c2c191", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_subsystem.3": "16e48c8ad515baef23e1ea94895cf0d2c6d397c133adcbbd20300304b64cab4a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_wait_closed.3": "8f7ad8093832b4b343b04eefe492e94a18be6f496e2074037f93b99683296663", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_wait_eof.3": "a96b063c1d90129420db176063ea4cb66f1b913a2d2b5ada2f3364eeda2d6543", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_read.3": "085331a4fb18dd396b016629ad241a7bf03afe78b0a09fec701aa8be526fab2b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_read_ex.3": "9faf5e32cc4e1fe69fa2e57dc31cbdf3f0e7bfcea339f3b7196f535bbe6be2e2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_write.3": "6daa6fd8d4f74957c709695bd74a741e7808e057cda1a0954e76f92f793d61c4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_window_write_ex.3": "052d12745f7a8a634ba0b3b36cf0a592c2425caf0679aaaca4776b664bd2d5c0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_write.3": "30bfc0efb86bf513f721200a89c9139687d58483826924b9b401797de74b6387", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_write_ex.3": "da8e46fcba16a2bca466d1397d8b06f03703c4cb7e7b799d582941e125c999b1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_write_stderr.3": "e15a48affe5a5044a2b70bf6fc1e3c6a1dc61c10c4440db4828080fe55e5a0f2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_x11_req.3": "e10544721e6dae96d4542abe07b43767ae6fff49a5bc87381aaf72be7d45f51c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_channel_x11_req_ex.3": "ece17b293092b2319ea237a2855a4b9b7c89c6954ecfedbd837d3d02ce4d7a13", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_crypto_engine.3": "da0d23d0aaf5762db26587138ea9db2bd87eda7f00b326d459424f875bca01d6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_exit.3": "104af206d55e98ffa72ae0c5a505523220c8d6e1de27a37a5139093476d5ede5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_free.3": "8abbc67b852f9fabe09eb84540b610304d896721a04a4bee1e9d0e8f8f08c999", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_hostkey_hash.3": "82070c7634690b4bddc49f3c83b343c6f792c902e0e48247d055eaf3284f80e6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_init.3": "926b4044a52cf71dac8ac23cdf51d6e76bc92f5a3a72c65371549e18826c1cc7", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_keepalive_config.3": "7ebbb7cdc900d6d6188afc537c05c60a115030609d96571ac447ac396991adc0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_keepalive_send.3": "86ac214dd4c086239d59ac6582926f72544c788ad2fbf3ccc4e678b4109d32a4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_add.3": "29a052f853cd3f19efc12612d4e3224271bdc91b10cf6b73e866d7018d25f07b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_addc.3": "c5a2b8510dc1df43311f17073e7e720232f7a7e25d9ba7ae80efe2f26a133297", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_check.3": "2059d72130dc5b99c6faa8b399166a8495cf02b71313d6648778b11b0adab631", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_checkp.3": "88cac561cc381008f64d4c879bbe626afd669090648441c134cae83a5ea082a9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_del.3": "34fbfa29546d2bf0edc380270937658f818d2600e4bdc658d5ce28c7d255e1ef", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_free.3": "3e319da43cb185d73dc215a75351f330de2194608a1b12b8e0b623c900d4d96e", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_get.3": "fc04784b136786dafb210e018e758d5272c8d9d531c4fc5baac9f7b90f65bfd2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_init.3": "509721c49287e0232b3cfeb41a8d4b44a45a195222a5694baf9d728c77225abc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_readfile.3": "6d72d5be2d5dd56b125c1107632c58d5e8a692871182f3f883f5662f39d7dfff", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_readline.3": "e259eaedbe587c06a74ada7c1cf5bf28a168edfff2a60919985aa6c7a15e56f1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_writefile.3": "5ef6daaf96128c0b756c9faf38b5fd60697fa93504a5cb9ce7139a3dc14f7254", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_knownhost_writeline.3": "32c23d5b4393297935c3fa6e03d57a3bc1d904e5e469cf775bb0516f9f885147", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_poll.3": "c4a377bc2be1c2789de7a57fa42baa51cfbb0bf4121153ee9cd5201507a8c2b0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_poll_channel_read.3": "5b3df35e57c3252fc63e819c69cc6405bdfd14c546b5cfc2a521563bcc9cb420", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_add.3": "2e7c2772fb78b750b5aa94c7bd38c100e52493f6fb050762af924e26ab2605dd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_add_ex.3": "76e23274e8b4756b03359b0fb5bcd05becba4cca1212ae2c164a32c2f10ee50f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_init.3": "5643aa57554f8daacbbff9e539c68cd1093172bd86d859109e6446ccc91a85d4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_list_fetch.3": "975705aa9fc187961fbab91751a5f41412a30d73d65bfe54862285061afc6c29", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_list_free.3": "5eba2104f91fb101014441df437c695b9b0b1e106b6268d623f886de6c237503", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_remove.3": "69423e4d9d6b76388f6160eb473e82449700569d449911163609c8b1c629ed43", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_remove_ex.3": "5c1632ac1685361577a4ddfd1f6257ecfc012225e1e8c2b126f93add0b5b6190", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_publickey_shutdown.3": "b152e6c493896da374b7b93468b23d7012e6232db06c331c158f9057b8053994", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_recv.3": "e3af95d4147fb29a893ee80c8af430b7df1d77048d814c5005243c02fe221e18", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_recv2.3": "9fc689585ec209d13e5a7c5db6750e07b171103bd29d3522424f6d812473b95e", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_send.3": "0b72a5932217f8e561840de2ce3e5077bb40e7631b1dfb6f439d4a2413f83cfd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_send64.3": "3225083c74987af71d4a2947a7852ac810fd87ab12532492f286d7e7d7547456", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_scp_send_ex.3": "07818e45119b15208123655f945e1927c0971d21ae6d410fd26944b86cd41745", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_abstract.3": "56b29e317d2676d842f3854d8ffd89723a40992897b962d9ae07b56b2373a727", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_banner_get.3": "78804fe78c70c1fcc408a493564c989f3d3da36bf56d14344df150bfc65570c5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_banner_set.3": "c058557ca5d9633b560e05492212b52ee3f6477dae79f75c8ab4996828d88f09", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_block_directions.3": "0006e5c9788d8b2c3976274b715ab712fedb6ee4d3caa09071b62b846b7d44ed", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_callback_set.3": "6c33ad4047e740e5d020ba14cc5ce06beb0bf02b4b2f88c1ab7fd79e6e5f1b8b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_disconnect.3": "382845fee521c18828a9611c286919218fe51a4a3185f37f5c6e8a10a081db66", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_disconnect_ex.3": "5ed79115477f25aa8cf5998bf46eadc2383fd6e4eacee32622d961d4080ffa11", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_flag.3": "18317502888f1b7da8ef132500e009c8eed72cec5ddffbeda575a4c5093d8b74", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_free.3": "7fd404b4fb4c5e955cb2b8fee9b72a89864351e63c553e56a80dfc2af8bf200b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_get_blocking.3": "947a5fe43a518c13ba5049d820084ec6eede2bc3687923e67b28a75297431378", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_get_timeout.3": "4e808b2407358466171f2546c5220def1db4460a16d1f24c60a4a5186d6c0606", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_handshake.3": "fcb9fc145dc6f3b29871dcbe9c3d27529790e1cd3e20643c8aacb3d3d628fb5b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_hostkey.3": "0df40e6f599dacefcebf30b19331e4ce0abfad5bce75f5cffc8f4b7947bca5c6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_init.3": "ce1a0e9ecc5a17d607437b01f4ee94d5a0d8c5dbc8a04f1e26d3b74daedae57a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_init_ex.3": "2c169699aedd0f9ca16fb71a90618738dcdfa5b2b70d857a39c60896ba62b86b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_last_errno.3": "fe92e9c94ecb5fa33bbf51f866bb62bc4a1e5c3ea153dbaf34aa6553cd477ebf", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_last_error.3": "b14e30dc25d7daaf46ef119176af947efabfad29eff7f726635f2adb6260e97a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_method_pref.3": "6946c31e6d51b612852bed10d4ea869093a048f6d41131addbcb9c4dbbd767e5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_methods.3": "d8c8dccb3183da86943815b18ce7c903e07b02714d6ed8c27dfb782f852de8df", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_set_blocking.3": "33c01981b30ead73c614fcb6f7f224a39d6e849e6a9bccc9b8dd463719e1a39d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_set_last_error.3": "147c7ad527163e73f3fe285d16c980de60bba09813535a7623a1e0a037cfd1cd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_set_timeout.3": "eae71fab2f62942d4e5b66d93a7f49347a08ad1afdfc9a81ce8fcc0d0a9b0068", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_startup.3": "425118593ad0eaf0688c686d9b75f12b7cdb23d330445077907c6e2023cfef77", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_session_supported_algs.3": "a2fe37982e0f274bcaeea77ad33ca8fa06ea9377aa4e8196c3a8a827e2906b74", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_close.3": "95f03395996cb7b2652cab241a7d91d0c57bec6d4d8f8097b2932acb56eb7bff", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_close_handle.3": "c813fa985be5105cc3cacaf23dc01f0442628c005e629115992a280597301368", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_closedir.3": "1230d8cc661c016991f32b757b11ee6ddd1ac551e5522c5e009f21ef624dfdc4", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fsetstat.3": "a7ab72ebfca8d295a2b48f2c14d831568042ef6a0528e590faa99f5e2dd00675", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fstat.3": "e354ea4b96d512a34db42be2eaaa2c7fb0bfed554e726aa79db7f45ade1f9dd1", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fstat_ex.3": "2446ac64b425dbaf115b37d29107b66fc0291c2ebd17898669c406a4fd57b78b", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fstatvfs.3": "a10a9bf1dda75b0e97966ed003d183728a8ded895eece58e458980bc742f7a39", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_fsync.3": "bee468765b5d4a09a3b473eba0cf436328f29806953bc1f998d8bc97d2a3049f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_get_channel.3": "90e527f9eb6b0d17760328f6e3842f74d1d173fe88a7c9ec2357ca471e9c0f41", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_init.3": "585d782936f71157d141474c94c897d7ea292580445550c25c8fd44f5e03052f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_last_error.3": "8e7b2fa2c5fe4792a39a5c1c24baf041c970e3021511b36e59979ed64a18b4c7", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_lstat.3": "a01353b26374401029f5094a24beca08988ea201ca2197fef2b14f30bb2658e5", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_mkdir.3": "14e04b070a6c351e2af6bd68f73a408e2982e9a358d5d2af5a46d8b422d27ce3", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_mkdir_ex.3": "44c17758d2b0336f94c4004bdd2debf9e1632ba12c6db6df495c09a71a58e59f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_open.3": "af9a8c90999412d3371218f59859ff91c6a83eabee75f1712adf94c5bceaf1d6", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_open_ex.3": "11661fbcec142d9afee722f5ce779bd32f6e0a2b2dc45558c3bd47292105231d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_opendir.3": "62639f60918835e08f3c00d708cb32af319b9a56d3c2cb33ad409b60b347b31d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_read.3": "1d0435c740470b8a6a427da4331b576833eead72f9d976001d8a1f55fcf24815", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_readdir.3": "0e98293f67ae019adf8c5e17fa9f31f3e34b082c55ccd2119ee424f30c337fc7", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_readdir_ex.3": "7f9a2bda1d49d12040796015a842b592decfb076230ee9c8260c31e7b12dd2cc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_readlink.3": "1834815d254c351664cacf38c06a4b232f099787cc09a41ef719a1ff242e4064", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_realpath.3": "6b8e75bf89724998c414487d93f8c4899a3b1f4deba50806a798fdf9f9405bab", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rename.3": "eb87a9b1c94f38913c0cb62a3a474fe8c8f3cb0a874c61ced396a2d8bb92e510", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rename_ex.3": "12d2e70027755937df6de8b0836f75509f4fc5f1a5428fe5a92ae3eb23ff4b54", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rewind.3": "4caf86de2f35e2925ee637a68f7cfc2e76dab54571ada06495a0574e549c6a7c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rmdir.3": "86a1935b7bb291041eaa7c0788f417c6398b39fd208b6bb478329299ae72a49f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_rmdir_ex.3": "17029aa15ef3e1c862731a7ee52e8f730dc8951e62e1c0539b922dbcd66810b0", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_seek.3": "546a134db735df610032fa982d3c8c1013ced779e21faeff261d71041bcde8bc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_seek64.3": "07df7a2c8c9d75b198fa60909baa31e1c883002337a4c6b7a1b3a9c6ceb3a594", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_setstat.3": "39c7f5d489ea5ceb51bd9c7de237464f5c510f3ce0983e57f7b69207ef957e01", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_shutdown.3": "48bf057f1836924e3e5009890cb6e63ec9d11d0aa19abc258c75ee7c7bd097b9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_stat.3": "7fa4495645b580c216ca2279168b6b2f7c9c73a973dabf1997c02a0409d8c042", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_stat_ex.3": "fd19ff075f44a1713d765330d069fd63cffd8b2dbc09ce9170d926f25d5f70c3", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_statvfs.3": "5762f9ff7d56f44164db57fd048daa60173794c4e7a58ab2fb255e29f0ca2bb8", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_symlink.3": "ae7ea167057c307552405124ad54ee488db7354e7caa974334e88f5b2104c88a", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_symlink_ex.3": "7e22a39bb97548428cddc8a9cf3bc7a1ff57cde878b337a7e177730bf5c51d01", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_tell.3": "ce22525601570f33d91469170d43470a8a9decf0b35ae82c2cea72fff1dc8d8f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_tell64.3": "db5faf0fd28de4738e3062555c1d6981c2b272d7b89bd85e3e83d2a03237472f", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_unlink.3": "d8c4c60c41e81149fe14a4a00cc114d3f7bb4799ceea4895c67d79363da3ae7c", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_unlink_ex.3": "64b0723444b716d2b809a3b481024523fc8c62ab45d3ec4274040abf824cf611", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sftp_write.3": "a4706e9d6dabcde2aeccba27f7d7d5a3cef33dd21f4bf66bf5b181c3e8a3f9ef", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_sign_sk.3": "7d35515c97ed9fcb5c6a43da9f3fc4feb1c5fabd64cceeca0a790bd0df955b28", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_trace.3": "636417e1798bce85c2058cad56493919c608d426acaac409ec1a489bdef90fe2", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_trace_sethandler.3": "b37355eff49dacc9916818db61258f21665fb68993e57ca9040db056453bf8bd", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_authenticated.3": "81115e3ac2549eadafc5ab8c73462d1c5565593106c4d995a920f718e5dd451e", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_banner.3": "1a7248076b5f48794ff638a3f44e88e297548d8e664b792fd6ec3ff9c5017c09", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_hostbased_fromfile.3": "265670d504f8db399e9253af673264b92ae8cc3593912e9b2e6aee436d02fdfe", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_hostbased_fromfile_ex.3": "a71631a3eb07ac88ee21beeabaf6aaccb7e93378c98eed228fa27f1575b04a64", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_keyboard_interactive.3": "17d55c3ba83fc9b7a2fa1dbf0e0d1886deb87616298b6bf424b5ac7d63d0da39", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_keyboard_interactive_ex.3": "09774448b68977b58a745775d5f568077960a9da178f5a2e570359e16b327354", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_list.3": "af6928a269c96480a6ea3a3452af7029577f69485fee36ecdd9dde48b4956a5d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_password.3": "4c8103bb95903b0b2ee6c2b1d0b3eac150ab31314ec023424ab564d29b1678a9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_password_ex.3": "0834a29c814a2d617369a2463429ec244fd116bce0abe8f1b6e61aaef35db3eb", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey.3": "874ece028410feb1bb33d481ab2789e6fadc9a9974cf4e0a72517b4c3fb81861", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_fromfile.3": "6864fc6411955179866986cf95f75ff41a022a4b60ceb177cf503da45a67b88d", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_fromfile_ex.3": "060d36d8a06538035e0d7c678f78db16d68ad6f930c958ef3c1bd46f96f9ed39", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_frommemory.3": "5022660ab3c6c7f596b92e887debb3c580dc21f64be71b76c83c033c0fe36ef9", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_userauth_publickey_sk.3": "5c779cca1464db0aebd956fc3fce989c0637e6e91dce4114991b457e2cb616dc", + "components/ch405labs_esp_libssh2/libssh2/docs/libssh2_version.3": "d3feeb9f870be0dacc7616c44dffae9abddcd22eec9cc8c18a0526af723ffce8", + "components/ch405labs_esp_libssh2/libssh2/docs/template.3": "740b501cbdd74773bdb93c8a4d1ae1e175f3593c0eb93844ea2cad0c61e14463", + "components/ch405labs_esp_libssh2/libssh2/example/.gitignore": "519ee26ed4fcf44a7ba26c65a50f13b343da0a0da55f14f94889b902a3a61939", + "components/ch405labs_esp_libssh2/libssh2/example/CMakeLists.txt": "f8cc011f16f189f485ed9060d71de862616c254dcfc1fafe49ff6425a4d89757", + "components/ch405labs_esp_libssh2/libssh2/example/Makefile.am": "0e7c6f2ea9a65a6eb253d721cabc8df573cd4d2606ddc7bd7499b701380157a6", + "components/ch405labs_esp_libssh2/libssh2/example/direct_tcpip.c": "1a335122f9e28b3883587768e8332f3883b462def477f8651b83fc1392e96dca", + "components/ch405labs_esp_libssh2/libssh2/example/libssh2_config_cmake.h.in": "115c1b79ea918a83de959f0f50eb98c2ce252b21b566b9ad56f3c23b68e48ae7", + "components/ch405labs_esp_libssh2/libssh2/example/scp.c": "87736832ddc36e80b52ed6b7f1c87eedcb57d739c80dcff5bbf2d610bfc7f7c4", + "components/ch405labs_esp_libssh2/libssh2/example/scp_nonblock.c": "dfa78c57e18acdb437f3a643dbace70802aa7d2d504adcd47ed63f744189e822", + "components/ch405labs_esp_libssh2/libssh2/example/scp_write.c": "3a3c4dfb3c4688558716a364cf0f4d8b767bf30c59cc6b352394a2d698370930", + "components/ch405labs_esp_libssh2/libssh2/example/scp_write_nonblock.c": "8071bf056b72eee39bbb1ee173193a79e6ac8a2812724b3e31bb919c6b8ba370", + "components/ch405labs_esp_libssh2/libssh2/example/sftp.c": "6a0bcb5ec7b3066cd040bfc29243fcb36f8375575db17415974a20c29892f6b8", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_RW_nonblock.c": "a2eac2e5433d8e63fd416dd8d0b1424536b4dae701360bf9ec3024495d8c6eb9", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_append.c": "e9aa3ad34d7c9aa119a841e16e99657aa28596b184ff38d09df3a1319dfbf9bd", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_mkdir.c": "51f94316a6fc8ce1c6de9bff0599fa95a950a1424e94b676410d76b1e1edc879", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_mkdir_nonblock.c": "0fb08ab3d217af555d7512693a56c63094642247054def280cbcb08e2a3612c4", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_nonblock.c": "c7236ccc7897e1abd3d9176a33cbd059327d30fc95c7803f7e5f99bf3c448a3f", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_write.c": "7e972aa778422c962ba0ebd2fbae109865b334e33c371ae94a8634e74ffd5473", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_write_nonblock.c": "6b18c9371c2ed1e22b005232f80b99959cc68f2e0dc1351fa73d678e7c64a329", + "components/ch405labs_esp_libssh2/libssh2/example/sftp_write_sliding.c": "b88419136786cd31709d9466b0e4a131b990bbd425096276e5699559863d4bd7", + "components/ch405labs_esp_libssh2/libssh2/example/sftpdir.c": "d186de774a29db36a87fe2f66011acb5c5847316791c98f39dc2749a4c448209", + "components/ch405labs_esp_libssh2/libssh2/example/sftpdir_nonblock.c": "6282ae10e701e48063a793ab2e7a819be77f7267dd7ec29264339c41c5dad8ab", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2.c": "2789139110316e87a06b4d6132fb86081c545084358a3ddf6bb5128423eaed49", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_agent.c": "3184d5a396a9067279ec16070c699a8baffdc02c70930f8cbecbd1cbbd489d84", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_agent_forwarding.c": "2db3d78ce1c5bdb2453f7d22cdff09cf1dc3e40aceb8a54faffe6f76af88d1c3", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_echo.c": "91c519486541145f579c550fddb5ffde5933ba0aaf22366ee8aec50c0cfe4933", + "components/ch405labs_esp_libssh2/libssh2/example/ssh2_exec.c": "67afd0ef23627c87eef2e4424967eef26f8154ce50c357cad85f7d3764fcd5b9", + "components/ch405labs_esp_libssh2/libssh2/example/subsystem_netconf.c": "9b076de4366e11ca81e88d60f6dc41ff3ad897d3096f148ce4ce00102d7256b0", + "components/ch405labs_esp_libssh2/libssh2/example/tcpip-forward.c": "0a929eec2a7274e7592ded5f63230de45c1f30578ce92ea14a010a33b231ac42", + "components/ch405labs_esp_libssh2/libssh2/example/x11.c": "310b0aef741a513db213a895fbf772076e35c2ee83eb4ad1f300493ef6b5b436", + "components/ch405labs_esp_libssh2/libssh2/get_ver.awk": "ac9314659d618e57f0d57e9cb2dc5ab14ca342f099de6738e93d58b91f698f14", + "components/ch405labs_esp_libssh2/libssh2/git2news.pl": "26cad7a3870941f21348bfdffd05fff7a1e1c650b8e38fe469bab3a2a221f26c", + "components/ch405labs_esp_libssh2/libssh2/include/libssh2.h": "2d36bee9e1f99a333cd21c489f649f574fb1c615165da1cd2fa50f5186315f64", + "components/ch405labs_esp_libssh2/libssh2/include/libssh2_publickey.h": "2d419bdfbc155cec62cc23d7cb87f3d9361c4f26ce3b3910c74cef715bd2e70b", + "components/ch405labs_esp_libssh2/libssh2/include/libssh2_sftp.h": "8a0c63c323edc42286cc608f9a53cebe46ac91432e1080a8520ab69d3caeadbf", + "components/ch405labs_esp_libssh2/libssh2/libssh2-style.el": "14bd86ae83b499f88b47f57cee18f1a7f4f41650e16e34af4b8ff03970c3c059", + "components/ch405labs_esp_libssh2/libssh2/libssh2.pc.in": "a2c375f048235970c995e4a091fca2cb500574151c356f7682d44deeb90623a0", + "components/ch405labs_esp_libssh2/libssh2/m4/.gitignore": "b96df5710e539dde8424e3c38174598386aeaff62e4b4a3a878a3f8290a7f9fe", + "components/ch405labs_esp_libssh2/libssh2/m4/autobuild.m4": "37dfd034b5ea52bede69c54901b818a461ae73e2ab1e28c61c229a87f24a1817", + "components/ch405labs_esp_libssh2/libssh2/m4/lib-ld.m4": "18c4c458009da32c9daf0ea332a539e5edc82ba009b6c2faac004626313f00e5", + "components/ch405labs_esp_libssh2/libssh2/m4/lib-link.m4": "d7aab3772e5b60d3ec57ae8dc66d9b762f5c68ef1e8516df25fadfa8bdfef379", + "components/ch405labs_esp_libssh2/libssh2/m4/lib-prefix.m4": "4797426d11dad1e5e4fdbc8bcbc8b10d9750f47bcb74e4c07a953a15265e902c", + "components/ch405labs_esp_libssh2/libssh2/maketgz": "a4ef1a17c664f3bf350ca4357219a6df4af7d0b27c4588fccf5f1e630f54d2dc", + "components/ch405labs_esp_libssh2/libssh2/nw/GNUmakefile": "d6afc1888b0fdfcb50b29a3d7080a4183de41a444c7063db93a1b56d533d8dd8", + "components/ch405labs_esp_libssh2/libssh2/nw/keepscreen.c": "f95e6f4851f16bde13e51a1f4f6f405a142c6a7940beda74de8058db2f170ef6", + "components/ch405labs_esp_libssh2/libssh2/nw/nwlib.c": "d81b0ad6d05938507ebc3c0510021e889a2d68a74d50709df981d2339798eb78", + "components/ch405labs_esp_libssh2/libssh2/nw/test/GNUmakefile": "fb00a4a6776f14c1789ac8abc0b0136b79813177221355fbd3c5b1907da938e2", + "components/ch405labs_esp_libssh2/libssh2/os400/README400": "f5ce6d4f86e2334f5c271020195fb0964083e19e2f44dea4c4d62e7a9bc9f4da", + "components/ch405labs_esp_libssh2/libssh2/os400/ccsid.c": "07d12155f5b9b2be9e5477fc2818a7e98183eedc247370de04d718eef506fdb8", + "components/ch405labs_esp_libssh2/libssh2/os400/include/alloca.h": "f2b4c60ed1f78832b9141cb64e5d1d8e187d90afcb5f9f1d56dcf3f9e185d236", + "components/ch405labs_esp_libssh2/libssh2/os400/include/stdio.h": "ce35104d75377458c0c38aded5375141abf22e71215ef7533a482ceec279c731", + "components/ch405labs_esp_libssh2/libssh2/os400/include/sys/socket.h": "05599c77ea5f79337a77e7b24f4d63f40b929884141fbb66f356d825c09c8dfb", + "components/ch405labs_esp_libssh2/libssh2/os400/initscript.sh": "b27631198e5eea8048684f8fae95ef27eef1f712742265022bf4eb1ebfe589cd", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2_ccsid.h": "13a0b3c9165d7ef27ce242c64ae191f876a1fdd65f0b4d768cc3235c2509910d", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2_config.h": "313f35a0e84d1474dbdb3173585e53c417956a8f92365a75d5ae53faf179345e", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2.rpgle.in": "0ce3e5bb7c33bb6dcf960af6267b4c0e3cc16259ae881724624c9fafbcc090e6", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2_ccsid.rpgle.in": "439d9e4c68c9b20a618e305e51f54f817a9cc51dd37b62f5792232048ed3ff80", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2_publickey.rpgle": "b138035c36feb1816c6a99b1d98daff7997b05d02325cad1d9909f983e4a330e", + "components/ch405labs_esp_libssh2/libssh2/os400/libssh2rpg/libssh2_sftp.rpgle": "7d6fcfc290b07c8bafbbdfcf61e19456ab6961afe23a0aa142110052a33e7ace", + "components/ch405labs_esp_libssh2/libssh2/os400/macros.h": "38360f3613c00f49178996cf53d2519009a0b3fab161db7aebff143149730c5a", + "components/ch405labs_esp_libssh2/libssh2/os400/make-include.sh": "c75efa9eba5bcaa1e75f60110dd463c2c6866b486186db705d49518c1b0fd8cf", + "components/ch405labs_esp_libssh2/libssh2/os400/make-rpg.sh": "41cce97d1dec97571160c98967db4ab27af9c7890cf4f7aa238b3d6b6aa69eee", + "components/ch405labs_esp_libssh2/libssh2/os400/make-src.sh": "c750bd85a5153b10c61c069a7d1ec253ec3587554f2da60a144dc4246ff50e67", + "components/ch405labs_esp_libssh2/libssh2/os400/make.sh": "07f221c0d6a9e7b1c55e5d1cc8e3babe7edb6b4bad3063827b55265bec9456e4", + "components/ch405labs_esp_libssh2/libssh2/os400/os400sys.c": "2c9bc9de576376b0a37c401c64b59990e2f74ceafdb0a8c6555fb8de5be2b01a", + "components/ch405labs_esp_libssh2/libssh2/src/.gitignore": "b9193860f4137ca619b15f6f76ecbbf8df6210fc9a5ef2d53c856279e2b848fd", + "components/ch405labs_esp_libssh2/libssh2/src/CMakeLists.txt": "00462a0ce4e94446ee6c32616518db7f0539b90980d4d4a2929c295ff9dc8ece", + "components/ch405labs_esp_libssh2/libssh2/src/Makefile.am": "655563161c47286f17fd9d992f15115630e3910828e838f11759bd70bdc91357", + "components/ch405labs_esp_libssh2/libssh2/src/NMakefile": "bad4819608f02f282aae84462a7c3f1d1b199ee0fc86abdc9ab7326ee6482576", + "components/ch405labs_esp_libssh2/libssh2/src/agent.c": "29c2a52cba4eeac57ed9a3808cdefbc4e9e07f269152dddcc7038896eacce424", + "components/ch405labs_esp_libssh2/libssh2/src/agent.h": "1348e28650ce7f4350e4e1b92e26d7c45e729fe3b9cd68db716e40a64ea15269", + "components/ch405labs_esp_libssh2/libssh2/src/agent_win.c": "1c8d67a82e21c539c62f3a0b4c715fba81ca40cee588588d5e4f1abb389966b1", + "components/ch405labs_esp_libssh2/libssh2/src/bcrypt_pbkdf.c": "604344b6447e2da31608c00e432b3cb62cdbf11f25c6ba3c64f539a9f771436c", + "components/ch405labs_esp_libssh2/libssh2/src/blf.h": "b54edc453639a810289315bc3d4de37bc67bd0537260e1df7f8f21f5f1c36c6b", + "components/ch405labs_esp_libssh2/libssh2/src/blowfish.c": "23d5952bb059823ad3a3174d641655135991a9e849fadd00634516b977cbc17a", + "components/ch405labs_esp_libssh2/libssh2/src/channel.c": "0d23d9583e2f14c8f660d614ce16e8f48a41421434db588f19a953ad100ac3dc", + "components/ch405labs_esp_libssh2/libssh2/src/channel.h": "3be8e8b444461111fe0d35b21137ffcd4f681c1357616e0db4908bd434e97bbc", + "components/ch405labs_esp_libssh2/libssh2/src/comp.c": "0fd0cfb6b74e2d94a2da15b27e8e99e42f277dd12fd27ccf17bf566ad8009993", + "components/ch405labs_esp_libssh2/libssh2/src/comp.h": "7aa028c23316132522362bc9f397e22bae94e9e620eb80ac12a2009278532926", + "components/ch405labs_esp_libssh2/libssh2/src/crypt.c": "04e3683e3a16046aa7736b2401bdebea1feffc1e7fb928952dbd53adcc5a493e", + "components/ch405labs_esp_libssh2/libssh2/src/crypto.h": "9f53448f79e67731c2819b04e911228d47cb6792fe82ee818816f795cb40ffdf", + "components/ch405labs_esp_libssh2/libssh2/src/global.c": "9551963ca2fb9c321703db04952d9b05e2e6049e12d8bf6ba6e9291920b87a37", + "components/ch405labs_esp_libssh2/libssh2/src/hostkey.c": "563747e8648e09002894c1d2c93544013b17bfb3468c3e04a010306254aa865b", + "components/ch405labs_esp_libssh2/libssh2/src/keepalive.c": "acc373252f0624126226e2528897757da61c870374d5905df29a17fa185214ef", + "components/ch405labs_esp_libssh2/libssh2/src/kex.c": "f71ab4c2ba89fc4bbb560faaf955227297ece57378a984a7c67b41ef867aec1e", + "components/ch405labs_esp_libssh2/libssh2/src/knownhost.c": "2ef607c0bb2ef7ec9a4cf41158813ca8c62c55ace046a02a2b862cfdede25e75", + "components/ch405labs_esp_libssh2/libssh2/src/libgcrypt.c": "209ed04c45e4f9eeb903083853c23708d5748bcf77125664d613ffefdc2219dd", + "components/ch405labs_esp_libssh2/libssh2/src/libgcrypt.h": "7414cd0c7075c66402bed0c09fa082b40a264e50b443bc4d2d1f79991d8e5f8f", + "components/ch405labs_esp_libssh2/libssh2/src/libssh2.pc.in": "46db28ee6987b9f399c0e3b02dd5374fef2831fd4051109a478e85832e1913df", + "components/ch405labs_esp_libssh2/libssh2/src/libssh2_config_cmake.h.in": "07fe4470fd1643c51e5f2a868b053d733aaee891f1f886f4b8b848fb70db76cb", + "components/ch405labs_esp_libssh2/libssh2/src/libssh2_priv.h": "ea15b0d55cc80ff943c381e5c4758b1d6be9653b797a520ba50b8b85c5ce1818", + "components/ch405labs_esp_libssh2/libssh2/src/mac.c": "3ff6c3d22e5e9a0cc2d69b2f840606f560b83b9d40e276927d0854c20ec35b27", + "components/ch405labs_esp_libssh2/libssh2/src/mac.h": "ead9c368cf6700776d6083363a275e26d0e89de665b40b48fed1f5cd6d783b3b", + "components/ch405labs_esp_libssh2/libssh2/src/mbedtls.c": "0198525ff6b9255a7e3ab058d687fc041b3e704d1cb22584d32d6e8e57f3f133", + "components/ch405labs_esp_libssh2/libssh2/src/mbedtls.h": "c053528583d0eb839746addf0d399f86d20dfdcdac05ef977ec622f418e1177b", + "components/ch405labs_esp_libssh2/libssh2/src/misc.c": "6963f62e19e09399f871d7d3f87b16b8ea3810c8e5c38c3794b1c69efd3c1603", + "components/ch405labs_esp_libssh2/libssh2/src/misc.h": "ced7fa5c4d17e22c4f3f5407046ea0bb764ff11ca700257bfdc7728a0a89a9e9", + "components/ch405labs_esp_libssh2/libssh2/src/openssl.c": "88fa09c6324935ecee4c42f59cf5b07d069c3cc8492ab312404660fc23a7bf81", + "components/ch405labs_esp_libssh2/libssh2/src/openssl.h": "5140dd590337240cab5d2b2a4f11bb6e80b451f4e18cac77c973995b71ae49c6", + "components/ch405labs_esp_libssh2/libssh2/src/os400qc3.c": "130c4c3d3d202c4c1576cfd4fff5744e41908432ac79d8481363efe110938301", + "components/ch405labs_esp_libssh2/libssh2/src/os400qc3.h": "0e9f256b38da841315e5d82939ee52c8c947b6d1efda65f44d26cf2cd74b8db6", + "components/ch405labs_esp_libssh2/libssh2/src/packet.c": "55a13ba8b444f8cd62a9f0da3f07f982f5faf46fbf6df3bb825df1472db4c870", + "components/ch405labs_esp_libssh2/libssh2/src/packet.h": "cbd3fe922ff28675f6f39b31131d7832a07263356d0e7d55197e40d5fe244577", + "components/ch405labs_esp_libssh2/libssh2/src/pem.c": "d1adf7211b744554b8c41180c87e8d0aca2a7babceee91c75032e68655e41e22", + "components/ch405labs_esp_libssh2/libssh2/src/publickey.c": "3e1579cdc688dee088294975ee4b09316cc68cd9083ea6170a8d4726d820ea6c", + "components/ch405labs_esp_libssh2/libssh2/src/scp.c": "ef7120de5d824d9d4135b846021af8f42c44ff790dacabc8c4d23bb702abd81c", + "components/ch405labs_esp_libssh2/libssh2/src/session.c": "359f57b322d50a97ac7732bc84f22d9be9e336017a2cc9d050b06779be701bff", + "components/ch405labs_esp_libssh2/libssh2/src/session.h": "c3918ff057ebdb51116d7552e27b9f7d18461e1fbba4c1b635465dff909d4623", + "components/ch405labs_esp_libssh2/libssh2/src/sftp.c": "10a9f0076259b593fe45e71bee3b7a28ddeadfe8077a77fbbff4701cba7533f7", + "components/ch405labs_esp_libssh2/libssh2/src/sftp.h": "3b4d6460b857e32707116814f1ddc10dbfa5f804e407883e77bdad6c36db8c14", + "components/ch405labs_esp_libssh2/libssh2/src/transport.c": "77251235630878e6221516c1205b32ba786f15bd4d9afead8156a471e4312b4a", + "components/ch405labs_esp_libssh2/libssh2/src/transport.h": "4a57bc5ecc21db41729319d8fd34808f042cfa7d155be306ec2165f2d81f010c", + "components/ch405labs_esp_libssh2/libssh2/src/userauth.c": "80114428918476778385aed818ab2686a4691cdabe3b029e6d57c27431b91b22", + "components/ch405labs_esp_libssh2/libssh2/src/userauth.h": "7d930eb690721808c6d89ba917045827118a3b98b04333935d8e91b49f651b84", + "components/ch405labs_esp_libssh2/libssh2/src/userauth_kbd_packet.c": "d809a66f078569a118a944d69222ddfb5afcf0b529b245bb70725f7973a440ea", + "components/ch405labs_esp_libssh2/libssh2/src/userauth_kbd_packet.h": "f86686c43cc9ba1d9f6c8b62d801f753f350c9a3ddad3df42014fee8a2dc5eea", + "components/ch405labs_esp_libssh2/libssh2/src/version.c": "d766fe3f653d73f5a20110e7424224e788f5a42a7deadfaa8391b5a3f0694b90", + "components/ch405labs_esp_libssh2/libssh2/src/wincng.c": "c5cd20cd35a939c0b58a3311e29a8b3ba45101467a9673e693f783a31e7a636d", + "components/ch405labs_esp_libssh2/libssh2/src/wincng.h": "b9895f00d224866aac9ea1cec71ea72a2592ecd9411028ad1220869c4647edfa", + "components/ch405labs_esp_libssh2/libssh2/tests/.gitignore": "a76314b370eee3d3c44c53f5c64c9687e898909dcd3acca35aa3d483abe26e0a", + "components/ch405labs_esp_libssh2/libssh2/tests/CMakeLists.txt": "eaed8e184360a676fc5de691646a4049f7072eba226a1cef50c11cba0b55a687", + "components/ch405labs_esp_libssh2/libssh2/tests/Makefile.am": "2cd881e6ed013014f37ce5c318f39461745514c109f17e58db6bf88376908542", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/host": "6eb0f1bb23d7877ddcd502159e6673c053b5ea1846630f21651ab58ea25d7a6f", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/host.pub": "0e2479a973fbaf1f7f5dfebb111e2b199ee59c0dcfdf646d26760eba0b8b2aa8", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/sshd_config": "2ad4ea47ddb633c7a2e000f2d6619d08bf643591f26a7a0b92d0befe518ee951", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/user": "776aebc0c12e466e4b65f1a44ae5235dd70687ab03f283aa3d9a6df70d3bdbbf", + "components/ch405labs_esp_libssh2/libssh2/tests/etc/user.pub": "39bc4445c24c32fe5e64a6ee02025f3508b4334b2813e1a87c40d44ebc5f8c1d", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa": "2e5b8a618e853eff7b3e0d2928203529fe18a3ae62b46a82ccd48a750819b8c2", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa.pub": "12aecbb237794fc79d4a96cebad1c4badaa1902b3f1788cca83b28a1f977b895", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa_wrong": "21f66160d72789400c5420f460fb716cde82b5afc5c09f3f7512d310e3c8e0b2", + "components/ch405labs_esp_libssh2/libssh2/tests/key_dsa_wrong.pub": "0274eed003e62413aa894abad044296c6fb3cc19450457a282674ed3836518ea", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ecdsa": "8fb4d570516afc175869de7686125a828e18c38ddd4c2524c5a8d05c95ba7e7d", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ecdsa.pub": "bc756bc47e3afd11437cd40ebe8ce5c8fca92ee03c6e3f01b6c5b44001bbc7c6", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519": "18e808415d2f344a20b7cefac12f0df0af4e404f446f5c690000c21987ce8795", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519.pub": "e52bcbcbdcdbf547a121e92bbb6f5342375719988e33ffe7f228dd2b935c98ba", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519_encrypted": "fd1e9378f94f2d5514e16f32fcf175e8303433750c81f2def3814d5bd44a13e3", + "components/ch405labs_esp_libssh2/libssh2/tests/key_ed25519_encrypted.pub": "7ceb4062d5fe17f190eb32c894e4cfd76e00db7c1b16de7516df8f910649469d", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa": "9d8f4c955624a4af6fcb754e74e2abe1d3e7fe6340f6063617cd58bf122a2d59", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa.pub": "4293f28b7033d459618b277374d7e932869964de131bba1d427030cb5e70c297", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_encrypted": "fc3872744c7bf6db2df4ab2ea5701370cd8bd39367d659eaeae49b2dbe7bca34", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_encrypted.pub": "1f340ccab8b86e51d4ee7585d61d5e49e3a32338ba9eeca65988a1d751112c5e", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_openssh": "a146196a5b2189b40bc00bdcd1958165106ca21e72a7d02c0a7f95a6dd926487", + "components/ch405labs_esp_libssh2/libssh2/tests/key_rsa_openssh.pub": "d564da6c612286603a83af006c3a6efe53885a2417aa25f234818612e16bea66", + "components/ch405labs_esp_libssh2/libssh2/tests/libssh2_config_cmake.h.in": "193a748944f6bccd3787b1c3958ddf95c1c7ad9b25e5b8f4b42cb48987e34668", + "components/ch405labs_esp_libssh2/libssh2/tests/mansyntax.sh": "71c56796eaa4008910b3d67b885b9a7e2c018d0f88be4bb290334afb9ff23bde", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_fixture.c": "60c179e44b04a81f1bbf09aed2cb0f0dc85345070fe83b97ddf8c29219fa5d68", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_fixture.h": "21935165166ce4518c6534070cc506fcd85ece95238fef29e6b0be784c05d7c0", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/Dockerfile": "bf498e530751418dcd88ba439ad3f84837a7fa2d0f6ed2d2f2351a1097c11550", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/authorized_keys": "58c4cf998535eb4123eddf7cae7da4413eed50e3827320187380ec7925fcf61e", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_ecdsa": "14e72246d3990d345c30cd3d06c5c7ba9496057d94da2f5a6f14a7c636663206", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_ecdsa.pub": "2925ca6bb4d280aec3dd68041efc2f06e959295932a26f73a263c939c03e3220", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_rsa": "7297a4c658d398564d75964e503da94e845a0d709f64b393e3017e66dee0fb4b", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ca_rsa.pub": "338886a78519130b9bac71b7e8f370256d5b3c9d249fbfd2d7da90dd1574411f", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ssh_host_ecdsa_key": "03753b2b4942081d1f33201a193487ebd5a577e0bfde45f7e03a1de5ae404688", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ssh_host_ed25519_key": "18e808415d2f344a20b7cefac12f0df0af4e404f446f5c690000c21987ce8795", + "components/ch405labs_esp_libssh2/libssh2/tests/openssh_server/ssh_host_rsa_key": "11a57dc115ca17203d6382ad6fdcd8df33bd0f23ff6bf38ee4a697260ffd1a11", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/.gitignore": "b768be5cb4da9a7050fae93fe7b2c01073cfbc5ff40cf88ad63b6f58d0202292", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/Makefile.am": "049665a167b9f4cd664b12884ae4470c0b0b2077931a056ed55d61784b230d88", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/ossfuzz.sh": "6fde8ca30e3dfc0ade9da4d06f5e34f73a51c6fea72e3a1348cf5ced10b73d80", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/ssh2_client_fuzzer.cc": "cc7f1e67065aa6938b7e9bf8aa237d1414052c1b91ed222e2baa61e5def9bb69", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/standaloneengine.cc": "f6eb3ebf7e14252339a21fb887a08b2e7638a7ac77f706ed80508b2c0d54d81d", + "components/ch405labs_esp_libssh2/libssh2/tests/ossfuzz/testinput.h": "ce435e13e87abeec0a297ef3b566268496ecbd517c1d09dfa2232dcbbec9be2c", + "components/ch405labs_esp_libssh2/libssh2/tests/runner.c": "696b83fd77bca60560c1609212c59ad986bf151cf72520b63d23643111a7ce4e", + "components/ch405labs_esp_libssh2/libssh2/tests/session_fixture.c": "975103411a50f033df3b97b9a50136b39185dcb521765f7a6cdc52d5438e4b55", + "components/ch405labs_esp_libssh2/libssh2/tests/session_fixture.h": "d4f098a586b5f7dd0f3785b86933c08096bc12a2e55f07fff470db6fc7bbd076", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_ecdsa": "796da5d8d420f644f47feffffb0357ac99b299471e4d757f21b6cc8bfefe8f0d", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_ecdsa-cert.pub": "0f2e6d1b46874a01cc36ed766533301622d64fa88988575ca77eee56da7b3952", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_ecdsa.pub": "d6b6f80d9117f896b99933eba19b012f55068ed8b77956f1a7b0510026c2876f", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_rsa": "934d51f8e803a1c10125653a14153e6838ee9081f87eb6dbbf87f8f214a43264", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_rsa-cert.pub": "29091d3911e30d80149525c8c288e66c5a8a99fdb3816249aad5c5886df0ce5c", + "components/ch405labs_esp_libssh2/libssh2/tests/signed_key_rsa.pub": "4b742a4f19b1b468d939792135ce6a7b831dd0c8f737321c09a1281d7eb49427", + "components/ch405labs_esp_libssh2/libssh2/tests/simple.c": "4afdeef598aa669b5cd0e7388dcf2e579f2c0f9c954face71d366250101d270f", + "components/ch405labs_esp_libssh2/libssh2/tests/ssh2.c": "3a8605fd3dd6151c569bc12c07ecdc33de7d704b6224da2dedfe3c76494e015b", + "components/ch405labs_esp_libssh2/libssh2/tests/ssh2.sh": "7bbe65ee20f4e47e9264bd74700cca16ee066aba5fb9e4e42f46e1cfdae4930e", + "components/ch405labs_esp_libssh2/libssh2/tests/sshd_fixture.sh.in": "c8b93076f66222f73329472ec151b210e55b39024de5d3c18a4c609b65d13b7e", + "components/ch405labs_esp_libssh2/libssh2/tests/sshdwrap": "21649ba440cd534f4bfd52c0a8de339565768b373c172dca106cffcc8bd06e09", + "components/ch405labs_esp_libssh2/libssh2/tests/test_agent_forward_succeeds.c": "a5b9f9009c6818b86f235debc2ee15de5ceb0cfe1d9b539270167058afb4e6ac", + "components/ch405labs_esp_libssh2/libssh2/tests/test_hostkey.c": "f1059c3ac304332342f39f32288afa3f61f9bdbd5d617fe6052491b20bc0672b", + "components/ch405labs_esp_libssh2/libssh2/tests/test_hostkey_hash.c": "e745d8b4ad92c858dc588e3494e183f47d591c1ef2a13b63e2122f478545093a", + "components/ch405labs_esp_libssh2/libssh2/tests/test_keyboard_interactive_auth_fails_with_wrong_response.c": "32dfdccb447dfc0b17423cfbff8971771bf260fdb72e3c7e23ec6f62105c9fd2", + "components/ch405labs_esp_libssh2/libssh2/tests/test_keyboard_interactive_auth_info_request.c": "3e3bd0ab170d9d782a08540755030a4b1e1ad5129003381e0f19543b1005c438", + "components/ch405labs_esp_libssh2/libssh2/tests/test_keyboard_interactive_auth_succeeds_with_correct_response.c": "db57b8ed26a1314d5ef534036f383b12363d88ce54e0377086a298f276e9481c", + "components/ch405labs_esp_libssh2/libssh2/tests/test_password_auth_fails_with_wrong_password.c": "e3d588d9c6850ab69bd7674d2027563ff9f1491740637506d80875e66609974d", + "components/ch405labs_esp_libssh2/libssh2/tests/test_password_auth_fails_with_wrong_username.c": "c91608bdda3a83a62876725ae2d7002ccb3332bcbacfc9c9578e7488c0ed4cef", + "components/ch405labs_esp_libssh2/libssh2/tests/test_password_auth_succeeds_with_correct_credentials.c": "80d253225d68bcb7dc4b94b53374aa4de86c6995481de0974b6284bf87a91583", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_fails_with_wrong_key.c": "104b08aa9bb5f1006e07e59dece417a2d6a5f60ef6c3f8dc62b6a8af95d413e0", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_dsa_key.c": "4b397de742f0d2fb15e86d20451f109fedd1ba28b0622496a2d030f9e9f9ea5a", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_ecdsa_key.c": "53bd6d99a243aaedc20f7de5c974c7c04e38090a415d338cef2d7357d7644912", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key.c": "207f499812271669d2a9ff5a286761a45840de9230c07bf72426fcd59a682317", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_ed25519_key_from_mem.c": "4dd0a8251a41d0dd68490fb7abb9b0a1cc190af1603815f3050e29e2a7d6bc8a", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_ed25519_key.c": "6e5c107ad53c144892c54459f89ef2cf8a25cbf977bbd978e4517cb5959a2565", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_encrypted_rsa_key.c": "dbc95a803a54364604ab379b512fc98c33d791a1df4e33e4027b881ecc2e75ed", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_key.c": "93cdd2513af42d46552baa273401910dedd014951f836175ec98b827532c5b6e", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_rsa_openssh_key.c": "4e6d3ace02cce1ba8c1b4b6e5d774a8a4d259eef8314fe6c3ae0d6003a87dcd8", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_ecdsa_key.c": "f16a0dc74d16f0d27f10867f0ddd5b306fc4b16b2bd8e401a5451ce71c7649f5", + "components/ch405labs_esp_libssh2/libssh2/tests/test_public_key_auth_succeeds_with_correct_signed_rsa_key.c": "e8744ea49f5e4be9798d7ea2a93fc05bd6d4519a4bbda40dd80c421a7cc33ce6", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_config.h": "1c5c4ba6ab33bd1d9e4ce0d84e1107ced89d27a80e8505e1b428fa942edefedc", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_example.dcl": "7726a5d4f07d522aa712da8a6ca7b998cd93ca950aaa544a5eed1790dc69c775", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_help.dcl": "9d04ddc32831abf63b7e042dd0677da83599f11497d364b02cbe780419e248e4", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_kit.dcl": "e7c23c9db4583f6944cd8973cd813a6d65749170417b8384f94db69597f81f1d", + "components/ch405labs_esp_libssh2/libssh2/vms/libssh2_make_lib.dcl": "1549134cd4a4bdf2543f900ea9c811de1c67895e1e830f7ddfb384e7601f56a4", + "components/ch405labs_esp_libssh2/libssh2/vms/man2help.c": "ae61cab505a4a9c87bdd103506ba9a36fd7ba92714edd9f67d022d8a9474e6bc", + "components/ch405labs_esp_libssh2/libssh2/vms/readme.vms": "30b5d682da37cf16352152daa682cb04c56e1044c77fc4c4da77bdc9709c33b8", + "components/ch405labs_esp_libssh2/libssh2/win32/.gitignore": "06c9a331f6578cc30ba460b468e23c59fa31f5ef07c7525f5cf1c6b262d32d3e", + "components/ch405labs_esp_libssh2/libssh2/win32/GNUmakefile": "776238af38e7fb1ac52fe22c261f28e7127152184d7f561fc3ccdbc92e22b28a", + "components/ch405labs_esp_libssh2/libssh2/win32/Makefile.Watcom": "475b8b37143bad986386ca1d2c777e9f8e46d0172ca4e9f70c613c84bbdece4f", + "components/ch405labs_esp_libssh2/libssh2/win32/config.mk": "e2172a92c5b5b9f2215c5c11128009cb6ba8a1f25402990c1f7e8ae78449d289", + "components/ch405labs_esp_libssh2/libssh2/win32/libssh2.dsw": "b497be91f342d18d34c61b8e3d1d9a200c3c17c306e16a71621c467f545ca083", + "components/ch405labs_esp_libssh2/libssh2/win32/libssh2.rc": "29a25c29ed977ba78619a59bc858508caa6f0849607c02da8fa7fe71b6fb7195", + "components/ch405labs_esp_libssh2/libssh2/win32/libssh2_config.h": "d5e704c80aca43c33698bd45059eecde05b098049192bb9f0640af593cdb2cb7", + "components/ch405labs_esp_libssh2/libssh2/win32/msvcproj.foot": "d2cd7c9492045f6a9384010e9cca3c91e2a60c2e54f64680f72d94bbfcb387d2", + "components/ch405labs_esp_libssh2/libssh2/win32/msvcproj.head": "e0739f82a357ab5871aa44790521d50a80b74b5fe638c59ffb41b97c98404930", + "components/ch405labs_esp_libssh2/libssh2/win32/rules.mk": "5f68dc0a3ef0f61d783289c98c00419a0a76a2b866ecd0f86404ca1d3effc12a", + "components/ch405labs_esp_libssh2/libssh2/win32/test/GNUmakefile": "e2c77b03fa88a88d90fe1dcb6c095935ba99b03b56a78f101a373ff208e1369a", + "components/ch405labs_esp_libssh2/libssh2/win32/tests.dsp": "9c206fcca8e6ce5bb88c2278aa7d74ab8cf740d687779ffc66161ea4cc00afc0", + "components/ch405labs_esp_libssh2/libssh2_config/libssh2_config.h": "4d564e905c0f8a3eb92e55df2874b2b9ff8e589cbd6033e466129f107a3dd35e", + "components/linenoise/linenoise.c": "6401447c2b43c26130bf14302d8a2f1ccf4264598374418699722ae98460f890", + "components/ts_api/CMakeLists.txt": "f1cd2808b27affc21540be76b960bb87044b96be6a9859257563469b3724ef32", + "components/ts_api/Kconfig": "f887aa9f114a9715e286ca3d55fe77f98560cbb1cd9b4c63cd55dd5830386b64", + "components/ts_api/assets/lpmu-agx-network-setup.manifest": "8a4e7f5de0570f69c2a6a33cb2ee6c28afff763d364c7999cf70a76bf418769b", + "components/ts_api/assets/lpmu-agx-network-setup.tar.gz": "77ac9410a62eea50b2a5079d3a7adb1012deee1188c03e0a5cfb4609e4e5f636", + "components/ts_api/include/ts_api.h": "06e9e6878b7624461d9f690cecc169e684075454429e9fc21ae09f8563d6ac69", + "components/ts_api/src/ts_api.c": "56635fcd468d3f39fc06a04f6bca4dc319b8ab125b2dd93b3050bc879cf2bc14", + "components/ts_api/src/ts_api_auth.c": "be45df1d19803e7771d70f19bd5cf970f6ed51b3b20f55ad73b529fedf19c66e", + "components/ts_api/src/ts_api_automation.c": "01ac4e75a4e64b51eec7b6e5c8566c01a86ca9fe58bd3774929515f0178a3d7d", + "components/ts_api/src/ts_api_cert.c": "25af390ae3ed16eff746b2b49c3fd5893d418dc91c6106b5dbe1511f2885b7ad", + "components/ts_api/src/ts_api_config.c": "1eaf82f2f82c228de7e00c86fd3d500883107917014a5e506cd24fb60d13c667", + "components/ts_api/src/ts_api_config.c.bak": "d5f055134e303f3d724bcb65e3da8417b2d20876b2909b93403f7a3bba1d7a1c", + "components/ts_api/src/ts_api_config_pack.c": "5aa2d353b773bbd06b6235e579b540c17211534ed5440c4adfb40112f4c96968", + "components/ts_api/src/ts_api_device.c": "7f3714eb9857d069bcf6861a271ce95ed21a86b4446a99fb889486e085e5b7d5", + "components/ts_api/src/ts_api_dhcp.c": "45d3b4ccb5d6bbb3f68e424b5762daa8b0743da1575ef200b315468d65b071b2", + "components/ts_api/src/ts_api_fan.c": "41e8d20c253867f334e9b9517258c7abd6f2f34c935ca4632d27f6a627385432", + "components/ts_api/src/ts_api_gpio.c": "a508837fd3c59b00ba6df75b97e9ad496bc633b44db0167fd703b9d7cfc67284", + "components/ts_api/src/ts_api_hosts.c": "d65c9183c5064a177e594cf57a98142263542de501564d76134730b178483719", + "components/ts_api/src/ts_api_https.c.bak": "a1200dac515be89fabc14dc850c36c9df92f66834876ee25064477444b17de0d", + "components/ts_api/src/ts_api_key.c": "7b06d396f2d49f4bf17bea6eaf45f96a73712502778f912c725bf46b8aea8ca1", + "components/ts_api/src/ts_api_led.c": "d46955f01a5ee7c364c0b549cd4f035857295570f3f7be7ac8d271f684c99849", + "components/ts_api/src/ts_api_log.c": "4887b2be40a0ef3a534f86a66c1a24a7a3f3f3d07446380b7d0c65d62095cada", + "components/ts_api/src/ts_api_lpmu_access.c": "c0e2a0bf52d476a11f922213b2bd4de475cc793c6a3710aa705ffde7101b6571", + "components/ts_api/src/ts_api_monitor.c": "a33e2d70b807d8be2a752ee2a95d3e42991d3d3e84622bd725ea8680fd68420e", + "components/ts_api/src/ts_api_nat.c": "87f254d083090678b3d96fe5923dcba919405ff336608b2a29220692e21cf255", + "components/ts_api/src/ts_api_network.c": "41f60810337f7cb7ebea6646d50878aa753b7942cfa45007666d47fa26162a8d", + "components/ts_api/src/ts_api_ota.c": "0052993718bc857ac770dbbbc9b6067f8db1eefbddee5d5fe9da33b299d4bb78", + "components/ts_api/src/ts_api_power.c": "dc65cbe9c56a8478913f148ef21315878e2d9aa13518d2b20a407e05b8b2d1b3", + "components/ts_api/src/ts_api_service.c": "54638eebb7c4604713e597c1f058791e13833dd407aa9faf906dc4afb767e0ff", + "components/ts_api/src/ts_api_sftp.c": "af147747910dff5c70a21c423284764aa48ccdf0b69ec51307a080567c30c334", + "components/ts_api/src/ts_api_ssh.c": "edbf7f6a4c80f3b15a75e7b39096ca0e6fe6c98ab1cc5c3e3091b5c947646ff7", + "components/ts_api/src/ts_api_storage.c": "2d609316f08eaa00de84649cf52e38fc4c9558d10dce855dfb6c44687e12eaba", + "components/ts_api/src/ts_api_system.c": "e9668b91761222e6ef4f840feeda118e45f769ca9c86c8e9c5c6749b150ab31d", + "components/ts_api/src/ts_api_temp.c": "76dc78ecc8dac1b468e75e239ef57bef6ff84945510d626b291973f12f4b4b62", + "components/ts_api/src/ts_api_time.c": "0ebaa8796a37b1d965b51f9cf5b470d768b74a34c79c6e11184f082979c20fe0", + "components/ts_api/src/ts_api_ui.c": "ca2f0446c6cb0e42b4880fd48be4b7a52fe666a0eae3d9e828ade9289ab7358a", + "components/ts_api/src/ts_api_wifi.c": "54b7eebeced862a7bc75ef17acd9e5bb46faef526373c1a6300564a36bf0b4db", + "components/ts_auth_layout/CMakeLists.txt": "7436be669438b64ef274022bb640e47f4b009c9a0ca14b4e6128b70ba1688b33", + "components/ts_auth_layout/include/ts_auth_layout.h": "c208b11b4617c94fd0aca8041da6dbccf146cf81168a56d98afcd5f205867c2b", + "components/ts_automation/CMakeLists.txt": "5f6513d53d29951ea58531984c1c4a23d8cf9444ff9784d305cccbd13190472d", + "components/ts_automation/Kconfig": "38cc856f0951f867e771084ad7e22a8f237c4a10358f9f285bb4f4617d1f3df3", + "components/ts_automation/include/ts_action_manager.h": "af18f369c569389caf2ca033f34b234a18b724577334cc5731f9d0d449f85485", + "components/ts_automation/include/ts_automation.h": "fec1551e90c8b0e0acb0b4355c695d90213d94247659db99670c9782c69bdc08", + "components/ts_automation/include/ts_automation_types.h": "e2c9becd036d1322fdf5f40ae67df8a6d23c53f411497368e61fbe557a9d597c", + "components/ts_automation/include/ts_rule_codec.h": "501ed7dbec67e52807997cc905b41bea86d71f119cd4b31b9f460c0e0ba54a26", + "components/ts_automation/include/ts_rule_engine.h": "70d0d72afb2ebeffc278e1c844663049a5624cd2365311c0116f40f057b76a74", + "components/ts_automation/include/ts_source_manager.h": "42f2e1281ea0644a47013d3eb1a35cf6ecfc6115627b75c8fda3dfb7b4e0f78d", + "components/ts_automation/include/ts_variable.h": "136b371f4d0fab848c8c2ae15de4993b8786479af64e4c87974c8e26d1be009b", + "components/ts_automation/src/ts_action_manager.c": "837efaaa4e418681f102b9ae1b610dd05513a53fd820cbf8c55aafb00b2fc849", + "components/ts_automation/src/ts_automation.c": "be565cb980d822cbb6081a32d07e560dccbde6a254a06d0d06c10b92b9113ba8", + "components/ts_automation/src/ts_rule_codec.c": "aebb9914c282aeda99ca089ec1ed2af93efac865ee9b0e2a57d9c6abec9f828b", + "components/ts_automation/src/ts_rule_engine.c": "73e6627c2ed8aade04c3d102186fdb837415d223864a1080f9b7714d7c39b06e", + "components/ts_automation/src/ts_rule_store.c": "e96b4119e512751272ca8dc58fd553052895ecc5c742db9c47c34bf264d7772c", + "components/ts_automation/src/ts_rule_store.h": "ee248de2197d6027037980166f8a90a240214ec2c7a17c0e4097c0820e3add95", + "components/ts_automation/src/ts_source_manager.c": "4287f8ce547c360db5c30af83f62123864831730bd0fbc5b34feb522957beb0a", + "components/ts_automation/src/ts_variable.c": "9740db1f2a06a2526354cf573c1ebdd3c512bab9f9175aefaca38f8eac5c4dcf", + "components/ts_cert/CMakeLists.txt": "6d1dda73f66bc98f9f0b7c2ce62815b6838a29d3a61b7b9cfe425dbbcdfba058", + "components/ts_cert/Kconfig": "ca7b4e26d3f4387496223412d1b60286a5f0b627e1de2b72a3f1985b373aa18e", + "components/ts_cert/include/ts_cert.h": "aa04c0b71ac78426f99d4cc18d950d03ceab09039d35ff048d83c49739800406", + "components/ts_cert/include/ts_cert_time.h": "9e99dd1b179179359c620770d4b455a77bcc9160eee9fa09ec4fa33c2534eb18", + "components/ts_cert/src/ts_cert.c": "0678876ccc7534f57baeac0ed2e622171db2a512a0b926c984fa9efba4279b10", + "components/ts_cert/src/ts_cert_time.c": "4bf5e0463ff9f9e998a740cf2ff2fbe2102780e89755ac59e1c75d6d4e9f8be0", + "components/ts_config_pack/CMakeLists.txt": "ebab95266f939e82d44ad81e786b865fe6a96be4d93644d26ad7ce0f4b3367b6", + "components/ts_config_pack/Kconfig": "4f3700b1a4fc1ea6e7bfe0e241c6844fe011033cecd9ce63c6c344dc885d7a6f", + "components/ts_config_pack/include/ts_config_pack.h": "c9495aa678a2122384bbb69fe5539b79f130f3c9033b801a9d3e803c8bb2e2cc", + "components/ts_config_pack/src/ts_config_pack.c": "3041f81b2d949d10e1c0b64c7810c7cc892a8d25f27f8ed6375f1cea07fc2a80", + "components/ts_console/CMakeLists.txt": "844bd8be8bd6d63b6c0ef8118cf32b291562982346fdc7246a0d9fd03a586aee", + "components/ts_console/Kconfig": "8b835fb6fc27abc7491581c4f320ec600f70aac4874afcc78b98e280eacbaff4", + "components/ts_console/commands/ts_cmd_auto.c": "e57b47ab327f04911afe72b14edd3685db9c9bdc9a6fe46f90298483a1fd4754", + "components/ts_console/commands/ts_cmd_compute.c": "0d6395aaeaa7a93109ea25c71f53f3af11f7bb5efc1ddca05298a30460d0134d", + "components/ts_console/commands/ts_cmd_config.c": "28dc46db153b4b3a68024d5bc3ec37001df4d6d4bf7cf41e1800c4be30005d77", + "components/ts_console/commands/ts_cmd_device.c": "f3d82977bc6f499f45c04cdb02aebc67756251bc7683270823e40bfad5160b8f", + "components/ts_console/commands/ts_cmd_dhcp.c": "53609fa0ad1af0b5b91eff63b65c87a367f6fd8edec3c68cdcb30dc2f2f84145", + "components/ts_console/commands/ts_cmd_fan.c": "599db48798328646ce71fb26f19734ecf4e634fce9c4aae1da1241d92fd8f9f3", + "components/ts_console/commands/ts_cmd_fs.c": "3f236843d1b1982d48311c4ff5c6ade2e07819cba35b2823dd67e17b77aad5e7", + "components/ts_console/commands/ts_cmd_gpio.c": "33959a8512d0cfaaffd038ed3449ace567764a813fafeedbb722b1fd41dc6dea", + "components/ts_console/commands/ts_cmd_hosts.c": "645e96c17ca441cbd8cae5caf0a3b81d66f7aa9a62972efcb7d86d9acc06f040", + "components/ts_console/commands/ts_cmd_key.c": "78dd3af63ba9ee2f4e29b4b9142d17f860415ebbc5852b0bff9856c5cdb048ce", + "components/ts_console/commands/ts_cmd_led.c": "8d535e208a3ae3777468edcff5b5a01211fd1e02f600777ecf29905cf8669676", + "components/ts_console/commands/ts_cmd_monitor.c": "526c49802f6f34d4b9f5d0504eec76a3a2e06163df2bc3dee6d73a873a404b18", + "components/ts_console/commands/ts_cmd_nat.c": "cd4de61f4135904a1b063f8bcfacdfca177f38fe14f69bdac8fd6052cec0af27", + "components/ts_console/commands/ts_cmd_net.c": "5225f73d760d6da98719bf0c3551abb4366d087174487fb3246169fc232200a2", + "components/ts_console/commands/ts_cmd_ota.c": "403179e5d864a30af5289014fe2ce677cab9cecf6876802baa32d0fdf1cfd932", + "components/ts_console/commands/ts_cmd_pki.c": "85bfa318ace72dd40ac9208a3ad8af11afb33120e2e2b61de3594f2e5be4b16e", + "components/ts_console/commands/ts_cmd_power.c": "77ec359cbe492d3fb90318716c142c2408901f5e50a3c4a14073933cab7ffa8c", + "components/ts_console/commands/ts_cmd_register.c": "33adbed296353e1deb9f97efbf1139ad4c8a7ecbfa3cc661c2236f31529c4630", + "components/ts_console/commands/ts_cmd_service.c": "bb62b73286bec5d6c5f184ad8ddde9657b96042ca4ddbf75dbc60c2bb9fa3388", + "components/ts_console/commands/ts_cmd_sftp.c": "12ef96104441fb58dd07aabcfa32e28dc2617957324460700c75ea43d91e4181", + "components/ts_console/commands/ts_cmd_ssh.c": "7878385dce3d19af0a45e5dd5f264c95ce7cc0a2ee5afcd47d326adbf359c722", + "components/ts_console/commands/ts_cmd_storage.c": "9c7c581d9cbf82ccf5b91eea4c5f4683aef82ac4378bc750394f3236fa479114", + "components/ts_console/commands/ts_cmd_system.c": "1ed44e7f13f4aca20c352d734dea23150346ffc46645dab9f62e9baaac45d2db", + "components/ts_console/commands/ts_cmd_temp.c": "fb163a57281fab7d5a7732e2be9dfde0ffc169dc05d720123d0ee4fe9e6b7a0a", + "components/ts_console/commands/ts_cmd_voltprot.c": "975cf460bccc27660cc93bf0130d2bbd385369616b8ecbb48ff32096f16db3ae", + "components/ts_console/commands/ts_cmd_wifi.c": "c3042a507001b54a14b3f8ff5f32ee5d38b305d156c3267cfac2a23f2e3b3824", + "components/ts_console/include/ts_cmd_all.h": "2f76f6ec1ba074d28deb15efb4d0272607604d0b809a52fdf506b15d5659cb52", + "components/ts_console/include/ts_console.h": "f107554abcf4de2655e2bb129f5bece338ca9126e89a546b102a9bff9d92400a", + "components/ts_console/include/ts_console_args.h": "98084002ced0297f0f92824510271e56af90199442518c392d1fba3907cf624b", + "components/ts_console/include/ts_i18n.h": "9ce79a7c63c72fc49899b7614bf9a751808183de90b5ba2a228e2fffea1f1d9e", + "components/ts_console/include/ts_script.h": "a7f8c453393ac94e2c4d562b1bd8a715a21884ab7fbf1f2e19ea5acbf1ea2abf", + "components/ts_console/linenoise/linenoise.c": "ad81b74f8d3482c1dfbb37c34dac1b40a401ac5384a9c3348046ec66fa51e679", + "components/ts_console/linenoise/linenoise.h": "67d0d645bd392175ee75d4e94f2cd1bdf0eb086679d5fd77a6b90c449dd6d94a", + "components/ts_console/src/ts_console.c": "00407de9165403958c3a33c15425a4a527045ed00ab72820c3d011df52c1a6c7", + "components/ts_console/src/ts_console_args.c": "2d47c6c9ab6bead1302cdb2fcdabd14d6c0304e88a3418997965993c7e471863", + "components/ts_console/src/ts_console_builtin.c": "80eef72644309badf1181b6e98e3dc336ade99baaedfe9fba95d83df82bdfb2e", + "components/ts_console/src/ts_i18n.c": "c3d384a39ba32f27f142accb8dd17b06ca12722546332058add1490eb4f5d994", + "components/ts_console/src/ts_script.c": "034fb13082dda23578b2b20800812b59cc155fe77ed788a2247903c834b9c8f1", + "components/ts_core/CMakeLists.txt": "326c89b533f1a3a18f4a567695ef66aeca7ebe2b53ff9363ca466208e0e65905", + "components/ts_core/include/ts_core.h": "9504ead739f5011bfc7864103464bcd7d8c06eab2242d89391203164e9210197", + "components/ts_core/ts_config/CMakeLists.txt": "84e0791274bf45e4fa2c3373bfbb8f6ddcb2883c3dc7234a15fffd905a2dff9f", + "components/ts_core/ts_config/Kconfig": "7d319983a89dac10bd815eb94af1b0665a471e68709c6500ae298756161931c3", + "components/ts_core/ts_config/include/ts_config.h": "4945666dbcc7eb507f5a740061340a692e5add4ba3a4e5e421bd656d8b24b4ea", + "components/ts_core/ts_config/include/ts_config_file.h": "2d3bab9796164c3c2d945f2abd44e38dbdb37243283a62790275fe7872e65b78", + "components/ts_core/ts_config/include/ts_config_meta.h": "b649ab500111f98ba9035c525a625fc7ca21e0e553db1c978e03b35f24d43826", + "components/ts_core/ts_config/include/ts_config_module.h": "94873dac21ab86cc2f4eb4d7265588457e97e4386602773a3228c49b864bb472", + "components/ts_core/ts_config/include/ts_config_nvs.h": "2ec4ec9940dabd37df9de6f69d314583e1e77546c17fd67ccb5673a50be8a142", + "components/ts_core/ts_config/include/ts_config_schemas.h": "1b7de493a6e88d10155b558510e6ae4a72e31fbc1f77510c98b1ee8912ed94c1", + "components/ts_core/ts_config/src/ts_config.c": "c9a7b95660bfb29539cf323acd0ba66db8359a094347ea23740766a3b9721aaf", + "components/ts_core/ts_config/src/ts_config_file.c": "c61d01fec4b55560963a7995885c375f084dc54ee8ab52b47288eb68cd4403c0", + "components/ts_core/ts_config/src/ts_config_json.c": "be09570bcc58ef2dce1b4cce5968d2a0ce5a5ba0451295278ff16a66b7c32428", + "components/ts_core/ts_config/src/ts_config_meta.c": "ecf781cbcb200e56689bdaea34216cd033bf477eb1087eb1b03413334d2c92ec", + "components/ts_core/ts_config/src/ts_config_module.c": "f2c74dc811a31d4b5d0be2f2105f937ddddc5f52345763715e6fcaa6a74fbb8e", + "components/ts_core/ts_config/src/ts_config_nvs.c": "8dd95d5c09611a856e49770bc30ec971bd313cf759d833a6f97605f1dc6ef0c4", + "components/ts_core/ts_config/src/ts_config_schemas.c": "522aeba7427df30b89ab3ffb66b8637d3cf0c247af7133cdf2c04d45930994da", + "components/ts_core/ts_event/CMakeLists.txt": "c7f2d8ef1c3ac4e5bbfda512be49c5ade6acebf651ae8913e36e3f7e4ddd7506", + "components/ts_core/ts_event/Kconfig": "b1cf0bc9fa8ad38744b11d594a6f3aeb077a8ab88950c9695058e95aaea18929", + "components/ts_core/ts_event/include/ts_event.h": "16a1e76fdf93b97fbb5de2d0bd9d87d2ab8b3c9a55b1e63f1708860bc0632e4b", + "components/ts_core/ts_event/src/ts_event.c": "197c0aa5d942b10ce56fdb1245f42470e76e2827af183f905733ec84cd7faa56", + "components/ts_core/ts_jsonpath/src/ts_jsonpath.c": "115117f7a1281562ede7fe5666ba313cba8819742c8c22547a1ff0d0c9252c6f", + "components/ts_core/ts_log/CMakeLists.txt": "d149529554e03487f45cbf2f04d2989a996b328d94818614a91dfcba97c2697e", + "components/ts_core/ts_log/Kconfig": "35cb224534047beeb071dc83802e4c4532849b38d87e5feb75be5eea0634c972", + "components/ts_core/ts_log/include/ts_log.h": "beca44f4bde1ecba236f2a15d6a9bdd8037b3bb29f395e25b2f8ba4696847b57", + "components/ts_core/ts_log/src/ts_log.c": "c0cb7132cc80baa5ca03edb1adb13b0dfaa136bd4a0fd958307a43960be47b6c", + "components/ts_core/ts_log/src/ts_log_preview.h": "9e05ef9413323fc1ebe476e8fd73cf959767ceac9db7b4a5ddce17839e49b509", + "components/ts_core/ts_service/CMakeLists.txt": "ec3f90c75a8342547444c03165f61c9e9d5dfd1441598ede2aa93cf1711fac61", + "components/ts_core/ts_service/Kconfig": "3ab9397356f4485ed636b1af167714b75fc3d219386b8774ffe3bae6cfbd4675", + "components/ts_core/ts_service/include/ts_service.h": "2bbabd7738c2fb19880e45c0df169e3d5f6a226bbe1affdee030a7ddf8b2dd87", + "components/ts_core/ts_service/src/ts_service.c": "326b3ab1d4a61eba8b9bf43af26039fc4562092cbea19709764104278c79ec2b", + "components/ts_drivers/CMakeLists.txt": "22ee0589081126d02231d52d9e6526b095a4b5c13ce2cc97cb1e5666e848b8ca", + "components/ts_drivers/Kconfig": "55bfa04880f382bce54b4aae233d0f23488bd94ce8e3fac01ceee49477034427", + "components/ts_drivers/include/ts_compute_monitor.h": "b85ce79f490986e6b64ec3b12bef425576b5dec0121c0237f8cab34aab772703", + "components/ts_drivers/include/ts_device_ctrl.h": "0d203054b4b8dfe970d408c706fa1e123973b9bdc52583eec63162eee25a8879", + "components/ts_drivers/include/ts_drivers.h": "56d740b76b1401407f81099e521cd514e617fb1cdd3aaf9eab727a86dd327fd2", + "components/ts_drivers/include/ts_fan.h": "2a30df271570bff942383c46e368f232db484627bbbbb29b77a49a2155304cba", + "components/ts_drivers/include/ts_power.h": "1961071837745a2e5db6290e65bd4cdf8465a6e42b181b24f13ec642a80cc45d", + "components/ts_drivers/include/ts_power_monitor.h": "1e1b1f246f6cea8d05881e9960d2db7fd25c4185544ff8659dd8556d8f68636e", + "components/ts_drivers/include/ts_power_policy.h": "1f8475392cbaab61e90470ee0a246a67f4f8760392026318e2a56ea1058cfbc3", + "components/ts_drivers/include/ts_temp_source.h": "195c577b4f4e51efe4ad19315679dac3944f53eb72bbc94392717b3426067000", + "components/ts_drivers/include/ts_usb_mux.h": "4dde492aa085eab2024a12477036b80583b9e00a6ee3200164ec6b2b5a3b5080", + "components/ts_drivers/src/ts_compute_monitor.c": "dc396f53de43ce72b5ca6c0301d8ec82056648adce0952e0b1012e7b6a794587", + "components/ts_drivers/src/ts_device_ctrl.c": "c30a1cc807542077bd8302a9c6a4be07f286f76acb66e95f787ee9eb5fbdb279", + "components/ts_drivers/src/ts_drivers.c": "e21d531fd3bdf7024fbbd0ac7162d17602775fbe4fe237a3e0fc234ae3ed247b", + "components/ts_drivers/src/ts_fan.c": "4771e2094228dc6586be30910acc60ef44ec16f852684834eb81776e1d867431", + "components/ts_drivers/src/ts_power.c": "02d30bfe6140dcb78a0a0b26e36de7902864b323f64e5d3b6f9d6493b0d5dcc0", + "components/ts_drivers/src/ts_power_monitor.c": "22e16a8a2f0629c28f2c2f2f4d7ab259d2013be1e13943da2d0866d1a379b1d7", + "components/ts_drivers/src/ts_power_policy.c": "bc0daace30a1b4c5c14fe839f03f9af9817e9597661292be4cdf6b81e3e68957", + "components/ts_drivers/src/ts_temp_source.c": "986d608503653d071ee8e06f04560eb74403d2839add61742cc05c004b5fb153", + "components/ts_drivers/src/ts_usb_mux.c": "76687b9f9bcb1081eb2cf08ba6dd49136b3262e806db6be0756d4981bcd34470", + "components/ts_hal/CMakeLists.txt": "326df4683cb78c1ce054b3677c9346e3d94227e69d5910941a5aa766d7993e34", + "components/ts_hal/Kconfig": "708d153884fb3b7688fe223eb908d3dcce996e74bc919af2c9bd22b2f5690133", + "components/ts_hal/include/ts_hal.h": "38ba72144d7a771e4832b5ef16d11cbeda6584139efe53f953b276eebb3408a9", + "components/ts_hal/include/ts_hal_adc.h": "eb38f56f44ddc94154273649dd993d4baadc7531d62f857f64bd36489bf7b518", + "components/ts_hal/include/ts_hal_gpio.h": "aa78a98e8e5d985cb968af6bf3f3fd1fca54ba48c28e8d682ce62cba807025d7", + "components/ts_hal/include/ts_hal_i2c.h": "5f904acf2b2a4967a3477624fc8a708eefa5a78d25e8e675ad4f96e781cc609d", + "components/ts_hal/include/ts_hal_pwm.h": "c2aed39c728ad94349bb7dc5d57afe3bdd11dc825668ac4ae8ea8974d3563bca", + "components/ts_hal/include/ts_hal_spi.h": "f9b8244ebda2ce2c6876d9b33c22b0fb3c54203b9c5498df3373e2cac08f5626", + "components/ts_hal/include/ts_hal_uart.h": "c962fb9b4fc2bc210160b4c8da89b727af2f9eb24c7a2c39d9365aed2ba83133", + "components/ts_hal/include/ts_pin_manager.h": "79d1a7259afd5f367f3bdfa61484beda495b91f0bad94e66d3ec897b152bee5e", + "components/ts_hal/platform/esp32p4/ts_platform_p4.c": "92828a83921f4a1951ed820150ac450a5e6712a5ac8ffef1b4e5675a8a929854", + "components/ts_hal/platform/esp32p4/ts_platform_p4.h": "224707a735921f737c04124e2882a741b8a38e5121bc0655c1d0038795bcc987", + "components/ts_hal/platform/esp32s3/ts_platform_s3.c": "7e4155ef259b57cba342909ee23b7c6b6018790fe3b8bbde55164b782b46bb2a", + "components/ts_hal/platform/esp32s3/ts_platform_s3.h": "d6db1b661e9840a8d68ad3b3ef63e860eb65c654cec813bb502fb9a24e16e9bd", + "components/ts_hal/src/ts_adc.c": "f8899a9f1760edb6347d45799d0afbcefbf4a48ff53914426bd911c5bd13e080", + "components/ts_hal/src/ts_gpio.c": "7de7ee396a2399b0b5dad4cfc8f5213ae77b78fb30f1e47ea3225d433234cd84", + "components/ts_hal/src/ts_hal.c": "8dabc33b9a746fd7d580fad0326d74fdca89d8dffd53cbcdcc414db0a77c7c38", + "components/ts_hal/src/ts_i2c.c": "6e82ec499f6a92dd598fcc642476fdc662db8e419e1f9f86073e65a41e7c2cc9", + "components/ts_hal/src/ts_pin_manager.c": "6418d34ddcd188321df33f2ffee02b766705f03bfd39026aa3fb4082b0077b41", + "components/ts_hal/src/ts_pwm.c": "d41b742ce3a48723be2ad2b0079ff88951ae35f2ebe5622bfff91a622c4d048e", + "components/ts_hal/src/ts_spi.c": "aecc796a2e9248ba17a3658fb8dabf4a824514607eae3cd46b23298553c1222b", + "components/ts_hal/src/ts_uart.c": "8f7ea7bc94cdba23fcfe3583a32a44f279262f4f99472c9ea52d9cf31169a097", + "components/ts_https/CMakeLists.txt": "1c58f2e4f118836a66b50390efcb55192bd05b2fddf4146b9d9536a8ebdd0eaa", + "components/ts_https/Kconfig": "1992a0512508a096086de81ccd436a7998131eab99403e18fb450832d0104418", + "components/ts_https/include/ts_https.h": "5122b6cd468da5bf9637d140c48b7ed84a2655436af6f78ef6e93c33751bb26a", + "components/ts_https/include/ts_https_api.h": "70d615283a291472ad7d24f78c11a9604373e98d3192daf9638965abe7bb85f5", + "components/ts_https/src/ts_https.c": "793f542618769b8e7628b1c5343f4ad7f7134114600a7e48c2387e501d475495", + "components/ts_https/src/ts_https_api.c": "799d0998eb23398af56c3ac648de5c2f7ab8380f0ca3683388cef0259c556d63", + "components/ts_https/src/ts_https_auth.c": "37396ff1a7d181436e33eed1081147c4a10ee357daca5c1405ce4d33141c39ad", + "components/ts_https/src/ts_https_internal.h": "149a2d288607d3b624008296af19d27480bc17cb5e84bad2a96cb8cdd718609d", + "components/ts_jsonpath/CMakeLists.txt": "56990faf4de0bffe6ecab10c60d526b55feebcfdf24f56f6c4e72f6b4672f5cf", + "components/ts_jsonpath/include/ts_jsonpath.h": "88793134aeb48f2a2d659123e9f76400e204fa0504c68d49f91e11d7702c3ef1", + "components/ts_jsonpath/src/ts_jsonpath.c": "8868184035eb7d0da79ad399b95b72050874a015768b77196f9b6c1b5672af18", + "components/ts_led/CMakeLists.txt": "69170775a0baaf3c3b40c911eaa485a81d4f85bdf88f163c989ac0842dd19de6", + "components/ts_led/Kconfig": "4d411559be74736e546950c7117dd0723f8413e0de6cfda5a1d540647b2e2a09", + "components/ts_led/idf_component.yml": "3fe6ccefef850a2db760fa5e0fcba64154836f0c312e6b7575c39bac1f5a2a87", + "components/ts_led/include/ts_led.h": "2fc243661f428ac775606ac528854b7995609db60f33921688ea69d881eef283", + "components/ts_led/include/ts_led_animation.h": "fc3f6a9785772e7f4b8099ef41234f90280b54603f48724050869541370a7ee0", + "components/ts_led/include/ts_led_color_correction.h": "2256f2b5860258101818c57dc89368344f2d10fce1b44399deab6cc25f63a6e9", + "components/ts_led/include/ts_led_effect.h": "3f26f11ed916da12a139ee65952dbcdd286501b5cf09520b067197c7f66d4f57", + "components/ts_led/include/ts_led_font.h": "564b3c0ba46e5e09eeb5a92a38659ffa61809ae57985cc8998023cde36838031", + "components/ts_led/include/ts_led_image.h": "5ac7bdef1efac34a54a3a22285632c01d3e589af4a5aafef4fe069a93cd10102", + "components/ts_led/include/ts_led_preset.h": "997c4e5f7c0cb768003fb44de0daffab8dfcafa78722d40f90fab34e5880ae9b", + "components/ts_led/include/ts_led_qrcode.h": "2622472088a8b912fc1ee7eb62c30e47150da3fc16735ef139c9380090200cf8", + "components/ts_led/include/ts_led_text.h": "344687edf180d9237168b067bc513af278b3f928206019dd89b633c6d619d160", + "components/ts_led/src/qrcodegen/qrcodegen.c": "ea1770ad22a9345e22045949545f61590396935b9aec4c61e37932144d0e9339", + "components/ts_led/src/qrcodegen/qrcodegen.h": "92d80152209f9f95294b80081af9d53d1261b9b4ca8a02af480e3b554f489268", + "components/ts_led/src/ts_led.c": "f46aa8045f4154da5a5ee85cc54c3f4020dbc58d138325700d339e91d92a6801", + "components/ts_led/src/ts_led_animation.c": "03f006beb59990cfa641c3c0d0b6592d3e392684b83a45e283b282c57d248680", + "components/ts_led/src/ts_led_color.c": "e1f5743cc37b025a4e8cdd127ede6cfaa4ad2e92abc8438a2020b247aa402cc1", + "components/ts_led/src/ts_led_color_correction.c": "861a44b1f76df06dd0954d0928cfdaaacad203906ccd74458c4ed2dcec30b7c4", + "components/ts_led/src/ts_led_driver.c": "56b356ded575d34f24f74e451cabc7143fe9b793c16cc00d5c32884524d2c2ec", + "components/ts_led/src/ts_led_effect.c": "d62a66485b366fa8fbaa8e007427ef781c30a52e99a0b220c299698121a8a0ab", + "components/ts_led/src/ts_led_font.c": "52f1abfacd9d04159296ce576180894f6ae48555db70c9419a4c494d4ca1a53d", + "components/ts_led/src/ts_led_image.c": "5fb14d30ab2174a7be825ef644dcab899ffd5356c2f956814ea2ea622a74a519", + "components/ts_led/src/ts_led_layer.c": "c4521ff2fe9fc46861b1fbd66664f0e71416e396872b35a9937685de5b12cd2d", + "components/ts_led/src/ts_led_preset.c": "436d705c33fdda1a3b64da7776d9a6a26f286b6502c3e5dd0d3e08c7b6b55f15", + "components/ts_led/src/ts_led_private.h": "d871cda2b54bc1fbb91faebb7dec9b8b79065abb38f8a9bb10b482dd23145903", + "components/ts_led/src/ts_led_qrcode.c": "e2c7486363e1c5eed89fdf628378aa3e90184f4e75a11b65cc7e25852ece32d3", + "components/ts_led/src/ts_led_text.c": "50a81c95398e6f5dae971a349618567b0c11523c1a772c54295e162ee64dbb7e", + "components/ts_mempool/CMakeLists.txt": "5c6b9887ea7c01df3cd1cd1291ff64c4364d249ad0651eaa135b90f020310757", + "components/ts_mempool/include/ts_mempool.h": "448c3d3d7c7e03ef41be454f1297e79edf83334f3514da39b9c4607ec7ea85a2", + "components/ts_mempool/src/ts_mempool.c": "b160753ad6ddc0299009bf09f439aba2e9f851b0e42e0414d6c82249c92e08bf", + "components/ts_net/CMakeLists.txt": "d6aaac5a04b06bd536336820df0d5eb8c87e27b3087e5df41e640508314b163c", + "components/ts_net/Kconfig": "ddc14968f72310808d23b849248c7cb49411ed43e0f3c268060fb60da2f26e06", + "components/ts_net/include/ts_dhcp_server.h": "64e5e854f9b8fd7182f92dfafe594f3d8f1288ddecbbbec2c89b3aabee950c51", + "components/ts_net/include/ts_eth.h": "9f8952c77ade85741afb38aa48f3fb689a94164a2c598eb6c7df9344948cf8ce", + "components/ts_net/include/ts_http_server.h": "025cd54548f90be15b30d40c62250592a008b8d1e8f0dc1682ae9bef42768174", + "components/ts_net/include/ts_https_server.h": "f4c25017722b69f2f1bae48df34aa595f15d186ad3ec652b7be9d034e184bc79", + "components/ts_net/include/ts_nat.h": "1721b9c499ca0da09eb402d7db9211604a7a3414b6e2e7cf88169f872365a229", + "components/ts_net/include/ts_net.h": "2ddcd9233f0f5f63a83fdc6f3d09de3118b5b1cced5d9b009b3126c3b872a98b", + "components/ts_net/include/ts_net_manager.h": "6ad22613972f51af05eb6d468c04763808d92c1d6a6b0a7225911b24f9c0d9a5", + "components/ts_net/include/ts_time_sync.h": "e3ebf9da5b0c7b30a50a67fe07547e2c7fefd588474552579f4a2bc15ace8ca4", + "components/ts_net/include/ts_wifi.h": "25614f917387174bbbb7618010885353008e4488262303b314b87b78ae9f0905", + "components/ts_net/src/ts_dhcp_server.c": "800f32ac5097d4d73807496713a59488adfc417a1ea3be627a097cb4c9da0279", + "components/ts_net/src/ts_eth.c": "d2350045f8abe2d3bc1c046a51c5c0016b601f69bfe99ff2bfcdec8cf26e47fe", + "components/ts_net/src/ts_http_server.c": "0c8449fb396246074ef9deb404b2d5f98610f4f22f3c1ce70bf2774711dbb6ad", + "components/ts_net/src/ts_https_server.c": "50e9e0498aa7265739b99d9131eef726149fac255d20f152190d289df16b8ec9", + "components/ts_net/src/ts_nat.c": "e5accbee0cc4b7d0feccecc080b23726af94418f5f2c9645df785eb142a1eb24", + "components/ts_net/src/ts_net.c": "2f363e1c6cad3437449c742f42db70240cc34105942cfd2c2f3a854b226b8f92", + "components/ts_net/src/ts_net_manager.c": "4184c6e23f68b160a511fd8c44baa8133c04596fc00fcec459389ec61c14789f", + "components/ts_net/src/ts_time_sync.c": "d83f4591d1c45de7a89af7126c9921301a06ce2a6cb3890c5d302d491811db56", + "components/ts_net/src/ts_wifi.c": "54fdffed9cde1145b5dccc5e9419a72c94f83fbc395b225e76098be09b01ba3d", + "components/ts_ota/CMakeLists.txt": "cee899b829cbbbb31bf1e1dd5612abdf58e285381ee3896be76e12b43e116a27", + "components/ts_ota/Kconfig": "45d5a5f45174482b3adab3eca408cf641d3c0d76410d090365d4d1176e60a361", + "components/ts_ota/include/ts_ota.h": "8a41a88a13f5b32a0398c0d9a9a264f0d2afb6e078d9b9ea875e0ce65dc9487e", + "components/ts_ota/src/ts_ota.c": "862e4c0799afeaf46a6399b37f0be38e1a54d6ae7c24880da5f1453d107e5f7e", + "components/ts_ota/src/ts_ota_download.c": "0dfd39b47ee7998fb9bfd2a282fdd697792aa8a5591a1e0247c58fef060f7d31", + "components/ts_ota/src/ts_ota_https.c": "667ecf1e005a79f9f19f76e144b4b2e5e02f17edf765279e10cb19503fba397d", + "components/ts_ota/src/ts_ota_recovery.c": "e9d686d2a17e34120c4d5562f0027c0cc04b52cbafa747905bbedd465cf5f071", + "components/ts_ota/src/ts_ota_rollback.c": "d8425871467709591ae9e222ad48e9dff5373ca17467d378dddd1d6de546dfca", + "components/ts_ota/src/ts_ota_sdcard.c": "d9315d8ca0d9b319602eb63a444e164e847b370c9bcf5fb6ef81c3c7fd59746c", + "components/ts_ota/src/ts_ota_version.c": "2f8926ff4e9311cccb90402526be88eab150d1bda0303e310012875601bc17ed", + "components/ts_ota/src/ts_ota_www.c": "2825fc87003c5ef6842bfcfe4c2c3c4b50c370e4f0b5fe9bcf07daeec1ed072e", + "components/ts_pki_client/CMakeLists.txt": "1f5154b11f16b9ebf31b27aea22b5decaf1d36519b8794ca6fe378dfe5bc9f00", + "components/ts_pki_client/include/ts_pki_client.h": "bce58c6df488f53e19d80650ace1a7ca3c880b375b6c51ac3b00c9b733ce95e4", + "components/ts_pki_client/src/ts_pki_client.c": "aad64beed9ed017b467fea5098ae1ddda09a6deea856f628da9ab240e8733d26", + "components/ts_security/CMakeLists.txt": "cdc8e21b6985899e65385ce4b2c92958cc540f19f3445255301b20ad71241c88", + "components/ts_security/Kconfig": "c3d0036c138f0bf227f73558802a24892694e5f8328ecda2ab8007e0aa219a06", + "components/ts_security/include/ts_crypto.h": "371ac3b950f7185eaa21a710c4e823ed806ab337d573cfffdcfe58656aeee8c0", + "components/ts_security/include/ts_keystore.h": "55831771c42ae32640dc6ce1d7755f3487149f71f42d1f1ca7451af2ff675f40", + "components/ts_security/include/ts_known_hosts.h": "4b1244556d046e0057ba0d372498f92d263e43183975d5e55d0bbaea669b0934", + "components/ts_security/include/ts_port_forward.h": "a249f758369a81a7db44f71e4aed0511cd4f5aa932cc4bde33b29c393b5d39be", + "components/ts_security/include/ts_scp.h": "5801a44ef598560d9eef3265ec5b891b494e2682b3049834d3694abe0f86f175", + "components/ts_security/include/ts_security.h": "01cf0f2c1ee2599c0d733ac5d7466e73358fe5483aad23d654c2e6b99c039f35", + "components/ts_security/include/ts_sftp.h": "6d0c9ab1ac7dd3eab5d820798f543be18e2de1d43028dc72ca088b3ec13ab1fe", + "components/ts_security/include/ts_ssh_client.h": "ceb00ed29965279a154e061638b58769e148ea370f5435de48c90c1c8d90f928", + "components/ts_security/include/ts_ssh_commands_config.h": "d1fa1bbc2762bc4accf697db09959396cb5d82bb67ba1806a0cd4f9b45305352", + "components/ts_security/include/ts_ssh_hosts_config.h": "48d27c0cdeb6b0f462d41eaef281b6f2afe6e460b810a61f2f98278d0609280d", + "components/ts_security/include/ts_ssh_log_watch.h": "08677f37f9ee0a3620f6ed38770c4f1977d3b70787e96e57db0f934de5c5452f", + "components/ts_security/include/ts_ssh_probe.h": "697c24c0ff5244397d3483997357a81311cbd24b718d64b845efd96e19979e43", + "components/ts_security/include/ts_ssh_service.h": "73fbddabe3eaed6a191b90b1644eb50eb440509723c92f4a61788c2306596102", + "components/ts_security/include/ts_ssh_shell.h": "0594cdb6f555becc8878609039106e4d986a926be559691dd7785ec7d5d3af0e", + "components/ts_security/src/ts_auth.c": "b4456d19bb701f5be50c08bb8024c8b24eb97820fd47c72c9fda6e1ff334b78d", + "components/ts_security/src/ts_crypto.c": "5ef1140c4f122a49a531de1bff5c48c80067bdcadf2139553c35a59fd5404587", + "components/ts_security/src/ts_keystore.c": "0046e9a9f13a4dd73f932a2861b787c6264ad1597694b3cdc8a9b9eca251ea1d", + "components/ts_security/src/ts_known_hosts.c": "72e2c0c5723cf9fed7c589e46152b5806c4bdcfba565b862305d2fb299ec3844", + "components/ts_security/src/ts_port_forward.c": "b2dafd8ffc849f684cf0a9f332864876951d2d9ee7fd8a69ce7704430d00853f", + "components/ts_security/src/ts_scp.c": "cf328d792705cf8d6b00ecc3b8369ae8360fba977a3147e0a2eef6634a08cff8", + "components/ts_security/src/ts_security.c": "1c4bd91f4ab676be0739b60b826e026a84baade609369995c845b1991a1e2c49", + "components/ts_security/src/ts_sftp.c": "e05a3cd229dcf4344cfcc785755e075b52f94a4276411abbbfb6e7716793a899", + "components/ts_security/src/ts_ssh_client.c": "071b875b4029cc9d0d9e5538ce7a05921a07ec57d09faa45d295fccb7625552d", + "components/ts_security/src/ts_ssh_commands_config.c": "f12fdb5169de9e52db02590bf9d821bc08291b6c24e62f4f81bc54b03574e6da", + "components/ts_security/src/ts_ssh_hosts_config.c": "36d70ff90bef5b0efdf1195c614a33a70b7ed521807c28a2a3b4d918265b2056", + "components/ts_security/src/ts_ssh_log_watch.c": "3843930a4337ea56092d37e1ade0651dd1f6a14c3f5596d33bc83a7880712f6b", + "components/ts_security/src/ts_ssh_probe.c": "810b235d84659426a3181ec594a345e2fd0ac7fc7c1ce765c34265ad1bc05843", + "components/ts_security/src/ts_ssh_service.c": "fc345627f4f2c9417dd0e74fb47b3d77e2cc9f41fd9537bd2f633b0260e5e01c", + "components/ts_security/src/ts_ssh_shell.c": "87412b746f3a18a1937b479592e446eb737cd1f4999c316b662e5435d88ab46c", + "components/ts_storage/CMakeLists.txt": "74c30febce8cd258980e9b1d031efc32b2b268a7335e2b4f6d2b6a69be0a5e42", + "components/ts_storage/Kconfig": "95a7fd07b1765ee6f37cfa224e00dd337b9d77032d0e840fcc566f1ce7903060", + "components/ts_storage/include/ts_storage.h": "5d4e8f9cdf6669dce5b83f2a38b6f1b5c8a9e189da78d91bcff4b1add8336a41", + "components/ts_storage/src/ts_storage.c": "404f073510cc3eac90396a6c4822b0e0eeae183b95d4fa5002c0f30fd65137db", + "components/ts_storage/src/ts_storage_sd.c": "b8b028edf0cf06544fbacdaf681f387a0109a6e7364d6091007c1d2a60643b81", + "components/ts_storage/src/ts_storage_spiffs.c": "b41e67a193c9f49a9498fbfb8a5444e7db1457f1434220dfecf7bee433da8628", + "components/ts_webui/CMakeLists.txt": "53e02258893758d55edf0debef2e0694b154ecccda65ab3b5bb5d34770c39d45", + "components/ts_webui/Kconfig": "6a1fc77d34f7c635b44a922f4c7c9fb96832a9f6bb433967c26e3bdc451ae286", + "components/ts_webui/include/ts_webui.h": "374e230b4f0d016adb2373acd2e6431cf537eaeb8f7f84efcf53523d6dad0402", + "components/ts_webui/include/ts_ws_operation.h": "4a31681f9e5d0041d2627b5850b23c083e1b0ca3b876acf959adab5955611512", + "components/ts_webui/include/ts_ws_subscriptions.h": "edcfedcdb48cc47bdd776218d43f362f4f2feb84f0a8bd347b465e3dd751e3ae", + "components/ts_webui/include/ts_ws_transport.h": "4c7b996ed4e6a578ce7daa1a02a13729795bd4dca2e66eb8b49895b6f59f36ee", + "components/ts_webui/src/ts_webui.c": "6ec898b4c78fbd19e469dd45d4f890ce5bf32708a38217c516ba595c00683686", + "components/ts_webui/src/ts_webui_api.c": "c8225f3fc36be3446947e205932a3d43340665d687b81c23c16556f3be8dc9b8", + "components/ts_webui/src/ts_webui_ws.c": "cb8f801a18672c24636fe744cacf0f1e0379f75b579bcd4869bb9c9d8e541949", + "components/ts_webui/src/ts_ws_operation.c": "504ce5caa9375a792692eec681a86bf4515aa5c2d28e758d67df08117b6fe865", + "components/ts_webui/src/ts_ws_subscriptions.c": "9f8d2f33a374d6992a1ef119cd20a791244e44abc8d7cd66dc906b4896f764fb", + "components/ts_webui/src/ts_ws_transport.c": "e2eaeb31d00d7996a84badc669ca5587628c63b044c9a8014e587e84b5ab37f8", + "components/ts_webui/web/css/style.css": "30dab8799ed2a8b0a5da49ec84202b30f3c951779ea4533e847a53b2ac9b8dff", + "components/ts_webui/web/favicon.ico": "1ea04b690d7fe816da5efb405c13f9cd953366026eb3553e214de8d5df0d3648", + "components/ts_webui/web/fonts/remixicon.css": "b2218eec4e02513f0feef46f74f13c852152f54eafd83d1274057e3895f0ea1c", + "components/ts_webui/web/fonts/remixicon.woff2": "e92dc38bfb1d15dbb9d9ca9e645754f68e7c5b224e33c45a17048bd0cf2407a6", + "components/ts_webui/web/images/README.md": "f4429665c315cdabc2a935caf0f1423632dd7cbff84f34914965969217102237", + "components/ts_webui/web/images/favicon.icns": "bdc873fa7bff5e1888d80273f99f22d97d3719d4b17419e68e64eafd85c2b039", + "components/ts_webui/web/images/tslogo-128.png": "f09ac97789726872277a0399338cd9bfd0493752de930aeb6b2c6f7b0a864c3b", + "components/ts_webui/web/images/tslogo-256.png": "55dc7df59429c23fdc531baba002b7b23f5a4f2be0f29b2ecc5098f3df059da7", + "components/ts_webui/web/images/tslogo-32.png": "64e4bce72f2b13c81bef5b46ae919abeeb47f98571cf5e55460385880731810b", + "components/ts_webui/web/images/tslogo-48.png": "41f959e327dca63386a2f254b8a245a6fa151904a06eae93ae6c449277467f70", + "components/ts_webui/web/images/tslogo-512.png": "b7508585c46e16fcc7d42c52459ab55df32716aea85a10a560cd64de7cceb8e8", + "components/ts_webui/web/images/tslogo-64.png": "a0809405c5632eb4bf1f1b4783175c2b92b25fc522f5b0682a35d3cfa1c58752", + "components/ts_webui/web/images/tslogo-original.png": "9fb0ee8532c2d572d8b235f7586d225f00609cf8defb98b59cf55ae749e83ed1", + "components/ts_webui/web/index.html": "c8b08579724612166cc4ac2568aff34661bbf2c8699cc856abfa3d778ed4ae1d", + "components/ts_webui/web/js/api.js": "6fb266abb3780a0d402d86ad95a3644b8e1f488136ad44dc18ddd83caaa8dab4", + "components/ts_webui/web/js/app.js": "ad63a38112eab45af87da091f3536156614db526bb85f2c83bafa7867439230b", + "components/ts_webui/web/js/dragSort.js": "7c5b9159cb8bb88b35222424db6d8bd822d3960899d5c090c17955700d6590af", + "components/ts_webui/web/js/i18n.js": "2eed1c54b4ef89bc2e4221a3fd900e88bd8d7a11064a04d97dcc3decfdeedbd8", + "components/ts_webui/web/js/lang/en-US.js": "58beed2b903407387d884c99f38eaef578e74be916175b53745d0d5ececadc10", + "components/ts_webui/web/js/lang/zh-CN.js": "bb3d3b4b28c8c146fdb1c437bee84862806ed915af8cc0aa2388deb6a9e9ef89", + "components/ts_webui/web/js/router.js": "1e73ca3bf272a54aea8c516809e09e10f257b620bf66311bbbe358693fe377d5", + "components/ts_webui/web/js/terminal.js": "5d77a7181b6127699e098f22d3c872f5e31daaa700436b6fa928f34b6aa33e52", + "dependencies.lock": "8829663e7e611b621579e0f8d27d10b3d80e9a969d167e875f7b78597399a482", + "main/CMakeLists.txt": "c229d6b43e670fd75469edd541ad9ef51e0be3985b824ffe21e17cb8a006767c", + "main/idf_component.yml": "3f13a29a2b12e63ea4917315fa77f3481a0e26e976ffd90246312765105a4e58", + "main/main.c": "63dbd073aac40ae7ab31e92f2d52ad3f27c35fa71ade79f18c306f582bcaf40d", + "main/root_password_reset_main.c": "12d485ef6308067aaf112d8bcef71f09ba2ac60aa83a99d576635b102dadbd6c", + "main/ts_core_init.c": "ad9b89b44eef49a72117197da3e2d44a0a9ba73cbf5d1a4c7c6a7e123ea41e1f", + "main/ts_https_retry.h": "8237eca2d52e4424f9ba44674bf9202f93bd43c10f401446c17aabbcc2e5532a", + "main/ts_services.c": "697ae1b5d5472c60a93111ae21585ea23d7ccabce8e4f89b96e5982af10d7639", + "main/ts_services.h": "9631bcb3efdf01739163fde59553f50914da4eacbdb2f3f7eeb72e51a4c83c1b", + "partitions.csv": "5bea4f462b0f105e96025edfa389bfe58fe66877f27db0656b8ae830c1b96da4", + "sdkconfig": "1340e033b5865e39dd6b8c3516dffb27d01da5aff41127c69b583cbfb99acef0", + "sdkconfig.defaults": "153efe0e103cc3d7d3d6e330b931e2565a1dc92132af057b9caaf31d13c45d4e", + "tools/bdf2fnt.py": "dc156a74f206b95efd2eb5887251c55ef9c41b85330240fe2615231ddb084ca1", + "tools/build.sh": "2cb7ce21128f336eccbb75fc553341a34bf3ef3e65e4f5b99c5b09b476703466", + "tools/build_root_reset.sh": "2a59ab3eb5ae0d075ee9bf3f17582fb779c9f39c6814969bf99ded81fbf4202f", + "tools/check_release.py": "4a3a7c34bd1a0c67e9ed8d38e7daf53feb73b289826260af09fd20704d2c4d05", + "tools/gen_version.py": "92c1db10137f2e2ef8ffde87a8143e25a8bef1ab89b939a911b2ed1bdb7f650d", + "tools/minify_web.py": "c5ac7291d2c8c373463fe58e0ea8b644ea9b87fae79cccb14548488de72db008", + "tools/ota_server/README.md": "649596da0058c8bd7dce3388161711183e53078f3ac82401278f7f44c4d4e290", + "tools/ota_server/ota_server.py": "9a3c8826315fababa41b20f4f7c8ad37e3f7e507cf3633d0b5c15abc8df78356", + "tools/ota_server/ota_service.sh": "1b5145c396c94629a1605efd3dfc7ca34941a0d182327b09a168a31495972d5d", + "tools/ota_server/requirements.txt": "4dc664dd1442dea748a7c57a4645d2f0d7d4d0b7b9c9353f628c1cf1e8a6bb2e", + "tools/ota_server/start.sh": "d91b14128fe69285848c02aa42b141a3c3c958c6743c42ca2c8e48f8bb50bdb6", + "tools/ota_server/tianshan-ota.service": "f51c57579dc4e9c5bada13fb5476e9f0d7a9c8777c92278cfe5caabb9e900432", + "tools/pki-server/.env.example": "1d72a9b1c85627ebe631e709eecbf1b8c2408afddb404e0c30113a5f837470e0", + "tools/pki-server/.gitignore": "edc02d8bd09f62823287a0f4c1f90c003838d875810ba6705ba5ab70ef643643", + "tools/pki-server/README.md": "acc80cf8d621a3b1dbd4605e4a8d8d580cfe9111957e6224c0545ae578585aad", + "tools/pki-server/app/__init__.py": "d6e959bfc8628a76e60f18377a176c3c201b55d0d42c4d068d43c353f077417d", + "tools/pki-server/app/ca.py": "fc3ac5216f92393647f25f95b881e423e9cdfa0ee5272c1b8f93ae45d66f9f90", + "tools/pki-server/app/config.py": "afc6635c27892a257dbcd1bf9b815fa7353654d5d11a483a2b79cfd0c9c09c94", + "tools/pki-server/app/database.py": "80355d2a94962a2ef36c27c719f543dd8f7094554a01aca8d3b85041781546a3", + "tools/pki-server/app/main.py": "43b93ec82f7ba9aaa9589e25a0ab0576e74eb00b28e8b9fc842ee1ae4f524dd0", + "tools/pki-server/app/models.py": "b38b398d22b4ed6bd1796c461e29dbf3e538aba4b601e9725214f988ccd2ded3", + "tools/pki-server/requirements.txt": "8ccad71c5aefadd47d5b9aed26b9ef339ab64c815681e702c270328984f841b1", + "tools/pki-server/run.py": "46fa2c73203879a8079c32e52ece0a2d146a7c2ee502ecbee9a0ea40b998ceb3", + "tools/pki-server/static/.gitkeep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "tools/pki-server/templates/index.html": "4bf66c95d18289512f20c27e124b01d5d42de90ae86473f471e9bbbb63ab9f91", + "tools/pki-server/templates/login.html": "0a15f2e1a947ba11e9316f046830152178f3d4fe5f55561399a2f671c09ecd9f", + "tools/version.py": "15ce939bf632dfd2ce006a46cc8e31f9186215dbc824f6ba4a07ebfd9bee5315", + "components/ts_webui/web/vendor/xterm/xterm.css": "832f3f2c603b43ad4351ff04970150cc7a873014276db126a6065c6dd81e4872", + "components/ts_webui/web/vendor/xterm/LICENSE-fit": "e256f01188af527e4d06d21d06fbf785ae9c50d4b328bf03cbe0ba7f0aa4228f", + "components/ts_webui/web/vendor/xterm/fit.min.js": "c78e5795c6487acdf24ab436798d4a9cec3848101b281bc65b061f39db714be1", + "components/ts_webui/web/vendor/xterm/xterm.min.js": "fc1dd31b221e3e5f929486e07a80b477a8aaf9dce2b4f9c3ffe7dd25f370655d", + "components/ts_webui/web/vendor/xterm/LICENSE-xterm": "b569f629d00f2626a8100df2a1798210535621e42164dfd426a6fe5aac7b0ccd" +} diff --git a/docs/repair/xterm-local/build.log b/docs/repair/xterm-local/build.log new file mode 100644 index 0000000..227e48a --- /dev/null +++ b/docs/repair/xterm-local/build.log @@ -0,0 +1,1676 @@ +Executing action: all (aliases: build) +Running cmake in directory /private/tmp/tianshan-xterm-final/build +Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python -DESP_PLATFORM=1 -DSDKCONFIG=/tmp/tianshan-xterm-final/sdkconfig -DCCACHE_ENABLE=0 /Users/massif/TianshanOS"... +-- Found Python3: /opt/anaconda3/bin/python3.12 (found version "3.12.4") found components: Interpreter +-- IDF_TARGET is not set, guessed 'esp32s3' from sdkconfig '/tmp/tianshan-xterm-final/sdkconfig' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +NOTICE: +Following dependencies have new versions available: +Dependency "espressif/libpng": "1.6.54" -> "1.6.58~2" +Dependency "espressif/mdns": "1.9.1" -> "1.13.1" +Dependency "espressif/zlib": "1.3.1" -> "1.3.2~1" +Consider running "idf.py update-dependencies" to update your lock file. +NOTICE: Processing 7 dependencies: +NOTICE: [1/7] espressif/esp_jpeg (1.3.1) +NOTICE: [2/7] espressif/esp_websocket_client (1.5.0) +NOTICE: [3/7] espressif/led_strip (3.0.3) +NOTICE: [4/7] espressif/libpng (1.6.54) +NOTICE: [5/7] espressif/mdns (1.9.1) +NOTICE: [6/7] espressif/zlib (1.3.1) +NOTICE: [7/7] idf (5.5.2) +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-xterm-final/sdkconfig +Loading defaults file /Users/massif/TianshanOS/sdkconfig.defaults... +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:54 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:56 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:64 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:66 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:82 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:84 line was updated to # === L2 NVS 加密配置(HMAC 方案)===n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:159 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:161 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:170 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:172 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:182 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:184 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:193 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:195 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:227 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpssep3329:229 line was updated to # ============================================================================n +-- Compiler supported targets: xtensa-esp-elf +-- Found Python3: /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python (found version "3.12.4") found components: Interpreter +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success +-- Found Threads: TRUE +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success +-- USING O3 +-- App "TianShanOS" version: 0.5.2+633bb94d.09281645 +-- Adding linker script /tmp/tianshan-xterm-final/build/esp-idf/esp_system/ld/memory.ld +-- Adding linker script /tmp/tianshan-xterm-final/build/esp-idf/esp_system/ld/sections.ld.in +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_master.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_50.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_smp.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_dtm.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_test.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_scan.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Web optimization enabled (minify + gzip) +-- Components: app_trace app_update bootloader bootloader_support bt ch405labs_esp_libssh2 cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi espcoredump espressif__esp_jpeg espressif__esp_websocket_client espressif__led_strip espressif__libpng espressif__mdns espressif__zlib esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread rt sdmmc soc spi_flash spiffs tcp_transport touch_element ts_api ts_auth_layout ts_automation ts_cert ts_config ts_config_pack ts_console ts_core ts_drivers ts_event ts_hal ts_https ts_jsonpath ts_led ts_log ts_mempool ts_net ts_ota ts_pki_client ts_security ts_service ts_storage ts_webui ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/app_trace /Users/massif/esp/v5.5.2/esp-idf/components/app_update /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/bt /Users/massif/TianshanOS/components/ch405labs_esp_libssh2 /Users/massif/esp/v5.5.2/esp-idf/components/cmock /Users/massif/esp/v5.5.2/esp-idf/components/console /Users/massif/esp/v5.5.2/esp-idf/components/cxx /Users/massif/esp/v5.5.2/esp-idf/components/driver /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp-tls /Users/massif/esp/v5.5.2/esp-idf/components/esp_adc /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_coex /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ana_cmpr /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_bitscrambler /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_cam /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_dac /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gpio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gptimer /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2c /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2s /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_isp /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_jpeg /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ledc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_mcpwm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_parlio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_pcnt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ppa /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_rmt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdspi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_spi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_touch_sens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_tsens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_twai /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_uart /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_usb_serial_jtag /Users/massif/esp/v5.5.2/esp-idf/components/esp_eth /Users/massif/esp/v5.5.2/esp-idf/components/esp_event /Users/massif/esp/v5.5.2/esp-idf/components/esp_gdbstub /Users/massif/esp/v5.5.2/esp-idf/components/esp_hid /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_client /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_ota /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_lcd /Users/massif/esp/v5.5.2/esp-idf/components/esp_local_ctrl /Users/massif/esp/v5.5.2/esp-idf/components/esp_mm /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif_stack /Users/massif/esp/v5.5.2/esp-idf/components/esp_partition /Users/massif/esp/v5.5.2/esp-idf/components/esp_phy /Users/massif/esp/v5.5.2/esp-idf/components/esp_pm /Users/massif/esp/v5.5.2/esp-idf/components/esp_psram /Users/massif/esp/v5.5.2/esp-idf/components/esp_ringbuf /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esp_timer /Users/massif/esp/v5.5.2/esp-idf/components/esp_vfs_console /Users/massif/esp/v5.5.2/esp-idf/components/esp_wifi /Users/massif/esp/v5.5.2/esp-idf/components/espcoredump /Users/massif/TianshanOS/managed_components/espressif__esp_jpeg /Users/massif/TianshanOS/managed_components/espressif__esp_websocket_client /Users/massif/TianshanOS/managed_components/espressif__led_strip /Users/massif/TianshanOS/managed_components/espressif__libpng /Users/massif/TianshanOS/managed_components/espressif__mdns /Users/massif/TianshanOS/managed_components/espressif__zlib /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/fatfs /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/heap /Users/massif/esp/v5.5.2/esp-idf/components/http_parser /Users/massif/esp/v5.5.2/esp-idf/components/idf_test /Users/massif/esp/v5.5.2/esp-idf/components/ieee802154 /Users/massif/esp/v5.5.2/esp-idf/components/json /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/lwip /Users/massif/TianshanOS/main /Users/massif/esp/v5.5.2/esp-idf/components/mbedtls /Users/massif/esp/v5.5.2/esp-idf/components/mqtt /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/nvs_flash /Users/massif/esp/v5.5.2/esp-idf/components/nvs_sec_provider /Users/massif/esp/v5.5.2/esp-idf/components/openthread /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/perfmon /Users/massif/esp/v5.5.2/esp-idf/components/protobuf-c /Users/massif/esp/v5.5.2/esp-idf/components/protocomm /Users/massif/esp/v5.5.2/esp-idf/components/pthread /Users/massif/esp/v5.5.2/esp-idf/components/rt /Users/massif/esp/v5.5.2/esp-idf/components/sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/spiffs /Users/massif/esp/v5.5.2/esp-idf/components/tcp_transport /Users/massif/esp/v5.5.2/esp-idf/components/touch_element /Users/massif/TianshanOS/components/ts_api /Users/massif/TianshanOS/components/ts_auth_layout /Users/massif/TianshanOS/components/ts_automation /Users/massif/TianshanOS/components/ts_cert /Users/massif/TianshanOS/components/ts_core/ts_config /Users/massif/TianshanOS/components/ts_config_pack /Users/massif/TianshanOS/components/ts_console /Users/massif/TianshanOS/components/ts_core /Users/massif/TianshanOS/components/ts_drivers /Users/massif/TianshanOS/components/ts_core/ts_event /Users/massif/TianshanOS/components/ts_hal /Users/massif/TianshanOS/components/ts_https /Users/massif/TianshanOS/components/ts_jsonpath /Users/massif/TianshanOS/components/ts_led /Users/massif/TianshanOS/components/ts_core/ts_log /Users/massif/TianshanOS/components/ts_mempool /Users/massif/TianshanOS/components/ts_net /Users/massif/TianshanOS/components/ts_ota /Users/massif/TianshanOS/components/ts_pki_client /Users/massif/TianshanOS/components/ts_security /Users/massif/TianshanOS/components/ts_core/ts_service /Users/massif/TianshanOS/components/ts_storage /Users/massif/TianshanOS/components/ts_webui /Users/massif/esp/v5.5.2/esp-idf/components/ulp /Users/massif/esp/v5.5.2/esp-idf/components/unity /Users/massif/esp/v5.5.2/esp-idf/components/usb /Users/massif/esp/v5.5.2/esp-idf/components/vfs /Users/massif/esp/v5.5.2/esp-idf/components/wear_levelling /Users/massif/esp/v5.5.2/esp-idf/components/wifi_provisioning /Users/massif/esp/v5.5.2/esp-idf/components/wpa_supplicant /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- +-- ╔═══════════════════════════════════════════════════════════╗ +-- ║ TianShanOS v0.5.2+633bb94d.09281645 ║ +-- ║ ESP32 Rack Management Operating System ║ +-- ╚═══════════════════════════════════════════════════════════╝ +-- +-- Version: 0.5.2+633bb94d.09281645 +-- Major: 0 +-- Minor: 5 +-- Patch: 2 +-- Build: 633bb94d.09281645 +-- +-- Target: esp32s3 +-- Build type: +-- +-- Configuring done (6.9s) +-- Generating done (0.5s) +-- Build files have been written to: /tmp/tianshan-xterm-final/build +Running ninja in directory /private/tmp/tianshan-xterm-final/build +Executing "ninja all"... +[1/1343] Generating project_elf_src_esp32s3.c +[2/1343] Generating ../../ota_data_initial.bin +[3/1343] Generating /tmp/tianshan-xterm-final/build/esp-idf/esp_system/ld/memory.ld linker script... +[4/1343] Generating /tmp/tianshan-xterm-final/build/esp-idf/esp_system/ld/sections.ld.in linker script... +[5/1343] Copying web assets to build directory +[6/1343] Generating ../../partition_table/partition-table.bin +Partition table binary generated. Contents: +******************************************************************************* +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs,data,nvs,0x9000,48K, +nvs_keys,data,nvs_keys,0x15000,4K, +otadata,data,ota,0x16000,8K, +phy_init,data,phy,0x18000,4K, +ota_0,app,ota_0,0x20000,3M, +ota_1,app,ota_1,0x320000,3M, +storage,data,spiffs,0x620000,512K, +www,data,spiffs,0x6a0000,3M, +fatfs,data,fat,0x9a0000,64K, +******************************************************************************* +[7/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_utils.c.obj +[8/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_header.c.obj +[9/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/util/ctrl_sock.c.obj +[10/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_sess.c.obj +[11/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_uri.c.obj +[12/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_main.c.obj +[13/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_auth.c.obj +[14/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_internal.c.obj +[15/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_txrx.c.obj +[16/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_ws.c.obj +[17/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport.c.obj +[18/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_socks_proxy.c.obj +[19/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_parse.c.obj +[20/1343] Building C object esp-idf/esp_https_ota/CMakeFiles/__idf_esp_https_ota.dir/src/esp_https_ota.c.obj +[21/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/system_layer/esp_psram.c.obj +[22/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/xip_impl/mmu_psram_flash.c.obj +[23/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ssl.c.obj +[24/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/esp32s3/esp_psram_impl_octal.c.obj +[25/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali.c.obj +[26/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp_adc_cal_common_legacy.c.obj +[27/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali_curve_fitting.c.obj +[28/1343] Linking C static library esp-idf/esp_https_ota/libesp_https_ota.a +[29/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_common.c.obj +[30/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/esp32s3/curve_fitting_coefficients.c.obj +[31/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp32s3/esp_adc_cal_legacy.c.obj +[32/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp-tls-crypto/esp_tls_crypto.c.obj +[33/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_platform_port.c.obj +[34/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/gdma/adc_dma.c.obj +[35/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_oneshot.c.obj +[36/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_filter.c.obj +[37/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_monitor.c.obj +[38/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_error_capture.c.obj +[39/1343] Linking C static library esp-idf/esp_http_server/libesp_http_server.a +[40/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ws.c.obj +[41/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_continuous.c.obj +[42/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/esp_http_client.c.obj +[43/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_legacy.c.obj +[44/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_dma_legacy.c.obj +[45/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls.c.obj +[46/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/sigma_delta_legacy.c.obj +[47/1343] Linking C static library esp-idf/esp_http_client/libesp_http_client.a +[48/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_mbedtls.c.obj +[49/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rtc_temperature_legacy.c.obj +[50/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/touch_sensor_common.c.obj +[51/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/timer_legacy.c.obj +[52/1343] Linking C static library esp-idf/tcp_transport/libtcp_transport.a +[53/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai.c.obj +[54/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/pcnt_legacy.c.obj +[55/1343] Building C object esp-idf/http_parser/CMakeFiles/__idf_http_parser.dir/http_parser.c.obj +[56/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/esp32s3/touch_sensor.c.obj +[57/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/i2c/i2c.c.obj +[58/1343] Linking C static library esp-idf/esp_psram/libesp_psram.a +[59/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/twai/twai.c.obj +[60/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/i2s_legacy.c.obj +[61/1343] Building C object esp-idf/esp_driver_sdm/CMakeFiles/__idf_esp_driver_sdm.dir/src/sdm.c.obj +[62/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_common.c.obj +[63/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai_onchip.c.obj +[64/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_slave.c.obj +[65/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder.c.obj +[66/1343] Linking C static library esp-idf/esp_adc/libesp_adc.a +[67/1343] Building C object esp-idf/esp_driver_tsens/CMakeFiles/__idf_esp_driver_tsens.dir/src/temperature_sensor.c.obj +[68/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_crc.c.obj +[69/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_bytes.c.obj +[70/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_common.c.obj +[71/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_copy.c.obj +[72/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/mcpwm_legacy.c.obj +[73/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_transaction.c.obj +[74/1343] Linking C static library esp-idf/esp-tls/libesp-tls.a +[75/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_simple.c.obj +[76/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rmt_legacy.c.obj +[77/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_common.c.obj +[78/1343] Linking C static library esp-idf/http_parser/libhttp_parser.a +[79/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_transaction.c.obj +[80/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_init.c.obj +[81/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sd_pwr_ctrl/sd_pwr_ctrl.c.obj +[82/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_host.c.obj +[83/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_mmc.c.obj +[84/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_cmd.c.obj +[85/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_io.c.obj +[86/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_master.c.obj +[87/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_rx.c.obj +[88/1343] Linking C static library esp-idf/driver/libdriver.a +[89/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_sd.c.obj +[90/1343] Building C object esp-idf/esp_driver_ledc/CMakeFiles/__idf_esp_driver_ledc.dir/src/ledc.c.obj +[91/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_platform.c.obj +[92/1343] Linking C static library esp-idf/esp_driver_twai/libesp_driver_twai.a +[93/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_std.c.obj +[94/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_tdm.c.obj +[95/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_com.c.obj +[96/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cmpr.c.obj +[97/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cap.c.obj +[98/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_fault.c.obj +[99/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_pdm.c.obj +[100/1343] Linking C static library esp-idf/esp_driver_ledc/libesp_driver_ledc.a +[101/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_gen.c.obj +[102/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_oper.c.obj +[103/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_sync.c.obj +[104/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_tx.c.obj +[105/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub-entry.S.obj +[106/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/xt_debugexception.S.obj +[107/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub_transport.c.obj +[108/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_timer.c.obj +[109/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/packet.c.obj +[110/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub_xtensa.c.obj +[111/1343] Linking C static library esp-idf/esp_driver_i2c/libesp_driver_i2c.a +[112/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub.c.obj +[113/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/lib_printf.c.obj +[114/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_common.c.obj +[115/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/mesh_event.c.obj +[116/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_host.c.obj +[117/1343] Linking C static library esp-idf/esp_driver_sdm/libesp_driver_sdm.a +[118/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default_ap.c.obj +[119/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig.c.obj +[120/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_init.c.obj +[121/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_netif.c.obj +[122/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug_diagram.c.obj +[123/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default.c.obj +[124/1343] Linking C static library esp-idf/esp_driver_tsens/libesp_driver_tsens.a +[125/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/regulatory/esp_wifi_regulatory.c.obj +[126/1343] Building C object esp-idf/esp_driver_pcnt/CMakeFiles/__idf_esp_driver_pcnt.dir/src/pulse_cnt.c.obj +[127/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_common.c.obj +[128/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug.c.obj +[129/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave.c.obj +[130/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave_hd.c.obj +[131/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/esp32s3/esp_coex_adapter.c.obj +[132/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig_ack.c.obj +[133/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/esp32s3/esp_adapter.c.obj +[134/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/os_xtensa.c.obj +[135/1343] Linking C static library esp-idf/esp_driver_rmt/libesp_driver_rmt.a +[136/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ap_config.c.obj +[137/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/eloop.c.obj +[138/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_1x.c.obj +[139/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/comeback_token.c.obj +[140/1343] Linking C static library esp-idf/esp_driver_sdspi/libesp_driver_sdspi.a +[141/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/sta_info.c.obj +[142/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth_ie.c.obj +[143/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/pmksa_cache_auth.c.obj +[144/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_11.c.obj +[145/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/dragonfly.c.obj +[146/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_master.c.obj +[147/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/bitfield.c.obj +[148/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-kdf.c.obj +[149/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-siv.c.obj +[150/1343] Linking C static library esp-idf/esp_driver_sdmmc/libesp_driver_sdmmc.a +[151/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/crypto_ops.c.obj +[152/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/wpa_common.c.obj +[153/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-gcm.c.obj +[154/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ccmp.c.obj +[155/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_group5.c.obj +[156/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tlsprf.c.obj +[157/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-prf.c.obj +[158/1343] Linking C static library esp-idf/sdmmc/libsdmmc.a +[159/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_groups.c.obj +[160/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-tlsprf.c.obj +[161/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-tlsprf.c.obj +[162/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ms_funcs.c.obj +[163/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth.c.obj +[164/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-prf.c.obj +[165/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tprf.c.obj +[166/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-prf.c.obj +[167/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/md4-internal.c.obj +[168/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_common/eap_wsc_common.c.obj +[169/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/ieee802_11_common.c.obj +[170/1343] Linking C static library esp-idf/esp_driver_i2s/libesp_driver_i2s.a +[171/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/chap.c.obj +[172/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_common.c.obj +[173/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae.c.obj +[174/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap_common.c.obj +[175/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls.c.obj +[176/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_mschapv2.c.obj +[177/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap.c.obj +[178/1343] Linking C static library esp-idf/esp_driver_mcpwm/libesp_driver_mcpwm.a +[179/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/mschapv2.c.obj +[180/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap.c.obj +[181/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls_common.c.obj +[182/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_common.c.obj +[183/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/pmksa_cache.c.obj +[184/1343] Linking C static library esp-idf/esp_driver_pcnt/libesp_driver_pcnt.a +[185/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/ext_password.c.obj +[186/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_pac.c.obj +[187/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_ttls.c.obj +[188/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/uuid.c.obj +[189/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/base64.c.obj +[190/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpa_debug.c.obj +[191/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpabuf.c.obj +[192/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/common.c.obj +[193/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/json.c.obj +[194/1343] Linking C static library esp-idf/esp_gdbstub/libesp_gdbstub.a +[195/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa_ie.c.obj +[196/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps.c.obj +[197/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_process.c.obj +[198/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_parse.c.obj +[199/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa2_api_port.c.obj +[200/1343] Linking C static library esp-idf/esp_driver_spi/libesp_driver_spi.a +[201/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_build.c.obj +[202/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_common.c.obj +[203/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_dev_attr.c.obj +[204/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae_pk.c.obj +[205/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast.c.obj +[206/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa_main.c.obj +[207/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpas_glue.c.obj +[208/1343] Linking C static library esp-idf/esp_wifi/libesp_wifi.a +[209/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_common.c.obj +[210/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_owe.c.obj +[211/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa3.c.obj +[212/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_hostap.c.obj +[213/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_enrollee.c.obj +[214/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-bignum.c.obj +[215/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpsk.c.obj +[216/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa.c.obj +[217/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls.c.obj +[218/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/rc4.c.obj +[219/1343] Linking C static library esp-idf/esp_coex/libesp_coex.a +[220/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-wrap.c.obj +[221/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpbkdf2.c.obj +[222/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_defaults.c.obj +[223/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-rsa.c.obj +[224/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/des-internal.c.obj +[225/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/tls_mbedtls.c.obj +[226/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-unwrap.c.obj +[227/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_objects.c.obj +[228/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_handlers.c.obj +[229/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wps.c.obj +[230/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_eap_client.c.obj +[231/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-ccm.c.obj +[232/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-ec.c.obj +[233/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip_defaults.c.obj +[234/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/ethernetif.c.obj +[235/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/wlanif.c.obj +[236/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/esp_pbuf_ref.c.obj +[237/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/if_api.c.obj +[238/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netbuf.c.obj +[239/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/err.c.obj +[240/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_sntp.c.obj +[241/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/sntp/sntp.c.obj +[242/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netifapi.c.obj +[243/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netdb.c.obj +[244/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_lib.c.obj +[245/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/tcpip.c.obj +[246/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/netbiosns/netbiosns.c.obj +[247/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/def.c.obj +[248/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/init.c.obj +[249/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/sntp/sntp.c.obj +[250/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ip.c.obj +[251/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/mem.c.obj +[252/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/memp.c.obj +[253/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/inet_chksum.c.obj +[254/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_msg.c.obj +[255/1343] Linking C static library esp-idf/wpa_supplicant/libwpa_supplicant.a +[256/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/pbuf.c.obj +[257/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/netif.c.obj +[258/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/dns.c.obj +[259/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/stats.c.obj +[260/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/sys.c.obj +[261/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/raw.c.obj +[262/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/autoip.c.obj +[263/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/timeouts.c.obj +[264/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/icmp.c.obj +[265/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip.c.obj +[266/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/sockets.c.obj +[267/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/etharp.c.obj +[268/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/igmp.c.obj +[269/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4.c.obj +[270/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/udp.c.obj +[271/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_addr.c.obj +[272/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_in.c.obj +[273/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/dhcp.c.obj +[274/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_out.c.obj +[275/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ethip6.c.obj +[276/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_frag.c.obj +[277/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/dhcp6.c.obj +[278/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/icmp6.c.obj +[279/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_napt.c.obj +[280/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/inet6.c.obj +[281/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_addr.c.obj +[282/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ccp.c.obj +[283/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/auth.c.obj +[284/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_frag.c.obj +[285/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-md5.c.obj +[286/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif.c.obj +[287/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-new.c.obj +[288/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap_ms.c.obj +[289/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/demand.c.obj +[290/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6.c.obj +[291/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ethernet.c.obj +[292/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/slipif.c.obj +[293/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/mld6.c.obj +[294/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif_fdb.c.obj +[295/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp.c.obj +[296/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eap.c.obj +[297/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ecp.c.obj +[298/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/fsm.c.obj +[299/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipcp.c.obj +[300/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eui64.c.obj +[301/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/nd6.c.obj +[302/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/lcp.c.obj +[303/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/multilink.c.obj +[304/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppapi.c.obj +[305/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipv6cp.c.obj +[306/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/magic.c.obj +[307/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ppp.c.obj +[308/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/mppe.c.obj +[309/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppol2tp.c.obj +[310/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppcrypt.c.obj +[311/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppoe.c.obj +[312/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppos.c.obj +[313/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/upap.c.obj +[314/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/utils.c.obj +[315/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/tcp_isn_default.c.obj +[316/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/vj.c.obj +[317/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/if_index.c.obj +[318/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/sockets_ext.c.obj +[319/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/acd_dhcp_check.c.obj +[320/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md4.c.obj +[321/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/freertos/sys_arch.c.obj +[322/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/arc4.c.obj +[323/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping.c.obj +[324/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/esp32xx/vfs_lwip.c.obj +[325/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md5.c.obj +[326/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/des.c.obj +[327/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/debug/lwip_debug.c.obj +[328/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/esp_ping.c.obj +[329/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/sha1.c.obj +[330/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/lwip_default_hooks.c.obj +[331/1343] Linking C static library esp-idf/esp_netif/libesp_netif.a +[332/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping_sock.c.obj +[333/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/lib_printf.c.obj +[334/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/esp32s3/phy_init_data.c.obj +[335/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_connection_monitor.c.obj +[336/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/nullfs.c.obj +[337/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_common.c.obj +[338/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_override.c.obj +[339/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/dhcpserver/dhcpserver.c.obj +[340/1343] Building C object esp-idf/esp_vfs_console/CMakeFiles/__idf_esp_vfs_console.dir/vfs_console.c.obj +[341/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/btbb_init.c.obj +[342/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_eventfd.c.obj +[343/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag.c.obj +[344/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_vfs.c.obj +[345/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_semihost.c.obj +[346/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_init.c.obj +[347/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_platform.cpp.obj +[348/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs.c.obj +[349/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader.c.obj +[350/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_aes.c.obj +[351/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_xts_aes.c.obj +[352/1343] Linking C static library esp-idf/lwip/liblwip.a +[353/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition.cpp.obj +[354/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_lookup.cpp.obj +[355/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/default_event_loop.c.obj +[356/1343] Linking C static library esp-idf/vfs/libvfs.a +[357/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event_private.c.obj +[358/1343] Linking C static library esp-idf/esp_vfs_console/libesp_vfs_console.a +[359/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_wakeup.c.obj +[360/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event.c.obj +[361/1343] Linking C static library esp-idf/esp_driver_usb_serial_jtag/libesp_driver_usb_serial_jtag.a +[362/1343] Linking C static library esp-idf/esp_phy/libesp_phy.a +[363/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uhci.c.obj +[364/1343] Building C object esp-idf/esp_ringbuf/CMakeFiles/__idf_esp_ringbuf.dir/ringbuf.c.obj +[365/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_vfs.c.obj +[366/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer_common.c.obj +[367/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_init.c.obj +[368/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer.c.obj +[369/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer.c.obj +[370/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/system_time.c.obj +[371/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/ets_timer_legacy.c.obj +[372/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_common.c.obj +[373/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart.c.obj +[374/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_exception_stubs.cpp.obj +[375/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_init.cpp.obj +[376/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_systimer.c.obj +[377/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread.c.obj +[378/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_cond_var.c.obj +[379/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_local_storage.c.obj +[380/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_guards.cpp.obj +[381/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_rwlock.c.obj +[382/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/init.c.obj +[383/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_semaphore.c.obj +[384/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/abort.c.obj +[385/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/assert.c.obj +[386/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/heap.c.obj +[387/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/poll.c.obj +[388/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/getentropy.c.obj +[389/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/pthread.c.obj +[390/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/random.c.obj +[391/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/locks.c.obj +[392/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/termios.c.obj +[393/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/realpath.c.obj +[394/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/sysconf.c.obj +[395/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/time.c.obj +[396/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/scandir.c.obj +[397/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_item_hash_list.cpp.obj +[398/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/syscalls.c.obj +[399/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_syscalls.c.obj +[400/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/esp_time_impl.c.obj +[401/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/flockfile.c.obj +[402/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_init.c.obj +[403/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/xtensa/stdatomic_s32c1i.c.obj +[404/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/stdatomic.c.obj +[405/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/newlib_init.c.obj +[406/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/heap_idf.c.obj +[407/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_types.cpp.obj +[408/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/app_startup.c.obj +[409/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_common.c.obj +[410/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_systick.c.obj +[411/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/list.c.obj +[412/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_pagemanager.cpp.obj +[413/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_locked.cpp.obj +[414/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_cxx_api.cpp.obj +[415/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_simple.cpp.obj +[416/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_encrypted_partition.cpp.obj +[417/1343] Building ASM object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/portasm.S.obj +[418/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/event_groups.c.obj +[419/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_init.c.obj +[420/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/stream_buffer.c.obj +[421/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_page.cpp.obj +[422/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/timers.c.obj +[423/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_overlay_os_hook.c.obj +[424/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions_event_groups.c.obj +[425/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/queue.c.obj +[426/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/freertos_compatibility.c.obj +[427/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[428/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions.c.obj +[429/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/port.c.obj +[430/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[431/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[432/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_manager.cpp.obj +[433/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[434/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/hw_random.c.obj +[435/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_storage.cpp.obj +[436/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/revision.c.obj +[437/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_gpio_reserve.c.obj +[438/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_ctrl_os.c.obj +[439/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clk.c.obj +[440/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mac_addr.c.obj +[441/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_api.cpp.obj +[442/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/periph_ctrl.c.obj +[443/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sar_periph_ctrl_common.c.obj +[444/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/regi2c_ctrl.c.obj +[445/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_clk_tree.c.obj +[446/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/io_mux.c.obj +[447/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/rtc_module.c.obj +[448/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj +[449/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/intr_alloc.c.obj +[450/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma_link.c.obj +[451/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_dma_utils.c.obj +[452/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_utils.c.obj +[453/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_mspi.c.obj +[454/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_usb.c.obj +[455/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_clk_tree_common.c.obj +[456/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modem.c.obj +[457/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_console.c.obj +[458/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_bus_lock.c.obj +[459/1343] Linking C static library esp-idf/nvs_flash/libnvs_flash.a +[460/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_event.c.obj +[461/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/systimer.c.obj +[462/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/adc_share_hw_ctrl.c.obj +[463/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_share_hw_ctrl.c.obj +[464/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_async_memcpy.c.obj +[465/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_gpio.c.obj +[466/1343] Linking C static library esp-idf/esp_event/libesp_event.a +[467/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_wake_stub.c.obj +[468/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/deprecated/gdma_legacy.c.obj +[469/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/mspi_timing_tuning.c.obj +[470/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[471/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/power_supply/brownout.c.obj +[472/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[473/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[474/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/async_memcpy_gdma.c.obj +[475/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[476/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[477/1343] Linking C static library esp-idf/esp_driver_uart/libesp_driver_uart.a +[478/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clock_output.c.obj +[479/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[480/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_memprot_conv.c.obj +[481/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/sar_periph_ctrl.c.obj +[482/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_config.c.obj +[483/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[484/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_lock.c.obj +[485/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/init.c.obj +[486/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[487/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_by_mspi_delay.c.obj +[488/1343] Linking C static library esp-idf/esp_ringbuf/libesp_ringbuf.a +[489/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[490/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_hmac.c.obj +[491/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma.c.obj +[492/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_ds.c.obj +[493/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/lowpower/port/esp32s3/sleep_cpu.c.obj +[494/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_periph_clk.c.obj +[495/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[496/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[497/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[498/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[499/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[500/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[501/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[502/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[503/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[504/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[505/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[506/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[507/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[508/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[509/1343] Linking C static library esp-idf/esp_driver_gptimer/libesp_driver_gptimer.a +[510/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[511/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[512/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[513/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[514/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[515/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[516/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[517/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[518/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[519/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[520/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[521/1343] Linking C static library esp-idf/esp_timer/libesp_timer.a +[522/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/esp32s3/memory_layout.c.obj +[523/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_base.c.obj +[524/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_timestamp.c.obj +[525/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps.c.obj +[526/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[527/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/multi_heap.c.obj +[528/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_init.c.obj +[529/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/util.c.obj +[530/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[531/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[532/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/memory_layout_utils.c.obj +[533/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modes.c.obj +[534/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_lock.c.obj +[535/1343] Linking C static library esp-idf/cxx/libcxx.a +[536/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[537/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[538/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_memprot.c.obj +[539/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/tag_log_level.c.obj +[540/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[541/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_write.c.obj +[542/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/log_level.c.obj +[543/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/linked_list/log_linked_list.c.obj +[544/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[545/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[546/1343] Linking C static library esp-idf/pthread/libpthread.a +[547/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/color_hal.c.obj +[548/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[549/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[550/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/cache/log_binary_heap.c.obj +[551/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[552/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[553/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_encrypt_hal_iram.c.obj +[554/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/systimer_hal.c.obj +[555/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gpio_hal.c.obj +[556/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal.c.obj +[557/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/timer_hal.c.obj +[558/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal_iram.c.obj +[559/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rtc_io_hal.c.obj +[560/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal_iram.c.obj +[561/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal_iram.c.obj +[562/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rmt_hal.c.obj +[563/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal.c.obj +[564/1343] Linking C static library esp-idf/newlib/libnewlib.a +[565/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal.c.obj +[566/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal.c.obj +[567/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/clk_tree_hal.c.obj +[568/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/pcnt_hal.c.obj +[569/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_iram.c.obj +[570/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uhci_hal.c.obj +[571/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mcpwm_hal.c.obj +[572/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_top.c.obj +[573/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdm_hal.c.obj +[574/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdmmc_hal.c.obj +[575/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_ahb_v1.c.obj +[576/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal_common.c.obj +[577/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/twai_hal_v1.c.obj +[578/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2s_hal.c.obj +[579/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/lcd_hal.c.obj +[580/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpi_hal.c.obj +[581/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/brownout_hal.c.obj +[582/1343] Linking C static library esp-idf/freertos/libfreertos.a +[583/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sha_hal.c.obj +[584/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_oneshot_hal.c.obj +[585/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/aes_hal.c.obj +[586/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal.c.obj +[587/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal.c.obj +[588/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hmac_hal.c.obj +[589/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal_iram.c.obj +[590/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_serial_jtag_hal.c.obj +[591/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ds_hal.c.obj +[592/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_wrap_hal.c.obj +[593/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal.c.obj +[594/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cam_hal.c.obj +[595/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/touch_sensor_hal.c.obj +[596/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[597/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hd_hal.c.obj +[598/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_dwc_hal.c.obj +[599/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sens_hal.c.obj +[600/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sensor_hal.c.obj +[601/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal_iram.c.obj +[602/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_gpspi.c.obj +[603/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/xt_wdt_hal.c.obj +[604/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/tlsf/tlsf.c.obj +[605/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[606/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[607/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[608/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[609/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[610/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[611/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[612/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/rtc_cntl_hal.c.obj +[613/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[614/1343] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[615/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[616/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[617/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[618/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[619/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/crosscore_int.c.obj +[620/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system_console.c.obj +[621/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/freertos_hooks.c.obj +[622/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system.c.obj +[623/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_ipc.c.obj +[624/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/stack_check.c.obj +[625/1343] Linking C static library esp-idf/esp_security/libesp_security.a +[626/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup.c.obj +[627/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/system_time.c.obj +[628/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/int_wdt.c.obj +[629/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/ubsan.c.obj +[630/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/panic.c.obj +[631/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/xt_wdt.c.obj +[632/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup_funcs.c.obj +[633/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_routines.S.obj +[634/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_handler.S.obj +[635/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_handler_asm.S.obj +[636/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt_impl_timergroup.c.obj +[637/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_system_chip.c.obj +[638/1343] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[639/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt.c.obj +[640/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack_asm.S.obj +[641/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_port.c.obj +[642/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/panic_handler.c.obj +[643/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/image_process.c.obj +[644/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_ipc_isr.c.obj +[645/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_arch.c.obj +[646/1343] Linking C static library esp-idf/soc/libsoc.a +[647/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers_asm.S.obj +[648/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/cpu_start.c.obj +[649/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack.c.obj +[650/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/highint_hdl.S.obj +[651/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_stubs.c.obj +[652/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_brownout_hook.c.obj +[653/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/trax.c.obj +[654/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers.c.obj +[655/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/reset_reason.c.obj +[656/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/cache_err_int.c.obj +[657/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/apb_backup_dma.c.obj +[658/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_hpm_enable.c.obj +[659/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp32s3/spi_flash_oct_flash_init.c.obj +[660/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/system_internal.c.obj +[661/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_issi.c.obj +[662/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_drivers.c.obj +[663/1343] Linking C static library esp-idf/heap/libheap.a +[664/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/clk.c.obj +[665/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic.c.obj +[666/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_gd.c.obj +[667/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_boya.c.obj +[668/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_th.c.obj +[669/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_generic.c.obj +[670/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_winbond.c.obj +[671/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic_opi.c.obj +[672/1343] Linking C static library esp-idf/log/liblog.a +[673/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/memspi_host_driver.c.obj +[674/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[675/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_noos.c.obj +[676/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_ops.c.obj +[677/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/port/esp32s3/ext_mem_layout.c.obj +[678/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/cache_utils.c.obj +[679/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_app.c.obj +[680/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_mmap.c.obj +[681/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_msync.c.obj +[682/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/heap_align_hw.c.obj +[683/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_spi_init.c.obj +[684/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_utils.c.obj +[685/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[686/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_mmu_map.c.obj +[687/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[688/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[689/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_api.c.obj +[690/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[691/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[692/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[693/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[694/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[695/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[696/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[697/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/secure_boot_secure_features.c.obj +[698/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[699/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[700/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[701/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[702/1343] Linking C static library esp-idf/hal/libhal.a +[703/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[704/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[705/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[706/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[707/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_startup.c.obj +[708/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_app_desc.c.obj +[709/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[710/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[711/1343] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[712/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition_target.c.obj +[713/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[714/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/debug.c.obj +[715/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[716/1343] Linking C static library esp-idf/esp_rom/libesp_rom.a +[717/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[718/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_reader.c.obj +[719/1343] Building C object esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj +[720/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition.c.obj +[721/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_trace.c.obj +[722/1343] Linking C static library esp-idf/esp_common/libesp_common.a +[723/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_server.c.obj +[724/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_keys.c.obj +[725/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_client.c.obj +[726/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_debug_helpers_generated.c.obj +[727/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cache.c.obj +[728/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ciphersuites.c.obj +[729/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cookie.c.obj +[730/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[731/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ticket.c.obj +[732/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_client.c.obj +[733/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_generic.c.obj +[734/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_platform_time.c.obj +[735/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/mbedtls_debug.c.obj +[736/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj +[737/1343] Linking C static library esp-idf/esp_system/libesp_system.a +[738/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_create.c.obj +[739/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write.c.obj +[740/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/pkcs7.c.obj +[741/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crl.c.obj +[742/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_csr.c.obj +[743/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesni.c.obj +[744/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_csr.c.obj +[745/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/net_sockets.c.obj +[746/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_server.c.obj +[747/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesce.c.obj +[748/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_crt.c.obj +[749/1343] Linking C static library esp-idf/spi_flash/libspi_flash.a +[750/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aes.c.obj +[751/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_client.c.obj +[752/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_msg.c.obj +[753/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1parse.c.obj +[754/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1write.c.obj +[755/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aria.c.obj +[756/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/block_cipher.c.obj +[757/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod.c.obj +[758/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod_raw.c.obj +[759/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509.c.obj +[760/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/base64.c.obj +[761/1343] Linking C static library esp-idf/esp_mm/libesp_mm.a +[762/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/camellia.c.obj +[763/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chacha20.c.obj +[764/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chachapoly.c.obj +[765/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ccm.c.obj +[766/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_core.c.obj +[767/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/dhm.c.obj +[768/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/constant_time.c.obj +[769/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/des.c.obj +[770/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher_wrap.c.obj +[771/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecjpake.c.obj +[772/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ctr_drbg.c.obj +[773/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cmac.c.obj +[774/1343] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[775/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher.c.obj +[776/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crt.c.obj +[777/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdh.c.obj +[778/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves_new.c.obj +[779/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy_poll.c.obj +[780/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdsa.c.obj +[781/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hkdf.c.obj +[782/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy.c.obj +[783/1343] Linking C static library esp-idf/efuse/libefuse.a +[784/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hmac_drbg.c.obj +[785/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/memory_buffer_alloc.c.obj +[786/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/nist_kw.c.obj +[787/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md5.c.obj +[788/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lmots.c.obj +[789/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/error.c.obj +[790/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lms.c.obj +[791/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/gcm.c.obj +[792/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves.c.obj +[793/1343] Linking C static library esp-idf/esp_partition/libesp_partition.a +[794/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/padlock.c.obj +[795/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum.c.obj +[796/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md.c.obj +[797/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_ecc.c.obj +[798/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pem.c.obj +[799/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls.c.obj +[800/1343] Linking C static library esp-idf/app_update/libapp_update.a +[801/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/poly1305.c.obj +[802/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform.c.obj +[803/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform_util.c.obj +[804/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs12.c.obj +[805/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_wrap.c.obj +[806/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk.c.obj +[807/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs5.c.obj +[808/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkwrite.c.obj +[809/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/oid.c.obj +[810/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_client.c.obj +[811/1343] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[812/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_cipher.c.obj +[813/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_driver_wrappers_no_static.c.obj +[814/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_aead.c.obj +[815/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_hash.c.obj +[816/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_se.c.obj +[817/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp.c.obj +[818/1343] Linking C static library esp-idf/esp_app_format/libesp_app_format.a +[819/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_mac.c.obj +[820/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ffdh.c.obj +[821/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkparse.c.obj +[822/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_pake.c.obj +[823/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_its_file.c.obj +[824/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ripemd160.c.obj +[825/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_rsa.c.obj +[826/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ecp.c.obj +[827/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_storage.c.obj +[828/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha3.c.obj +[829/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_slot_management.c.obj +[830/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_util.c.obj +[831/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa_alt_helpers.c.obj +[832/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha1.c.obj +[833/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha256.c.obj +[834/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/threading.c.obj +[835/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/timing.c.obj +[836/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version.c.obj +[837/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version_features.c.obj +[838/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha512.c.obj +[839/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedtls.a +[840/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha_gdma_impl.c.obj +[841/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_gdma_impl.c.obj +[842/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_mem.c.obj +[843/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hardware.c.obj +[844/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_timing.c.obj +[845/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c.obj +[846/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_common.c.obj +[847/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_dma_core.c.obj +[848/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes.c.obj +[849/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_xts.c.obj +[850/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hmac_pbkdf2.c.obj +[851/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/esp_sha.c.obj +[852/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c.obj +[853/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/bignum_alt.c.obj +[854/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa.c.obj +[855/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_ds_common.c.obj +[856/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/esp_bignum.c.obj +[857/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha512.c.obj +[858/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c.obj +[859/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha1.c.obj +[860/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha256.c.obj +[861/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedx509.a +[862/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/md/esp_md.c.obj +[863/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/x25519.c.obj +[864/1343] Creating directories for 'bootloader' +[865/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/sha.c.obj +[866/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/everest.c.obj +[867/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m/p256-m.c.obj +[868/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m_driver_entrypoints.c.obj +[869/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/Hacl_Curve25519_joined.c.obj +[870/1343] No download step for 'bootloader' +[871/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_gcm.c.obj +[872/1343] No update step for 'bootloader' +[873/1343] No patch step for 'bootloader' +[874/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto.c.obj +[875/1343] Minifying + gzipping web resources +Minifying web resources in /tmp/tianshan-xterm-final/build/esp-idf/ts_webui/web_optimized... + JS js/terminal.js: 31,108 -> 20,066 (35.5% saved) + JS js/router.js: 6,414 -> 3,839 (40.1% saved) + JS js/dragSort.js: 11,460 -> 7,603 (33.7% saved) + JS js/api.js: 36,638 -> 24,339 (33.6% saved) + JS js/i18n.js: 7,208 -> 4,320 (40.1% saved) + JS js/app.js: 1,129,944 -> 840,829 (25.6% saved) + JS js/lang/en-US.js: 178,439 -> 143,161 (19.8% saved) + JS js/lang/zh-CN.js: 172,046 -> 137,314 (20.2% saved) + CSS css/style.css: 179,071 -> 129,275 (27.8% saved) + CSS fonts/remixicon.css: 5,940 -> 4,860 (18.2% saved) + + Total saved: 442,662 bytes (432.3 KB) + +Gzipping web resources in /tmp/tianshan-xterm-final/build/esp-idf/ts_webui/web_optimized... + GZ js/terminal.js: 20,066 -> 5,565 (72.3% smaller) + GZ js/router.js: 3,839 -> 1,340 (65.1% smaller) + GZ js/dragSort.js: 7,603 -> 1,869 (75.4% smaller) + GZ js/api.js: 24,339 -> 6,163 (74.7% smaller) + GZ js/i18n.js: 4,320 -> 1,460 (66.2% smaller) + GZ js/app.js: 840,829 -> 167,747 (80.0% smaller) + GZ js/lang/en-US.js: 143,161 -> 43,017 (70.0% smaller) + GZ js/lang/zh-CN.js: 137,314 -> 45,286 (67.0% smaller) + GZ vendor/xterm/fit.min.js: 1,789 -> 822 (54.1% smaller) + GZ vendor/xterm/xterm.min.js: 283,670 -> 65,684 (76.8% smaller) + GZ css/style.css: 129,275 -> 20,658 (84.0% smaller) + GZ fonts/remixicon.css: 4,860 -> 1,263 (74.0% smaller) + GZ vendor/xterm/xterm.css: 5,383 -> 2,037 (62.2% smaller) + GZ index.html: 26,676 -> 7,261 (72.8% smaller) + + Gzipped 14 files: 1,633,124 -> 370,172 (77.3% overall) +Done. +[876/1343] cd /tmp/tianshan-xterm-final/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-xterm-final/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-xterm-final/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +[877/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +[878/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/p256-m/libp256m.a +[879/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/everest/libeverest.a +[880/1343] Generating x509_crt_bundle +[881/1343] Generating ../../x509_crt_bundle.S +[882/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[883/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr_asm.S.obj +[884/1343] Building ASM object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/__/__/x509_crt_bundle.S.obj +[885/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_context.S.obj +[886/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[887/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_trace.c.obj +[888/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_glitch_filter_ops.c.obj +[889/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr.c.obj +[890/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_locks.c.obj +[891/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_vectors.S.obj +[892/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_pin_glitch_filter.c.obj +[893/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_impl.c.obj +[894/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/crc32.cpp.obj +[895/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/SPI_Flash.cpp.obj +[896/1343] Building C object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/esp_crt_bundle/esp_crt_bundle.c.obj +[897/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/Partition.cpp.obj +[898/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/dedic_gpio.c.obj +[899/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/rtc_io.c.obj +[900/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Perf.cpp.obj +[901/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Safe.cpp.obj +[902/1343] Linking C static library esp-idf/mbedtls/libmbedtls.a +[903/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio.c.obj +[904/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_rawflash.c.obj +[905/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/wear_levelling.cpp.obj +[906/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_wl.c.obj +[907/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/port/freertos/ffsystem.c.obj +[908/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio.c.obj +[909/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ffunicode.c.obj +[910/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_sdmmc.c.obj +[911/1343] Linking C static library esp-idf/esp_pm/libesp_pm.a +[912/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs_api.c.obj +[913/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_spiflash.c.obj +[914/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_cache.c.obj +[915/1343] Linking C static library esp-idf/esp_driver_gpio/libesp_driver_gpio.a +[916/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/split_argv.c.obj +[917/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_common.c.obj +[918/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_sdmmc.c.obj +[919/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_gc.c.obj +[920/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/commands.c.obj +[921/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_internal.c.obj +[922/1343] Linking C static library esp-idf/xtensa/libxtensa.a +[923/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Flash.cpp.obj +[924/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_check.c.obj +[925/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_hydrogen.c.obj +[926/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/linenoise/linenoise.c.obj +[927/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_end.c.obj +[928/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat.c.obj +[929/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_cmd.c.obj +[930/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/esp_spiffs.c.obj +[931/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dbl.c.obj +[932/1343] Linking C static library esp-idf/wear_levelling/libwear_levelling.a +[933/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dstr.c.obj +[934/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_chip.c.obj +[935/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_file.c.obj +[936/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_date.c.obj +[937/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_lit.c.obj +[938/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_hashtable.c.obj +[939/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_int.c.obj +[940/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_str.c.obj +[941/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rem.c.obj +[942/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_utils.c.obj +[943/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_nucleus.c.obj +[944/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth_netif_glue.c.obj +[945/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/argtable3.c.obj +[946/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rex.c.obj +[947/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/adler32.c.obj +[948/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/compress.c.obj +[949/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_phy_w5500.c.obj +[950/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth.c.obj +[951/1343] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON_Utils.c.obj +[952/1343] Linking C static library esp-idf/spiffs/libspiffs.a +[953/1343] Building C object esp-idf/ts_event/CMakeFiles/__idf_ts_event.dir/src/ts_event.c.obj +[954/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/phy/esp_eth_phy_802_3.c.obj +[955/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/crc32.c.obj +[956/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ff.c.obj +[957/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzclose.c.obj +[958/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inffast.c.obj +[959/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/uncompr.c.obj +[960/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzlib.c.obj +[961/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzread.c.obj +[962/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/infback.c.obj +[963/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/zutil.c.obj +[964/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inftrees.c.obj +[965/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_mac_w5500.c.obj +[966/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzwrite.c.obj +[967/1343] Linking C static library esp-idf/fatfs/libfatfs.a +[968/1343] Linking C static library esp-idf/ts_event/libts_event.a +[969/1343] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON.c.obj +[970/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_encoder.c.obj +[971/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/trees.c.obj +[972/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/example.c.obj +[973/1343] Linking C static library esp-idf/console/libconsole.a +[974/1343] Linking C static library esp-idf/esp_eth/libesp_eth.a +[975/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_api.c.obj +[976/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_dev.c.obj +[977/1343] Linking C static library esp-idf/json/libjson.a +[978/1343] Building C object esp-idf/espressif__esp_jpeg/CMakeFiles/__idf_espressif__esp_jpeg.dir/jpeg_decoder.c.obj +[979/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_spi_dev.c.obj +[980/1343] Building C object esp-idf/esp_https_server/CMakeFiles/__idf_esp_https_server.dir/src/https_server.c.obj +[981/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inflate.c.obj +[982/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/deflate.c.obj +[983/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngmem.c.obj +[984/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrio.c.obj +[985/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngerror.c.obj +[986/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngpread.c.obj +[987/1343] Building C object esp-idf/ts_log/CMakeFiles/__idf_ts_log.dir/src/ts_log.c.obj +[988/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtrans.c.obj +[989/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwio.c.obj +[990/1343] Linking C static library esp-idf/espressif__zlib/libespressif__zlib.a +[991/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtest.c.obj +[992/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwtran.c.obj +[993/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngget.c.obj +[994/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_mem_caps.c.obj +[995/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngset.c.obj +[996/1343] Building C object esp-idf/ts_jsonpath/CMakeFiles/__idf_ts_jsonpath.dir/src/ts_jsonpath.c.obj +[997/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_networking_lwip.c.obj +[998/1343] Building C object esp-idf/espressif__esp_websocket_client/CMakeFiles/__idf_espressif__esp_websocket_client.dir/esp_websocket_client.c.obj +[999/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwrite.c.obj +[1000/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwutil.c.obj +[1001/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent_win.c.obj +[1002/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_console.c.obj +[1003/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/blowfish.c.obj +[1004/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/png.c.obj +[1005/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/bcrypt_pbkdf.c.obj +[1006/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngread.c.obj +[1007/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent.c.obj +[1008/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrutil.c.obj +[1009/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/comp.c.obj +[1010/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrtran.c.obj +[1011/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/crypt.c.obj +[1012/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/global.c.obj +[1013/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/keepalive.c.obj +[1014/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/openssl.c.obj +[1015/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/hostkey.c.obj +[1016/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/libgcrypt.c.obj +[1017/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mac.c.obj +[1018/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/os400qc3.c.obj +[1019/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/knownhost.c.obj +[1020/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/misc.c.obj +[1021/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/channel.c.obj +[1022/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/pem.c.obj +[1023/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mbedtls.c.obj +[1024/1343] Linking C static library esp-idf/ts_log/libts_log.a +[1025/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/scp.c.obj +[1026/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/packet.c.obj +[1027/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/version.c.obj +[1028/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/publickey.c.obj +[1029/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/transport.c.obj +[1030/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth_kbd_packet.c.obj +[1031/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/wincng.c.obj +[1032/1343] Linking C static library esp-idf/esp_https_server/libesp_https_server.a +[1033/1343] Linking C static library esp-idf/espressif__esp_websocket_client/libespressif__esp_websocket_client.a +[1034/1343] Linking C static library esp-idf/espressif__led_strip/libespressif__led_strip.a +[1035/1343] Building C object esp-idf/ts_mempool/CMakeFiles/__idf_ts_mempool.dir/src/ts_mempool.c.obj +[1036/1343] Linking C static library esp-idf/espressif__esp_jpeg/libespressif__esp_jpeg.a +[1037/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/session.c.obj +[1038/1343] Linking C static library esp-idf/ts_jsonpath/libts_jsonpath.a +[1039/1343] Building C object esp-idf/ts_service/CMakeFiles/__idf_ts_service.dir/src/ts_service.c.obj +[1040/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/kex.c.obj +[1041/1343] Linking C static library esp-idf/espressif__libpng/libespressif__libpng.a +[1042/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_nvs.c.obj +[1043/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_json.c.obj +[1044/1343] Linking C static library esp-idf/ts_mempool/libts_mempool.a +[1045/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_schemas.c.obj +[1046/1343] Linking C static library esp-idf/ts_service/libts_service.a +[1047/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_meta.c.obj +[1048/1343] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert_time.c.obj +[1049/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth.c.obj +[1050/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config.c.obj +[1051/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_file.c.obj +[1052/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_auth.c.obj +[1053/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_security.c.obj +[1054/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_module.c.obj +[1055/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/sftp.c.obj +[1056/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_client.c.obj +[1057/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_scp.c.obj +[1058/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_shell.c.obj +[1059/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_crypto.c.obj +[1060/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_sftp.c.obj +[1061/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_known_hosts.c.obj +[1062/1343] Building C object esp-idf/ts_config_pack/CMakeFiles/__idf_ts_config_pack.dir/src/ts_config_pack.c.obj +[1063/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_port_forward.c.obj +[1064/1343] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert.c.obj +[1065/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_log_watch.c.obj +[1066/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_probe.c.obj +[1067/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_hosts_config.c.obj +[1068/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_keystore.c.obj +[1069/1343] Linking C static library esp-idf/ch405labs_esp_libssh2/libch405labs_esp_libssh2.a +[1070/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_compat.c.obj +[1071/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_commands_config.c.obj +[1072/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_store.c.obj +[1073/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns.c.obj +[1074/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_runner.c.obj +[1075/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_freertos.c.obj +[1076/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_codec.c.obj +[1077/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_variable.c.obj +[1078/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_cache.c.obj +[1079/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_automation.c.obj +[1080/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_memory.c.obj +[1081/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_port_esp32.c.obj +[1082/1343] Linking C static library esp-idf/espressif__mdns/libespressif__mdns.a +[1083/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/port/esp/unity_utils_memory_esp.c.obj +[1084/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/constants.pb-c.c.obj +[1085/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity/src/unity.c.obj +[1086/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/session.pb-c.c.obj +[1087/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec1.pb-c.c.obj +[1088/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec2.pb-c.c.obj +[1089/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec0.pb-c.c.obj +[1090/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/common/protocomm.c.obj +[1091/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_service.c.obj +[1092/1343] Linking C static library esp-idf/ts_config/libts_config.a +[1093/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security0.c.obj +[1094/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_console.c.obj +[1095/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_httpd.c.obj +[1096/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp_mpi.c.obj +[1097/1343] Linking C static library esp-idf/ts_config_pack/libts_config_pack.a +[1098/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/host_file_io.c.obj +[1099/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace_util.c.obj +[1100/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp.c.obj +[1101/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace.c.obj +[1102/1343] Linking C static library esp-idf/unity/libunity.a +[1103/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security1.c.obj +[1104/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/port/port_uart.c.obj +[1105/1343] Building C object esp-idf/protobuf-c/CMakeFiles/__idf_protobuf-c.dir/protobuf-c/protobuf-c/protobuf-c.c.obj +[1106/1343] Linking C static library esp-idf/ts_cert/libts_cert.a +[1107/1343] Building C object esp-idf/cmock/CMakeFiles/__idf_cmock.dir/CMock/src/cmock.c.obj +[1108/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security2.c.obj +[1109/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp_share_ctrl.c.obj +[1110/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/esp_cam_ctlr.c.obj +[1111/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_gdma.c.obj +[1112/1343] Linking C static library esp-idf/protobuf-c/libprotobuf-c.a +[1113/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidd.c.obj +[1114/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hid_common.c.obj +[1115/1343] Linking C static library esp-idf/ts_security/libts_security.a +[1116/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_common.c.obj +[1117/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidh.c.obj +[1118/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_io.c.obj +[1119/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_engine.c.obj +[1120/1343] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/common/touch_sens_common.c.obj +[1121/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ops.c.obj +[1122/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_nt35510.c.obj +[1123/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ssd1306.c.obj +[1124/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_st7789.c.obj +[1125/1343] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/hw_ver2/touch_version_specific.c.obj +[1126/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_cam.c.obj +[1127/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_init.c.obj +[1128/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v1.c.obj +[1129/1343] Linking C static library esp-idf/protocomm/libprotocomm.a +[1130/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_source_manager.c.obj +[1131/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v2.c.obj +[1132/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_handler.c.obj +[1133/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_sha.c.obj +[1134/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_common.c.obj +[1135/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/proto-c/esp_local_ctrl.pb-c.c.obj +[1136/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/spi/esp_lcd_panel_io_spi.c.obj +[1137/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_crc.c.obj +[1138/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl.c.obj +[1139/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_transport_httpd.c.obj +[1140/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_binary.c.obj +[1141/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_elf.c.obj +[1142/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_flash.c.obj +[1143/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_uart.c.obj +[1144/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_action_manager.c.obj +[1145/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/port/xtensa/core_dump_port.c.obj +[1146/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_access.c.obj +[1147/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_masks.c.obj +[1148/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i80/esp_lcd_panel_io_i80.c.obj +[1149/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_apis.c.obj +[1150/1343] Building C object esp-idf/nvs_sec_provider/CMakeFiles/__idf_nvs_sec_provider.dir/nvs_sec_provider.c.obj +[1151/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/platform_esp32_idf.c.obj +[1152/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_msg.c.obj +[1153/1343] Linking C static library esp-idf/ts_automation/libts_automation.a +[1154/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_outbox.c.obj +[1155/1343] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_utils.c.obj +[1156/1343] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_mqueue.c.obj +[1157/1343] Generating ../../lpmu-agx-network-setup.tar.gz.S +[1158/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_private.c.obj +[1159/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_button.c.obj +[1160/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_matrix.c.obj +[1161/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_helpers.c.obj +[1162/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hub.c.obj +[1163/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_element.c.obj +[1164/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_phy.c.obj +[1165/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api.c.obj +[1166/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/enum.c.obj +[1167/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_slider.c.obj +[1168/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_host.c.obj +[1169/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config.c.obj +[1170/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usbh.c.obj +[1171/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config_pack.c.obj +[1172/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_system.c.obj +[1173/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_network.c.obj +[1174/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/rgb/esp_lcd_panel_rgb.c.obj +[1175/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_fan.c.obj +[1176/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_service.c.obj +[1177/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_power.c.obj +[1178/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hcd_dwc.c.obj +[1179/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_storage.c.obj +[1180/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_gpio.c.obj +[1181/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_temp.c.obj +[1182/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_monitor.c.obj +[1183/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_nat.c.obj +[1184/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_dhcp.c.obj +[1185/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_hosts.c.obj +[1186/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_wifi.c.obj +[1187/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_device.c.obj +[1188/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_key.c.obj +[1189/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_led.c.obj +[1190/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/mqtt_client.c.obj +[1191/1343] Building ASM object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/__/__/lpmu-agx-network-setup.tar.gz.S.obj +[1192/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_lpmu_access.c.obj +[1193/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_time.c.obj +[1194/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_auth.c.obj +[1195/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_sftp.c.obj +[1196/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_log.c.obj +[1197/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ui.c.obj +[1198/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_api.c.obj +[1199/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_cert.c.obj +[1200/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui.c.obj +[1201/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_auth.c.obj +[1202/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_i18n.c.obj +[1203/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_api.c.obj +[1204/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https.c.obj +[1205/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_args.c.obj +[1206/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_operation.c.obj +[1207/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ota.c.obj +[1208/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console.c.obj +[1209/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_builtin.c.obj +[1210/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ssh.c.obj +[1211/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_subscriptions.c.obj +[1212/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_script.c.obj +[1213/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_transport.c.obj +[1214/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_auto.c.obj +[1215/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/linenoise/linenoise.c.obj +[1216/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_monitor.c.obj +[1217/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_config.c.obj +[1218/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_ws.c.obj +[1219/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_device.c.obj +[1220/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_gpio.c.obj +[1221/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fan.c.obj +[1222/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_dhcp.c.obj +[1223/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fs.c.obj +[1224/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_nat.c.obj +[1225/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_net.c.obj +[1226/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_register.c.obj +[1227/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_key.c.obj +[1228/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_hosts.c.obj +[1229/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ota.c.obj +[1230/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_power.c.obj +[1231/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_service.c.obj +[1232/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_pki.c.obj +[1233/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_storage.c.obj +[1234/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_sftp.c.obj +[1235/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_system.c.obj +[1236/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_voltprot.c.obj +[1237/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_version.c.obj +[1238/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_temp.c.obj +[1239/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_rollback.c.obj +[1240/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_wifi.c.obj +[1241/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota.c.obj +[1242/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_sdcard.c.obj +[1243/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_recovery.c.obj +[1244/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ssh.c.obj +[1245/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net.c.obj +[1246/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_wifi.c.obj +[1247/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_eth.c.obj +[1248/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led.c.obj +[1249/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_driver.c.obj +[1250/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_automation.c.obj +[1251/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_https.c.obj +[1252/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_nat.c.obj +[1253/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_time_sync.c.obj +[1254/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_led.c.obj +[1255/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_http_server.c.obj +[1256/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_www.c.obj +[1257/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color.c.obj +[1258/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_layer.c.obj +[1259/1343] Linking C static library esp-idf/ts_api/libts_api.a +[1260/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_qrcode.c.obj +[1261/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net_manager.c.obj +[1262/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_https_server.c.obj +[1263/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_drivers.c.obj +[1264/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color_correction.c.obj +[1265/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_effect.c.obj +[1266/1343] Linking C static library esp-idf/ts_https/libts_https.a +[1267/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_animation.c.obj +[1268/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_font.c.obj +[1269/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_download.c.obj +[1270/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_usb_mux.c.obj +[1271/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_preset.c.obj +[1272/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_text.c.obj +[1273/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/qrcodegen/qrcodegen.c.obj +[1274/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power.c.obj +[1275/1343] Linking C static library esp-idf/ts_webui/libts_webui.a +[1276/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_dhcp_server.c.obj +[1277/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_monitor.c.obj +[1278/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_hal.c.obj +[1279/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_fan.c.obj +[1280/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_gpio.c.obj +[1281/1343] Performing configure step for 'bootloader' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-xterm-final/sdkconfig +-- Compiler supported targets: xtensa-esp-elf +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Bootloader project name: "bootloader" version: 1 +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.rom.ld +-- Components: bootloader bootloader_support efuse esp_app_format esp_bootloader_format esp_common esp_hw_support esp_rom esp_security esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/components/micro-ecc /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld +-- Configuring done (4.7s) +-- Generating done (0.2s) +-- Build files have been written to: /tmp/tianshan-xterm-final/build/bootloader +[1282/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_i2c.c.obj +[1283/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/platform/esp32s3/ts_platform_s3.c.obj +[1284/1343] Linking C static library esp-idf/ts_console/libts_console.a +[1285/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pwm.c.obj +[1286/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_temp_source.c.obj +[1287/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_image.c.obj +[1288/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_spi.c.obj +[1289/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_uart.c.obj +[1290/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pin_manager.c.obj +[1291/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_adc.c.obj +[1292/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_policy.c.obj +[1293/1343] Linking C static library esp-idf/ts_ota/libts_ota.a +[1294/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_device_ctrl.c.obj +[1295/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_spiffs.c.obj +[1296/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_config.c.obj +[1297/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_ctrl.c.obj +[1298/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/handlers.c.obj +[1299/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_ctrl.pb-c.c.obj +[1300/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_constants.pb-c.c.obj +[1301/1343] Linking C static library esp-idf/ts_net/libts_net.a +[1302/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_config.pb-c.c.obj +[1303/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_console.c.obj +[1304/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_scan.pb-c.c.obj +[1305/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_scan.c.obj +[1306/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_softap.c.obj +[1307/1343] Linking C static library esp-idf/cmock/libcmock.a +[1308/1343] Linking C static library esp-idf/app_trace/libapp_trace.a +[1309/1343] Linking C static library esp-idf/esp_driver_cam/libesp_driver_cam.a +[1310/1343] Linking C static library esp-idf/esp_driver_touch_sens/libesp_driver_touch_sens.a +[1311/1343] Linking C static library esp-idf/esp_hid/libesp_hid.a +[1312/1343] Linking C static library esp-idf/esp_local_ctrl/libesp_local_ctrl.a +[1313/1343] Linking C static library esp-idf/esp_lcd/libesp_lcd.a +[1314/1343] Linking C static library esp-idf/ts_led/libts_led.a +[1315/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_core_init.c.obj +[1316/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_sd.c.obj +[1317/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage.c.obj +[1318/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj +[1319/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_compute_monitor.c.obj +[1320/1343] Linking C static library esp-idf/espcoredump/libespcoredump.a +[1321/1343] Linking C static library esp-idf/mqtt/libmqtt.a +[1322/1343] Linking C static library esp-idf/nvs_sec_provider/libnvs_sec_provider.a +[1323/1343] Linking C static library esp-idf/perfmon/libperfmon.a +[1324/1343] Linking C static library esp-idf/rt/librt.a +[1325/1343] Linking C static library esp-idf/touch_element/libtouch_element.a +[1326/1343] Linking C static library esp-idf/usb/libusb.a +[1327/1343] Linking C static library esp-idf/ts_drivers/libts_drivers.a +[1328/1343] Linking C static library esp-idf/ts_hal/libts_hal.a +[1329/1343] Linking C static library esp-idf/ts_storage/libts_storage.a +[1330/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_services.c.obj +[1331/1343] Building C object esp-idf/ts_pki_client/CMakeFiles/__idf_ts_pki_client.dir/src/ts_pki_client.c.obj +[1332/1343] Linking C static library esp-idf/ts_pki_client/libts_pki_client.a +[1333/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/manager.c.obj +[1334/1343] Linking C static library esp-idf/main/libmain.a +[1335/1343] Linking C static library esp-idf/wifi_provisioning/libwifi_provisioning.a +[1336/1343] Performing build step for 'bootloader' +[1/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/util.c.obj +[2/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[3/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_timestamp.c.obj +[4/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_lock.c.obj +[5/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[6/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[7/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[8/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[9/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[10/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[11/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[12/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[13/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[14/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[15/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[16/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[17/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[18/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[19/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[20/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[21/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[22/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[23/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[24/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[25/123] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[26/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[27/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[28/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[29/123] Linking C static library esp-idf/log/liblog.a +[30/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[31/123] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[32/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[33/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[34/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[35/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[36/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[37/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[38/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[39/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[40/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[41/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[42/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[43/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[44/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[45/123] Linking C static library esp-idf/esp_rom/libesp_rom.a +[46/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[47/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[48/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[49/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[50/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[51/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[52/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[53/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj +[54/123] Linking C static library esp-idf/esp_common/libesp_common.a +[55/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj +[56/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[57/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_soc.c.obj +[58/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj +[59/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[60/123] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[61/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj +[62/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[63/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[64/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[65/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[66/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[67/123] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[68/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj +[69/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_esp32s3.c.obj +[70/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[71/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[72/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[73/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[74/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[75/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[76/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[77/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[78/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[79/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[80/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[81/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[82/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[83/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[84/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[85/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[86/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[87/123] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[88/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[89/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[90/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[91/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[92/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[93/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[94/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[95/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[96/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[97/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[98/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[99/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[100/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[101/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[102/123] Generating project_elf_src_esp32s3.c +[103/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[104/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[105/123] Linking C static library esp-idf/esp_system/libesp_system.a +[106/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[107/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[108/123] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32s3.c.obj +[109/123] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj +[110/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[111/123] Linking C static library esp-idf/efuse/libefuse.a +[112/123] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[113/123] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[114/123] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj +[115/123] Linking C static library esp-idf/spi_flash/libspi_flash.a +[116/123] Linking C static library esp-idf/hal/libhal.a +[117/123] Linking C static library esp-idf/micro-ecc/libmicro-ecc.a +[118/123] Linking C static library esp-idf/soc/libsoc.a +[119/123] Linking C static library esp-idf/xtensa/libxtensa.a +[120/123] Linking C static library esp-idf/main/libmain.a +[121/123] Linking C executable bootloader.elf +[122/123] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-xterm-final/build/bootloader/bootloader.bin +[123/123] cd /tmp/tianshan-xterm-final/build/bootloader/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /tmp/tianshan-xterm-final/build/bootloader/bootloader.bin +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[1337/1343] No install step for 'bootloader' +[1338/1343] Completed 'bootloader' +[1339/1343] Generating esp-idf/esp_system/ld/sections.ld +[1340/1343] Building C object CMakeFiles/TianShanOS.elf.dir/project_elf_src_esp32s3.c.obj +[1341/1343] Linking CXX executable TianShanOS.elf +[1342/1343] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-xterm-final/build/TianShanOS.bin +[1343/1343] cd /tmp/tianshan-xterm-final/build/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 partition --type app /tmp/tianshan-xterm-final/build/partition_table/partition-table.bin /tmp/tianshan-xterm-final/build/TianShanOS.bin +TianShanOS.bin binary size 0x215120 bytes. Smallest app partition is 0x300000 bytes. 0xeaee0 bytes (31%) free. + +Project build complete. To flash, run: + idf.py flash +or + idf.py -p PORT flash +or + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m 0x0 ../../../private/tmp/tianshan-xterm-final/build/bootloader/bootloader.bin 0x8000 ../../../private/tmp/tianshan-xterm-final/build/partition_table/partition-table.bin 0x16000 ../../../private/tmp/tianshan-xterm-final/build/ota_data_initial.bin 0x20000 ../../../private/tmp/tianshan-xterm-final/build/TianShanOS.bin 0x6a0000 ../../../private/tmp/tianshan-xterm-final/build/www.bin +or from the "/private/tmp/tianshan-xterm-final/build" directory + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args" diff --git a/docs/repair/xterm-local/changes.patch b/docs/repair/xterm-local/changes.patch new file mode 100644 index 0000000..7113015 --- /dev/null +++ b/docs/repair/xterm-local/changes.patch @@ -0,0 +1,149 @@ +diff --git a/components/ts_webui/web/index.html b/components/ts_webui/web/index.html +index 59265c7..eea293c 100644 +--- a/components/ts_webui/web/index.html ++++ b/components/ts_webui/web/index.html +@@ -41,9 +41,9 @@ + .modal-content{background:var(--bg-card);border-radius:var(--radius-lg);max-width:600px;width:95%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg)} + + +- +- +- ++ ++ ++ + + + +@@ -247,7 +247,7 @@ + + + +- +- +- +- +- ++ ++ ++ ++ ++ + + +diff --git a/components/ts_webui/web/js/terminal.js b/components/ts_webui/web/js/terminal.js +index 8fb1240..b1783eb 100644 +--- a/components/ts_webui/web/js/terminal.js ++++ b/components/ts_webui/web/js/terminal.js +@@ -4,7 +4,7 @@ + */ + + /** +- * 按需加载 xterm.js 及其插件(从 CDN) ++ * 按需加载 xterm.js 及其插件(设备本地资源) + * 仅在首次打开终端页面时触发,后续调用直接返回 + */ + const _xtermReady = (function() { +@@ -30,9 +30,9 @@ const _xtermReady = (function() { + } + return function ensureXtermLoaded() { + if (_promise) return _promise; +- _promise = loadResource('https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css', true) +- .then(() => loadResource('https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.min.js', false)) +- .then(() => loadResource('https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.min.js', false)) ++ _promise = loadResource('/vendor/xterm/xterm.css?v=' + encodeURIComponent(window.TS_ASSET_VERSION), true) ++ .then(() => loadResource('/vendor/xterm/xterm.min.js?v=' + encodeURIComponent(window.TS_ASSET_VERSION), false)) ++ .then(() => loadResource('/vendor/xterm/fit.min.js?v=' + encodeURIComponent(window.TS_ASSET_VERSION), false)) + .catch(error => { _promise = null; throw error; }); + return _promise; + }; +@@ -70,7 +70,7 @@ class WebTerminal { + return false; + } + +- // 按需加载 xterm.js(首次访问终端页面时从 CDN 拉取) ++ // 按需加载 xterm.js(首次访问终端页面时从设备加载) + try { await _xtermReady(); } + catch (error) { + if (this.destroyed) return false; +diff --git a/tests/prompts/browser.test.cjs b/tests/prompts/browser.test.cjs +index e452f44..5ff034e 100644 +--- a/tests/prompts/browser.test.cjs ++++ b/tests/prompts/browser.test.cjs +@@ -71,7 +71,7 @@ test('delayed language package and rapid switches keep the latest requested lang + }finally{release();await context.close();} + }); + test('terminal resource failure presents retry; a rejected cached promise is not reused',async()=>{ +- const {page,context,errors}=await pageFor('en-US');let attempts=0; ++ const {page,context,errors}=await pageFor('en-US',async(route,u)=>{if(u.pathname.startsWith('/vendor/')){await route.abort();return true;}return false;});let attempts=0; + try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady()); + page.on('request',r=>{if(r.url().includes('xterm.css'))attempts++;}); + await page.evaluate(()=>{closeLoginModal();return loadTerminalPage();}); +@@ -118,15 +118,12 @@ test('failed language switch preserves the loaded language; retry clears failure + }finally{await context.close();} + }); + test('terminal can initialize after failed resource load using newly served resources',async()=>{ +- const {page,context,errors}=await pageFor('en-US'); ++ let fail=true; ++ const {page,context,errors}=await pageFor('en-US',async(route,u)=>{if(fail&&u.pathname.startsWith('/vendor/')){await route.abort();return true;}return false;}); + try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady());await page.evaluate(()=>{closeLoginModal();return loadTerminalPage();}); +- await page.route('https://cdn.jsdelivr.net/**',async route=>{ +- const url=route.request().url();let body=''; +- if(url.includes('xterm.min.js')) body=`window.Terminal=class {constructor(){this.cols=80;this.rows=24;}open(el){el.replaceChildren();el.dataset.terminalReady='yes';}onData(){}loadAddon(){}write(){}writeln(){}focus(){}dispose(){}};`; +- if(url.includes('xterm-addon-fit'))body='window.FitAddon={FitAddon:class {fit(){}}};'; +- await route.fulfill({contentType:url.endsWith('.css')?'text/css':'application/javascript',body}); +- }); +- await page.locator('#terminal-container button').click();await page.waitForSelector('#terminal-container[data-terminal-ready="yes"]'); ++ assert.equal(await page.locator('#terminal-container button').count(),1); ++ fail=false;await page.locator('#terminal-container button').click();await page.waitForSelector('#terminal-container .xterm'); ++ assert(await page.evaluate(()=>webTerminal.terminal instanceof Terminal&&!!webTerminal.fitAddon)); + assert.equal(await page.locator('#terminal-container button').count(),0);assert.deepEqual(errors,[]); + }finally{await context.close();} + }); +diff --git a/tests/prompts/package.json b/tests/prompts/package.json +index 7ee8d1f..fb6290b 100644 +--- a/tests/prompts/package.json ++++ b/tests/prompts/package.json +@@ -6,7 +6,8 @@ + }, + "scripts": { + "test": "cd ../.. && node --test tests/prompts/static.test.cjs tests/prompts/regression.test.cjs", +- "test:browser": "cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs" ++ "test:browser": "cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs", ++ "test:xterm": "cd ../.. && node --test tests/prompts/xterm-vendor.test.cjs tests/prompts/xterm-offline.test.cjs" + }, + "devDependencies": { + "acorn": "8.16.0", +diff --git a/tools/minify_web.py b/tools/minify_web.py +index 0c1bd9a..3e8d510 100644 +--- a/tools/minify_web.py ++++ b/tools/minify_web.py +@@ -123,6 +123,9 @@ def process_directory(web_dir: str) -> None: + + # 处理 JS 文件 + for filepath in glob.glob(os.path.join(web_dir, '**', '*.js'), recursive=True): ++ # Preserve third-party release bytes; gzip still runs below. ++ if os.path.relpath(filepath, web_dir).split(os.sep)[0] == 'vendor': ++ continue + original_size = os.path.getsize(filepath) + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() +@@ -141,6 +144,9 @@ def process_directory(web_dir: str) -> None: + + # 处理 CSS 文件 + for filepath in glob.glob(os.path.join(web_dir, '**', '*.css'), recursive=True): ++ # Preserve third-party release bytes; gzip still runs below. ++ if os.path.relpath(filepath, web_dir).split(os.sep)[0] == 'vendor': ++ continue + original_size = os.path.getsize(filepath) + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() diff --git a/docs/repair/xterm-local/cross-en.json b/docs/repair/xterm-local/cross-en.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/xterm-local/cross-en.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/xterm-local/cross-en.txt b/docs/repair/xterm-local/cross-en.txt new file mode 100644 index 0000000..7c3e1b4 --- /dev/null +++ b/docs/repair/xterm-local/cross-en.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Node en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/xterm-local/cross-zh.json b/docs/repair/xterm-local/cross-zh.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/xterm-local/cross-zh.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/xterm-local/cross-zh.txt b/docs/repair/xterm-local/cross-zh.txt new file mode 100644 index 0000000..4699bd2 --- /dev/null +++ b/docs/repair/xterm-local/cross-zh.txt @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Node zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/xterm-local/flasher_args.json b/docs/repair/xterm-local/flasher_args.json new file mode 100644 index 0000000..0e2ffeb --- /dev/null +++ b/docs/repair/xterm-local/flasher_args.json @@ -0,0 +1,28 @@ +{ + "write_flash_args" : [ "--flash_mode", "dio", + "--flash_size", "16MB", + "--flash_freq", "80m" ], + "flash_settings" : { + "flash_mode": "dio", + "flash_size": "16MB", + "flash_freq": "80m" + }, + "flash_files" : { + "0x0" : "bootloader/bootloader.bin", + "0x20000" : "TianShanOS.bin", + "0x8000" : "partition_table/partition-table.bin", + "0x16000" : "ota_data_initial.bin", + "0x6a0000" : "www.bin" + }, + "bootloader" : { "offset" : "0x0", "file" : "bootloader/bootloader.bin", "encrypted" : "false" }, + "app" : { "offset" : "0x20000", "file" : "TianShanOS.bin", "encrypted" : "false" }, + "partition-table" : { "offset" : "0x8000", "file" : "partition_table/partition-table.bin", "encrypted" : "false" }, + "otadata" : { "offset" : "0x16000", "file" : "ota_data_initial.bin", "encrypted" : "false" }, + "www" : { "offset" : "0x6a0000", "file" : "www.bin", "encrypted" : "false" }, + "extra_esptool_args" : { + "after" : "hard_reset", + "before" : "default_reset", + "stub" : true, + "chip" : "esp32s3" + } +} diff --git a/docs/repair/xterm-local/initial-build-path-failure.log b/docs/repair/xterm-local/initial-build-path-failure.log new file mode 100644 index 0000000..11e6659 --- /dev/null +++ b/docs/repair/xterm-local/initial-build-path-failure.log @@ -0,0 +1,1079 @@ +Executing action: all (aliases: build) +Running cmake in directory /private/tmp/tianshan-xterm-build/build +Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python -DESP_PLATFORM=1 -DSDKCONFIG=/tmp/tianshan-xterm-build/sdkconfig -DCCACHE_ENABLE=0 /Users/massif/TianshanOS"... +-- Found Python3: /opt/anaconda3/bin/python3.12 (found version "3.12.4") found components: Interpreter +-- IDF_TARGET is not set, guessed 'esp32s3' from sdkconfig '/tmp/tianshan-xterm-build/sdkconfig' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +NOTICE: +Following dependencies have new versions available: +Dependency "espressif/libpng": "1.6.54" -> "1.6.58~2" +Dependency "espressif/mdns": "1.9.1" -> "1.13.1" +Dependency "espressif/zlib": "1.3.1" -> "1.3.2~1" +Consider running "idf.py update-dependencies" to update your lock file. +NOTICE: Processing 7 dependencies: +NOTICE: [1/7] espressif/esp_jpeg (1.3.1) +NOTICE: [2/7] espressif/esp_websocket_client (1.5.0) +NOTICE: [3/7] espressif/led_strip (3.0.3) +NOTICE: [4/7] espressif/libpng (1.6.54) +NOTICE: [5/7] espressif/mdns (1.9.1) +NOTICE: [6/7] espressif/zlib (1.3.1) +NOTICE: [7/7] idf (5.5.2) +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-xterm-build/sdkconfig +Loading defaults file /Users/massif/TianshanOS/sdkconfig.defaults... +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:54 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:56 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:64 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:66 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:82 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:84 line was updated to # === L2 NVS 加密配置(HMAC 方案)===n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:159 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:161 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:170 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:172 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:182 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:184 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:193 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:195 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:227 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpwsgg7d29:229 line was updated to # ============================================================================n +-- Compiler supported targets: xtensa-esp-elf +-- Found Python3: /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python (found version "3.12.4") found components: Interpreter +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success +-- Found Threads: TRUE +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success +-- USING O3 +-- App "TianShanOS" version: 0.5.2+633bb94d.09281637 +-- Adding linker script /tmp/tianshan-xterm-build/build/esp-idf/esp_system/ld/memory.ld +-- Adding linker script /tmp/tianshan-xterm-build/build/esp-idf/esp_system/ld/sections.ld.in +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_master.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_50.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_smp.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_dtm.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_test.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_scan.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Web optimization enabled (minify + gzip) +-- Components: app_trace app_update bootloader bootloader_support bt ch405labs_esp_libssh2 cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi espcoredump espressif__esp_jpeg espressif__esp_websocket_client espressif__led_strip espressif__libpng espressif__mdns espressif__zlib esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread rt sdmmc soc spi_flash spiffs tcp_transport touch_element ts_api ts_auth_layout ts_automation ts_cert ts_config ts_config_pack ts_console ts_core ts_drivers ts_event ts_hal ts_https ts_jsonpath ts_led ts_log ts_mempool ts_net ts_ota ts_pki_client ts_security ts_service ts_storage ts_webui ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/app_trace /Users/massif/esp/v5.5.2/esp-idf/components/app_update /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/bt /Users/massif/TianshanOS/components/ch405labs_esp_libssh2 /Users/massif/esp/v5.5.2/esp-idf/components/cmock /Users/massif/esp/v5.5.2/esp-idf/components/console /Users/massif/esp/v5.5.2/esp-idf/components/cxx /Users/massif/esp/v5.5.2/esp-idf/components/driver /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp-tls /Users/massif/esp/v5.5.2/esp-idf/components/esp_adc /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_coex /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ana_cmpr /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_bitscrambler /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_cam /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_dac /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gpio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gptimer /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2c /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2s /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_isp /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_jpeg /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ledc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_mcpwm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_parlio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_pcnt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ppa /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_rmt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdspi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_spi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_touch_sens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_tsens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_twai /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_uart /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_usb_serial_jtag /Users/massif/esp/v5.5.2/esp-idf/components/esp_eth /Users/massif/esp/v5.5.2/esp-idf/components/esp_event /Users/massif/esp/v5.5.2/esp-idf/components/esp_gdbstub /Users/massif/esp/v5.5.2/esp-idf/components/esp_hid /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_client /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_ota /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_lcd /Users/massif/esp/v5.5.2/esp-idf/components/esp_local_ctrl /Users/massif/esp/v5.5.2/esp-idf/components/esp_mm /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif_stack /Users/massif/esp/v5.5.2/esp-idf/components/esp_partition /Users/massif/esp/v5.5.2/esp-idf/components/esp_phy /Users/massif/esp/v5.5.2/esp-idf/components/esp_pm /Users/massif/esp/v5.5.2/esp-idf/components/esp_psram /Users/massif/esp/v5.5.2/esp-idf/components/esp_ringbuf /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esp_timer /Users/massif/esp/v5.5.2/esp-idf/components/esp_vfs_console /Users/massif/esp/v5.5.2/esp-idf/components/esp_wifi /Users/massif/esp/v5.5.2/esp-idf/components/espcoredump /Users/massif/TianshanOS/managed_components/espressif__esp_jpeg /Users/massif/TianshanOS/managed_components/espressif__esp_websocket_client /Users/massif/TianshanOS/managed_components/espressif__led_strip /Users/massif/TianshanOS/managed_components/espressif__libpng /Users/massif/TianshanOS/managed_components/espressif__mdns /Users/massif/TianshanOS/managed_components/espressif__zlib /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/fatfs /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/heap /Users/massif/esp/v5.5.2/esp-idf/components/http_parser /Users/massif/esp/v5.5.2/esp-idf/components/idf_test /Users/massif/esp/v5.5.2/esp-idf/components/ieee802154 /Users/massif/esp/v5.5.2/esp-idf/components/json /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/lwip /Users/massif/TianshanOS/main /Users/massif/esp/v5.5.2/esp-idf/components/mbedtls /Users/massif/esp/v5.5.2/esp-idf/components/mqtt /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/nvs_flash /Users/massif/esp/v5.5.2/esp-idf/components/nvs_sec_provider /Users/massif/esp/v5.5.2/esp-idf/components/openthread /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/perfmon /Users/massif/esp/v5.5.2/esp-idf/components/protobuf-c /Users/massif/esp/v5.5.2/esp-idf/components/protocomm /Users/massif/esp/v5.5.2/esp-idf/components/pthread /Users/massif/esp/v5.5.2/esp-idf/components/rt /Users/massif/esp/v5.5.2/esp-idf/components/sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/spiffs /Users/massif/esp/v5.5.2/esp-idf/components/tcp_transport /Users/massif/esp/v5.5.2/esp-idf/components/touch_element /Users/massif/TianshanOS/components/ts_api /Users/massif/TianshanOS/components/ts_auth_layout /Users/massif/TianshanOS/components/ts_automation /Users/massif/TianshanOS/components/ts_cert /Users/massif/TianshanOS/components/ts_core/ts_config /Users/massif/TianshanOS/components/ts_config_pack /Users/massif/TianshanOS/components/ts_console /Users/massif/TianshanOS/components/ts_core /Users/massif/TianshanOS/components/ts_drivers /Users/massif/TianshanOS/components/ts_core/ts_event /Users/massif/TianshanOS/components/ts_hal /Users/massif/TianshanOS/components/ts_https /Users/massif/TianshanOS/components/ts_jsonpath /Users/massif/TianshanOS/components/ts_led /Users/massif/TianshanOS/components/ts_core/ts_log /Users/massif/TianshanOS/components/ts_mempool /Users/massif/TianshanOS/components/ts_net /Users/massif/TianshanOS/components/ts_ota /Users/massif/TianshanOS/components/ts_pki_client /Users/massif/TianshanOS/components/ts_security /Users/massif/TianshanOS/components/ts_core/ts_service /Users/massif/TianshanOS/components/ts_storage /Users/massif/TianshanOS/components/ts_webui /Users/massif/esp/v5.5.2/esp-idf/components/ulp /Users/massif/esp/v5.5.2/esp-idf/components/unity /Users/massif/esp/v5.5.2/esp-idf/components/usb /Users/massif/esp/v5.5.2/esp-idf/components/vfs /Users/massif/esp/v5.5.2/esp-idf/components/wear_levelling /Users/massif/esp/v5.5.2/esp-idf/components/wifi_provisioning /Users/massif/esp/v5.5.2/esp-idf/components/wpa_supplicant /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- +-- ╔═══════════════════════════════════════════════════════════╗ +-- ║ TianShanOS v0.5.2+633bb94d.09281637 ║ +-- ║ ESP32 Rack Management Operating System ║ +-- ╚═══════════════════════════════════════════════════════════╝ +-- +-- Version: 0.5.2+633bb94d.09281637 +-- Major: 0 +-- Minor: 5 +-- Patch: 2 +-- Build: 633bb94d.09281637 +-- +-- Target: esp32s3 +-- Build type: +-- +-- Configuring done (7.4s) +-- Generating done (0.5s) +-- Build files have been written to: /tmp/tianshan-xterm-build/build +Running ninja in directory /private/tmp/tianshan-xterm-build/build +Executing "ninja all"... +[1/1343] Generating project_elf_src_esp32s3.c +[2/1343] Generating ../../ota_data_initial.bin +[3/1343] Generating /tmp/tianshan-xterm-build/build/esp-idf/esp_system/ld/memory.ld linker script... +[4/1343] Generating /tmp/tianshan-xterm-build/build/esp-idf/esp_system/ld/sections.ld.in linker script... +[5/1343] Copying web assets to build directory +[6/1343] Generating ../../partition_table/partition-table.bin +Partition table binary generated. Contents: +******************************************************************************* +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs,data,nvs,0x9000,48K, +nvs_keys,data,nvs_keys,0x15000,4K, +otadata,data,ota,0x16000,8K, +phy_init,data,phy,0x18000,4K, +ota_0,app,ota_0,0x20000,3M, +ota_1,app,ota_1,0x320000,3M, +storage,data,spiffs,0x620000,512K, +www,data,spiffs,0x6a0000,3M, +fatfs,data,fat,0x9a0000,64K, +******************************************************************************* +[7/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_utils.c.obj +[8/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_header.c.obj +[9/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/util/ctrl_sock.c.obj +[10/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_internal.c.obj +[11/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_uri.c.obj +[12/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_ws.c.obj +[13/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_sess.c.obj +[14/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_auth.c.obj +[15/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_main.c.obj +[16/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_socks_proxy.c.obj +[17/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_txrx.c.obj +[18/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport.c.obj +[19/1343] Building C object esp-idf/esp_https_ota/CMakeFiles/__idf_esp_https_ota.dir/src/esp_https_ota.c.obj +[20/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/system_layer/esp_psram.c.obj +[21/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_parse.c.obj +[22/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ssl.c.obj +[23/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/xip_impl/mmu_psram_flash.c.obj +[24/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali.c.obj +[25/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp_adc_cal_common_legacy.c.obj +[26/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali_curve_fitting.c.obj +[27/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/esp32s3/curve_fitting_coefficients.c.obj +[28/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/esp32s3/esp_psram_impl_octal.c.obj +[29/1343] Linking C static library esp-idf/esp_https_ota/libesp_https_ota.a +[30/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp32s3/esp_adc_cal_legacy.c.obj +[31/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_common.c.obj +[32/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/gdma/adc_dma.c.obj +[33/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_monitor.c.obj +[34/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp-tls-crypto/esp_tls_crypto.c.obj +[35/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_oneshot.c.obj +[36/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_platform_port.c.obj +[37/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ws.c.obj +[38/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_filter.c.obj +[39/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_error_capture.c.obj +[40/1343] Linking C static library esp-idf/esp_http_server/libesp_http_server.a +[41/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_continuous.c.obj +[42/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/esp_http_client.c.obj +[43/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_dma_legacy.c.obj +[44/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_legacy.c.obj +[45/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/sigma_delta_legacy.c.obj +[46/1343] Linking C static library esp-idf/esp_http_client/libesp_http_client.a +[47/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rtc_temperature_legacy.c.obj +[48/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/touch_sensor_common.c.obj +[49/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls.c.obj +[50/1343] Linking C static library esp-idf/tcp_transport/libtcp_transport.a +[51/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/pcnt_legacy.c.obj +[52/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_mbedtls.c.obj +[53/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/timer_legacy.c.obj +[54/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai.c.obj +[55/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/esp32s3/touch_sensor.c.obj +[56/1343] Building C object esp-idf/http_parser/CMakeFiles/__idf_http_parser.dir/http_parser.c.obj +[57/1343] Linking C static library esp-idf/esp_psram/libesp_psram.a +[58/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/i2s_legacy.c.obj +[59/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/twai/twai.c.obj +[60/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai_onchip.c.obj +[61/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_common.c.obj +[62/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/i2c/i2c.c.obj +[63/1343] Building C object esp-idf/esp_driver_sdm/CMakeFiles/__idf_esp_driver_sdm.dir/src/sdm.c.obj +[64/1343] Building C object esp-idf/esp_driver_tsens/CMakeFiles/__idf_esp_driver_tsens.dir/src/temperature_sensor.c.obj +[65/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder.c.obj +[66/1343] Linking C static library esp-idf/esp_adc/libesp_adc.a +[67/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rmt_legacy.c.obj +[68/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_bytes.c.obj +[69/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_crc.c.obj +[70/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_common.c.obj +[71/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_slave.c.obj +[72/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/mcpwm_legacy.c.obj +[73/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_copy.c.obj +[74/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_simple.c.obj +[75/1343] Linking C static library esp-idf/esp-tls/libesp-tls.a +[76/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_master.c.obj +[77/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_transaction.c.obj +[78/1343] Building C object esp-idf/esp_driver_ledc/CMakeFiles/__idf_esp_driver_ledc.dir/src/ledc.c.obj +[79/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_rx.c.obj +[80/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_host.c.obj +[81/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_init.c.obj +[82/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_mmc.c.obj +[83/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_transaction.c.obj +[84/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_common.c.obj +[85/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sd_pwr_ctrl/sd_pwr_ctrl.c.obj +[86/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_io.c.obj +[87/1343] Linking C static library esp-idf/http_parser/libhttp_parser.a +[88/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_cmd.c.obj +[89/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_tx.c.obj +[90/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_sd.c.obj +[91/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_host.c.obj +[92/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_platform.c.obj +[93/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_std.c.obj +[94/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cmpr.c.obj +[95/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_com.c.obj +[96/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_tdm.c.obj +[97/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_fault.c.obj +[98/1343] Linking C static library esp-idf/driver/libdriver.a +[99/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_common.c.obj +[100/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_pdm.c.obj +[101/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub-entry.S.obj +[102/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/xt_debugexception.S.obj +[103/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cap.c.obj +[104/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_gen.c.obj +[105/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_sync.c.obj +[106/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_oper.c.obj +[107/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/packet.c.obj +[108/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub_transport.c.obj +[109/1343] Linking C static library esp-idf/esp_driver_twai/libesp_driver_twai.a +[110/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub_xtensa.c.obj +[111/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_timer.c.obj +[112/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub.c.obj +[113/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/lib_printf.c.obj +[114/1343] Linking C static library esp-idf/esp_driver_ledc/libesp_driver_ledc.a +[115/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/mesh_event.c.obj +[116/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default_ap.c.obj +[117/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig.c.obj +[118/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_init.c.obj +[119/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_netif.c.obj +[120/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_common.c.obj +[121/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/regulatory/esp_wifi_regulatory.c.obj +[122/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug_diagram.c.obj +[123/1343] Building C object esp-idf/esp_driver_pcnt/CMakeFiles/__idf_esp_driver_pcnt.dir/src/pulse_cnt.c.obj +[124/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default.c.obj +[125/1343] Linking C static library esp-idf/esp_driver_i2c/libesp_driver_i2c.a +[126/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave.c.obj +[127/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug.c.obj +[128/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave_hd.c.obj +[129/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/esp32s3/esp_adapter.c.obj +[130/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig_ack.c.obj +[131/1343] Linking C static library esp-idf/esp_driver_sdm/libesp_driver_sdm.a +[132/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/esp32s3/esp_coex_adapter.c.obj +[133/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_master.c.obj +[134/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/os_xtensa.c.obj +[135/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ap_config.c.obj +[136/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/pmksa_cache_auth.c.obj +[137/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_1x.c.obj +[138/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth_ie.c.obj +[139/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/comeback_token.c.obj +[140/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/sta_info.c.obj +[141/1343] Linking C static library esp-idf/esp_driver_tsens/libesp_driver_tsens.a +[142/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/dragonfly.c.obj +[143/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/eloop.c.obj +[144/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_11.c.obj +[145/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/bitfield.c.obj +[146/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/wpa_common.c.obj +[147/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-siv.c.obj +[148/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-kdf.c.obj +[149/1343] Linking C static library esp-idf/esp_driver_rmt/libesp_driver_rmt.a +[150/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/crypto_ops.c.obj +[151/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth.c.obj +[152/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ccmp.c.obj +[153/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_group5.c.obj +[154/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-gcm.c.obj +[155/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_groups.c.obj +[156/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-tlsprf.c.obj +[157/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ms_funcs.c.obj +[158/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tlsprf.c.obj +[159/1343] Linking C static library esp-idf/esp_driver_sdspi/libesp_driver_sdspi.a +[160/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-tlsprf.c.obj +[161/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae.c.obj +[162/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-prf.c.obj +[163/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-prf.c.obj +[164/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-prf.c.obj +[165/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/md4-internal.c.obj +[166/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_common/eap_wsc_common.c.obj +[167/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tprf.c.obj +[168/1343] Linking C static library esp-idf/esp_driver_sdmmc/libesp_driver_sdmmc.a +[169/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/chap.c.obj +[170/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/ieee802_11_common.c.obj +[171/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_common.c.obj +[172/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap_common.c.obj +[173/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls.c.obj +[174/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/mschapv2.c.obj +[175/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap.c.obj +[176/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_mschapv2.c.obj +[177/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls_common.c.obj +[178/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_common.c.obj +[179/1343] Linking C static library esp-idf/sdmmc/libsdmmc.a +[180/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap.c.obj +[181/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/pmksa_cache.c.obj +[182/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_ttls.c.obj +[183/1343] Linking C static library esp-idf/esp_driver_i2s/libesp_driver_i2s.a +[184/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/uuid.c.obj +[185/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/base64.c.obj +[186/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpa_debug.c.obj +[187/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_pac.c.obj +[188/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/ext_password.c.obj +[189/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa_ie.c.obj +[190/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpabuf.c.obj +[191/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast.c.obj +[192/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/json.c.obj +[193/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/common.c.obj +[194/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps.c.obj +[195/1343] Linking C static library esp-idf/esp_driver_mcpwm/libesp_driver_mcpwm.a +[196/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa2_api_port.c.obj +[197/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_build.c.obj +[198/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_process.c.obj +[199/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_parse.c.obj +[200/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa.c.obj +[201/1343] Linking C static library esp-idf/esp_driver_pcnt/libesp_driver_pcnt.a +[202/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_common.c.obj +[203/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_dev_attr.c.obj +[204/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae_pk.c.obj +[205/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpas_glue.c.obj +[206/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa_main.c.obj +[207/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_common.c.obj +[208/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_owe.c.obj +[209/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_enrollee.c.obj +[210/1343] Linking C static library esp-idf/esp_gdbstub/libesp_gdbstub.a +[211/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa3.c.obj +[212/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpsk.c.obj +[213/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_eap_client.c.obj +[214/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_hostap.c.obj +[215/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls.c.obj +[216/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wps.c.obj +[217/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/tls_mbedtls.c.obj +[218/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/rc4.c.obj +[219/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-bignum.c.obj +[220/1343] Linking C static library esp-idf/esp_driver_spi/libesp_driver_spi.a +[221/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpbkdf2.c.obj +[222/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_defaults.c.obj +[223/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-wrap.c.obj +[224/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/des-internal.c.obj +[225/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-unwrap.c.obj +[226/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_objects.c.obj +[227/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-rsa.c.obj +[228/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_handlers.c.obj +[229/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-ccm.c.obj +[230/1343] Linking C static library esp-idf/esp_wifi/libesp_wifi.a +[231/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-ec.c.obj +[232/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_sntp.c.obj +[233/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip_defaults.c.obj +[234/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/wlanif.c.obj +[235/1343] Linking C static library esp-idf/esp_coex/libesp_coex.a +[236/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/ethernetif.c.obj +[237/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/esp_pbuf_ref.c.obj +[238/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/err.c.obj +[239/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/sntp/sntp.c.obj +[240/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netbuf.c.obj +[241/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/if_api.c.obj +[242/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netifapi.c.obj +[243/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_lib.c.obj +[244/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netdb.c.obj +[245/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/tcpip.c.obj +[246/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_msg.c.obj +[247/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/def.c.obj +[248/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/sntp/sntp.c.obj +[249/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/mem.c.obj +[250/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/init.c.obj +[251/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ip.c.obj +[252/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/memp.c.obj +[253/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/netbiosns/netbiosns.c.obj +[254/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/inet_chksum.c.obj +[255/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip.c.obj +[256/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/dns.c.obj +[257/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/pbuf.c.obj +[258/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/netif.c.obj +[259/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/sys.c.obj +[260/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/raw.c.obj +[261/1343] Linking C static library esp-idf/wpa_supplicant/libwpa_supplicant.a +[262/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/stats.c.obj +[263/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/autoip.c.obj +[264/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/timeouts.c.obj +[265/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/sockets.c.obj +[266/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/udp.c.obj +[267/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/dhcp6.c.obj +[268/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/etharp.c.obj +[269/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/icmp.c.obj +[270/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_out.c.obj +[271/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_frag.c.obj +[272/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4.c.obj +[273/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_addr.c.obj +[274/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ethip6.c.obj +[275/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_in.c.obj +[276/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/igmp.c.obj +[277/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp.c.obj +[278/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_napt.c.obj +[279/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/icmp6.c.obj +[280/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/dhcp.c.obj +[281/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/inet6.c.obj +[282/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_addr.c.obj +[283/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_frag.c.obj +[284/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ethernet.c.obj +[285/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif.c.obj +[286/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/mld6.c.obj +[287/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ccp.c.obj +[288/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/auth.c.obj +[289/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif_fdb.c.obj +[290/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap_ms.c.obj +[291/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-new.c.obj +[292/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-md5.c.obj +[293/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/demand.c.obj +[294/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/slipif.c.obj +[295/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eap.c.obj +[296/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6.c.obj +[297/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ecp.c.obj +[298/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eui64.c.obj +[299/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/fsm.c.obj +[300/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipcp.c.obj +[301/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/lcp.c.obj +[302/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/magic.c.obj +[303/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipv6cp.c.obj +[304/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/multilink.c.obj +[305/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/mppe.c.obj +[306/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ppp.c.obj +[307/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppapi.c.obj +[308/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppcrypt.c.obj +[309/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/nd6.c.obj +[310/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppoe.c.obj +[311/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppol2tp.c.obj +[312/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppos.c.obj +[313/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/upap.c.obj +[314/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/utils.c.obj +[315/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/vj.c.obj +[316/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/tcp_isn_default.c.obj +[317/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/lwip_default_hooks.c.obj +[318/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/if_index.c.obj +[319/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/sockets_ext.c.obj +[320/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/debug/lwip_debug.c.obj +[321/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/esp_ping.c.obj +[322/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/esp32xx/vfs_lwip.c.obj +[323/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/des.c.obj +[324/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md5.c.obj +[325/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/acd_dhcp_check.c.obj +[326/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/freertos/sys_arch.c.obj +[327/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping.c.obj +[328/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md4.c.obj +[329/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/sha1.c.obj +[330/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/arc4.c.obj +[331/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping_sock.c.obj +[332/1343] Linking C static library esp-idf/esp_netif/libesp_netif.a +[333/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/dhcpserver/dhcpserver.c.obj +[334/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/esp32s3/phy_init_data.c.obj +[335/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/lib_printf.c.obj +[336/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_common.c.obj +[337/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_connection_monitor.c.obj +[338/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/btbb_init.c.obj +[339/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_override.c.obj +[340/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag.c.obj +[341/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_eventfd.c.obj +[342/1343] Building C object esp-idf/esp_vfs_console/CMakeFiles/__idf_esp_vfs_console.dir/vfs_console.c.obj +[343/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/nullfs.c.obj +[344/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_init.c.obj +[345/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_vfs.c.obj +[346/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_semihost.c.obj +[347/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs.c.obj +[348/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_platform.cpp.obj +[349/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader.c.obj +[350/1343] Linking C static library esp-idf/lwip/liblwip.a +[351/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_aes.c.obj +[352/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition.cpp.obj +[353/1343] Linking C static library esp-idf/vfs/libvfs.a +[354/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_lookup.cpp.obj +[355/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_xts_aes.c.obj +[356/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/default_event_loop.c.obj +[357/1343] Linking C static library esp-idf/esp_vfs_console/libesp_vfs_console.a +[358/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event_private.c.obj +[359/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_wakeup.c.obj +[360/1343] Linking C static library esp-idf/esp_driver_usb_serial_jtag/libesp_driver_usb_serial_jtag.a +[361/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event.c.obj +[362/1343] Linking C static library esp-idf/esp_phy/libesp_phy.a +[363/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uhci.c.obj +[364/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_vfs.c.obj +[365/1343] Building C object esp-idf/esp_ringbuf/CMakeFiles/__idf_esp_ringbuf.dir/ringbuf.c.obj +[366/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer_common.c.obj +[367/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_init.c.obj +[368/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer.c.obj +[369/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart.c.obj +[370/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer.c.obj +[371/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/system_time.c.obj +[372/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/ets_timer_legacy.c.obj +[373/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_common.c.obj +[374/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_systimer.c.obj +[375/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_exception_stubs.cpp.obj +[376/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_init.cpp.obj +[377/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread.c.obj +[378/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_cond_var.c.obj +[379/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_local_storage.c.obj +[380/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_rwlock.c.obj +[381/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/init.c.obj +[382/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/abort.c.obj +[383/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_semaphore.c.obj +[384/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/assert.c.obj +[385/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_guards.cpp.obj +[386/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/heap.c.obj +[387/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/poll.c.obj +[388/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_locked.cpp.obj +[389/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_item_hash_list.cpp.obj +[390/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/locks.c.obj +[391/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/random.c.obj +[392/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/pthread.c.obj +[393/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_cxx_api.cpp.obj +[394/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_encrypted_partition.cpp.obj +[395/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/getentropy.c.obj +[396/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/termios.c.obj +[397/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_pagemanager.cpp.obj +[398/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_manager.cpp.obj +[399/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_simple.cpp.obj +[400/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/sysconf.c.obj +[401/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/scandir.c.obj +[402/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/realpath.c.obj +[403/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/syscalls.c.obj +[404/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/flockfile.c.obj +[405/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_types.cpp.obj +[406/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_init.c.obj +[407/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/esp_time_impl.c.obj +[408/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/time.c.obj +[409/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_page.cpp.obj +[410/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/newlib_init.c.obj +[411/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_syscalls.c.obj +[412/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_storage.cpp.obj +[413/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/heap_idf.c.obj +[414/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_api.cpp.obj +[415/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/xtensa/stdatomic_s32c1i.c.obj +[416/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/list.c.obj +[417/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/app_startup.c.obj +[418/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_common.c.obj +[419/1343] Building ASM object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/portasm.S.obj +[420/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_init.c.obj +[421/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_systick.c.obj +[422/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/event_groups.c.obj +[423/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/stdatomic.c.obj +[424/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_overlay_os_hook.c.obj +[425/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/timers.c.obj +[426/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/stream_buffer.c.obj +[427/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/queue.c.obj +[428/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/freertos_compatibility.c.obj +[429/1343] Linking C static library esp-idf/nvs_flash/libnvs_flash.a +[430/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[431/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/port.c.obj +[432/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions_event_groups.c.obj +[433/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[434/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[435/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[436/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions.c.obj +[437/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/hw_random.c.obj +[438/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/revision.c.obj +[439/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_gpio_reserve.c.obj +[440/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_ctrl_os.c.obj +[441/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clk.c.obj +[442/1343] Linking C static library esp-idf/esp_event/libesp_event.a +[443/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mac_addr.c.obj +[444/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/regi2c_ctrl.c.obj +[445/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_clk_tree.c.obj +[446/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/io_mux.c.obj +[447/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/periph_ctrl.c.obj +[448/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/rtc_module.c.obj +[449/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sar_periph_ctrl_common.c.obj +[450/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/intr_alloc.c.obj +[451/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_dma_utils.c.obj +[452/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_utils.c.obj +[453/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_clk_tree_common.c.obj +[454/1343] Linking C static library esp-idf/esp_driver_uart/libesp_driver_uart.a +[455/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_mspi.c.obj +[456/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma_link.c.obj +[457/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_usb.c.obj +[458/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_share_hw_ctrl.c.obj +[459/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_bus_lock.c.obj +[460/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modem.c.obj +[461/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj +[462/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_console.c.obj +[463/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/adc_share_hw_ctrl.c.obj +[464/1343] Linking C static library esp-idf/esp_ringbuf/libesp_ringbuf.a +[465/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_async_memcpy.c.obj +[466/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/systimer.c.obj +[467/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_event.c.obj +[468/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_gpio.c.obj +[469/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/deprecated/gdma_legacy.c.obj +[470/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/mspi_timing_tuning.c.obj +[471/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_wake_stub.c.obj +[472/1343] Linking C static library esp-idf/esp_driver_gptimer/libesp_driver_gptimer.a +[473/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[474/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clock_output.c.obj +[475/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[476/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/async_memcpy_gdma.c.obj +[477/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/power_supply/brownout.c.obj +[478/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[479/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_memprot_conv.c.obj +[480/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[481/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/sar_periph_ctrl.c.obj +[482/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[483/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma.c.obj +[484/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_config.c.obj +[485/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[486/1343] Linking C static library esp-idf/esp_timer/libesp_timer.a +[487/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_lock.c.obj +[488/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modes.c.obj +[489/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[490/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/init.c.obj +[491/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[492/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[493/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[494/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[495/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_hmac.c.obj +[496/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_periph_clk.c.obj +[497/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[498/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[499/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_by_mspi_delay.c.obj +[500/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_ds.c.obj +[501/1343] Linking C static library esp-idf/cxx/libcxx.a +[502/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[503/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/lowpower/port/esp32s3/sleep_cpu.c.obj +[504/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[505/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[506/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[507/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[508/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[509/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[510/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[511/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[512/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[513/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[514/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[515/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[516/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[517/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[518/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[519/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[520/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[521/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[522/1343] Linking C static library esp-idf/pthread/libpthread.a +[523/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[524/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[525/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[526/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/esp32s3/memory_layout.c.obj +[527/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/memory_layout_utils.c.obj +[528/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_base.c.obj +[529/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[530/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/util.c.obj +[531/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[532/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_lock.c.obj +[533/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[534/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_memprot.c.obj +[535/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_timestamp.c.obj +[536/1343] Linking C static library esp-idf/newlib/libnewlib.a +[537/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_init.c.obj +[538/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/multi_heap.c.obj +[539/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[540/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/tag_log_level.c.obj +[541/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_write.c.obj +[542/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/log_level.c.obj +[543/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[544/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps.c.obj +[545/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/linked_list/log_linked_list.c.obj +[546/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[547/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/cache/log_binary_heap.c.obj +[548/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[549/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[550/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[551/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/color_hal.c.obj +[552/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[553/1343] Linking C static library esp-idf/freertos/libfreertos.a +[554/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_encrypt_hal_iram.c.obj +[555/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gpio_hal.c.obj +[556/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal_iram.c.obj +[557/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[558/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/timer_hal.c.obj +[559/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal.c.obj +[560/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rtc_io_hal.c.obj +[561/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/clk_tree_hal.c.obj +[562/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/systimer_hal.c.obj +[563/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal.c.obj +[564/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal.c.obj +[565/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal_iram.c.obj +[566/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_iram.c.obj +[567/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal.c.obj +[568/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/pcnt_hal.c.obj +[569/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rmt_hal.c.obj +[570/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal_iram.c.obj +[571/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uhci_hal.c.obj +[572/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdm_hal.c.obj +[573/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_top.c.obj +[574/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mcpwm_hal.c.obj +[575/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdmmc_hal.c.obj +[576/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_ahb_v1.c.obj +[577/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/tlsf/tlsf.c.obj +[578/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal_common.c.obj +[579/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/twai_hal_v1.c.obj +[580/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/lcd_hal.c.obj +[581/1343] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[582/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2s_hal.c.obj +[583/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_oneshot_hal.c.obj +[584/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sha_hal.c.obj +[585/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpi_hal.c.obj +[586/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal.c.obj +[587/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/aes_hal.c.obj +[588/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/brownout_hal.c.obj +[589/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal.c.obj +[590/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal.c.obj +[591/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal_iram.c.obj +[592/1343] Linking C static library esp-idf/esp_security/libesp_security.a +[593/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hd_hal.c.obj +[594/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal_iram.c.obj +[595/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ds_hal.c.obj +[596/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_serial_jtag_hal.c.obj +[597/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hmac_hal.c.obj +[598/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_wrap_hal.c.obj +[599/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_gpspi.c.obj +[600/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cam_hal.c.obj +[601/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sens_hal.c.obj +[602/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sensor_hal.c.obj +[603/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/xt_wdt_hal.c.obj +[604/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[605/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/touch_sensor_hal.c.obj +[606/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[607/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/rtc_cntl_hal.c.obj +[608/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[609/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[610/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[611/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_dwc_hal.c.obj +[612/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[613/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[614/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[615/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[616/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[617/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[618/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[619/1343] Linking C static library esp-idf/soc/libsoc.a +[620/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[621/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/crosscore_int.c.obj +[622/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system_console.c.obj +[623/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_ipc.c.obj +[624/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/stack_check.c.obj +[625/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system.c.obj +[626/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup.c.obj +[627/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/freertos_hooks.c.obj +[628/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/system_time.c.obj +[629/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/ubsan.c.obj +[630/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/int_wdt.c.obj +[631/1343] Linking C static library esp-idf/heap/libheap.a +[632/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/panic.c.obj +[633/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/xt_wdt.c.obj +[634/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_routines.S.obj +[635/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup_funcs.c.obj +[636/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_handler.S.obj +[637/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_port.c.obj +[638/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/panic_handler.c.obj +[639/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_handler_asm.S.obj +[640/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_system_chip.c.obj +[641/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/image_process.c.obj +[642/1343] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[643/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack_asm.S.obj +[644/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_ipc_isr.c.obj +[645/1343] Linking C static library esp-idf/log/liblog.a +[646/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers_asm.S.obj +[647/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt.c.obj +[648/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_arch.c.obj +[649/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt_impl_timergroup.c.obj +[650/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack.c.obj +[651/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/highint_hdl.S.obj +[652/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_stubs.c.obj +[653/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/cpu_start.c.obj +[654/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers.c.obj +[655/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/trax.c.obj +[656/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_brownout_hook.c.obj +[657/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/reset_reason.c.obj +[658/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_drivers.c.obj +[659/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/apb_backup_dma.c.obj +[660/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_hpm_enable.c.obj +[661/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/cache_err_int.c.obj +[662/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/system_internal.c.obj +[663/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp32s3/spi_flash_oct_flash_init.c.obj +[664/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_issi.c.obj +[665/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_boya.c.obj +[666/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic.c.obj +[667/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_th.c.obj +[668/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_gd.c.obj +[669/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_winbond.c.obj +[670/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/clk.c.obj +[671/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic_opi.c.obj +[672/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/memspi_host_driver.c.obj +[673/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_generic.c.obj +[674/1343] Linking C static library esp-idf/hal/libhal.a +[675/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[676/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_noos.c.obj +[677/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/port/esp32s3/ext_mem_layout.c.obj +[678/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_mmap.c.obj +[679/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/heap_align_hw.c.obj +[680/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/cache_utils.c.obj +[681/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_ops.c.obj +[682/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_utils.c.obj +[683/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_app.c.obj +[684/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_msync.c.obj +[685/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[686/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[687/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[688/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_spi_init.c.obj +[689/1343] Linking C static library esp-idf/esp_rom/libesp_rom.a +[690/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_mmu_map.c.obj +[691/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[692/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[693/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[694/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[695/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_api.c.obj +[696/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[697/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[698/1343] Linking C static library esp-idf/esp_common/libesp_common.a +[699/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[700/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[701/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[702/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/secure_boot_secure_features.c.obj +[703/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[704/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[705/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[706/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[707/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[708/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[709/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[710/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[711/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[712/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[713/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_startup.c.obj +[714/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_app_desc.c.obj +[715/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[716/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/debug.c.obj +[717/1343] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[718/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[719/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition_target.c.obj +[720/1343] Building C object esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj +[721/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_reader.c.obj +[722/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_trace.c.obj +[723/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition.c.obj +[724/1343] Linking C static library esp-idf/esp_system/libesp_system.a +[725/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_keys.c.obj +[726/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cache.c.obj +[727/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_client.c.obj +[728/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_generic.c.obj +[729/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_server.c.obj +[730/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ciphersuites.c.obj +[731/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cookie.c.obj +[732/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj +[733/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_debug_helpers_generated.c.obj +[734/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ticket.c.obj +[735/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_client.c.obj +[736/1343] Linking C static library esp-idf/spi_flash/libspi_flash.a +[737/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_platform_time.c.obj +[738/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/mbedtls_debug.c.obj +[739/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_create.c.obj +[740/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_msg.c.obj +[741/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_client.c.obj +[742/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_server.c.obj +[743/1343] Linking C static library esp-idf/esp_mm/libesp_mm.a +[744/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_csr.c.obj +[745/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/pkcs7.c.obj +[746/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crl.c.obj +[747/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write.c.obj +[748/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/net_sockets.c.obj +[749/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_csr.c.obj +[750/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_crt.c.obj +[751/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesni.c.obj +[752/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aes.c.obj +[753/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesce.c.obj +[754/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509.c.obj +[755/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod.c.obj +[756/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1parse.c.obj +[757/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod_raw.c.obj +[758/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/camellia.c.obj +[759/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/base64.c.obj +[760/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1write.c.obj +[761/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/block_cipher.c.obj +[762/1343] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[763/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chacha20.c.obj +[764/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aria.c.obj +[765/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chachapoly.c.obj +[766/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls.c.obj +[767/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_core.c.obj +[768/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ccm.c.obj +[769/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crt.c.obj +[770/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/des.c.obj +[771/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/dhm.c.obj +[772/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/constant_time.c.obj +[773/1343] Linking C static library esp-idf/efuse/libefuse.a +[774/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecjpake.c.obj +[775/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdh.c.obj +[776/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher_wrap.c.obj +[777/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher.c.obj +[778/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum.c.obj +[779/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cmac.c.obj +[780/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves_new.c.obj +[781/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ctr_drbg.c.obj +[782/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdsa.c.obj +[783/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy_poll.c.obj +[784/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hkdf.c.obj +[785/1343] Linking C static library esp-idf/esp_partition/libesp_partition.a +[786/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy.c.obj +[787/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/memory_buffer_alloc.c.obj +[788/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/nist_kw.c.obj +[789/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/error.c.obj +[790/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves.c.obj +[791/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lmots.c.obj +[792/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md5.c.obj +[793/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/padlock.c.obj +[794/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/gcm.c.obj +[795/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hmac_drbg.c.obj +[796/1343] Linking C static library esp-idf/app_update/libapp_update.a +[797/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lms.c.obj +[798/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp.c.obj +[799/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md.c.obj +[800/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_ecc.c.obj +[801/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pem.c.obj +[802/1343] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[803/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/oid.c.obj +[804/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/poly1305.c.obj +[805/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform.c.obj +[806/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs5.c.obj +[807/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs12.c.obj +[808/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform_util.c.obj +[809/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_wrap.c.obj +[810/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk.c.obj +[811/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkwrite.c.obj +[812/1343] Linking C static library esp-idf/esp_app_format/libesp_app_format.a +[813/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_aead.c.obj +[814/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_client.c.obj +[815/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkparse.c.obj +[816/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_cipher.c.obj +[817/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_driver_wrappers_no_static.c.obj +[818/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ffdh.c.obj +[819/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_se.c.obj +[820/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_pake.c.obj +[821/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ecp.c.obj +[822/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_hash.c.obj +[823/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_mac.c.obj +[824/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_rsa.c.obj +[825/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ripemd160.c.obj +[826/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_its_file.c.obj +[827/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedtls.a +[828/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_storage.c.obj +[829/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_util.c.obj +[830/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_slot_management.c.obj +[831/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha256.c.obj +[832/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha3.c.obj +[833/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa_alt_helpers.c.obj +[834/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/threading.c.obj +[835/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha1.c.obj +[836/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/timing.c.obj +[837/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha512.c.obj +[838/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version.c.obj +[839/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version_features.c.obj +[840/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha_gdma_impl.c.obj +[841/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_gdma_impl.c.obj +[842/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_mem.c.obj +[843/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hardware.c.obj +[844/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_timing.c.obj +[845/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_xts.c.obj +[846/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_common.c.obj +[847/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c.obj +[848/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_dma_core.c.obj +[849/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/esp_sha.c.obj +[850/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes.c.obj +[851/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hmac_pbkdf2.c.obj +[852/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/bignum_alt.c.obj +[853/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/sha.c.obj +[854/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c.obj +[855/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa.c.obj +[856/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c.obj +[857/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_ds_common.c.obj +[858/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/esp_bignum.c.obj +[859/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha256.c.obj +[860/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha1.c.obj +[861/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/md/esp_md.c.obj +[862/1343] Creating directories for 'bootloader' +[863/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedx509.a +[864/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha512.c.obj +[865/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m/p256-m.c.obj +[866/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/everest.c.obj +[867/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/x25519.c.obj +[868/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m_driver_entrypoints.c.obj +[869/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/Hacl_Curve25519_joined.c.obj +[870/1343] No download step for 'bootloader' +[871/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_gcm.c.obj +[872/1343] No update step for 'bootloader' +[873/1343] No patch step for 'bootloader' +[874/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto.c.obj +[875/1343] Minifying + gzipping web resources +Minifying web resources in /tmp/tianshan-xterm-build/build/esp-idf/ts_webui/web_optimized... + JS js/terminal.js: 31,120 -> 20,078 (35.5% saved) + JS js/router.js: 6,414 -> 3,839 (40.1% saved) + JS js/dragSort.js: 11,460 -> 7,603 (33.7% saved) + JS js/api.js: 36,638 -> 24,339 (33.6% saved) + JS js/i18n.js: 7,208 -> 4,320 (40.1% saved) + JS js/app.js: 1,129,944 -> 840,829 (25.6% saved) + JS js/lang/en-US.js: 178,439 -> 143,161 (19.8% saved) + JS js/lang/zh-CN.js: 172,046 -> 137,314 (20.2% saved) + CSS css/style.css: 179,071 -> 129,275 (27.8% saved) + CSS fonts/remixicon.css: 5,940 -> 4,860 (18.2% saved) + + Total saved: 442,662 bytes (432.3 KB) + +Gzipping web resources in /tmp/tianshan-xterm-build/build/esp-idf/ts_webui/web_optimized... + GZ js/terminal.js: 20,078 -> 5,569 (72.3% smaller) + GZ js/router.js: 3,839 -> 1,340 (65.1% smaller) + GZ js/dragSort.js: 7,603 -> 1,869 (75.4% smaller) + GZ js/api.js: 24,339 -> 6,163 (74.7% smaller) + GZ js/i18n.js: 4,320 -> 1,460 (66.2% smaller) + GZ js/app.js: 840,829 -> 167,747 (80.0% smaller) + GZ js/lang/en-US.js: 143,161 -> 43,017 (70.0% smaller) + GZ js/lang/zh-CN.js: 137,314 -> 45,286 (67.0% smaller) + GZ vendor/xterm/xterm-addon-fit.min.js: 1,789 -> 834 (53.4% smaller) + GZ vendor/xterm/xterm.min.js: 283,670 -> 65,684 (76.8% smaller) + GZ css/style.css: 129,275 -> 20,658 (84.0% smaller) + GZ fonts/remixicon.css: 4,860 -> 1,263 (74.0% smaller) + GZ vendor/xterm/xterm.css: 5,383 -> 2,037 (62.2% smaller) + GZ index.html: 26,676 -> 7,261 (72.8% smaller) + + Gzipped 14 files: 1,633,136 -> 370,188 (77.3% overall) +Done. +[876/1343] cd /tmp/tianshan-xterm-build/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-xterm-build/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-xterm-build/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +FAILED: esp-idf/ts_webui/CMakeFiles/spiffs_www_bin /tmp/tianshan-xterm-build/build/esp-idf/ts_webui/CMakeFiles/spiffs_www_bin +cd /tmp/tianshan-xterm-build/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-xterm-build/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-xterm-build/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +Traceback (most recent call last): + File "/Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py", line 590, in + main() + File "/Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py", line 582, in main + spiffs.create_file('/' + os.path.relpath(full_path, args.base_dir).replace('\\', '/'), full_path) + File "/Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py", line 407, in create_file + raise RuntimeError("object name '%s' too long" % img_path) +RuntimeError: object name '/vendor/xterm/LICENSE-xterm-addon-fit' too long +[877/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +[878/1343] Performing configure step for 'bootloader' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-xterm-build/sdkconfig +-- Compiler supported targets: xtensa-esp-elf +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Bootloader project name: "bootloader" version: 1 +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.rom.ld +-- Components: bootloader bootloader_support efuse esp_app_format esp_bootloader_format esp_common esp_hw_support esp_rom esp_security esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/components/micro-ecc /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld +-- Configuring done (2.1s) +-- Generating done (0.0s) +-- Build files have been written to: /tmp/tianshan-xterm-build/build/bootloader +ninja: build stopped: subcommand failed. +ninja failed with exit code 1, output of the command is in the /private/tmp/tianshan-xterm-build/build/log/idf_py_stderr_output_13331 and /private/tmp/tianshan-xterm-build/build/log/idf_py_stdout_output_13331 diff --git a/docs/repair/xterm-local/j1.txt b/docs/repair/xterm-local/j1.txt new file mode 100644 index 0000000..c36da18 --- /dev/null +++ b/docs/repair/xterm-local/j1.txt @@ -0,0 +1,10 @@ +✔ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (15.891666ms) +✔ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (5.348708ms) +ℹ tests 2 +ℹ suites 0 +ℹ pass 2 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 62.898625 diff --git a/docs/repair/xterm-local/node.txt b/docs/repair/xterm-local/node.txt new file mode 100644 index 0000000..91c5130 --- /dev/null +++ b/docs/repair/xterm-local/node.txt @@ -0,0 +1,53 @@ + +> test +> cd ../.. && node --test tests/prompts/static.test.cjs tests/prompts/regression.test.cjs + +✔ zh-CN: actual inline translator, cold language, missing/objects/parameters and confirmations (15.730084ms) +✔ zh-CN: REST business failure remains returned; strict operation rejects with original metadata (6.203792ms) +✔ zh-CN: timeout covers response body; result stays unknown for POST (8.026375ms) +✔ zh-CN: toast timer replacement, priority, safe multiline text (5.502125ms) +✔ zh-CN: actual mutations do not report success or close dialogs on business failures (5.626625ms) +✔ zh-CN: batch deletion all / partial / no success with business errors (4.978959ms) +✔ zh-CN: downloads propagate actual initiation failures and retain batch details (5.521042ms) +✔ zh-CN: file names are text; upload/verification/apply remain separate (5.504667ms) +✔ zh-CN: SSH actual event handler honors terminal states and diagnoses conflicts (4.7525ms) +✔ zh-CN: background command timeout is unconfirmed and never resubmitted (5.7085ms) +✔ zh-CN: terminal restoration waits for acknowledgement; timeout/failure stay distinct (5.863333ms) +✔ zh-CN: ping results are reachability only; failed probe is unknown and no pulse replay (5.307125ms) +✔ zh-CN: websocket label matches color across language changes and power warnings persist (4.848666ms) +✔ en-US: actual inline translator, cold language, missing/objects/parameters and confirmations (4.982166ms) +✔ en-US: REST business failure remains returned; strict operation rejects with original metadata (4.595125ms) +✔ en-US: timeout covers response body; result stays unknown for POST (6.167833ms) +✔ en-US: toast timer replacement, priority, safe multiline text (5.60625ms) +✔ en-US: actual mutations do not report success or close dialogs on business failures (5.592667ms) +✔ en-US: batch deletion all / partial / no success with business errors (5.326666ms) +✔ en-US: downloads propagate actual initiation failures and retain batch details (5.496708ms) +✔ en-US: file names are text; upload/verification/apply remain separate (5.433791ms) +✔ en-US: SSH actual event handler honors terminal states and diagnoses conflicts (7.831042ms) +✔ en-US: background command timeout is unconfirmed and never resubmitted (4.648625ms) +✔ en-US: terminal restoration waits for acknowledgement; timeout/failure stay distinct (4.474958ms) +✔ en-US: ping results are reachability only; failed probe is unknown and no pulse replay (4.458208ms) +✔ en-US: websocket label matches color across language changes and power warnings persist (4.239083ms) +✔ zh-CN: upload and download aggregates cover all success and all failure (4.610875ms) +✔ zh-CN: key deployment requires successful business code and distinguishes verification (5.354333ms) +✔ zh-CN: real LED/status renderers localize finite built-in identifiers (4.810584ms) +✔ en-US: upload and download aggregates cover all success and all failure (4.728291ms) +✔ en-US: key deployment requires successful business code and distinguishes verification (5.131292ms) +✔ en-US: real LED/status renderers localize finite built-in identifiers (4.838458ms) +✔ zh-CN: widget dynamic families render real labels and literal braces in names remain valid (4.638625ms) +✔ zh-CN: unknown stop result never escalates to forced termination (5.698834ms) +✔ en-US: widget dynamic families render real labels and literal braces in names remain valid (5.041667ms) +✔ en-US: unknown stop result never escalates to forced termination (4.4465ms) +✔ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (5.1135ms) +✔ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (4.793083ms) +Checked 3066 references including conditional and finite dynamic families. +✔ actual UI literal/conditional and finite dynamic keys exist in both languages with matching contracts (5.766583ms) +✔ production i18n is the inline entry; no second translator script is loaded (0.089625ms) +ℹ tests 40 +ℹ suites 0 +ℹ pass 40 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 257.469375 diff --git a/docs/repair/xterm-local/offline-optimized.txt b/docs/repair/xterm-local/offline-optimized.txt new file mode 100644 index 0000000..a37d3d3 --- /dev/null +++ b/docs/repair/xterm-local/offline-optimized.txt @@ -0,0 +1,10 @@ +✔ en-US: cold offline real xterm and terminal lifecycle (970.099166ms) +✔ zh-CN: cold offline real xterm and terminal lifecycle (740.278917ms) +ℹ tests 2 +ℹ suites 0 +ℹ pass 2 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 1901.623958 diff --git a/docs/repair/xterm-local/offline-source.txt b/docs/repair/xterm-local/offline-source.txt new file mode 100644 index 0000000..ae89954 --- /dev/null +++ b/docs/repair/xterm-local/offline-source.txt @@ -0,0 +1,16 @@ + +> test:xterm +> cd ../.. && node --test tests/prompts/xterm-vendor.test.cjs tests/prompts/xterm-offline.test.cjs + +✔ en-US: cold offline real xterm and terminal lifecycle (1299.692708ms) +✔ zh-CN: cold offline real xterm and terminal lifecycle (699.31225ms) +✔ fixed vendor integrity, skip minify, gzip identity, local loader only (37.585084ms) +✔ production lazy loader: same-origin cold load, shared promise and retry (1.7135ms) +ℹ tests 4 +ℹ suites 0 +ℹ pass 4 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 2172.317625 diff --git a/docs/repair/xterm-local/optimized/requests-en-US.json b/docs/repair/xterm-local/optimized/requests-en-US.json new file mode 100644 index 0000000..c1b0be1 --- /dev/null +++ b/docs/repair/xterm-local/optimized/requests-en-US.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/en-US.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/xterm-local/optimized/requests-zh-CN.json b/docs/repair/xterm-local/optimized/requests-zh-CN.json new file mode 100644 index 0000000..ef547b7 --- /dev/null +++ b/docs/repair/xterm-local/optimized/requests-zh-CN.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/xterm-local/path-limit.txt b/docs/repair/xterm-local/path-limit.txt new file mode 100644 index 0000000..f4afb4b --- /dev/null +++ b/docs/repair/xterm-local/path-limit.txt @@ -0,0 +1,10 @@ +Traceback (most recent call last): + File "/Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py", line 590, in + main() + ~~~~^^ + File "/Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py", line 582, in main + spiffs.create_file('/' + os.path.relpath(full_path, args.base_dir).replace('\\', '/'), full_path) + ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py", line 407, in create_file + raise RuntimeError("object name '%s' too long" % img_path) +RuntimeError: object name '/vendor/xterm/LICENSE-xterm-addon-fit' too long diff --git a/docs/repair/xterm-local/project-assets-check.txt b/docs/repair/xterm-local/project-assets-check.txt new file mode 100644 index 0000000..4c96e4a --- /dev/null +++ b/docs/repair/xterm-local/project-assets-check.txt @@ -0,0 +1 @@ +PASS optimized syntax, gzip identity, cache key, and byte-identical SPIFFS reconstruction diff --git a/docs/repair/xterm-local/publication-gate.md b/docs/repair/xterm-local/publication-gate.md new file mode 100644 index 0000000..969ed3e --- /dev/null +++ b/docs/repair/xterm-local/publication-gate.md @@ -0,0 +1,9 @@ +# 提交前独立核对 + +结论:可以推送。最终生产 diff 只改变本地资源来源、缓存标识、vendor 文件和跳过第三方 minify;无 CMake、后端、SSH/J1 状态机或工作流改动。短路径由用户确认,发行文件 SHA256 未变化。 + +正向核对 loader 同源 URL → vendor → 原字节优化副本 → gzip → SPIFFS → www.bin → flasher_args;反向核对最终镜像与独立重建字节一致、实际优化资源在全新 Chrome context 禁止全部外部 origin 时正常初始化与输入。匹配/非匹配分支分别有 vendor skip/项目资源 minify、首次/重复加载、故障/恢复证据。 + +本次源与优化 Chrome、Node、J1、v3 跨层、固定 SDK 构建、产物/发布配置检查见 README。核对 build-inputs.json 全部生产哈希一致,当前 diff --check 通过。没有以旧 CI 或旧构建代替本轮验证。 + +SDK/网络边界是模拟,真实 ESP 挂载、HTTP、浏览器、SSH 和缓存升级待实机验收;有限 SPIFFS 剩余空间不代表未来可无限添加资源。只提交明确文件,原未跟踪 output/、tmp/、runtime-repair 文件保持排除。不合并、不发布、不操作设备。 diff --git a/docs/repair/xterm-local/release-static.txt b/docs/repair/xterm-local/release-static.txt new file mode 100644 index 0000000..e76e6ef --- /dev/null +++ b/docs/repair/xterm-local/release-static.txt @@ -0,0 +1,5 @@ +... +---------------------------------------------------------------------- +Ran 3 tests in 0.003s + +OK diff --git a/docs/repair/xterm-local/requests-en-US.json b/docs/repair/xterm-local/requests-en-US.json new file mode 100644 index 0000000..c1b0be1 --- /dev/null +++ b/docs/repair/xterm-local/requests-en-US.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/en-US.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/xterm-local/requests-zh-CN.json b/docs/repair/xterm-local/requests-zh-CN.json new file mode 100644 index 0000000..ef547b7 --- /dev/null +++ b/docs/repair/xterm-local/requests-zh-CN.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/xterm-local/runtime-search.txt b/docs/repair/xterm-local/runtime-search.txt new file mode 100644 index 0000000..b5eeeca --- /dev/null +++ b/docs/repair/xterm-local/runtime-search.txt @@ -0,0 +1,2 @@ +components/ts_webui/web/vendor/xterm/xterm.min.js:3: * Original file: /npm/xterm@5.3.0/lib/xterm.js +components/ts_webui/web/vendor/xterm/fit.min.js:3: * Original file: /npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js diff --git a/docs/repair/xterm-local/vendor-test.txt b/docs/repair/xterm-local/vendor-test.txt new file mode 100644 index 0000000..2008df8 --- /dev/null +++ b/docs/repair/xterm-local/vendor-test.txt @@ -0,0 +1,10 @@ +✔ fixed vendor integrity, skip minify, gzip identity, local loader only (40.058417ms) +✔ production lazy loader: same-origin cold load, shared promise and retry (1.65575ms) +ℹ tests 2 +ℹ suites 0 +ℹ pass 2 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 85.629625 diff --git a/docs/repair/xterm-local/vendor.json b/docs/repair/xterm-local/vendor.json new file mode 100644 index 0000000..c011bba --- /dev/null +++ b/docs/repair/xterm-local/vendor.json @@ -0,0 +1,52 @@ +[ + { + "package": "xterm", + "version": "5.3.0", + "original": "lib/xterm.min.js", + "file": "xterm.min.js", + "source": "https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.min.js", + "sha256": "fc1dd31b221e3e5f929486e07a80b477a8aaf9dce2b4f9c3ffe7dd25f370655d", + "bytes": 283670, + "license": "MIT" + }, + { + "package": "xterm", + "version": "5.3.0", + "original": "css/xterm.css", + "file": "xterm.css", + "source": "https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css", + "sha256": "832f3f2c603b43ad4351ff04970150cc7a873014276db126a6065c6dd81e4872", + "bytes": 5383, + "license": "MIT" + }, + { + "package": "xterm-addon-fit", + "version": "0.8.0", + "original": "lib/xterm-addon-fit.min.js", + "file": "fit.min.js", + "source": "https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.min.js", + "sha256": "c78e5795c6487acdf24ab436798d4a9cec3848101b281bc65b061f39db714be1", + "bytes": 1789, + "license": "MIT" + }, + { + "package": "xterm", + "version": "5.3.0", + "original": "LICENSE", + "file": "LICENSE-xterm", + "source": "https://cdn.jsdelivr.net/npm/xterm@5.3.0/LICENSE", + "sha256": "b569f629d00f2626a8100df2a1798210535621e42164dfd426a6fe5aac7b0ccd", + "bytes": 1261, + "license": "MIT" + }, + { + "package": "xterm-addon-fit", + "version": "0.8.0", + "original": "LICENSE", + "file": "LICENSE-fit", + "source": "https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/LICENSE", + "sha256": "e256f01188af527e4d06d21d06fbf785ae9c50d4b328bf03cbe0ba7f0aa4228f", + "bytes": 1103, + "license": "MIT" + } +] diff --git a/tests/prompts/browser.test.cjs b/tests/prompts/browser.test.cjs index e452f44..5ff034e 100644 --- a/tests/prompts/browser.test.cjs +++ b/tests/prompts/browser.test.cjs @@ -71,7 +71,7 @@ test('delayed language package and rapid switches keep the latest requested lang }finally{release();await context.close();} }); test('terminal resource failure presents retry; a rejected cached promise is not reused',async()=>{ - const {page,context,errors}=await pageFor('en-US');let attempts=0; + const {page,context,errors}=await pageFor('en-US',async(route,u)=>{if(u.pathname.startsWith('/vendor/')){await route.abort();return true;}return false;});let attempts=0; try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady()); page.on('request',r=>{if(r.url().includes('xterm.css'))attempts++;}); await page.evaluate(()=>{closeLoginModal();return loadTerminalPage();}); @@ -118,15 +118,12 @@ test('failed language switch preserves the loaded language; retry clears failure }finally{await context.close();} }); test('terminal can initialize after failed resource load using newly served resources',async()=>{ - const {page,context,errors}=await pageFor('en-US'); + let fail=true; + const {page,context,errors}=await pageFor('en-US',async(route,u)=>{if(fail&&u.pathname.startsWith('/vendor/')){await route.abort();return true;}return false;}); try{await page.goto(base);await page.waitForFunction(()=>i18n.isReady());await page.evaluate(()=>{closeLoginModal();return loadTerminalPage();}); - await page.route('https://cdn.jsdelivr.net/**',async route=>{ - const url=route.request().url();let body=''; - if(url.includes('xterm.min.js')) body=`window.Terminal=class {constructor(){this.cols=80;this.rows=24;}open(el){el.replaceChildren();el.dataset.terminalReady='yes';}onData(){}loadAddon(){}write(){}writeln(){}focus(){}dispose(){}};`; - if(url.includes('xterm-addon-fit'))body='window.FitAddon={FitAddon:class {fit(){}}};'; - await route.fulfill({contentType:url.endsWith('.css')?'text/css':'application/javascript',body}); - }); - await page.locator('#terminal-container button').click();await page.waitForSelector('#terminal-container[data-terminal-ready="yes"]'); + assert.equal(await page.locator('#terminal-container button').count(),1); + fail=false;await page.locator('#terminal-container button').click();await page.waitForSelector('#terminal-container .xterm'); + assert(await page.evaluate(()=>webTerminal.terminal instanceof Terminal&&!!webTerminal.fitAddon)); assert.equal(await page.locator('#terminal-container button').count(),0);assert.deepEqual(errors,[]); }finally{await context.close();} }); diff --git a/tests/prompts/package.json b/tests/prompts/package.json index 7ee8d1f..fb6290b 100644 --- a/tests/prompts/package.json +++ b/tests/prompts/package.json @@ -6,7 +6,8 @@ }, "scripts": { "test": "cd ../.. && node --test tests/prompts/static.test.cjs tests/prompts/regression.test.cjs", - "test:browser": "cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs" + "test:browser": "cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs", + "test:xterm": "cd ../.. && node --test tests/prompts/xterm-vendor.test.cjs tests/prompts/xterm-offline.test.cjs" }, "devDependencies": { "acorn": "8.16.0", diff --git a/tests/prompts/xterm-offline.test.cjs b/tests/prompts/xterm-offline.test.cjs new file mode 100644 index 0000000..58ff690 --- /dev/null +++ b/tests/prompts/xterm-offline.test.cjs @@ -0,0 +1,52 @@ +const {test}=require('node:test'); +const assert=require('node:assert/strict'),fs=require('node:fs'),path=require('node:path'); +const {chromium}=require('playwright'); +const root=path.resolve(process.env.PROJECT_WEB_ROOT||'components/ts_webui/web'); +for(const language of ['en-US','zh-CN'])test(`${language}: cold offline real xterm and terminal lifecycle`,async()=>{ + const browser=await chromium.launch({channel:'chrome',headless:true}); + const context=await browser.newContext({serviceWorkers:'block',viewport:{width:1280,height:900}}); + const requests=[],errors=[];const origin='http://fixture.local'; + try{ + await context.route('**/*',async route=>{const u=new URL(route.request().url()); + if(u.origin!==origin){await route.abort();return;} + if(u.pathname.startsWith('/api/')){await route.fulfill({json:{code:0,data:{}}});return;} + const file=path.join(root,u.pathname==='/'?'index.html':u.pathname); + try{await route.fulfill({body:fs.readFileSync(file),contentType:({'.js':'application/javascript','.css':'text/css','.html':'text/html','.woff2':'font/woff2'})[path.extname(file)]||'application/octet-stream'});}catch{await route.abort();} + }); + await context.addInitScript(language=>{ + localStorage.setItem('ts_language',language);window.sent=[]; + window.WebSocket=class{static OPEN=1;static CONNECTING=0;constructor(){this.readyState=0;setTimeout(()=>{this.readyState=1;this.onopen?.();},0);}send(s){sent.push(JSON.parse(s));}close(){this.readyState=3;}}; + },language); + const page=await context.newPage();page.on('request',r=>requests.push({url:r.url(),origin:new URL(r.url()).origin}));page.on('pageerror',e=>errors.push(e.message)); + await page.goto(origin);await page.waitForFunction(()=>i18n.isReady()); + assert.equal(await page.evaluate(()=>typeof Terminal),'undefined'); + await page.evaluate(()=>{closeLoginModal();return loadTerminalPage();}); + await page.waitForFunction(()=>webTerminal?.ws?.readyState===1); + assert(await page.evaluate(()=>typeof Terminal==='function'&&typeof FitAddon.FitAddon==='function'&&webTerminal.terminal instanceof Terminal&&!!webTerminal.fitAddon)); + assert.equal(await page.locator('.xterm').count(),1); + assert(!(await page.locator('#terminal-container').innerText()).includes('could not be loaded')); + const frame=m=>page.evaluate(m=>webTerminal.ws.onmessage({data:JSON.stringify(m)}),m); + await frame({type:'connected'}); + await page.locator('.xterm-helper-textarea').focus();await page.keyboard.type('help');await page.keyboard.press('Enter'); + assert(await page.evaluate(()=>sent.some(m=>m.type==='terminal_input'&&m.data==='help'))); + await page.evaluate(()=>webTerminal.startSshShell({host:'192.0.2.1',user:'fixture',password:'fake'})); + await frame({type:'ssh_status',status:'connected'}); + await page.evaluate(()=>{window.writes=[];const t=webTerminal.terminal;for(const name of ['write','writeln']){const original=t[name].bind(t);t[name]=(...a)=>{writes.push(a[0]);return original(...a);};}}); + await frame({type:'power_event',event:'low_voltage',voltage:10.5}); + assert(await page.evaluate(()=>webTerminal.sshMode&&writes.length>0&&!writes.join('').includes('tianshan>'))); + await page.locator('.xterm-helper-textarea').focus();await page.keyboard.type('z'); + assert(await page.evaluate(()=>sent.at(-1).type==='ssh_input'&&sent.at(-1).data==='z')); + await page.setViewportSize({width:1100,height:800});await page.evaluate(()=>webTerminal.fit()); + assert(await page.evaluate(()=>webTerminal.terminal.cols>0)); + await page.keyboard.press('Control+c');assert(await page.evaluate(()=>sent.at(-1).type==='ssh_input'&&sent.at(-1).data==='\x03')); + await page.keyboard.press('Control+Backslash');assert(await page.evaluate(()=>sent.at(-1).type==='ssh_disconnect'&&webTerminal.sshMode)); + await frame({type:'ssh_status',status:'closed'});assert(await page.evaluate(()=>!webTerminal.sshMode&&writes.join('').includes('tianshan>'))); + await page.evaluate(()=>{window.oldTerminal=webTerminal;destroyWebTerminal();}); + assert(await page.evaluate(()=>oldTerminal.destroyed&&oldTerminal.terminal===null)); + await page.evaluate(()=>loadTerminalPage());await page.waitForFunction(()=>webTerminal?.terminal&&webTerminal.ws?.readyState===1); + assert.equal(requests.filter(r=>r.url.includes('/vendor/xterm/')).length,3); + assert(requests.every(r=>r.origin===origin));assert.deepEqual(errors,[]); + const out=process.env.OFFLINE_RESULTS||'docs/repair/xterm-local';fs.mkdirSync(out,{recursive:true}); + fs.writeFileSync(path.join(out,`requests-${language}.json`),JSON.stringify({requests,errors,realXterm:true,externalRequests:0},null,2)); + }finally{await context.close();await browser.close();} +}); diff --git a/tests/prompts/xterm-vendor.test.cjs b/tests/prompts/xterm-vendor.test.cjs new file mode 100644 index 0000000..8bccc2d --- /dev/null +++ b/tests/prompts/xterm-vendor.test.cjs @@ -0,0 +1,35 @@ +const {test}=require('node:test'); +const assert=require('node:assert/strict'),fs=require('node:fs'),path=require('node:path'),os=require('node:os'),crypto=require('node:crypto'),zlib=require('node:zlib'),{execFileSync}=require('node:child_process'); +test('fixed vendor integrity, skip minify, gzip identity, local loader only',()=>{ + const root='components/ts_webui/web',records=JSON.parse(fs.readFileSync('docs/repair/xterm-local/vendor.json')); + assert.equal(records.length,5);assert.deepEqual(fs.readdirSync(root+'/vendor/xterm').sort(),records.map(r=>r.file).sort()); + const temp=fs.mkdtempSync(path.join(os.tmpdir(),'ts-xterm-')); + try{ + fs.cpSync(root+'/vendor',temp+'/vendor',{recursive:true}); + fs.writeFileSync(temp+'/own.js','// own comment\n const a = 1;\n'); + execFileSync('python3',['tools/minify_web.py',temp,'--gzip']); + assert(!fs.readFileSync(temp+'/own.js','utf8').includes('own comment')); + for(const r of records){const source=fs.readFileSync(root+'/vendor/xterm/'+r.file),built=fs.readFileSync(temp+'/vendor/xterm/'+r.file); + assert.equal(source.length,r.bytes);assert.equal(crypto.createHash('sha256').update(source).digest('hex'),r.sha256);assert.deepEqual(built,source); + if(/\.(js|css)$/.test(r.file))assert.deepEqual(zlib.gunzipSync(fs.readFileSync(temp+'/vendor/xterm/'+r.file+'.gz')),source); + else assert(source.toString().includes('Permission is hereby granted')); + } + const js=fs.readFileSync(root+'/js/terminal.js','utf8');assert(!js.includes('cdn.jsdelivr.net'));assert(js.includes('encodeURIComponent(window.TS_ASSET_VERSION)')); + }finally{fs.rmSync(temp,{recursive:true,force:true});} +}); +test('production lazy loader: same-origin cold load, shared promise and retry',async()=>{ + const vm=require('node:vm'),nodes=[],requests=[];let fail=true; + const context=vm.createContext({window:{TS_ASSET_VERSION:'test key'},setTimeout,clearTimeout,document:{ + querySelector(selector){return nodes.find(n=>selector===`${n.kind==='link'?'link[href':'script[src'}="${n.href||n.src}"]`)||null;}, + createElement(kind){return {kind,dataset:{},remove(){const i=nodes.indexOf(this);if(i>=0)nodes.splice(i,1);}};}, + head:{appendChild(n){nodes.push(n);requests.push(n.href||n.src);queueMicrotask(()=>fail?n.onerror():n.onload());}} + }}); + vm.runInContext(fs.readFileSync('components/ts_webui/web/js/terminal.js','utf8'),context); + assert.equal(requests.length,0); + await assert.rejects(vm.runInContext('_xtermReady()',context),/Terminal resource unavailable/); + fail=false; + assert(vm.runInContext('_xtermReady() === _xtermReady()',context));await vm.runInContext('_xtermReady()',context); + assert.equal(requests.length,4);assert.equal(nodes.length,3); + assert(requests.every(u=>u.startsWith('/vendor/xterm/')&&u.endsWith('?v=test%20key'))); + await vm.runInContext('_xtermReady()',context);assert.equal(requests.length,4); +}); diff --git a/tests/ws_subscriptions/verify_xterm_assets.py b/tests/ws_subscriptions/verify_xterm_assets.py new file mode 100644 index 0000000..7083534 --- /dev/null +++ b/tests/ws_subscriptions/verify_xterm_assets.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +"""Offline vendor/build verification with the project's fixed SPIFFS generator.""" +import gzip, hashlib, importlib.util, json, os, pathlib +root=pathlib.Path(__file__).resolve().parents[2] +build=pathlib.Path(os.environ['V3_BUILD']);web=build/'esp-idf/ts_webui/web_optimized' +doc=root/'docs/repair/xterm-local' +records=json.loads((doc/'vendor.json').read_text());report=[] +for r in records: + rel='vendor/xterm/'+r['file'];source=(root/'components/ts_webui/web'/rel).read_bytes();actual=(web/rel).read_bytes() + assert source==actual and hashlib.sha256(actual).hexdigest()==r['sha256'] + item={'file':rel,'raw':len(actual),'sha256':r['sha256']} + if rel.endswith(('.js','.css')): + packed=(web/(rel+'.gz')).read_bytes();assert gzip.decompress(packed)==source;item['gzip']=len(packed) + report.append(item) +spec=importlib.util.spec_from_file_location('spiffsgen',os.environ['IDF_PATH']+'/components/spiffs/spiffsgen.py');s=importlib.util.module_from_spec(spec);spec.loader.exec_module(s) +cfg=s.SpiffsBuildConfig(256,s.SPIFFS_PAGE_IX_LEN,4096,s.SPIFFS_BLOCK_IX_LEN,4,32,s.SPIFFS_OBJ_ID_LEN,s.SPIFFS_SPAN_IX_LEN,True,True,'little',True,True,False) +image=s.SpiffsFS(0x300000,cfg) +for directory,_,files in os.walk(web): + for name in files: + p=pathlib.Path(directory)/name;image.create_file('/'+str(p.relative_to(web)),str(p)) +assert image.to_binary()==(build/'www.bin').read_bytes() +for r in report: + assert ('/'+r['file']).encode() in (build/'www.bin').read_bytes() + if 'gzip' in r: assert ('/'+r['file']+'.gz').encode() in (build/'www.bin').read_bytes() +flash=json.loads((build/'flasher_args.json').read_text());assert any(pathlib.Path(v).name=='www.bin' for v in flash['flash_files'].values()) +result={'files':report,'runtime_raw':sum(r['raw'] for r in report if 'gzip'in r),'runtime_gzip':sum(r.get('gzip',0) for r in report),'vendor_raw_including_licenses':sum(r['raw'] for r in report),'spiffs':{'partition_bytes':image.img_size,'allocated_blocks':len(image.blocks),'block_bytes':4096,'unallocated_blocks':image.blocks_lim-len(image.blocks),'note':'generator allocated blocks including metadata, not runtime filesystem free-space API'},'www_sha256':hashlib.sha256((build/'www.bin').read_bytes()).hexdigest(),'flash_files':flash['flash_files'],'spiffs_reconstruction':'byte-identical'} +(doc/'build-assets.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2)) diff --git a/tools/minify_web.py b/tools/minify_web.py index 0c1bd9a..3e8d510 100644 --- a/tools/minify_web.py +++ b/tools/minify_web.py @@ -123,6 +123,9 @@ def process_directory(web_dir: str) -> None: # 处理 JS 文件 for filepath in glob.glob(os.path.join(web_dir, '**', '*.js'), recursive=True): + # Preserve third-party release bytes; gzip still runs below. + if os.path.relpath(filepath, web_dir).split(os.sep)[0] == 'vendor': + continue original_size = os.path.getsize(filepath) with open(filepath, 'r', encoding='utf-8') as f: content = f.read() @@ -141,6 +144,9 @@ def process_directory(web_dir: str) -> None: # 处理 CSS 文件 for filepath in glob.glob(os.path.join(web_dir, '**', '*.css'), recursive=True): + # Preserve third-party release bytes; gzip still runs below. + if os.path.relpath(filepath, web_dir).split(os.sep)[0] == 'vendor': + continue original_size = os.path.getsize(filepath) with open(filepath, 'r', encoding='utf-8') as f: content = f.read() From dc880ea768a6f9477502dba8b31f25870d3dd16b Mon Sep 17 00:00:00 2001 From: Alfred Date: Mon, 28 Sep 2026 18:45:47 +0800 Subject: [PATCH 9/9] fix(webui): correct SSH poller stack budget and capability cleanup --- components/ts_webui/src/ts_webui_ws.c | 5 +- docs/repair/ssh-poll-stack/README.md | 109 + docs/repair/ssh-poll-stack/after.txt | 13 + docs/repair/ssh-poll-stack/before.txt | 2 + .../ssh-poll-stack/candidate/assets.json | 41 + .../repair/ssh-poll-stack/candidate/build.log | 1697 ++++++++ .../candidate/requests-en-US.json | 71 + .../candidate/requests-zh-CN.json | 71 + .../candidate/sdkconfig-evidence.txt | 2875 +++++++++++++ docs/repair/ssh-poll-stack/change.patch | 98 + docs/repair/ssh-poll-stack/crash.txt | 30 + .../ssh-poll-stack/device-candidate/flash.log | 233 + .../device-candidate/output-input-resize.json | 229 + .../device-candidate/restore-flash.log | 233 + .../device-candidate/restore-health.json | 220 + .../device-candidate/round1-closed.json | 222 + .../device-candidate/round10-closed.json | 222 + .../device-candidate/round2-closed.json | 222 + .../device-candidate/round3-closed.json | 222 + .../device-candidate/round4-closed.json | 222 + .../device-candidate/round5-closed.json | 222 + .../device-candidate/round6-closed.json | 222 + .../device-candidate/round7-closed.json | 222 + .../device-candidate/round8-closed.json | 222 + .../device-candidate/round9-closed.json | 222 + .../device-candidate/samples.jsonl | 368 ++ .../device-candidate/serial-redacted.log | 749 ++++ .../device-candidate/summary.json | 82 + .../device-candidate/welcome.json | 229 + .../automatic-rounds-verified.log | 10 + .../device-diagnostic/automatic-rounds.log | 9 + .../device-diagnostic/automatic-samples.jsonl | 38 + .../device-diagnostic/final-idle.json | 222 + .../device-diagnostic/flash.log | 239 ++ .../output-input-resize.json | 229 + .../device-diagnostic/round1-closed.json | 222 + .../device-diagnostic/round10-automatic.json | 14 + .../device-diagnostic/round2-automatic.json | 14 + .../device-diagnostic/round3-automatic.json | 14 + .../device-diagnostic/round4-automatic.json | 14 + .../device-diagnostic/round5-automatic.json | 14 + .../device-diagnostic/round6-automatic.json | 14 + .../device-diagnostic/round7-automatic.json | 14 + .../device-diagnostic/round8-automatic.json | 14 + .../device-diagnostic/round9-automatic.json | 14 + .../device-diagnostic/rounds.mjs | 39 + .../device-diagnostic/samples.jsonl | 172 + .../device-diagnostic/serial-redacted.log | 748 ++++ .../device-diagnostic/summary.json | 11 + .../device-final/after-local.json | 1138 +++++ .../device-final/browser-observer.cjs | 16 + .../ssh-poll-stack/device-final/destroy.json | 2489 +++++++++++ .../device-final/health-assets.json | 249 ++ .../device-final/j1-active.json | 560 +++ .../ssh-poll-stack/device-final/j1-echo.json | 991 +++++ .../ssh-poll-stack/device-final/network.json | 339 ++ .../ssh-poll-stack/device-final/reentry.json | 3753 +++++++++++++++++ .../ssh-poll-stack/diagnostic/assets.json | 41 + .../ssh-poll-stack/diagnostic/build.log | 1698 ++++++++ .../diagnostic/sdkconfig-evidence.txt | 2877 +++++++++++++ docs/repair/ssh-poll-stack/manifest.json | 72 + .../repair/ssh-poll-stack/optimized-xterm.txt | 10 + .../ssh-poll-stack/optimized/browser.json | 31 + .../ssh-poll-stack/optimized/browser.log | 56 + .../optimized/cross-browser-en-US.json | 869 ++++ .../optimized/cross-browser-en-US.log | 2 + .../optimized/cross-browser-zh-CN.json | 869 ++++ .../optimized/cross-browser-zh-CN.log | 2 + .../repair/ssh-poll-stack/publication-gate.md | 16 + .../ssh-poll-stack/requests-source-en-US.json | 71 + .../ssh-poll-stack/requests-source-zh-CN.json | 71 + .../repair/ssh-poll-stack/results/adapter.log | 13 + .../ssh-poll-stack/results/browser.json | 31 + .../repair/ssh-poll-stack/results/browser.log | 56 + .../ssh-poll-stack/results/certificate.log | 9 + .../repair/ssh-poll-stack/results/control.log | 5 + .../results/cross-browser-en-US.json | 869 ++++ .../results/cross-browser-en-US.log | 2 + .../results/cross-browser-zh-CN.json | 869 ++++ .../results/cross-browser-zh-CN.log | 2 + .../results/cross-node-en-US.json | 869 ++++ .../results/cross-node-en-US.log | 2 + .../results/cross-node-zh-CN.json | 869 ++++ .../results/cross-node-zh-CN.log | 2 + docs/repair/ssh-poll-stack/results/f1_f2.log | 23 + docs/repair/ssh-poll-stack/results/host.json | 108 + docs/repair/ssh-poll-stack/results/host.log | 23 + .../ssh-poll-stack/results/operation.log | 2 + .../results/pre-push-adapter.log | 13 + .../repair/ssh-poll-stack/results/prompts.log | 53 + .../repair/ssh-poll-stack/results/release.log | 5 + .../ssh-poll-stack/results/reviewer.log | 15 + .../repair/ssh-poll-stack/results/runtime.log | 13 + .../ssh-poll-stack/results/shell_driver.log | 6 + docs/repair/ssh-poll-stack/xterm.txt | 16 + .../ws_subscriptions/test_operation_adapter.c | 24 +- 96 files changed, 31756 insertions(+), 3 deletions(-) create mode 100644 docs/repair/ssh-poll-stack/README.md create mode 100644 docs/repair/ssh-poll-stack/after.txt create mode 100644 docs/repair/ssh-poll-stack/before.txt create mode 100644 docs/repair/ssh-poll-stack/candidate/assets.json create mode 100644 docs/repair/ssh-poll-stack/candidate/build.log create mode 100644 docs/repair/ssh-poll-stack/candidate/requests-en-US.json create mode 100644 docs/repair/ssh-poll-stack/candidate/requests-zh-CN.json create mode 100644 docs/repair/ssh-poll-stack/candidate/sdkconfig-evidence.txt create mode 100644 docs/repair/ssh-poll-stack/change.patch create mode 100644 docs/repair/ssh-poll-stack/crash.txt create mode 100644 docs/repair/ssh-poll-stack/device-candidate/flash.log create mode 100644 docs/repair/ssh-poll-stack/device-candidate/output-input-resize.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/restore-flash.log create mode 100644 docs/repair/ssh-poll-stack/device-candidate/restore-health.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round1-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round10-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round2-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round3-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round4-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round5-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round6-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round7-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round8-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/round9-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/samples.jsonl create mode 100644 docs/repair/ssh-poll-stack/device-candidate/serial-redacted.log create mode 100644 docs/repair/ssh-poll-stack/device-candidate/summary.json create mode 100644 docs/repair/ssh-poll-stack/device-candidate/welcome.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds-verified.log create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds.log create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/automatic-samples.jsonl create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/final-idle.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/flash.log create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/output-input-resize.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round1-closed.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round10-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round2-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round3-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round4-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round5-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round6-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round7-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round8-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/round9-automatic.json create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/rounds.mjs create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/samples.jsonl create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/serial-redacted.log create mode 100644 docs/repair/ssh-poll-stack/device-diagnostic/summary.json create mode 100644 docs/repair/ssh-poll-stack/device-final/after-local.json create mode 100644 docs/repair/ssh-poll-stack/device-final/browser-observer.cjs create mode 100644 docs/repair/ssh-poll-stack/device-final/destroy.json create mode 100644 docs/repair/ssh-poll-stack/device-final/health-assets.json create mode 100644 docs/repair/ssh-poll-stack/device-final/j1-active.json create mode 100644 docs/repair/ssh-poll-stack/device-final/j1-echo.json create mode 100644 docs/repair/ssh-poll-stack/device-final/network.json create mode 100644 docs/repair/ssh-poll-stack/device-final/reentry.json create mode 100644 docs/repair/ssh-poll-stack/diagnostic/assets.json create mode 100644 docs/repair/ssh-poll-stack/diagnostic/build.log create mode 100644 docs/repair/ssh-poll-stack/diagnostic/sdkconfig-evidence.txt create mode 100644 docs/repair/ssh-poll-stack/manifest.json create mode 100644 docs/repair/ssh-poll-stack/optimized-xterm.txt create mode 100644 docs/repair/ssh-poll-stack/optimized/browser.json create mode 100644 docs/repair/ssh-poll-stack/optimized/browser.log create mode 100644 docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.json create mode 100644 docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.log create mode 100644 docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.json create mode 100644 docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.log create mode 100644 docs/repair/ssh-poll-stack/publication-gate.md create mode 100644 docs/repair/ssh-poll-stack/requests-source-en-US.json create mode 100644 docs/repair/ssh-poll-stack/requests-source-zh-CN.json create mode 100644 docs/repair/ssh-poll-stack/results/adapter.log create mode 100644 docs/repair/ssh-poll-stack/results/browser.json create mode 100644 docs/repair/ssh-poll-stack/results/browser.log create mode 100644 docs/repair/ssh-poll-stack/results/certificate.log create mode 100644 docs/repair/ssh-poll-stack/results/control.log create mode 100644 docs/repair/ssh-poll-stack/results/cross-browser-en-US.json create mode 100644 docs/repair/ssh-poll-stack/results/cross-browser-en-US.log create mode 100644 docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.json create mode 100644 docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.log create mode 100644 docs/repair/ssh-poll-stack/results/cross-node-en-US.json create mode 100644 docs/repair/ssh-poll-stack/results/cross-node-en-US.log create mode 100644 docs/repair/ssh-poll-stack/results/cross-node-zh-CN.json create mode 100644 docs/repair/ssh-poll-stack/results/cross-node-zh-CN.log create mode 100644 docs/repair/ssh-poll-stack/results/f1_f2.log create mode 100644 docs/repair/ssh-poll-stack/results/host.json create mode 100644 docs/repair/ssh-poll-stack/results/host.log create mode 100644 docs/repair/ssh-poll-stack/results/operation.log create mode 100644 docs/repair/ssh-poll-stack/results/pre-push-adapter.log create mode 100644 docs/repair/ssh-poll-stack/results/prompts.log create mode 100644 docs/repair/ssh-poll-stack/results/release.log create mode 100644 docs/repair/ssh-poll-stack/results/reviewer.log create mode 100644 docs/repair/ssh-poll-stack/results/runtime.log create mode 100644 docs/repair/ssh-poll-stack/results/shell_driver.log create mode 100644 docs/repair/ssh-poll-stack/xterm.txt diff --git a/components/ts_webui/src/ts_webui_ws.c b/components/ts_webui/src/ts_webui_ws.c index 9bc83dc..b79cb47 100644 --- a/components/ts_webui/src/ts_webui_ws.c +++ b/components/ts_webui/src/ts_webui_ws.c @@ -50,6 +50,7 @@ /* SSH Shell 输出缓冲区大小 */ #define SSH_OUTPUT_BUF_SIZE 2048 +#define SSH_POLL_STACK_SIZE 8192 typedef enum { WS_CLIENT_TYPE_EVENT, // 普通事件订阅客户端 @@ -271,7 +272,7 @@ static void ssh_poll_task(void *arg) } shell_resources_close(ctx); ts_ws_op_executor_done(op); - vTaskDelete(NULL); + vTaskDeleteWithCaps(NULL); } static void ssh_cleanup(void) { @@ -308,7 +309,7 @@ static void handle_ssh_connect(httpd_req_t *req,cJSON *params) error="Failed to open shell"; if(ts_ssh_shell_open(ctx->session,&shell_config,&ctx->shell)!=ESP_OK)goto failed; ts_ws_op_executor_take(op); - if(xTaskCreateWithCaps(ssh_poll_task,"ssh_poll",4096,ctx,5,NULL,MALLOC_CAP_SPIRAM)!=pdPASS){ts_ws_op_executor_done(op);error="Failed to create SSH session";goto failed;} + if(xTaskCreateWithCaps(ssh_poll_task,"ssh_poll",SSH_POLL_STACK_SIZE,ctx,5,NULL,MALLOC_CAP_SPIRAM)!=pdPASS){ts_ws_op_executor_done(op);error="Failed to create SSH session";goto failed;} poller=true;error="SSH shell closed during startup"; if(!ts_ssh_shell_is_active(ctx->shell))goto failed; error="SSH readiness delivery failed"; diff --git a/docs/repair/ssh-poll-stack/README.md b/docs/repair/ssh-poll-stack/README.md new file mode 100644 index 0000000..d30b9db --- /dev/null +++ b/docs/repair/ssh-poll-stack/README.md @@ -0,0 +1,109 @@ +# PR42 ssh_poll 栈预算与 WithCaps 释放修复(2026-09-28) + +## 状态与范围 + +本地回归、固定 SDK 正式/诊断构建及两版各10轮真机 SSH 验收已完成,最后的设备离线首次加载与 J1 真通知也已补齐。正式候选已恢复。最低观测剩余栈分别为3876/3644 bytes,所测负载未复现原溢出;不扩张为任意负载安全或绝对零泄漏。详见文末最新结果与 `device-final/`。以下阶段记录保留历史顺序。 + +基线 HEAD `3a19128d8638771c958fe47df1d6a7d339a10a4c`,分支 `fix/v0.5.2-reliability-and-prompts`。起始无 tracked 修改;已有 `output/`、`tmp/`、`docs/runtime-repair/evidence/reviewer-fixes/diff-check.txt` 保留。适用用户提供 AGENTS 规则;本仓及所改目录未发现额外 AGENTS 文件。 + +生产仅修改 `components/ts_webui/src/ts_webui_ws.c`:定义 `SSH_POLL_STACK_SIZE 8192`,Shell poller 创建参数使用该常量,退出改 `vTaskDeleteWithCaps(NULL)`。输出缓冲仍 2048,优先级仍 5,PSRAM 分配不变。没有修改前端、协议、operation、TX、SSH 驱动、保护、版本或发布配置。额外栈成本为单实例 4096 bytes PSRAM。 + +## 原始故障与静态检查 + +`crash.txt` 是本轮修改前真实设备故障摘录:Shell opened 后 `ssh_poll` stack overflow,继而软件重启。使用原 ELF 解析为 FreeRTOS `vApplicationStackOverflowHook`;回溯尾部 CORRUPTED,不能从该回溯推出最早出错的业务帧。原源码快照 `/tmp/ssh-poll-before.c`,哈希见 manifest.json,可由上述 HEAD 对照。 + +已检查: + +- poller 以 `sizeof(buf)-1` 即 2047 传入 `ts_ssh_shell_read`。 +- `ts_ssh_shell_read` 原样把 size 传给 libssh2;项目内 channel.c 的 `_libssh2_channel_read` 循环限定 `bytes_read < buflen`,复制长度不超过 `buflen-bytes_read`。 +- `ssh_send_output` 先取得原 operation 输出票据,再分配 len+1,复制 len 字节,在 buf[len] 放终止符;该 poller 的 len 来源受上面的 read 长度限制。 +- cJSON 使用终止字符串;output_finish 复制 JSON 到原有消息对象,再按原投递身份结算。不修改 caller buf。资源关闭、executor_done、task delete 顺序未变。 +- 未发现这一直接路径针对 caller buf 的明确越界证据。这不是对整个 libssh2 或全部运行时内存安全的证明。 + +因此实施用户指定的 8192 预算方案,而不是声称静态检查已排除所有内存破坏。 + +## 官方 SDK 删除契约与限制 + +固定 `/Users/massif/esp/v5.5.2/esp-idf`:`components/freertos/esp_additions/include/freertos/idf_additions.h` 明确 WithCaps 栈单位为 bytes,必须由 vTaskDeleteWithCaps 删除。既有 FreeRTOS 头链提供声明,两份完整构建均无需增加 include。 + +SDK `esp_additions/idf_additions.c` 表明普通 vTaskDelete 无法释放 WithCaps 静态分配的 TCB/stack。本次修正调用配对。self-delete 在 SDK 内创建短暂清理任务后挂起原任务;失败时 SDK abort。这是官方实现,不是本轮新增自定义任务或 wrapper。真机采样需允许清理任务得到调度后再判断残留;不能把主机删除替身当成 SDK 内存释放证明。 + +## 测试变更与结果 + +复用 `tests/ws_subscriptions/test_operation_adapter.c`,包含实际生产 WS/control/TX 实现: + +- 静态断言常量 8192,创建边界断言 WithCaps、8192、PSRAM。 +- WithCaps 删除边界断言 self-delete、executor 已退出、仍可取得的原上下文 shell/session 已清空。 +- 新增 10 轮 Shell 创建/退出,逐轮必须调用 WithCaps delete;排空后 OP_FREE、零 refs/executors 和零 tracked allocation。 +- 保留原创建失败/分配失败扫描与所有生命周期断言。 + +`before.txt`:修改生产前,创建参数断言在实际 4096 参数处失败(不是编译/依赖错误)。之后补充常量静态断言。`after.txt`:同一创建参数断言及新增删除/重复退出断言通过。它证明参数与资源流程,不是模拟 ESP32 栈安全。 + +执行环境:`IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf`,`DEVELOPER_DIR=/Library/Developer/CommandLineTools`。 + +| 入口 | 本轮结果与行为边界 | +| --- | --- | +| `python3 tests/ws_subscriptions/run_project_v3.py`(V3_RESULTS 指向 results) | 全部入口 exit 0;host/operation/adapter/control/reviewer/F1-F2/runtime/certificate/shell_driver/Node/双语跨层。覆盖 R1–R5、F1/F2、G1/G2、V1/V2、H1/J1 有效回归;见 results/host.json 和逐项日志 | +| `npm test --prefix tests/prompts`(上述 runner 内) | 40 通过,含 J1 实际输入/显示状态测试 | +| `python3 tests/ws_subscriptions/run_project_v3.py --browser` | Chrome 38 通过,双语 C→JS→C Chrome 跨层通过,见 results/browser.json | +| `npm run test:xterm --prefix tests/prompts` | 4 通过;真实 xterm,禁止外部 origin,网络记录 requests-source-*.json | +| 同一 browser runner,PROJECT_WEB_ROOT 指向候选 web_optimized | 浏览器及双语跨层通过,见 optimized/ | +| `PROJECT_WEB_ROOT=.../web_optimized node --test tests/prompts/xterm-offline.test.cjs` | 双语真实 xterm 首次离线加载/输入/J1/退出通过,见 optimized-xterm.txt 和 candidate/requests-*.json | +| `git diff --check` | 通过 | + +首次构建因沙箱拒绝 SDK psutil 进程枚举、Chrome 因沙箱启动失败;随后在获准的沙箱外本地环境重跑通过,没有更换 SDK/测试依赖。源码和构建输入自构建开始后未再修改;后续只补测试常量断言并重跑受影响主机/跨层测试。 + +## 两份构建与静态资源 + +- 正式候选:`/tmp/tianshan-ssh-stack-candidate/build`;App 0x215120,分区 31% 空余。 +- 诊断版:`/tmp/tianshan-ssh-stack-diagnostic/build`;App 0x259ee0,分区 22% 空余。 +- SDK 均 v5.5.2、ESP32-S3,独立完整 build;各目录 build.sh 保存精确构建命令。 +- 正式配置保留原 canary;诊断临时 sdkconfig 启用 `FREERTOS_CHECK_STACKOVERFLOW_CANARY`、`FREERTOS_WATCHPOINT_END_OF_STACK`、`COMPILER_STACK_CHECK_MODE_ALL`、`HEAP_POISONING_LIGHT`。正式 sdkconfig 未改。此处 sdkconfig-evidence.txt 仅证据,不是默认构建配置。 +- 固定 SDK 的 Kconfig/端口实现未发现上述 watchpoint 对本目标 PSRAM stack 的禁用条件,诊断配置实际进入 sdkconfig.h 并编译通过;硬件触发有效性未实测。watchpoint 只监测栈尾区域,且最多占用约 60 bytes,不是任意越界探测器。 +- 两份 TianShanOS.bin/www.bin/ELF 哈希见各自 assets.json。两份 xterm JS/CSS/fit 的优化原文件逐字节等于 vendor 源,gzip 解压也相等,详见 manifest.json。 +- 两份均执行 `tests/ws_subscriptions/verify_project_assets.py`,由最终 web_optimized 重建 SPIFFS 与实际 www.bin 逐字节一致,打包无容量溢出。 +- flasher_args.json 均含 0x6a0000:www.bin。构建日志中的 flash 用法仅 SDK 提示,本轮未执行 flash。 + +## 初始待授权真机验收计划(历史,后续执行结果见下文) + +1. 先确认可输入命令的 UART0 通道。当前 USB Serial/JTAG 已用于收日志,但当前固件 CLI stdin 为 UART0;装了 CH344 驱动不等于 CH344 通道已连接。不能在活动远端 Shell 中输入 system --tasks 冒充设备 CLI 查询。 +2. 获得刷机授权后分别记录候选/诊断固件哈希,完整刷 App+www,保持串口日志。 +3. welcome 后、有限 200 行输出过程中与结束后、pwd/uname 输入后、resize 后、退出前采样 system --tasks 的 ssh_poll STACK。 +4. 本 SDK Xtensa `StackType_t` 为 uint8_t,high-water 计算除 sizeof(StackType_t),本项目直接打印 usStackHighWaterMark,故单位为 **bytes**。记录全程最低值,目标至少约 2048 bytes;仅几百 bytes 或继续溢出则停止并报告,不自行再增栈。 +5. 至少 10 轮 connect/welcome/input/Ctrl+\\/closed,每轮退出清理后采集 tasks 与 memory,检查 ssh_poll 消失及 PSRAM/heap 趋势。当前产品没有公开 operation ledger 查询接口:OP_FREE 直接断言目前仅有主机证据,不能用 tasks 消失冒充真机 ledger 读取。若要求真机直接读 ledger,需要另行确定观测手段,本轮不加生产接口。 +6. 诊断版重复全部负载,检查 canary/watchpoint/heap poison/assert/panic/watchdog/load-store 错误;出现任何项均不能宣布关闭。 + +**本轮没有新真机结果,没有 high-water 数值,也没有真机 10 轮 PSRAM 释放证据。** 本地交付已准备好;只有完成上述授权验收后才可判断 8192 预算是否足够以及是否支持原始栈预算不足的根因解释。未提交、推送或更新 PR。 + +## 后续用户授权真机执行(阶段记录) + +用户在本地交付后明确授权刷机验收。候选版完整 flash App+www 成功,启动 ELF 前缀 2c29402b1 与候选 ELF 一致,12 服务正常。用户通过真实 Safari 完成 welcome、200 行有限输出、pwd/uname、窗口调整及 Ctrl+\ 退出;10 轮连接/输入/退出均有用户确认及逐轮 API 观测,见 device-candidate。 + +UART0 尚无输入通道,复用现有只读 system.tasks API:与 system --tasks 同为 uxTaskGetSystemState/usStackHighWaterMark,单位 bytes,不改变生产接口。全程最低值 3876 bytes(第 10 轮);每轮退出后 ssh_poll 数为 0,无检测到的 panic/stack overflow/assert/watchdog。PSRAM 空闲从第 1 轮 7614416 到第 10 轮 7613736 bytes,中间第 8 轮下降后第 9 轮回升;未出现每轮一个任务栈大小的泄漏,但小幅净差仍不能证明零泄漏,也不能直接读取真机 operation FREE。此轮未作堆分配归因。 + +诊断版验收正在进行,最终根因关闭结论仍保留。 + +## 诊断真机结果(2026-09-28,自动阶段完成) + +正式候选 10 轮由用户通过 Safari 完成。诊断版第 1 轮用户完成 welcome、200 行输出、pwd/uname、resize、Ctrl+\\ 和本地 help;用户随后明确授权代理自动完成余下测试。第 2–10 轮使用 Node 原生 WebSocket 连接设备原有 WS handler,真实设备再连接 10.10.99.98,只执行独立 echo 标记并发送既有 ssh_disconnect。该九轮是**真实设备/真实 SSH 的协议自动验收,不是九轮浏览器键盘验收**;前述人工轮覆盖了实际 UI。 + +自动脚本第一尝试因未剥离 bracketed-paste ANSI 控制字符而未匹配 echo 输出,正常断开后停止,没有计为通过。后续脚本保存原始输出并剥离 CSI,仅接受一整行等于唯一 marker(不能将命令回显当成执行结果)。九轮均收到 connecting→connected→disconnecting→closed,验证了 echo 返回与 poller 消失。脚本见 device-diagnostic/rounds.mjs;凭据从环境读取,未写入脚本或证据。 + +- 诊断全程最低观测剩余栈 **3644 bytes**(第 6 轮主动阶段采样);后台每 2 秒采样最低 3984 bytes。必须合并两种采样,不能只取定时器数据。candidate 最低 3876 bytes。8192 减上述水位分别约 4548/4316 bytes,支持实际用栈超过原 4096 预算;水位不是对每条指令的精确峰值追踪。 +- 所有诊断轮次退出后无 ssh_poll;最终内部 free 25671 bytes 与第 1 轮相同。PSRAM 第 1 轮后 7596844,自动第 6 轮 7587612、第 7 轮 7593832、第 10 轮 7594840,最终空闲 7595232 bytes。存在波动与回升,未呈逐轮固定下降,未出现 WithCaps 栈/TCB 规模的重复泄漏;最终比初轮少 1612 bytes,未做分配归因,不能宣称绝对零泄漏。 +- 本次保存的诊断日志没有 stack/canary/watchpoint/heap corruption/assert/panic/watchdog/load-store 错误。增强检测只覆盖本次负载及工具检测范围,不是形式化排除任意内存破坏。 +- 真机无公开 operation ledger 读取入口;FREE/ref 闭合由生产 C 主机回归直接验证,真机以任务消失、重复创建成功和内存趋势间接验证,不混淆证据层级。 +- 两版最低余量均超过约 2 KB 门槛,实际负载未再次触发原崩溃,证据支持原 4 KB 栈预算不足。可进入后续最终真机验收;全系统/J1 真机电源告警、完全断公网首载等不因本轮通过自动判定完成。 + +测试后恢复正式候选 App+www,启动复核记录另见 device-candidate/restore-*。没有提交、推送、更新 PR 或改动额外生产代码。 + +## 最后两项真机补验(2026-09-28,正式候选) + +证据位于 `device-final/`。没有新增生产修改、刷机或配置变更。 + +1. **禁止公网的首次加载**:Playwright 启动全新 Chrome context,无既有缓存/登录,禁用 Service Worker;路由仅放行 `http://10.10.99.97`,其他 origin 一律 abort。用户仅完成登录,后续操作由代理通过 CUA 执行。未注入 Terminal/FitAddon/WebSocket 或伪造服务器响应。实际三个 vendor URL 均来自设备,构造器存在、终端成功初始化,所有 HTTP 请求无外部 origin,pageerror 为零;设备返回的三个资源字节与源码完全一致。见 network.json、health-assets.json。 +2. **J1 真事件、真 SSH**:设备正常电压约 20.5V,保护 NORMAL、触发次数0。通过实际 Web Terminal 执行 `voltprot --status` 后执行 `voltprot --debug`,进入已授权 SSH 主机。真实 `power_event/debug_tick` 在 SSH 中显示,活动阶段无新增 `tianshan>`,sshMode 保持 true。实际键盘输入 `echo TIANSHAN_J1_REAL_PASS` 产生 ssh_input,收到独立远端返回行;随后 Ctrl+\\ 产生 ssh_disconnect,收到 disconnecting→closed 后才回到本地。接着本地 echo 产生 terminal_input 并正常返回。离开页面后终端实例消失,重新进入后连接正常,vendor 请求累计仍仅三个。退出后设备 tasks 无 ssh_poll。 +3. **调试结束边界**:本次浏览器操作和取证超过8–10秒提前关闭目标,使用原命令既有30秒自动关闭,没有在自动关闭后再次切换以免重新开启。双 WebSocket 共记录60个 debug_tick(两个连接各接收同一批30秒通知),后续本地命令、离开/重新进入期间计数保持60,未再增加。未触发低压、关机或阈值修改。这里验证安全 debug_tick 显示路径,并不声称真实低压关机链路经过测试。 +4. **测试干扰与边界**:最初旧 Safari 与新 Chrome 同时停留终端页,收到明确 `session_closed: Another terminal session requested`;将旧 Safari 移至系统页后再执行 J1。此干扰与原 stack overflow 不同。当前补验没有重新接通串口监控,不能据此声称本段串口无错误;此前两版10轮串口/任务/水位证据仍见对应目录。当前段以浏览器消息、真实echo、设备状态和任务回收为证。 + +本轮上述实际消息/状态/网络断言通过。此结果补齐了先前列出的离线真机首载和J1真机通知两项,不能扩张为全系统无缺陷、任意负载无泄漏或直接读取真机 operation 账本。尚未提交、推送或合并。 diff --git a/docs/repair/ssh-poll-stack/after.txt b/docs/repair/ssh-poll-stack/after.txt new file mode 100644 index 0000000..540987e --- /dev/null +++ b/docs/repair/ssh-poll-stack/after.txt @@ -0,0 +1,13 @@ +PASS G1 same observable assertion: old rejection callback cannot corrupt replacement Shell (whole production unit) +PASS G2 same observable assertion: pending A fails while B prepares; B settles before terminal, no output follows terminal +PASS B11 timer delete/barrier retry retains original params; busy stop recovers without new business; late timer cannot abort replacement +PASS bounded timer drain retry exhaustion is retained and explicitly resumed by stop retry +PASS B09 observation failure still executes actual matching and variable updates without aborting remote command +PASS original timeout and stop-on-match business abort semantics retained +PASS original cancel ID contract, user disconnecting status and frozen terminal recipient snapshot +PASS no recipients: no observation JSON/payload allocation; business executes and tickets retire +PASS task-create and allocation failure sweep: all actual contexts, credentials, output buffers and reservations reclaimed +PASS output encoding allocation sweep: no partial protocol objects escape, original ticket/resource ledgers drain +PASS healthy stop drains original Shell within bounded wait, worker self-stop rejected, timer barrier callback-before-return remains pinned +PASS timer allocation/start failure cleanup: no timer reference leak; underlying SSH deadline policy unchanged +PASS complete production WS unit: Shell output failure/close/startup failure, Exec task/callback/match/variables/timer cleanup and task-before-create-return; destroyed=94 diff --git a/docs/repair/ssh-poll-stack/before.txt b/docs/repair/ssh-poll-stack/before.txt new file mode 100644 index 0000000..b4ce45e --- /dev/null +++ b/docs/repair/ssh-poll-stack/before.txt @@ -0,0 +1,2 @@ +Assertion failed: (!strcmp(n,"ssh_poll") && stack==8192 && caps==MALLOC_CAP_SPIRAM), function adapter_create_caps, file test_operation_adapter.c, line 138. +tests/ws_subscriptions/run_operation_adapter.sh: line 11: 36726 Abort trap: 6 "$build/adapter" diff --git a/docs/repair/ssh-poll-stack/candidate/assets.json b/docs/repair/ssh-poll-stack/candidate/assets.json new file mode 100644 index 0000000..b9217ee --- /dev/null +++ b/docs/repair/ssh-poll-stack/candidate/assets.json @@ -0,0 +1,41 @@ +{ + "index.html": { + "source_sha256": "c8b08579724612166cc4ac2568aff34661bbf2c8699cc856abfa3d778ed4ae1d", + "optimized_sha256": "c8b08579724612166cc4ac2568aff34661bbf2c8699cc856abfa3d778ed4ae1d", + "gzip_sha256": "808c43f54d431ec28af120225bc2e9176af7977075be881b6948c4db7d90f7ee", + "optimized_bytes": 26676 + }, + "js/terminal.js": { + "source_sha256": "5d77a7181b6127699e098f22d3c872f5e31daaa700436b6fa928f34b6aa33e52", + "optimized_sha256": "6759587f527a0c37aaf8b13f6b5ffc017a452954cd23b780b5d6254488f939dc", + "gzip_sha256": "5ce7a22c1176722e2c85b89756d596fd170ae4557a2b0dd66de27a47432f2acf", + "optimized_bytes": 20066 + }, + "js/lang/zh-CN.js": { + "source_sha256": "bb3d3b4b28c8c146fdb1c437bee84862806ed915af8cc0aa2388deb6a9e9ef89", + "optimized_sha256": "81b0fed5b0ac73d51d9c37204c9f62e035a79bbf5b5610d37fc8a936faf9fd64", + "gzip_sha256": "9d1d0eed6025cd7839e8a9c650bfadb600fdd50f48a662305f9189e06e485a38", + "optimized_bytes": 137314 + }, + "js/lang/en-US.js": { + "source_sha256": "58beed2b903407387d884c99f38eaef578e74be916175b53745d0d5ececadc10", + "optimized_sha256": "e9963046086616fecc9ba662df94e736a98c1430865e0caa47292b3690ca0ad0", + "gzip_sha256": "2af0a582c56d9f1561bd84c65cfb5060c123dc244360da762049a0fb49f08336", + "optimized_bytes": 143161 + }, + "build": { + "TianShanOS.bin": { + "sha256": "633080a1ca2f23a7de7f0fd6ca47de81c93227fc8b3ef5bae91513e41c2bc314", + "bytes": 2183456 + }, + "www.bin": { + "sha256": "37dca9abb5a6c3c91fffade1fc0e7ea44a4ba3f35592e89d72340654eeb8b9c9", + "bytes": 3145728 + }, + "TianShanOS.elf": { + "sha256": "2c29402b17a8c32c9167151666f0533737f704a549d1ad9df1895b45401f79f5", + "bytes": 18286832 + } + }, + "spiffs_regeneration": "byte-identical from verified optimized directory" +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/candidate/build.log b/docs/repair/ssh-poll-stack/candidate/build.log new file mode 100644 index 0000000..ffaf942 --- /dev/null +++ b/docs/repair/ssh-poll-stack/candidate/build.log @@ -0,0 +1,1697 @@ +Checking "python3" ... +Python 3.12.4 +"python3" has been detected +Activating ESP-IDF 5.5 +Setting IDF_PATH to '/Users/massif/esp/v5.5.2/esp-idf'. +* Checking python version ... 3.12.4 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... zsh +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of riscv32-esp-elf, cmake, xtensa-esp-elf, openocd-esp32, esp-rom-elfs, xtensa-esp-elf-gdb, riscv32-esp-elf-gdb use command 'python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall' +To free up even more space, remove installation packages of those tools. +Use option python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall --remove-archives. +* Shell completion ... Autocompletion code generated + +Done! You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build +ESP-IDF v5.5.2 +Executing action: all (aliases: build) +Running cmake in directory /private/tmp/tianshan-ssh-stack-candidate/build +Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python -DESP_PLATFORM=1 -DSDKCONFIG=/tmp/tianshan-ssh-stack-candidate/sdkconfig -DCCACHE_ENABLE=0 /Users/massif/TianshanOS"... +-- Found Python3: /opt/anaconda3/bin/python3.12 (found version "3.12.4") found components: Interpreter +-- IDF_TARGET is not set, guessed 'esp32s3' from sdkconfig '/tmp/tianshan-ssh-stack-candidate/sdkconfig' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +NOTICE: +Following dependencies have new versions available: +Dependency "espressif/libpng": "1.6.54" -> "1.6.58~2" +Dependency "espressif/mdns": "1.9.1" -> "1.13.1" +Dependency "espressif/zlib": "1.3.1" -> "1.3.2~1" +Consider running "idf.py update-dependencies" to update your lock file. +NOTICE: Processing 7 dependencies: +NOTICE: [1/7] espressif/esp_jpeg (1.3.1) +NOTICE: [2/7] espressif/esp_websocket_client (1.5.0) +NOTICE: [3/7] espressif/led_strip (3.0.3) +NOTICE: [4/7] espressif/libpng (1.6.54) +NOTICE: [5/7] espressif/mdns (1.9.1) +NOTICE: [6/7] espressif/zlib (1.3.1) +NOTICE: [7/7] idf (5.5.2) +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-ssh-stack-candidate/sdkconfig +Loading defaults file /Users/massif/TianshanOS/sdkconfig.defaults... +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:54 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:56 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:64 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:66 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:82 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:84 line was updated to # === L2 NVS 加密配置(HMAC 方案)===n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:159 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:161 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:170 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:172 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:182 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:184 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:193 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:195 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:227 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpywtcf3_o:229 line was updated to # ============================================================================n +-- Compiler supported targets: xtensa-esp-elf +-- Found Python3: /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python (found version "3.12.4") found components: Interpreter +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success +-- Found Threads: TRUE +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success +-- USING O3 +-- App "TianShanOS" version: 0.5.2+3a19128d.09281801 +-- Adding linker script /tmp/tianshan-ssh-stack-candidate/build/esp-idf/esp_system/ld/memory.ld +-- Adding linker script /tmp/tianshan-ssh-stack-candidate/build/esp-idf/esp_system/ld/sections.ld.in +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_master.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_50.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_smp.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_dtm.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_test.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_scan.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Web optimization enabled (minify + gzip) +-- Components: app_trace app_update bootloader bootloader_support bt ch405labs_esp_libssh2 cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi espcoredump espressif__esp_jpeg espressif__esp_websocket_client espressif__led_strip espressif__libpng espressif__mdns espressif__zlib esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread rt sdmmc soc spi_flash spiffs tcp_transport touch_element ts_api ts_auth_layout ts_automation ts_cert ts_config ts_config_pack ts_console ts_core ts_drivers ts_event ts_hal ts_https ts_jsonpath ts_led ts_log ts_mempool ts_net ts_ota ts_pki_client ts_security ts_service ts_storage ts_webui ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/app_trace /Users/massif/esp/v5.5.2/esp-idf/components/app_update /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/bt /Users/massif/TianshanOS/components/ch405labs_esp_libssh2 /Users/massif/esp/v5.5.2/esp-idf/components/cmock /Users/massif/esp/v5.5.2/esp-idf/components/console /Users/massif/esp/v5.5.2/esp-idf/components/cxx /Users/massif/esp/v5.5.2/esp-idf/components/driver /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp-tls /Users/massif/esp/v5.5.2/esp-idf/components/esp_adc /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_coex /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ana_cmpr /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_bitscrambler /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_cam /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_dac /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gpio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gptimer /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2c /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2s /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_isp /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_jpeg /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ledc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_mcpwm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_parlio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_pcnt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ppa /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_rmt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdspi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_spi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_touch_sens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_tsens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_twai /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_uart /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_usb_serial_jtag /Users/massif/esp/v5.5.2/esp-idf/components/esp_eth /Users/massif/esp/v5.5.2/esp-idf/components/esp_event /Users/massif/esp/v5.5.2/esp-idf/components/esp_gdbstub /Users/massif/esp/v5.5.2/esp-idf/components/esp_hid /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_client /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_ota /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_lcd /Users/massif/esp/v5.5.2/esp-idf/components/esp_local_ctrl /Users/massif/esp/v5.5.2/esp-idf/components/esp_mm /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif_stack /Users/massif/esp/v5.5.2/esp-idf/components/esp_partition /Users/massif/esp/v5.5.2/esp-idf/components/esp_phy /Users/massif/esp/v5.5.2/esp-idf/components/esp_pm /Users/massif/esp/v5.5.2/esp-idf/components/esp_psram /Users/massif/esp/v5.5.2/esp-idf/components/esp_ringbuf /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esp_timer /Users/massif/esp/v5.5.2/esp-idf/components/esp_vfs_console /Users/massif/esp/v5.5.2/esp-idf/components/esp_wifi /Users/massif/esp/v5.5.2/esp-idf/components/espcoredump /Users/massif/TianshanOS/managed_components/espressif__esp_jpeg /Users/massif/TianshanOS/managed_components/espressif__esp_websocket_client /Users/massif/TianshanOS/managed_components/espressif__led_strip /Users/massif/TianshanOS/managed_components/espressif__libpng /Users/massif/TianshanOS/managed_components/espressif__mdns /Users/massif/TianshanOS/managed_components/espressif__zlib /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/fatfs /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/heap /Users/massif/esp/v5.5.2/esp-idf/components/http_parser /Users/massif/esp/v5.5.2/esp-idf/components/idf_test /Users/massif/esp/v5.5.2/esp-idf/components/ieee802154 /Users/massif/esp/v5.5.2/esp-idf/components/json /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/lwip /Users/massif/TianshanOS/main /Users/massif/esp/v5.5.2/esp-idf/components/mbedtls /Users/massif/esp/v5.5.2/esp-idf/components/mqtt /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/nvs_flash /Users/massif/esp/v5.5.2/esp-idf/components/nvs_sec_provider /Users/massif/esp/v5.5.2/esp-idf/components/openthread /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/perfmon /Users/massif/esp/v5.5.2/esp-idf/components/protobuf-c /Users/massif/esp/v5.5.2/esp-idf/components/protocomm /Users/massif/esp/v5.5.2/esp-idf/components/pthread /Users/massif/esp/v5.5.2/esp-idf/components/rt /Users/massif/esp/v5.5.2/esp-idf/components/sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/spiffs /Users/massif/esp/v5.5.2/esp-idf/components/tcp_transport /Users/massif/esp/v5.5.2/esp-idf/components/touch_element /Users/massif/TianshanOS/components/ts_api /Users/massif/TianshanOS/components/ts_auth_layout /Users/massif/TianshanOS/components/ts_automation /Users/massif/TianshanOS/components/ts_cert /Users/massif/TianshanOS/components/ts_core/ts_config /Users/massif/TianshanOS/components/ts_config_pack /Users/massif/TianshanOS/components/ts_console /Users/massif/TianshanOS/components/ts_core /Users/massif/TianshanOS/components/ts_drivers /Users/massif/TianshanOS/components/ts_core/ts_event /Users/massif/TianshanOS/components/ts_hal /Users/massif/TianshanOS/components/ts_https /Users/massif/TianshanOS/components/ts_jsonpath /Users/massif/TianshanOS/components/ts_led /Users/massif/TianshanOS/components/ts_core/ts_log /Users/massif/TianshanOS/components/ts_mempool /Users/massif/TianshanOS/components/ts_net /Users/massif/TianshanOS/components/ts_ota /Users/massif/TianshanOS/components/ts_pki_client /Users/massif/TianshanOS/components/ts_security /Users/massif/TianshanOS/components/ts_core/ts_service /Users/massif/TianshanOS/components/ts_storage /Users/massif/TianshanOS/components/ts_webui /Users/massif/esp/v5.5.2/esp-idf/components/ulp /Users/massif/esp/v5.5.2/esp-idf/components/unity /Users/massif/esp/v5.5.2/esp-idf/components/usb /Users/massif/esp/v5.5.2/esp-idf/components/vfs /Users/massif/esp/v5.5.2/esp-idf/components/wear_levelling /Users/massif/esp/v5.5.2/esp-idf/components/wifi_provisioning /Users/massif/esp/v5.5.2/esp-idf/components/wpa_supplicant /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- +-- ╔═══════════════════════════════════════════════════════════╗ +-- ║ TianShanOS v0.5.2+3a19128d.09281801 ║ +-- ║ ESP32 Rack Management Operating System ║ +-- ╚═══════════════════════════════════════════════════════════╝ +-- +-- Version: 0.5.2+3a19128d.09281801 +-- Major: 0 +-- Minor: 5 +-- Patch: 2 +-- Build: 3a19128d.09281801 +-- +-- Target: esp32s3 +-- Build type: +-- +-- Configuring done (6.1s) +-- Generating done (0.7s) +-- Build files have been written to: /tmp/tianshan-ssh-stack-candidate/build +Running ninja in directory /private/tmp/tianshan-ssh-stack-candidate/build +Executing "ninja all"... +[1/1343] Generating project_elf_src_esp32s3.c +[2/1343] Generating ../../ota_data_initial.bin +[3/1343] Generating /tmp/tianshan-ssh-stack-candidate/build/esp-idf/esp_system/ld/memory.ld linker script... +[4/1343] Generating /tmp/tianshan-ssh-stack-candidate/build/esp-idf/esp_system/ld/sections.ld.in linker script... +[5/1343] Copying web assets to build directory +[6/1343] Generating ../../partition_table/partition-table.bin +Partition table binary generated. Contents: +******************************************************************************* +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs,data,nvs,0x9000,48K, +nvs_keys,data,nvs_keys,0x15000,4K, +otadata,data,ota,0x16000,8K, +phy_init,data,phy,0x18000,4K, +ota_0,app,ota_0,0x20000,3M, +ota_1,app,ota_1,0x320000,3M, +storage,data,spiffs,0x620000,512K, +www,data,spiffs,0x6a0000,3M, +fatfs,data,fat,0x9a0000,64K, +******************************************************************************* +[7/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_utils.c.obj +[8/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_header.c.obj +[9/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_auth.c.obj +[10/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/util/ctrl_sock.c.obj +[11/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_internal.c.obj +[12/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_uri.c.obj +[13/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/xip_impl/mmu_psram_flash.c.obj +[14/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_ws.c.obj +[15/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_main.c.obj +[16/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport.c.obj +[17/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_socks_proxy.c.obj +[18/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali.c.obj +[19/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_sess.c.obj +[20/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_parse.c.obj +[21/1343] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_txrx.c.obj +[22/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/system_layer/esp_psram.c.obj +[23/1343] Building C object esp-idf/esp_https_ota/CMakeFiles/__idf_esp_https_ota.dir/src/esp_https_ota.c.obj +[24/1343] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/esp32s3/esp_psram_impl_octal.c.obj +[25/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_common.c.obj +[26/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ssl.c.obj +[27/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_oneshot.c.obj +[28/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp_adc_cal_common_legacy.c.obj +[29/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali_curve_fitting.c.obj +[30/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/esp32s3/curve_fitting_coefficients.c.obj +[31/1343] Linking C static library esp-idf/esp_https_ota/libesp_https_ota.a +[32/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp-tls-crypto/esp_tls_crypto.c.obj +[33/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/gdma/adc_dma.c.obj +[34/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp32s3/esp_adc_cal_legacy.c.obj +[35/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_platform_port.c.obj +[36/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_error_capture.c.obj +[37/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_monitor.c.obj +[38/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_filter.c.obj +[39/1343] Linking C static library esp-idf/esp_http_server/libesp_http_server.a +[40/1343] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_continuous.c.obj +[41/1343] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ws.c.obj +[42/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_legacy.c.obj +[43/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/sigma_delta_legacy.c.obj +[44/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_dma_legacy.c.obj +[45/1343] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/esp_http_client.c.obj +[46/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rtc_temperature_legacy.c.obj +[47/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_mbedtls.c.obj +[48/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/timer_legacy.c.obj +[49/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/touch_sensor_common.c.obj +[50/1343] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls.c.obj +[51/1343] Linking C static library esp-idf/esp_http_client/libesp_http_client.a +[52/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai.c.obj +[53/1343] Linking C static library esp-idf/tcp_transport/libtcp_transport.a +[54/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/pcnt_legacy.c.obj +[55/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/twai/twai.c.obj +[56/1343] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai_onchip.c.obj +[57/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_common.c.obj +[58/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/esp32s3/touch_sensor.c.obj +[59/1343] Building C object esp-idf/esp_driver_tsens/CMakeFiles/__idf_esp_driver_tsens.dir/src/temperature_sensor.c.obj +[60/1343] Building C object esp-idf/esp_driver_sdm/CMakeFiles/__idf_esp_driver_sdm.dir/src/sdm.c.obj +[61/1343] Linking C static library esp-idf/esp_psram/libesp_psram.a +[62/1343] Building C object esp-idf/http_parser/CMakeFiles/__idf_http_parser.dir/http_parser.c.obj +[63/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_slave.c.obj +[64/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/i2s_legacy.c.obj +[65/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder.c.obj +[66/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/i2c/i2c.c.obj +[67/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_crc.c.obj +[68/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_copy.c.obj +[69/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_bytes.c.obj +[70/1343] Linking C static library esp-idf/esp_adc/libesp_adc.a +[71/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_common.c.obj +[72/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_simple.c.obj +[73/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_transaction.c.obj +[74/1343] Linking C static library esp-idf/esp-tls/libesp-tls.a +[75/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_transaction.c.obj +[76/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_init.c.obj +[77/1343] Linking C static library esp-idf/http_parser/libhttp_parser.a +[78/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_common.c.obj +[79/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_io.c.obj +[80/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sd_pwr_ctrl/sd_pwr_ctrl.c.obj +[81/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_mmc.c.obj +[82/1343] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_host.c.obj +[83/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/mcpwm_legacy.c.obj +[84/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_cmd.c.obj +[85/1343] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_master.c.obj +[86/1343] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rmt_legacy.c.obj +[87/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_rx.c.obj +[88/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_platform.c.obj +[89/1343] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_sd.c.obj +[90/1343] Building C object esp-idf/esp_driver_ledc/CMakeFiles/__idf_esp_driver_ledc.dir/src/ledc.c.obj +[91/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cmpr.c.obj +[92/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_std.c.obj +[93/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_com.c.obj +[94/1343] Linking C static library esp-idf/driver/libdriver.a +[95/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_tdm.c.obj +[96/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_sync.c.obj +[97/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_pdm.c.obj +[98/1343] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_host.c.obj +[99/1343] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_tx.c.obj +[100/1343] Linking C static library esp-idf/esp_driver_twai/libesp_driver_twai.a +[101/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub_transport.c.obj +[102/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub.c.obj +[103/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_fault.c.obj +[104/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_oper.c.obj +[105/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/packet.c.obj +[106/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub-entry.S.obj +[107/1343] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/xt_debugexception.S.obj +[108/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_timer.c.obj +[109/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cap.c.obj +[110/1343] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub_xtensa.c.obj +[111/1343] Linking C static library esp-idf/esp_driver_ledc/libesp_driver_ledc.a +[112/1343] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_gen.c.obj +[113/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/lib_printf.c.obj +[114/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/mesh_event.c.obj +[115/1343] Linking C static library esp-idf/esp_driver_i2c/libesp_driver_i2c.a +[116/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig.c.obj +[117/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default_ap.c.obj +[118/1343] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_common.c.obj +[119/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/regulatory/esp_wifi_regulatory.c.obj +[120/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_netif.c.obj +[121/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_init.c.obj +[122/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug_diagram.c.obj +[123/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default.c.obj +[124/1343] Linking C static library esp-idf/esp_driver_sdm/libesp_driver_sdm.a +[125/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug.c.obj +[126/1343] Building C object esp-idf/esp_driver_pcnt/CMakeFiles/__idf_esp_driver_pcnt.dir/src/pulse_cnt.c.obj +[127/1343] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/esp32s3/esp_coex_adapter.c.obj +[128/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig_ack.c.obj +[129/1343] Linking C static library esp-idf/esp_driver_tsens/libesp_driver_tsens.a +[130/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/os_xtensa.c.obj +[131/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ap_config.c.obj +[132/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave.c.obj +[133/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/eloop.c.obj +[134/1343] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/esp32s3/esp_adapter.c.obj +[135/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave_hd.c.obj +[136/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_1x.c.obj +[137/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/comeback_token.c.obj +[138/1343] Linking C static library esp-idf/esp_driver_rmt/libesp_driver_rmt.a +[139/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/sta_info.c.obj +[140/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth_ie.c.obj +[141/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_common.c.obj +[142/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/pmksa_cache_auth.c.obj +[143/1343] Linking C static library esp-idf/esp_driver_sdspi/libesp_driver_sdspi.a +[144/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/bitfield.c.obj +[145/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_11.c.obj +[146/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-kdf.c.obj +[147/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-siv.c.obj +[148/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-gcm.c.obj +[149/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/dragonfly.c.obj +[150/1343] Linking C static library esp-idf/esp_driver_sdmmc/libesp_driver_sdmmc.a +[151/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_group5.c.obj +[152/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/crypto_ops.c.obj +[153/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_groups.c.obj +[154/1343] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_master.c.obj +[155/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/wpa_common.c.obj +[156/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-tlsprf.c.obj +[157/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tlsprf.c.obj +[158/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ccmp.c.obj +[159/1343] Linking C static library esp-idf/sdmmc/libsdmmc.a +[160/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-tlsprf.c.obj +[161/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ms_funcs.c.obj +[162/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-prf.c.obj +[163/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-prf.c.obj +[164/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-prf.c.obj +[165/1343] Linking C static library esp-idf/esp_driver_i2s/libesp_driver_i2s.a +[166/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/md4-internal.c.obj +[167/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_common.c.obj +[168/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_common/eap_wsc_common.c.obj +[169/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/chap.c.obj +[170/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tprf.c.obj +[171/1343] Linking C static library esp-idf/esp_driver_mcpwm/libesp_driver_mcpwm.a +[172/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls.c.obj +[173/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap_common.c.obj +[174/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap.c.obj +[175/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth.c.obj +[176/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/mschapv2.c.obj +[177/1343] Linking C static library esp-idf/esp_driver_pcnt/libesp_driver_pcnt.a +[178/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_common.c.obj +[179/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/ieee802_11_common.c.obj +[180/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_mschapv2.c.obj +[181/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/pmksa_cache.c.obj +[182/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls_common.c.obj +[183/1343] Linking C static library esp-idf/esp_gdbstub/libesp_gdbstub.a +[184/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/ext_password.c.obj +[185/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/base64.c.obj +[186/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_pac.c.obj +[187/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap.c.obj +[188/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/uuid.c.obj +[189/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_ttls.c.obj +[190/1343] Linking C static library esp-idf/esp_driver_spi/libesp_driver_spi.a +[191/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpa_debug.c.obj +[192/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae.c.obj +[193/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/common.c.obj +[194/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa_ie.c.obj +[195/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpabuf.c.obj +[196/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa2_api_port.c.obj +[197/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_process.c.obj +[198/1343] Linking C static library esp-idf/esp_wifi/libesp_wifi.a +[199/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_parse.c.obj +[200/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_build.c.obj +[201/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/json.c.obj +[202/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_common.c.obj +[203/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_dev_attr.c.obj +[204/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps.c.obj +[205/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpas_glue.c.obj +[206/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae_pk.c.obj +[207/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa_main.c.obj +[208/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_owe.c.obj +[209/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_common.c.obj +[210/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_enrollee.c.obj +[211/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_eap_client.c.obj +[212/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast.c.obj +[213/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_hostap.c.obj +[214/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls.c.obj +[215/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpsk.c.obj +[216/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-bignum.c.obj +[217/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa3.c.obj +[218/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wps.c.obj +[219/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/rc4.c.obj +[220/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa.c.obj +[221/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-rsa.c.obj +[222/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_defaults.c.obj +[223/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-wrap.c.obj +[224/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpbkdf2.c.obj +[225/1343] Linking C static library esp-idf/esp_coex/libesp_coex.a +[226/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_objects.c.obj +[227/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/des-internal.c.obj +[228/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-unwrap.c.obj +[229/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_handlers.c.obj +[230/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-ccm.c.obj +[231/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/tls_mbedtls.c.obj +[232/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/wlanif.c.obj +[233/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/err.c.obj +[234/1343] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-ec.c.obj +[235/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip_defaults.c.obj +[236/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/esp_pbuf_ref.c.obj +[237/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/if_api.c.obj +[238/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_sntp.c.obj +[239/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/sntp/sntp.c.obj +[240/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/ethernetif.c.obj +[241/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netbuf.c.obj +[242/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netifapi.c.obj +[243/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netdb.c.obj +[244/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/tcpip.c.obj +[245/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_lib.c.obj +[246/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/sntp/sntp.c.obj +[247/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/init.c.obj +[248/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/def.c.obj +[249/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ip.c.obj +[250/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/netbiosns/netbiosns.c.obj +[251/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/inet_chksum.c.obj +[252/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/mem.c.obj +[253/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/memp.c.obj +[254/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/sys.c.obj +[255/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_msg.c.obj +[256/1343] Linking C static library esp-idf/wpa_supplicant/libwpa_supplicant.a +[257/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/stats.c.obj +[258/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/timeouts.c.obj +[259/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/autoip.c.obj +[260/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/dns.c.obj +[261/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/raw.c.obj +[262/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/icmp.c.obj +[263/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/igmp.c.obj +[264/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/pbuf.c.obj +[265/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_addr.c.obj +[266/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/udp.c.obj +[267/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/netif.c.obj +[268/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/etharp.c.obj +[269/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4.c.obj +[270/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_frag.c.obj +[271/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/dhcp6.c.obj +[272/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/dhcp.c.obj +[273/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ethip6.c.obj +[274/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/inet6.c.obj +[275/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/icmp6.c.obj +[276/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif.c.obj +[277/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ethernet.c.obj +[278/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_frag.c.obj +[279/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_addr.c.obj +[280/1343] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip.c.obj +[281/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif_fdb.c.obj +[282/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_out.c.obj +[283/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_in.c.obj +[284/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_napt.c.obj +[285/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/mld6.c.obj +[286/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/auth.c.obj +[287/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp.c.obj +[288/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ccp.c.obj +[289/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-new.c.obj +[290/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/slipif.c.obj +[291/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-md5.c.obj +[292/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/demand.c.obj +[293/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap_ms.c.obj +[294/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6.c.obj +[295/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eap.c.obj +[296/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eui64.c.obj +[297/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ecp.c.obj +[298/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/sockets.c.obj +[299/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/fsm.c.obj +[300/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipv6cp.c.obj +[301/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppcrypt.c.obj +[302/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipcp.c.obj +[303/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/magic.c.obj +[304/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/lcp.c.obj +[305/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ppp.c.obj +[306/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/multilink.c.obj +[307/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppapi.c.obj +[308/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/mppe.c.obj +[309/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppol2tp.c.obj +[310/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppos.c.obj +[311/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppoe.c.obj +[312/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/upap.c.obj +[313/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/utils.c.obj +[314/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/vj.c.obj +[315/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/tcp_isn_default.c.obj +[316/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/if_index.c.obj +[317/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/arc4.c.obj +[318/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/des.c.obj +[319/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/esp_ping.c.obj +[320/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md4.c.obj +[321/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md5.c.obj +[322/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping.c.obj +[323/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/sockets_ext.c.obj +[324/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/sha1.c.obj +[325/1343] Linking C static library esp-idf/esp_netif/libesp_netif.a +[326/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/acd_dhcp_check.c.obj +[327/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/esp32xx/vfs_lwip.c.obj +[328/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/lwip_default_hooks.c.obj +[329/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/freertos/sys_arch.c.obj +[330/1343] Building C object esp-idf/esp_vfs_console/CMakeFiles/__idf_esp_vfs_console.dir/vfs_console.c.obj +[331/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/debug/lwip_debug.c.obj +[332/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_connection_monitor.c.obj +[333/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/nullfs.c.obj +[334/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/lib_printf.c.obj +[335/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_eventfd.c.obj +[336/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/dhcpserver/dhcpserver.c.obj +[337/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_override.c.obj +[338/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_common.c.obj +[339/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/esp32s3/phy_init_data.c.obj +[340/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping_sock.c.obj +[341/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag.c.obj +[342/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/btbb_init.c.obj +[343/1343] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/nd6.c.obj +[344/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_semihost.c.obj +[345/1343] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_vfs.c.obj +[346/1343] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_init.c.obj +[347/1343] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs.c.obj +[348/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_platform.cpp.obj +[349/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_aes.c.obj +[350/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader.c.obj +[351/1343] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_xts_aes.c.obj +[352/1343] Linking C static library esp-idf/lwip/liblwip.a +[353/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition.cpp.obj +[354/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/default_event_loop.c.obj +[355/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_lookup.cpp.obj +[356/1343] Linking C static library esp-idf/vfs/libvfs.a +[357/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event_private.c.obj +[358/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_wakeup.c.obj +[359/1343] Linking C static library esp-idf/esp_vfs_console/libesp_vfs_console.a +[360/1343] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event.c.obj +[361/1343] Linking C static library esp-idf/esp_driver_usb_serial_jtag/libesp_driver_usb_serial_jtag.a +[362/1343] Linking C static library esp-idf/esp_phy/libesp_phy.a +[363/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uhci.c.obj +[364/1343] Building C object esp-idf/esp_ringbuf/CMakeFiles/__idf_esp_ringbuf.dir/ringbuf.c.obj +[365/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_vfs.c.obj +[366/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer_common.c.obj +[367/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_init.c.obj +[368/1343] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer.c.obj +[369/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer.c.obj +[370/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/ets_timer_legacy.c.obj +[371/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/system_time.c.obj +[372/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_common.c.obj +[373/1343] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_systimer.c.obj +[374/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_exception_stubs.cpp.obj +[375/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_init.cpp.obj +[376/1343] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart.c.obj +[377/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_cond_var.c.obj +[378/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_local_storage.c.obj +[379/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread.c.obj +[380/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_rwlock.c.obj +[381/1343] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_guards.cpp.obj +[382/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/abort.c.obj +[383/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/init.c.obj +[384/1343] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_semaphore.c.obj +[385/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/assert.c.obj +[386/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/poll.c.obj +[387/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/heap.c.obj +[388/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/pthread.c.obj +[389/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/locks.c.obj +[390/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/getentropy.c.obj +[391/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/random.c.obj +[392/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/termios.c.obj +[393/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/sysconf.c.obj +[394/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/scandir.c.obj +[395/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/realpath.c.obj +[396/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/time.c.obj +[397/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/syscalls.c.obj +[398/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/esp_time_impl.c.obj +[399/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_syscalls.c.obj +[400/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/flockfile.c.obj +[401/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_init.c.obj +[402/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/xtensa/stdatomic_s32c1i.c.obj +[403/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/newlib_init.c.obj +[404/1343] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/stdatomic.c.obj +[405/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/heap_idf.c.obj +[406/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_common.c.obj +[407/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/app_startup.c.obj +[408/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_systick.c.obj +[409/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/list.c.obj +[410/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/timers.c.obj +[411/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/queue.c.obj +[412/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/event_groups.c.obj +[413/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/stream_buffer.c.obj +[414/1343] Building ASM object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/portasm.S.obj +[415/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_init.c.obj +[416/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_overlay_os_hook.c.obj +[417/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/port.c.obj +[418/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/freertos_compatibility.c.obj +[419/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions_event_groups.c.obj +[420/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[421/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[422/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions.c.obj +[423/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[424/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[425/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_item_hash_list.cpp.obj +[426/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clk.c.obj +[427/1343] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj +[428/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/hw_random.c.obj +[429/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_ctrl_os.c.obj +[430/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_cxx_api.cpp.obj +[431/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mac_addr.c.obj +[432/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/revision.c.obj +[433/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_locked.cpp.obj +[434/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_gpio_reserve.c.obj +[435/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/regi2c_ctrl.c.obj +[436/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/periph_ctrl.c.obj +[437/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/rtc_module.c.obj +[438/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_clk_tree.c.obj +[439/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/intr_alloc.c.obj +[440/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sar_periph_ctrl_common.c.obj +[441/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/io_mux.c.obj +[442/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_encrypted_partition.cpp.obj +[443/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_simple.cpp.obj +[444/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_types.cpp.obj +[445/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_dma_utils.c.obj +[446/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_clk_tree_common.c.obj +[447/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma_link.c.obj +[448/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modem.c.obj +[449/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_utils.c.obj +[450/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_mspi.c.obj +[451/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_pagemanager.cpp.obj +[452/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_usb.c.obj +[453/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_share_hw_ctrl.c.obj +[454/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/adc_share_hw_ctrl.c.obj +[455/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_console.c.obj +[456/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_manager.cpp.obj +[457/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_bus_lock.c.obj +[458/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_event.c.obj +[459/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_async_memcpy.c.obj +[460/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/systimer.c.obj +[461/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_gpio.c.obj +[462/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/deprecated/gdma_legacy.c.obj +[463/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_wake_stub.c.obj +[464/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/mspi_timing_tuning.c.obj +[465/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_page.cpp.obj +[466/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[467/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/async_memcpy_gdma.c.obj +[468/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[469/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[470/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/power_supply/brownout.c.obj +[471/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[472/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_memprot_conv.c.obj +[473/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[474/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_config.c.obj +[475/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[476/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_lock.c.obj +[477/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clock_output.c.obj +[478/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/sar_periph_ctrl.c.obj +[479/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/init.c.obj +[480/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[481/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma.c.obj +[482/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_by_mspi_delay.c.obj +[483/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[484/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_hmac.c.obj +[485/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_periph_clk.c.obj +[486/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[487/1343] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_ds.c.obj +[488/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[489/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[490/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[491/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/lowpower/port/esp32s3/sleep_cpu.c.obj +[492/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[493/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[494/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[495/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[496/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[497/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[498/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[499/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[500/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[501/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[502/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[503/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[504/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[505/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[506/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[507/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modes.c.obj +[508/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[509/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[510/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[511/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[512/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[513/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[514/1343] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[515/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_storage.cpp.obj +[516/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/esp32s3/memory_layout.c.obj +[517/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[518/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/memory_layout_utils.c.obj +[519/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_lock.c.obj +[520/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[521/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_base.c.obj +[522/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_timestamp.c.obj +[523/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/util.c.obj +[524/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[525/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/multi_heap.c.obj +[526/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_init.c.obj +[527/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[528/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[529/1343] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_api.cpp.obj +[530/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_write.c.obj +[531/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps.c.obj +[532/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/log_level.c.obj +[533/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[534/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[535/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[536/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/tag_log_level.c.obj +[537/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/cache/log_binary_heap.c.obj +[538/1343] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/linked_list/log_linked_list.c.obj +[539/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[540/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[541/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/color_hal.c.obj +[542/1343] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_memprot.c.obj +[543/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[544/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[545/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_encrypt_hal_iram.c.obj +[546/1343] Linking C static library esp-idf/nvs_flash/libnvs_flash.a +[547/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal.c.obj +[548/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/clk_tree_hal.c.obj +[549/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gpio_hal.c.obj +[550/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/systimer_hal.c.obj +[551/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rtc_io_hal.c.obj +[552/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal_iram.c.obj +[553/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/timer_hal.c.obj +[554/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal.c.obj +[555/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal_iram.c.obj +[556/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal.c.obj +[557/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal_iram.c.obj +[558/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rmt_hal.c.obj +[559/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal.c.obj +[560/1343] Linking C static library esp-idf/esp_event/libesp_event.a +[561/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_iram.c.obj +[562/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/pcnt_hal.c.obj +[563/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mcpwm_hal.c.obj +[564/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uhci_hal.c.obj +[565/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdm_hal.c.obj +[566/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdmmc_hal.c.obj +[567/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_top.c.obj +[568/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/lcd_hal.c.obj +[569/1343] Linking C static library esp-idf/esp_driver_uart/libesp_driver_uart.a +[570/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpi_hal.c.obj +[571/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal_common.c.obj +[572/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sha_hal.c.obj +[573/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_oneshot_hal.c.obj +[574/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_ahb_v1.c.obj +[575/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/brownout_hal.c.obj +[576/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2s_hal.c.obj +[577/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal.c.obj +[578/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/aes_hal.c.obj +[579/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal.c.obj +[580/1343] Linking C static library esp-idf/esp_ringbuf/libesp_ringbuf.a +[581/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ds_hal.c.obj +[582/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal.c.obj +[583/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal_iram.c.obj +[584/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hmac_hal.c.obj +[585/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_serial_jtag_hal.c.obj +[586/1343] Linking C static library esp-idf/esp_driver_gptimer/libesp_driver_gptimer.a +[587/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_wrap_hal.c.obj +[588/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/twai_hal_v1.c.obj +[589/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cam_hal.c.obj +[590/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sensor_hal.c.obj +[591/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_gpspi.c.obj +[592/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/touch_sensor_hal.c.obj +[593/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/xt_wdt_hal.c.obj +[594/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[595/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sens_hal.c.obj +[596/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[597/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/rtc_cntl_hal.c.obj +[598/1343] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/tlsf/tlsf.c.obj +[599/1343] Linking C static library esp-idf/esp_timer/libesp_timer.a +[600/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[601/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[602/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[603/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hd_hal.c.obj +[604/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[605/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[606/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[607/1343] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[608/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[609/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal_iram.c.obj +[610/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[611/1343] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[612/1343] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_dwc_hal.c.obj +[613/1343] Linking C static library esp-idf/cxx/libcxx.a +[614/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system_console.c.obj +[615/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[616/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/stack_check.c.obj +[617/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system.c.obj +[618/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/ubsan.c.obj +[619/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_ipc.c.obj +[620/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/system_time.c.obj +[621/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/crosscore_int.c.obj +[622/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup.c.obj +[623/1343] Linking C static library esp-idf/pthread/libpthread.a +[624/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/freertos_hooks.c.obj +[625/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/xt_wdt.c.obj +[626/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/int_wdt.c.obj +[627/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/panic.c.obj +[628/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup_funcs.c.obj +[629/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_routines.S.obj +[630/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_handler.S.obj +[631/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_port.c.obj +[632/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_ipc_isr.c.obj +[633/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/image_process.c.obj +[634/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/panic_handler.c.obj +[635/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_system_chip.c.obj +[636/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_handler_asm.S.obj +[637/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack_asm.S.obj +[638/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers_asm.S.obj +[639/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_arch.c.obj +[640/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt_impl_timergroup.c.obj +[641/1343] Linking C static library esp-idf/newlib/libnewlib.a +[642/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_stubs.c.obj +[643/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack.c.obj +[644/1343] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/highint_hdl.S.obj +[645/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_brownout_hook.c.obj +[646/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/trax.c.obj +[647/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/reset_reason.c.obj +[648/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/apb_backup_dma.c.obj +[649/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers.c.obj +[650/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp32s3/spi_flash_oct_flash_init.c.obj +[651/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_drivers.c.obj +[652/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_hpm_enable.c.obj +[653/1343] Linking C static library esp-idf/freertos/libfreertos.a +[654/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_issi.c.obj +[655/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/cache_err_int.c.obj +[656/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/cpu_start.c.obj +[657/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/system_internal.c.obj +[658/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt.c.obj +[659/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_boya.c.obj +[660/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_gd.c.obj +[661/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_th.c.obj +[662/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_winbond.c.obj +[663/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic.c.obj +[664/1343] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/clk.c.obj +[665/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic_opi.c.obj +[666/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_generic.c.obj +[667/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/memspi_host_driver.c.obj +[668/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[669/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/port/esp32s3/ext_mem_layout.c.obj +[670/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_noos.c.obj +[671/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_ops.c.obj +[672/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/cache_utils.c.obj +[673/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_app.c.obj +[674/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/heap_align_hw.c.obj +[675/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_utils.c.obj +[676/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_mmap.c.obj +[677/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[678/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[679/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[680/1343] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[681/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[682/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_msync.c.obj +[683/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[684/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[685/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[686/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[687/1343] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[688/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_spi_init.c.obj +[689/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[690/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[691/1343] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_mmu_map.c.obj +[692/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[693/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[694/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/secure_boot_secure_features.c.obj +[695/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[696/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[697/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[698/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[699/1343] Linking C static library esp-idf/esp_security/libesp_security.a +[700/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[701/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[702/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[703/1343] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_api.c.obj +[704/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[705/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[706/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[707/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[708/1343] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_startup.c.obj +[709/1343] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[710/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_app_desc.c.obj +[711/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/debug.c.obj +[712/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_reader.c.obj +[713/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition_target.c.obj +[714/1343] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[715/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_trace.c.obj +[716/1343] Linking C static library esp-idf/soc/libsoc.a +[717/1343] Building C object esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj +[718/1343] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition.c.obj +[719/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_keys.c.obj +[720/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_server.c.obj +[721/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_client.c.obj +[722/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cache.c.obj +[723/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_debug_helpers_generated.c.obj +[724/1343] Linking C static library esp-idf/heap/libheap.a +[725/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cookie.c.obj +[726/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_client.c.obj +[727/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_generic.c.obj +[728/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ciphersuites.c.obj +[729/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ticket.c.obj +[730/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_platform_time.c.obj +[731/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/mbedtls_debug.c.obj +[732/1343] Linking C static library esp-idf/log/liblog.a +[733/1343] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj +[734/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_client.c.obj +[735/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write.c.obj +[736/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_create.c.obj +[737/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesni.c.obj +[738/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_crt.c.obj +[739/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesce.c.obj +[740/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_csr.c.obj +[741/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/pkcs7.c.obj +[742/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crl.c.obj +[743/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_csr.c.obj +[744/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aes.c.obj +[745/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/net_sockets.c.obj +[746/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod.c.obj +[747/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aria.c.obj +[748/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1parse.c.obj +[749/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod_raw.c.obj +[750/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/base64.c.obj +[751/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_msg.c.obj +[752/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_server.c.obj +[753/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/block_cipher.c.obj +[754/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1write.c.obj +[755/1343] Linking C static library esp-idf/hal/libhal.a +[756/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/camellia.c.obj +[757/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chacha20.c.obj +[758/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509.c.obj +[759/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chachapoly.c.obj +[760/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_core.c.obj +[761/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ccm.c.obj +[762/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/des.c.obj +[763/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/constant_time.c.obj +[764/1343] Linking C static library esp-idf/esp_rom/libesp_rom.a +[765/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/dhm.c.obj +[766/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdh.c.obj +[767/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher_wrap.c.obj +[768/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecjpake.c.obj +[769/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cmac.c.obj +[770/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ctr_drbg.c.obj +[771/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves_new.c.obj +[772/1343] Linking C static library esp-idf/esp_common/libesp_common.a +[773/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdsa.c.obj +[774/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy_poll.c.obj +[775/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls.c.obj +[776/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hkdf.c.obj +[777/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy.c.obj +[778/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hmac_drbg.c.obj +[779/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/memory_buffer_alloc.c.obj +[780/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/error.c.obj +[781/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher.c.obj +[782/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/nist_kw.c.obj +[783/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md5.c.obj +[784/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lmots.c.obj +[785/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crt.c.obj +[786/1343] Linking C static library esp-idf/esp_system/libesp_system.a +[787/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum.c.obj +[788/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/padlock.c.obj +[789/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp.c.obj +[790/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_ecc.c.obj +[791/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pem.c.obj +[792/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs12.c.obj +[793/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/gcm.c.obj +[794/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md.c.obj +[795/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lms.c.obj +[796/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/oid.c.obj +[797/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs5.c.obj +[798/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform_util.c.obj +[799/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/poly1305.c.obj +[800/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves.c.obj +[801/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform.c.obj +[802/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_wrap.c.obj +[803/1343] Linking C static library esp-idf/spi_flash/libspi_flash.a +[804/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk.c.obj +[805/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkwrite.c.obj +[806/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_aead.c.obj +[807/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_client.c.obj +[808/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_driver_wrappers_no_static.c.obj +[809/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_cipher.c.obj +[810/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_pake.c.obj +[811/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_se.c.obj +[812/1343] Linking C static library esp-idf/esp_mm/libesp_mm.a +[813/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkparse.c.obj +[814/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_mac.c.obj +[815/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ffdh.c.obj +[816/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_hash.c.obj +[817/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_rsa.c.obj +[818/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ecp.c.obj +[819/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_its_file.c.obj +[820/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ripemd160.c.obj +[821/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_storage.c.obj +[822/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha3.c.obj +[823/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/threading.c.obj +[824/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha1.c.obj +[825/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa_alt_helpers.c.obj +[826/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/timing.c.obj +[827/1343] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[828/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha512.c.obj +[829/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version.c.obj +[830/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_util.c.obj +[831/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version_features.c.obj +[832/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_slot_management.c.obj +[833/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_gdma_impl.c.obj +[834/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha_gdma_impl.c.obj +[835/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha256.c.obj +[836/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hardware.c.obj +[837/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_mem.c.obj +[838/1343] Linking C static library esp-idf/efuse/libefuse.a +[839/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_timing.c.obj +[840/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_xts.c.obj +[841/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c.obj +[842/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_common.c.obj +[843/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/esp_sha.c.obj +[844/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hmac_pbkdf2.c.obj +[845/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes.c.obj +[846/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_dma_core.c.obj +[847/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_ds_common.c.obj +[848/1343] Linking C static library esp-idf/esp_partition/libesp_partition.a +[849/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/sha.c.obj +[850/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c.obj +[851/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c.obj +[852/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/bignum_alt.c.obj +[853/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/esp_bignum.c.obj +[854/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha256.c.obj +[855/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha1.c.obj +[856/1343] Creating directories for 'bootloader' +[857/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/md/esp_md.c.obj +[858/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha512.c.obj +[859/1343] Linking C static library esp-idf/app_update/libapp_update.a +[860/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/x25519.c.obj +[861/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_gcm.c.obj +[862/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/Hacl_Curve25519_joined.c.obj +[863/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m_driver_entrypoints.c.obj +[864/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m/p256-m.c.obj +[865/1343] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/everest.c.obj +[866/1343] No download step for 'bootloader' +[867/1343] No update step for 'bootloader' +[868/1343] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[869/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa.c.obj +[870/1343] No patch step for 'bootloader' +[871/1343] Linking C static library esp-idf/esp_app_format/libesp_app_format.a +[872/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedtls.a +[873/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedx509.a +[874/1343] Minifying + gzipping web resources +Minifying web resources in /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui/web_optimized... + JS js/terminal.js: 31,108 -> 20,066 (35.5% saved) + JS js/router.js: 6,414 -> 3,839 (40.1% saved) + JS js/dragSort.js: 11,460 -> 7,603 (33.7% saved) + JS js/api.js: 36,638 -> 24,339 (33.6% saved) + JS js/i18n.js: 7,208 -> 4,320 (40.1% saved) + JS js/app.js: 1,129,944 -> 840,829 (25.6% saved) + JS js/lang/en-US.js: 178,439 -> 143,161 (19.8% saved) + JS js/lang/zh-CN.js: 172,046 -> 137,314 (20.2% saved) + CSS css/style.css: 179,071 -> 129,275 (27.8% saved) + CSS fonts/remixicon.css: 5,940 -> 4,860 (18.2% saved) + + Total saved: 442,662 bytes (432.3 KB) + +Gzipping web resources in /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui/web_optimized... + GZ js/terminal.js: 20,066 -> 5,565 (72.3% smaller) + GZ js/router.js: 3,839 -> 1,340 (65.1% smaller) + GZ js/dragSort.js: 7,603 -> 1,869 (75.4% smaller) + GZ js/api.js: 24,339 -> 6,163 (74.7% smaller) + GZ js/i18n.js: 4,320 -> 1,460 (66.2% smaller) + GZ js/app.js: 840,829 -> 167,747 (80.0% smaller) + GZ js/lang/en-US.js: 143,161 -> 43,017 (70.0% smaller) + GZ js/lang/zh-CN.js: 137,314 -> 45,286 (67.0% smaller) + GZ vendor/xterm/fit.min.js: 1,789 -> 822 (54.1% smaller) + GZ vendor/xterm/xterm.min.js: 283,670 -> 65,684 (76.8% smaller) + GZ css/style.css: 129,275 -> 20,658 (84.0% smaller) + GZ fonts/remixicon.css: 4,860 -> 1,263 (74.0% smaller) + GZ vendor/xterm/xterm.css: 5,383 -> 2,037 (62.2% smaller) + GZ index.html: 26,676 -> 7,261 (72.8% smaller) + + Gzipped 14 files: 1,633,124 -> 370,172 (77.3% overall) +Done. +[875/1343] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto.c.obj +[876/1343] cd /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-ssh-stack-candidate/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +[877/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +[878/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/p256-m/libp256m.a +[879/1343] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/everest/libeverest.a +[880/1343] Generating x509_crt_bundle +[881/1343] Generating ../../x509_crt_bundle.S +[882/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_context.S.obj +[883/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr_asm.S.obj +[884/1343] Building ASM object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/__/__/x509_crt_bundle.S.obj +[885/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[886/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[887/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_trace.c.obj +[888/1343] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr.c.obj +[889/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_glitch_filter_ops.c.obj +[890/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_pin_glitch_filter.c.obj +[891/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_locks.c.obj +[892/1343] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_vectors.S.obj +[893/1343] Building C object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/esp_crt_bundle/esp_crt_bundle.c.obj +[894/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/crc32.cpp.obj +[895/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/dedic_gpio.c.obj +[896/1343] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_impl.c.obj +[897/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Perf.cpp.obj +[898/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/SPI_Flash.cpp.obj +[899/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio.c.obj +[900/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/rtc_io.c.obj +[901/1343] Linking C static library esp-idf/mbedtls/libmbedtls.a +[902/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/Partition.cpp.obj +[903/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_wl.c.obj +[904/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_rawflash.c.obj +[905/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Safe.cpp.obj +[906/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ffunicode.c.obj +[907/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/port/freertos/ffsystem.c.obj +[908/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_sdmmc.c.obj +[909/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/wear_levelling.cpp.obj +[910/1343] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio.c.obj +[911/1343] Linking C static library esp-idf/esp_pm/libesp_pm.a +[912/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_cache.c.obj +[913/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_spiflash.c.obj +[914/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_sdmmc.c.obj +[915/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs_api.c.obj +[916/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_gc.c.obj +[917/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_common.c.obj +[918/1343] Linking C static library esp-idf/esp_driver_gpio/libesp_driver_gpio.a +[919/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_hydrogen.c.obj +[920/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/commands.c.obj +[921/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/split_argv.c.obj +[922/1343] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Flash.cpp.obj +[923/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_cmd.c.obj +[924/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat.c.obj +[925/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dbl.c.obj +[926/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_chip.c.obj +[927/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_check.c.obj +[928/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/esp_spiffs.c.obj +[929/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/linenoise/linenoise.c.obj +[930/1343] Linking C static library esp-idf/xtensa/libxtensa.a +[931/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_internal.c.obj +[932/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_file.c.obj +[933/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dstr.c.obj +[934/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_end.c.obj +[935/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_int.c.obj +[936/1343] Linking C static library esp-idf/wear_levelling/libwear_levelling.a +[937/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rem.c.obj +[938/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_hashtable.c.obj +[939/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rex.c.obj +[940/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_date.c.obj +[941/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_lit.c.obj +[942/1343] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_nucleus.c.obj +[943/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_str.c.obj +[944/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/argtable3.c.obj +[945/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth_netif_glue.c.obj +[946/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/compress.c.obj +[947/1343] Linking C static library esp-idf/spiffs/libspiffs.a +[948/1343] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_utils.c.obj +[949/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/adler32.c.obj +[950/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth.c.obj +[951/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/crc32.c.obj +[952/1343] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ff.c.obj +[953/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzclose.c.obj +[954/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/phy/esp_eth_phy_802_3.c.obj +[955/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inffast.c.obj +[956/1343] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON_Utils.c.obj +[957/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzwrite.c.obj +[958/1343] Linking C static library esp-idf/fatfs/libfatfs.a +[959/1343] Building C object esp-idf/ts_event/CMakeFiles/__idf_ts_event.dir/src/ts_event.c.obj +[960/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzlib.c.obj +[961/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inftrees.c.obj +[962/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_phy_w5500.c.obj +[963/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/uncompr.c.obj +[964/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/zutil.c.obj +[965/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzread.c.obj +[966/1343] Linking C static library esp-idf/ts_event/libts_event.a +[967/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/infback.c.obj +[968/1343] Linking C static library esp-idf/console/libconsole.a +[969/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_encoder.c.obj +[970/1343] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_mac_w5500.c.obj +[971/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/trees.c.obj +[972/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_dev.c.obj +[973/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/example.c.obj +[974/1343] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON.c.obj +[975/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/deflate.c.obj +[976/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_api.c.obj +[977/1343] Building C object esp-idf/esp_https_server/CMakeFiles/__idf_esp_https_server.dir/src/https_server.c.obj +[978/1343] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inflate.c.obj +[979/1343] Building C object esp-idf/ts_log/CMakeFiles/__idf_ts_log.dir/src/ts_log.c.obj +[980/1343] Building C object esp-idf/espressif__esp_jpeg/CMakeFiles/__idf_espressif__esp_jpeg.dir/jpeg_decoder.c.obj +[981/1343] Linking C static library esp-idf/json/libjson.a +[982/1343] Linking C static library esp-idf/esp_eth/libesp_eth.a +[983/1343] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_spi_dev.c.obj +[984/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngmem.c.obj +[985/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrio.c.obj +[986/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngpread.c.obj +[987/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngerror.c.obj +[988/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtrans.c.obj +[989/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwio.c.obj +[990/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngget.c.obj +[991/1343] Linking C static library esp-idf/espressif__zlib/libespressif__zlib.a +[992/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwtran.c.obj +[993/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngset.c.obj +[994/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/png.c.obj +[995/1343] Building C object esp-idf/espressif__esp_websocket_client/CMakeFiles/__idf_espressif__esp_websocket_client.dir/esp_websocket_client.c.obj +[996/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_mem_caps.c.obj +[997/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtest.c.obj +[998/1343] Building C object esp-idf/ts_jsonpath/CMakeFiles/__idf_ts_jsonpath.dir/src/ts_jsonpath.c.obj +[999/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwrite.c.obj +[1000/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_networking_lwip.c.obj +[1001/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/blowfish.c.obj +[1002/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngread.c.obj +[1003/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent_win.c.obj +[1004/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/bcrypt_pbkdf.c.obj +[1005/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwutil.c.obj +[1006/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrutil.c.obj +[1007/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent.c.obj +[1008/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/global.c.obj +[1009/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/hostkey.c.obj +[1010/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_console.c.obj +[1011/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/comp.c.obj +[1012/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/crypt.c.obj +[1013/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/keepalive.c.obj +[1014/1343] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrtran.c.obj +[1015/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/libgcrypt.c.obj +[1016/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/openssl.c.obj +[1017/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mac.c.obj +[1018/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mbedtls.c.obj +[1019/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/channel.c.obj +[1020/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/misc.c.obj +[1021/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/os400qc3.c.obj +[1022/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/knownhost.c.obj +[1023/1343] Linking C static library esp-idf/ts_log/libts_log.a +[1024/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/scp.c.obj +[1025/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/pem.c.obj +[1026/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth_kbd_packet.c.obj +[1027/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/wincng.c.obj +[1028/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/version.c.obj +[1029/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/packet.c.obj +[1030/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/transport.c.obj +[1031/1343] Linking C static library esp-idf/espressif__esp_websocket_client/libespressif__esp_websocket_client.a +[1032/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/publickey.c.obj +[1033/1343] Building C object esp-idf/ts_service/CMakeFiles/__idf_ts_service.dir/src/ts_service.c.obj +[1034/1343] Linking C static library esp-idf/esp_https_server/libesp_https_server.a +[1035/1343] Linking C static library esp-idf/espressif__led_strip/libespressif__led_strip.a +[1036/1343] Building C object esp-idf/ts_mempool/CMakeFiles/__idf_ts_mempool.dir/src/ts_mempool.c.obj +[1037/1343] Linking C static library esp-idf/espressif__esp_jpeg/libespressif__esp_jpeg.a +[1038/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/session.c.obj +[1039/1343] Linking C static library esp-idf/ts_jsonpath/libts_jsonpath.a +[1040/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_meta.c.obj +[1041/1343] Linking C static library esp-idf/espressif__libpng/libespressif__libpng.a +[1042/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_json.c.obj +[1043/1343] Linking C static library esp-idf/ts_mempool/libts_mempool.a +[1044/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth.c.obj +[1045/1343] Linking C static library esp-idf/ts_service/libts_service.a +[1046/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_nvs.c.obj +[1047/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_schemas.c.obj +[1048/1343] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert_time.c.obj +[1049/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/kex.c.obj +[1050/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_file.c.obj +[1051/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config.c.obj +[1052/1343] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/sftp.c.obj +[1053/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_security.c.obj +[1054/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_auth.c.obj +[1055/1343] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_module.c.obj +[1056/1343] Building C object esp-idf/ts_config_pack/CMakeFiles/__idf_ts_config_pack.dir/src/ts_config_pack.c.obj +[1057/1343] Linking C static library esp-idf/ch405labs_esp_libssh2/libch405labs_esp_libssh2.a +[1058/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_known_hosts.c.obj +[1059/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_log_watch.c.obj +[1060/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_shell.c.obj +[1061/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_crypto.c.obj +[1062/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_probe.c.obj +[1063/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_client.c.obj +[1064/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_scp.c.obj +[1065/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_keystore.c.obj +[1066/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_port_forward.c.obj +[1067/1343] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert.c.obj +[1068/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_sftp.c.obj +[1069/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_hosts_config.c.obj +[1070/1343] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns.c.obj +[1071/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_automation.c.obj +[1072/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_store.c.obj +[1073/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_variable.c.obj +[1074/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_compat.c.obj +[1075/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_commands_config.c.obj +[1076/1343] Linking C static library esp-idf/espressif__mdns/libespressif__mdns.a +[1077/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_codec.c.obj +[1078/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_freertos.c.obj +[1079/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_cache.c.obj +[1080/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_memory.c.obj +[1081/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_port_esp32.c.obj +[1082/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity/src/unity.c.obj +[1083/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/constants.pb-c.c.obj +[1084/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_runner.c.obj +[1085/1343] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/port/esp/unity_utils_memory_esp.c.obj +[1086/1343] Linking C static library esp-idf/ts_config/libts_config.a +[1087/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec0.pb-c.c.obj +[1088/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/common/protocomm.c.obj +[1089/1343] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_service.c.obj +[1090/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/session.pb-c.c.obj +[1091/1343] Linking C static library esp-idf/ts_config_pack/libts_config_pack.a +[1092/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec1.pb-c.c.obj +[1093/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_console.c.obj +[1094/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security0.c.obj +[1095/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec2.pb-c.c.obj +[1096/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security1.c.obj +[1097/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_httpd.c.obj +[1098/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp.c.obj +[1099/1343] Linking C static library esp-idf/ts_cert/libts_cert.a +[1100/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace.c.obj +[1101/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp_mpi.c.obj +[1102/1343] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security2.c.obj +[1103/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/host_file_io.c.obj +[1104/1343] Building C object esp-idf/cmock/CMakeFiles/__idf_cmock.dir/CMock/src/cmock.c.obj +[1105/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace_util.c.obj +[1106/1343] Linking C static library esp-idf/unity/libunity.a +[1107/1343] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/port/port_uart.c.obj +[1108/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp_share_ctrl.c.obj +[1109/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/esp_cam_ctlr.c.obj +[1110/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_gdma.c.obj +[1111/1343] Building C object esp-idf/protobuf-c/CMakeFiles/__idf_protobuf-c.dir/protobuf-c/protobuf-c/protobuf-c.c.obj +[1112/1343] Linking C static library esp-idf/ts_security/libts_security.a +[1113/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidd.c.obj +[1114/1343] Linking C static library esp-idf/protobuf-c/libprotobuf-c.a +[1115/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_common.c.obj +[1116/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hid_common.c.obj +[1117/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_io.c.obj +[1118/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_engine.c.obj +[1119/1343] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/common/touch_sens_common.c.obj +[1120/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ssd1306.c.obj +[1121/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ops.c.obj +[1122/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_st7789.c.obj +[1123/1343] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidh.c.obj +[1124/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_source_manager.c.obj +[1125/1343] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/hw_ver2/touch_version_specific.c.obj +[1126/1343] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_cam.c.obj +[1127/1343] Linking C static library esp-idf/protocomm/libprotocomm.a +[1128/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_init.c.obj +[1129/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v1.c.obj +[1130/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/proto-c/esp_local_ctrl.pb-c.c.obj +[1131/1343] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_action_manager.c.obj +[1132/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/spi/esp_lcd_panel_io_spi.c.obj +[1133/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl.c.obj +[1134/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_handler.c.obj +[1135/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_nt35510.c.obj +[1136/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v2.c.obj +[1137/1343] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_transport_httpd.c.obj +[1138/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_common.c.obj +[1139/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_sha.c.obj +[1140/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_crc.c.obj +[1141/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_flash.c.obj +[1142/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_uart.c.obj +[1143/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_binary.c.obj +[1144/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/port/xtensa/core_dump_port.c.obj +[1145/1343] Linking C static library esp-idf/ts_automation/libts_automation.a +[1146/1343] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_elf.c.obj +[1147/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_access.c.obj +[1148/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_masks.c.obj +[1149/1343] Generating ../../lpmu-agx-network-setup.tar.gz.S +[1150/1343] Building C object esp-idf/nvs_sec_provider/CMakeFiles/__idf_nvs_sec_provider.dir/nvs_sec_provider.c.obj +[1151/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/platform_esp32_idf.c.obj +[1152/1343] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_apis.c.obj +[1153/1343] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_utils.c.obj +[1154/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i80/esp_lcd_panel_io_i80.c.obj +[1155/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_button.c.obj +[1156/1343] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_mqueue.c.obj +[1157/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_outbox.c.obj +[1158/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_slider.c.obj +[1159/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config.c.obj +[1160/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_msg.c.obj +[1161/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_matrix.c.obj +[1162/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api.c.obj +[1163/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_network.c.obj +[1164/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_fan.c.obj +[1165/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_service.c.obj +[1166/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_system.c.obj +[1167/1343] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_element.c.obj +[1168/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_power.c.obj +[1169/1343] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/rgb/esp_lcd_panel_rgb.c.obj +[1170/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config_pack.c.obj +[1171/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_device.c.obj +[1172/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_monitor.c.obj +[1173/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_temp.c.obj +[1174/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_gpio.c.obj +[1175/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_dhcp.c.obj +[1176/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_nat.c.obj +[1177/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_storage.c.obj +[1178/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_hosts.c.obj +[1179/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_led.c.obj +[1180/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_time.c.obj +[1181/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_key.c.obj +[1182/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_sftp.c.obj +[1183/1343] Building ASM object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/__/__/lpmu-agx-network-setup.tar.gz.S.obj +[1184/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_wifi.c.obj +[1185/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_lpmu_access.c.obj +[1186/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_auth.c.obj +[1187/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ui.c.obj +[1188/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_log.c.obj +[1189/1343] Performing configure step for 'bootloader' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-ssh-stack-candidate/sdkconfig +-- Compiler supported targets: xtensa-esp-elf +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Bootloader project name: "bootloader" version: 1 +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.rom.ld +-- Components: bootloader bootloader_support efuse esp_app_format esp_bootloader_format esp_common esp_hw_support esp_rom esp_security esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/components/micro-ecc /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld +-- Configuring done (6.7s) +-- Generating done (0.3s) +-- Build files have been written to: /tmp/tianshan-ssh-stack-candidate/build/bootloader +[1190/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_api.c.obj +[1191/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui.c.obj +[1192/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_cert.c.obj +[1193/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https.c.obj +[1194/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_operation.c.obj +[1195/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_i18n.c.obj +[1196/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console.c.obj +[1197/1343] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/mqtt_client.c.obj +[1198/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_args.c.obj +[1199/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ota.c.obj +[1200/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_script.c.obj +[1201/1343] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_auth.c.obj +[1202/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_api.c.obj +[1203/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_builtin.c.obj +[1204/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_monitor.c.obj +[1205/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_subscriptions.c.obj +[1206/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_device.c.obj +[1207/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fs.c.obj +[1208/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ssh.c.obj +[1209/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fan.c.obj +[1210/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_auto.c.obj +[1211/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_key.c.obj +[1212/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_nat.c.obj +[1213/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_hosts.c.obj +[1214/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_dhcp.c.obj +[1215/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_transport.c.obj +[1216/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_register.c.obj +[1217/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/linenoise/linenoise.c.obj +[1218/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_gpio.c.obj +[1219/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_config.c.obj +[1220/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ota.c.obj +[1221/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_power.c.obj +[1222/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_storage.c.obj +[1223/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_pki.c.obj +[1224/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_temp.c.obj +[1225/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_service.c.obj +[1226/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_net.c.obj +[1227/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_system.c.obj +[1228/1343] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_ws.c.obj +[1229/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_sftp.c.obj +[1230/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_voltprot.c.obj +[1231/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_version.c.obj +[1232/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota.c.obj +[1233/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_rollback.c.obj +[1234/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_wifi.c.obj +[1235/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ssh.c.obj +[1236/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_sdcard.c.obj +[1237/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net.c.obj +[1238/1343] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_led.c.obj +[1239/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_recovery.c.obj +[1240/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_eth.c.obj +[1241/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net_manager.c.obj +[1242/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_wifi.c.obj +[1243/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_https.c.obj +[1244/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led.c.obj +[1245/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_nat.c.obj +[1246/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_time_sync.c.obj +[1247/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_https_server.c.obj +[1248/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_driver.c.obj +[1249/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_http_server.c.obj +[1250/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_layer.c.obj +[1251/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color.c.obj +[1252/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_download.c.obj +[1253/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_qrcode.c.obj +[1254/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_animation.c.obj +[1255/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_drivers.c.obj +[1256/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_font.c.obj +[1257/1343] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_automation.c.obj +[1258/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_effect.c.obj +[1259/1343] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_www.c.obj +[1260/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_text.c.obj +[1261/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color_correction.c.obj +[1262/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_usb_mux.c.obj +[1263/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_monitor.c.obj +[1264/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power.c.obj +[1265/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_preset.c.obj +[1266/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/qrcodegen/qrcodegen.c.obj +[1267/1343] Linking C static library esp-idf/ts_api/libts_api.a +[1268/1343] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_dhcp_server.c.obj +[1269/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_hal.c.obj +[1270/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_i2c.c.obj +[1271/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_temp_source.c.obj +[1272/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_gpio.c.obj +[1273/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pwm.c.obj +[1274/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_device_ctrl.c.obj +[1275/1343] Linking C static library esp-idf/ts_https/libts_https.a +[1276/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pin_manager.c.obj +[1277/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_fan.c.obj +[1278/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/platform/esp32s3/ts_platform_s3.c.obj +[1279/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_compute_monitor.c.obj +[1280/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_spi.c.obj +[1281/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_adc.c.obj +[1282/1343] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_image.c.obj +[1283/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_spiffs.c.obj +[1284/1343] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_policy.c.obj +[1285/1343] Linking C static library esp-idf/ts_webui/libts_webui.a +[1286/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_helpers.c.obj +[1287/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage.c.obj +[1288/1343] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_uart.c.obj +[1289/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_private.c.obj +[1290/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hub.c.obj +[1291/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_ctrl.c.obj +[1292/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/enum.c.obj +[1293/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_phy.c.obj +[1294/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_config.c.obj +[1295/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_scan.c.obj +[1296/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/handlers.c.obj +[1297/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_config.pb-c.c.obj +[1298/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_console.c.obj +[1299/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_scan.pb-c.c.obj +[1300/1343] Linking C static library esp-idf/ts_console/libts_console.a +[1301/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_constants.pb-c.c.obj +[1302/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_ctrl.pb-c.c.obj +[1303/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usbh.c.obj +[1304/1343] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_sd.c.obj +[1305/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_host.c.obj +[1306/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_softap.c.obj +[1307/1343] Building C object esp-idf/ts_pki_client/CMakeFiles/__idf_ts_pki_client.dir/src/ts_pki_client.c.obj +[1308/1343] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hcd_dwc.c.obj +[1309/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj +[1310/1343] Linking C static library esp-idf/cmock/libcmock.a +[1311/1343] Linking C static library esp-idf/app_trace/libapp_trace.a +[1312/1343] Linking C static library esp-idf/ts_ota/libts_ota.a +[1313/1343] Linking C static library esp-idf/esp_driver_cam/libesp_driver_cam.a +[1314/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_core_init.c.obj +[1315/1343] Linking C static library esp-idf/esp_driver_touch_sens/libesp_driver_touch_sens.a +[1316/1343] Linking C static library esp-idf/esp_hid/libesp_hid.a +[1317/1343] Linking C static library esp-idf/espcoredump/libespcoredump.a +[1318/1343] Linking C static library esp-idf/esp_local_ctrl/libesp_local_ctrl.a +[1319/1343] Linking C static library esp-idf/mqtt/libmqtt.a +[1320/1343] Linking C static library esp-idf/rt/librt.a +[1321/1343] Linking C static library esp-idf/perfmon/libperfmon.a +[1322/1343] Linking C static library esp-idf/esp_lcd/libesp_lcd.a +[1323/1343] Linking C static library esp-idf/nvs_sec_provider/libnvs_sec_provider.a +[1324/1343] Linking C static library esp-idf/touch_element/libtouch_element.a +[1325/1343] Linking C static library esp-idf/ts_net/libts_net.a +[1326/1343] Linking C static library esp-idf/usb/libusb.a +[1327/1343] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_services.c.obj +[1328/1343] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/manager.c.obj +[1329/1343] Linking C static library esp-idf/ts_led/libts_led.a +[1330/1343] Linking C static library esp-idf/wifi_provisioning/libwifi_provisioning.a +[1331/1343] Linking C static library esp-idf/ts_drivers/libts_drivers.a +[1332/1343] Linking C static library esp-idf/ts_hal/libts_hal.a +[1333/1343] Linking C static library esp-idf/ts_storage/libts_storage.a +[1334/1343] Linking C static library esp-idf/ts_pki_client/libts_pki_client.a +[1335/1343] Linking C static library esp-idf/main/libmain.a +[1336/1343] Performing build step for 'bootloader' +[1/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[2/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/util.c.obj +[3/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[4/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_timestamp.c.obj +[5/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_lock.c.obj +[6/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[7/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[8/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[9/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[10/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[11/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[12/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[13/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[14/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[15/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[16/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[17/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[18/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[19/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[20/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[21/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[22/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[23/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[24/123] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[25/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[26/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[27/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[28/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[29/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[30/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[31/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[32/123] Linking C static library esp-idf/log/liblog.a +[33/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[34/123] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[35/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[36/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[37/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[38/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[39/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[40/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[41/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[42/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[43/123] Linking C static library esp-idf/esp_rom/libesp_rom.a +[44/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[45/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[46/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[47/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[48/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[49/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[50/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[51/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[52/123] Linking C static library esp-idf/esp_common/libesp_common.a +[53/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[54/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[55/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj +[56/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[57/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[58/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_soc.c.obj +[59/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj +[60/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj +[61/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[62/123] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[63/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[64/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj +[65/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[66/123] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[67/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[68/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[69/123] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[70/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[71/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_esp32s3.c.obj +[72/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj +[73/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[74/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[75/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[76/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[77/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[78/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[79/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[80/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[81/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[82/123] Linking C static library esp-idf/esp_system/libesp_system.a +[83/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[84/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[85/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[86/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[87/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[88/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[89/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[90/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[91/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[92/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[93/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[94/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[95/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[96/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[97/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[98/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[99/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[100/123] Generating project_elf_src_esp32s3.c +[101/123] Linking C static library esp-idf/efuse/libefuse.a +[102/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[103/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[104/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[105/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[106/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[107/123] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32s3.c.obj +[108/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[109/123] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj +[110/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[111/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[112/123] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[113/123] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[114/123] Linking C static library esp-idf/spi_flash/libspi_flash.a +[115/123] Linking C static library esp-idf/hal/libhal.a +[116/123] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj +[117/123] Linking C static library esp-idf/micro-ecc/libmicro-ecc.a +[118/123] Linking C static library esp-idf/soc/libsoc.a +[119/123] Linking C static library esp-idf/xtensa/libxtensa.a +[120/123] Linking C static library esp-idf/main/libmain.a +[121/123] Linking C executable bootloader.elf +[122/123] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-ssh-stack-candidate/build/bootloader/bootloader.bin +[123/123] cd /tmp/tianshan-ssh-stack-candidate/build/bootloader/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /tmp/tianshan-ssh-stack-candidate/build/bootloader/bootloader.bin +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[1337/1343] No install step for 'bootloader' +[1338/1343] Completed 'bootloader' +[1339/1343] Generating esp-idf/esp_system/ld/sections.ld +[1340/1343] Building C object CMakeFiles/TianShanOS.elf.dir/project_elf_src_esp32s3.c.obj +[1341/1343] Linking CXX executable TianShanOS.elf +[1342/1343] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-ssh-stack-candidate/build/TianShanOS.bin +[1343/1343] cd /tmp/tianshan-ssh-stack-candidate/build/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 partition --type app /tmp/tianshan-ssh-stack-candidate/build/partition_table/partition-table.bin /tmp/tianshan-ssh-stack-candidate/build/TianShanOS.bin +TianShanOS.bin binary size 0x215120 bytes. Smallest app partition is 0x300000 bytes. 0xeaee0 bytes (31%) free. + +Project build complete. To flash, run: + idf.py flash +or + idf.py -p PORT flash +or + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m 0x0 ../../../private/tmp/tianshan-ssh-stack-candidate/build/bootloader/bootloader.bin 0x8000 ../../../private/tmp/tianshan-ssh-stack-candidate/build/partition_table/partition-table.bin 0x16000 ../../../private/tmp/tianshan-ssh-stack-candidate/build/ota_data_initial.bin 0x20000 ../../../private/tmp/tianshan-ssh-stack-candidate/build/TianShanOS.bin 0x6a0000 ../../../private/tmp/tianshan-ssh-stack-candidate/build/www.bin +or from the "/private/tmp/tianshan-ssh-stack-candidate/build" directory + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args" diff --git a/docs/repair/ssh-poll-stack/candidate/requests-en-US.json b/docs/repair/ssh-poll-stack/candidate/requests-en-US.json new file mode 100644 index 0000000..59325af --- /dev/null +++ b/docs/repair/ssh-poll-stack/candidate/requests-en-US.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/en-US.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/candidate/requests-zh-CN.json b/docs/repair/ssh-poll-stack/candidate/requests-zh-CN.json new file mode 100644 index 0000000..ef547b7 --- /dev/null +++ b/docs/repair/ssh-poll-stack/candidate/requests-zh-CN.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/candidate/sdkconfig-evidence.txt b/docs/repair/ssh-poll-stack/candidate/sdkconfig-evidence.txt new file mode 100644 index 0000000..3a04067 --- /dev/null +++ b/docs/repair/ssh-poll-stack/candidate/sdkconfig-evidence.txt @@ -0,0 +1,2875 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.2 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_LCDCAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_CAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_I80_LCD_SUPPORTED=y +CONFIG_SOC_LCDCAM_RGB_LCD_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_CACHE_SUPPORT_WRAP=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_RISCV_COPROC_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_USB_OTG_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_XT_WDT_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_MEMPROT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_SIMD_INSTRUCTION_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_APPCPU_HAS_CLOCK_GATING_BUG=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_ARBITER_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=24 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_APB_BACKUP_DMA=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CACHE_ACS_INVALID_STATE_ON_PANIC=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_SIMD_PREFERRED_DATA_ALIGNMENT=16 +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=5 +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=49 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0x1FFFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=48 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=48 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=4 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_SUPPORT_DMA=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_RGB_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=1 +CONFIG_SOC_LCD_RGB_PANELS=1 +CONFIG_SOC_LCD_I80_BUS_WIDTH=16 +CONFIG_SOC_LCD_RGB_DATA_WIDTH=16 +CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_I80_NUM_BUSES=1 +CONFIG_SOC_LCDCAM_I80_BUS_WIDTH=16 +CONFIG_SOC_LCDCAM_RGB_NUM_PANELS=1 +CONFIG_SOC_LCDCAM_RGB_DATA_WIDTH=16 +CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549 +CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTCIO_PIN_COUNT=22 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_SUPPORT_OCT=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_SRC_FREQ_120M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=2 +CONFIG_SOC_TOUCH_SENSOR_NUM=15 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=1 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=14 +CONFIG_SOC_TOUCH_SUPPORT_BENCHMARK=y +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SUPPORT_WATERPROOF=y +CONFIG_SOC_TOUCH_SUPPORT_PROX_SENSING=y +CONFIG_SOC_TOUCH_SUPPORT_DENOISE_CHAN=y +CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 +CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=16384 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_USB_OTG_PERIPH_NUM=1 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_TAGMEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_DCACHE=y +CONFIG_SOC_EFUSE_HARD_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_256=y +CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 +CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=256 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_FLASH_OPI_MODE=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM=y +CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_LEADER_TX_LINE=y +CONFIG_SOC_SDMMC_USE_GPIO_MATRIX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_SDMMC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_SDMMC_DELAY_PHASE_NUM=4 +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_PHY_NEEDS_USB_WORKAROUND=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_CAM_PERIPH_NUM=1 +CONFIG_SOC_LCDCAM_CAM_DATA_WIDTH_MAX=16 +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32s3" +CONFIG_IDF_INIT_VERSION="5.5.2" +CONFIG_IDF_TARGET_ESP32S3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_USB_OTG_NUM=3 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_FLASH_COUNT_PAGES_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_SUSPEND_WAITI_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_WRITEBACK_BUG=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CONSOLE_OUTPUT_SECONDARY=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_OCT_FLASH is not set +CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=y +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="16MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +# CONFIG_APPTRACE_DEST_USB_CDC is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set + +# +# Common Options +# + +# +# BLE Log +# +# CONFIG_BLE_LOG_ENABLED is not set +# end of BLE Log + +# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set +# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set +# CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED is not set +# end of Common Options +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations + +# +# Legacy Touch Sensor Driver Configurations +# +# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Touch Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ESP_COEX_GPIO_DEBUG is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +# end of Common ESP-related + +# +# ESP-Driver:Camera Controller Configurations +# +# CONFIG_CAM_CTLR_DVP_CAM_ISR_CACHE_SAFE is not set +# end of ESP-Driver:Camera Controller Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Touch Sensor Configurations +# +# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set +# CONFIG_TOUCH_ISR_IRAM_SAFE is not set +# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set +# CONFIG_TOUCH_SKIP_FSM_CHECK is not set +# end of ESP-Driver:Touch Sensor Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_IO_FUNC_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +CONFIG_ETH_SPI_ETHERNET_W5500=y +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HID +# +CONFIG_ESPHID_TASK_SIZE_BT=2048 +CONFIG_ESPHID_TASK_SIZE_BLE=4096 +# end of ESP HID + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 +CONFIG_HTTPD_MAX_URI_LEN=256 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +CONFIG_HTTPD_WS_SUPPORT=y +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_HTTPD_WS_PRE_HANDSHAKE_CB_SUPPORT is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP=y +CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32S3_REV_MIN_0=y +# CONFIG_ESP32S3_REV_MIN_1 is not set +# CONFIG_ESP32S3_REV_MIN_2 is not set +CONFIG_ESP32S3_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32-S3 Revision (Rev v0.99) +# +CONFIG_ESP32S3_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=199 + +# +# Maximum Supported ESP32-S3 eFuse Block Revision (eFuse Block Rev v1.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-Driver:LCD Controller Configurations +# +# CONFIG_LCD_RGB_ISR_IRAM_SAFE is not set +# CONFIG_LCD_RGB_RESTART_IN_VSYNC is not set +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:LCD Controller Configurations + +# +# ESP-MM: Memory Management Configurations +# +# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set +# end of ESP-MM: Memory Management Configurations + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +CONFIG_ESP_PHY_ENABLE_USB=y +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# CONFIG_ESP_PHY_RECORD_USED_TIME is not set +CONFIG_ESP_PHY_IRAM_OPT=y +# CONFIG_ESP_PHY_DEBUG is not set +# end of PHY + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP PSRAM +# +CONFIG_SPIRAM=y + +# +# SPI RAM config +# +# CONFIG_SPIRAM_MODE_QUAD is not set +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_TYPE_AUTO=y +# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set +CONFIG_SPIRAM_CLK_IO=30 +CONFIG_SPIRAM_CS_IO=26 +# CONFIG_SPIRAM_XIP_FROM_PSRAM is not set +# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set +# CONFIG_SPIRAM_RODATA is not set +CONFIG_SPIRAM_SPEED_80M=y +# CONFIG_SPIRAM_SPEED_40M is not set +CONFIG_SPIRAM_SPEED=80 +# CONFIG_SPIRAM_ECC_ENABLE is not set +CONFIG_SPIRAM_BOOT_HW_INIT=y +CONFIG_SPIRAM_BOOT_INIT=y +CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=y +# CONFIG_SPIRAM_USE_MEMMAP is not set +# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set +CONFIG_SPIRAM_USE_MALLOC=y +CONFIG_SPIRAM_MEMTEST=y +CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=64 +CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y +CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=16384 +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set +# end of SPI RAM config +# end of ESP PSRAM + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Cache config +# +CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y +# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y +CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_16B is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_DATA_CACHE_16KB is not set +CONFIG_ESP32S3_DATA_CACHE_32KB=y +# CONFIG_ESP32S3_DATA_CACHE_64KB is not set +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 +# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_DATA_CACHE_LINE_16B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_32B=y +# CONFIG_ESP32S3_DATA_CACHE_LINE_64B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32 +# end of Cache config + +# +# Memory +# +# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set +# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32S3_TRAX is not set +CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=4608 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_CDC is not set +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=30 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1280 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=4 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=3 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=8 +CONFIG_ESP_WIFI_IRAM_OPT=y +# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +# CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT is not set +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# CONFIG_ESP_WIFI_WPS_RECONNECT_ON_FAIL is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=4 +# CONFIG_FATFS_LFN_NONE is not set +CONFIG_FATFS_LFN_HEAP=y +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_MAX_LFN=255 +CONFIG_FATFS_API_ENCODING_ANSI_OEM=y +# CONFIG_FATFS_API_ENCODING_UTF_8 is not set +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_USE_STRFUNC_NONE=y +# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set +# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# CONFIG_FATFS_USE_DYN_BUFFERS is not set + +# +# File system free space calculation behavior +# +CONFIG_FATFS_DONT_TRUST_FREE_CLUSTER_CNT=0 +CONFIG_FATFS_DONT_TRUST_LAST_ALLOC=0 +# end of File system free space calculation behavior +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=1000 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=3072 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y +CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U32=y +# CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U64 is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM=y +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_WDT_USE_ROM_IMPL=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +CONFIG_HEAP_POISONING_DISABLED=y +# CONFIG_HEAP_POISONING_LIGHT is not set +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +# CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT is not set +CONFIG_LOG_MAXIMUM_LEVEL_DEBUG=y +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=4 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="rm01" +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=16 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +CONFIG_LWIP_IP_FORWARD=y +CONFIG_LWIP_IPV4_NAPT=y +CONFIG_LWIP_IPV4_NAPT_PORTMAP=y +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=8 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set +# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=69 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +CONFIG_LWIP_DHCPS_ADD_DNS=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=4096 +CONFIG_LWIP_TCP_WND_DEFAULT=4096 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=0 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +# CONFIG_LWIP_WND_SCALE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 +CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 +CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 +# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set +# CONFIG_LWIP_PPP_SUPPORT is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=3 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_HOST_IP=1 +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set +# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set +CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set +CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=8192 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +CONFIG_MBEDTLS_HKDF_C=y +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +CONFIG_MBEDTLS_FS_IO=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set +# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set +CONFIG_LIBC_STDIN_LINE_ENDING_CR=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND=y + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +CONFIG_NVS_ALLOCATE_CACHE_IN_SPIRAM=y +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# OpenThread Spinel +# +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# end of OpenThread Spinel + +# CONFIG_OPENTHREAD_DEBUG is not set +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +CONFIG_SPI_FLASH_HPM_ON=y +CONFIG_SPI_FLASH_HPM_DC_AUTO=y +# CONFIG_SPI_FLASH_HPM_DC_DISABLE is not set +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_TH_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_OPI_CHIP=y +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set +# end of Unity unit testing library + +# +# USB-OTG +# +CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE=256 +CONFIG_USB_HOST_HW_BUFFER_BIAS_BALANCED=y +# CONFIG_USB_HOST_HW_BUFFER_BIAS_IN is not set +# CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT is not set + +# +# Hub Driver Configuration +# + +# +# Root Port configuration +# +CONFIG_USB_HOST_DEBOUNCE_DELAY_MS=250 +CONFIG_USB_HOST_RESET_HOLD_MS=30 +CONFIG_USB_HOST_RESET_RECOVERY_MS=30 +CONFIG_USB_HOST_SET_ADDR_RECOVERY_MS=10 +# end of Root Port configuration + +# CONFIG_USB_HOST_HUBS_SUPPORTED is not set +# end of Hub Driver Configuration + +# CONFIG_USB_HOST_ENABLE_ENUM_FILTER_CALLBACK is not set +CONFIG_USB_OTG_SUPPORTED=y +# end of USB-OTG + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=16 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) + +CONFIG_VFS_INITIALIZE_DEV_NULL=y +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager + +# +# TianShanOS API Configuration +# +CONFIG_TS_API_MAX_ENDPOINTS=288 +CONFIG_TS_API_MAX_NAME_LENGTH=64 +CONFIG_TS_API_ENABLE_AUTH=y +# end of TianShanOS API Configuration + +# +# TianShanOS Automation Engine +# +CONFIG_TS_AUTOMATION_ENABLED=y +CONFIG_TS_AUTOMATION_CONFIG_PATH="/sdcard/config/automation.json" +CONFIG_TS_AUTOMATION_MAX_SOURCES=16 +CONFIG_TS_AUTOMATION_MAX_RULES=32 +CONFIG_TS_AUTOMATION_MAX_VARIABLES=512 +CONFIG_TS_AUTOMATION_TASK_STACK_SIZE=4096 +CONFIG_TS_AUTOMATION_TASK_PRIORITY=5 +# end of TianShanOS Automation Engine + +# +# TianShanOS PKI Certificate +# +CONFIG_TS_CERT_ENABLED=y +CONFIG_TS_CERT_DEFAULT_ORG="TianShanOS" +CONFIG_TS_CERT_DEFAULT_OU="Device" +CONFIG_TS_CERT_AUTO_INIT=y +CONFIG_TS_CERT_EXPIRY_WARNING_DAYS=30 +# end of TianShanOS PKI Certificate + +# +# TianShanOS Config Pack +# +CONFIG_TS_CONFIG_PACK_ENABLED=y +CONFIG_TS_CONFIG_PACK_MAX_SIZE=65536 +CONFIG_TS_CONFIG_PACK_VERIFY_CERT_CHAIN=y +# CONFIG_TS_CONFIG_PACK_REQUIRE_OFFICIAL_SIG is not set +# end of TianShanOS Config Pack + +# +# TianShanOS Console Configuration +# +CONFIG_TS_CONSOLE_MAX_LINE_LENGTH=256 +CONFIG_TS_CONSOLE_MAX_HISTORY=50 +CONFIG_TS_CONSOLE_TASK_PRIORITY=5 +CONFIG_TS_CONSOLE_TASK_STACK_SIZE=6144 +CONFIG_TS_CONSOLE_DEFAULT_PROMPT="tianshan> " +CONFIG_TS_CONSOLE_ENABLE_COLORS=y +CONFIG_TS_CONSOLE_HISTORY_FILE="/sdcard/.console_history" +# end of TianShanOS Console Configuration + +# +# TianShanOS Drivers Configuration +# +CONFIG_TS_DRIVERS_FAN_ENABLE=y +CONFIG_TS_DRIVERS_FAN_PWM_FREQ=25000 +CONFIG_TS_DRIVERS_FAN_TEMP_UPDATE_MS=1000 +CONFIG_TS_DRIVERS_POWER_ENABLE=y +CONFIG_TS_DRIVERS_POWER_ADC_SAMPLES=16 +CONFIG_TS_DRIVERS_DEVICE_ENABLE=y +CONFIG_TS_DRIVERS_AGX_POWER_ON_DELAY_MS=100 +CONFIG_TS_DRIVERS_USB_MUX_ENABLE=y +# end of TianShanOS Drivers Configuration + +# +# TianShanOS HAL Configuration +# +CONFIG_TS_HAL_MAX_PINS=48 +CONFIG_TS_HAL_MAX_GPIO_HANDLES=32 +CONFIG_TS_HAL_MAX_PWM_HANDLES=8 +CONFIG_TS_HAL_MAX_I2C_HANDLES=4 +CONFIG_TS_HAL_MAX_SPI_HANDLES=4 +CONFIG_TS_HAL_MAX_UART_HANDLES=3 +CONFIG_TS_HAL_MAX_ADC_HANDLES=8 +CONFIG_TS_HAL_PIN_CONFIG_PATH="/sdcard/config/pins.json" +CONFIG_TS_HAL_ENABLE_PIN_CONFLICT_CHECK=y +CONFIG_TS_HAL_PWM_DEFAULT_FREQ=25000 +CONFIG_TS_HAL_PWM_DEFAULT_RESOLUTION=8 +# end of TianShanOS HAL Configuration + +# +# TianShanOS HTTPS Server +# +# CONFIG_TS_HTTPS_ENABLED is not set +# end of TianShanOS HTTPS Server + +# +# TianShanOS LED Configuration +# +CONFIG_TS_LED_MAX_DEVICES=8 +CONFIG_TS_LED_MAX_LAYERS=8 +CONFIG_TS_LED_DEFAULT_BRIGHTNESS=128 +CONFIG_TS_LED_TASK_PRIORITY=5 +CONFIG_TS_LED_TASK_STACK_SIZE=3072 +CONFIG_TS_LED_REFRESH_RATE_HZ=60 + +# +# Touch LED Settings +# +CONFIG_TS_LED_TOUCH_COUNT=1 +CONFIG_TS_LED_TOUCH_DEFAULT_BRIGHTNESS=80 +# end of Touch LED Settings + +# +# Board LED Settings +# +CONFIG_TS_LED_BOARD_COUNT=28 +CONFIG_TS_LED_BOARD_DEFAULT_BRIGHTNESS=60 +# end of Board LED Settings + +# +# Matrix LED Settings +# +CONFIG_TS_LED_MATRIX_WIDTH=32 +CONFIG_TS_LED_MATRIX_HEIGHT=32 +CONFIG_TS_LED_MATRIX_DEFAULT_BRIGHTNESS=50 +# end of Matrix LED Settings + +# +# Image Support +# +CONFIG_TS_LED_ENABLE_BMP=y +CONFIG_TS_LED_ENABLE_PNG=y +CONFIG_TS_LED_ENABLE_JPG=y +CONFIG_TS_LED_ENABLE_GIF=y +# end of Image Support +# end of TianShanOS LED Configuration + +# +# TianShanOS Network Configuration +# +CONFIG_TS_NET_ETHERNET_ENABLE=y +CONFIG_TS_NET_ETH_SPI_HOST=2 +# CONFIG_TS_NET_WIFI_ENABLE is not set +CONFIG_TS_NET_DHCP_SERVER_ENABLE=y +# CONFIG_TS_NET_MDNS_ENABLE is not set +CONFIG_TS_NET_HTTP_SERVER_ENABLE=y +CONFIG_TS_NET_HTTP_PORT=80 +CONFIG_TS_NET_HTTPS_PORT=443 +# end of TianShanOS Network Configuration + +# +# TianShanOS OTA Configuration +# +CONFIG_TS_OTA_ENABLED=y +CONFIG_TS_OTA_ROLLBACK_TIMEOUT=60 +CONFIG_TS_OTA_HTTPS_ENABLED=y +CONFIG_TS_OTA_SDCARD_ENABLED=y +CONFIG_TS_OTA_WEBUI_UPLOAD_ENABLED=y +CONFIG_TS_OTA_BUFFER_SIZE=8192 +# CONFIG_TS_OTA_VERIFY_SIGNATURE is not set +# CONFIG_TS_OTA_ANTI_ROLLBACK is not set +CONFIG_TS_OTA_VERSION_CHECK=y +CONFIG_TS_OTA_DEFAULT_URL="https://ota.example.com/tianshanos" +CONFIG_TS_OTA_TASK_STACK_SIZE=8192 +CONFIG_TS_OTA_TASK_PRIORITY=5 +# end of TianShanOS OTA Configuration + +# +# TianShanOS Security Configuration +# +CONFIG_TS_SECURITY_ENABLE=y +CONFIG_TS_SECURITY_KEY_STORAGE_NVS=y +CONFIG_TS_SECURITY_MTLS_ENABLE=y +CONFIG_TS_SECURITY_TOKEN_EXPIRE_SEC=86400 +CONFIG_TS_SECURITY_MAX_SESSIONS=8 +CONFIG_TS_SECURITY_PERMISSION_LEVELS=4 +CONFIG_TS_SSH_LOG_WATCH_MAX=32 +# end of TianShanOS Security Configuration + +# +# TianShanOS Storage Configuration +# +CONFIG_TS_STORAGE_ENABLE_SPIFFS=y +CONFIG_TS_STORAGE_SPIFFS_MOUNT_POINT="/spiffs" +CONFIG_TS_STORAGE_SPIFFS_PARTITION="storage" +CONFIG_TS_STORAGE_SPIFFS_MAX_FILES=5 +CONFIG_TS_STORAGE_ENABLE_SD=y +CONFIG_TS_STORAGE_SD_MOUNT_POINT="/sdcard" +CONFIG_TS_STORAGE_SD_MAX_FREQ_KHZ=20000 +# CONFIG_TS_STORAGE_SD_MODE_SPI is not set +# CONFIG_TS_STORAGE_SD_MODE_SDIO_1BIT is not set +CONFIG_TS_STORAGE_SD_MODE_SDIO_4BIT=y + +# +# SD Card GPIO Configuration +# +CONFIG_TS_STORAGE_SD_CMD_GPIO=15 +CONFIG_TS_STORAGE_SD_CLK_GPIO=16 +CONFIG_TS_STORAGE_SD_D0_GPIO=4 +CONFIG_TS_STORAGE_SD_D1_GPIO=5 +CONFIG_TS_STORAGE_SD_D2_GPIO=6 +CONFIG_TS_STORAGE_SD_D3_GPIO=7 +# end of SD Card GPIO Configuration +# end of TianShanOS Storage Configuration + +# +# TianShanOS WebUI Configuration +# +CONFIG_TS_WEBUI_ENABLE=y +CONFIG_TS_WEBUI_API_PREFIX="/api/v1" +CONFIG_TS_WEBUI_WS_ENABLE=y +CONFIG_TS_WEBUI_WS_MAX_CLIENTS=8 +CONFIG_TS_WEBUI_TERMINAL_OUTPUT_BUF_SIZE=32768 +CONFIG_TS_WEBUI_AUTH_REQUIRED=y +CONFIG_TS_WEBUI_CORS_ENABLE=y +CONFIG_TS_WEBUI_STATIC_PATH="/www" +# end of TianShanOS WebUI Configuration + +# +# TianShanOS Configuration Management +# +CONFIG_TS_CONFIG_ENABLE=y +CONFIG_TS_CONFIG_MAX_KEY_LENGTH=64 +CONFIG_TS_CONFIG_MAX_VALUE_SIZE=512 +CONFIG_TS_CONFIG_MAX_LISTENERS=16 +CONFIG_TS_CONFIG_NVS_NAMESPACE="ts_config" + +# +# Configuration Backends +# +CONFIG_TS_CONFIG_NVS_BACKEND=y +CONFIG_TS_CONFIG_FILE_BACKEND=y +CONFIG_TS_CONFIG_FILE_PATH="/sdcard/config" +CONFIG_TS_CONFIG_FILE_FORMAT_JSON=y +# end of Configuration Backends + +# +# Configuration Priorities +# +CONFIG_TS_CONFIG_PRIORITY_CLI=100 +CONFIG_TS_CONFIG_PRIORITY_NVS=80 +CONFIG_TS_CONFIG_PRIORITY_FILE=60 +CONFIG_TS_CONFIG_PRIORITY_DEFAULT=0 +# end of Configuration Priorities + +CONFIG_TS_CONFIG_AUTO_SAVE=y +CONFIG_TS_CONFIG_AUTO_SAVE_DELAY_MS=1000 +# CONFIG_TS_CONFIG_DEBUG is not set +# end of TianShanOS Configuration Management + +# +# TianShanOS Logging +# +CONFIG_TS_LOG_ENABLE=y +# CONFIG_TS_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_TS_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_TS_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_TS_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_TS_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_TS_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_TS_LOG_DEFAULT_LEVEL=3 +CONFIG_TS_LOG_COLORS=y +CONFIG_TS_LOG_TIMESTAMP=y +CONFIG_TS_LOG_TASK_NAME=y + +# +# Log Outputs +# +CONFIG_TS_LOG_OUTPUT_CONSOLE=y +# CONFIG_TS_LOG_OUTPUT_FILE is not set +CONFIG_TS_LOG_OUTPUT_BUFFER=y +CONFIG_TS_LOG_BUFFER_SIZE=500 +CONFIG_TS_LOG_CAPTURE_ESP_LOG=y +# end of Log Outputs + +CONFIG_TS_LOG_TAG_MAX_LENGTH=16 +CONFIG_TS_LOG_MESSAGE_MAX_LENGTH=256 +# end of TianShanOS Logging + +# +# TianShanOS Event System +# +CONFIG_TS_EVENT_ENABLE=y +CONFIG_TS_EVENT_LOOP_TASK_PRIORITY=5 +CONFIG_TS_EVENT_LOOP_TASK_STACK_SIZE=4096 +CONFIG_TS_EVENT_QUEUE_SIZE=32 +CONFIG_TS_EVENT_MAX_HANDLERS=64 +CONFIG_TS_EVENT_MAX_EVENT_TYPES=64 +CONFIG_TS_EVENT_DATA_MAX_SIZE=256 +CONFIG_TS_EVENT_ENABLE_STATS=y +# CONFIG_TS_EVENT_ENABLE_TRACING is not set +# end of TianShanOS Event System + +# +# TianShanOS Service Management +# +CONFIG_TS_SERVICE_ENABLE=y +CONFIG_TS_SERVICE_MAX_SERVICES=32 +CONFIG_TS_SERVICE_NAME_MAX_LENGTH=32 +CONFIG_TS_SERVICE_MAX_DEPENDENCIES=8 +CONFIG_TS_SERVICE_STARTUP_TIMEOUT_MS=30000 +CONFIG_TS_SERVICE_SHUTDOWN_TIMEOUT_MS=10000 + +# +# Startup Phases +# +CONFIG_TS_SERVICE_PHASE_PLATFORM_PRIORITY=10 +CONFIG_TS_SERVICE_PHASE_CORE_PRIORITY=20 +CONFIG_TS_SERVICE_PHASE_HAL_PRIORITY=30 +CONFIG_TS_SERVICE_PHASE_DRIVER_PRIORITY=40 +CONFIG_TS_SERVICE_PHASE_NETWORK_PRIORITY=50 +CONFIG_TS_SERVICE_PHASE_SECURITY_PRIORITY=60 +CONFIG_TS_SERVICE_PHASE_SERVICE_PRIORITY=70 +CONFIG_TS_SERVICE_PHASE_UI_PRIORITY=80 +# end of Startup Phases + +CONFIG_TS_SERVICE_ENABLE_WATCHDOG=y +CONFIG_TS_SERVICE_WATCHDOG_TIMEOUT_MS=60000 +# CONFIG_TS_SERVICE_DEBUG is not set +# end of TianShanOS Service Management + +# +# JPEG Decoder +# +CONFIG_JD_USE_ROM=y +# end of JPEG Decoder + +# +# ESP WebSocket client +# +# CONFIG_ESP_WS_CLIENT_ENABLE_DYNAMIC_BUFFER is not set +# CONFIG_ESP_WS_CLIENT_SEPARATE_TX_LOCK is not set +# end of ESP WebSocket client + +# +# mDNS +# +CONFIG_MDNS_MAX_INTERFACES=3 +CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +CONFIG_MDNS_ACTION_QUEUE_LEN=16 +CONFIG_MDNS_TASK_STACK_SIZE=4096 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set +CONFIG_MDNS_TASK_AFFINITY=0x0 + +# +# MDNS Memory Configuration +# +# CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM is not set +CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL=y +# CONFIG_MDNS_MEMORY_ALLOC_SPIRAM is not set +CONFIG_MDNS_MEMORY_ALLOC_INTERNAL=y +# CONFIG_MDNS_MEMORY_CUSTOM_IMPL is not set +# end of MDNS Memory Configuration + +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# CONFIG_MDNS_NETWORKING_SOCKET is not set +# CONFIG_MDNS_SKIP_SUPPRESSING_OWN_QUERIES is not set +# CONFIG_MDNS_ENABLE_DEBUG_PRINTS is not set +CONFIG_MDNS_ENABLE_CONSOLE_CLI=y +# CONFIG_MDNS_RESPOND_REVERSE_QUERIES is not set +CONFIG_MDNS_MULTIPLE_INSTANCE=y + +# +# MDNS Predefined interfaces +# +CONFIG_MDNS_PREDEF_NETIF_STA=y +CONFIG_MDNS_PREDEF_NETIF_AP=y +CONFIG_MDNS_PREDEF_NETIF_ETH=y +# end of MDNS Predefined interfaces +# end of mDNS +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +CONFIG_FLASHMODE_QIO=y +# CONFIG_FLASHMODE_QOUT is not set +# CONFIG_FLASHMODE_DIO is not set +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +CONFIG_STACK_CHECK_NONE=y +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +# CONFIG_STACK_CHECK_ALL is not set +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_CAM_CTLR_DVP_CAM_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +CONFIG_OTA_ALLOW_HTTP=y +CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y +CONFIG_ESP32S3_SPIRAM_SUPPORT=y +CONFIG_DEFAULT_PSRAM_CLK_IO=30 +CONFIG_DEFAULT_PSRAM_CS_IO=26 +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240 +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=3584 +CONFIG_MAIN_TASK_STACK_SIZE=4608 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=30 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32S3_DEBUG_OCDAWARE=y +CONFIG_IPC_TASK_STACK_SIZE=1280 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=4 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=16 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=8 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=3072 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=8 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=4096 +CONFIG_TCP_WND_DEFAULT=4096 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/docs/repair/ssh-poll-stack/change.patch b/docs/repair/ssh-poll-stack/change.patch new file mode 100644 index 0000000..3d45042 --- /dev/null +++ b/docs/repair/ssh-poll-stack/change.patch @@ -0,0 +1,98 @@ +diff --git a/components/ts_webui/src/ts_webui_ws.c b/components/ts_webui/src/ts_webui_ws.c +index 9bc83dc..b79cb47 100644 +--- a/components/ts_webui/src/ts_webui_ws.c ++++ b/components/ts_webui/src/ts_webui_ws.c +@@ -50,6 +50,7 @@ + + /* SSH Shell 输出缓冲区大小 */ + #define SSH_OUTPUT_BUF_SIZE 2048 ++#define SSH_POLL_STACK_SIZE 8192 + + typedef enum { + WS_CLIENT_TYPE_EVENT, // 普通事件订阅客户端 +@@ -271,7 +272,7 @@ static void ssh_poll_task(void *arg) + } + shell_resources_close(ctx); + ts_ws_op_executor_done(op); +- vTaskDelete(NULL); ++ vTaskDeleteWithCaps(NULL); + } + static void ssh_cleanup(void) + { +@@ -308,7 +309,7 @@ static void handle_ssh_connect(httpd_req_t *req,cJSON *params) + error="Failed to open shell"; + if(ts_ssh_shell_open(ctx->session,&shell_config,&ctx->shell)!=ESP_OK)goto failed; + ts_ws_op_executor_take(op); +- if(xTaskCreateWithCaps(ssh_poll_task,"ssh_poll",4096,ctx,5,NULL,MALLOC_CAP_SPIRAM)!=pdPASS){ts_ws_op_executor_done(op);error="Failed to create SSH session";goto failed;} ++ if(xTaskCreateWithCaps(ssh_poll_task,"ssh_poll",SSH_POLL_STACK_SIZE,ctx,5,NULL,MALLOC_CAP_SPIRAM)!=pdPASS){ts_ws_op_executor_done(op);error="Failed to create SSH session";goto failed;} + poller=true;error="SSH shell closed during startup"; + if(!ts_ssh_shell_is_active(ctx->shell))goto failed; + error="SSH readiness delivery failed"; +diff --git a/tests/ws_subscriptions/test_operation_adapter.c b/tests/ws_subscriptions/test_operation_adapter.c +index 4a98321..d0e6245 100644 +--- a/tests/ws_subscriptions/test_operation_adapter.c ++++ b/tests/ws_subscriptions/test_operation_adapter.c +@@ -42,6 +42,8 @@ static char *host_strdup(const char *s){size_t n=strlen(s)+1;char *p=tracked_mal + static char *host_strndup(const char *s,size_t n){char *p=tracked_malloc(n+1);if(p){memcpy(p,s,n);p[n]=0;}return p;} + static struct {void (*fn)(void *);void *arg;} shell_task,exec_task; + static bool task_create_fail,close_during_create,inline_exec; ++static unsigned caps_deletes; ++static void adapter_delete_caps(TaskHandle_t task); + static int adapter_create(void(*fn)(void*),const char *name,unsigned stack,void *arg,unsigned priority,TaskHandle_t *out){ + (void)stack;(void)priority;(void)out;if(task_create_fail)return 0; + if(!strcmp(name,"ssh_poll"))shell_task=(typeof(shell_task)){fn,arg};else exec_task=(typeof(exec_task)){fn,arg}; +@@ -58,7 +60,9 @@ static int adapter_create_caps(void(*fn)(void*),const char *n,unsigned stack,voi + #define heap_caps_calloc host_heap_calloc + #define xTaskCreate adapter_create + #define xTaskCreateWithCaps adapter_create_caps ++#define vTaskDeleteWithCaps adapter_delete_caps + #include "ts_webui_ws.c" ++_Static_assert(SSH_POLL_STACK_SIZE == 8192, "SSH poll stack budget is bytes"); + #undef malloc + #undef calloc + #undef free +@@ -68,6 +72,7 @@ static int adapter_create_caps(void(*fn)(void*),const char *n,unsigned stack,voi + #undef heap_caps_calloc + #undef xTaskCreate + #undef xTaskCreateWithCaps ++#undef vTaskDeleteWithCaps + #ifndef PROJECT_REAL_DRIVER + struct ts_ssh_session_s {bool aborted;ts_ssh_config_t config;}; + #endif +@@ -130,11 +135,21 @@ esp_err_t ts_log_remove_callback(ts_log_callback_handle_t h){(void)h;return remo + size_t ts_log_buffer_search(ts_log_entry_t *e,size_t n,ts_log_level_t min,ts_log_level_t max,const char *tag,const char *keyword){(void)e;(void)n;(void)min;(void)max;(void)tag;(void)keyword;return 0;} + httpd_handle_t ts_http_server_get_handle(void){return (void*)11;} + void ts_http_server_set_stop_hooks(esp_err_t(*stop)(httpd_handle_t),void(*stopped)(httpd_handle_t)){(void)stop;(void)stopped;} +-static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){(void)caps; ++static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){ ++assert(!strcmp(n,"ssh_poll") && stack==8192 && caps==MALLOC_CAP_SPIRAM); + #ifndef PROJECT_REAL_DRIVER + if(close_during_create)((ssh_shell_context_t*)arg)->shell->active=false; + #endif + return adapter_create(fn,n,stack,arg,p,out);} ++static void adapter_delete_caps(TaskHandle_t task){ ++ assert(!task); ++ ts_ws_op_stats_t ledger;ts_ws_op_stats(TS_WS_OP_SHELL,&ledger); ++ assert(!ledger.executors); ++ /* The original context remains pinned until queued terminal settlement. */ ++ ts_ws_operation_t *op=ts_ws_op_shell_owner(); ++ if(op){ssh_shell_context_t *ctx=ts_ws_op_data(op);assert(!ctx->shell && !ctx->session);ts_ws_op_release(op);} ++ caps_deletes++; ++} + static void drive_all(void){for(unsigned i=0;i<12;i++){ts_ws_op_poll();pump();timer_pump();}assert(!timer_queued);} + static void setup(void){start();memset(s_clients,0,sizeof(s_clients));s_server=(void*)11;s_ws_stopping=false;ts_ws_op_enable();transport_server.closed=peer_closed;for(int fd=1;fd<=2;fd++){reqs[fd]=(httpd_req_t){.handle=(void*)11,.fd=fd};current=(void*)3;assert(add_client(&reqs[fd],WS_CLIENT_TYPE_EVENT)==ESP_OK);}current=(void*)1;} + static void finish_all(void){drive_all();assert(!ts_ws_op_busy());stop();assert(!live_allocations);} +@@ -292,6 +307,13 @@ int main(void){ + assert(ts_webui_ssh_exec_start_ex("fake",22,"user",NULL,"password","cmd",&opts,&id)==0); + exec_task.fn(exec_task.arg);drive_all();assert(terminal_frames==2 && !output_after_terminal && variable_writes);finish_all(); + setup();inline_exec=true;assert(ts_webui_ssh_exec_start("fake",22,"user",NULL,"password","cmd",&id)==0);inline_exec=false;finish_all(); ++ for(unsigned i=0;i<10;i++){ ++ setup();connect_shell();unsigned before=caps_deletes; ++ ssh_cleanup();shell_task.fn(shell_task.arg); ++ assert(caps_deletes==before+1);finish_all(); ++ ts_ws_op_stats_t ledger;ts_ws_op_stats(TS_WS_OP_SHELL,&ledger); ++ assert(ledger.phase==OP_FREE && !ledger.refs && !ledger.executors); ++ } + operation_cross_tests(); + printf("PASS complete production WS unit: Shell output failure/close/startup failure, Exec task/callback/match/variables/timer cleanup and task-before-create-return; destroyed=%u\n",session_destroys); + return 0; diff --git a/docs/repair/ssh-poll-stack/crash.txt b/docs/repair/ssh-poll-stack/crash.txt new file mode 100644 index 0000000..7ff88de --- /dev/null +++ b/docs/repair/ssh-poll-stack/crash.txt @@ -0,0 +1,30 @@ + need_streaming=0, current=0 +I (92696) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (93748) ts_ssh: SSH client initialized (libssh2 version: 1.10.1_DEV) +I (94318) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (94718) ts_shell: Interactive shell opened + +***ERROR*** A stack overflow in task ssh_poll has been detected. + + +Backtrace: 0x4037ebfd:0x3c2dc980 0x4037ebc5:0x3c2dc9a0 0x4037fcf2:0x3c2dc9c0 0x40381793:0x3c2dca40 0x4037fdb8:0x3c2dca60 0x4037fdae:0xa5a5a5a5 |<-CORRUPTED + + + + +ELF file SHA256: 6265f4e96 + +Rebooting... +ESP-ROM:esp32s3-20210327 +Build:Mar 27 2021 +rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT) +Saved PC:0x4037ed9d +SPIWP:0xee +mode:DIO, clock div:1 +load:0x3fce2820,len:0x1700 +load:0x403c8700,len:0xec0 +load:0x403cb700,len:0x31c0 +entry 0x403c894c +I (24) boot: ESP-IDF v5.5.2 2nd stage bootloader +I (24) boot: compile time Sep 28 2026 17:09:05 +I (24) boot: M \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/flash.log b/docs/repair/ssh-poll-stack/device-candidate/flash.log new file mode 100644 index 0000000..66071cf --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/flash.log @@ -0,0 +1,233 @@ +Checking "python3" ... +Python 3.12.4 +"python3" has been detected +Activating ESP-IDF 5.5 +Setting IDF_PATH to '/Users/massif/esp/v5.5.2/esp-idf'. +* Checking python version ... 3.12.4 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... zsh +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of riscv32-esp-elf, cmake, xtensa-esp-elf, openocd-esp32, esp-rom-elfs, xtensa-esp-elf-gdb, riscv32-esp-elf-gdb use command 'python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall' +To free up even more space, remove installation packages of those tools. +Use option python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall --remove-archives. +* Shell completion ... Autocompletion code generated + +Done! You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build +Executing action: flash +Running ninja in directory /private/tmp/tianshan-ssh-stack-candidate/build +Executing "ninja flash"... +[1/6] cd /tmp/tianshan-ssh-stack-candidate/build/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 partition --type app /tmp/tianshan-ssh-stack-candidate/build/partition_table/partition-table.bin /tmp/tianshan-ssh-stack-candidate/build/TianShanOS.bin +TianShanOS.bin binary size 0x215120 bytes. Smallest app partition is 0x300000 bytes. 0xeaee0 bytes (31%) free. +[2/6] Performing build step for 'bootloader' +[1/1] cd /tmp/tianshan-ssh-stack-candidate/build/bootloader/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /tmp/tianshan-ssh-stack-candidate/build/bootloader/bootloader.bin +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[3/6] No install step for 'bootloader' +[4/6] cd /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-ssh-stack-candidate/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +[5/6] Completed 'bootloader' +[5/6] cd /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py && /Users/massif/.espressif/tools/cmake/3.30.2/CMake.app/Contents/bin/cmake -D IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf -D "SERIAL_TOOL=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python;;/Users/massif/esp/v5.5.2/esp-idf/components/esptool_py/esptool/esptool.py;--chip;esp32s3" -D "SERIAL_TOOL_ARGS=--before=default_reset;--after=hard_reset;write_flash;@flash_args" -D WORKING_DIRECTORY=/tmp/tianshan-ssh-stack-candidate/build -P /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py/run_serial_tool.cmake +esptool.py --chip esp32s3 -p /dev/cu.usbmodem11401 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0 bootloader/bootloader.bin 0x20000 TianShanOS.bin 0x8000 partition_table/partition-table.bin 0x16000 ota_data_initial.bin 0x6a0000 www.bin +esptool.py v4.12.dev2 +Serial port /dev/cu.usbmodem11401 +Connecting... +Chip is ESP32-S3 (QFN56) (revision v0.2) +Features: WiFi, BLE, Embedded PSRAM 8MB (AP_3v3) +Crystal is 40MHz +USB mode: USB-Serial/JTAG +MAC: 20:6e:f1:a1:d5:8c +Uploading stub... +Running stub... +Stub running... +Changing baud rate to 460800 +Changed. +Configuring flash size... +Flash will be erased from 0x00000000 to 0x00005fff... +Flash will be erased from 0x00020000 to 0x00235fff... +Flash will be erased from 0x00008000 to 0x00008fff... +Flash will be erased from 0x00016000 to 0x00017fff... +Flash will be erased from 0x006a0000 to 0x0099ffff... +SHA digest in image updated +Compressed 22496 bytes to 14268... +Writing at 0x00000000... (100 %) +Wrote 22496 bytes (14268 compressed) at 0x00000000 in 0.2 seconds (effective 772.9 kbit/s)... +Hash of data verified. +Compressed 2183456 bytes to 1263518... +Writing at 0x00020000... (1 %) +Writing at 0x0002d6dd... (2 %) +Writing at 0x0003a71d... (3 %) +Writing at 0x000484b4... (5 %) +Writing at 0x0005521d... (6 %) +Writing at 0x00063d24... (7 %) +Writing at 0x00072802... (8 %) +Writing at 0x0008112c... (10 %) +Writing at 0x0008ccac... (11 %) +Writing at 0x00091c05... (12 %) +Writing at 0x00097a9e... (14 %) +Writing at 0x0009c625... (15 %) +Writing at 0x000a1481... (16 %) +Writing at 0x000a67ff... (17 %) +Writing at 0x000ae703... (19 %) +Writing at 0x000ba623... (20 %) +Writing at 0x000c1041... (21 %) +Writing at 0x000c81ff... (23 %) +Writing at 0x000ce459... (24 %) +Writing at 0x000d50ef... (25 %) +Writing at 0x000db231... (26 %) +Writing at 0x000e15af... (28 %) +Writing at 0x000e7467... (29 %) +Writing at 0x000ed190... (30 %) +Writing at 0x000f2f45... (32 %) +Writing at 0x000f88c0... (33 %) +Writing at 0x000fe6c4... (34 %) +Writing at 0x001043db... (35 %) +Writing at 0x0010aa9a... (37 %) +Writing at 0x001103e6... (38 %) +Writing at 0x001161f1... (39 %) +Writing at 0x0011c34d... (41 %) +Writing at 0x001224fd... (42 %) +Writing at 0x00128680... (43 %) +Writing at 0x0012e957... (44 %) +Writing at 0x00134ac3... (46 %) +Writing at 0x0013abb4... (47 %) +Writing at 0x001411d5... (48 %) +Writing at 0x00147993... (50 %) +Writing at 0x0014dba3... (51 %) +Writing at 0x0015441e... (52 %) +Writing at 0x0015a5a0... (53 %) +Writing at 0x00160d44... (55 %) +Writing at 0x00166ef8... (56 %) +Writing at 0x0016cf42... (57 %) +Writing at 0x001737ac... (58 %) +Writing at 0x001794f2... (60 %) +Writing at 0x0017f67f... (61 %) +Writing at 0x0018593a... (62 %) +Writing at 0x0018bacf... (64 %) +Writing at 0x00191cc1... (65 %) +Writing at 0x001978b4... (66 %) +Writing at 0x0019d7aa... (67 %) +Writing at 0x001a362b... (69 %) +Writing at 0x001a91c2... (70 %) +Writing at 0x001af3d3... (71 %) +Writing at 0x001b563e... (73 %) +Writing at 0x001bbb88... (74 %) +Writing at 0x001c1f49... (75 %) +Writing at 0x001c7e5e... (76 %) +Writing at 0x001cd96b... (78 %) +Writing at 0x001d3bcc... (79 %) +Writing at 0x001d98fb... (80 %) +Writing at 0x001df9f1... (82 %) +Writing at 0x001e4ef4... (83 %) +Writing at 0x001ea174... (84 %) +Writing at 0x001ef7a2... (85 %) +Writing at 0x001f49c0... (87 %) +Writing at 0x001faa91... (88 %) +Writing at 0x002002da... (89 %) +Writing at 0x0020673c... (91 %) +Writing at 0x0020d4a7... (92 %) +Writing at 0x00214a5f... (93 %) +Writing at 0x0021b72f... (94 %) +Writing at 0x00221ae7... (96 %) +Writing at 0x00227b2f... (97 %) +Writing at 0x0022e27b... (98 %) +Writing at 0x00234311... (100 %) +Wrote 2183456 bytes (1263518 compressed) at 0x00020000 in 11.6 seconds (effective 1512.2 kbit/s)... +Hash of data verified. +Compressed 3072 bytes to 180... +Writing at 0x00008000... (100 %) +Wrote 3072 bytes (180 compressed) at 0x00008000 in 0.0 seconds (effective 726.3 kbit/s)... +Hash of data verified. +Compressed 8192 bytes to 31... +Writing at 0x00016000... (100 %) +Wrote 8192 bytes (31 compressed) at 0x00016000 in 0.0 seconds (effective 1425.2 kbit/s)... +Hash of data verified. +Compressed 3145728 bytes to 1301907... +Writing at 0x006a0000... (1 %) +Writing at 0x006a457e... (2 %) +Writing at 0x006a89e3... (3 %) +Writing at 0x006b047c... (5 %) +Writing at 0x006baf69... (6 %) +Writing at 0x006d1206... (7 %) +Writing at 0x006da3ed... (8 %) +Writing at 0x006def13... (10 %) +Writing at 0x006e398f... (11 %) +Writing at 0x006e81c3... (12 %) +Writing at 0x006ec7fd... (13 %) +Writing at 0x006f0d22... (15 %) +Writing at 0x006f5a46... (16 %) +Writing at 0x006faa98... (17 %) +Writing at 0x006fefab... (18 %) +Writing at 0x007035af... (20 %) +Writing at 0x007082a8... (21 %) +Writing at 0x0070c80f... (22 %) +Writing at 0x007122f1... (23 %) +Writing at 0x007195c7... (25 %) +Writing at 0x0071e795... (26 %) +Writing at 0x00724b4d... (27 %) +Writing at 0x00729ad6... (28 %) +Writing at 0x0072de98... (30 %) +Writing at 0x00732372... (31 %) +Writing at 0x00736749... (32 %) +Writing at 0x0073ab18... (33 %) +Writing at 0x0073eee3... (35 %) +Writing at 0x007433b1... (36 %) +Writing at 0x007477a8... (37 %) +Writing at 0x0074bb76... (38 %) +Writing at 0x0074ff3f... (40 %) +Writing at 0x0075447a... (41 %) +Writing at 0x0075c5f8... (42 %) +Writing at 0x00769000... (43 %) +Writing at 0x00778601... (45 %) +Writing at 0x00789b0f... (46 %) +Writing at 0x0079ac96... (47 %) +Writing at 0x007af271... (48 %) +Writing at 0x007bf6f8... (50 %) +Writing at 0x007d0f1b... (51 %) +Writing at 0x007e45da... (52 %) +Writing at 0x007f75ac... (53 %) +Writing at 0x00807e03... (55 %) +Writing at 0x0081a13e... (56 %) +Writing at 0x0082d777... (57 %) +Writing at 0x0083fde1... (58 %) +Writing at 0x0085163b... (60 %) +Writing at 0x0085ee5a... (61 %) +Writing at 0x0086c200... (62 %) +Writing at 0x008775dc... (63 %) +Writing at 0x00883eaf... (65 %) +Writing at 0x008903ff... (66 %) +Writing at 0x00897717... (67 %) +Writing at 0x0089ba87... (68 %) +Writing at 0x0089feb5... (70 %) +Writing at 0x008a4410... (71 %) +Writing at 0x008a884e... (72 %) +Writing at 0x008acbf6... (73 %) +Writing at 0x008b17d0... (75 %) +Writing at 0x008b5b99... (76 %) +Writing at 0x008b9f62... (77 %) +Writing at 0x008be429... (78 %) +Writing at 0x008c27e8... (80 %) +Writing at 0x008c6bba... (81 %) +Writing at 0x008caf7b... (82 %) +Writing at 0x008cf43f... (83 %) +Writing at 0x008d3802... (85 %) +Writing at 0x008d7bc6... (86 %) +Writing at 0x008dbf87... (87 %) +Writing at 0x008e0a40... (88 %) +Writing at 0x008e6b82... (90 %) +Writing at 0x008eaf45... (91 %) +Writing at 0x008ef3fe... (92 %) +Writing at 0x008f3874... (93 %) +Writing at 0x008fc62d... (95 %) +Writing at 0x0090dc54... (96 %) +Writing at 0x0091db75... (97 %) +Writing at 0x0092f6a7... (98 %) +Writing at 0x0093dbfb... (100 %) +Wrote 3145728 bytes (1301907 compressed) at 0x006a0000 in 14.5 seconds (effective 1737.0 kbit/s)... +Hash of data verified. + +Leaving... +Hard resetting via RTS pin... +Done diff --git a/docs/repair/ssh-poll-stack/device-candidate/output-input-resize.json b/docs/repair/ssh-poll-stack/device-candidate/output-input-resize.json new file mode 100644 index 0000000..8de15b4 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/output-input-resize.json @@ -0,0 +1,229 @@ +{ + "stage": "output_input_resize", + "time": "2026-09-28T18:13:04.719323", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "ready" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "ssh_poll", + "priority": 5, + "stack_hwm": 4096, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + } + ], + "count": 25 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7601348, + "min_free_heap": 7550256, + "internal": { + "total": 308035, + "free": 72459, + "allocated": 235576, + "largest_block": 31744 + }, + "psram": { + "total": 8370236, + "free": 7544404, + "allocated": 825832, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 188304 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/restore-flash.log b/docs/repair/ssh-poll-stack/device-candidate/restore-flash.log new file mode 100644 index 0000000..cfc86d2 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/restore-flash.log @@ -0,0 +1,233 @@ +Checking "python3" ... +Python 3.12.4 +"python3" has been detected +Activating ESP-IDF 5.5 +Setting IDF_PATH to '/Users/massif/esp/v5.5.2/esp-idf'. +* Checking python version ... 3.12.4 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... zsh +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of riscv32-esp-elf, cmake, xtensa-esp-elf, openocd-esp32, esp-rom-elfs, xtensa-esp-elf-gdb, riscv32-esp-elf-gdb use command 'python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall' +To free up even more space, remove installation packages of those tools. +Use option python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall --remove-archives. +* Shell completion ... Autocompletion code generated + +Done! You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build +Executing action: flash +Running ninja in directory /private/tmp/tianshan-ssh-stack-candidate/build +Executing "ninja flash"... +[1/6] cd /tmp/tianshan-ssh-stack-candidate/build/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 partition --type app /tmp/tianshan-ssh-stack-candidate/build/partition_table/partition-table.bin /tmp/tianshan-ssh-stack-candidate/build/TianShanOS.bin +TianShanOS.bin binary size 0x215120 bytes. Smallest app partition is 0x300000 bytes. 0xeaee0 bytes (31%) free. +[2/6] Performing build step for 'bootloader' +[1/1] cd /tmp/tianshan-ssh-stack-candidate/build/bootloader/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /tmp/tianshan-ssh-stack-candidate/build/bootloader/bootloader.bin +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[3/6] No install step for 'bootloader' +[4/6] cd /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-ssh-stack-candidate/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-ssh-stack-candidate/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +[5/6] Completed 'bootloader' +[5/6] cd /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py && /Users/massif/.espressif/tools/cmake/3.30.2/CMake.app/Contents/bin/cmake -D IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf -D "SERIAL_TOOL=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python;;/Users/massif/esp/v5.5.2/esp-idf/components/esptool_py/esptool/esptool.py;--chip;esp32s3" -D "SERIAL_TOOL_ARGS=--before=default_reset;--after=hard_reset;write_flash;@flash_args" -D WORKING_DIRECTORY=/tmp/tianshan-ssh-stack-candidate/build -P /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py/run_serial_tool.cmake +esptool.py --chip esp32s3 -p /dev/cu.usbmodem11401 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0 bootloader/bootloader.bin 0x20000 TianShanOS.bin 0x8000 partition_table/partition-table.bin 0x16000 ota_data_initial.bin 0x6a0000 www.bin +esptool.py v4.12.dev2 +Serial port /dev/cu.usbmodem11401 +Connecting... +Chip is ESP32-S3 (QFN56) (revision v0.2) +Features: WiFi, BLE, Embedded PSRAM 8MB (AP_3v3) +Crystal is 40MHz +USB mode: USB-Serial/JTAG +MAC: 20:6e:f1:a1:d5:8c +Uploading stub... +Running stub... +Stub running... +Changing baud rate to 460800 +Changed. +Configuring flash size... +Flash will be erased from 0x00000000 to 0x00005fff... +Flash will be erased from 0x00020000 to 0x00235fff... +Flash will be erased from 0x00008000 to 0x00008fff... +Flash will be erased from 0x00016000 to 0x00017fff... +Flash will be erased from 0x006a0000 to 0x0099ffff... +SHA digest in image updated +Compressed 22496 bytes to 14268... +Writing at 0x00000000... (100 %) +Wrote 22496 bytes (14268 compressed) at 0x00000000 in 0.2 seconds (effective 768.9 kbit/s)... +Hash of data verified. +Compressed 2183456 bytes to 1263518... +Writing at 0x00020000... (1 %) +Writing at 0x0002d6dd... (2 %) +Writing at 0x0003a71d... (3 %) +Writing at 0x000484b4... (5 %) +Writing at 0x0005521d... (6 %) +Writing at 0x00063d24... (7 %) +Writing at 0x00072802... (8 %) +Writing at 0x0008112c... (10 %) +Writing at 0x0008ccac... (11 %) +Writing at 0x00091c05... (12 %) +Writing at 0x00097a9e... (14 %) +Writing at 0x0009c625... (15 %) +Writing at 0x000a1481... (16 %) +Writing at 0x000a67ff... (17 %) +Writing at 0x000ae703... (19 %) +Writing at 0x000ba623... (20 %) +Writing at 0x000c1041... (21 %) +Writing at 0x000c81ff... (23 %) +Writing at 0x000ce459... (24 %) +Writing at 0x000d50ef... (25 %) +Writing at 0x000db231... (26 %) +Writing at 0x000e15af... (28 %) +Writing at 0x000e7467... (29 %) +Writing at 0x000ed190... (30 %) +Writing at 0x000f2f45... (32 %) +Writing at 0x000f88c0... (33 %) +Writing at 0x000fe6c4... (34 %) +Writing at 0x001043db... (35 %) +Writing at 0x0010aa9a... (37 %) +Writing at 0x001103e6... (38 %) +Writing at 0x001161f1... (39 %) +Writing at 0x0011c34d... (41 %) +Writing at 0x001224fd... (42 %) +Writing at 0x00128680... (43 %) +Writing at 0x0012e957... (44 %) +Writing at 0x00134ac3... (46 %) +Writing at 0x0013abb4... (47 %) +Writing at 0x001411d5... (48 %) +Writing at 0x00147993... (50 %) +Writing at 0x0014dba3... (51 %) +Writing at 0x0015441e... (52 %) +Writing at 0x0015a5a0... (53 %) +Writing at 0x00160d44... (55 %) +Writing at 0x00166ef8... (56 %) +Writing at 0x0016cf42... (57 %) +Writing at 0x001737ac... (58 %) +Writing at 0x001794f2... (60 %) +Writing at 0x0017f67f... (61 %) +Writing at 0x0018593a... (62 %) +Writing at 0x0018bacf... (64 %) +Writing at 0x00191cc1... (65 %) +Writing at 0x001978b4... (66 %) +Writing at 0x0019d7aa... (67 %) +Writing at 0x001a362b... (69 %) +Writing at 0x001a91c2... (70 %) +Writing at 0x001af3d3... (71 %) +Writing at 0x001b563e... (73 %) +Writing at 0x001bbb88... (74 %) +Writing at 0x001c1f49... (75 %) +Writing at 0x001c7e5e... (76 %) +Writing at 0x001cd96b... (78 %) +Writing at 0x001d3bcc... (79 %) +Writing at 0x001d98fb... (80 %) +Writing at 0x001df9f1... (82 %) +Writing at 0x001e4ef4... (83 %) +Writing at 0x001ea174... (84 %) +Writing at 0x001ef7a2... (85 %) +Writing at 0x001f49c0... (87 %) +Writing at 0x001faa91... (88 %) +Writing at 0x002002da... (89 %) +Writing at 0x0020673c... (91 %) +Writing at 0x0020d4a7... (92 %) +Writing at 0x00214a5f... (93 %) +Writing at 0x0021b72f... (94 %) +Writing at 0x00221ae7... (96 %) +Writing at 0x00227b2f... (97 %) +Writing at 0x0022e27b... (98 %) +Writing at 0x00234311... (100 %) +Wrote 2183456 bytes (1263518 compressed) at 0x00020000 in 11.6 seconds (effective 1510.0 kbit/s)... +Hash of data verified. +Compressed 3072 bytes to 180... +Writing at 0x00008000... (100 %) +Wrote 3072 bytes (180 compressed) at 0x00008000 in 0.0 seconds (effective 691.3 kbit/s)... +Hash of data verified. +Compressed 8192 bytes to 31... +Writing at 0x00016000... (100 %) +Wrote 8192 bytes (31 compressed) at 0x00016000 in 0.0 seconds (effective 1394.3 kbit/s)... +Hash of data verified. +Compressed 3145728 bytes to 1301907... +Writing at 0x006a0000... (1 %) +Writing at 0x006a457e... (2 %) +Writing at 0x006a89e3... (3 %) +Writing at 0x006b047c... (5 %) +Writing at 0x006baf69... (6 %) +Writing at 0x006d1206... (7 %) +Writing at 0x006da3ed... (8 %) +Writing at 0x006def13... (10 %) +Writing at 0x006e398f... (11 %) +Writing at 0x006e81c3... (12 %) +Writing at 0x006ec7fd... (13 %) +Writing at 0x006f0d22... (15 %) +Writing at 0x006f5a46... (16 %) +Writing at 0x006faa98... (17 %) +Writing at 0x006fefab... (18 %) +Writing at 0x007035af... (20 %) +Writing at 0x007082a8... (21 %) +Writing at 0x0070c80f... (22 %) +Writing at 0x007122f1... (23 %) +Writing at 0x007195c7... (25 %) +Writing at 0x0071e795... (26 %) +Writing at 0x00724b4d... (27 %) +Writing at 0x00729ad6... (28 %) +Writing at 0x0072de98... (30 %) +Writing at 0x00732372... (31 %) +Writing at 0x00736749... (32 %) +Writing at 0x0073ab18... (33 %) +Writing at 0x0073eee3... (35 %) +Writing at 0x007433b1... (36 %) +Writing at 0x007477a8... (37 %) +Writing at 0x0074bb76... (38 %) +Writing at 0x0074ff3f... (40 %) +Writing at 0x0075447a... (41 %) +Writing at 0x0075c5f8... (42 %) +Writing at 0x00769000... (43 %) +Writing at 0x00778601... (45 %) +Writing at 0x00789b0f... (46 %) +Writing at 0x0079ac96... (47 %) +Writing at 0x007af271... (48 %) +Writing at 0x007bf6f8... (50 %) +Writing at 0x007d0f1b... (51 %) +Writing at 0x007e45da... (52 %) +Writing at 0x007f75ac... (53 %) +Writing at 0x00807e03... (55 %) +Writing at 0x0081a13e... (56 %) +Writing at 0x0082d777... (57 %) +Writing at 0x0083fde1... (58 %) +Writing at 0x0085163b... (60 %) +Writing at 0x0085ee5a... (61 %) +Writing at 0x0086c200... (62 %) +Writing at 0x008775dc... (63 %) +Writing at 0x00883eaf... (65 %) +Writing at 0x008903ff... (66 %) +Writing at 0x00897717... (67 %) +Writing at 0x0089ba87... (68 %) +Writing at 0x0089feb5... (70 %) +Writing at 0x008a4410... (71 %) +Writing at 0x008a884e... (72 %) +Writing at 0x008acbf6... (73 %) +Writing at 0x008b17d0... (75 %) +Writing at 0x008b5b99... (76 %) +Writing at 0x008b9f62... (77 %) +Writing at 0x008be429... (78 %) +Writing at 0x008c27e8... (80 %) +Writing at 0x008c6bba... (81 %) +Writing at 0x008caf7b... (82 %) +Writing at 0x008cf43f... (83 %) +Writing at 0x008d3802... (85 %) +Writing at 0x008d7bc6... (86 %) +Writing at 0x008dbf87... (87 %) +Writing at 0x008e0a40... (88 %) +Writing at 0x008e6b82... (90 %) +Writing at 0x008eaf45... (91 %) +Writing at 0x008ef3fe... (92 %) +Writing at 0x008f3874... (93 %) +Writing at 0x008fc62d... (95 %) +Writing at 0x0090dc54... (96 %) +Writing at 0x0091db75... (97 %) +Writing at 0x0092f6a7... (98 %) +Writing at 0x0093dbfb... (100 %) +Wrote 3145728 bytes (1301907 compressed) at 0x006a0000 in 14.5 seconds (effective 1738.0 kbit/s)... +Hash of data verified. + +Leaving... +Hard resetting via RTS pin... +Done diff --git a/docs/repair/ssh-poll-stack/device-candidate/restore-health.json b/docs/repair/ssh-poll-stack/device-candidate/restore-health.json new file mode 100644 index 0000000..c41961c --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/restore-health.json @@ -0,0 +1,220 @@ +{ + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 14827 + } + }, + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 5368, + "core": 2147483647, + "state": "running" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1824, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1388, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2824, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 536, + "core": 0, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1628, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15152, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2488, + "core": 0, + "state": "suspended" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 3812, + "core": 2147483647, + "state": "suspended" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 528, + "core": 1, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7674516, + "min_free_heap": 7645272, + "internal": { + "total": 308167, + "free": 74279, + "allocated": 233888, + "largest_block": 31744 + }, + "psram": { + "total": 8370364, + "free": 7615760, + "allocated": 754604, + "largest_block": 7602176 + } + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round1-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round1-closed.json new file mode 100644 index 0000000..016927e --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round1-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round1_closed_local_help", + "time": "2026-09-28T18:15:15.752403", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7672364, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370332, + "free": 7614416, + "allocated": 755916, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 319336 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round10-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round10-closed.json new file mode 100644 index 0000000..831455f --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round10-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round10_closed", + "time": "2026-09-28T18:23:11.863874", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1060, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1564, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2504, + "core": 0, + "state": "suspended" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7671576, + "min_free_heap": 7549148, + "internal": { + "total": 308083, + "free": 73359, + "allocated": 234724, + "largest_block": 31744 + }, + "psram": { + "total": 8370312, + "free": 7613736, + "allocated": 756576, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 795443 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round2-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round2-closed.json new file mode 100644 index 0000000..2b1b46a --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round2-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round2_closed", + "time": "2026-09-28T18:16:04.490257", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7672156, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370328, + "free": 7614208, + "allocated": 756120, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 368074 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round3-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round3-closed.json new file mode 100644 index 0000000..755ab04 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round3-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round3_closed", + "time": "2026-09-28T18:16:44.614563", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7671944, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370324, + "free": 7613996, + "allocated": 756328, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 408198 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round4-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round4-closed.json new file mode 100644 index 0000000..4051178 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round4-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round4_closed", + "time": "2026-09-28T18:17:44.745380", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "ready" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7671944, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370324, + "free": 7613996, + "allocated": 756328, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 468330 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round5-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round5-closed.json new file mode 100644 index 0000000..4039ef9 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round5-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round5_closed", + "time": "2026-09-28T18:18:53.414995", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7671940, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370324, + "free": 7613996, + "allocated": 756328, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 536996 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round6-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round6-closed.json new file mode 100644 index 0000000..9b3923c --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round6-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round6_closed", + "time": "2026-09-28T18:19:31.243581", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7671940, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370324, + "free": 7613996, + "allocated": 756328, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 574826 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round7-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round7-closed.json new file mode 100644 index 0000000..b608041 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round7-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round7_closed", + "time": "2026-09-28T18:20:26.377107", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7671720, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370320, + "free": 7613768, + "allocated": 756552, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 629959 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round8-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round8-closed.json new file mode 100644 index 0000000..216896a --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round8-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round8_closed", + "time": "2026-09-28T18:21:21.129939", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "ready" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7670896, + "min_free_heap": 7550256, + "internal": { + "total": 308075, + "free": 73203, + "allocated": 234872, + "largest_block": 31744 + }, + "psram": { + "total": 8370292, + "free": 7613204, + "allocated": 757088, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 684751 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/round9-closed.json b/docs/repair/ssh-poll-stack/device-candidate/round9-closed.json new file mode 100644 index 0000000..e782f77 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/round9-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round9_closed", + "time": "2026-09-28T18:22:25.667469", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1564, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7671940, + "min_free_heap": 7550256, + "internal": { + "total": 308083, + "free": 73443, + "allocated": 234640, + "largest_block": 31744 + }, + "psram": { + "total": 8370324, + "free": 7613996, + "allocated": 756328, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 749250 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/samples.jsonl b/docs/repair/ssh-poll-stack/device-candidate/samples.jsonl new file mode 100644 index 0000000..0861b09 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/samples.jsonl @@ -0,0 +1,368 @@ +{"time": "2026-09-28T18:10:49.960268", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1692, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1384, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673344, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614824, "allocated": 755520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 53548}}} +{"time": "2026-09-28T18:10:52.034617", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1692, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 55612}}} +{"time": "2026-09-28T18:10:54.098290", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1692, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673352, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614824, "allocated": 755520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 57670}}} +{"time": "2026-09-28T18:10:56.156293", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1692, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 59731}}} +{"time": "2026-09-28T18:10:58.214361", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1692, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 61789}}} +{"time": "2026-09-28T18:11:00.271306", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7666824, "min_free_heap": 7551012, "internal": {"total": 308143, "free": 73975, "allocated": 234168, "largest_block": 31744}, "psram": {"total": 8369732, "free": 7608388, "allocated": 761344, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 63850}}} +{"time": "2026-09-28T18:11:02.335874", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672580, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370340, "free": 7614056, "allocated": 756284, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 65923}}} +{"time": "2026-09-28T18:11:04.409353", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614824, "allocated": 755520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 67987}}} +{"time": "2026-09-28T18:11:06.471037", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 70050}}} +{"time": "2026-09-28T18:11:08.535534", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 72111}}} +{"time": "2026-09-28T18:11:10.595547", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 74171}}} +{"time": "2026-09-28T18:11:12.652458", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614824, "allocated": 755520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 76232}}} +{"time": "2026-09-28T18:11:14.718013", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672764, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370336, "free": 7614252, "allocated": 756084, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 78312}}} +{"time": "2026-09-28T18:11:16.796533", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 80372}}} +{"time": "2026-09-28T18:11:18.854249", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614824, "allocated": 755520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 82431}}} +{"time": "2026-09-28T18:11:20.914802", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614824, "allocated": 755520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 84493}}} +{"time": "2026-09-28T18:11:22.979305", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673352, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614824, "allocated": 755520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 86557}}} +{"time": "2026-09-28T18:11:25.039640", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1660, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1352, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7673348, "min_free_heap": 7551012, "internal": {"total": 308147, "free": 74039, "allocated": 234108, "largest_block": 31744}, "psram": {"total": 8370344, "free": 7614828, "allocated": 755516, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 88615}}} +{"time": "2026-09-28T18:11:27.097065", "tasks": {"code": 0, "data": {"tasks": [{"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "ready"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 5108, "core": 2147483647, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3808, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671200, "min_free_heap": 7551012, "internal": {"total": 308127, "free": 73523, "allocated": 234604, "largest_block": 31744}, "psram": {"total": 8370288, "free": 7613180, "allocated": 757108, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 93374}}} +{"time": "2026-09-28T18:11:31.858951", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 4772, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671120, "min_free_heap": 7550436, "internal": {"total": 308083, "free": 73119, "allocated": 234964, "largest_block": 31744}, "psram": {"total": 8370288, "free": 7613504, "allocated": 756784, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 95439}}} +{"time": "2026-09-28T18:11:33.923549", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2696, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670996, "min_free_heap": 7550256, "internal": {"total": 308071, "free": 72999, "allocated": 235072, "largest_block": 31744}, "psram": {"total": 8370288, "free": 7613492, "allocated": 756796, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 97503}}} +{"time": "2026-09-28T18:11:35.983897", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670756, "min_free_heap": 7550256, "internal": {"total": 308067, "free": 72963, "allocated": 235104, "largest_block": 31744}, "psram": {"total": 8370284, "free": 7613300, "allocated": 756984, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 99563}}} +{"time": "2026-09-28T18:11:38.048411", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670756, "min_free_heap": 7550256, "internal": {"total": 308067, "free": 72963, "allocated": 235104, "largest_block": 31744}, "psram": {"total": 8370284, "free": 7613316, "allocated": 756968, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 101621}}} +{"time": "2026-09-28T18:11:40.109784", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670756, "min_free_heap": 7550256, "internal": {"total": 308067, "free": 72963, "allocated": 235104, "largest_block": 31744}, "psram": {"total": 8370284, "free": 7613296, "allocated": 756988, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 103684}}} +{"time": "2026-09-28T18:11:42.169759", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670756, "min_free_heap": 7550256, "internal": {"total": 308067, "free": 72963, "allocated": 235104, "largest_block": 31744}, "psram": {"total": 8370284, "free": 7613304, "allocated": 756980, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 105744}}} +{"time": "2026-09-28T18:11:44.226229", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670756, "min_free_heap": 7550256, "internal": {"total": 308067, "free": 72963, "allocated": 235104, "largest_block": 31744}, "psram": {"total": 8370284, "free": 7613316, "allocated": 756968, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 107804}}} +{"time": "2026-09-28T18:11:46.288887", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670756, "min_free_heap": 7550256, "internal": {"total": 308067, "free": 72963, "allocated": 235104, "largest_block": 31744}, "psram": {"total": 8370284, "free": 7613300, "allocated": 756984, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 109866}}} +{"time": "2026-09-28T18:11:48.349018", "tasks": {"code": 0, "data": {"tasks": [{"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7669980, "min_free_heap": 7550256, "internal": {"total": 308067, "free": 72963, "allocated": 235104, "largest_block": 31744}, "psram": {"total": 8370280, "free": 7612524, "allocated": 757756, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 111939}}} +{"time": "2026-09-28T18:11:50.423444", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4288, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7598948, "min_free_heap": 7550256, "internal": {"total": 308019, "free": 71979, "allocated": 236040, "largest_block": 31744}, "psram": {"total": 8370184, "free": 7542484, "allocated": 827700, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 114001}}} +{"time": "2026-09-28T18:11:52.486603", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7598948, "min_free_heap": 7550256, "internal": {"total": 308019, "free": 71979, "allocated": 236040, "largest_block": 31744}, "psram": {"total": 8370184, "free": 7542476, "allocated": 827708, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 116061}}} +{"time": "2026-09-28T18:11:54.546025", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7599724, "min_free_heap": 7550256, "internal": {"total": 308019, "free": 71979, "allocated": 236040, "largest_block": 31744}, "psram": {"total": 8370188, "free": 7543244, "allocated": 826944, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 118121}}} +{"time": "2026-09-28T18:11:56.605947", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7599724, "min_free_heap": 7550256, "internal": {"total": 308019, "free": 71979, "allocated": 236040, "largest_block": 31744}, "psram": {"total": 8370188, "free": 7543232, "allocated": 826956, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 120184}}} +{"time": "2026-09-28T18:11:58.671577", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7599704, "min_free_heap": 7550256, "internal": {"total": 308019, "free": 71979, "allocated": 236040, "largest_block": 31744}, "psram": {"total": 8370188, "free": 7543228, "allocated": 826960, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 122246}}} +{"time": "2026-09-28T18:12:00.731659", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7599716, "min_free_heap": 7550256, "internal": {"total": 308019, "free": 71979, "allocated": 236040, "largest_block": 31744}, "psram": {"total": 8370188, "free": 7543240, "allocated": 826948, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 124306}}} +{"time": "2026-09-28T18:12:02.791320", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7599720, "min_free_heap": 7550256, "internal": {"total": 308019, "free": 71979, "allocated": 236040, "largest_block": 31744}, "psram": {"total": 8370188, "free": 7543240, "allocated": 826948, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 126372}}} +{"time": "2026-09-28T18:12:04.858803", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544400, "allocated": 825836, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 128431}}} +{"time": "2026-09-28T18:12:06.918265", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 130495}}} +{"time": "2026-09-28T18:12:08.980984", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 132552}}} +{"time": "2026-09-28T18:12:11.037088", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 134617}}} +{"time": "2026-09-28T18:12:13.101696", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 136676}}} +{"time": "2026-09-28T18:12:15.161926", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 138739}}} +{"time": "2026-09-28T18:12:17.224564", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 140804}}} +{"time": "2026-09-28T18:12:19.290058", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 142870}}} +{"time": "2026-09-28T18:12:21.351880", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544384, "allocated": 825852, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 144924}}} +{"time": "2026-09-28T18:12:23.420755", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 146999}}} +{"time": "2026-09-28T18:12:25.482284", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 149061}}} +{"time": "2026-09-28T18:12:27.544833", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544388, "allocated": 825848, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 151120}}} +{"time": "2026-09-28T18:12:29.607198", "tasks": {"code": 0, "data": {"tasks": [{"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601332, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544364, "allocated": 825872, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 153183}}} +{"time": "2026-09-28T18:12:31.664444", "tasks": {"code": 0, "data": {"tasks": [{"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "ready"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544400, "allocated": 825836, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 155237}}} +{"time": "2026-09-28T18:12:33.723986", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 157300}}} +{"time": "2026-09-28T18:12:35.785689", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544376, "allocated": 825860, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 159360}}} +{"time": "2026-09-28T18:12:37.847449", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 161429}}} +{"time": "2026-09-28T18:12:39.913988", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 163488}}} +{"time": "2026-09-28T18:12:41.974805", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 165547}}} +{"time": "2026-09-28T18:12:44.032713", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 167608}}} +{"time": "2026-09-28T18:12:46.093910", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601340, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544372, "allocated": 825864, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 169666}}} +{"time": "2026-09-28T18:12:48.151329", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 171725}}} +{"time": "2026-09-28T18:12:50.209378", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 173782}}} +{"time": "2026-09-28T18:12:52.267628", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 175844}}} +{"time": "2026-09-28T18:12:54.326772", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544376, "allocated": 825860, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 177899}}} +{"time": "2026-09-28T18:12:56.387017", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601352, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 179961}}} +{"time": "2026-09-28T18:12:58.443866", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600576, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7543632, "allocated": 826600, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 182021}}} +{"time": "2026-09-28T18:13:00.506686", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544388, "allocated": 825848, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 184082}}} +{"time": "2026-09-28T18:13:02.569592", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 186145}}} +{"time": "2026-09-28T18:13:04.633237", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544376, "allocated": 825860, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 188205}}} +{"time": "2026-09-28T18:13:06.690794", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601340, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544372, "allocated": 825864, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 190265}}} +{"time": "2026-09-28T18:13:08.751042", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544376, "allocated": 825860, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 192325}}} +{"time": "2026-09-28T18:13:10.812363", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 194386}}} +{"time": "2026-09-28T18:13:12.872002", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601336, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544372, "allocated": 825864, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 196444}}} +{"time": "2026-09-28T18:13:14.929368", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 198502}}} +{"time": "2026-09-28T18:13:16.989963", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 200567}}} +{"time": "2026-09-28T18:13:19.053220", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 202632}}} +{"time": "2026-09-28T18:13:21.115685", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 204695}}} +{"time": "2026-09-28T18:13:23.182506", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 206760}}} +{"time": "2026-09-28T18:13:25.246929", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 208824}}} +{"time": "2026-09-28T18:13:27.307829", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 210885}}} +{"time": "2026-09-28T18:13:29.367174", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 212943}}} +{"time": "2026-09-28T18:13:31.428964", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601348, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 215007}}} +{"time": "2026-09-28T18:13:33.502457", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600576, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7543632, "allocated": 826600, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 217078}}} +{"time": "2026-09-28T18:13:35.566099", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600576, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7543632, "allocated": 826600, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 219142}}} +{"time": "2026-09-28T18:13:37.627497", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 221206}}} +{"time": "2026-09-28T18:13:39.690706", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 223267}}} +{"time": "2026-09-28T18:13:41.753268", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601560, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544612, "allocated": 825628, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 225329}}} +{"time": "2026-09-28T18:13:43.813587", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 227388}}} +{"time": "2026-09-28T18:13:45.875011", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 229451}}} +{"time": "2026-09-28T18:13:47.938210", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 231515}}} +{"time": "2026-09-28T18:13:50.002244", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 233581}}} +{"time": "2026-09-28T18:13:52.067333", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 235647}}} +{"time": "2026-09-28T18:13:54.132487", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 237710}}} +{"time": "2026-09-28T18:13:56.197078", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 239773}}} +{"time": "2026-09-28T18:13:58.260192", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 241838}}} +{"time": "2026-09-28T18:14:00.325059", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544588, "allocated": 825652, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 243901}}} +{"time": "2026-09-28T18:14:02.383715", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 245959}}} +{"time": "2026-09-28T18:14:04.443762", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 248018}}} +{"time": "2026-09-28T18:14:06.504065", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600788, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7543844, "allocated": 826392, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 250082}}} +{"time": "2026-09-28T18:14:08.569026", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600780, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7543812, "allocated": 826424, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 252148}}} +{"time": "2026-09-28T18:14:10.642469", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600792, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7543844, "allocated": 826392, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 254220}}} +{"time": "2026-09-28T18:14:12.708729", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 256286}}} +{"time": "2026-09-28T18:14:14.770725", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 258348}}} +{"time": "2026-09-28T18:14:16.834953", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 260415}}} +{"time": "2026-09-28T18:14:18.901828", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 262479}}} +{"time": "2026-09-28T18:14:20.963959", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 264543}}} +{"time": "2026-09-28T18:14:23.031247", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 266607}}} +{"time": "2026-09-28T18:14:25.091220", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 268670}}} +{"time": "2026-09-28T18:14:27.157321", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 270732}}} +{"time": "2026-09-28T18:14:29.218898", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 272798}}} +{"time": "2026-09-28T18:14:31.283562", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 274862}}} +{"time": "2026-09-28T18:14:33.344800", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 276923}}} +{"time": "2026-09-28T18:14:35.411044", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 278984}}} +{"time": "2026-09-28T18:14:37.469883", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 281045}}} +{"time": "2026-09-28T18:14:39.531006", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601564, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544616, "allocated": 825624, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 283114}}} +{"time": "2026-09-28T18:14:41.603107", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600784, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7543828, "allocated": 826408, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 285183}}} +{"time": "2026-09-28T18:14:43.666651", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600788, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7543844, "allocated": 826392, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 287239}}} +{"time": "2026-09-28T18:14:45.724143", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671592, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7613644, "allocated": 756684, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 289305}}} +{"time": "2026-09-28T18:14:47.791781", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 291369}}} +{"time": "2026-09-28T18:14:49.855564", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 293431}}} +{"time": "2026-09-28T18:14:51.916196", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 295486}}} +{"time": "2026-09-28T18:14:53.972022", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 297549}}} +{"time": "2026-09-28T18:14:56.034160", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 299609}}} +{"time": "2026-09-28T18:14:58.095239", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672360, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 301666}}} +{"time": "2026-09-28T18:15:00.152606", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672360, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 303725}}} +{"time": "2026-09-28T18:15:02.211382", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 305789}}} +{"time": "2026-09-28T18:15:04.274676", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 307845}}} +{"time": "2026-09-28T18:15:06.331766", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672360, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 309905}}} +{"time": "2026-09-28T18:15:08.391491", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672368, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614436, "allocated": 755896, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 311963}}} +{"time": "2026-09-28T18:15:10.446647", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 314018}}} +{"time": "2026-09-28T18:15:12.504545", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 316075}}} +{"time": "2026-09-28T18:15:14.557240", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 318132}}} +{"time": "2026-09-28T18:15:16.632891", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672368, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614420, "allocated": 755912, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 320210}}} +{"time": "2026-09-28T18:15:18.696398", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614420, "allocated": 755912, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 322267}}} +{"time": "2026-09-28T18:15:20.754598", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614420, "allocated": 755912, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 324324}}} +{"time": "2026-09-28T18:15:22.808623", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672368, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614420, "allocated": 755912, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 326380}}} +{"time": "2026-09-28T18:15:24.867715", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672368, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614420, "allocated": 755912, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 328439}}} +{"time": "2026-09-28T18:15:26.927359", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672368, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614420, "allocated": 755912, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 330505}}} +{"time": "2026-09-28T18:15:28.992152", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672368, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614420, "allocated": 755912, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 332571}}} +{"time": "2026-09-28T18:15:31.056588", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672364, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370332, "free": 7614416, "allocated": 755916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 334636}}} +{"time": "2026-09-28T18:15:33.123046", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4300, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601552, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544584, "allocated": 825656, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 336695}}} +{"time": "2026-09-28T18:15:35.183530", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4108, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601552, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72447, "allocated": 235588, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544592, "allocated": 825648, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 338760}}} +{"time": "2026-09-28T18:15:37.247133", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4108, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601552, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72447, "allocated": 235588, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544592, "allocated": 825648, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 340825}}} +{"time": "2026-09-28T18:15:39.309907", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4108, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601552, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72447, "allocated": 235588, "largest_block": 31744}, "psram": {"total": 8370240, "free": 7544592, "allocated": 825648, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 342886}}} +{"time": "2026-09-28T18:15:41.374928", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614224, "allocated": 756104, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 344947}}} +{"time": "2026-09-28T18:15:43.435054", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614204, "allocated": 756124, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 347011}}} +{"time": "2026-09-28T18:15:45.497124", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614224, "allocated": 756104, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 349070}}} +{"time": "2026-09-28T18:15:47.557113", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614224, "allocated": 756104, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 351128}}} +{"time": "2026-09-28T18:15:49.614591", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614204, "allocated": 756124, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 353193}}} +{"time": "2026-09-28T18:15:51.677312", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671380, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613432, "allocated": 756892, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 355251}}} +{"time": "2026-09-28T18:15:53.737444", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614224, "allocated": 756104, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 357309}}} +{"time": "2026-09-28T18:15:55.794926", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614204, "allocated": 756124, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 359367}}} +{"time": "2026-09-28T18:15:57.854186", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614216, "allocated": 756112, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 361437}}} +{"time": "2026-09-28T18:15:59.921856", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614208, "allocated": 756120, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 363494}}} +{"time": "2026-09-28T18:16:01.983053", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614204, "allocated": 756124, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 365555}}} +{"time": "2026-09-28T18:16:04.042187", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614208, "allocated": 756120, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 367613}}} +{"time": "2026-09-28T18:16:06.099990", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614204, "allocated": 756124, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 369673}}} +{"time": "2026-09-28T18:16:08.159510", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614208, "allocated": 756120, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 371732}}} +{"time": "2026-09-28T18:16:10.215713", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614208, "allocated": 756120, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 373785}}} +{"time": "2026-09-28T18:16:12.271379", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614204, "allocated": 756124, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 375841}}} +{"time": "2026-09-28T18:16:14.326278", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4288, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601372, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544408, "allocated": 825828, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 378720}}} +{"time": "2026-09-28T18:16:17.206372", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601368, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 380783}}} +{"time": "2026-09-28T18:16:19.267735", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601368, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544404, "allocated": 825832, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 382846}}} +{"time": "2026-09-28T18:16:21.330662", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 384907}}} +{"time": "2026-09-28T18:16:23.393184", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 386965}}} +{"time": "2026-09-28T18:16:25.448667", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 389018}}} +{"time": "2026-09-28T18:16:27.505227", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 391078}}} +{"time": "2026-09-28T18:16:29.564303", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 393140}}} +{"time": "2026-09-28T18:16:31.623398", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 395200}}} +{"time": "2026-09-28T18:16:33.686701", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671160, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613228, "allocated": 757092, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 397267}}} +{"time": "2026-09-28T18:16:35.749714", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671156, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613224, "allocated": 757096, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 399323}}} +{"time": "2026-09-28T18:16:37.808195", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671172, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613240, "allocated": 757080, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 401382}}} +{"time": "2026-09-28T18:16:39.869681", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613988, "allocated": 756336, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 403446}}} +{"time": "2026-09-28T18:16:41.933072", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671932, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 405506}}} +{"time": "2026-09-28T18:16:43.993227", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 407565}}} +{"time": "2026-09-28T18:16:46.054251", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 409629}}} +{"time": "2026-09-28T18:16:48.113211", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 411683}}} +{"time": "2026-09-28T18:16:50.169709", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 413739}}} +{"time": "2026-09-28T18:16:52.226147", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 415798}}} +{"time": "2026-09-28T18:16:54.286992", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 417860}}} +{"time": "2026-09-28T18:16:56.345654", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 419919}}} +{"time": "2026-09-28T18:16:58.403676", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 421978}}} +{"time": "2026-09-28T18:17:00.467631", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 424044}}} +{"time": "2026-09-28T18:17:02.531791", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 426108}}} +{"time": "2026-09-28T18:17:04.595757", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 428171}}} +{"time": "2026-09-28T18:17:06.657279", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 430229}}} +{"time": "2026-09-28T18:17:08.717470", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613160, "allocated": 757160, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 432300}}} +{"time": "2026-09-28T18:17:10.785388", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671172, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613236, "allocated": 757084, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 434368}}} +{"time": "2026-09-28T18:17:12.855793", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4288, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7599472, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370228, "free": 7542756, "allocated": 827472, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 436439}}} +{"time": "2026-09-28T18:17:14.924425", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600984, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370224, "free": 7544012, "allocated": 826212, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 438508}}} +{"time": "2026-09-28T18:17:16.997084", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601148, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544164, "allocated": 826068, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 440575}}} +{"time": "2026-09-28T18:17:19.062827", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 442635}}} +{"time": "2026-09-28T18:17:21.122856", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 444694}}} +{"time": "2026-09-28T18:17:23.180242", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 446758}}} +{"time": "2026-09-28T18:17:25.245739", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 448816}}} +{"time": "2026-09-28T18:17:27.302832", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 450879}}} +{"time": "2026-09-28T18:17:29.364552", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 452936}}} +{"time": "2026-09-28T18:17:31.425550", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 455003}}} +{"time": "2026-09-28T18:17:33.484850", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 457055}}} +{"time": "2026-09-28T18:17:35.542623", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 459116}}} +{"time": "2026-09-28T18:17:37.603456", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 461178}}} +{"time": "2026-09-28T18:17:39.664966", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 463235}}} +{"time": "2026-09-28T18:17:41.722189", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 465296}}} +{"time": "2026-09-28T18:17:43.784016", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 467359}}} +{"time": "2026-09-28T18:17:45.846830", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 469423}}} +{"time": "2026-09-28T18:17:47.912128", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 471486}}} +{"time": "2026-09-28T18:17:49.973621", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 473542}}} +{"time": "2026-09-28T18:17:52.031399", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 475603}}} +{"time": "2026-09-28T18:17:54.090271", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 477665}}} +{"time": "2026-09-28T18:17:56.152624", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 479721}}} +{"time": "2026-09-28T18:17:58.208624", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 481783}}} +{"time": "2026-09-28T18:18:00.270448", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 483842}}} +{"time": "2026-09-28T18:18:02.328945", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 485906}}} +{"time": "2026-09-28T18:18:04.394337", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 487970}}} +{"time": "2026-09-28T18:18:06.458231", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 490033}}} +{"time": "2026-09-28T18:18:08.518330", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 492092}}} +{"time": "2026-09-28T18:18:10.581616", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 494153}}} +{"time": "2026-09-28T18:18:12.636092", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614008, "allocated": 756316, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 496209}}} +{"time": "2026-09-28T18:18:14.697036", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 498271}}} +{"time": "2026-09-28T18:18:16.759615", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 500335}}} +{"time": "2026-09-28T18:18:18.822245", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671168, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613220, "allocated": 757100, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 502404}}} +{"time": "2026-09-28T18:18:20.888626", "tasks": {"code": 0, "data": {"tasks": [{"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7672152, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370328, "free": 7614216, "allocated": 756112, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 504461}}} +{"time": "2026-09-28T18:18:22.949203", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4544, "core": 2147483647, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601332, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72459, "allocated": 235576, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544288, "allocated": 825944, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 506741}}} +{"time": "2026-09-28T18:18:25.225149", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601332, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72447, "allocated": 235588, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544380, "allocated": 825856, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 508802}}} +{"time": "2026-09-28T18:18:27.288557", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601324, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72447, "allocated": 235588, "largest_block": 31744}, "psram": {"total": 8370236, "free": 7544364, "allocated": 825872, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 510863}}} +{"time": "2026-09-28T18:18:29.350912", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 512925}}} +{"time": "2026-09-28T18:18:31.409663", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 514985}}} +{"time": "2026-09-28T18:18:33.472960", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 517044}}} +{"time": "2026-09-28T18:18:35.530833", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 519101}}} +{"time": "2026-09-28T18:18:37.588815", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 521162}}} +{"time": "2026-09-28T18:18:39.650711", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 523223}}} +{"time": "2026-09-28T18:18:41.710616", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613988, "allocated": 756336, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 525282}}} +{"time": "2026-09-28T18:18:43.766974", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 527343}}} +{"time": "2026-09-28T18:18:45.830585", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 529411}}} +{"time": "2026-09-28T18:18:47.899413", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671168, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613220, "allocated": 757100, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 531481}}} +{"time": "2026-09-28T18:18:49.964245", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 533539}}} +{"time": "2026-09-28T18:18:52.026308", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 535602}}} +{"time": "2026-09-28T18:18:54.088292", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 537666}}} +{"time": "2026-09-28T18:18:56.156708", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 539728}}} +{"time": "2026-09-28T18:18:58.213957", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 541785}}} +{"time": "2026-09-28T18:19:00.272451", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 543850}}} +{"time": "2026-09-28T18:19:02.337987", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4300, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601152, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544172, "allocated": 826060, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 545913}}} +{"time": "2026-09-28T18:19:04.397763", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4108, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601148, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544168, "allocated": 826064, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 547971}}} +{"time": "2026-09-28T18:19:06.458867", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4108, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601156, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544176, "allocated": 826056, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 550035}}} +{"time": "2026-09-28T18:19:08.524424", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613796, "allocated": 756524, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 552093}}} +{"time": "2026-09-28T18:19:10.579111", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 554150}}} +{"time": "2026-09-28T18:19:12.639518", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 556215}}} +{"time": "2026-09-28T18:19:14.703401", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 558273}}} +{"time": "2026-09-28T18:19:16.760595", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 560336}}} +{"time": "2026-09-28T18:19:18.823678", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 562394}}} +{"time": "2026-09-28T18:19:20.883232", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671096, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613164, "allocated": 757156, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 564466}}} +{"time": "2026-09-28T18:19:22.950400", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671172, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613240, "allocated": 757080, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 566523}}} +{"time": "2026-09-28T18:19:25.011011", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671172, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613236, "allocated": 757084, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 568585}}} +{"time": "2026-09-28T18:19:27.074655", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 570648}}} +{"time": "2026-09-28T18:19:29.135361", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 572708}}} +{"time": "2026-09-28T18:19:31.195399", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 574766}}} +{"time": "2026-09-28T18:19:33.253710", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 576826}}} +{"time": "2026-09-28T18:19:35.313323", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 578881}}} +{"time": "2026-09-28T18:19:37.369310", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 580939}}} +{"time": "2026-09-28T18:19:39.426531", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 582998}}} +{"time": "2026-09-28T18:19:41.486618", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 585060}}} +{"time": "2026-09-28T18:19:43.547754", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 587124}}} +{"time": "2026-09-28T18:19:45.612236", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 589189}}} +{"time": "2026-09-28T18:19:47.677772", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 591255}}} +{"time": "2026-09-28T18:19:49.738317", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 593316}}} +{"time": "2026-09-28T18:19:51.804554", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 595375}}} +{"time": "2026-09-28T18:19:53.863282", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 597440}}} +{"time": "2026-09-28T18:19:55.928364", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4288, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600244, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370228, "free": 7543312, "allocated": 826916, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 599514}}} +{"time": "2026-09-28T18:19:57.999845", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600356, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370228, "free": 7543388, "allocated": 826840, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 601575}}} +{"time": "2026-09-28T18:20:00.061702", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600356, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370228, "free": 7543388, "allocated": 826840, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 603640}}} +{"time": "2026-09-28T18:20:02.128598", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601128, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544160, "allocated": 826072, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 605713}}} +{"time": "2026-09-28T18:20:04.201642", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613792, "allocated": 756528, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 607777}}} +{"time": "2026-09-28T18:20:06.264948", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 609836}}} +{"time": "2026-09-28T18:20:08.323903", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 611899}}} +{"time": "2026-09-28T18:20:10.387499", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 613957}}} +{"time": "2026-09-28T18:20:12.446976", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 616021}}} +{"time": "2026-09-28T18:20:14.507333", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 618079}}} +{"time": "2026-09-28T18:20:16.567413", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 620138}}} +{"time": "2026-09-28T18:20:18.627178", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 622199}}} +{"time": "2026-09-28T18:20:20.687115", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 624263}}} +{"time": "2026-09-28T18:20:22.750349", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 626327}}} +{"time": "2026-09-28T18:20:24.813037", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 628387}}} +{"time": "2026-09-28T18:20:26.874658", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 630445}}} +{"time": "2026-09-28T18:20:28.929406", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 632501}}} +{"time": "2026-09-28T18:20:30.989770", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 634572}}} +{"time": "2026-09-28T18:20:33.059739", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 636629}}} +{"time": "2026-09-28T18:20:35.119325", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 638699}}} +{"time": "2026-09-28T18:20:37.185283", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 640762}}} +{"time": "2026-09-28T18:20:39.246867", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 642821}}} +{"time": "2026-09-28T18:20:41.307478", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 644883}}} +{"time": "2026-09-28T18:20:43.372248", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 646946}}} +{"time": "2026-09-28T18:20:45.434335", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 649010}}} +{"time": "2026-09-28T18:20:47.498809", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4288, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601148, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72471, "allocated": 235564, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544180, "allocated": 826052, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 651753}}} +{"time": "2026-09-28T18:20:50.238406", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601148, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72471, "allocated": 235564, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544180, "allocated": 826052, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 653813}}} +{"time": "2026-09-28T18:20:52.300105", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601152, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72471, "allocated": 235564, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544184, "allocated": 826048, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 655878}}} +{"time": "2026-09-28T18:20:54.367041", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601148, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72471, "allocated": 235564, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544180, "allocated": 826052, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 657944}}} +{"time": "2026-09-28T18:20:56.434721", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 660009}}} +{"time": "2026-09-28T18:20:58.494414", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 662071}}} +{"time": "2026-09-28T18:21:00.558727", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671716, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 664131}}} +{"time": "2026-09-28T18:21:02.619219", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 666193}}} +{"time": "2026-09-28T18:21:04.681630", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 668251}}} +{"time": "2026-09-28T18:21:06.739671", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 670313}}} +{"time": "2026-09-28T18:21:08.799408", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 672369}}} +{"time": "2026-09-28T18:21:10.857113", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 674428}}} +{"time": "2026-09-28T18:21:12.916054", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 676486}}} +{"time": "2026-09-28T18:21:14.971773", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 678544}}} +{"time": "2026-09-28T18:21:17.032766", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613140, "allocated": 757180, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 680613}}} +{"time": "2026-09-28T18:21:19.101284", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671928, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 682676}}} +{"time": "2026-09-28T18:21:21.164182", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1596, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671312, "min_free_heap": 7550256, "internal": {"total": 308079, "free": 73323, "allocated": 234756, "largest_block": 31744}, "psram": {"total": 8370304, "free": 7613492, "allocated": 756812, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 684762}}} +{"time": "2026-09-28T18:21:23.250196", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 686821}}} +{"time": "2026-09-28T18:21:25.307727", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671936, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 688876}}} +{"time": "2026-09-28T18:21:27.363083", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 690935}}} +{"time": "2026-09-28T18:21:29.423819", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 692996}}} +{"time": "2026-09-28T18:21:31.484275", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 695053}}} +{"time": "2026-09-28T18:21:33.541844", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 697118}}} +{"time": "2026-09-28T18:21:35.607433", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 699184}}} +{"time": "2026-09-28T18:21:37.673375", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 701248}}} +{"time": "2026-09-28T18:21:39.737468", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 703313}}} +{"time": "2026-09-28T18:21:41.801684", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 705373}}} +{"time": "2026-09-28T18:21:43.861492", "tasks": {"code": 0, "data": {"tasks": [{"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614004, "allocated": 756320, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 707435}}} +{"time": "2026-09-28T18:21:45.923862", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671916, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613988, "allocated": 756336, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 709492}}} +{"time": "2026-09-28T18:21:47.978354", "tasks": {"code": 0, "data": {"tasks": [{"name": "ssh_poll", "priority": 5, "stack_hwm": 4288, "core": 2147483647, "state": "ready"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601136, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72463, "allocated": 235572, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544172, "allocated": 826060, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 712500}}} +{"time": "2026-09-28T18:21:50.988734", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601152, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72463, "allocated": 235572, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544188, "allocated": 826044, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 714561}}} +{"time": "2026-09-28T18:21:53.046664", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4096, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601140, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72463, "allocated": 235572, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544176, "allocated": 826056, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 716625}}} +{"time": "2026-09-28T18:21:55.112330", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3952, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600380, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72463, "allocated": 235572, "largest_block": 31744}, "psram": {"total": 8370228, "free": 7543416, "allocated": 826812, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 718695}}} +{"time": "2026-09-28T18:21:57.183979", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3952, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7600380, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72463, "allocated": 235572, "largest_block": 31744}, "psram": {"total": 8370228, "free": 7543416, "allocated": 826812, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 720761}}} +{"time": "2026-09-28T18:21:59.250160", "tasks": {"code": 0, "data": {"tasks": [{"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613792, "allocated": 756528, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 722821}}} +{"time": "2026-09-28T18:22:01.306354", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671728, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613780, "allocated": 756540, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 724883}}} +{"time": "2026-09-28T18:22:03.372168", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 726941}}} +{"time": "2026-09-28T18:22:05.430999", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 728999}}} +{"time": "2026-09-28T18:22:07.484228", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 731053}}} +{"time": "2026-09-28T18:22:09.541793", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 733110}}} +{"time": "2026-09-28T18:22:11.598388", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 735171}}} +{"time": "2026-09-28T18:22:13.661635", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 737232}}} +{"time": "2026-09-28T18:22:15.720915", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 739294}}} +{"time": "2026-09-28T18:22:17.787756", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 741365}}} +{"time": "2026-09-28T18:22:19.851501", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 743427}}} +{"time": "2026-09-28T18:22:21.915320", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613996, "allocated": 756328, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 745489}}} +{"time": "2026-09-28T18:22:23.975982", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 747551}}} +{"time": "2026-09-28T18:22:26.037378", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 749609}}} +{"time": "2026-09-28T18:22:28.097520", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614012, "allocated": 756312, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 751667}}} +{"time": "2026-09-28T18:22:30.157977", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671168, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613224, "allocated": 757096, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 753732}}} +{"time": "2026-09-28T18:22:32.220794", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671172, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613240, "allocated": 757080, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 755790}}} +{"time": "2026-09-28T18:22:34.279182", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614000, "allocated": 756324, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 757852}}} +{"time": "2026-09-28T18:22:36.340642", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671944, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613144, "allocated": 757176, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 759921}}} +{"time": "2026-09-28T18:22:38.405941", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4292, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601156, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544180, "allocated": 826052, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 761982}}} +{"time": "2026-09-28T18:22:40.469624", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4100, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601156, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544180, "allocated": 826052, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 764046}}} +{"time": "2026-09-28T18:22:42.535996", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4100, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601156, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544184, "allocated": 826048, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 766112}}} +{"time": "2026-09-28T18:22:44.600810", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3876, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7601156, "min_free_heap": 7550256, "internal": {"total": 308035, "free": 72467, "allocated": 235568, "largest_block": 31744}, "psram": {"total": 8370232, "free": 7544184, "allocated": 826048, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 768179}}} +{"time": "2026-09-28T18:22:46.668416", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 770238}}} +{"time": "2026-09-28T18:22:48.728069", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671716, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613784, "allocated": 756536, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 772297}}} +{"time": "2026-09-28T18:22:50.785501", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 774356}}} +{"time": "2026-09-28T18:22:52.846205", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671732, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370320, "free": 7613800, "allocated": 756520, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 776414}}} +{"time": "2026-09-28T18:22:54.902470", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7614004, "allocated": 756320, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 778474}}} +{"time": "2026-09-28T18:22:56.962672", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 780534}}} +{"time": "2026-09-28T18:22:59.020063", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 782589}}} +{"time": "2026-09-28T18:23:01.077329", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 784652}}} +{"time": "2026-09-28T18:23:03.138384", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671940, "min_free_heap": 7550256, "internal": {"total": 308083, "free": 73443, "allocated": 234640, "largest_block": 31744}, "psram": {"total": 8370324, "free": 7613992, "allocated": 756332, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 786708}}} +{"time": "2026-09-28T18:23:05.196876", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670648, "min_free_heap": 7550256, "internal": {"total": 308087, "free": 73479, "allocated": 234608, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7612676, "allocated": 757636, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 788861}}} +{"time": "2026-09-28T18:23:07.350799", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1108, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2680, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7670800, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370308, "free": 7612948, "allocated": 757360, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 790923}}} +{"time": "2026-09-28T18:23:09.411797", "tasks": {"code": 0, "data": {"tasks": [{"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671576, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7613736, "allocated": 756576, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 792985}}} +{"time": "2026-09-28T18:23:11.474132", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671576, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7613736, "allocated": 756576, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 795047}}} +{"time": "2026-09-28T18:23:13.533489", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671576, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7613736, "allocated": 756576, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 797103}}} +{"time": "2026-09-28T18:23:15.592494", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671572, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7613736, "allocated": 756576, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 799164}}} +{"time": "2026-09-28T18:23:17.651456", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671572, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7613736, "allocated": 756576, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 801220}}} +{"time": "2026-09-28T18:23:19.709071", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671572, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7613732, "allocated": 756580, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 803281}}} +{"time": "2026-09-28T18:23:21.769658", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7671572, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370312, "free": 7613736, "allocated": 756576, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 805349}}} +{"time": "2026-09-28T18:23:23.838239", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7636276, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8369984, "free": 7578440, "allocated": 791544, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 807412}}} +{"time": "2026-09-28T18:23:25.902953", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7633728, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8369640, "free": 7575880, "allocated": 793760, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 809479}}} +{"time": "2026-09-28T18:23:27.970467", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7637996, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8370212, "free": 7580160, "allocated": 790052, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 811544}}} +{"time": "2026-09-28T18:23:30.032385", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7635340, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8369852, "free": 7577496, "allocated": 792356, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 813607}}} +{"time": "2026-09-28T18:23:32.096738", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 1060, "core": 1, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1364, "core": 0, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 688, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 696, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 2032, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1564, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1956, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1792, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 1336, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 908, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 13008, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2792, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5432, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 392, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 2160, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15124, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1964, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 496, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 900, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 904, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2504, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1684, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 392, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 800, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7635328, "min_free_heap": 7549148, "internal": {"total": 308083, "free": 73359, "allocated": 234724, "largest_block": 31744}, "psram": {"total": 8369852, "free": 7577472, "allocated": 792380, "largest_block": 7471104}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:01:50", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 815667}}} diff --git a/docs/repair/ssh-poll-stack/device-candidate/serial-redacted.log b/docs/repair/ssh-poll-stack/device-candidate/serial-redacted.log new file mode 100644 index 0000000..d7446fe --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/serial-redacted.log @@ -0,0 +1,749 @@ +ESP-ROM:esp32s3-20210327 +Build:Mar 27 2021 +rst:0x15 (USB_UART_CHIP_RESET),boot:0x8 (SPI_FAST_FLASH_BOOT) +Saved PC:0x4037a8b6 +SPIWP:0xee +mode:DIO, clock div:1 +load:0x3fce2820,len:0x1700 +load:0x403c8700,len:0xec0 +load:0x403cb700,len:0x31c0 +entry 0x403c894c +I (24) boot: ESP-IDF v5.5.2 2nd stage bootloader +I (24) boot: compile time Sep 28 2026 18:02:01 +I (25) boot: Multicore bootloader +I (25) boot: chip revision: v0.2 +I (27) boot: efuse block revision: v1.3 +I (31) qio_mode: Enabling default flash chip QIO +I (35) boot.esp32s3: Boot SPI Speed : 80MHz +I (39) boot.esp32s3: SPI Mode : QIO +I (43) boot.esp32s3: SPI Flash Size : 16MB +I (47) boot: Enabling RNG early entropy source... +I (51) boot: Partition Table: +I (54) boot: ## Label Usage Type ST Offset Length +I (60) boot: 0 nvs WiFi data 01 02 00009000 0000c000 +I (67) boot: 1 nvs_keys NVS keys 01 04 00015000 00001000 +I (73) boot: 2 otadata OTA data 01 00 00016000 00002000 +I (80) boot: 3 phy_init RF data 01 01 00018000 00001000 +I (86) boot: 4 ota_0 OTA app 00 10 00020000 00300000 +I (93) boot: 5 ota_1 OTA app 00 11 00320000 00300000 +I (99) boot: 6 storage Unknown data 01 82 00620000 00080000 +I (106) boot: 7 www Unknown data 01 82 006a0000 00300000 +I (112) boot: 8 fatfs Unknown data 01 81 009a0000 00010000 +I (119) boot: End of partition table +I (123) esp_image: segment 0: paddr=00020020 vaddr=3c170020 size=97008h (618504) map +I (222) esp_image: segment 1: paddr=000b7030 vaddr=3fc9bf00 size=04efch ( 20220) load +I (226) esp_image: segment 2: paddr=000bbf34 vaddr=40374000 size=040e4h ( 16612) load +I (229) esp_image: segment 3: paddr=000c0020 vaddr=42000020 size=1612dch (1446620) map +I (448) esp_image: segment 4: paddr=00221304 vaddr=403780e4 size=13dc4h ( 81348) load +I (464) esp_image: segment 5: paddr=002350d0 vaddr=50000000 size=00020h ( 32) load +I (473) boot: Loaded app from partition at offset 0x20000 +I (474) boot: Disabling RNG early entropy source... +I (484) octal_psram: vendor id : 0x0d (AP) +I (484) octal_psram: dev id : 0x02 (generation 3) +I (484) octal_psram: density : 0x03 (64 Mbit) +I (486) octal_psram: good-die : 0x01 (Pass) +I (490) octal_psram: Latency : 0x01 (Fixed) +I (495) octal_psram: VCC : 0x01 (3V) +I (499) octal_psram: SRF : 0x01 (Fast Refresh) +I (504) octal_psram: BurstType : 0x01 (Hybrid Wrap) +I (509) octal_psram: BurstLen : 0x01 (32 Byte) +I (513) octal_psram: Readlatency : 0x02 (10 cycles@Fixed) +I (518) octal_psram: DriveStrength: 0x00 (1/1) +I (523) MSPI Timing: Enter psram timing tuning +I (527) esp_psram: Found 8MB PSRAM device +I (530) esp_psram: Speed: 80MHz +I (533) cpu_start: Multicore app +I (969) esp_psram: SPI SRAM memory test OK +I (978) cpu_start: GPIO 44 and 43 are used as console UART I/O pins +I (978) cpu_start: Pro cpu start user code +I (978) cpu_start: cpu freq: 240000000 Hz +I (980) app_init: Application information: +I (984) app_init: Project name: TianShanOS +I (988) app_init: App version: 0.5.2+3a19128d.09281801 +I (993) app_init: Compile time: Sep 28 2026 18:01:50 +I (998) app_init: ELF file SHA256: 2c29402b1... +I (1003) app_init: ESP-IDF: v5.5.2 +I (1007) efuse_init: Min chip rev: v0.0 +I (1011) efuse_init: Max chip rev: v0.99 +I (1015) efuse_init: Chip rev: v0.2 +I (1019) heap_init: Initializing. RAM available for dynamic allocation: +I (1025) heap_init: At 3FCB0048 len 000396C8 (229 KiB): RAM +I (1030) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM +I (1035) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM +I (1041) heap_init: At 600FE000 len 00001FE8 (7 KiB): RTCRAM +I (1046) esp_psram: Adding pool of 8179K of PSRAM memory to heap allocator +I (1053) spi_flash: detected chip: generic +I (1056) spi_flash: flash io: qio +I (1060) sleep_gpio: Configure to isolate all GPIO pins in sleep state +I (1066) sleep_gpio: Enable automatic switching of GPIO sleep configuration +I (1073) main_task: Started on CPU0 +I (1076) esp_psram: Reserving pool of 16K of internal memory for DMA/internal allocations +I (1084) main_task: Calling app_main() + +╔════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ ████████╗██╗ █████╗ ███╗ ██╗███████╗██╗ ██╗ █████╗ ███╗ ██╗ ║ +║ ╚══██╔══╝██║██╔══██╗████╗ ██║██╔════╝██║ ██║██╔══██╗████╗ ██║ ║ +║ ██║ ██║███████║██╔██╗ ██║███████╗███████║███████║██╔██╗ ██║ ║ +║ ██║ ██║██╔══██║██║╚██╗██║╚════██║██╔══██║██╔══██║██║╚██╗██║ ║ +║ ██║ ██║██║ ██║██║ ╚████║███████║██║ ██║██║ ██║██║ ╚████║ ║ +║ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ║ +║ ║ +║ TianShanOS 0.5.2+3a19128d.09281801 ║ +║ ESP32 Rack Management Operating System ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════╝ + +I (1259) main: System Information: +I (1262) main: - IDF Version: v5.5.2 +I (1265) main: - Free Heap: 8630188 bytes +I (1269) main: - Min Free Heap: 8630188 bytes +I (1274) main: - Chip: ESP32-S3, 2 cores, WiFi/BLE +I (1278) main: Initializing TianShanOS... +I (1282) ts_core: TianShanOS Core v0.5.2+3a19128d.09281801 initializing... +I (1289) ts_mempool: Initializing memory pools in PSRAM... +I (1294) ts_mempool: Pool 0: 16 x 256 bytes = 4 KB (PSRAM) +I (1299) ts_mempool: Pool 1: 12 x 1024 bytes = 12 KB (PSRAM) +I (1304) ts_mempool: Pool 2: 8 x 4096 bytes = 32 KB (PSRAM) +I (1310) ts_mempool: Pool 3: 4 x 8192 bytes = 32 KB (PSRAM) +I (1315) ts_mempool: Memory pools initialized successfully +I (1320) ts_core: Memory pools initialized in PSRAM +I (1325) ts_core: cJSON PSRAM hooks installed +I (1329) ts_core: Initializing configuration system... +I (1334) ts_config: Initializing TianShanOS Configuration System... +I (1340) ts_config: Configuration system initialized successfully +I (1346) ts_config_nvs: Initializing NVS configuration backend... +I (1401) ts_config_nvs: NVS backend initialized (namespace: ts_config) +I (1402) ts_config: Registered backend 1 with priority 80 +I (1402) ts_config_file: Initializing file configuration backend... +I (1408) ts_config_file: File backend initialized (waiting for storage) +I (1414) ts_config: Registered backend 2 with priority 60 +I (1419) ts_core: Initializing logging system... +I (1424) ts_log: Initializing TianShanOS Logging System... +I (1434) ts_log: Log buffer allocated in PSRAM (500 entries, 148000 bytes) +I (1438) ts_log: ESP_LOG capture hook installed +I (1443) ts_log: Logging system initialized (level=3, outputs=0x05, buffer=500) +I (1451) ts_core: Initializing event system... +I (1455) ts_event: Initializing TianShanOS Event System... +I (1460) ts_event: Event loop task started +I (1464) ts_event: Event system initialized (queue_size=32) +I (1469) ts_config_file: Registered storage event handler for auto-load +I (1476) ts_config_schemas: Initializing configuration module system... +I (1482) ts_config_module: Initializing configuration module system... +I (1488) ts_config_meta: Initializing configuration meta management... +I (1496) ts_config_meta: Meta initialized: global_seq=6, sync_seq=6, pending=0x00 +I (1502) ts_config_module: Configuration module system initialized +I (1508) ts_config_schemas: Registering configuration modules... +I (1513) ts_config_module: Registered module NET (nvs=ts_net, schema_v=1) +I (1520) ts_config_module: Registered module DHCP (nvs=ts_dhcp, schema_v=1) +I (1526) ts_config_module: Registered module WIFI (nvs=ts_wifi, schema_v=1) +I (1533) ts_config_module: Registered module NAT (nvs=ts_nat, schema_v=1) +I (1540) ts_config_module: Registered module LED (nvs=ts_led, schema_v=1) +I (1546) ts_config_module: Registered module FAN (nvs=ts_fan, schema_v=1) +I (1553) ts_config_module: Registered module DEVICE (nvs=ts_device, schema_v=1) +I (1560) ts_config_module: Registered module SYSTEM (nvs=ts_system, schema_v=1) +I (1567) ts_config_module: Registered module TEMP (nvs=ts_temp, schema_v=0) +I (1573) ts_config_module: Registered module RULES (nvs=ts_rules, schema_v=0) +I (1580) ts_config_module: Registered module ACTIONS (nvs=ts_actions, schema_v=0) +I (1588) ts_config_module: Registered module SOURCES (nvs=ts_sources, schema_v=0) +I (1595) ts_config_schemas: All configuration modules registered +I (1600) ts_config_schemas: Loading module configurations... +I (1606) ts_config_module: Loading module NET... +I (1610) ts_config_module: Using schema defaults for module NET +I (1616) ts_config_module: Loading module DHCP... +I (1620) ts_config_module: Using schema defaults for module DHCP +I (1626) ts_config_module: Loading module WIFI... +I (1630) ts_config_module: Using schema defaults for module WIFI +I (1636) ts_config_module: Loading module NAT... +I (1640) ts_config_module: Using schema defaults for module NAT +I (1646) ts_config_module: Loading module LED... +I (1650) ts_config_module: Using schema defaults for module LED +I (1656) ts_config_module: Loading module FAN... +I (1662) ts_config_module: Loading module DEVICE... +I (1665) ts_config_module: Using schema defaults for module DEVICE +I (1671) ts_config_module: Loading module SYSTEM... +I (1675) ts_config_module: Using schema defaults for module SYSTEM +I (1682) ts_config_module: Loading module TEMP... +I (1686) ts_config_module: Loading module RULES... +I (1690) ts_config_module: Using schema defaults for module RULES +I (1696) ts_config_module: Loading module ACTIONS... +I (1701) ts_config_module: Using schema defaults for module ACTIONS +I (1707) ts_config_module: Loading module SOURCES... +I (1711) ts_config_module: Using schema defaults for module SOURCES +I (1718) ts_config_meta: === Configuration Meta === +I (1722) ts_config_meta: global_seq: 6 +I (1726) ts_config_meta: sync_seq: 6 +I (1730) ts_config_meta: pending_sync: 0x00 +I (1734) ts_config_meta: Schema versions: +I (1738) ts_config_meta: ========================== +I (1742) ts_config_schemas: Configuration module system initialized +I (1748) ts_core: Initializing service management... +I (1753) ts_service: Initializing TianShanOS Service Management... +I (1759) ts_service: Service management initialized +I (1763) ts_core: TianShanOS Core initialized successfully +I (1769) main: Registering core services... +I (1773) ts_services: Registering services... +I (1777) ts_service: Registered service: hal (phase=HAL) +I (1782) ts_services: - hal service registered +I (1786) ts_service: Registered service: storage (phase=DRIVER) +I (1792) ts_services: - storage service registered +I (1796) ts_service: Registered service: led (phase=DRIVER) +I (1802) ts_services: - led service registered +I (1806) ts_service: Registered service: drivers (phase=DRIVER) +I (1812) ts_services: - drivers service registered +I (1816) ts_service: Registered service: power (phase=DRIVER) +I (1822) ts_services: - power service registered +I (1826) ts_service: Registered service: network (phase=NETWORK) +I (1832) ts_services: - network service registered +I (1837) ts_service: Registered service: security (phase=SECURITY) +I (1843) ts_services: - security service registered +I (1847) ts_service: Registered service: api (phase=SERVICE) +I (1853) ts_services: - api service registered +I (1857) ts_service: Registered service: https (phase=SERVICE) +I (1863) ts_services: - https service registered +I (1867) ts_service: Registered service: webui (phase=UI) +I (1872) ts_services: - webui service registered +I (1877) ts_service: Registered service: console (phase=UI) +I (1882) ts_services: - console service registered +I (1887) ts_service: Registered service: automation (phase=SERVICE) +I (1893) ts_services: - automation service registered +I (1898) ts_services: All core services registered +I (1902) main: Starting TianShanOS services... +I (1906) ts_core: Starting TianShanOS... +I (1910) ts_service: Starting all services... +I (1914) ts_service: === Phase 0: PLATFORM === +I (1918) ts_service: === Phase 1: CORE === +I (1922) ts_service: === Phase 2: HAL === +I (1926) ts_service: Starting 1 services in phase HAL +I (1931) ts_service: Starting service: hal +I (1934) ts_services: Initializing HAL service... +I (892) ts_hal: Initializing HAL module v1.0.0 +I (897) ts_pin: Initializing pin manager +I (902) ts_pin: Pin manager initialized +I (906) ts_hal: No pin config in NVS, loading defaults +I (912) ts_pin: Loading default pin mappings for ESP32S3 +I (918) ts_gpio: Initializing GPIO subsystem +I (923) ts_hal: Early hardware init: setting reset pins to safe state +I (930) ts_hal: W5500_RST (GPIO39) = HIGH (normal) +I (936) ts_hal: AGX_RESET (GPIO1) = LOW (normal) +I (941) ts_hal: AGX_POWER (GPIO3) = LOW (allow boot) +I (947) ts_pwm: Initializing PWM subsystem +I (951) ts_i2c: Initializing I2C subsystem +I (956) ts_spi: Initializing SPI subsystem +I (961) ts_uart: Initializing UART subsystem +I (966) ts_adc: Initializing ADC subsystem +I (971) ts_hal: HAL initialization complete, platform: ESP32S3 +I (2024) ts_service: Service 'hal' started in 89 ms +I (2029) ts_service: === Phase 3: DRIVER === +I (2033) ts_service: Starting 4 services in phase DRIVER +I (2038) ts_service: Starting service: power +I (2042) ts_services: Initializing power service... +I (999) ts_power_policy: Initializing power policy v1.0.0 +I (1006) ts_power_policy: NVS: enabled_on_boot = true +I (1011) ts_power_policy: Registered SD card mount event handler +I (1018) ts_power_policy: Power policy initialized (Low: 12.6V, Recovery: 18.0V, Delay: 60s) [source: defaults] +I (2076) ts_power_monitor: Initializing power monitor v1.0.0 +I (2081) ts_power_monitor: Initializing voltage monitor on GPIO 18 (ADC2_CH7) +I (2088) ts_power_monitor: ADC calibration initialized +I (2093) ts_power_monitor: Voltage monitor initialized (divider ratio: 11.4:1) +I (2100) ts_power_monitor: Initializing power chip communication on GPIO 47 (UART1) +I (2107) uart: queue free spaces: 10 +I (2110) ts_power_monitor: Power chip communication initialized (baud: 9600) +I (2117) ts_power_monitor: Power monitor initialized successfully +I (2123) ts_services: Starting power service... +I (2127) ts_power_monitor: Starting power monitor +I (2131) ts_power_monitor: Power monitor task started +I (2136) ts_power_monitor: Power monitor started +I (1094) ts_power_policy: Starting power policy monitoring +I (1100) ts_power_policy: Power policy task started +I (1106) ts_power_policy: Power policy monitoring started +I (2158) ts_services: Power protection started (auto-start enabled) +I (2164) ts_service: Service 'power' started in 123 ms +I (2169) ts_service: Starting service: drivers +I (2173) ts_services: Initializing drivers service... +I (1131) ts_drivers: Initializing device drivers +I (1137) ts_temp_source: Loaded preferred source from NVS: variable +I (1145) ts_temp_source: Loaded 1 weighted bound vars from NVS +I (1150) ts_temp_source: Temperature source manager initialized (v1.0.0), preferred: variable +I (1159) ts_drivers: Temperature source manager initialized +I (1166) ts_fan: Subscribed to temperature events +I (1171) ts_fan: Fan driver initialized +I (1176) ts_fan: Fan 0 configured: PWM=GPIO41, TACH=-1, curve=0 points +I (1183) ts_drivers: Fan 0 configured on GPIO 41 +I (1188) ts_power: Power monitor initialized +I (1193) ts_device: Device control initialized +I (1198) ts_device: AGX configured: FORCE_SHUTDOWN=GPIO3(LOW=run), RESET=GPIO1(LOW=normal) +I (1207) ts_drivers: AGX configured (pwr=3, rst=1, rcv=40) +I (1213) ts_device: LPMU configured (power=46[pulse HIGH], reset=2[pulse HIGH]) +I (1221) ts_drivers: LPMU configured (pwr=46, rst=2) +I (1227) ts_usb_mux: USB MUX driver initialized +I (1232) ts_usb_mux: Loaded USB MUX target from NVS: 0 +I (1238) ts_usb_mux: USB MUX -> ESP32 (sel0=0, sel1=0) +I (1244) ts_usb_mux: USB MUX configured (sel0=8, sel1=48), restored target: 0 +I (1251) ts_drivers: USB MUX configured (sel0=8, sel1=48) +I (2304) ts_compute_monitor: Initializing compute monitor v1.0.0 +I (1263) ts_temp_source: Provider registered: agx_cpu (agx) +I (2316) ts_compute_monitor: Initialized, server: 10.10.99.98:58090 +I (1276) ts_drivers: Compute monitor initialized (use 'compute --start' to connect) +I (1284) ts_drivers: Device drivers initialized +I (1290) ts_fan: Restored fan 0: mode=2, duty=25%, curve=9 pts +I (2342) ts_service: Service 'drivers' started in 169 ms +I (2347) ts_service: Starting service: led +I (2351) ts_services: Initializing LED service... +I (1309) led_cc: Loaded config from NVS +I (1314) led_cc: Color correction initialized (enabled=true) +I (1320) ts_led: LED subsystem initialized +I (2371) ts_services: Starting LED service... +I (1329) led_preset: Touch LED: using hardcoded GPIO 45 +I (1334) led_driver: Using RMT backend for 1 LEDs on GPIO 45 +I (1342) led_driver: LED driver initialized: 'led_touch' - GPIO 45, 1 LEDs +I (1348) ts_led: Created LED device 'led_touch' with 1 LEDs +I (1355) led_preset: Touch LED initialized: 1 LEDs on GPIO 45 +I (1361) led_preset: Board LED: using hardcoded GPIO 42 +I (1367) led_driver: Using RMT backend for 28 LEDs on GPIO 42 +I (1375) led_driver: LED driver initialized: 'led_board' - GPIO 42, 28 LEDs +I (1381) ts_led: Created LED device 'led_board' with 28 LEDs +I (1387) led_preset: Board LED initialized: 28 LEDs on GPIO 42 +I (1394) led_preset: Matrix LED: pin_manager returned GPIO 9 +I (1400) led_driver: Using SPI backend for 1024 LEDs on GPIO 9 +I (1438) led_driver: LED driver initialized: 'led_matrix' - GPIO 9, 1024 LEDs +I (1439) ts_led: Created LED device 'led_matrix' with 1024 LEDs +I (1442) led_preset: Matrix LED initialized: 32x32 on GPIO 9 +I (1448) led_preset: Loading LED boot configurations... +I (1461) led_preset: Restored touch: animation=solid, speed=50, brightness=80, color=#FFCCCC +I (1465) led_preset: Restored board: animation=solid, speed=50, brightness=60, color=#FFFFFF +I (1474) led_preset: Restored matrix: animation=solid, speed=50, brightness=52, color=#FFFFFF +I (2529) ts_service: Service 'led' started in 178 ms +I (2533) ts_service: Starting service: storage +I (2537) ts_services: Initializing storage service... +I (1499) ts_storage: Storage subsystem initialized +I (2547) ts_services: Starting storage service... +I (1505) storage_spiffs: Mounting SPIFFS at /spiffs (partition: storage) +I (1549) storage_spiffs: SPIFFS mounted: 474641 total, 0 used, 474641 free +I (2597) ts_services: SPIFFS mounted at /spiffs +I (1551) storage_sd: Good: /sdcard not in FATFS s_fat_ctxs[] (info returned ESP_ERR_INVALID_STATE) +I (1560) storage_sd: Mounting SD card at /sdcard (mode: 2, freq: 20000 kHz) +I (1568) storage_sd: SD GPIO: CMD=15, CLK=16, D0=4, D1=5, D2=6, D3=7 +I (1634) storage_sd: SD card mounted: +I (1635) storage_sd: Name: MSSD0 +I (1635) storage_sd: Type: SDHC/SDXC +I (2682) ts_config: Saving configuration... +I (1636) storage_sd: Speed: default +I (1645) storage_sd: Size: 29850MB +I (2693) ts_config: Saved configuration to backend 1 +I (1656) ts_power_policy: SD card mounted, syncing power policy config... +I (2703) ts_config: Configuration saved +I (2712) ts_config_pack: Loaded plain config: /sdcard/config/power_policy.json (180 bytes) +I (1673) ts_power_policy: SD: low_voltage_threshold = 12.60V +I (1679) ts_power_policy: SD: recovery_voltage_threshold = 18.00V +I (1686) ts_power_policy: SD: shutdown_delay_sec = 60 +I (1692) ts_power_policy: SD: recovery_hold_sec = 5 +I (1697) ts_power_policy: SD: fan_stop_delay_sec = 60 +I (2708) ts_services: SD card mounted at /sdcard +I (1703) ts_power_policy: SD: enabled_on_boot = true +I (1713) ts_power_policy: Loaded power policy config from SD card +I (1720) ts_power_policy: Config loaded from SD card, syncing to NVS +I (2774) ts_config: Saving configuration... +I (2784) ts_config: Saved configuration to backend 1 +I (2784) ts_config: Configuration saved +I (2785) ts_config_file: SD card mounted, loading configuration files... +I (2778) ts_recovery: Checking for SD card recovery... +I (2793) ts_config_file: Loading configuration files from: /sdcard/config +I (2806) ts_recovery: No recovery directory found +I (2807) ts_config_file: Loading: power_policy.json +I (2812) ts_config_json: Loading JSON config: /sdcard/config/power_policy.json +I (2820) ts_service: Service 'storage' started in 282 ms +I (2822) ts_config_json: JSON config loaded successfully +I (2830) ts_config_file: Loading: led_color_correction.json +I (2835) ts_config_json: Loading JSON config: /sdcard/config/led_color_correction.json +I (2836) ts_service: === Phase 4: NETWORK === +I (2846) ts_config_json: JSON config loaded successfully +I (2852) ts_config_file: Loading: fan_curve_config_0.json +I (2856) ts_config_json: Loading JSON config: /sdcard/config/fan_curve_config_0.json +I (2865) ts_service: Starting 1 services in phase NETWORK +I (2869) ts_config_json: JSON config loaded successfully +I (2875) ts_config_file: Loading: fan.json +I (2878) ts_config_json: Loading JSON config: /sdcard/config/fan.json +I (2878) ts_service: Starting service: network +I (2887) ts_config_json: JSON config loaded successfully +I (2894) ts_config_file: Loading: ui_widgets.json +I (2898) ts_config_json: Loading JSON config: /sdcard/config/ui_widgets.json +I (2905) ts_services: Initializing network service... +I (2908) ts_config_json: JSON config loaded successfully +I (2915) ts_config_file: Loaded 5 JSON configs, skipped 1 +I (2919) ts_config_file: Configuration files loaded successfully +I (1874) ts_net_mgr: Initializing network manager... +I (1884) ts_net_mgr: No saved config in NVS, using defaults +I (1891) ts_net_mgr: Ethernet pins: MOSI=11 MISO=13 SCLK=12 CS=10 INT=38 RST=39 +I (1898) ts_eth: Initializing Ethernet (W5500) +I (1904) ts_eth: Created Ethernet netif with DHCP server mode +I (1914) ts_eth: Device IP: 10.10.99.97 +I (1914) ts_eth: Gateway: 10.10.99.100 +I (1919) ts_eth: Netmask: 255.255.255.0 +I (1953) ts_eth: Ethernet MAC: 20:6e:f1:a1:d5:8f +I (3000) esp_eth.netif.netif_glue: 20:6e:f1:a1:d5:8f +I (3001) esp_eth.netif.netif_glue: ethernet attached to netif +I (1958) ts_eth: DHCP lease range configured: 10.10.99.100 - 10.10.99.103 +I (1965) ts_eth: DHCP DNS server configured: 8.8.8.8 +I (1971) ts_eth: Ethernet initialized +I (1975) ts_net_mgr: Ethernet initialized, MAC: 20:6e:f1:a1:d5:8f +I (1982) ts_net_mgr: Network manager initialized +I (1992) ts_dhcps: Initializing DHCP server... +I (1992) ts_dhcps: DHCP event task started +I (1997) ts_dhcps: No saved config, using defaults +I (2003) ts_dhcps: DHCP server initialized (event queue enabled) +I (3056) ts_services: Starting network service... +I (2014) ts_net_mgr: Starting Ethernet... +I (2019) ts_net_mgr: Using static IP: 10.10.99.97 +I (2040) ts_net_mgr: Ethernet started +I (2040) ts_eth: Ethernet started +I (2041) ts_net_mgr: Ethernet started, waiting for link... +I (3091) ts_time_sync: Timezone set to: CST-8 +I (3095) ts_time_sync: Time sync module initialized +I (3099) ts_time_sync: NTP server 1: 10.10.99.99 +I (3104) ts_time_sync: NTP server 2: 10.10.99.98 +I (3108) ts_time_sync: NTP server 3: 10.10.99.100 +I (3116) ts_time_sync: Starting NTP sync with primary: 10.10.99.99, secondary: 10.10.99.98 +I (3121) ts_time_sync: NTP synchronization started (retry enabled for unreliable servers) +I (2082) ts_device: LPMU startup detection: waiting for network... +I (2089) ts_device: LPMU startup detection task started +I (3141) ts_service: Service 'network' started in 237 ms +I (3147) ts_service: === Phase 5: SECURITY === +I (3156) ts_service: Starting 1 services in phase SECURITY +I (3156) ts_service: Starting service: security +I (3160) ts_services: Initializing security service... +I (3167) ts_ssh_hosts_cfg: NVS has 0 hosts, will load from SD card in background +I (3172) ts_ssh_hosts_cfg: SSH hosts config initialized (SD card loading deferred) +I (3215) ts_ssh_cmd_cfg: NVS has 6 commands, will load from SD card in background +I (3216) ts_ssh_cmd_cfg: SSH commands config initialized (SD card loading deferred) +I (2173) ts_security: Security subsystem initialized +I (3225) ts_keystore: Initializing secure keystore... +I (3234) ts_keystore: Keystore initialized +I (3234) ts_known_hosts: Known hosts module initialized +I (3397) ts_cert: Initialized, status: activated, has_key=1, has_cert=1 +I (3398) pki_client: PKI client initialized, server=10.10.99.100:57443, device_id=TIANSHAN-DEVICE-001 +I (3402) ts_services: Certificate status: activated, time validity: valid +I (3409) ts_config_pack: Config pack system initialized, device fingerprint: 50c2e523d3483956... +I (3417) ts_config_file: Loading encrypted configuration files from: /sdcard/config +I (3432) ts_service: Service 'security' started in 272 ms +I (3432) ts_service: === Phase 6: SERVICE === +I (3434) ts_service: Starting 3 services in phase SERVICE +I (3439) ts_service: Starting service: automation +I (3443) ts_services: Initializing automation service... +I (3448) ts_automation: Initializing automation engine v1.0.0 +I (3459) ts_source_mgr: Initializing source manager (max 16) +I (3468) ts_source_mgr: Source manager initialized (loading deferred) +I (3469) ts_rule_engine: Initializing rule engine (max 32 rules) +I (3471) ts_rule_engine: Rule engine initialized (loading deferred) +I (3477) ts_action_mgr: Initializing action manager +I (3483) ts_action_mgr: Action executor task started (DRAM stack) +I (3487) ts_action_mgr: Action manager initialized (loading deferred) +I (3493) ts_automation: Loading config from: /sdcard/config/automation.json +I (3509) ts_ssh_cmd_cfg: Pre-creating variables for all SSH commands +I (2500) ts_power_policy: Registered 8 automation variables for power policy +I (3547) ts_automation: Automation engine initialized +I (3548) ts_services: Starting automation service... +I (3553) ts_source_mgr: Starting all data sources +I (3908) ts_config: Saving configuration... +I (3919) ts_config: Saved configuration to backend 1 +I (3919) ts_config: Configuration saved +I (4041) ts_net_mgr: Ethernet link up +I (4042) ts_net_mgr: Ethernet IP (static/DHCPS): 10.10.99.97 +I (4042) ts_net: mDNS disabled by config +I (4046) ts_eth: Ethernet link up +I (4050) ts_eth: Ethernet MAC: 20:6e:f1:a1:d5:8f +I (5171) ts_source_mgr: Network ready, starting external sources +I (5171) ts_automation: Automation task started +I (5171) ts_services: Automation engine running: 0 sources, 0 rules, 36 variables +I (5177) ts_service: Service 'automation' started in 1734 ms +I (5190) ts_service: Starting service: https +I (5191) ts_https: HTTPS server deinitialized +I (5191) ts_https: HTTPS server initialized (port=443, mTLS=required) +I (4149) ts_dhcps: Starting DHCP server on ethernet... +I (5197) ts_https_api: Registering permission test endpoints... +I (4156) ts_dhcps: Ethernet IP preserved: 10.10.99.97 +I (5208) ts_https: Registered endpoint: GET / (min_role=anonymous) +I (4168) ts_dhcps: I (5220) ts_https: Registered endpoint: GET /api/auth/whoami (min_role=viewer) +I (5230) ts_https: Registered endpoint: GET /api/test/viewer (min_role=viewer) +I (5236) ts_https: Registered endpoint: GET /api/test/operator (min_role=operator) +Applied config for ethernet: +I (5246) ts_https: Registered endpoint: GET /api/test/admin (min_role=admin) +I (4199) ts_dhcps: Gateway: 10.10.99.100 +I (5253) ts_https: Registered endpoint: POST /api/test/admin-action (min_role=admin) +I (4211) ts_dhcps: Pool: 10.10.99.100 - 10.10.99.103 +I (5265) ts_https: mTLS enabled: client certificates required +I (5277) esp_https_server: Starting server +I (4225) ts_dhcps: Lease: 1440 min +I (5284) esp_https_server: Server listening on port 443 +I (4238) ts_dhcps: DHCP server started on ethernet +I (5291) ts_https: HTTPS server started on port 443 with 6 endpoints +I (4249) ts_eth: DHCP server started via ts_dhcp_server +I (5253) ts_ssh_cmd_cfg: Deferred: checking SD card for config (NVS has 6 commands)... +I (5317) ts_ssh_cmd_cfg: SD card has config, clearing NVS and importing... +I (5197) ts_service: Service 'https' started in 6 ms +I (5327) ts_service: Starting service: api +I (5330) ts_services: Initializing API service... +I (4288) ts_api: API endpoints allocated in PSRAM (25344 bytes) +I (5336) ts_ssh_cmd_cfg: Cleared all SSH commands +I (4294) ts_api: API layer initialized (max 288 endpoints) +I (5350) ts_ssh_cmd_cfg: Cleared all SSH commands +I (5352) ts_services: Starting API service... +I (5365) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3_6-35B-A3B.json (1095 bytes) +I (5397) ts_ssh_cmd_cfg: Added SSH command: Qwen3.6-35B-A3B (Qwen3_6-35B-A3B) +I (5407) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3-Embedding-0_6B.json (885 bytes) +I (4361) ts_api: Registering all API modules... +I (4366) api_config: Config API registered (11 endpoints) +I (4370) api_device: Registering device APIs +I (4377) api_led: Registering LED APIs +I (4381) api_network: Registering network APIs +I (4388) api_fan: Registering fan APIs +I (4390) api_power: Registering power APIs +I (5466) ts_ssh_cmd_cfg: Added SSH command: Qwen3-Embedding-0.6B (Qwen3-Embedding-0_6B) +I (4422) api_temp: Registering temperature APIs +I (4427) api_service: Registering service APIs... +I (5477) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3-Reranker-0_6B.json (1064 bytes) +I (4431) api_service: Service APIs registered (5 endpoints) +I (4448) api_storage: Registering storage APIs... +I (4468) api_storage: Storage APIs registered (9 endpoints) +I (4468) api_gpio: Registering GPIO APIs... +I (4469) api_gpio: GPIO APIs registered (4 endpoints) +I (4475) api_monitor: Registering monitor APIs... +I (4480) api_monitor: Monitor APIs registered: 6 endpoints +I (4491) api_ssh: Registering SSH APIs... +I (5557) ts_ssh_cmd_cfg: Added SSH command: Qwen3-Reranker-0.6B (Qwen3-Reranker-0_6B) +I (5565) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/drop.json (395 bytes) +I (4548) api_sftp: Registering SFTP APIs... +I (5597) ts_api_ota: Registering OTA APIs +I (5615) ts_ota: Running from partition: ota_0 (addr=0x20000, size=3072 KB) +I (5616) ts_ota: OTA subsystem initialized +I (5626) ts_ssh_cmd_cfg: Added SSH command: drop (drop) +I (5627) ts_api_ota: Loaded OTA server URL: (not set) +I (5634) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3_8_27B_Quark_INT4_MTP3.json (672 bytes) +I (5664) ts_api_ota: Registered 21 OTA API endpoints +I (4621) api_log: Log API endpoints registered +I (4623) api_automation: Registering automation APIs +I (5679) ts_ssh_hosts_cfg: Deferred: checking SD card for config (NVS has 0 hosts)... +I (5682) ts_ssh_hosts_cfg: SD card has config, clearing NVS and importing... +I (4639) api_automation: Automation APIs registered +I (4664) api_cert: Certificate APIs registered +I (5741) ts_ssh_cmd_cfg: Added SSH command: Qwen3.8-27B-Quark-INT4-MTP3 (Qwen3_8_27B_Quark_INT4_MTP3) +I (5752) ts_ssh_hosts_cfg: Cleared all SSH host configs +I (5763) ts_ssh_hosts_cfg: Cleared all SSH host configs +I (5768) ts_config_pack: Loading encrypted config: /sdcard/config/ssh_hosts/rm01@10.10.99.98.tscfg +I (4722) ts_auth: Auth module initialized (version 3) +I (5774) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/quark_stop_repair.json (472 bytes) +I (5851) ts_ssh_cmd_cfg: Async sync to SD card... +I (5861) ts_ssh_cmd_cfg: Async sync to SD card... +I (5882) ts_ssh_cmd_cfg: Added SSH command: Quark进程与内存检查 (quark_stop_repair) +I (5888) ts_ssh_cmd_cfg: Loaded 6 SSH commands from directory: /sdcard/config/ssh_commands (skipped 0) +I (4860) api_auth: Auth APIs registered +I (4867) api_ui: Registering UI APIs +I (4884) api_config_pack: Config Pack API registered (8 endpoints) +I (4901) ts_api: All API modules registered (263 endpoints) +I (5956) ts_service: Service 'api' started in 625 ms +I (5961) ts_service: === Phase 7: UI === +I (5965) ts_service: Starting 2 services in phase UI +I (5973) ts_source_mgr: Deferred source loading started +I (5973) ts_service: Starting service: console +I (5998) ts_services: Initializing console service... +I (4955) ts_i18n: I18n initialized, language: English +I (6021) ts_ssh_cmd_cfg: Exported 6 SSH commands to /sdcard/config/ssh_commands/ +I (4986) ts_console: Console initialized +I (5004) cmd_register: Registering all console commands... +I (5029) cmd_system: System commands registered +I (5045) cmd_service: Service commands registered +I (5054) cmd_config: Config commands registered (with pack support) +I (5080) cmd_fan: Fan commands registered (API mode) +I (5093) cmd_storage: Storage commands registered +I (6161) ts_ssh_cmd_cfg: Exported 6 SSH commands to /sdcard/config/ssh_commands/ +I (6193) ts_ssh_cmd_cfg: Loaded 6 commands from SD card (.tscfg > .json) +I (5154) cmd_net: Network commands registered +I (5156) cmd_device: Device commands registered +I (5160) cmd_led: LED commands registered +I (5162) cmd_wifi: WiFi commands registered +I (5173) ts_nat: Initializing NAT module +I (5174) ts_nat: No saved NAT config, using defaults +I (5176) ts_nat: NAT module initialized (auto_start=yes) +I (5195) cmd_key: Registered command: key +I (5197) cmd_ssh: Registered command: ssh +I (6216) ts_config_pack: Loaded plain config: /sdcard/config/sources/agx-info.json (192 bytes) +I (6253) ts_ssh_hosts_cfg: Async sync to SD card... +I (5199) cmd_sftp: Registered command: sftp +I (6262) ts_ssh_hosts_cfg: Exported 0 SSH hosts to /sdcard/config/ssh_hosts/ +I (6264) ts_ssh_hosts_cfg: Async sync to SD card... +I (5217) cmd_hosts: Registered command: hosts +I (6285) ts_ssh_hosts_cfg: Exported 0 SSH hosts to /sdcard/config/ssh_hosts/ +I (6265) ts_source_mgr: Loaded 1 sources from directory: /sdcard/config/sources +I (6298) ts_source_mgr: Loaded 1 sources from SD card directory +I (5242) cmd_fs: File system commands registered: 9 succeeded, 0 failed +I (6325) cmd_gpio: GPIO command registered (high priority) +I (6328) cmd_ota: OTA command registered +I (5283) cmd_pki: Registered 'pki' command +I (6332) cmd_auto: Command 'auto' registered +I (5287) cmd_register: Command registration complete: 24 succeeded, 0 failed +I (6346) ts_services: Starting console service... +I (5301) ts_console: Console task started +TianShanOS> I (6350) ts_source_mgr: Exported 1 sources to directory: /sdcard/config/sources +I (6365) ts_source_mgr: Saved 1 sources to NVS and SD card +I (6366) ts_source_mgr: Deferred source loading complete: 1 sources +I (6372) ts_config_pack: Successfully loaded encrypted config: /sdcard/config/ssh_hosts/rm01@10.10.99.98.tscfg +I (5302) ts_console: Console started +I (6378) ts_source_mgr: Starting loaded data sources... +W (6399) ts_ssh_hosts_cfg: SD card import failed: ESP_ERR_NOT_FOUND +I (6400) ts_source_mgr: Starting all data sources +I (6411) ts_source_mgr: Network ready, starting external sources +I (6412) ts_source_mgr: Starting Socket.IO source: agx-info +I (6424) ts_source_mgr: SIO [agx-info] connection started +I (6405) ts_service: Service 'console' started in 407 ms +I (6427) ts_service: Starting service: webui +I (6447) websocket_client: Started +I (6450) ts_services: Initializing WebUI service... +I (6471) ts_rule_engine: Deferred rule loading started +I (6485) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3.6-35B-A3B.json (281 bytes) +I (6508) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3-Embedding-0.6B.json (301 bytes) +I (6529) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3-Reranker-0.6B.json (297 bytes) +I (6555) ts_config_pack: Loaded plain config: /sdcard/config/rules/drop.json (245 bytes) +I (6575) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3_8_27B_Quark_INT4_MTP3.json (324 bytes) +I (6579) ts_rule_engine: Deferred rule loading complete: 5 rules +I (6814) ts_services: Mounted www partition at /www (2541877/2884241 bytes) +I (5768) ts_webui: Initializing WebUI +I (5769) ts_http: HTTP server initialized +I (5780) ts_webui: WebUI initialized +I (6827) ts_services: Starting WebUI service... +I (5783) ts_http: HTTP server started on port 80 +I (5794) webui_api: Initializing API routes +I (5797) webui_api: API routes registered +I (5798) webui_ws: Initializing WebSocket with Terminal support +I (5809) webui_ws: Terminal buffer allocated in PSRAM (32768 bytes) +I (5811) webui_ws: Power policy event handler registered +I (5822) webui_ws: WebSocket handler registered at /ws +I (5823) ts_webui: WebUI started +I (6881) ts_services: WebUI server started on port 80 +I (6882) ts_service: Service 'webui' started in 432 ms +I (6882) ts_service: All services started in 4969 ms +I (6894) ts_core: TianShanOS started +I (6894) main: TianShanOS started successfully! +I (6895) main: Build: Sep 28 2026 18:02:01 +I (6906) ts_service: === Service Status === +I (6907) ts_service: Total: 12, Running: 12, Stopped: 0, Error: 0 +I (6918) ts_service: Startup time: 4969 ms +I (6918) ts_service: [SERVICE] automation - RUNNING (1734 ms) +I (6919) ts_service: [UI] console - RUNNING (407 ms) +I (6934) ts_service: [UI] webui - RUNNING (432 ms) +I (6935) ts_service: [SERVICE] https - RUNNING (6 ms) +I (6936) ts_service: [SERVICE] api - RUNNING (625 ms) +I (6947) ts_service: [SECURITY] security - RUNNING (272 ms) +I (6948) ts_service: [NETWORK] network - RUNNING (237 ms) +I (6959) ts_service: [DRIVER] power - RUNNING (123 ms) +I (6960) ts_service: [DRIVER] drivers - RUNNING (169 ms) +I (6973) ts_service: [DRIVER] led - RUNNING (178 ms) +I (6974) ts_service: [DRIVER] storage - RUNNING (282 ms) +I (6975) ts_service: [HAL] hal - RUNNING (89 ms) +I (6986) ts_service: ====================== +I (6986) main: Entering main loop... +I (6988) ts_action_mgr: Deferred action template loading started +I (7008) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3.6-35B-A3B.json (190 bytes) +I (7016) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3-Embedding-0.6B.json (205 bytes) +I (7024) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3-Reranker-0.6B.json (202 bytes) +I (7032) ts_config_pack: Loaded plain config: /sdcard/config/actions/drop.json (157 bytes) +I (7041) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3_8_27B_Quark_INT4_MTP3.json (272 bytes) +I (7054) ts_action_mgr: Loaded 5 templates from directory: /sdcard/config/actions +I (7055) ts_action_mgr: Loaded 5 action templates from SD card directory +I (7184) ts_action_mgr: Exported 5 templates to directory: /sdcard/config/actions +I (7186) ts_action_mgr: Saved 5 action templates to NVS and SD card +I (7197) ts_action_mgr: Deferred action template loading complete: 5 templates +I (7088) ts_device: LPMU startup detection: checking if LPMU is online... +I (7093) ts_device: LPMU detected online at 10.10.99.99, setting state to ON +I (94537) ts_config_pack: Loaded plain config: /sdcard/config/ui_widgets.json (480 bytes) +I (93493) api_ui: Loaded widgets from SD card +I (93494) api_ui: Loaded UI widgets config (source: sdcard) +I (96487) ts_security: Session created: 386af091 +I (96488) ts_auth: User root logged in (level 4, session 386af091) +I (97706) ts_config_pack: Loaded plain config: /sdcard/config/ui_widgets.json (480 bytes) +I (96661) api_ui: Loaded widgets from SD card +I (96663) api_ui: Loaded UI widgets config (source: sdcard) +I (99383) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (112607) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (113659) ts_ssh: SSH client initialized (libssh2 version: 1.10.1_DEV) +I (114229) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (114454) ts_shell: Interactive shell opened + +TianShanOS Console Commands +============================ + +[System] + hexdump + mv + cp + rm + mkdir + pwd + cd + cat + ls + dhcp + storage + service + system + lang + echo + clear + reboot + sysinfo + version + help + +[Configuration] + config + +[LED] + led + +[Fan] + fan + +[Network] + wifi + net + +[Device] + device + +[Debug] + log + free + tasks + +Use ' --help' for command details + +I (334884) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (336502) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (336710) ts_shell: Interactive shell opened +I (377695) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (379307) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (379712) ts_shell: Interactive shell opened +I (434939) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (436558) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (436971) ts_shell: Interactive shell opened +I (505756) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (507371) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (507731) ts_shell: Interactive shell opened +I (544589) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (546199) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (546489) ts_shell: Interactive shell opened +I (598411) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (600027) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (600239) ts_shell: Interactive shell opened +I (650760) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (652371) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (652745) ts_shell: Interactive shell opened +I (711464) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (713083) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (713493) ts_shell: Interactive shell opened +I (760262) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (761875) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (762246) ts_shell: Interactive shell opened +I (788583) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (789816) ts_config_pack: Loaded plain config: /sdcard/config/ui_widgets.json (480 bytes) +I (788772) api_ui: Loaded widgets from SD card +I (788773) api_ui: Loaded UI widgets config (source: sdcard) diff --git a/docs/repair/ssh-poll-stack/device-candidate/summary.json b/docs/repair/ssh-poll-stack/device-candidate/summary.json new file mode 100644 index 0000000..2b42030 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/summary.json @@ -0,0 +1,82 @@ +[ + { + "round": 1, + "minimum_hwm_bytes": 4096, + "closed_ssh_poll_count": 0, + "free_heap": 7672364, + "psram_free": 7614416, + "uptime_ms": 319336 + }, + { + "round": 2, + "minimum_hwm_bytes": 4108, + "closed_ssh_poll_count": 0, + "free_heap": 7672156, + "psram_free": 7614208, + "uptime_ms": 368074 + }, + { + "round": 3, + "minimum_hwm_bytes": 4096, + "closed_ssh_poll_count": 0, + "free_heap": 7671944, + "psram_free": 7613996, + "uptime_ms": 408198 + }, + { + "round": 4, + "minimum_hwm_bytes": 4096, + "closed_ssh_poll_count": 0, + "free_heap": 7671944, + "psram_free": 7613996, + "uptime_ms": 468330 + }, + { + "round": 5, + "minimum_hwm_bytes": 4096, + "closed_ssh_poll_count": 0, + "free_heap": 7671940, + "psram_free": 7613996, + "uptime_ms": 536996 + }, + { + "round": 6, + "minimum_hwm_bytes": 4108, + "closed_ssh_poll_count": 0, + "free_heap": 7671940, + "psram_free": 7613996, + "uptime_ms": 574826 + }, + { + "round": 7, + "minimum_hwm_bytes": 4096, + "closed_ssh_poll_count": 0, + "free_heap": 7671720, + "psram_free": 7613768, + "uptime_ms": 629959 + }, + { + "round": 8, + "minimum_hwm_bytes": 4096, + "closed_ssh_poll_count": 0, + "free_heap": 7670896, + "psram_free": 7613204, + "uptime_ms": 684751 + }, + { + "round": 9, + "minimum_hwm_bytes": 3952, + "closed_ssh_poll_count": 0, + "free_heap": 7671940, + "psram_free": 7613996, + "uptime_ms": 749250 + }, + { + "round": 10, + "minimum_hwm_bytes": 3876, + "closed_ssh_poll_count": 0, + "free_heap": 7671576, + "psram_free": 7613736, + "uptime_ms": 795443 + } +] \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-candidate/welcome.json b/docs/repair/ssh-poll-stack/device-candidate/welcome.json new file mode 100644 index 0000000..e4941db --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-candidate/welcome.json @@ -0,0 +1,229 @@ +{ + "stage": "welcome_and_echo", + "time": "2026-09-28T18:12:24.041494", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1108, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 688, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1596, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 908, + "core": 0, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1336, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 392, + "core": 0, + "state": "blocked" + }, + { + "name": "ssh_poll", + "priority": 5, + "stack_hwm": 4096, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15124, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 496, + "core": 1, + "state": "suspended" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2680, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2160, + "core": 1, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + } + ], + "count": 25 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7601348, + "min_free_heap": 7550256, + "internal": { + "total": 308035, + "free": 72459, + "allocated": 235576, + "largest_block": 31744 + }, + "psram": { + "total": 8370236, + "free": 7544404, + "allocated": 825832, + "largest_block": 7471104 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 147627 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds-verified.log b/docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds-verified.log new file mode 100644 index 0000000..a12ddbf --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds-verified.log @@ -0,0 +1,10 @@ +{"round":2,"minimumObservedHwm":3984,"free_heap":7617308,"psram_free":7595964,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":3,"minimumObservedHwm":3996,"free_heap":7616864,"psram_free":7595524,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":4,"minimumObservedHwm":3984,"free_heap":7616384,"psram_free":7595044,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":5,"minimumObservedHwm":3984,"free_heap":7614940,"psram_free":7593732,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":6,"minimumObservedHwm":3644,"free_heap":7612656,"psram_free":7587612,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":7,"minimumObservedHwm":3984,"free_heap":7615172,"psram_free":7593832,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":8,"minimumObservedHwm":3984,"free_heap":7615952,"psram_free":7594616,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":9,"minimumObservedHwm":3996,"free_heap":7615960,"psram_free":7594620,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +{"round":10,"minimumObservedHwm":3984,"free_heap":7616184,"psram_free":7594840,"statuses":["connecting","connected","disconnecting","closed"],"echoVerified":true,"pollerGone":true} +NINE_AUTOMATIC_ROUNDS_COMPLETE diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds.log b/docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds.log new file mode 100644 index 0000000..03a961a --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/automatic-rounds.log @@ -0,0 +1,9 @@ +file:///private/tmp/tianshan-ssh-stack-diagnostic/rounds.mjs:14 + async function wait(fn,ms=15000){const end=Date.now()+ms;while(!fn()){if(err)throw err;if(Date.now()>end)throw Error('Stage timed out; no command retry');await sleep(50);}} + ^ + +Error: Stage timed out; no command retry + at wait (file:///private/tmp/tianshan-ssh-stack-diagnostic/rounds.mjs:14:113) + at async file:///private/tmp/tianshan-ssh-stack-diagnostic/rounds.mjs:23:3 + +Node.js v24.10.0 diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/automatic-samples.jsonl b/docs/repair/ssh-poll-stack/device-diagnostic/automatic-samples.jsonl new file mode 100644 index 0000000..bda28db --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/automatic-samples.jsonl @@ -0,0 +1,38 @@ +{"time":"2026-09-28T10:28:52.179Z","stage":"round2_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7618492,"min_free_heap":7469732,"internal":{"total":269215,"free":25539,"allocated":243676,"largest_block":8692},"psram":{"total":8359952,"free":7596964,"allocated":762988,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":265787}}} +{"time":"2026-09-28T10:28:55.399Z","stage":"round2_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3996,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7546448,"min_free_heap":7469732,"internal":{"total":268991,"free":24255,"allocated":244736,"largest_block":8692},"psram":{"total":8359536,"free":7526212,"allocated":833324,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":268969}}} +{"time":"2026-09-28T10:29:49.289Z","stage":"round2_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7617320,"min_free_heap":7469732,"internal":{"total":269199,"free":25407,"allocated":243792,"largest_block":8692},"psram":{"total":8359840,"free":7595932,"allocated":763908,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":322934}}} +{"time":"2026-09-28T10:29:52.435Z","stage":"round2_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7545964,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359504,"free":7525724,"allocated":833780,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":326001}}} +{"time":"2026-09-28T10:29:52.599Z","stage":"round2_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7545176,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359488,"free":7524936,"allocated":834552,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":326267}}} +{"time":"2026-09-28T10:29:52.868Z","stage":"round2_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7617308,"min_free_heap":7469732,"internal":{"total":269183,"free":25359,"allocated":243824,"largest_block":8692},"psram":{"total":8359856,"free":7595964,"allocated":763892,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":326522}}} +{"time":"2026-09-28T10:29:53.578Z","stage":"round3_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7617588,"min_free_heap":7469732,"internal":{"total":269215,"free":25539,"allocated":243676,"largest_block":8692},"psram":{"total":8359888,"free":7596068,"allocated":763820,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":327129}}} +{"time":"2026-09-28T10:29:56.646Z","stage":"round3_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3996,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7545536,"min_free_heap":7469732,"internal":{"total":268991,"free":24255,"allocated":244736,"largest_block":8692},"psram":{"total":8359472,"free":7525296,"allocated":834176,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":330234}}} +{"time":"2026-09-28T10:29:56.837Z","stage":"round3_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ssh_poll","priority":5,"stack_hwm":3996,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544844,"min_free_heap":7469732,"internal":{"total":268975,"free":24123,"allocated":244852,"largest_block":8692},"psram":{"total":8359392,"free":7524736,"allocated":834656,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":330527}}} +{"time":"2026-09-28T10:29:57.177Z","stage":"round3_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616864,"min_free_heap":7469732,"internal":{"total":269183,"free":25359,"allocated":243824,"largest_block":8692},"psram":{"total":8359824,"free":7595524,"allocated":764300,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":330859}}} +{"time":"2026-09-28T10:29:57.910Z","stage":"round4_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7617136,"min_free_heap":7469732,"internal":{"total":269215,"free":25539,"allocated":243676,"largest_block":8692},"psram":{"total":8359856,"free":7595616,"allocated":764240,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":331475}}} +{"time":"2026-09-28T10:30:00.916Z","stage":"round4_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7545072,"min_free_heap":7469732,"internal":{"total":268991,"free":24255,"allocated":244736,"largest_block":8692},"psram":{"total":8359440,"free":7524820,"allocated":834620,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":334498}}} +{"time":"2026-09-28T10:30:01.103Z","stage":"round4_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7545072,"min_free_heap":7469732,"internal":{"total":268991,"free":24255,"allocated":244736,"largest_block":8692},"psram":{"total":8359440,"free":7524820,"allocated":834620,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":334786}}} +{"time":"2026-09-28T10:30:01.426Z","stage":"round4_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616384,"min_free_heap":7469732,"internal":{"total":269183,"free":25359,"allocated":243824,"largest_block":8692},"psram":{"total":8359792,"free":7595044,"allocated":764748,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":335098}}} +{"time":"2026-09-28T10:30:02.146Z","stage":"round5_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616684,"min_free_heap":7469732,"internal":{"total":269215,"free":25539,"allocated":243676,"largest_block":8692},"psram":{"total":8359824,"free":7595160,"allocated":764664,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":335737}}} +{"time":"2026-09-28T10:30:05.181Z","stage":"round5_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544584,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359408,"free":7524344,"allocated":835064,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":338759}}} +{"time":"2026-09-28T10:30:05.360Z","stage":"round5_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544584,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359408,"free":7524344,"allocated":835064,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":339050}}} +{"time":"2026-09-28T10:30:05.637Z","stage":"round5_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7614940,"min_free_heap":7469732,"internal":{"total":269167,"free":25223,"allocated":243944,"largest_block":8692},"psram":{"total":8359712,"free":7593732,"allocated":765980,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":339344}}} +{"time":"2026-09-28T10:30:06.377Z","stage":"round6_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616452,"min_free_heap":7469732,"internal":{"total":269215,"free":25535,"allocated":243680,"largest_block":8692},"psram":{"total":8359808,"free":7594936,"allocated":764872,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":339938}}} +{"time":"2026-09-28T10:30:09.453Z","stage":"round6_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3644,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544620,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359408,"free":7524384,"allocated":835024,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":343038}}} +{"time":"2026-09-28T10:30:09.622Z","stage":"round6_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":760,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3644,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7543832,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359392,"free":7523596,"allocated":835796,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":343285}}} +{"time":"2026-09-28T10:30:09.871Z","stage":"round6_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7612656,"min_free_heap":7469732,"internal":{"total":269183,"free":25355,"allocated":243828,"largest_block":8692},"psram":{"total":8357344,"free":7587612,"allocated":769732,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":343446}}} +{"time":"2026-09-28T10:30:10.482Z","stage":"round7_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616452,"min_free_heap":7469732,"internal":{"total":269215,"free":25539,"allocated":243676,"largest_block":8692},"psram":{"total":8359808,"free":7594932,"allocated":764876,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":344059}}} +{"time":"2026-09-28T10:30:13.416Z","stage":"round7_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544636,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359408,"free":7524396,"allocated":835012,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":346988}}} +{"time":"2026-09-28T10:30:13.574Z","stage":"round7_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544636,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359408,"free":7524396,"allocated":835012,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":347266}}} +{"time":"2026-09-28T10:30:13.849Z","stage":"round7_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7615172,"min_free_heap":7469732,"internal":{"total":269183,"free":25355,"allocated":243828,"largest_block":8692},"psram":{"total":8359744,"free":7593832,"allocated":765912,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":347412}}} +{"time":"2026-09-28T10:30:14.451Z","stage":"round8_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616460,"min_free_heap":7469732,"internal":{"total":269215,"free":25535,"allocated":243680,"largest_block":8692},"psram":{"total":8359808,"free":7594944,"allocated":764864,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":348037}}} +{"time":"2026-09-28T10:30:17.439Z","stage":"round8_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544612,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359408,"free":7524368,"allocated":835040,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":351029}}} +{"time":"2026-09-28T10:30:17.626Z","stage":"round8_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544612,"min_free_heap":7469732,"internal":{"total":268991,"free":24251,"allocated":244740,"largest_block":8692},"psram":{"total":8359408,"free":7524372,"allocated":835036,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":351282}}} +{"time":"2026-09-28T10:30:17.869Z","stage":"round8_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7615952,"min_free_heap":7469732,"internal":{"total":269183,"free":25355,"allocated":243828,"largest_block":8692},"psram":{"total":8359760,"free":7594616,"allocated":765144,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":351543}}} +{"time":"2026-09-28T10:30:18.574Z","stage":"round9_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7615300,"min_free_heap":7469732,"internal":{"total":269183,"free":25275,"allocated":243908,"largest_block":8692},"psram":{"total":8359680,"free":7594040,"allocated":765640,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":352165}}} +{"time":"2026-09-28T10:30:21.668Z","stage":"round9_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ssh_poll","priority":5,"stack_hwm":3996,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544608,"min_free_heap":7469732,"internal":{"total":268991,"free":24255,"allocated":244736,"largest_block":8692},"psram":{"total":8359408,"free":7524368,"allocated":835040,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":355244}}} +{"time":"2026-09-28T10:30:21.836Z","stage":"round9_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ssh_poll","priority":5,"stack_hwm":3996,"core":2147483647,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544608,"min_free_heap":7469732,"internal":{"total":268991,"free":24255,"allocated":244736,"largest_block":8692},"psram":{"total":8359408,"free":7524368,"allocated":835040,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":355513}}} +{"time":"2026-09-28T10:30:22.102Z","stage":"round9_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7615960,"min_free_heap":7469732,"internal":{"total":269183,"free":25359,"allocated":243824,"largest_block":8692},"psram":{"total":8359760,"free":7594620,"allocated":765140,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":355785}}} +{"time":"2026-09-28T10:30:22.832Z","stage":"round10_before","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616232,"min_free_heap":7469732,"internal":{"total":269215,"free":25539,"allocated":243676,"largest_block":8692},"psram":{"total":8359792,"free":7594712,"allocated":765080,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":356398}}} +{"time":"2026-09-28T10:30:25.700Z","stage":"round10_welcome","tasks":{"code":0,"data":{"tasks":[{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"ready"},{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7544628,"min_free_heap":7469732,"internal":{"total":268991,"free":24255,"allocated":244736,"largest_block":8692},"psram":{"total":8359408,"free":7524392,"allocated":835016,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":359271}}} +{"time":"2026-09-28T10:30:25.849Z","stage":"round10_input","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"ready"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"ssh_poll","priority":5,"stack_hwm":3984,"core":2147483647,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"}],"count":25}},"memory":{"code":0,"data":{"free_heap":7543692,"min_free_heap":7469732,"internal":{"total":268959,"free":23991,"allocated":244968,"largest_block":8692},"psram":{"total":8359296,"free":7523716,"allocated":835580,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":359550}}} +{"time":"2026-09-28T10:30:26.191Z","stage":"round10_closed","tasks":{"code":0,"data":{"tasks":[{"name":"httpd","priority":5,"stack_hwm":4200,"core":0,"state":"running"},{"name":"IDLE1","priority":0,"stack_hwm":728,"core":1,"state":"ready"},{"name":"IDLE0","priority":0,"stack_hwm":864,"core":0,"state":"ready"},{"name":"power_monitor","priority":5,"stack_hwm":1760,"core":0,"state":"blocked"},{"name":"ts_auto","priority":5,"stack_hwm":1828,"core":1,"state":"blocked"},{"name":"tiT","priority":18,"stack_hwm":1144,"core":2147483647,"state":"blocked"},{"name":"power_policy","priority":5,"stack_hwm":760,"core":0,"state":"blocked"},{"name":"websocket_task","priority":5,"stack_hwm":992,"core":2147483647,"state":"blocked"},{"name":"action_exec","priority":5,"stack_hwm":12804,"core":2147483647,"state":"blocked"},{"name":"w5500_tsk","priority":15,"stack_hwm":2468,"core":2147483647,"state":"blocked"},{"name":"https_coord","priority":5,"stack_hwm":5292,"core":2147483647,"state":"blocked"},{"name":"main","priority":1,"stack_hwm":188,"core":0,"state":"blocked"},{"name":"sio_agx-info","priority":5,"stack_hwm":1864,"core":2147483647,"state":"blocked"},{"name":"httpd","priority":5,"stack_hwm":15116,"core":2147483647,"state":"blocked"},{"name":"ts_event","priority":5,"stack_hwm":668,"core":2147483647,"state":"blocked"},{"name":"esp_timer","priority":22,"stack_hwm":2416,"core":0,"state":"suspended"},{"name":"ipc1","priority":24,"stack_hwm":408,"core":1,"state":"suspended"},{"name":"ts_console","priority":5,"stack_hwm":1788,"core":2147483647,"state":"blocked"},{"name":"ipc0","priority":24,"stack_hwm":128,"core":0,"state":"suspended"},{"name":"ws_telemetry","priority":2,"stack_hwm":1844,"core":1,"state":"suspended"},{"name":"led_render","priority":5,"stack_hwm":1164,"core":0,"state":"blocked"},{"name":"sys_evt","priority":20,"stack_hwm":1452,"core":0,"state":"blocked"},{"name":"dhcp_evt","priority":5,"stack_hwm":696,"core":2147483647,"state":"blocked"},{"name":"Tmr Svc","priority":1,"stack_hwm":544,"core":2147483647,"state":"blocked"}],"count":24}},"memory":{"code":0,"data":{"free_heap":7616184,"min_free_heap":7469732,"internal":{"total":269183,"free":25359,"allocated":243824,"largest_block":8692},"psram":{"total":8359776,"free":7594840,"allocated":764936,"largest_block":7471092}}},"info":{"code":0,"data":{"app":{"name":"TianShanOS","version":"0.5.2+3a19128d.09281801","idf_version":"v5.5.2","compile_time":"18:02:03","compile_date":"Sep 28 2026"},"chip":{"model":"ESP32-S3","cores":2,"revision":2,"features":["WiFi","BLE"]},"flash_size":16777216,"uptime_ms":359879}}} diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/final-idle.json b/docs/repair/ssh-poll-stack/device-diagnostic/final-idle.json new file mode 100644 index 0000000..93626fb --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/final-idle.json @@ -0,0 +1,222 @@ +{ + "stage": "final_idle", + "time": "2026-09-28T18:30:57.920294", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 4200, + "core": 0, + "state": "running" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 728, + "core": 1, + "state": "ready" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 864, + "core": 0, + "state": "ready" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 1828, + "core": 1, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 12804, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1144, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1864, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 760, + "core": 0, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 992, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2468, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5292, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 188, + "core": 0, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1760, + "core": 0, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 408, + "core": 1, + "state": "suspended" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1788, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 128, + "core": 0, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 696, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 1844, + "core": 1, + "state": "suspended" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 668, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2416, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1164, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1452, + "core": 0, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 544, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15116, + "core": 2147483647, + "state": "blocked" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7616896, + "min_free_heap": 7469732, + "internal": { + "total": 269231, + "free": 25671, + "allocated": 243560, + "largest_block": 8692 + }, + "psram": { + "total": 8359856, + "free": 7595232, + "allocated": 764624, + "largest_block": 7471092 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:02:03", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 391495 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/flash.log b/docs/repair/ssh-poll-stack/device-diagnostic/flash.log new file mode 100644 index 0000000..892f434 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/flash.log @@ -0,0 +1,239 @@ +Checking "python3" ... +Python 3.12.4 +"python3" has been detected +Activating ESP-IDF 5.5 +Setting IDF_PATH to '/Users/massif/esp/v5.5.2/esp-idf'. +* Checking python version ... 3.12.4 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... zsh +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of riscv32-esp-elf, cmake, xtensa-esp-elf, openocd-esp32, esp-rom-elfs, xtensa-esp-elf-gdb, riscv32-esp-elf-gdb use command 'python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall' +To free up even more space, remove installation packages of those tools. +Use option python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall --remove-archives. +* Shell completion ... Autocompletion code generated + +Done! You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build +Executing action: flash +Running ninja in directory /private/tmp/tianshan-ssh-stack-diagnostic/build +Executing "ninja flash"... +[1/6] cd /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 partition --type app /tmp/tianshan-ssh-stack-diagnostic/build/partition_table/partition-table.bin /tmp/tianshan-ssh-stack-diagnostic/build/TianShanOS.bin +TianShanOS.bin binary size 0x259ee0 bytes. Smallest app partition is 0x300000 bytes. 0xa6120 bytes (22%) free. +[2/6] Performing build step for 'bootloader' +[1/1] cd /tmp/tianshan-ssh-stack-diagnostic/build/bootloader/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /tmp/tianshan-ssh-stack-diagnostic/build/bootloader/bootloader.bin +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[3/6] No install step for 'bootloader' +[4/6] cd /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-ssh-stack-diagnostic/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +[5/6] Completed 'bootloader' +[5/6] cd /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py && /Users/massif/.espressif/tools/cmake/3.30.2/CMake.app/Contents/bin/cmake -D IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf -D "SERIAL_TOOL=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python;;/Users/massif/esp/v5.5.2/esp-idf/components/esptool_py/esptool/esptool.py;--chip;esp32s3" -D "SERIAL_TOOL_ARGS=--before=default_reset;--after=hard_reset;write_flash;@flash_args" -D WORKING_DIRECTORY=/tmp/tianshan-ssh-stack-diagnostic/build -P /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py/run_serial_tool.cmake +esptool.py --chip esp32s3 -p /dev/cu.usbmodem11401 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 80m --flash_size 16MB 0x0 bootloader/bootloader.bin 0x20000 TianShanOS.bin 0x8000 partition_table/partition-table.bin 0x16000 ota_data_initial.bin 0x6a0000 www.bin +esptool.py v4.12.dev2 +Serial port /dev/cu.usbmodem11401 +Connecting... +Chip is ESP32-S3 (QFN56) (revision v0.2) +Features: WiFi, BLE, Embedded PSRAM 8MB (AP_3v3) +Crystal is 40MHz +USB mode: USB-Serial/JTAG +MAC: 20:6e:f1:a1:d5:8c +Uploading stub... +Running stub... +Stub running... +Changing baud rate to 460800 +Changed. +Configuring flash size... +Flash will be erased from 0x00000000 to 0x00005fff... +Flash will be erased from 0x00020000 to 0x00279fff... +Flash will be erased from 0x00008000 to 0x00008fff... +Flash will be erased from 0x00016000 to 0x00017fff... +Flash will be erased from 0x006a0000 to 0x0099ffff... +SHA digest in image updated +Compressed 22496 bytes to 14267... +Writing at 0x00000000... (100 %) +Wrote 22496 bytes (14267 compressed) at 0x00000000 in 0.2 seconds (effective 775.8 kbit/s)... +Hash of data verified. +Compressed 2465504 bytes to 1372560... +Writing at 0x00020000... (1 %) +Writing at 0x0002d702... (2 %) +Writing at 0x0003a713... (3 %) +Writing at 0x0004847c... (4 %) +Writing at 0x00055279... (5 %) +Writing at 0x00063d1c... (7 %) +Writing at 0x00072811... (8 %) +Writing at 0x000810b4... (9 %) +Writing at 0x0008cd04... (10 %) +Writing at 0x00091c7a... (11 %) +Writing at 0x00097b74... (13 %) +Writing at 0x0009c711... (14 %) +Writing at 0x000a1538... (15 %) +Writing at 0x000a68e5... (16 %) +Writing at 0x000ae7c4... (17 %) +Writing at 0x000ba649... (19 %) +Writing at 0x000c1735... (20 %) +Writing at 0x000c83e3... (21 %) +Writing at 0x000cf65d... (22 %) +Writing at 0x000d6e13... (23 %) +Writing at 0x000ddabd... (25 %) +Writing at 0x000e4342... (26 %) +Writing at 0x000eadd0... (27 %) +Writing at 0x000f0fdf... (28 %) +Writing at 0x000f75d6... (29 %) +Writing at 0x000fd828... (30 %) +Writing at 0x001039ca... (32 %) +Writing at 0x0010a632... (33 %) +Writing at 0x0011055b... (34 %) +Writing at 0x00116585... (35 %) +Writing at 0x0011c8f9... (36 %) +Writing at 0x00122ea4... (38 %) +Writing at 0x00129b06... (39 %) +Writing at 0x0013090c... (40 %) +Writing at 0x00136f8e... (41 %) +Writing at 0x0013d288... (42 %) +Writing at 0x00143b55... (44 %) +Writing at 0x0014a0a8... (45 %) +Writing at 0x0015022e... (46 %) +Writing at 0x00156c57... (47 %) +Writing at 0x0015d8f6... (48 %) +Writing at 0x001644e1... (50 %) +Writing at 0x0016b16a... (51 %) +Writing at 0x00171a88... (52 %) +Writing at 0x00178193... (53 %) +Writing at 0x0017f293... (54 %) +Writing at 0x001857e8... (55 %) +Writing at 0x0018be96... (57 %) +Writing at 0x001923c3... (58 %) +Writing at 0x00199906... (59 %) +Writing at 0x0019fb5e... (60 %) +Writing at 0x001a646d... (61 %) +Writing at 0x001ad231... (63 %) +Writing at 0x001b47e1... (64 %) +Writing at 0x001bb1fa... (65 %) +Writing at 0x001c19dd... (66 %) +Writing at 0x001c7c21... (67 %) +Writing at 0x001cdfb0... (69 %) +Writing at 0x001d4467... (70 %) +Writing at 0x001daa16... (71 %) +Writing at 0x001e180c... (72 %) +Writing at 0x001e8387... (73 %) +Writing at 0x001eee3a... (75 %) +Writing at 0x001f5c18... (76 %) +Writing at 0x001fc685... (77 %) +Writing at 0x0020304e... (78 %) +Writing at 0x00209456... (79 %) +Writing at 0x0021047a... (80 %) +Writing at 0x00216ab8... (82 %) +Writing at 0x0021d992... (83 %) +Writing at 0x00223943... (84 %) +Writing at 0x002289a2... (85 %) +Writing at 0x0022dfab... (86 %) +Writing at 0x002333b2... (88 %) +Writing at 0x00238cf0... (89 %) +Writing at 0x0023f567... (90 %) +Writing at 0x00245a2d... (91 %) +Writing at 0x0024b042... (92 %) +Writing at 0x0025310a... (94 %) +Writing at 0x00259419... (95 %) +Writing at 0x002601eb... (96 %) +Writing at 0x00266ebb... (97 %) +Writing at 0x0026d78a... (98 %) +Writing at 0x00274821... (100 %) +Wrote 2465504 bytes (1372560 compressed) at 0x00020000 in 12.7 seconds (effective 1554.2 kbit/s)... +Hash of data verified. +Compressed 3072 bytes to 180... +Writing at 0x00008000... (100 %) +Wrote 3072 bytes (180 compressed) at 0x00008000 in 0.0 seconds (effective 738.0 kbit/s)... +Hash of data verified. +Compressed 8192 bytes to 31... +Writing at 0x00016000... (100 %) +Wrote 8192 bytes (31 compressed) at 0x00016000 in 0.0 seconds (effective 1397.2 kbit/s)... +Hash of data verified. +Compressed 3145728 bytes to 1301907... +Writing at 0x006a0000... (1 %) +Writing at 0x006a457e... (2 %) +Writing at 0x006a89e3... (3 %) +Writing at 0x006b047c... (5 %) +Writing at 0x006baf69... (6 %) +Writing at 0x006d1206... (7 %) +Writing at 0x006da3ed... (8 %) +Writing at 0x006def13... (10 %) +Writing at 0x006e398f... (11 %) +Writing at 0x006e81c3... (12 %) +Writing at 0x006ec7fd... (13 %) +Writing at 0x006f0d22... (15 %) +Writing at 0x006f5a46... (16 %) +Writing at 0x006faa98... (17 %) +Writing at 0x006fefab... (18 %) +Writing at 0x007035af... (20 %) +Writing at 0x007082a8... (21 %) +Writing at 0x0070c80f... (22 %) +Writing at 0x007122f1... (23 %) +Writing at 0x007195c7... (25 %) +Writing at 0x0071e795... (26 %) +Writing at 0x00724b4d... (27 %) +Writing at 0x00729ad6... (28 %) +Writing at 0x0072de98... (30 %) +Writing at 0x00732372... (31 %) +Writing at 0x00736749... (32 %) +Writing at 0x0073ab18... (33 %) +Writing at 0x0073eee3... (35 %) +Writing at 0x007433b1... (36 %) +Writing at 0x007477a8... (37 %) +Writing at 0x0074bb76... (38 %) +Writing at 0x0074ff3f... (40 %) +Writing at 0x0075447a... (41 %) +Writing at 0x0075c5f8... (42 %) +Writing at 0x00769000... (43 %) +Writing at 0x00778601... (45 %) +Writing at 0x00789b0f... (46 %) +Writing at 0x0079ac96... (47 %) +Writing at 0x007af271... (48 %) +Writing at 0x007bf6f8... (50 %) +Writing at 0x007d0f1b... (51 %) +Writing at 0x007e45da... (52 %) +Writing at 0x007f75ac... (53 %) +Writing at 0x00807e03... (55 %) +Writing at 0x0081a13e... (56 %) +Writing at 0x0082d777... (57 %) +Writing at 0x0083fde1... (58 %) +Writing at 0x0085163b... (60 %) +Writing at 0x0085ee5a... (61 %) +Writing at 0x0086c200... (62 %) +Writing at 0x008775dc... (63 %) +Writing at 0x00883eaf... (65 %) +Writing at 0x008903ff... (66 %) +Writing at 0x00897717... (67 %) +Writing at 0x0089ba87... (68 %) +Writing at 0x0089feb5... (70 %) +Writing at 0x008a4410... (71 %) +Writing at 0x008a884e... (72 %) +Writing at 0x008acbf6... (73 %) +Writing at 0x008b17d0... (75 %) +Writing at 0x008b5b99... (76 %) +Writing at 0x008b9f62... (77 %) +Writing at 0x008be429... (78 %) +Writing at 0x008c27e8... (80 %) +Writing at 0x008c6bba... (81 %) +Writing at 0x008caf7b... (82 %) +Writing at 0x008cf43f... (83 %) +Writing at 0x008d3802... (85 %) +Writing at 0x008d7bc6... (86 %) +Writing at 0x008dbf87... (87 %) +Writing at 0x008e0a43... (88 %) +Writing at 0x008e6b82... (90 %) +Writing at 0x008eaf45... (91 %) +Writing at 0x008ef3fe... (92 %) +Writing at 0x008f3873... (93 %) +Writing at 0x008fc62d... (95 %) +Writing at 0x0090dc54... (96 %) +Writing at 0x0091db75... (97 %) +Writing at 0x0092f6a7... (98 %) +Writing at 0x0093dbfb... (100 %) +Wrote 3145728 bytes (1301907 compressed) at 0x006a0000 in 14.5 seconds (effective 1739.0 kbit/s)... +Hash of data verified. + +Leaving... +Hard resetting via RTS pin... +Done diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/output-input-resize.json b/docs/repair/ssh-poll-stack/device-diagnostic/output-input-resize.json new file mode 100644 index 0000000..5e3ef97 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/output-input-resize.json @@ -0,0 +1,229 @@ +{ + "stage": "output_input_resize", + "time": "2026-09-28T18:25:56.788651", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 4200, + "core": 0, + "state": "running" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 760, + "core": 1, + "state": "ready" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 864, + "core": 0, + "state": "ready" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1944, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 1828, + "core": 1, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1760, + "core": 0, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 12804, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1144, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 992, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 760, + "core": 0, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2468, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5292, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 188, + "core": 0, + "state": "blocked" + }, + { + "name": "ssh_poll", + "priority": 5, + "stack_hwm": 3984, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 544, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15116, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1788, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 128, + "core": 0, + "state": "suspended" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 696, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 668, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2416, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1164, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1452, + "core": 0, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 408, + "core": 1, + "state": "suspended" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 1844, + "core": 1, + "state": "suspended" + } + ], + "count": 25 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7546440, + "min_free_heap": 7469732, + "internal": { + "total": 269023, + "free": 24431, + "allocated": 244592, + "largest_block": 8692 + }, + "psram": { + "total": 8359536, + "free": 7526028, + "allocated": 833508, + "largest_block": 7471092 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:02:03", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 90494 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round1-closed.json b/docs/repair/ssh-poll-stack/device-diagnostic/round1-closed.json new file mode 100644 index 0000000..1c05825 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round1-closed.json @@ -0,0 +1,222 @@ +{ + "stage": "round1_closed_local_help", + "time": "2026-09-28T18:26:47.357001", + "tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 4200, + "core": 0, + "state": "running" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1164, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 760, + "core": 1, + "state": "ready" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 864, + "core": 0, + "state": "ready" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1144, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1760, + "core": 0, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1928, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 992, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 760, + "core": 0, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 12804, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2468, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5292, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 188, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 1828, + "core": 1, + "state": "blocked" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 696, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 408, + "core": 1, + "state": "suspended" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 1844, + "core": 1, + "state": "suspended" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 544, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15116, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 668, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2416, + "core": 0, + "state": "suspended" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1452, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1788, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 128, + "core": 0, + "state": "suspended" + } + ], + "count": 24 + } + }, + "memory": { + "code": 0, + "data": { + "free_heap": 7618496, + "min_free_heap": 7469732, + "internal": { + "total": 269231, + "free": 25671, + "allocated": 243560, + "largest_block": 8692 + }, + "psram": { + "total": 8359968, + "free": 7596844, + "allocated": 763124, + "largest_block": 7471092 + } + } + }, + "info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:02:03", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 140957 + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round10-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round10-automatic.json new file mode 100644 index 0000000..9fabb3f --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round10-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 10, + "minimumObservedHwm": 3984, + "free_heap": 7616184, + "psram_free": 7594840, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round2-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round2-automatic.json new file mode 100644 index 0000000..55b8f2b --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round2-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 2, + "minimumObservedHwm": 3984, + "free_heap": 7617308, + "psram_free": 7595964, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round3-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round3-automatic.json new file mode 100644 index 0000000..e7e233b --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round3-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 3, + "minimumObservedHwm": 3996, + "free_heap": 7616864, + "psram_free": 7595524, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round4-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round4-automatic.json new file mode 100644 index 0000000..3059967 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round4-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 4, + "minimumObservedHwm": 3984, + "free_heap": 7616384, + "psram_free": 7595044, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round5-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round5-automatic.json new file mode 100644 index 0000000..d1200d0 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round5-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 5, + "minimumObservedHwm": 3984, + "free_heap": 7614940, + "psram_free": 7593732, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round6-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round6-automatic.json new file mode 100644 index 0000000..07aa809 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round6-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 6, + "minimumObservedHwm": 3644, + "free_heap": 7612656, + "psram_free": 7587612, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round7-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round7-automatic.json new file mode 100644 index 0000000..115b67f --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round7-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 7, + "minimumObservedHwm": 3984, + "free_heap": 7615172, + "psram_free": 7593832, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round8-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round8-automatic.json new file mode 100644 index 0000000..758ef63 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round8-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 8, + "minimumObservedHwm": 3984, + "free_heap": 7615952, + "psram_free": 7594616, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/round9-automatic.json b/docs/repair/ssh-poll-stack/device-diagnostic/round9-automatic.json new file mode 100644 index 0000000..cc8b2c1 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/round9-automatic.json @@ -0,0 +1,14 @@ +{ + "round": 9, + "minimumObservedHwm": 3996, + "free_heap": 7615960, + "psram_free": 7594620, + "statuses": [ + "connecting", + "connected", + "disconnecting", + "closed" + ], + "echoVerified": true, + "pollerGone": true +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/rounds.mjs b/docs/repair/ssh-poll-stack/device-diagnostic/rounds.mjs new file mode 100644 index 0000000..cce7990 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/rounds.mjs @@ -0,0 +1,39 @@ +import fs from 'node:fs'; +const dir='/tmp/tianshan-ssh-stack-diagnostic',base='http://10.10.99.97'; +const password=process.env.TS_TEST_PASSWORD;if(!password)throw Error('Missing credential'); +const sleep=ms=>new Promise(r=>setTimeout(r,ms)); +async function snapshot(stage){let r={time:new Date().toISOString(),stage};for(const n of ['tasks','memory','info']){const a=await fetch(base+'/api/v1/system/'+n,{signal:AbortSignal.timeout(5000)});r[n]=await a.json();if(r[n].code!==0)throw Error('API failure '+n);}fs.appendFileSync(dir+'/automatic-samples.jsonl',JSON.stringify(r)+'\n');return r;} +const pollers=r=>r.tasks.data.tasks.filter(t=>t.name==='ssh_poll'); +function faults(){return fs.readFileSync(dir+'/serial.log','utf8').split('\n').filter(l=>/stack overflow|stack canary|Guru Meditation|CORRUPT HEAP|assert failed|watchdog|heap poisoning|LoadProhibited|StoreProhibited|Unhandled debug exception|stack smashing/i.test(l));} +for(let round=2;round<=10;round++){ + const before=await snapshot('round'+round+'_before');if(pollers(before).length)throw Error('Existing SSH task: stop without takeover'); + let messages=[],output='',connected=false,closed=false,err=null; + const ws=new WebSocket('ws://10.10.99.97/ws'); + ws.addEventListener('message',e=>{try{let m=JSON.parse(e.data);messages.push(m);if(m.type==='ssh_output'){output+=m.data||'';fs.appendFileSync(dir+'/output-round'+round+'.txt',m.data||'');}if(m.type==='ssh_status'){if(m.status==='connected')connected=true;if(m.status==='closed')closed=true;if(m.status==='error')err=Error(m.message);}if(m.type==='error')err=Error(m.message||m.error);}catch(e){err=e;}}); + ws.addEventListener('error',()=>{err=Error('WebSocket error');}); + async function wait(fn,ms=15000){const end=Date.now()+ms;while(!fn()){if(err)throw err;if(Date.now()>end)throw Error('Stage timed out; no command retry');await sleep(50);}} + const send=m=>ws.send(JSON.stringify(m)); + try{ + await wait(()=>ws.readyState===1); + send({type:'ssh_connect',host:'10.10.99.98',port:22,user:'rm01',password}); + await wait(()=>connected);await wait(()=>/rm01@agx:.*\$/.test(output)); + const welcome=await snapshot('round'+round+'_welcome');if(pollers(welcome).length!==1)throw Error('Wrong poller count'); + output='';const marker='TIANSHAN_DIAG_VERIFIED_'+round; + send({type:'ssh_input',data:"echo '"+marker+"'\r"}); + await wait(()=>output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,'').split(/\r?\n/).some(l=>l.trim()===marker)); + const active=await snapshot('round'+round+'_input');if(pollers(active).some(t=>t.stack_hwm<2048))throw Error('Insufficient stack margin'); + send({type:'ssh_disconnect'});await wait(()=>closed); + let after; + for(let i=0;i<20;i++){after=await snapshot('round'+round+'_closed');if(!pollers(after).length)break;await sleep(100);} + if(pollers(after).length)throw Error('Poller not reclaimed'); + if(after.info.data.uptime_mst.stack_hwm),...pollers(active).map(t=>t.stack_hwm)),free_heap:after.memory.data.free_heap,psram_free:after.memory.data.psram.free,statuses:messages.filter(m=>m.type==='ssh_status').map(m=>m.status),echoVerified:true,pollerGone:true}; + fs.writeFileSync(dir+'/round'+round+'-automatic.json',JSON.stringify(result,null,2));console.log(JSON.stringify(result)); + }finally{ + if(connected&&!closed&&ws.readyState===1){send({type:'ssh_disconnect'});await sleep(1000);} + ws.close(); + } + await sleep(500); +} +console.log('NINE_AUTOMATIC_ROUNDS_COMPLETE'); diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/samples.jsonl b/docs/repair/ssh-poll-stack/device-diagnostic/samples.jsonl new file mode 100644 index 0000000..d69e93c --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/samples.jsonl @@ -0,0 +1,172 @@ +{"time": "2026-09-28T18:24:43.361228", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1244, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2612, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619644, "min_free_heap": 7473908, "internal": {"total": 269455, "free": 26439, "allocated": 243016, "largest_block": 8692}, "psram": {"total": 8360080, "free": 7597212, "allocated": 762868, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 16926}}} +{"time": "2026-09-28T18:24:45.457589", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1244, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2612, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618500, "min_free_heap": 7473908, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360016, "free": 7596448, "allocated": 763568, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 19119}}} +{"time": "2026-09-28T18:24:47.649068", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1244, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2612, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619976, "min_free_heap": 7472928, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360048, "free": 7597684, "allocated": 762364, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 21199}}} +{"time": "2026-09-28T18:24:49.727677", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1212, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619976, "min_free_heap": 7472928, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360048, "free": 7597684, "allocated": 762364, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 23279}}} +{"time": "2026-09-28T18:24:51.810611", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1212, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619984, "min_free_heap": 7472928, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360048, "free": 7597684, "allocated": 762364, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 25362}}} +{"time": "2026-09-28T18:24:53.892582", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1212, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619980, "min_free_heap": 7472928, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360048, "free": 7597688, "allocated": 762360, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 27447}}} +{"time": "2026-09-28T18:24:55.975923", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1192, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619984, "min_free_heap": 7472928, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360048, "free": 7597684, "allocated": 762364, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 29532}}} +{"time": "2026-09-28T18:24:58.056995", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1192, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619976, "min_free_heap": 7472928, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360048, "free": 7597684, "allocated": 762364, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 31607}}} +{"time": "2026-09-28T18:25:00.135212", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4664, "core": 2147483647, "state": "running"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1192, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 3716, "core": 2147483647, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7619976, "min_free_heap": 7472928, "internal": {"total": 269439, "free": 26307, "allocated": 243132, "largest_block": 8692}, "psram": {"total": 8360048, "free": 7597684, "allocated": 762364, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 33690}}} +{"time": "2026-09-28T18:25:02.215777", "tasks": {"error": "timed out"}, "memory": {"code": 0, "data": {"free_heap": 7615860, "min_free_heap": 7472928, "internal": {"total": 269343, "free": 25503, "allocated": 243840, "largest_block": 8692}, "psram": {"total": 8359664, "free": 7594324, "allocated": 765340, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 40230}}} +{"time": "2026-09-28T18:25:08.760992", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617308, "min_free_heap": 7472784, "internal": {"total": 269199, "free": 25323, "allocated": 243876, "largest_block": 8692}, "psram": {"total": 8359840, "free": 7596000, "allocated": 763840, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 42549}}} +{"time": "2026-09-28T18:25:11.094871", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616788, "min_free_heap": 7472684, "internal": {"total": 269183, "free": 25191, "allocated": 243992, "largest_block": 8692}, "psram": {"total": 8359792, "free": 7595600, "allocated": 764192, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 44708}}} +{"time": "2026-09-28T18:25:13.260769", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617372, "min_free_heap": 7472684, "internal": {"total": 269167, "free": 25143, "allocated": 244024, "largest_block": 8692}, "psram": {"total": 8359824, "free": 7596244, "allocated": 763580, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 46835}}} +{"time": "2026-09-28T18:25:15.386659", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616584, "min_free_heap": 7472684, "internal": {"total": 269167, "free": 25143, "allocated": 244024, "largest_block": 8692}, "psram": {"total": 8359808, "free": 7595456, "allocated": 764352, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 48995}}} +{"time": "2026-09-28T18:25:17.529635", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617360, "min_free_heap": 7472684, "internal": {"total": 269167, "free": 25143, "allocated": 244024, "largest_block": 8692}, "psram": {"total": 8359824, "free": 7596232, "allocated": 763592, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 51125}}} +{"time": "2026-09-28T18:25:19.664782", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617372, "min_free_heap": 7472684, "internal": {"total": 269167, "free": 25143, "allocated": 244024, "largest_block": 8692}, "psram": {"total": 8359824, "free": 7596244, "allocated": 763580, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 53255}}} +{"time": "2026-09-28T18:25:21.808339", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617380, "min_free_heap": 7472684, "internal": {"total": 269167, "free": 25143, "allocated": 244024, "largest_block": 8692}, "psram": {"total": 8359824, "free": 7596252, "allocated": 763572, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 55410}}} +{"time": "2026-09-28T18:25:23.941214", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4524, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617372, "min_free_heap": 7472684, "internal": {"total": 269167, "free": 25143, "allocated": 244024, "largest_block": 8692}, "psram": {"total": 8359824, "free": 7596244, "allocated": 763580, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 57556}}} +{"time": "2026-09-28T18:25:26.086622", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4044, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7545084, "min_free_heap": 7472684, "internal": {"total": 268975, "free": 24035, "allocated": 244940, "largest_block": 8692}, "psram": {"total": 8359392, "free": 7525060, "allocated": 834332, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 59807}}} +{"time": "2026-09-28T18:25:28.339002", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "ready"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7544296, "min_free_heap": 7472684, "internal": {"total": 268975, "free": 24035, "allocated": 244940, "largest_block": 8692}, "psram": {"total": 8359376, "free": 7524280, "allocated": 835096, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 62035}}} +{"time": "2026-09-28T18:25:30.565226", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7545088, "min_free_heap": 7472684, "internal": {"total": 268975, "free": 24035, "allocated": 244940, "largest_block": 8692}, "psram": {"total": 8359392, "free": 7525068, "allocated": 834324, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 64251}}} +{"time": "2026-09-28T18:25:32.785421", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7545080, "min_free_heap": 7469732, "internal": {"total": 268975, "free": 24035, "allocated": 244940, "largest_block": 8692}, "psram": {"total": 8359392, "free": 7525060, "allocated": 834332, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 66471}}} +{"time": "2026-09-28T18:25:35.019632", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7545092, "min_free_heap": 7469732, "internal": {"total": 268975, "free": 24035, "allocated": 244940, "largest_block": 8692}, "psram": {"total": 8359392, "free": 7525072, "allocated": 834320, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 68693}}} +{"time": "2026-09-28T18:25:37.250535", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7544908, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24167, "allocated": 244824, "largest_block": 8692}, "psram": {"total": 8359504, "free": 7525908, "allocated": 833596, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 70941}}} +{"time": "2026-09-28T18:25:39.470966", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546696, "min_free_heap": 7469732, "internal": {"total": 269023, "free": 24431, "allocated": 244592, "largest_block": 8692}, "psram": {"total": 8359568, "free": 7526284, "allocated": 833284, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 73145}}} +{"time": "2026-09-28T18:25:41.682125", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546684, "min_free_heap": 7469732, "internal": {"total": 269023, "free": 24431, "allocated": 244592, "largest_block": 8692}, "psram": {"total": 8359568, "free": 7526260, "allocated": 833308, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 75321}}} +{"time": "2026-09-28T18:25:43.863226", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546692, "min_free_heap": 7469732, "internal": {"total": 269023, "free": 24431, "allocated": 244592, "largest_block": 8692}, "psram": {"total": 8359568, "free": 7526280, "allocated": 833288, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 77530}}} +{"time": "2026-09-28T18:25:46.065845", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546696, "min_free_heap": 7469732, "internal": {"total": 269023, "free": 24431, "allocated": 244592, "largest_block": 8692}, "psram": {"total": 8359568, "free": 7526284, "allocated": 833284, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 79703}}} +{"time": "2026-09-28T18:25:48.243985", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 81891}}} +{"time": "2026-09-28T18:25:50.444961", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546364, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359600, "free": 7525820, "allocated": 833780, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 84039}}} +{"time": "2026-09-28T18:25:52.575184", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 86171}}} +{"time": "2026-09-28T18:25:54.709681", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 88308}}} +{"time": "2026-09-28T18:25:56.839626", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7545988, "min_free_heap": 7469732, "internal": {"total": 269007, "free": 24299, "allocated": 244708, "largest_block": 8692}, "psram": {"total": 8359488, "free": 7525708, "allocated": 833780, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 90512}}} +{"time": "2026-09-28T18:25:59.042019", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 92657}}} +{"time": "2026-09-28T18:26:01.207606", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 94779}}} +{"time": "2026-09-28T18:26:03.308468", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 96902}}} +{"time": "2026-09-28T18:26:05.449396", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547148, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526604, "allocated": 833012, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 99020}}} +{"time": "2026-09-28T18:26:07.550013", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 101154}}} +{"time": "2026-09-28T18:26:09.701907", "tasks": {"code": 0, "data": {"tasks": [{"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547156, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526612, "allocated": 833004, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 103307}}} +{"time": "2026-09-28T18:26:11.841884", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 105442}}} +{"time": "2026-09-28T18:26:13.972682", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 107566}}} +{"time": "2026-09-28T18:26:16.124197", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 109707}}} +{"time": "2026-09-28T18:26:18.257782", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 111840}}} +{"time": "2026-09-28T18:26:20.379107", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547156, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526612, "allocated": 833004, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 113984}}} +{"time": "2026-09-28T18:26:22.529574", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1944, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 116120}}} +{"time": "2026-09-28T18:26:24.671503", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7547152, "min_free_heap": 7469732, "internal": {"total": 269039, "free": 24563, "allocated": 244476, "largest_block": 8692}, "psram": {"total": 8359616, "free": 7526608, "allocated": 833008, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 118267}}} +{"time": "2026-09-28T18:26:26.795938", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 120367}}} +{"time": "2026-09-28T18:26:28.907261", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 122501}}} +{"time": "2026-09-28T18:26:31.032762", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 124623}}} +{"time": "2026-09-28T18:26:33.167208", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 126735}}} +{"time": "2026-09-28T18:26:35.269284", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596844, "allocated": 763124, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 128866}}} +{"time": "2026-09-28T18:26:37.400051", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 130993}}} +{"time": "2026-09-28T18:26:39.539848", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617708, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359952, "free": 7596044, "allocated": 763908, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 133145}}} +{"time": "2026-09-28T18:26:41.670929", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596844, "allocated": 763124, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 135282}}} +{"time": "2026-09-28T18:26:43.820525", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596844, "allocated": 763124, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 137385}}} +{"time": "2026-09-28T18:26:45.936923", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 139515}}} +{"time": "2026-09-28T18:26:48.056484", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596844, "allocated": 763124, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 141642}}} +{"time": "2026-09-28T18:26:50.191489", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618492, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596828, "allocated": 763140, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 143795}}} +{"time": "2026-09-28T18:26:52.332260", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618492, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596828, "allocated": 763140, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 145932}}} +{"time": "2026-09-28T18:26:54.463877", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617708, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359952, "free": 7596056, "allocated": 763896, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 148074}}} +{"time": "2026-09-28T18:26:56.627667", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 150201}}} +{"time": "2026-09-28T18:26:58.752665", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618492, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596828, "allocated": 763140, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 152357}}} +{"time": "2026-09-28T18:27:00.894907", "tasks": {"code": 0, "data": {"tasks": [{"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "ready"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596844, "allocated": 763124, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 154492}}} +{"time": "2026-09-28T18:27:03.025736", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596844, "allocated": 763124, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 156625}}} +{"time": "2026-09-28T18:27:05.161077", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 158755}}} +{"time": "2026-09-28T18:27:07.294782", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 160871}}} +{"time": "2026-09-28T18:27:09.408075", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618496, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 162981}}} +{"time": "2026-09-28T18:27:11.520680", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1928, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618716, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597052, "allocated": 762932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 165116}}} +{"time": "2026-09-28T18:27:13.651957", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618716, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597052, "allocated": 762932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 167220}}} +{"time": "2026-09-28T18:27:15.765436", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618716, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597052, "allocated": 762932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 169370}}} +{"time": "2026-09-28T18:27:17.918142", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618716, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597052, "allocated": 762932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 171520}}} +{"time": "2026-09-28T18:27:20.062436", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618716, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597052, "allocated": 762932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 173641}}} +{"time": "2026-09-28T18:27:22.189406", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618716, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597052, "allocated": 762932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 175783}}} +{"time": "2026-09-28T18:27:24.335569", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618716, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597052, "allocated": 762932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 177930}}} +{"time": "2026-09-28T18:27:26.479435", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617936, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596272, "allocated": 763696, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 180090}}} +{"time": "2026-09-28T18:27:28.634489", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618720, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597068, "allocated": 762916, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 182205}}} +{"time": "2026-09-28T18:27:30.739632", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618720, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7597056, "allocated": 762928, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 184309}}} +{"time": "2026-09-28T18:27:32.839561", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 186417}}} +{"time": "2026-09-28T18:27:34.968811", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 188541}}} +{"time": "2026-09-28T18:27:37.088804", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 190665}}} +{"time": "2026-09-28T18:27:39.222385", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597280, "allocated": 762720, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 192793}}} +{"time": "2026-09-28T18:27:41.346184", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 194929}}} +{"time": "2026-09-28T18:27:43.482502", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618940, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597288, "allocated": 762712, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 197073}}} +{"time": "2026-09-28T18:27:45.607429", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618156, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7596492, "allocated": 763492, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 199196}}} +{"time": "2026-09-28T18:27:47.748836", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618932, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597268, "allocated": 762732, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 201345}}} +{"time": "2026-09-28T18:27:49.897922", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 203476}}} +{"time": "2026-09-28T18:27:52.024736", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 205598}}} +{"time": "2026-09-28T18:27:54.147321", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618948, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597284, "allocated": 762716, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 207711}}} +{"time": "2026-09-28T18:27:56.258877", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597280, "allocated": 762720, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 209842}}} +{"time": "2026-09-28T18:27:58.392727", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618948, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597284, "allocated": 762716, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 211973}}} +{"time": "2026-09-28T18:28:00.507146", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7615892, "min_free_heap": 7469732, "internal": {"total": 269215, "free": 25603, "allocated": 243612, "largest_block": 8692}, "psram": {"total": 8358672, "free": 7593128, "allocated": 765544, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 214104}}} +{"time": "2026-09-28T18:28:02.658627", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618140, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7596476, "allocated": 763508, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 216233}}} +{"time": "2026-09-28T18:28:04.786352", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618940, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597288, "allocated": 762712, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 218378}}} +{"time": "2026-09-28T18:28:06.915316", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 220499}}} +{"time": "2026-09-28T18:28:09.047748", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618936, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597272, "allocated": 762728, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 222611}}} +{"time": "2026-09-28T18:28:11.156966", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 224745}}} +{"time": "2026-09-28T18:28:13.297448", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618940, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597276, "allocated": 762724, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 226888}}} +{"time": "2026-09-28T18:28:15.430380", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618936, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597272, "allocated": 762728, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 229042}}} +{"time": "2026-09-28T18:28:17.577652", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618928, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597264, "allocated": 762736, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 231187}}} +{"time": "2026-09-28T18:28:19.723644", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618940, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597288, "allocated": 762712, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 233325}}} +{"time": "2026-09-28T18:28:21.859654", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 235463}}} +{"time": "2026-09-28T18:28:24.010868", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 237600}}} +{"time": "2026-09-28T18:28:26.133353", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597280, "allocated": 762720, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 239713}}} +{"time": "2026-09-28T18:28:28.266592", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 241838}}} +{"time": "2026-09-28T18:28:30.387582", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 243954}}} +{"time": "2026-09-28T18:28:32.504937", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 246100}}} +{"time": "2026-09-28T18:28:34.647639", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597280, "allocated": 762720, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 248247}}} +{"time": "2026-09-28T18:28:36.778232", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597280, "allocated": 762720, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 250385}}} +{"time": "2026-09-28T18:28:38.938433", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618940, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597276, "allocated": 762724, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 252539}}} +{"time": "2026-09-28T18:28:41.071131", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618940, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597276, "allocated": 762724, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 254653}}} +{"time": "2026-09-28T18:28:43.206609", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 256801}}} +{"time": "2026-09-28T18:28:45.331975", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 258941}}} +{"time": "2026-09-28T18:28:47.476345", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618944, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597292, "allocated": 762708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 261063}}} +{"time": "2026-09-28T18:28:49.605075", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618152, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359984, "free": 7596488, "allocated": 763496, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 263215}}} +{"time": "2026-09-28T18:28:51.749940", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618940, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8360000, "free": 7597276, "allocated": 762724, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 265350}}} +{"time": "2026-09-28T18:28:53.880214", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4056, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546444, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24255, "allocated": 244736, "largest_block": 8692}, "psram": {"total": 8359536, "free": 7526204, "allocated": 833332, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 267457}}} +{"time": "2026-09-28T18:28:56.007222", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546000, "min_free_heap": 7469732, "internal": {"total": 268975, "free": 24123, "allocated": 244852, "largest_block": 8692}, "psram": {"total": 8359488, "free": 7525892, "allocated": 833596, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 269613}}} +{"time": "2026-09-28T18:28:58.149868", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546000, "min_free_heap": 7469732, "internal": {"total": 268975, "free": 24123, "allocated": 244852, "largest_block": 8692}, "psram": {"total": 8359488, "free": 7525888, "allocated": 833600, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 271756}}} +{"time": "2026-09-28T18:29:00.296297", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546896, "min_free_heap": 7469732, "internal": {"total": 269007, "free": 24387, "allocated": 244620, "largest_block": 8692}, "psram": {"total": 8359584, "free": 7526524, "allocated": 833060, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 273892}}} +{"time": "2026-09-28T18:29:02.421308", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546896, "min_free_heap": 7469732, "internal": {"total": 269007, "free": 24387, "allocated": 244620, "largest_block": 8692}, "psram": {"total": 8359584, "free": 7526528, "allocated": 833056, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 276012}}} +{"time": "2026-09-28T18:29:04.564898", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546896, "min_free_heap": 7469732, "internal": {"total": 269007, "free": 24387, "allocated": 244620, "largest_block": 8692}, "psram": {"total": 8359584, "free": 7526524, "allocated": 833060, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 278151}}} +{"time": "2026-09-28T18:29:06.705482", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546108, "min_free_heap": 7469732, "internal": {"total": 269007, "free": 24387, "allocated": 244620, "largest_block": 8692}, "psram": {"total": 8359568, "free": 7525736, "allocated": 833832, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 280283}}} +{"time": "2026-09-28T18:29:08.825709", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7546896, "min_free_heap": 7469732, "internal": {"total": 269007, "free": 24387, "allocated": 244620, "largest_block": 8692}, "psram": {"total": 8359584, "free": 7526524, "allocated": 833060, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 282420}}} +{"time": "2026-09-28T18:29:10.950995", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618212, "min_free_heap": 7469732, "internal": {"total": 269199, "free": 25491, "allocated": 243708, "largest_block": 8692}, "psram": {"total": 8359936, "free": 7596740, "allocated": 763196, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 284533}}} +{"time": "2026-09-28T18:29:13.080057", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618484, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596832, "allocated": 763136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 286686}}} +{"time": "2026-09-28T18:29:15.232421", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 288821}}} +{"time": "2026-09-28T18:29:17.348332", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 290940}}} +{"time": "2026-09-28T18:29:19.475936", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 293060}}} +{"time": "2026-09-28T18:29:21.610209", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617692, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359952, "free": 7596028, "allocated": 763924, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 295219}}} +{"time": "2026-09-28T18:29:23.756710", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 297349}}} +{"time": "2026-09-28T18:29:25.879605", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 299466}}} +{"time": "2026-09-28T18:29:27.997245", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 301589}}} +{"time": "2026-09-28T18:29:30.122301", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 303712}}} +{"time": "2026-09-28T18:29:32.247807", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 305847}}} +{"time": "2026-09-28T18:29:34.396246", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 307970}}} +{"time": "2026-09-28T18:29:36.521300", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 310104}}} +{"time": "2026-09-28T18:29:38.637176", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7610408, "min_free_heap": 7469732, "internal": {"total": 269215, "free": 25603, "allocated": 243612, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596076, "allocated": 763892, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 312231}}} +{"time": "2026-09-28T18:29:40.785050", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 314391}}} +{"time": "2026-09-28T18:29:42.917829", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 316510}}} +{"time": "2026-09-28T18:29:45.061974", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 318643}}} +{"time": "2026-09-28T18:29:47.197222", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7618480, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359968, "free": 7596816, "allocated": 763152, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 320797}}} +{"time": "2026-09-28T18:29:49.330970", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7617084, "min_free_heap": 7469732, "internal": {"total": 269199, "free": 25407, "allocated": 243792, "largest_block": 8692}, "psram": {"total": 8359840, "free": 7595696, "allocated": 764144, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 323010}}} +{"time": "2026-09-28T18:29:51.549962", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4044, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7545960, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24251, "allocated": 244740, "largest_block": 8692}, "psram": {"total": 8359504, "free": 7525712, "allocated": 833792, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 325140}}} +{"time": "2026-09-28T18:29:53.672335", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7543768, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24255, "allocated": 244736, "largest_block": 8692}, "psram": {"total": 8358944, "free": 7522012, "allocated": 836932, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 328348}}} +{"time": "2026-09-28T18:29:56.904442", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3996, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7541892, "min_free_heap": 7469732, "internal": {"total": 268975, "free": 24123, "allocated": 244852, "largest_block": 8692}, "psram": {"total": 8359360, "free": 7521772, "allocated": 837588, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 330570}}} +{"time": "2026-09-28T18:29:59.127680", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4044, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7545088, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24255, "allocated": 244736, "largest_block": 8692}, "psram": {"total": 8359440, "free": 7524836, "allocated": 834604, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 332742}}} +{"time": "2026-09-28T18:30:01.275389", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7615936, "min_free_heap": 7469732, "internal": {"total": 269167, "free": 25227, "allocated": 243940, "largest_block": 8692}, "psram": {"total": 8359744, "free": 7594724, "allocated": 765020, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 334963}}} +{"time": "2026-09-28T18:30:03.510415", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4060, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7544584, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24255, "allocated": 244736, "largest_block": 8692}, "psram": {"total": 8359408, "free": 7524344, "allocated": 835064, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 337104}}} +{"time": "2026-09-28T18:30:05.635908", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7611736, "min_free_heap": 7469732, "internal": {"total": 269167, "free": 25223, "allocated": 243944, "largest_block": 8692}, "psram": {"total": 8359648, "free": 7590520, "allocated": 769128, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 339269}}} +{"time": "2026-09-28T18:30:07.813281", "tasks": {"code": 0, "data": {"tasks": [{"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "ready"}, {"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 760, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4044, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7543816, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24251, "allocated": 244740, "largest_block": 8692}, "psram": {"total": 8359392, "free": 7523580, "allocated": 835812, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 341417}}} +{"time": "2026-09-28T18:30:09.965742", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616016, "min_free_heap": 7469732, "internal": {"total": 269199, "free": 25407, "allocated": 243792, "largest_block": 8692}, "psram": {"total": 8359760, "free": 7594628, "allocated": 765132, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 343582}}} +{"time": "2026-09-28T18:30:12.111980", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4044, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7544632, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24255, "allocated": 244736, "largest_block": 8692}, "psram": {"total": 8359408, "free": 7524392, "allocated": 835016, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 345704}}} +{"time": "2026-09-28T18:30:14.257671", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616012, "min_free_heap": 7469732, "internal": {"total": 269199, "free": 25403, "allocated": 243796, "largest_block": 8692}, "psram": {"total": 8359760, "free": 7594624, "allocated": 765136, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 347867}}} +{"time": "2026-09-28T18:30:16.409260", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4044, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7544604, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24251, "allocated": 244740, "largest_block": 8692}, "psram": {"total": 8359408, "free": 7524360, "allocated": 835048, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 350001}}} +{"time": "2026-09-28T18:30:18.553899", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7615508, "min_free_heap": 7469732, "internal": {"total": 269199, "free": 25407, "allocated": 243792, "largest_block": 8692}, "psram": {"total": 8359728, "free": 7594120, "allocated": 765608, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 352230}}} +{"time": "2026-09-28T18:30:20.791418", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 4056, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7544600, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24255, "allocated": 244736, "largest_block": 8692}, "psram": {"total": 8359408, "free": 7524360, "allocated": 835048, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 354390}}} +{"time": "2026-09-28T18:30:22.940956", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7544404, "min_free_heap": 7469732, "internal": {"total": 268991, "free": 24255, "allocated": 244736, "largest_block": 8692}, "psram": {"total": 8359392, "free": 7524168, "allocated": 835224, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 357420}}} +{"time": "2026-09-28T18:30:25.968573", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ssh_poll", "priority": 5, "stack_hwm": 3984, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 25}}, "memory": {"code": 0, "data": {"free_heap": 7544244, "min_free_heap": 7469732, "internal": {"total": 268975, "free": 24123, "allocated": 244852, "largest_block": 8692}, "psram": {"total": 8359344, "free": 7524136, "allocated": 835208, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 359616}}} +{"time": "2026-09-28T18:30:28.147610", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616884, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595220, "allocated": 764636, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 361736}}} +{"time": "2026-09-28T18:30:30.289721", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616892, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595228, "allocated": 764628, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 363876}}} +{"time": "2026-09-28T18:30:32.407254", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616884, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595220, "allocated": 764636, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 366003}}} +{"time": "2026-09-28T18:30:34.553667", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616884, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595220, "allocated": 764636, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 368150}}} +{"time": "2026-09-28T18:30:36.692568", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616892, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595240, "allocated": 764616, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 370290}}} +{"time": "2026-09-28T18:30:38.834701", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616896, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595232, "allocated": 764624, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 372439}}} +{"time": "2026-09-28T18:30:40.968177", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616892, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595228, "allocated": 764628, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 374575}}} +{"time": "2026-09-28T18:30:43.104731", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "ready"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616896, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595232, "allocated": 764624, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 376691}}} +{"time": "2026-09-28T18:30:45.226659", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616892, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595228, "allocated": 764628, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 378800}}} +{"time": "2026-09-28T18:30:47.342811", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616892, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595228, "allocated": 764628, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 380917}}} +{"time": "2026-09-28T18:30:49.466335", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616892, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595228, "allocated": 764628, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 383054}}} +{"time": "2026-09-28T18:30:51.607483", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616892, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595228, "allocated": 764628, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 385200}}} +{"time": "2026-09-28T18:30:53.730367", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7608800, "min_free_heap": 7469732, "internal": {"total": 269215, "free": 25603, "allocated": 243612, "largest_block": 8692}, "psram": {"total": 8357520, "free": 7587812, "allocated": 769708, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 387321}}} +{"time": "2026-09-28T18:30:55.878191", "tasks": {"code": 0, "data": {"tasks": [{"name": "httpd", "priority": 5, "stack_hwm": 4200, "core": 0, "state": "running"}, {"name": "IDLE1", "priority": 0, "stack_hwm": 728, "core": 1, "state": "ready"}, {"name": "IDLE0", "priority": 0, "stack_hwm": 864, "core": 0, "state": "ready"}, {"name": "ts_auto", "priority": 5, "stack_hwm": 1828, "core": 1, "state": "blocked"}, {"name": "sio_agx-info", "priority": 5, "stack_hwm": 1864, "core": 2147483647, "state": "blocked"}, {"name": "action_exec", "priority": 5, "stack_hwm": 12804, "core": 2147483647, "state": "blocked"}, {"name": "tiT", "priority": 18, "stack_hwm": 1144, "core": 2147483647, "state": "blocked"}, {"name": "power_policy", "priority": 5, "stack_hwm": 760, "core": 0, "state": "blocked"}, {"name": "websocket_task", "priority": 5, "stack_hwm": 992, "core": 2147483647, "state": "blocked"}, {"name": "w5500_tsk", "priority": 15, "stack_hwm": 2468, "core": 2147483647, "state": "blocked"}, {"name": "https_coord", "priority": 5, "stack_hwm": 5292, "core": 2147483647, "state": "blocked"}, {"name": "main", "priority": 1, "stack_hwm": 188, "core": 0, "state": "blocked"}, {"name": "power_monitor", "priority": 5, "stack_hwm": 1760, "core": 0, "state": "blocked"}, {"name": "httpd", "priority": 5, "stack_hwm": 15116, "core": 2147483647, "state": "blocked"}, {"name": "ipc1", "priority": 24, "stack_hwm": 408, "core": 1, "state": "suspended"}, {"name": "ts_console", "priority": 5, "stack_hwm": 1788, "core": 2147483647, "state": "blocked"}, {"name": "ipc0", "priority": 24, "stack_hwm": 128, "core": 0, "state": "suspended"}, {"name": "dhcp_evt", "priority": 5, "stack_hwm": 696, "core": 2147483647, "state": "blocked"}, {"name": "ts_event", "priority": 5, "stack_hwm": 668, "core": 2147483647, "state": "blocked"}, {"name": "esp_timer", "priority": 22, "stack_hwm": 2416, "core": 0, "state": "suspended"}, {"name": "led_render", "priority": 5, "stack_hwm": 1164, "core": 0, "state": "blocked"}, {"name": "sys_evt", "priority": 20, "stack_hwm": 1452, "core": 0, "state": "blocked"}, {"name": "ws_telemetry", "priority": 2, "stack_hwm": 1844, "core": 1, "state": "suspended"}, {"name": "Tmr Svc", "priority": 1, "stack_hwm": 544, "core": 2147483647, "state": "blocked"}], "count": 24}}, "memory": {"code": 0, "data": {"free_heap": 7616880, "min_free_heap": 7469732, "internal": {"total": 269231, "free": 25671, "allocated": 243560, "largest_block": 8692}, "psram": {"total": 8359856, "free": 7595216, "allocated": 764640, "largest_block": 7471092}}}, "info": {"code": 0, "data": {"app": {"name": "TianShanOS", "version": "0.5.2+3a19128d.09281801", "idf_version": "v5.5.2", "compile_time": "18:02:03", "compile_date": "Sep 28 2026"}, "chip": {"model": "ESP32-S3", "cores": 2, "revision": 2, "features": ["WiFi", "BLE"]}, "flash_size": 16777216, "uptime_ms": 389473}}} diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/serial-redacted.log b/docs/repair/ssh-poll-stack/device-diagnostic/serial-redacted.log new file mode 100644 index 0000000..3068593 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/serial-redacted.log @@ -0,0 +1,748 @@ +I (99) boot: 6 storage Unknown data 01 82 00620000ESP-ROM:esp32s3-20210327 +Build:Mar 27 2021 +rst:0x15 (USB_UART_CHIP_RESET),boot:0x8 (SPI_FAST_FLASH_BOOT) +Saved PC:0x4037c498 +SPIWP:0xee +mode:DIO, clock div:1 +load:0x3fce2820,len:0x1700 +load:0x403c8700,len:0xec0 +load:0x403cb700,len:0x31c0 +entry 0x403c894c +I (24) boot: ESP-IDF v5.5.2 2nd stage bootloader +I (24) boot: compile time Sep 28 2026 18:02:10 +I (25) boot: Multicore bootloader +I (25) boot: chip revision: v0.2 +I (27) boot: efuse block revision: v1.3 +I (31) qio_mode: Enabling default flash chip QIO +I (35) boot.esp32s3: Boot SPI Speed : 80MHz +I (39) boot.esp32s3: SPI Mode : QIO +I (43) boot.esp32s3: SPI Flash Size : 16MB +I (47) boot: Enabling RNG early entropy source... +I (51) boot: Partition Table: +I (54) boot: ## Label Usage Type ST Offset Length +I (60) boot: 0 nvs WiFi data 01 02 00009000 0000c000 +I (67) boot: 1 nvs_keys NVS keys 01 04 00015000 00001000 +I (73) boot: 2 otadata OTA data 01 00 00016000 00002000 +I (80) boot: 3 phy_init RF data 01 01 00018000 00001000 +I (86) boot: 4 ota_0 OTA app 00 10 00020000 00300000 +I (93) boot: 5 ota_1 OTA app 00 11 00320000 00300000 +I (99) boot: 6 storage Unknown data 01 82 00620000 00080000 +I (106) boot: 7 www Unknown data 01 82 006a0000 00300000 +I (112) boot: 8 fatfs Unknown data 01 81 009a0000 00010000 +I (119) boot: End of partition table +I (123) esp_image: segment 0: paddr=00020020 vaddr=3c1a0020 size=9714ch (618828) map +I (222) esp_image: segment 1: paddr=000b7174 vaddr=3fca2d00 size=04f1ch ( 20252) load +I (226) esp_image: segment 2: paddr=000bc098 vaddr=40374000 size=03f80h ( 16256) load +I (229) esp_image: segment 3: paddr=000c0020 vaddr=42000020 size=19f160h (1700192) map +I (485) esp_image: segment 4: paddr=0025f188 vaddr=40377f80 size=1ad00h (109824) load +I (507) esp_image: segment 5: paddr=00279e90 vaddr=50000000 size=00020h ( 32) load +I (519) boot: Loaded app from partition at offset 0x20000 +I (519) boot: Disabling RNG early entropy source... +I (529) octal_psram: vendor id : 0x0d (AP) +I (529) octal_psram: dev id : 0x02 (generation 3) +I (530) octal_psram: density : 0x03 (64 Mbit) +I (532) octal_psram: good-die : 0x01 (Pass) +I (536) octal_psram: Latency : 0x01 (Fixed) +I (540) octal_psram: VCC : 0x01 (3V) +I (544) octal_psram: SRF : 0x01 (Fast Refresh) +I (549) octal_psram: BurstType : 0x01 (Hybrid Wrap) +I (554) octal_psram: BurstLen : 0x01 (32 Byte) +I (559) octal_psram: Readlatency : 0x02 (10 cycles@Fixed) +I (564) octal_psram: DriveStrength: 0x00 (1/1) +I (568) MSPI Timing: Enter psram timing tuning +I (573) esp_psram: Found 8MB PSRAM device +I (576) esp_psram: Speed: 80MHz +I (579) cpu_start: Multicore app +I (1018) esp_psram: SPI SRAM memory test OK +I (1026) cpu_start: GPIO 44 and 43 are used as console UART I/O pins +I (1027) cpu_start: Pro cpu start user code +I (1027) cpu_start: cpu freq: 240000000 Hz +I (1029) app_init: Application information: +I (1033) app_init: Project name: TianShanOS +I (1037) app_init: App version: 0.5.2+3a19128d.09281801 +I (1043) app_init: Compile time: Sep 28 2026 18:02:03 +I (1048) app_init: ELF file SHA256: e6fa1eadb... +I (1052) app_init: ESP-IDF: v5.5.2 +I (1056) efuse_init: Min chip rev: v0.0 +I (1060) efuse_init: Max chip rev: v0.99 +I (1064) efuse_init: Chip rev: v0.2 +I (1068) heap_init: Initializing. RAM available for dynamic allocation: +I (1074) heap_init: At 3FCB6E78 len 00032898 (202 KiB): RAM +I (1080) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM +I (1085) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM +I (1090) heap_init: At 600FE000 len 00001FE8 (7 KiB): RTCRAM +I (1096) esp_psram: Adding pool of 8179K of PSRAM memory to heap allocator +I (1103) spi_flash: detected chip: generic +I (1106) spi_flash: flash io: qio +I (1110) sleep_gpio: Configure to isolate all GPIO pins in sleep state +I (1115) sleep_gpio: Enable automatic switching of GPIO sleep configuration +I (1122) main_task: Started on CPU0 +I (1125) esp_psram: Reserving pool of 16K of internal memory for DMA/internal allocations +I (1133) main_task: Calling app_main() + +╔════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ ████████╗██╗ █████╗ ███╗ ██╗███████╗██╗ ██╗ █████╗ ███╗ ██╗ ║ +║ ╚══██╔══╝██║██╔══██╗████╗ ██║██╔════╝██║ ██║██╔══██╗████╗ ██║ ║ +║ ██║ ██║███████║██╔██╗ ██║███████╗███████║███████║██╔██╗ ██║ ║ +║ ██║ ██║██╔══██║██║╚██╗██║╚════██║██╔══██║██╔══██║██║╚██╗██║ ║ +║ ██║ ██║██║ ██║██║ ╚████║███████║██║ ██║██║ ██║██║ ╚████║ ║ +║ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ║ +║ ║ +║ TianShanOS 0.5.2+3a19128d.09281801 ║ +║ ESP32 Rack Management Operating System ║ +║ ║ +╚════════════════════════════════════════════════════════════════════════╝ + +I (1308) main: System Information: +I (1311) main: - IDF Version: v5.5.2 +I (1314) main: - Free Heap: 8598788 bytes +I (1318) main: - Min Free Heap: 8598788 bytes +I (1322) main: - Chip: ESP32-S3, 2 cores, WiFi/BLE +I (1327) main: Initializing TianShanOS... +I (1331) ts_core: TianShanOS Core v0.5.2+3a19128d.09281801 initializing... +I (1338) ts_mempool: Initializing memory pools in PSRAM... +I (1343) ts_mempool: Pool 0: 16 x 256 bytes = 4 KB (PSRAM) +I (1348) ts_mempool: Pool 1: 12 x 1024 bytes = 12 KB (PSRAM) +I (1353) ts_mempool: Pool 2: 8 x 4096 bytes = 32 KB (PSRAM) +I (1359) ts_mempool: Pool 3: 4 x 8192 bytes = 32 KB (PSRAM) +I (1364) ts_mempool: Memory pools initialized successfully +I (1369) ts_core: Memory pools initialized in PSRAM +I (1374) ts_core: cJSON PSRAM hooks installed +I (1378) ts_core: Initializing configuration system... +I (1383) ts_config: Initializing TianShanOS Configuration System... +I (1389) ts_config: Configuration system initialized successfully +I (1394) ts_config_nvs: Initializing NVS configuration backend... +I (1461) ts_config_nvs: NVS backend initialized (namespace: ts_config) +I (1461) ts_config: Registered backend 1 with priority 80 +I (1461) ts_config_file: Initializing file configuration backend... +I (1467) ts_config_file: File backend initialized (waiting for storage) +I (1474) ts_config: Registered backend 2 with priority 60 +I (1479) ts_core: Initializing logging system... +I (1483) ts_log: Initializing TianShanOS Logging System... +I (1493) ts_log: Log buffer allocated in PSRAM (500 entries, 148000 bytes) +I (1497) ts_log: ESP_LOG capture hook installed +I (1502) ts_log: Logging system initialized (level=3, outputs=0x05, buffer=500) +I (1510) ts_core: Initializing event system... +I (1514) ts_event: Initializing TianShanOS Event System... +I (1519) ts_event: Event loop task started +I (1523) ts_event: Event system initialized (queue_size=32) +I (1529) ts_config_file: Registered storage event handler for auto-load +I (1535) ts_config_schemas: Initializing configuration module system... +I (1541) ts_config_module: Initializing configuration module system... +I (1548) ts_config_meta: Initializing configuration meta management... +I (1556) ts_config_meta: Meta initialized: global_seq=6, sync_seq=6, pending=0x00 +I (1561) ts_config_module: Configuration module system initialized +I (1567) ts_config_schemas: Registering configuration modules... +I (1573) ts_config_module: Registered module NET (nvs=ts_net, schema_v=1) +I (1579) ts_config_module: Registered module DHCP (nvs=ts_dhcp, schema_v=1) +I (1586) ts_config_module: Registered module WIFI (nvs=ts_wifi, schema_v=1) +I (1593) ts_config_module: Registered module NAT (nvs=ts_nat, schema_v=1) +I (1599) ts_config_module: Registered module LED (nvs=ts_led, schema_v=1) +I (1606) ts_config_module: Registered module FAN (nvs=ts_fan, schema_v=1) +I (1612) ts_config_module: Registered module DEVICE (nvs=ts_device, schema_v=1) +I (1619) ts_config_module: Registered module SYSTEM (nvs=ts_system, schema_v=1) +I (1626) ts_config_module: Registered module TEMP (nvs=ts_temp, schema_v=0) +I (1633) ts_config_module: Registered module RULES (nvs=ts_rules, schema_v=0) +I (1640) ts_config_module: Registered module ACTIONS (nvs=ts_actions, schema_v=0) +I (1647) ts_config_module: Registered module SOURCES (nvs=ts_sources, schema_v=0) +I (1654) ts_config_schemas: All configuration modules registered +I (1660) ts_config_schemas: Loading module configurations... +I (1665) ts_config_module: Loading module NET... +I (1670) ts_config_module: Using schema defaults for module NET +I (1676) ts_config_module: Loading module DHCP... +I (1680) ts_config_module: Using schema defaults for module DHCP +I (1686) ts_config_module: Loading module WIFI... +I (1690) ts_config_module: Using schema defaults for module WIFI +I (1696) ts_config_module: Loading module NAT... +I (1700) ts_config_module: Using schema defaults for module NAT +I (1706) ts_config_module: Loading module LED... +I (1710) ts_config_module: Using schema defaults for module LED +I (1716) ts_config_module: Loading module FAN... +I (1722) ts_config_module: Loading module DEVICE... +I (1724) ts_config_module: Using schema defaults for module DEVICE +I (1731) ts_config_module: Loading module SYSTEM... +I (1735) ts_config_module: Using schema defaults for module SYSTEM +I (1741) ts_config_module: Loading module TEMP... +I (1745) ts_config_module: Loading module RULES... +I (1750) ts_config_module: Using schema defaults for module RULES +I (1756) ts_config_module: Loading module ACTIONS... +I (1760) ts_config_module: Using schema defaults for module ACTIONS +I (1766) ts_config_module: Loading module SOURCES... +I (1771) ts_config_module: Using schema defaults for module SOURCES +I (1777) ts_config_meta: === Configuration Meta === +I (1781) ts_config_meta: global_seq: 6 +I (1785) ts_config_meta: sync_seq: 6 +I (1789) ts_config_meta: pending_sync: 0x00 +I (1793) ts_config_meta: Schema versions: +I (1797) ts_config_meta: ========================== +I (1802) ts_config_schemas: Configuration module system initialized +I (1808) ts_core: Initializing service management... +I (1812) ts_service: Initializing TianShanOS Service Management... +I (1818) ts_service: Service management initialized +I (1823) ts_core: TianShanOS Core initialized successfully +I (1828) main: Registering core services... +I (1832) ts_services: Registering services... +I (1836) ts_service: Registered service: hal (phase=HAL) +I (1841) ts_services: - hal service registered +I (1845) ts_service: Registered service: storage (phase=DRIVER) +I (1851) ts_services: - storage service registered +I (1856) ts_service: Registered service: led (phase=DRIVER) +I (1861) ts_services: - led service registered +I (1865) ts_service: Registered service: drivers (phase=DRIVER) +I (1871) ts_services: - drivers service registered +I (1876) ts_service: Registered service: power (phase=DRIVER) +I (1881) ts_services: - power service registered +I (1886) ts_service: Registered service: network (phase=NETWORK) +I (1891) ts_services: - network service registered +I (1896) ts_service: Registered service: security (phase=SECURITY) +I (1902) ts_services: - security service registered +I (1907) ts_service: Registered service: api (phase=SERVICE) +I (1912) ts_services: - api service registered +I (1916) ts_service: Registered service: https (phase=SERVICE) +I (1922) ts_services: - https service registered +I (1926) ts_service: Registered service: webui (phase=UI) +I (1932) ts_services: - webui service registered +I (1936) ts_service: Registered service: console (phase=UI) +I (1941) ts_services: - console service registered +I (1946) ts_service: Registered service: automation (phase=SERVICE) +I (1952) ts_services: - automation service registered +I (1957) ts_services: All core services registered +I (1962) main: Starting TianShanOS services... +I (1966) ts_core: Starting TianShanOS... +I (1969) ts_service: Starting all services... +I (1973) ts_service: === Phase 0: PLATFORM === +I (1978) ts_service: === Phase 1: CORE === +I (1981) ts_service: === Phase 2: HAL === +I (1985) ts_service: Starting 1 services in phase HAL +I (1990) ts_service: Starting service: hal +I (1994) ts_services: Initializing HAL service... +I (903) ts_hal: Initializing HAL module v1.0.0 +I (908) ts_pin: Initializing pin manager +I (912) ts_pin: Pin manager initialized +I (917) ts_hal: No pin config in NVS, loading defaults +I (923) ts_pin: Loading default pin mappings for ESP32S3 +I (929) ts_gpio: Initializing GPIO subsystem +I (934) ts_hal: Early hardware init: setting reset pins to safe state +I (941) ts_hal: W5500_RST (GPIO39) = HIGH (normal) +I (946) ts_hal: AGX_RESET (GPIO1) = LOW (normal) +I (952) ts_hal: AGX_POWER (GPIO3) = LOW (allow boot) +I (957) ts_pwm: Initializing PWM subsystem +I (962) ts_i2c: Initializing I2C subsystem +I (967) ts_spi: Initializing SPI subsystem +I (971) ts_uart: Initializing UART subsystem +I (976) ts_adc: Initializing ADC subsystem +I (981) ts_hal: HAL initialization complete, platform: ESP32S3 +I (2083) ts_service: Service 'hal' started in 90 ms +I (2088) ts_service: === Phase 3: DRIVER === +I (2092) ts_service: Starting 4 services in phase DRIVER +I (2097) ts_service: Starting service: power +I (2101) ts_services: Initializing power service... +I (1010) ts_power_policy: Initializing power policy v1.0.0 +I (1016) ts_power_policy: NVS: enabled_on_boot = true +I (1022) ts_power_policy: Registered SD card mount event handler +I (1029) ts_power_policy: Power policy initialized (Low: 12.6V, Recovery: 18.0V, Delay: 60s) [source: defaults] +I (2135) ts_power_monitor: Initializing power monitor v1.0.0 +I (2140) ts_power_monitor: Initializing voltage monitor on GPIO 18 (ADC2_CH7) +I (2148) ts_power_monitor: ADC calibration initialized +I (2152) ts_power_monitor: Voltage monitor initialized (divider ratio: 11.4:1) +I (2159) ts_power_monitor: Initializing power chip communication on GPIO 47 (UART1) +I (2167) uart: queue free spaces: 10 +I (2170) ts_power_monitor: Power chip communication initialized (baud: 9600) +I (2177) ts_power_monitor: Power monitor initialized successfully +I (2182) ts_services: Starting power service... +I (2186) ts_power_monitor: Starting power monitor +I (2191) ts_power_monitor: Power monitor task started +I (2196) ts_power_monitor: Power monitor started +I (1104) ts_power_policy: Starting power policy monitoring +I (1111) ts_power_policy: Power policy task started +I (1116) ts_power_policy: Power policy monitoring started +I (2218) ts_services: Power protection started (auto-start enabled) +I (2224) ts_service: Service 'power' started in 123 ms +I (2229) ts_service: Starting service: drivers +I (2233) ts_services: Initializing drivers service... +I (1142) ts_drivers: Initializing device drivers +I (1148) ts_temp_source: Loaded preferred source from NVS: variable +I (1156) ts_temp_source: Loaded 1 weighted bound vars from NVS +I (1161) ts_temp_source: Temperature source manager initialized (v1.0.0), preferred: variable +I (1170) ts_drivers: Temperature source manager initialized +I (1176) ts_fan: Subscribed to temperature events +I (1182) ts_fan: Fan driver initialized +I (1187) ts_fan: Fan 0 configured: PWM=GPIO41, TACH=-1, curve=0 points +I (1193) ts_drivers: Fan 0 configured on GPIO 41 +I (1199) ts_power: Power monitor initialized +I (1203) ts_device: Device control initialized +I (1209) ts_device: AGX configured: FORCE_SHUTDOWN=GPIO3(LOW=run), RESET=GPIO1(LOW=normal) +I (1218) ts_drivers: AGX configured (pwr=3, rst=1, rcv=40) +I (1224) ts_device: LPMU configured (power=46[pulse HIGH], reset=2[pulse HIGH]) +I (1232) ts_drivers: LPMU configured (pwr=46, rst=2) +I (1237) ts_usb_mux: USB MUX driver initialized +I (1243) ts_usb_mux: Loaded USB MUX target from NVS: 0 +I (1249) ts_usb_mux: USB MUX -> ESP32 (sel0=0, sel1=0) +I (1254) ts_usb_mux: USB MUX configured (sel0=8, sel1=48), restored target: 0 +I (1262) ts_drivers: USB MUX configured (sel0=8, sel1=48) +I (2364) ts_compute_monitor: Initializing compute monitor v1.0.0 +I (1274) ts_temp_source: Provider registered: agx_cpu (agx) +I (2376) ts_compute_monitor: Initialized, server: 10.10.99.98:58090 +I (1286) ts_drivers: Compute monitor initialized (use 'compute --start' to connect) +I (1294) ts_drivers: Device drivers initialized +I (1300) ts_fan: Restored fan 0: mode=2, duty=25%, curve=9 pts +I (2402) ts_service: Service 'drivers' started in 169 ms +I (2407) ts_service: Starting service: led +I (2411) ts_services: Initializing LED service... +I (1320) led_cc: Loaded config from NVS +I (1325) led_cc: Color correction initialized (enabled=true) +I (1330) ts_led: LED subsystem initialized +I (2430) ts_services: Starting LED service... +I (1339) led_preset: Touch LED: using hardcoded GPIO 45 +I (1345) led_driver: Using RMT backend for 1 LEDs on GPIO 45 +I (1353) led_driver: LED driver initialized: 'led_touch' - GPIO 45, 1 LEDs +I (1359) ts_led: Created LED device 'led_touch' with 1 LEDs +I (1365) led_preset: Touch LED initialized: 1 LEDs on GPIO 45 +I (1372) led_preset: Board LED: using hardcoded GPIO 42 +I (1378) led_driver: Using RMT backend for 28 LEDs on GPIO 42 +I (1386) led_driver: LED driver initialized: 'led_board' - GPIO 42, 28 LEDs +I (1392) ts_led: Created LED device 'led_board' with 28 LEDs +I (1398) led_preset: Board LED initialized: 28 LEDs on GPIO 42 +I (1404) led_preset: Matrix LED: pin_manager returned GPIO 9 +I (1411) led_driver: Using SPI backend for 1024 LEDs on GPIO 9 +I (1449) led_driver: LED driver initialized: 'led_matrix' - GPIO 9, 1024 LEDs +I (1450) ts_led: Created LED device 'led_matrix' with 1024 LEDs +I (1453) led_preset: Matrix LED initialized: 32x32 on GPIO 9 +I (1459) led_preset: Loading LED boot configurations... +I (1473) led_preset: Restored touch: animation=solid, speed=50, brightness=80, color=#FFCCCC +I (1476) led_preset: Restored board: animation=solid, speed=50, brightness=60, color=#FFFFFF +I (1485) led_preset: Restored matrix: animation=solid, speed=50, brightness=52, color=#FFFFFF +I (2588) ts_service: Service 'led' started in 178 ms +I (2593) ts_service: Starting service: storage +I (2597) ts_services: Initializing storage service... +I (1511) ts_storage: Storage subsystem initialized +I (2607) ts_services: Starting storage service... +I (1516) storage_spiffs: Mounting SPIFFS at /spiffs (partition: storage) +I (1569) storage_spiffs: SPIFFS mounted: 474641 total, 0 used, 474641 free +I (2665) ts_services: SPIFFS mounted at /spiffs +I (1570) storage_sd: Good: /sdcard not in FATFS s_fat_ctxs[] (info returned ESP_ERR_INVALID_STATE) +I (1580) storage_sd: Mounting SD card at /sdcard (mode: 2, freq: 20000 kHz) +I (1591) storage_sd: SD GPIO: CMD=15, CLK=16, D0=4, D1=5, D2=6, D3=7 +I (2741) ts_config: Saving configuration... +I (2749) ts_config: Saved configuration to backend 1 +I (2750) ts_config: Configuration saved +I (1656) storage_sd: SD card mounted: +I (1656) storage_sd: Name: MSSD0 +I (1659) storage_sd: Type: SDHC/SDXC +I (1671) storage_sd: Speed: default +I (1671) storage_sd: Size: 29850MB +I (1672) ts_power_policy: SD card mounted, syncing power policy config... +I (2776) ts_services: SD card mounted at /sdcard +I (2780) ts_config_pack: Loaded plain config: /sdcard/config/power_policy.json (180 bytes) +I (1693) ts_power_policy: SD: low_voltage_threshold = 12.60V +I (1699) ts_power_policy: SD: recovery_voltage_threshold = 18.00V +I (1706) ts_power_policy: SD: shutdown_delay_sec = 60 +I (1711) ts_power_policy: SD: recovery_hold_sec = 5 +I (2811) ts_recovery: Checking for SD card recovery... +I (1717) ts_power_policy: SD: fan_stop_delay_sec = 60 +I (1727) ts_power_policy: SD: enabled_on_boot = true +I (1733) ts_power_policy: Loaded power policy config from SD card +I (1740) ts_power_policy: Config loaded from SD card, syncing to NVS +I (2843) ts_config: Saving configuration... +I (2854) ts_config: Saved configuration to backend 1 +I (2854) ts_config: Configuration saved +I (2855) ts_config_file: SD card mounted, loading configuration files... +I (2860) ts_recovery: No recovery directory found +I (2862) ts_config_file: Loading configuration files from: /sdcard/config +I (2875) ts_service: Service 'storage' started in 276 ms +I (2876) ts_config_file: Loading: power_policy.json +I (2881) ts_config_json: Loading JSON config: /sdcard/config/power_policy.json +I (2890) ts_service: === Phase 4: NETWORK === +I (2893) ts_config_json: JSON config loaded successfully +I (2898) ts_config_file: Loading: led_color_correction.json +I (2902) ts_service: Starting 1 services in phase NETWORK +I (2903) ts_config_json: Loading JSON config: /sdcard/config/led_color_correction.json +I (2917) ts_service: Starting service: network +I (2920) ts_config_json: JSON config loaded successfully +I (2925) ts_config_file: Loading: fan_curve_config_0.json +I (2930) ts_config_json: Loading JSON config: /sdcard/config/fan_curve_config_0.json +I (2943) ts_config_json: JSON config loaded successfully +I (2944) ts_config_file: Loading: fan.json +I (2946) ts_config_json: Loading JSON config: /sdcard/config/fan.json +I (2948) ts_services: Initializing network service... +I (2956) ts_config_json: JSON config loaded successfully +I (2964) ts_config_file: Loading: ui_widgets.json +I (2967) ts_config_json: Loading JSON config: /sdcard/config/ui_widgets.json +I (1878) ts_net_mgr: Initializing network manager... +I (2978) ts_config_json: JSON config loaded successfully +I (2985) ts_config_file: Loaded 5 JSON configs, skipped 1 +I (2989) ts_config_file: Configuration files loaded successfully +I (1884) ts_net_mgr: No saved config in NVS, using defaults +I (1907) ts_net_mgr: Ethernet pins: MOSI=11 MISO=13 SCLK=12 CS=10 INT=38 RST=39 +I (1914) ts_eth: Initializing Ethernet (W5500) +I (1919) ts_eth: Created Ethernet netif with DHCP server mode +I (1925) ts_eth: Device IP: 10.10.99.97 +I (1936) ts_eth: Gateway: 10.10.99.100 +I (1936) ts_eth: Netmask: 255.255.255.0 +I (1961) ts_eth: Ethernet MAC: 20:6e:f1:a1:d5:8f +I (3058) esp_eth.netif.netif_glue: 20:6e:f1:a1:d5:8f +I (3058) esp_eth.netif.netif_glue: ethernet attached to netif +I (1967) ts_eth: DHCP lease range configured: 10.10.99.100 - 10.10.99.103 +I (1976) ts_eth: DHCP DNS server configured: 8.8.8.8 +I (1979) ts_eth: Ethernet initialized +I (1984) ts_net_mgr: Ethernet initialized, MAC: 20:6e:f1:a1:d5:8f +I (1990) ts_net_mgr: Network manager initialized +I (1996) ts_dhcps: Initializing DHCP server... +I (2001) ts_dhcps: DHCP event task started +I (2006) ts_dhcps: No saved config, using defaults +I (2017) ts_dhcps: DHCP server initialized (event queue enabled) +I (3113) ts_services: Starting network service... +I (2022) ts_net_mgr: Starting Ethernet... +I (2027) ts_net_mgr: Using static IP: 10.10.99.97 +I (2042) ts_net_mgr: Ethernet started +I (2043) ts_eth: Ethernet started +I (2043) ts_net_mgr: Ethernet started, waiting for link... +I (3143) ts_time_sync: Timezone set to: CST-8 +I (3152) ts_time_sync: Time sync module initialized +I (3152) ts_time_sync: NTP server 1: 10.10.99.99 +I (3155) ts_time_sync: NTP server 2: 10.10.99.98 +I (3160) ts_time_sync: NTP server 3: 10.10.99.100 +I (3165) ts_time_sync: Starting NTP sync with primary: 10.10.99.99, secondary: 10.10.99.98 +I (3173) ts_time_sync: NTP synchronization started (retry enabled for unreliable servers) +I (2085) ts_device: LPMU startup detection: waiting for network... +I (2099) ts_device: LPMU startup detection task started +I (3195) ts_service: Service 'network' started in 247 ms +I (3198) ts_service: === Phase 5: SECURITY === +I (3202) ts_service: Starting 1 services in phase SECURITY +I (3208) ts_service: Starting service: security +I (3212) ts_services: Initializing security service... +I (3219) ts_ssh_hosts_cfg: NVS has 0 hosts, will load from SD card in background +I (3225) ts_ssh_hosts_cfg: SSH hosts config initialized (SD card loading deferred) +I (3277) ts_ssh_cmd_cfg: NVS has 6 commands, will load from SD card in background +I (3277) ts_ssh_cmd_cfg: SSH commands config initialized (SD card loading deferred) +I (2186) ts_security: Security subsystem initialized +I (3286) ts_keystore: Initializing secure keystore... +I (3291) ts_keystore: Keystore initialized +I (3295) ts_known_hosts: Known hosts module initialized +I (3501) ts_cert: Initialized, status: activated, has_key=1, has_cert=1 +I (3502) pki_client: PKI client initialized, server=10.10.99.100:57443, device_id=TIANSHAN-DEVICE-001 +I (3506) ts_services: Certificate status: activated, time validity: valid +I (3516) ts_config_pack: Config pack system initialized, device fingerprint: 50c2e523d3483956... +I (3521) ts_config_file: Loading encrypted configuration files from: /sdcard/config +I (3532) ts_service: Service 'security' started in 320 ms +I (3533) ts_service: === Phase 6: SERVICE === +I (3537) ts_service: Starting 3 services in phase SERVICE +I (3542) ts_service: Starting service: automation +I (3555) ts_services: Initializing automation service... +I (3556) ts_automation: Initializing automation engine v1.0.0 +I (3562) ts_source_mgr: Initializing source manager (max 16) +I (3563) ts_source_mgr: Source manager initialized (loading deferred) +I (3569) ts_rule_engine: Initializing rule engine (max 32 rules) +I (3575) ts_rule_engine: Rule engine initialized (loading deferred) +I (3580) ts_action_mgr: Initializing action manager +I (3595) ts_action_mgr: Action executor task started (DRAM stack) +I (3596) ts_action_mgr: Action manager initialized (loading deferred) +I (3597) ts_automation: Loading config from: /sdcard/config/automation.json +I (3606) ts_ssh_cmd_cfg: Pre-creating variables for all SSH commands +I (2558) ts_power_policy: Registered 8 automation variables for power policy +I (3654) ts_automation: Automation engine initialized +I (3655) ts_services: Starting automation service... +I (3660) ts_source_mgr: Starting all data sources +I (3977) ts_config: Saving configuration... +I (3991) ts_config: Saved configuration to backend 1 +I (3991) ts_config: Configuration saved +I (4044) ts_net_mgr: Ethernet link up +I (4044) ts_net_mgr: Ethernet IP (static/DHCPS): 10.10.99.97 +I (4045) ts_net: mDNS disabled by config +I (4048) ts_eth: Ethernet link up +I (4052) ts_eth: Ethernet MAC: 20:6e:f1:a1:d5:8f +I (5172) ts_source_mgr: Network ready, starting external sources +I (5172) ts_automation: Automation task started +I (5172) ts_services: Automation engine running: 0 sources, 0 rules, 36 variables +I (5178) ts_service: Service 'automation' started in 1622 ms +I (5183) ts_service: Starting service: https +I (5188) ts_https: HTTPS server deinitialized +I (5192) ts_https: HTTPS server initialized (port=443, mTLS=required) +I (5198) ts_https_api: Registering permission test endpoints... +I (5203) ts_https: Registered endpoint: GET / (min_role=anonymous) +I (5209) ts_service: Service 'https' started in 21 ms +I (5209) ts_https: Registered endpoint: GET /api/auth/whoami (min_role=viewer) +I (5221) ts_https: Registered endpoint: GET /api/test/viewer (min_role=viewer) +I (5228) ts_https: Registered endpoint: GET /api/test/operator (min_role=operator) +I (5235) ts_https: Registered endpoint: GET /api/test/admin (min_role=admin) +I (5242) ts_https: Registered endpoint: POST /api/test/admin-action (min_role=admin) +I (5250) ts_https: mTLS enabled: client certificates required +I (4153) ts_dhcps: Starting DHCP server on ethernet... +I (5255) esp_https_server: Starting server +I (4165) ts_dhcps: Ethernet IP preserved: 10.10.99.97 +I (5266) esp_https_server: Server listening on port 443 +I (4175) ts_dhcps: Applied config for ethernet: +I (5276) ts_https: HTTPS server started on port 443 with 6 endpoints +I (4187) ts_dhcps: Gateway: 10.10.99.100 +I (4197) ts_dhcps: Pool: 10.10.99.100 - 10.10.99.103 +I (4204) ts_dhcps: Lease: 1440 min +I (4211) ts_dhcps: DHCP server started on ethernet +I (4212) ts_eth: DHCP server started via ts_dhcp_server +I (5313) ts_ssh_cmd_cfg: Deferred: checking SD card for config (NVS has 6 commands)... +I (5254) ts_service: Starting service: api +I (5323) ts_ssh_cmd_cfg: SD card has config, clearing NVS and importing... +I (5332) ts_services: Initializing API service... +I (5347) ts_ssh_cmd_cfg: Cleared all SSH commands +I (4253) ts_api: API endpoints allocated in PSRAM (25344 bytes) +I (5353) ts_ssh_cmd_cfg: Cleared all SSH commands +I (4263) ts_api: API layer initialized (max 288 endpoints) +I (5366) ts_services: Starting API service... +I (5370) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3_6-35B-A3B.json (1095 bytes) +I (4305) ts_api: Registering all API modules... +I (4307) api_config: Config API registered (11 endpoints) +I (4308) api_device: Registering device APIs +I (4311) api_led: Registering LED APIs +I (5414) ts_ssh_cmd_cfg: Added SSH command: Qwen3.6-35B-A3B (Qwen3_6-35B-A3B) +I (4319) api_network: Registering network APIs +I (5428) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3-Embedding-0_6B.json (885 bytes) +I (4335) api_fan: Registering fan APIs +I (4351) api_power: Registering power APIs +I (4356) api_temp: Registering temperature APIs +I (4357) api_service: Registering service APIs... +I (4360) api_service: Service APIs registered (5 endpoints) +I (4365) api_storage: Registering storage APIs... +I (4372) api_storage: Storage APIs registered (9 endpoints) +I (4377) api_gpio: Registering GPIO APIs... +I (4401) api_gpio: I (5498) ts_ssh_cmd_cfg: Added SSH command: Qwen3-Embedding-0.6B (Qwen3-Embedding-0_6B) +GPIO APIs registered (4 endpoints) +I (4413) api_monitor: Registering monitor APIs... +I (5518) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3-Reranker-0_6B.json (1064 bytes) +I (4442) api_monitor: Monitor APIs registered: 6 endpoints +I (4462) api_ssh: Registering SSH APIs... +I (4464) api_sftp: Registering SFTP APIs... +I (5562) ts_api_ota: Registering OTA APIs +I (5565) ts_ota: Running from partition: ota_0 (addr=0x20000, size=3072 KB) +I (5569) ts_ota: OTA subsystem initialized +I (5602) ts_api_ota: Loaded OTA server URL: (not set) +I (5605) ts_ssh_cmd_cfg: Added SSH command: Qwen3-Reranker-0.6B (Qwen3-Reranker-0_6B) +I (5616) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/drop.json (395 bytes) +I (5672) ts_api_ota: Registered 21 OTA API endpoints +I (5686) ts_ssh_cmd_cfg: Added SSH command: drop (drop) +I (4593) api_log: Log API endpoints registered +I (4596) api_automation: Registering automation APIsI (5699) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/Qwen3_8_27B_Quark_INT4_MTP3.json (672 bytes) + +I (4627) api_automation: Automation APIs registered +I (4629) api_cert: Certificate APIs registered +I (5728) ts_ssh_hosts_cfg: Deferred: checking SD card for config (NVS has 0 hosts)... +I (5734) ts_ssh_hosts_cfg: SD card has config, clearing NVS and importing... +I (5820) ts_ssh_cmd_cfg: Added SSH command: Qwen3.8-27B-Quark-INT4-MTP3 (Qwen3_8_27B_Quark_INT4_MTP3) +I (5833) ts_ssh_hosts_cfg: Cleared all SSH host configs +I (5846) ts_ssh_hosts_cfg: Cleared all SSH host configs +I (5848) ts_ssh_cmd_cfg: Async sync to SD card... +I (4754) ts_auth: Auth module initialized (version 3) +I (5851) ts_config_pack: Loading encrypted config: /sdcard/config/ssh_hosts/rm01@10.10.99.98.tscfg +I (5860) ts_ssh_cmd_cfg: Async sync to SD card... +I (5860) ts_config_pack: Loaded plain config: /sdcard/config/ssh_commands/quark_stop_repair.json (472 bytes) +I (4784) api_auth: Auth APIs registered +I (4786) api_ui: Registering UI APIs +I (4799) api_config_pack: Config Pack API registered (8 endpoints) +I (4802) ts_api: All API modules registered (263 endpoints) +I (5900) ts_service: Service 'api' started in 567 ms +I (5922) ts_service: === Phase 7: UI === +I (5929) ts_service: Starting 2 services in phase UI +I (5937) ts_service: Starting service: console +I (5940) ts_services: Initializing console service... +I (5990) ts_ssh_cmd_cfg: Exported 5 SSH commands to /sdcard/config/ssh_commands/ +I (6116) ts_ssh_cmd_cfg: Added SSH command: Quark进程与内存检查 (quark_stop_repair) +I (6122) ts_ssh_cmd_cfg: Loaded 6 SSH commands from directory: /sdcard/config/ssh_commands (skipped 0) +I (6124) ts_source_mgr: Deferred source loading started +I (4852) ts_i18n: I18n initialized, language: English +I (5069) ts_console: Console initialized +I (5113) cmd_register: Registering all console commands... +I (5137) cmd_system: System commands registered +I (5166) cmd_service: Service commands registered +I (6289) ts_ssh_cmd_cfg: Exported 6 SSH commands to /sdcard/config/ssh_commands/ +I (6328) ts_ssh_cmd_cfg: Loaded 6 commands from SD card (.tscfg > .json) +I (6336) ts_ssh_hosts_cfg: Async sync to SD card... +I (6344) ts_ssh_hosts_cfg: Exported 0 SSH hosts to /sdcard/config/ssh_hosts/ +I (6347) ts_ssh_hosts_cfg: Async sync to SD card... +I (6356) ts_ssh_hosts_cfg: Exported 0 SSH hosts to /sdcard/config/ssh_hosts/ +I (5268) cmd_config: Config commands registered (with pack support) +I (5288) cmd_fan: Fan commands registered (API mode) +I (5292) cmd_storage: Storage commands registered +I (5296) cmd_net: Network commands registered +I (5299) cmd_device: Device commands registered +I (5304) cmd_led: LED commands registered +I (5308) cmd_wifi: WiFi commands registered +I (5309) ts_nat: Initializing NAT module +I (5330) ts_nat: No saved NAT config, using defaults +I (5331) ts_nat: NAT module initialized (auto_start=yes) +I (6408) ts_config_pack: Loaded plain config: /sdcard/config/sources/agx-info.json (192 bytes) +I (6442) ts_source_mgr: Loaded 1 sources from directory: /sdcard/config/sources +I (6444) ts_source_mgr: Loaded 1 sources from SD card directory +I (5335) cmd_key: Registered command: key +I (5418) cmd_ssh: Registered command: ssh +I (5422) cmd_sftp: Registered command: sftp +I (5426) cmd_hosts: Registered command: hosts +I (5431) cmd_fs: File system commands registered: 9 succeeded, 0 failed +I (6531) cmd_gpio: GPIO command registered (high priority) +I (6533) ts_source_mgr: Exported 1 sources to directory: /sdcard/config/sources +I (6555) ts_source_mgr: Saved 1 sources to NVS and SD card +I (6557) ts_source_mgr: Deferred source loading complete: 1 sources +I (6558) ts_source_mgr: Starting loaded data sources... +I (6570) ts_source_mgr: Starting all data sources +I (6571) ts_source_mgr: Network ready, starting external sources +I (6573) ts_source_mgr: Starting Socket.IO source: agx-info +I (6535) cmd_ota: OTA command registered +I (6619) websocket_client: Started +I (6628) ts_source_mgr: SIO [agx-info] connection started +I (6575) ts_rule_engine: Deferred rule loading started +I (5561) cmd_pki: Registered 'pki' command +I (6659) cmd_auto: Command 'auto' registered +I (5565) cmd_register: Command registration complete: 24 succeeded, 0 failed +I (6664) ts_services: Starting console service... +I (5592) ts_console: Console task started +TianShanOS> I (6698) ts_config_pack: Successfully loaded encrypted config: /sdcard/config/ssh_hosts/rm01@10.10.99.98.tscfg +I (6673) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3.6-35B-A3B.json (281 bytes) +W (6711) ts_ssh_hosts_cfg: SD card import failed: ESP_ERR_NOT_FOUND +I (5604) ts_console: Console started +I (6720) ts_service: Service 'console' started in 779 ms +I (6722) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3-Embedding-0.6B.json (301 bytes) +I (6747) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3-Reranker-0.6B.json (297 bytes) +I (6751) ts_service: Starting service: webui +I (6757) ts_services: Initializing WebUI service... +I (6758) ts_config_pack: Loaded plain config: /sdcard/config/rules/drop.json (245 bytes) +I (6791) ts_config_pack: Loaded plain config: /sdcard/config/rules/Qwen3_8_27B_Quark_INT4_MTP3.json (324 bytes) +I (6806) ts_rule_engine: Deferred rule loading complete: 5 rules +I (7097) ts_action_mgr: Deferred action template loading started +I (7115) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3.6-35B-A3B.json (190 bytes) +I (7130) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3-Embedding-0.6B.json (205 bytes) +I (7149) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3-Reranker-0.6B.json (202 bytes) +I (7162) ts_config_pack: Loaded plain config: /sdcard/config/actions/drop.json (157 bytes) +I (7181) ts_config_pack: Loaded plain config: /sdcard/config/actions/Qwen3_8_27B_Quark_INT4_MTP3.json (272 bytes) +I (7186) ts_action_mgr: Loaded 5 templates from directory: /sdcard/config/actions +I (7198) ts_action_mgr: Loaded 5 action templates from SD card directory +I (7336) ts_services: Mounted www partition at /www (2541877/2884241 bytes) +I (6242) ts_webui: Initializing WebUI +I (6244) ts_http: HTTP server initialized +I (6246) ts_webui: WebUI initialized +I (7358) ts_action_mgr: Exported 5 templates to directory: /sdcard/config/actions +I (7363) ts_services: Starting WebUI service... +I (7365) ts_action_mgr: Saved 5 action templates to NVS and SD card +I (7377) ts_action_mgr: Deferred action template loading complete: 5 templates +I (6272) ts_http: HTTP server started on port 80 +I (6294) webui_api: Initializing API routes +I (6308) webui_api: API routes registered +I (6309) webui_ws: Initializing WebSocket with Terminal support +I (6311) webui_ws: Terminal buffer allocated in PSRAM (32768 bytes) +I (6323) webui_ws: Power policy event handler registered +I (6325) webui_ws: WebSocket handler registered at /ws +I (6336) ts_webui: WebUI started +I (7433) ts_services: WebUI server started on port 80 +I (7443) ts_service: Service 'webui' started in 686 ms +I (7445) ts_service: All services started in 5471 ms +I (7446) ts_core: TianShanOS started +I (7446) main: TianShanOS started successfully! +I (7457) main: Build: Sep 28 2026 18:02:10 +I (7458) ts_service: === Service Status === +I (7459) ts_service: Total: 12, Running: 12, Stopped: 0, Error: 0 +I (7470) ts_service: Startup time: 5471 ms +I (7471) ts_service: [SERVICE] automation - RUNNING (1622 ms) +I (7483) ts_service: [UI] console - RUNNING (779 ms) +I (7484) ts_service: [UI] webui - RUNNING (686 ms) +I (7485) ts_service: [SERVICE] https - RUNNING (21 ms) +I (7496) ts_service: [SERVICE] api - RUNNING (567 ms) +I (7497) ts_service: [SECURITY] security - RUNNING (320 ms) +I (7498) ts_service: [NETWORK] network - RUNNING (247 ms) +I (7510) ts_service: [DRIVER] power - RUNNING (123 ms) +I (7511) ts_service: [DRIVER] drivers - RUNNING (169 ms) +I (7523) ts_service: [DRIVER] led - RUNNING (178 ms) +I (7524) ts_service: [DRIVER] storage - RUNNING (276 ms) +I (7525) ts_service: [HAL] hal - RUNNING (90 ms) +I (7537) ts_service: ====================== +I (7537) main: Entering main loop... +I (7091) ts_device: LPMU startup detection: checking if LPMU is online... +I (7096) ts_device: LPMU detected online at 10.10.99.99, setting state to ON +I (41578) ts_config_pack: Loaded plain config: /sdcard/config/ui_widgets.json (480 bytes) +I (40486) api_ui: Loaded widgets from SD card +I (40488) api_ui: Loaded UI widgets config (source: sdcard) +I (42345) ts_security: Session created: e779c635 +I (42347) ts_auth: User root logged in (level 4, session e779c635) +I (44019) ts_config_pack: Loaded plain config: /sdcard/config/ui_widgets.json (480 bytes) +I (42926) api_ui: Loaded widgets from SD card +I (42928) api_ui: Loaded UI widgets config (source: sdcard) +I (44698) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (58401) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (59504) ts_ssh: SSH client initialized (libssh2 version: 1.10.1_DEV) +I (60314) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (60640) ts_shell: Interactive shell opened + +TianShanOS Console Commands +============================ + +[System] + hexdump + mv + cp + rm + mkdir + pwd + cd + cat + ls + dhcp + storage + service + system + lang + echo + clear + reboot + sysinfo + version + help + +[Configuration] + config + +[LED] + led + +[Fan] + fan + +[Network] + wifi + net + +[Device] + device + +[Debug] + log + free + tasks + +Use ' --help' for command details + +I (265867) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (267773) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (268157) ts_shell: Interactive shell opened +I (323032) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (324937) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (325162) ts_shell: Interactive shell opened +I (327228) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (329127) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (329389) ts_shell: Interactive shell opened +I (331546) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (333445) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (333670) ts_shell: Interactive shell opened +I (335813) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (337717) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (337919) ts_shell: Interactive shell opened +I (340026) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (341929) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (342173) ts_shell: Interactive shell opened +I (344146) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (346053) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (346175) ts_shell: Interactive shell opened +I (348122) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (350021) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (350184) ts_shell: Interactive shell opened +I (352274) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (354171) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (354436) ts_shell: Interactive shell opened +I (356493) webui_ws: update_log_stream_state: need_streaming=0, current=0 +I (358394) ts_known_hosts: Host key verified: 10.10.99.98:22 +I (358449) ts_shell: Interactive shell opened diff --git a/docs/repair/ssh-poll-stack/device-diagnostic/summary.json b/docs/repair/ssh-poll-stack/device-diagnostic/summary.json new file mode 100644 index 0000000..9c322d0 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-diagnostic/summary.json @@ -0,0 +1,11 @@ +{ + "minimum_sampled_hwm": 3984, + "serial_faults": [], + "final_pollers": [], + "manual_rounds": 1, + "automatic_successful_rounds": 9, + "failed_harness_attempts": 1, + "device_left_running": "formal candidate, restored and HTTP health verified", + "minimum_all_observed_hwm": 3644, + "evidence_boundary": "1 manual browser round + 9 native WS protocol rounds against real device and SSH host; not 10 browser keyboard rounds" +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-final/after-local.json b/docs/repair/ssh-poll-stack/device-final/after-local.json new file mode 100644 index 0000000..412c0b6 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/after-local.json @@ -0,0 +1,1138 @@ +{ + "state": { + "url": "http://10.10.99.97/#/terminal", + "login": false, + "Terminal": "function", + "FitAddon": "object", + "terminal": true, + "connected": true, + "ssh": false, + "text": "(base) rm01@agx:~$ \n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.55V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.46V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.23V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.37V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.34V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.50V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.49V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.49V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.49V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.29V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n^\\ (退出 SSH shell)\n正在结束 SSH 会话,请等待确认。\nSSH 会话已结束。\ntianshan> echo TIANSHAN_LOCAL_AFTER_J1\nTIANSHAN_LOCAL_AFTER_J1\ntianshan> " + }, + "requests": [ + { + "url": "http://10.10.99.97/", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/css/style.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-48.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/api.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/router.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/terminal.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/app.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.woff2", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/config/get?key=system.language", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ota/version", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/auth/login", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + } + ], + "errors": [], + "frames": [ + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "terminal_stop" + }, + { + "direction": "sent", + "type": "subscribe", + "topic": "system.dashboard", + "params": { + "interval": 1000 + } + }, + { + "direction": "received", + "type": "subscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "unsubscribe", + "topic": "system.dashboard" + }, + { + "direction": "received", + "type": "unsubscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --status" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --debug" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_connect", + "host": "10.10.99.98", + "port": 22, + "user": "rm01" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "e" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "c" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "h" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "o" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": " " + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "T" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "I" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "H" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "J" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "1" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "R" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "E" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "L" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "P" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "\r" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.29199981689453, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.29199981689453, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_disconnect" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "echo TIANSHAN_LOCAL_AFTER_J1" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + } + ] +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-final/browser-observer.cjs b/docs/repair/ssh-poll-stack/device-final/browser-observer.cjs new file mode 100644 index 0000000..7286d35 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/browser-observer.cjs @@ -0,0 +1,16 @@ +const {chromium}=require('/Users/massif/TianshanOS/tests/prompts/node_modules/playwright'); +const fs=require('fs'); +(async()=>{ + const out='/Users/massif/TianshanOS/output/playwright/pr42-final',origin='http://10.10.99.97'; + const browser=await chromium.launch({channel:'chrome',headless:false}); + const context=await browser.newContext({serviceWorkers:'block',viewport:{width:1280,height:900}}); + const requests=[],errors=[],frames=[]; + await context.route('**/*',r=>new URL(r.request().url()).origin===origin?r.continue():r.abort()); + const page=await context.newPage(); + page.on('request',r=>requests.push({url:r.url(),origin:new URL(r.url()).origin})); + page.on('pageerror',e=>errors.push(e.message)); + page.on('websocket',ws=>{ws.on('framereceived',f=>{try{const m=JSON.parse(f.payload);if(!['ssh_output','output'].includes(m.type))frames.push({direction:'received',...m});}catch{}});ws.on('framesent',f=>{try{const m=JSON.parse(f.payload);delete m.password;if(m.type==='terminal_input'&&m.data?.includes('--password'))m.data='[SSH connection command redacted]';frames.push({direction:'sent',...m});}catch{}});}); + await page.goto(origin+'/#/terminal'); + console.log('BROWSER_READY'); + setInterval(async()=>{try{const state=await page.evaluate(()=>({url:location.href,login:!document.getElementById('login-modal')?.classList.contains('hidden'),Terminal:typeof Terminal,FitAddon:typeof FitAddon,terminal:typeof webTerminal!=='undefined'&&!!webTerminal?.terminal,connected:typeof webTerminal!=='undefined'&&webTerminal?.connected,ssh:typeof webTerminal!=='undefined'&&webTerminal?.sshMode,text:document.querySelector('#terminal-container')?.innerText}));fs.writeFileSync(out+'/live.json',JSON.stringify({state,requests,errors,frames},null,2));}catch{}},1000); +})(); diff --git a/docs/repair/ssh-poll-stack/device-final/destroy.json b/docs/repair/ssh-poll-stack/device-final/destroy.json new file mode 100644 index 0000000..1650e79 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/destroy.json @@ -0,0 +1,2489 @@ +{ + "state": { + "url": "http://10.10.99.97/#/", + "login": false, + "Terminal": "function", + "FitAddon": "object", + "terminal": false + }, + "requests": [ + { + "url": "http://10.10.99.97/", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/css/style.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-48.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/api.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/router.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/terminal.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/app.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.woff2", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/config/get?key=system.language", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ota/version", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/auth/login", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ssh/hosts/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ssh/commands/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3.6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3.6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3-Embedding-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3-Embedding-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3-Reranker-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3-Reranker-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=drop", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=drop", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + } + ], + "errors": [], + "frames": [ + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "terminal_stop" + }, + { + "direction": "sent", + "type": "subscribe", + "topic": "system.dashboard", + "params": { + "interval": 1000 + } + }, + { + "direction": "received", + "type": "subscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "unsubscribe", + "topic": "system.dashboard" + }, + { + "direction": "received", + "type": "unsubscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --status" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --debug" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_connect", + "host": "10.10.99.98", + "port": 22, + "user": "rm01" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "e" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "c" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "h" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "o" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": " " + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "T" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "I" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "H" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "J" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "1" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "R" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "E" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "L" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "P" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "\r" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.29199981689453, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.29199981689453, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_disconnect" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "echo TIANSHAN_LOCAL_AFTER_J1" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "terminal_stop" + }, + { + "direction": "sent", + "type": "subscribe", + "topic": "system.dashboard", + "params": { + "interval": 1000 + } + }, + { + "direction": "received", + "type": "subscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 585, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 27 + }, + { + "id": 1, + "usage": 13 + } + ], + "total_usage": 20, + "total_runtime": 585609736, + "task_count": 24 + }, + "memory": { + "free_heap": 7636428, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579208, + "allocated": 790972, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 585611 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.337600708007812, + "adc_raw": 2105, + "timestamp_ms": 586165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.337600708007812 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 584526 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.5, + "slope_c_per_min": -0.4000000059604645, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 586, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 25 + }, + { + "id": 1, + "usage": 3 + } + ], + "total_usage": 14, + "total_runtime": 586643040, + "task_count": 24 + }, + "memory": { + "free_heap": 7632408, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8369732, + "free": 7574100, + "allocated": 795632, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 586645 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.51999855041504, + "adc_raw": 2125, + "timestamp_ms": 587165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.51999855041504 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 585553 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.8, + "slope_c_per_min": 0, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 587, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 39 + }, + { + "id": 1, + "usage": 36 + } + ], + "total_usage": 37, + "total_runtime": 587693752, + "task_count": 24 + }, + "memory": { + "free_heap": 7636432, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579208, + "allocated": 790972, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 587695 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.44019889831543, + "adc_raw": 2117, + "timestamp_ms": 588166 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.44019889831543 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 586577 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 20, + "target_duty": 20, + "rpm": 0, + "temperature": 52.9, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.9, + "guard_temperature": 52.9, + "predicted_temperature": 52.9, + "slope_c_per_min": 0, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.9000015258789, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 588, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 23 + }, + { + "id": 1, + "usage": 1 + } + ], + "total_usage": 12, + "total_runtime": 588721054, + "task_count": 24 + }, + "memory": { + "free_heap": 7636436, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579216, + "allocated": 790964, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 588722 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.337600708007812, + "adc_raw": 2107, + "timestamp_ms": 589165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.337600708007812 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 587602 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 53, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 53, + "guard_temperature": 53, + "predicted_temperature": 53.1, + "slope_c_per_min": 0.20000000298023224, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 53, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 589, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 23 + }, + { + "id": 1, + "usage": 6 + } + ], + "total_usage": 14, + "total_runtime": 589735957, + "task_count": 24 + }, + "memory": { + "free_heap": 7636432, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579216, + "allocated": 790964, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 589737 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.83919906616211, + "adc_raw": 2157, + "timestamp_ms": 590165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.83919906616211 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 588627 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.5, + "slope_c_per_min": -0.4000000059604645, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + } + ] +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-final/health-assets.json b/docs/repair/ssh-poll-stack/device-final/health-assets.json new file mode 100644 index 0000000..cae5fcd --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/health-assets.json @@ -0,0 +1,249 @@ +{ + "system/info": { + "code": 0, + "data": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 614026 + } + }, + "system/tasks": { + "code": 0, + "data": { + "tasks": [ + { + "name": "httpd", + "priority": 5, + "stack_hwm": 1144, + "core": 1, + "state": "running" + }, + { + "name": "IDLE0", + "priority": 0, + "stack_hwm": 624, + "core": 0, + "state": "ready" + }, + { + "name": "IDLE1", + "priority": 0, + "stack_hwm": 696, + "core": 1, + "state": "ready" + }, + { + "name": "power_policy", + "priority": 5, + "stack_hwm": 636, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_auto", + "priority": 5, + "stack_hwm": 2032, + "core": 1, + "state": "blocked" + }, + { + "name": "tiT", + "priority": 18, + "stack_hwm": 1580, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "sio_agx-info", + "priority": 5, + "stack_hwm": 1792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "https_coord", + "priority": 5, + "stack_hwm": 5432, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "websocket_task", + "priority": 5, + "stack_hwm": 1340, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "action_exec", + "priority": 5, + "stack_hwm": 13008, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "w5500_tsk", + "priority": 15, + "stack_hwm": 2792, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "main", + "priority": 1, + "stack_hwm": 536, + "core": 0, + "state": "blocked" + }, + { + "name": "power_monitor", + "priority": 5, + "stack_hwm": 1956, + "core": 0, + "state": "blocked" + }, + { + "name": "ts_console", + "priority": 5, + "stack_hwm": 1964, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "dhcp_evt", + "priority": 5, + "stack_hwm": 900, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "ipc1", + "priority": 24, + "stack_hwm": 528, + "core": 1, + "state": "suspended" + }, + { + "name": "ipc0", + "priority": 24, + "stack_hwm": 392, + "core": 0, + "state": "suspended" + }, + { + "name": "ws_telemetry", + "priority": 2, + "stack_hwm": 2116, + "core": 0, + "state": "suspended" + }, + { + "name": "ts_event", + "priority": 5, + "stack_hwm": 904, + "core": 1, + "state": "blocked" + }, + { + "name": "esp_timer", + "priority": 22, + "stack_hwm": 2488, + "core": 0, + "state": "suspended" + }, + { + "name": "led_render", + "priority": 5, + "stack_hwm": 1364, + "core": 0, + "state": "blocked" + }, + { + "name": "sys_evt", + "priority": 20, + "stack_hwm": 1684, + "core": 0, + "state": "blocked" + }, + { + "name": "Tmr Svc", + "priority": 1, + "stack_hwm": 800, + "core": 2147483647, + "state": "blocked" + }, + { + "name": "httpd", + "priority": 5, + "stack_hwm": 15152, + "core": 2147483647, + "state": "blocked" + } + ], + "count": 24 + } + }, + "power/status": { + "code": 0, + "data": { + "voltage": { + "supply_v": 20.48579978942871, + "adc_raw": 2121, + "timestamp_ms": 614165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.48579978942871 + }, + "stats": { + "samples": 119, + "avg_voltage_v": 20.466068267822266, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 612892 + }, + "monitoring_active": true + } + }, + "vendor": { + "xterm.min.js": { + "sha256": "fc1dd31b221e3e5f929486e07a80b477a8aaf9dce2b4f9c3ffe7dd25f370655d", + "size": 283670, + "matches_source": true + }, + "xterm.css": { + "sha256": "832f3f2c603b43ad4351ff04970150cc7a873014276db126a6065c6dd81e4872", + "size": 5383, + "matches_source": true + }, + "fit.min.js": { + "sha256": "c78e5795c6487acdf24ab436798d4a9cec3848101b281bc65b061f39db714be1", + "size": 1789, + "matches_source": true + } + } +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-final/j1-active.json b/docs/repair/ssh-poll-stack/device-final/j1-active.json new file mode 100644 index 0000000..90e64c5 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/j1-active.json @@ -0,0 +1,560 @@ +{ + "state": { + "url": "http://10.10.99.97/#/terminal", + "login": false, + "Terminal": "function", + "FitAddon": "object", + "terminal": true, + "connected": true, + "ssh": true, + "text": " 连接…\nSSH 交互式终端已就绪。\n(按 Ctrl+\\ 退出 SSH shell)\n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\nWelcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.148-tegra aarch64)\n * Documentation: https://help.ubuntu.com\n * Management: https://landscape.canonical.com\n * Support: https://ubuntu.com/pro\nThis system has been minimized by removing packages and content that are\nnot required on a system that users do not log into.\nTo restore this content, you can run the 'unminimize' command.\nLast login: Mon Sep 28 10:31:25 2026 from 10.10.99.97\n📊 [调试] NORMAL | 电压: 20.49V | 倒计时: 0s\n(base) rm01@agx:~$ \n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.50V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.49V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.55V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.43V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.49V | 倒计时: 0s\n " + }, + "requests": [ + { + "url": "http://10.10.99.97/", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/css/style.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-48.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/api.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/router.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/terminal.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/app.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.woff2", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/config/get?key=system.language", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ota/version", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/auth/login", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + } + ], + "errors": [], + "frames": [ + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "terminal_stop" + }, + { + "direction": "sent", + "type": "subscribe", + "topic": "system.dashboard", + "params": { + "interval": 1000 + } + }, + { + "direction": "received", + "type": "subscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "unsubscribe", + "topic": "system.dashboard" + }, + { + "direction": "received", + "type": "unsubscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --status" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --debug" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_connect", + "host": "10.10.99.98", + "port": 22, + "user": "rm01" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + } + ] +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-final/j1-echo.json b/docs/repair/ssh-poll-stack/device-final/j1-echo.json new file mode 100644 index 0000000..f2968fb --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/j1-echo.json @@ -0,0 +1,991 @@ +{ + "state": { + "url": "http://10.10.99.97/#/terminal", + "login": false, + "Terminal": "function", + "FitAddon": "object", + "terminal": true, + "connected": true, + "ssh": true, + "text": "📊 [调试] NORMAL | 电压: 20.52V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.30V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.49V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.52V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.28V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.50V | 倒计时: 0s\necho TIANSHAN_J1_REAL_PASS\nTIANSHAN_J1_REAL_PASS\n(base) rm01@agx:~$ \n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.55V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.46V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.44V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.23V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.37V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.34V | 倒计时: 0s\n📊 [调试] NORMAL | 电压: 20.50V | 倒计时: 0s\n " + }, + "requests": [ + { + "url": "http://10.10.99.97/", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/css/style.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-48.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/api.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/router.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/terminal.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/app.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.woff2", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/config/get?key=system.language", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ota/version", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/auth/login", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + } + ], + "errors": [], + "frames": [ + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "terminal_stop" + }, + { + "direction": "sent", + "type": "subscribe", + "topic": "system.dashboard", + "params": { + "interval": 1000 + } + }, + { + "direction": "received", + "type": "subscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "unsubscribe", + "topic": "system.dashboard" + }, + { + "direction": "received", + "type": "unsubscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --status" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --debug" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_connect", + "host": "10.10.99.98", + "port": 22, + "user": "rm01" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "e" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "c" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "h" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "o" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": " " + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "T" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "I" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "H" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "J" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "1" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "R" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "E" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "L" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "P" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "\r" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + } + ] +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-final/network.json b/docs/repair/ssh-poll-stack/device-final/network.json new file mode 100644 index 0000000..eb3bf0c --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/network.json @@ -0,0 +1,339 @@ +{ + "requests": [ + { + "url": "http://10.10.99.97/", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/css/style.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-48.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/api.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/router.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/terminal.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/app.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.woff2", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/config/get?key=system.language", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ota/version", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/auth/login", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ssh/hosts/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ssh/commands/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3.6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3.6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3-Embedding-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3-Embedding-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3-Reranker-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3-Reranker-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=drop", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=drop", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + } + ], + "errors": [], + "externalRequests": 0, + "freshContext": true, + "serviceWorkers": "block", + "originAllowlist": [ + "http://10.10.99.97" + ] +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/device-final/reentry.json b/docs/repair/ssh-poll-stack/device-final/reentry.json new file mode 100644 index 0000000..ecea624 --- /dev/null +++ b/docs/repair/ssh-poll-stack/device-final/reentry.json @@ -0,0 +1,3753 @@ +{ + "state": { + "url": "http://10.10.99.97/#/terminal", + "login": false, + "Terminal": "function", + "FitAddon": "object", + "terminal": true, + "connected": true, + "ssh": false, + "text": "╔══════════════════════════════════════════╗\n║ TianshanOS Web Terminal ║\n╚══════════════════════════════════════════╝\n正在连接到设备...\n已连接到设备\n输入 help 查看可用命令\ntianshan> " + }, + "requests": [ + { + "url": "http://10.10.99.97/", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/css/style.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-48.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/api.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/router.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/terminal.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/app.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/fonts/remixicon.woff2", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/config/get?key=system.language", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ota/version", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/auth/login", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/time/info", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/system/memory", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/network/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/power/protection/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/fan/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/service/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/led/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/usb/status", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ui/widgets/get", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/status?device=agx", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ssh/hosts/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/ssh/commands/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/list", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3.6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3.6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3-Embedding-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3-Embedding-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3-Reranker-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3-Reranker-0.6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=drop", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=drop", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/rules/get?id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/actions/get?id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_6-35B-A3B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Embedding-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3-Reranker-0_6B", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/services/status?command_id=Qwen3_8_27B_Quark_INT4_MTP3", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/automation/variables/list?include_meta=false", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/api/v1/device/ping", + "origin": "http://10.10.99.97" + }, + { + "url": "http://10.10.99.97/images/tslogo-32.png", + "origin": "http://10.10.99.97" + } + ], + "errors": [], + "frames": [ + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "terminal_stop" + }, + { + "direction": "sent", + "type": "subscribe", + "topic": "system.dashboard", + "params": { + "interval": 1000 + } + }, + { + "direction": "received", + "type": "subscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "unsubscribe", + "topic": "system.dashboard" + }, + { + "direction": "received", + "type": "unsubscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "received", + "type": "session_closed", + "reason": "Another terminal session requested" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --status" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "voltprot --debug" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_connect", + "host": "10.10.99.98", + "port": 22, + "user": "rm01" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.428800582885742, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.30340003967285, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.51999855041504, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.28059959411621, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "e" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "c" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "h" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "o" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": " " + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "T" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "I" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "H" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "N" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "J" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "1" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "R" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "E" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "L" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "_" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "P" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "A" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "S" + }, + { + "direction": "sent", + "type": "ssh_input", + "data": "\r" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.55419921875, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.46299934387207, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.23499870300293, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.37179946899414, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.337600708007812, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.49720001220703, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.48579978942871, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.29199981689453, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.29199981689453, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "received", + "type": "power_event", + "state": "NORMAL", + "voltage": 20.44019889831543, + "countdown": 0, + "protection_count": 0, + "event": "debug_tick" + }, + { + "direction": "sent", + "type": "ssh_disconnect" + }, + { + "direction": "received", + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + { + "direction": "received", + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "subscribe", + "events": [ + "*" + ] + }, + { + "direction": "sent", + "type": "terminal_input", + "data": "echo TIANSHAN_LOCAL_AFTER_J1" + }, + { + "direction": "received", + "type": "done", + "code": 0 + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "terminal_stop" + }, + { + "direction": "sent", + "type": "subscribe", + "topic": "system.dashboard", + "params": { + "interval": 1000 + } + }, + { + "direction": "received", + "type": "subscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 585, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 27 + }, + { + "id": 1, + "usage": 13 + } + ], + "total_usage": 20, + "total_runtime": 585609736, + "task_count": 24 + }, + "memory": { + "free_heap": 7636428, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579208, + "allocated": 790972, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 585611 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.337600708007812, + "adc_raw": 2105, + "timestamp_ms": 586165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.337600708007812 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 584526 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.5, + "slope_c_per_min": -0.4000000059604645, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 586, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 25 + }, + { + "id": 1, + "usage": 3 + } + ], + "total_usage": 14, + "total_runtime": 586643040, + "task_count": 24 + }, + "memory": { + "free_heap": 7632408, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8369732, + "free": 7574100, + "allocated": 795632, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 586645 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.51999855041504, + "adc_raw": 2125, + "timestamp_ms": 587165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.51999855041504 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 585553 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.8, + "slope_c_per_min": 0, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 587, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 39 + }, + { + "id": 1, + "usage": 36 + } + ], + "total_usage": 37, + "total_runtime": 587693752, + "task_count": 24 + }, + "memory": { + "free_heap": 7636432, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579208, + "allocated": 790972, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 587695 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.44019889831543, + "adc_raw": 2117, + "timestamp_ms": 588166 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.44019889831543 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 586577 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 20, + "target_duty": 20, + "rpm": 0, + "temperature": 52.9, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.9, + "guard_temperature": 52.9, + "predicted_temperature": 52.9, + "slope_c_per_min": 0, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.9000015258789, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 588, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 23 + }, + { + "id": 1, + "usage": 1 + } + ], + "total_usage": 12, + "total_runtime": 588721054, + "task_count": 24 + }, + "memory": { + "free_heap": 7636436, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579216, + "allocated": 790964, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 588722 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.337600708007812, + "adc_raw": 2107, + "timestamp_ms": 589165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.337600708007812 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 587602 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 53, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 53, + "guard_temperature": 53, + "predicted_temperature": 53.1, + "slope_c_per_min": 0.20000000298023224, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 53, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 589, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 23 + }, + { + "id": 1, + "usage": 6 + } + ], + "total_usage": 14, + "total_runtime": 589735957, + "task_count": 24 + }, + "memory": { + "free_heap": 7636432, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579216, + "allocated": 790964, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 589737 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.83919906616211, + "adc_raw": 2157, + "timestamp_ms": 590165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.83919906616211 + }, + "stats": { + "samples": 114, + "avg_voltage_v": 20.465604782104492, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 588627 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.5, + "slope_c_per_min": -0.4000000059604645, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 590, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 26 + }, + { + "id": 1, + "usage": 7 + } + ], + "total_usage": 16, + "total_runtime": 590758690, + "task_count": 24 + }, + "memory": { + "free_heap": 7636432, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579208, + "allocated": 790972, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 590760 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.63399887084961, + "adc_raw": 2137, + "timestamp_ms": 591165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.63399887084961 + }, + "stats": { + "samples": 115, + "avg_voltage_v": 20.46498680114746, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 589652 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 53, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 53, + "guard_temperature": 53, + "predicted_temperature": 53, + "slope_c_per_min": 0, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 53, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 591, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 22 + }, + { + "id": 1, + "usage": 1 + } + ], + "total_usage": 11, + "total_runtime": 591773691, + "task_count": 24 + }, + "memory": { + "free_heap": 7636432, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579208, + "allocated": 790972, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 591775 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.48579978942871, + "adc_raw": 2121, + "timestamp_ms": 592165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.48579978942871 + }, + "stats": { + "samples": 115, + "avg_voltage_v": 20.46498680114746, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 590677 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.6, + "slope_c_per_min": -0.20000000298023224, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 592, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 24 + }, + { + "id": 1, + "usage": 6 + } + ], + "total_usage": 15, + "total_runtime": 592788696, + "task_count": 24 + }, + "memory": { + "free_heap": 7636440, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579212, + "allocated": 790968, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 592790 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.48579978942871, + "adc_raw": 2120, + "timestamp_ms": 593165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.48579978942871 + }, + "stats": { + "samples": 115, + "avg_voltage_v": 20.46498680114746, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 591702 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.8, + "slope_c_per_min": 0, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 593, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 26 + }, + { + "id": 1, + "usage": 7 + } + ], + "total_usage": 16, + "total_runtime": 593803754, + "task_count": 24 + }, + "memory": { + "free_heap": 7636436, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579216, + "allocated": 790964, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 593805 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.48579978942871, + "adc_raw": 2121, + "timestamp_ms": 594165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.48579978942871 + }, + "stats": { + "samples": 115, + "avg_voltage_v": 20.46498680114746, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 592556 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.9, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.9, + "guard_temperature": 52.9, + "predicted_temperature": 53, + "slope_c_per_min": 0.20000000298023224, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.9000015258789, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "received", + "type": "data", + "topic": "system.dashboard", + "timestamp": 594, + "data": { + "cpu": { + "cores": [ + { + "id": 0, + "usage": 24 + }, + { + "id": 1, + "usage": 8 + } + ], + "total_usage": 16, + "total_runtime": 594819762, + "task_count": 24 + }, + "memory": { + "free_heap": 7636432, + "min_free_heap": 7485660, + "internal": { + "total": 308043, + "free": 72755, + "allocated": 235288, + "largest_block": 31744 + }, + "psram": { + "total": 8370180, + "free": 7579216, + "allocated": 790964, + "largest_block": 7471104 + } + }, + "info": { + "app": { + "name": "TianShanOS", + "version": "0.5.2+3a19128d.09281801", + "idf_version": "v5.5.2", + "compile_time": "18:01:50", + "compile_date": "Sep 28 2026" + }, + "chip": { + "model": "ESP32-S3", + "cores": 2, + "revision": 2, + "features": [ + "WiFi", + "BLE" + ] + }, + "flash_size": 16777216, + "uptime_ms": 594821 + }, + "network": { + "hostname": "TianshanOS", + "ethernet": { + "status": "connected", + "link_up": true, + "ip": "10.10.99.97", + "netmask": "255.255.255.0", + "gateway": "10.10.99.100", + "dns1": "8.8.8.8", + "mac": "20:6e:f1:a1:d5:8f" + }, + "wifi_sta": { + "status": "down", + "connected": false + }, + "wifi_ap": { + "status": "down", + "sta_count": 0 + } + }, + "power": { + "voltage": { + "supply_v": 20.48579978942871, + "adc_raw": 2120, + "timestamp_ms": 595165 + }, + "power_chip": { + "valid": false, + "voltage_v": 20, + "current_a": 4.5, + "power_w": 90, + "crc_valid": false + }, + "protection": { + "running": true, + "state": "正常运行", + "countdown_sec": 0, + "current_voltage_v": 20.48579978942871 + }, + "stats": { + "samples": 115, + "avg_voltage_v": 20.46498680114746, + "avg_current_a": 0, + "avg_power_w": 0, + "uptime_ms": 593583 + }, + "monitoring_active": true + }, + "fan": { + "fans": [ + { + "id": 0, + "mode": "auto", + "duty": 21, + "target_duty": 21, + "rpm": 0, + "temperature": 52.8, + "enabled": true, + "running": true, + "fault": false, + "control_temperature": 52.8, + "guard_temperature": 52.8, + "predicted_temperature": 52.6, + "slope_c_per_min": -0.20000000298023224, + "controller_gain": 0.75, + "cooling_response": 0, + "auto_state": "active", + "guard_active": false, + "temp_stale": false + } + ], + "temperature": 52.79999923706055, + "temp_valid": true, + "temp_source": "agx-info.temperature.tj" + }, + "services": { + "total": 12, + "running": 12, + "services": [ + { + "name": "automation", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 2397, + "start_duration_ms": 1726 + }, + { + "name": "console", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 4864, + "start_duration_ms": 521 + }, + { + "name": "webui", + "state": "RUNNING", + "phase": "UI", + "healthy": true, + "start_time_ms": 5398, + "start_duration_ms": 438 + }, + { + "name": "https", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4133, + "start_duration_ms": 17 + }, + { + "name": "api", + "state": "RUNNING", + "phase": "SERVICE", + "healthy": true, + "start_time_ms": 4293, + "start_duration_ms": 372 + }, + { + "name": "security", + "state": "RUNNING", + "phase": "SECURITY", + "healthy": true, + "start_time_ms": 2109, + "start_duration_ms": 267 + }, + { + "name": "network", + "state": "RUNNING", + "phase": "NETWORK", + "healthy": true, + "start_time_ms": 1867, + "start_duration_ms": 223 + }, + { + "name": "power", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1005, + "start_duration_ms": 123 + }, + { + "name": "drivers", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1137, + "start_duration_ms": 169 + }, + { + "name": "led", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1314, + "start_duration_ms": 178 + }, + { + "name": "storage", + "state": "RUNNING", + "phase": "DRIVER", + "healthy": true, + "start_time_ms": 1508, + "start_duration_ms": 263 + }, + { + "name": "hal", + "state": "RUNNING", + "phase": "HAL", + "healthy": true, + "start_time_ms": 898, + "start_duration_ms": 89 + } + ] + } + } + }, + { + "direction": "sent", + "type": "unsubscribe", + "topic": "system.dashboard" + }, + { + "direction": "received", + "type": "unsubscribed", + "topic": "system.dashboard", + "success": true + }, + { + "direction": "sent", + "type": "terminal_start" + }, + { + "direction": "received", + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + }, + { + "direction": "sent", + "type": "ping" + }, + { + "direction": "received", + "type": "pong" + } + ] +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/diagnostic/assets.json b/docs/repair/ssh-poll-stack/diagnostic/assets.json new file mode 100644 index 0000000..5204409 --- /dev/null +++ b/docs/repair/ssh-poll-stack/diagnostic/assets.json @@ -0,0 +1,41 @@ +{ + "index.html": { + "source_sha256": "c8b08579724612166cc4ac2568aff34661bbf2c8699cc856abfa3d778ed4ae1d", + "optimized_sha256": "c8b08579724612166cc4ac2568aff34661bbf2c8699cc856abfa3d778ed4ae1d", + "gzip_sha256": "afd701f9af947c094ce29bee09fec963c1e01047a51bed1af8ba87433b42c2c6", + "optimized_bytes": 26676 + }, + "js/terminal.js": { + "source_sha256": "5d77a7181b6127699e098f22d3c872f5e31daaa700436b6fa928f34b6aa33e52", + "optimized_sha256": "6759587f527a0c37aaf8b13f6b5ffc017a452954cd23b780b5d6254488f939dc", + "gzip_sha256": "5e752fd41510e42f7fc71af8ae4c6993c1bdae9842e1dee3e9469cb297d7b0df", + "optimized_bytes": 20066 + }, + "js/lang/zh-CN.js": { + "source_sha256": "bb3d3b4b28c8c146fdb1c437bee84862806ed915af8cc0aa2388deb6a9e9ef89", + "optimized_sha256": "81b0fed5b0ac73d51d9c37204c9f62e035a79bbf5b5610d37fc8a936faf9fd64", + "gzip_sha256": "f140439b1f907b4842f8d100111281625a643f08b3f802806ba66df959742085", + "optimized_bytes": 137314 + }, + "js/lang/en-US.js": { + "source_sha256": "58beed2b903407387d884c99f38eaef578e74be916175b53745d0d5ececadc10", + "optimized_sha256": "e9963046086616fecc9ba662df94e736a98c1430865e0caa47292b3690ca0ad0", + "gzip_sha256": "a7f454b4aa15865cbf8616df3de1a8b382a2c45a695816f51790a41c0a9e89d1", + "optimized_bytes": 143161 + }, + "build": { + "TianShanOS.bin": { + "sha256": "a217c5932e97d0db90f7032abba274c218c327e0725c80f278898c8dcc295f85", + "bytes": 2465504 + }, + "www.bin": { + "sha256": "30e4c70f01b60ce1d51c6392a3f2b4d196d4886cf554c0167db9554c1beecb50", + "bytes": 3145728 + }, + "TianShanOS.elf": { + "sha256": "e6fa1eadbce3940ba88b0431d0367154082abcc4bcacbd634a43028e06aaf7ff", + "bytes": 18857336 + } + }, + "spiffs_regeneration": "byte-identical from verified optimized directory" +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/diagnostic/build.log b/docs/repair/ssh-poll-stack/diagnostic/build.log new file mode 100644 index 0000000..9c2a3f9 --- /dev/null +++ b/docs/repair/ssh-poll-stack/diagnostic/build.log @@ -0,0 +1,1698 @@ +Checking "python3" ... +Python 3.12.4 +"python3" has been detected +Activating ESP-IDF 5.5 +Setting IDF_PATH to '/Users/massif/esp/v5.5.2/esp-idf'. +* Checking python version ... 3.12.4 +* Checking python dependencies ... OK +* Deactivating the current ESP-IDF environment (if any) ... OK +* Establishing a new ESP-IDF environment ... OK +* Identifying shell ... zsh +* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version. +For removing old versions of riscv32-esp-elf, cmake, xtensa-esp-elf, openocd-esp32, esp-rom-elfs, xtensa-esp-elf-gdb, riscv32-esp-elf-gdb use command 'python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall' +To free up even more space, remove installation packages of those tools. +Use option python /Users/massif/esp/v5.5.2/esp-idf/tools/idf_tools.py uninstall --remove-archives. +* Shell completion ... Autocompletion code generated + +Done! You can now compile ESP-IDF projects. +Go to the project directory and run: + + idf.py build +ESP-IDF v5.5.2 +Executing action: all (aliases: build) +Running cmake in directory /private/tmp/tianshan-ssh-stack-diagnostic/build +Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED=1 -DPYTHON=/Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python -DESP_PLATFORM=1 -DSDKCONFIG=/tmp/tianshan-ssh-stack-diagnostic/sdkconfig -DCCACHE_ENABLE=0 /Users/massif/TianshanOS"... +-- Found Python3: /opt/anaconda3/bin/python3.12 (found version "3.12.4") found components: Interpreter +-- IDF_TARGET is not set, guessed 'esp32s3' from sdkconfig '/tmp/tianshan-ssh-stack-diagnostic/sdkconfig' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Component directory /Users/massif/TianshanOS/components/linenoise does not contain a CMakeLists.txt file. No component will be added +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +NOTICE: +Following dependencies have new versions available: +Dependency "espressif/libpng": "1.6.54" -> "1.6.58~2" +Dependency "espressif/mdns": "1.9.1" -> "1.13.1" +Dependency "espressif/zlib": "1.3.1" -> "1.3.2~1" +Consider running "idf.py update-dependencies" to update your lock file. +NOTICE: Processing 7 dependencies: +NOTICE: [1/7] espressif/esp_jpeg (1.3.1) +NOTICE: [2/7] espressif/esp_websocket_client (1.5.0) +NOTICE: [3/7] espressif/led_strip (3.0.3) +NOTICE: [4/7] espressif/libpng (1.6.54) +NOTICE: [5/7] espressif/mdns (1.9.1) +NOTICE: [6/7] espressif/zlib (1.3.1) +NOTICE: [7/7] idf (5.5.2) +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-ssh-stack-diagnostic/sdkconfig +Loading defaults file /Users/massif/TianshanOS/sdkconfig.defaults... +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:54 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:56 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:64 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:66 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:82 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:84 line was updated to # === L2 NVS 加密配置(HMAC 方案)===n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:159 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:161 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:170 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:172 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:182 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:184 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:193 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:195 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:227 line was updated to # ============================================================================n +/var/folders/88/hzsgvlyj5xzghddxy9rk5_5m0000gn/T/kconfgen_tmpujgd4r60:229 line was updated to # ============================================================================n +-- Compiler supported targets: xtensa-esp-elf +-- Found Python3: /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python (found version "3.12.4") found components: Interpreter +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD +-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success +-- Found Threads: TRUE +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS +-- Performing Test C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS - Success +-- USING O3 +-- App "TianShanOS" version: 0.5.2+3a19128d.09281801 +-- Adding linker script /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/esp_system/ld/memory.ld +-- Adding linker script /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/esp_system/ld/sections.ld.in +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_master.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_50.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_smp.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_dtm.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_test.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ble_scan.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Web optimization enabled (minify + gzip) +-- Components: app_trace app_update bootloader bootloader_support bt ch405labs_esp_libssh2 cmock console cxx driver efuse esp-tls esp_adc esp_app_format esp_bootloader_format esp_coex esp_common esp_driver_ana_cmpr esp_driver_bitscrambler esp_driver_cam esp_driver_dac esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_i2s esp_driver_isp esp_driver_jpeg esp_driver_ledc esp_driver_mcpwm esp_driver_parlio esp_driver_pcnt esp_driver_ppa esp_driver_rmt esp_driver_sdio esp_driver_sdm esp_driver_sdmmc esp_driver_sdspi esp_driver_spi esp_driver_touch_sens esp_driver_tsens esp_driver_twai esp_driver_uart esp_driver_usb_serial_jtag esp_eth esp_event esp_gdbstub esp_hid esp_http_client esp_http_server esp_https_ota esp_https_server esp_hw_support esp_lcd esp_local_ctrl esp_mm esp_netif esp_netif_stack esp_partition esp_phy esp_pm esp_psram esp_ringbuf esp_rom esp_security esp_system esp_timer esp_vfs_console esp_wifi espcoredump espressif__esp_jpeg espressif__esp_websocket_client espressif__led_strip espressif__libpng espressif__mdns espressif__zlib esptool_py fatfs freertos hal heap http_parser idf_test ieee802154 json log lwip main mbedtls mqtt newlib nvs_flash nvs_sec_provider openthread partition_table perfmon protobuf-c protocomm pthread rt sdmmc soc spi_flash spiffs tcp_transport touch_element ts_api ts_auth_layout ts_automation ts_cert ts_config ts_config_pack ts_console ts_core ts_drivers ts_event ts_hal ts_https ts_jsonpath ts_led ts_log ts_mempool ts_net ts_ota ts_pki_client ts_security ts_service ts_storage ts_webui ulp unity usb vfs wear_levelling wifi_provisioning wpa_supplicant xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/app_trace /Users/massif/esp/v5.5.2/esp-idf/components/app_update /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/bt /Users/massif/TianshanOS/components/ch405labs_esp_libssh2 /Users/massif/esp/v5.5.2/esp-idf/components/cmock /Users/massif/esp/v5.5.2/esp-idf/components/console /Users/massif/esp/v5.5.2/esp-idf/components/cxx /Users/massif/esp/v5.5.2/esp-idf/components/driver /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp-tls /Users/massif/esp/v5.5.2/esp-idf/components/esp_adc /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_coex /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ana_cmpr /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_bitscrambler /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_cam /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_dac /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gpio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_gptimer /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2c /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_i2s /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_isp /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_jpeg /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ledc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_mcpwm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_parlio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_pcnt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_ppa /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_rmt /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdio /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdm /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_sdspi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_spi /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_touch_sens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_tsens /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_twai /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_uart /Users/massif/esp/v5.5.2/esp-idf/components/esp_driver_usb_serial_jtag /Users/massif/esp/v5.5.2/esp-idf/components/esp_eth /Users/massif/esp/v5.5.2/esp-idf/components/esp_event /Users/massif/esp/v5.5.2/esp-idf/components/esp_gdbstub /Users/massif/esp/v5.5.2/esp-idf/components/esp_hid /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_client /Users/massif/esp/v5.5.2/esp-idf/components/esp_http_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_ota /Users/massif/esp/v5.5.2/esp-idf/components/esp_https_server /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_lcd /Users/massif/esp/v5.5.2/esp-idf/components/esp_local_ctrl /Users/massif/esp/v5.5.2/esp-idf/components/esp_mm /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif /Users/massif/esp/v5.5.2/esp-idf/components/esp_netif_stack /Users/massif/esp/v5.5.2/esp-idf/components/esp_partition /Users/massif/esp/v5.5.2/esp-idf/components/esp_phy /Users/massif/esp/v5.5.2/esp-idf/components/esp_pm /Users/massif/esp/v5.5.2/esp-idf/components/esp_psram /Users/massif/esp/v5.5.2/esp-idf/components/esp_ringbuf /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esp_timer /Users/massif/esp/v5.5.2/esp-idf/components/esp_vfs_console /Users/massif/esp/v5.5.2/esp-idf/components/esp_wifi /Users/massif/esp/v5.5.2/esp-idf/components/espcoredump /Users/massif/TianshanOS/managed_components/espressif__esp_jpeg /Users/massif/TianshanOS/managed_components/espressif__esp_websocket_client /Users/massif/TianshanOS/managed_components/espressif__led_strip /Users/massif/TianshanOS/managed_components/espressif__libpng /Users/massif/TianshanOS/managed_components/espressif__mdns /Users/massif/TianshanOS/managed_components/espressif__zlib /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/fatfs /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/heap /Users/massif/esp/v5.5.2/esp-idf/components/http_parser /Users/massif/esp/v5.5.2/esp-idf/components/idf_test /Users/massif/esp/v5.5.2/esp-idf/components/ieee802154 /Users/massif/esp/v5.5.2/esp-idf/components/json /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/lwip /Users/massif/TianshanOS/main /Users/massif/esp/v5.5.2/esp-idf/components/mbedtls /Users/massif/esp/v5.5.2/esp-idf/components/mqtt /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/nvs_flash /Users/massif/esp/v5.5.2/esp-idf/components/nvs_sec_provider /Users/massif/esp/v5.5.2/esp-idf/components/openthread /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/perfmon /Users/massif/esp/v5.5.2/esp-idf/components/protobuf-c /Users/massif/esp/v5.5.2/esp-idf/components/protocomm /Users/massif/esp/v5.5.2/esp-idf/components/pthread /Users/massif/esp/v5.5.2/esp-idf/components/rt /Users/massif/esp/v5.5.2/esp-idf/components/sdmmc /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/spiffs /Users/massif/esp/v5.5.2/esp-idf/components/tcp_transport /Users/massif/esp/v5.5.2/esp-idf/components/touch_element /Users/massif/TianshanOS/components/ts_api /Users/massif/TianshanOS/components/ts_auth_layout /Users/massif/TianshanOS/components/ts_automation /Users/massif/TianshanOS/components/ts_cert /Users/massif/TianshanOS/components/ts_core/ts_config /Users/massif/TianshanOS/components/ts_config_pack /Users/massif/TianshanOS/components/ts_console /Users/massif/TianshanOS/components/ts_core /Users/massif/TianshanOS/components/ts_drivers /Users/massif/TianshanOS/components/ts_core/ts_event /Users/massif/TianshanOS/components/ts_hal /Users/massif/TianshanOS/components/ts_https /Users/massif/TianshanOS/components/ts_jsonpath /Users/massif/TianshanOS/components/ts_led /Users/massif/TianshanOS/components/ts_core/ts_log /Users/massif/TianshanOS/components/ts_mempool /Users/massif/TianshanOS/components/ts_net /Users/massif/TianshanOS/components/ts_ota /Users/massif/TianshanOS/components/ts_pki_client /Users/massif/TianshanOS/components/ts_security /Users/massif/TianshanOS/components/ts_core/ts_service /Users/massif/TianshanOS/components/ts_storage /Users/massif/TianshanOS/components/ts_webui /Users/massif/esp/v5.5.2/esp-idf/components/ulp /Users/massif/esp/v5.5.2/esp-idf/components/unity /Users/massif/esp/v5.5.2/esp-idf/components/usb /Users/massif/esp/v5.5.2/esp-idf/components/vfs /Users/massif/esp/v5.5.2/esp-idf/components/wear_levelling /Users/massif/esp/v5.5.2/esp-idf/components/wifi_provisioning /Users/massif/esp/v5.5.2/esp-idf/components/wpa_supplicant /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- +-- ╔═══════════════════════════════════════════════════════════╗ +-- ║ TianShanOS v0.5.2+3a19128d.09281801 ║ +-- ║ ESP32 Rack Management Operating System ║ +-- ╚═══════════════════════════════════════════════════════════╝ +-- +-- Version: 0.5.2+3a19128d.09281801 +-- Major: 0 +-- Minor: 5 +-- Patch: 2 +-- Build: 3a19128d.09281801 +-- +-- Target: esp32s3 +-- Build type: +-- +-- Configuring done (9.5s) +-- Generating done (2.3s) +-- Build files have been written to: /tmp/tianshan-ssh-stack-diagnostic/build +Running ninja in directory /private/tmp/tianshan-ssh-stack-diagnostic/build +Executing "ninja all"... +[1/1344] Generating project_elf_src_esp32s3.c +[2/1344] Generating ../../ota_data_initial.bin +[3/1344] Generating /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/esp_system/ld/memory.ld linker script... +[4/1344] Generating /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/esp_system/ld/sections.ld.in linker script... +[5/1344] Copying web assets to build directory +[6/1344] Generating ../../partition_table/partition-table.bin +Partition table binary generated. Contents: +******************************************************************************* +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs,data,nvs,0x9000,48K, +nvs_keys,data,nvs_keys,0x15000,4K, +otadata,data,ota,0x16000,8K, +phy_init,data,phy,0x18000,4K, +ota_0,app,ota_0,0x20000,3M, +ota_1,app,ota_1,0x320000,3M, +storage,data,spiffs,0x620000,512K, +www,data,spiffs,0x6a0000,3M, +fatfs,data,fat,0x9a0000,64K, +******************************************************************************* +[7/1344] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_utils.c.obj +[8/1344] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_header.c.obj +[9/1344] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_sess.c.obj +[10/1344] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/util/ctrl_sock.c.obj +[11/1344] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/lib/http_auth.c.obj +[12/1344] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_socks_proxy.c.obj +[13/1344] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_uri.c.obj +[14/1344] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/xip_impl/mmu_psram_flash.c.obj +[15/1344] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_ws.c.obj +[16/1344] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_txrx.c.obj +[17/1344] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport.c.obj +[18/1344] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/esp32s3/esp_psram_impl_octal.c.obj +[19/1344] Building C object esp-idf/esp_psram/CMakeFiles/__idf_esp_psram.dir/system_layer/esp_psram.c.obj +[20/1344] Building C object esp-idf/esp_https_ota/CMakeFiles/__idf_esp_https_ota.dir/src/esp_https_ota.c.obj +[21/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali.c.obj +[22/1344] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_internal.c.obj +[23/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_common.c.obj +[24/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_oneshot.c.obj +[25/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_cali_curve_fitting.c.obj +[26/1344] Linking C static library esp-idf/esp_https_ota/libesp_https_ota.a +[27/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp_adc_cal_common_legacy.c.obj +[28/1344] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_main.c.obj +[29/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/esp32s3/curve_fitting_coefficients.c.obj +[30/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/deprecated/esp32s3/esp_adc_cal_legacy.c.obj +[31/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/gdma/adc_dma.c.obj +[32/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_filter.c.obj +[33/1344] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_platform_port.c.obj +[34/1344] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp-tls-crypto/esp_tls_crypto.c.obj +[35/1344] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ssl.c.obj +[36/1344] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_error_capture.c.obj +[37/1344] Building C object esp-idf/esp_http_server/CMakeFiles/__idf_esp_http_server.dir/src/httpd_parse.c.obj +[38/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_monitor.c.obj +[39/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_dma_legacy.c.obj +[40/1344] Building C object esp-idf/esp_adc/CMakeFiles/__idf_esp_adc.dir/adc_continuous.c.obj +[41/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/adc_legacy.c.obj +[42/1344] Linking C static library esp-idf/esp_http_server/libesp_http_server.a +[43/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/sigma_delta_legacy.c.obj +[44/1344] Building C object esp-idf/tcp_transport/CMakeFiles/__idf_tcp_transport.dir/transport_ws.c.obj +[45/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rtc_temperature_legacy.c.obj +[46/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/touch_sensor_common.c.obj +[47/1344] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls.c.obj +[48/1344] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai.c.obj +[49/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/timer_legacy.c.obj +[50/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/pcnt_legacy.c.obj +[51/1344] Building C object esp-idf/esp-tls/CMakeFiles/__idf_esp-tls.dir/esp_tls_mbedtls.c.obj +[52/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/twai/twai.c.obj +[53/1344] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_common.c.obj +[54/1344] Building C object esp-idf/esp_http_client/CMakeFiles/__idf_esp_http_client.dir/esp_http_client.c.obj +[55/1344] Building C object esp-idf/http_parser/CMakeFiles/__idf_http_parser.dir/http_parser.c.obj +[56/1344] Building C object esp-idf/esp_driver_twai/CMakeFiles/__idf_esp_driver_twai.dir/esp_twai_onchip.c.obj +[57/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/i2s_legacy.c.obj +[58/1344] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_slave.c.obj +[59/1344] Building C object esp-idf/esp_driver_tsens/CMakeFiles/__idf_esp_driver_tsens.dir/src/temperature_sensor.c.obj +[60/1344] Building C object esp-idf/esp_driver_sdm/CMakeFiles/__idf_esp_driver_sdm.dir/src/sdm.c.obj +[61/1344] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder.c.obj +[62/1344] Linking C static library esp-idf/esp_http_client/libesp_http_client.a +[63/1344] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_crc.c.obj +[64/1344] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_common.c.obj +[65/1344] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_copy.c.obj +[66/1344] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_bytes.c.obj +[67/1344] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_transaction.c.obj +[68/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/i2c/i2c.c.obj +[69/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/touch_sensor/esp32s3/touch_sensor.c.obj +[70/1344] Linking C static library esp-idf/tcp_transport/libtcp_transport.a +[71/1344] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_encoder_simple.c.obj +[72/1344] Building C object esp-idf/esp_driver_sdspi/CMakeFiles/__idf_esp_driver_sdspi.dir/src/sdspi_host.c.obj +[73/1344] Building C object esp-idf/esp_driver_ledc/CMakeFiles/__idf_esp_driver_ledc.dir/src/ledc.c.obj +[74/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/mcpwm_legacy.c.obj +[75/1344] Building C object esp-idf/esp_driver_i2c/CMakeFiles/__idf_esp_driver_i2c.dir/i2c_master.c.obj +[76/1344] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_rx.c.obj +[77/1344] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_transaction.c.obj +[78/1344] Linking C static library esp-idf/esp_psram/libesp_psram.a +[79/1344] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sd_pwr_ctrl/sd_pwr_ctrl.c.obj +[80/1344] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_cmd.c.obj +[81/1344] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_common.c.obj +[82/1344] Building C object esp-idf/driver/CMakeFiles/__idf_driver.dir/deprecated/rmt_legacy.c.obj +[83/1344] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_init.c.obj +[84/1344] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_io.c.obj +[85/1344] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_platform.c.obj +[86/1344] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_std.c.obj +[87/1344] Linking C static library esp-idf/esp_adc/libesp_adc.a +[88/1344] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_sd.c.obj +[89/1344] Building C object esp-idf/sdmmc/CMakeFiles/__idf_sdmmc.dir/sdmmc_mmc.c.obj +[90/1344] Building C object esp-idf/esp_driver_rmt/CMakeFiles/__idf_esp_driver_rmt.dir/src/rmt_tx.c.obj +[91/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cmpr.c.obj +[92/1344] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_tdm.c.obj +[93/1344] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_common.c.obj +[94/1344] Building C object esp-idf/esp_driver_sdmmc/CMakeFiles/__idf_esp_driver_sdmmc.dir/src/sdmmc_host.c.obj +[95/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_com.c.obj +[96/1344] Linking C static library esp-idf/esp-tls/libesp-tls.a +[97/1344] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub-entry.S.obj +[98/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_sync.c.obj +[99/1344] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/gdbstub_xtensa.c.obj +[100/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_fault.c.obj +[101/1344] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub_transport.c.obj +[102/1344] Building ASM object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/port/xtensa/xt_debugexception.S.obj +[103/1344] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/gdbstub.c.obj +[104/1344] Linking C static library esp-idf/http_parser/libhttp_parser.a +[105/1344] Building C object esp-idf/esp_gdbstub/CMakeFiles/__idf_esp_gdbstub.dir/src/packet.c.obj +[106/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_gen.c.obj +[107/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_oper.c.obj +[108/1344] Building C object esp-idf/esp_driver_i2s/CMakeFiles/__idf_esp_driver_i2s.dir/i2s_pdm.c.obj +[109/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/lib_printf.c.obj +[110/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_timer.c.obj +[111/1344] Building C object esp-idf/esp_driver_pcnt/CMakeFiles/__idf_esp_driver_pcnt.dir/src/pulse_cnt.c.obj +[112/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig.c.obj +[113/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default_ap.c.obj +[114/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/mesh_event.c.obj +[115/1344] Building C object esp-idf/esp_driver_mcpwm/CMakeFiles/__idf_esp_driver_mcpwm.dir/src/mcpwm_cap.c.obj +[116/1344] Linking C static library esp-idf/driver/libdriver.a +[117/1344] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug_diagram.c.obj +[118/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_init.c.obj +[119/1344] Linking C static library esp-idf/esp_driver_twai/libesp_driver_twai.a +[120/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_default.c.obj +[121/1344] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/esp32s3/esp_coex_adapter.c.obj +[122/1344] Building C object esp-idf/esp_coex/CMakeFiles/__idf_esp_coex.dir/src/coexist_debug.c.obj +[123/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/esp32s3/esp_adapter.c.obj +[124/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/regulatory/esp_wifi_regulatory.c.obj +[125/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/os_xtensa.c.obj +[126/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/wifi_netif.c.obj +[127/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ap_config.c.obj +[128/1344] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave.c.obj +[129/1344] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_slave_hd.c.obj +[130/1344] Linking C static library esp-idf/esp_driver_ledc/libesp_driver_ledc.a +[131/1344] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_common.c.obj +[132/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/port/eloop.c.obj +[133/1344] Linking C static library esp-idf/esp_driver_i2c/libesp_driver_i2c.a +[134/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/bitfield.c.obj +[135/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_1x.c.obj +[136/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/ieee802_11.c.obj +[137/1344] Building C object esp-idf/esp_wifi/CMakeFiles/__idf_esp_wifi.dir/src/smartconfig_ack.c.obj +[138/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/sta_info.c.obj +[139/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth_ie.c.obj +[140/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/dragonfly.c.obj +[141/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/pmksa_cache_auth.c.obj +[142/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/comeback_token.c.obj +[143/1344] Building C object esp-idf/esp_driver_spi/CMakeFiles/__idf_esp_driver_spi.dir/src/gpspi/spi_master.c.obj +[144/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-siv.c.obj +[145/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-kdf.c.obj +[146/1344] Linking C static library esp-idf/esp_driver_sdm/libesp_driver_sdm.a +[147/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/wpa_common.c.obj +[148/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-gcm.c.obj +[149/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/crypto_ops.c.obj +[150/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ccmp.c.obj +[151/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tlsprf.c.obj +[152/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-tlsprf.c.obj +[153/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-prf.c.obj +[154/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_group5.c.obj +[155/1344] Linking C static library esp-idf/esp_driver_tsens/libesp_driver_tsens.a +[156/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-prf.c.obj +[157/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha384-prf.c.obj +[158/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/dh_groups.c.obj +[159/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha256-tlsprf.c.obj +[160/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/ms_funcs.c.obj +[161/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/ap/wpa_auth.c.obj +[162/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_common/eap_wsc_common.c.obj +[163/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/sha1-tprf.c.obj +[164/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/md4-internal.c.obj +[165/1344] Linking C static library esp-idf/esp_driver_rmt/libesp_driver_rmt.a +[166/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/chap.c.obj +[167/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_common.c.obj +[168/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap_common.c.obj +[169/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls.c.obj +[170/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/ieee802_11_common.c.obj +[171/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_mschapv2.c.obj +[172/1344] Linking C static library esp-idf/esp_driver_sdspi/libesp_driver_sdspi.a +[173/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_peap.c.obj +[174/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap.c.obj +[175/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/mschapv2.c.obj +[176/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_common.c.obj +[177/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae.c.obj +[178/1344] Linking C static library esp-idf/esp_driver_sdmmc/libesp_driver_sdmmc.a +[179/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/pmksa_cache.c.obj +[180/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/common.c.obj +[181/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa_ie.c.obj +[182/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/base64.c.obj +[183/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/ext_password.c.obj +[184/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/uuid.c.obj +[185/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_tls_common.c.obj +[186/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_ttls.c.obj +[187/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast_pac.c.obj +[188/1344] Linking C static library esp-idf/sdmmc/libsdmmc.a +[189/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpabuf.c.obj +[190/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/wpa_debug.c.obj +[191/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa2_api_port.c.obj +[192/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/utils/json.c.obj +[193/1344] Linking C static library esp-idf/esp_driver_i2s/libesp_driver_i2s.a +[194/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps.c.obj +[195/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_parse.c.obj +[196/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_process.c.obj +[197/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/eap_peer/eap_fast.c.obj +[198/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_attr_build.c.obj +[199/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_common.c.obj +[200/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_dev_attr.c.obj +[201/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_common.c.obj +[202/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa_main.c.obj +[203/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/common/sae_pk.c.obj +[204/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpas_glue.c.obj +[205/1344] Linking C static library esp-idf/esp_driver_mcpwm/libesp_driver_mcpwm.a +[206/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/rsn_supp/wpa.c.obj +[207/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_owe.c.obj +[208/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpsk.c.obj +[209/1344] Linking C static library esp-idf/esp_driver_pcnt/libesp_driver_pcnt.a +[210/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_eap_client.c.obj +[211/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/wps/wps_enrollee.c.obj +[212/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/rc4.c.obj +[213/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wpa3.c.obj +[214/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-unwrap.c.obj +[215/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-wrap.c.obj +[216/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_hostap.c.obj +[217/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/fastpbkdf2.c.obj +[218/1344] Linking C static library esp-idf/esp_gdbstub/libesp_gdbstub.a +[219/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/aes-ccm.c.obj +[220/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_defaults.c.obj +[221/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_objects.c.obj +[222/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-bignum.c.obj +[223/1344] Linking C static library esp-idf/esp_driver_spi/libesp_driver_spi.a +[224/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls.c.obj +[225/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/esp_wps.c.obj +[226/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/esp_netif_handlers.c.obj +[227/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/src/crypto/des-internal.c.obj +[228/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip_defaults.c.obj +[229/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/tls_mbedtls.c.obj +[230/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/esp_pbuf_ref.c.obj +[231/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-rsa.c.obj +[232/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/wlanif.c.obj +[233/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/netif/ethernetif.c.obj +[234/1344] Linking C static library esp-idf/esp_wifi/libesp_wifi.a +[235/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/err.c.obj +[236/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_sntp.c.obj +[237/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netbuf.c.obj +[238/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/sntp/sntp.c.obj +[239/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/if_api.c.obj +[240/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netifapi.c.obj +[241/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/netdb.c.obj +[242/1344] Linking C static library esp-idf/esp_coex/libesp_coex.a +[243/1344] Building C object esp-idf/wpa_supplicant/CMakeFiles/__idf_wpa_supplicant.dir/esp_supplicant/src/crypto/crypto_mbedtls-ec.c.obj +[244/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/def.c.obj +[245/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/netbiosns/netbiosns.c.obj +[246/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/apps/sntp/sntp.c.obj +[247/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/tcpip.c.obj +[248/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/inet_chksum.c.obj +[249/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/dns.c.obj +[250/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_lib.c.obj +[251/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/init.c.obj +[252/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ip.c.obj +[253/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/mem.c.obj +[254/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/memp.c.obj +[255/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/stats.c.obj +[256/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/sys.c.obj +[257/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/api_msg.c.obj +[258/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/raw.c.obj +[259/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/pbuf.c.obj +[260/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/netif.c.obj +[261/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/autoip.c.obj +[262/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/icmp.c.obj +[263/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_out.c.obj +[264/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/timeouts.c.obj +[265/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/udp.c.obj +[266/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp_in.c.obj +[267/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/api/sockets.c.obj +[268/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/tcp.c.obj +[269/1344] Linking C static library esp-idf/wpa_supplicant/libwpa_supplicant.a +[270/1344] Building C object esp-idf/esp_netif/CMakeFiles/__idf_esp_netif.dir/lwip/esp_netif_lwip.c.obj +[271/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4.c.obj +[272/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/dhcp6.c.obj +[273/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/igmp.c.obj +[274/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_addr.c.obj +[275/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/dhcp.c.obj +[276/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/inet6.c.obj +[277/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/etharp.c.obj +[278/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_frag.c.obj +[279/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv4/ip4_napt.c.obj +[280/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_frag.c.obj +[281/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif.c.obj +[282/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ethip6.c.obj +[283/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6_addr.c.obj +[284/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/auth.c.obj +[285/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ethernet.c.obj +[286/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/bridgeif_fdb.c.obj +[287/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/slipif.c.obj +[288/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap_ms.c.obj +[289/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ccp.c.obj +[290/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-new.c.obj +[291/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/icmp6.c.obj +[292/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ecp.c.obj +[293/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/chap-md5.c.obj +[294/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/demand.c.obj +[295/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eap.c.obj +[296/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/eui64.c.obj +[297/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/ip6.c.obj +[298/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/lcp.c.obj +[299/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/mld6.c.obj +[300/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/fsm.c.obj +[301/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipv6cp.c.obj +[302/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ipcp.c.obj +[303/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/ppp.c.obj +[304/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/mppe.c.obj +[305/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/multilink.c.obj +[306/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppapi.c.obj +[307/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/magic.c.obj +[308/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppoe.c.obj +[309/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/upap.c.obj +[310/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppcrypt.c.obj +[311/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppol2tp.c.obj +[312/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/pppos.c.obj +[313/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/utils.c.obj +[314/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/if_index.c.obj +[315/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/vj.c.obj +[316/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/des.c.obj +[317/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/freertos/sys_arch.c.obj +[318/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping_sock.c.obj +[319/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/lwip_default_hooks.c.obj +[320/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/debug/lwip_debug.c.obj +[321/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/sockets_ext.c.obj +[322/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/esp32xx/vfs_lwip.c.obj +[323/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/hooks/tcp_isn_default.c.obj +[324/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/esp_ping.c.obj +[325/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/ping/ping.c.obj +[326/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/port/acd_dhcp_check.c.obj +[327/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md4.c.obj +[328/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/md5.c.obj +[329/1344] Linking C static library esp-idf/esp_netif/libesp_netif.a +[330/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/sha1.c.obj +[331/1344] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_connection_monitor.c.obj +[332/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/netif/ppp/polarssl/arc4.c.obj +[333/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/lwip/src/core/ipv6/nd6.c.obj +[334/1344] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/nullfs.c.obj +[335/1344] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/lib_printf.c.obj +[336/1344] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/esp32s3/phy_init_data.c.obj +[337/1344] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_common.c.obj +[338/1344] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_override.c.obj +[339/1344] Building C object esp-idf/esp_vfs_console/CMakeFiles/__idf_esp_vfs_console.dir/vfs_console.c.obj +[340/1344] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_eventfd.c.obj +[341/1344] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag.c.obj +[342/1344] Building C object esp-idf/esp_driver_usb_serial_jtag/CMakeFiles/__idf_esp_driver_usb_serial_jtag.dir/src/usb_serial_jtag_vfs.c.obj +[343/1344] Building C object esp-idf/lwip/CMakeFiles/__idf_lwip.dir/apps/dhcpserver/dhcpserver.c.obj +[344/1344] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/btbb_init.c.obj +[345/1344] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs_semihost.c.obj +[346/1344] Building C object esp-idf/esp_phy/CMakeFiles/__idf_esp_phy.dir/src/phy_init.c.obj +[347/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_platform.cpp.obj +[348/1344] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader.c.obj +[349/1344] Building C object esp-idf/vfs/CMakeFiles/__idf_vfs.dir/vfs.c.obj +[350/1344] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_aes.c.obj +[351/1344] Building C object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_bootloader_xts_aes.c.obj +[352/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition.cpp.obj +[353/1344] Linking C static library esp-idf/lwip/liblwip.a +[354/1344] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/default_event_loop.c.obj +[355/1344] Linking C static library esp-idf/vfs/libvfs.a +[356/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_lookup.cpp.obj +[357/1344] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event_private.c.obj +[358/1344] Building C object esp-idf/esp_event/CMakeFiles/__idf_esp_event.dir/esp_event.c.obj +[359/1344] Linking C static library esp-idf/esp_vfs_console/libesp_vfs_console.a +[360/1344] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_wakeup.c.obj +[361/1344] Linking C static library esp-idf/esp_driver_usb_serial_jtag/libesp_driver_usb_serial_jtag.a +[362/1344] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uhci.c.obj +[363/1344] Linking C static library esp-idf/esp_phy/libesp_phy.a +[364/1344] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer.c.obj +[365/1344] Building C object esp-idf/esp_ringbuf/CMakeFiles/__idf_esp_ringbuf.dir/ringbuf.c.obj +[366/1344] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart_vfs.c.obj +[367/1344] Building C object esp-idf/esp_driver_gptimer/CMakeFiles/__idf_esp_driver_gptimer.dir/src/gptimer_common.c.obj +[368/1344] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_init.c.obj +[369/1344] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer.c.obj +[370/1344] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/ets_timer_legacy.c.obj +[371/1344] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/system_time.c.obj +[372/1344] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_common.c.obj +[373/1344] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_exception_stubs.cpp.obj +[374/1344] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_init.cpp.obj +[375/1344] Building C object esp-idf/esp_timer/CMakeFiles/__idf_esp_timer.dir/src/esp_timer_impl_systimer.c.obj +[376/1344] Building C object esp-idf/esp_driver_uart/CMakeFiles/__idf_esp_driver_uart.dir/src/uart.c.obj +[377/1344] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread.c.obj +[378/1344] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_cond_var.c.obj +[379/1344] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_local_storage.c.obj +[380/1344] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_rwlock.c.obj +[381/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/init.c.obj +[382/1344] Building C object esp-idf/pthread/CMakeFiles/__idf_pthread.dir/pthread_semaphore.c.obj +[383/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/abort.c.obj +[384/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/assert.c.obj +[385/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/heap.c.obj +[386/1344] Building CXX object esp-idf/cxx/CMakeFiles/__idf_cxx.dir/cxx_guards.cpp.obj +[387/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/poll.c.obj +[388/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/locks.c.obj +[389/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/pthread.c.obj +[390/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/random.c.obj +[391/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/getentropy.c.obj +[392/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/termios.c.obj +[393/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/sysconf.c.obj +[394/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/realpath.c.obj +[395/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/scandir.c.obj +[396/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/time.c.obj +[397/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/syscalls.c.obj +[398/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/esp_time_impl.c.obj +[399/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_syscalls.c.obj +[400/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/flockfile.c.obj +[401/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/reent_init.c.obj +[402/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/port/xtensa/stdatomic_s32c1i.c.obj +[403/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/newlib_init.c.obj +[404/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_common.c.obj +[405/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/app_startup.c.obj +[406/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/heap_idf.c.obj +[407/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/port_systick.c.obj +[408/1344] Building C object esp-idf/newlib/CMakeFiles/__idf_newlib.dir/src/stdatomic.c.obj +[409/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/list.c.obj +[410/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/event_groups.c.obj +[411/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/timers.c.obj +[412/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/stream_buffer.c.obj +[413/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/queue.c.obj +[414/1344] Building ASM object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/portasm.S.obj +[415/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_init.c.obj +[416/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/port.c.obj +[417/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_item_hash_list.cpp.obj +[418/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/portable/xtensa/xtensa_overlay_os_hook.c.obj +[419/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_pagemanager.cpp.obj +[420/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/freertos_compatibility.c.obj +[421/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_encrypted_partition.cpp.obj +[422/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_types.cpp.obj +[423/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_locked.cpp.obj +[424/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions_event_groups.c.obj +[425/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/esp_additions/idf_additions.c.obj +[426/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[427/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_handle_simple.cpp.obj +[428/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[429/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[430/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[431/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clk.c.obj +[432/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_ctrl_os.c.obj +[433/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mac_addr.c.obj +[434/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_gpio_reserve.c.obj +[435/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/revision.c.obj +[436/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/hw_random.c.obj +[437/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/regi2c_ctrl.c.obj +[438/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/periph_ctrl.c.obj +[439/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/rtc_module.c.obj +[440/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/intr_alloc.c.obj +[441/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_clk_tree.c.obj +[442/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/io_mux.c.obj +[443/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma_link.c.obj +[444/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sar_periph_ctrl_common.c.obj +[445/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_dma_utils.c.obj +[446/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/clk_utils.c.obj +[447/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_clk_tree_common.c.obj +[448/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_share_hw_ctrl.c.obj +[449/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_api.cpp.obj +[450/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_mspi.c.obj +[451/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_usb.c.obj +[452/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/adc_share_hw_ctrl.c.obj +[453/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_partition_manager.cpp.obj +[454/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modem.c.obj +[455/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_cxx_api.cpp.obj +[456/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_console.c.obj +[457/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_event.c.obj +[458/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/systimer.c.obj +[459/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/spi_bus_lock.c.obj +[460/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/esp_async_memcpy.c.obj +[461/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/deprecated/gdma_legacy.c.obj +[462/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/async_memcpy_gdma.c.obj +[463/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_page.cpp.obj +[464/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_gpio.c.obj +[465/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_wake_stub.c.obj +[466/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/mspi_timing_tuning.c.obj +[467/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/power_supply/brownout.c.obj +[468/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[469/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[470/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[471/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[472/1344] Building C object esp-idf/freertos/CMakeFiles/__idf_freertos.dir/FreeRTOS-Kernel/tasks.c.obj +[473/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_clock_output.c.obj +[474/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[475/1344] Building CXX object esp-idf/nvs_flash/CMakeFiles/__idf_nvs_flash.dir/src/nvs_storage.cpp.obj +[476/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/sar_periph_ctrl.c.obj +[477/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_config.c.obj +[478/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[479/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp_memprot_conv.c.obj +[480/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/sleep_modes.c.obj +[481/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[482/1344] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_lock.c.obj +[483/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[484/1344] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_hmac.c.obj +[485/1344] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/init.c.obj +[486/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[487/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[488/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[489/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/mspi_timing_tuning/port/esp32s3/mspi_timing_by_mspi_delay.c.obj +[490/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/lowpower/port/esp32s3/sleep_cpu.c.obj +[491/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[492/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[493/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[494/1344] Linking C static library esp-idf/nvs_flash/libnvs_flash.a +[495/1344] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_crypto_periph_clk.c.obj +[496/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[497/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[498/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/dma/gdma.c.obj +[499/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[500/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[501/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[502/1344] Building C object esp-idf/esp_security/CMakeFiles/__idf_esp_security.dir/src/esp_ds.c.obj +[503/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[504/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[505/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[506/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[507/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[508/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[509/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[510/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[511/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[512/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[513/1344] Linking C static library esp-idf/esp_event/libesp_event.a +[514/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[515/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[516/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[517/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[518/1344] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[519/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/esp32s3/memory_layout.c.obj +[520/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_timestamp.c.obj +[521/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/multi_heap_poisoning.c.obj +[522/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_lock.c.obj +[523/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_base.c.obj +[524/1344] Linking C static library esp-idf/esp_driver_uart/libesp_driver_uart.a +[525/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[526/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/port/memory_layout_utils.c.obj +[527/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps_init.c.obj +[528/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[529/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[530/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/multi_heap.c.obj +[531/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/heap_caps.c.obj +[532/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[533/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[534/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[535/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/log_level.c.obj +[536/1344] Building C object esp-idf/heap/CMakeFiles/__idf_heap.dir/tlsf/tlsf.c.obj +[537/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/log_write.c.obj +[538/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/os/util.c.obj +[539/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/linked_list/log_linked_list.c.obj +[540/1344] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_memprot.c.obj +[541/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[542/1344] Linking C static library esp-idf/esp_ringbuf/libesp_ringbuf.a +[543/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[544/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/cache/log_binary_heap.c.obj +[545/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[546/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/color_hal.c.obj +[547/1344] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_level/tag_log_level/tag_log_level.c.obj +[548/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[549/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[550/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_encrypt_hal_iram.c.obj +[551/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/systimer_hal.c.obj +[552/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal_iram.c.obj +[553/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gpio_hal.c.obj +[554/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[555/1344] Linking C static library esp-idf/esp_driver_gptimer/libesp_driver_gptimer.a +[556/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal.c.obj +[557/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/timer_hal.c.obj +[558/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uart_hal.c.obj +[559/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/clk_tree_hal.c.obj +[560/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rtc_io_hal.c.obj +[561/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal.c.obj +[562/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ledc_hal_iram.c.obj +[563/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal_iram.c.obj +[564/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/rmt_hal.c.obj +[565/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/pcnt_hal.c.obj +[566/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/uhci_hal.c.obj +[567/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_top.c.obj +[568/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2c_hal.c.obj +[569/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mcpwm_hal.c.obj +[570/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_iram.c.obj +[571/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdm_hal.c.obj +[572/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sdmmc_hal.c.obj +[573/1344] Linking C static library esp-idf/esp_timer/libesp_timer.a +[574/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal_common.c.obj +[575/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/twai_hal_v1.c.obj +[576/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/gdma_hal_ahb_v1.c.obj +[577/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/sha_hal.c.obj +[578/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_oneshot_hal.c.obj +[579/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/lcd_hal.c.obj +[580/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpi_hal.c.obj +[581/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/brownout_hal.c.obj +[582/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/aes_hal.c.obj +[583/1344] Linking C static library esp-idf/cxx/libcxx.a +[584/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal_iram.c.obj +[585/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hal.c.obj +[586/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hmac_hal.c.obj +[587/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/adc_hal.c.obj +[588/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_serial_jtag_hal.c.obj +[589/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/ds_hal.c.obj +[590/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal.c.obj +[591/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_slave_hd_hal.c.obj +[592/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_flash_hal_gpspi.c.obj +[593/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cam_hal.c.obj +[594/1344] Linking C static library esp-idf/pthread/libpthread.a +[595/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[596/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_wrap_hal.c.obj +[597/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/rtc_cntl_hal.c.obj +[598/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/i2s_hal.c.obj +[599/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/spi_hal_iram.c.obj +[600/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sensor_hal.c.obj +[601/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/touch_sens_hal.c.obj +[602/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/xt_wdt_hal.c.obj +[603/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[604/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[605/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[606/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/touch_sensor_hal.c.obj +[607/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[608/1344] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[609/1344] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[610/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[611/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[612/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[613/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[614/1344] Linking C static library esp-idf/newlib/libnewlib.a +[615/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system_console.c.obj +[616/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[617/1344] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/usb_dwc_hal.c.obj +[618/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/crosscore_int.c.obj +[619/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_ipc.c.obj +[620/1344] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[621/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_system.c.obj +[622/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup.c.obj +[623/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/stack_check.c.obj +[624/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/freertos_hooks.c.obj +[625/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/system_time.c.obj +[626/1344] Linking C static library esp-idf/freertos/libfreertos.a +[627/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/ubsan.c.obj +[628/1344] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_handler.S.obj +[629/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/int_wdt.c.obj +[630/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/xt_wdt.c.obj +[631/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/panic.c.obj +[632/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_port.c.obj +[633/1344] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/esp_ipc_isr_routines.S.obj +[634/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/image_process.c.obj +[635/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_system_chip.c.obj +[636/1344] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_handler_asm.S.obj +[637/1344] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack_asm.S.obj +[638/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/esp_ipc_isr.c.obj +[639/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/panic_handler.c.obj +[640/1344] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers_asm.S.obj +[641/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/expression_with_stack.c.obj +[642/1344] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[643/1344] Building ASM object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/highint_hdl.S.obj +[644/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_stubs.c.obj +[645/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/trax.c.obj +[646/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/startup_funcs.c.obj +[647/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt.c.obj +[648/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/task_wdt/task_wdt_impl_timergroup.c.obj +[649/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/panic_arch.c.obj +[650/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/reset_reason.c.obj +[651/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_brownout_hook.c.obj +[652/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/arch/xtensa/debug_helpers.c.obj +[653/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_drivers.c.obj +[654/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/apb_backup_dma.c.obj +[655/1344] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[656/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/system_internal.c.obj +[657/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_issi.c.obj +[658/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_gd.c.obj +[659/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_boya.c.obj +[660/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/cache_err_int.c.obj +[661/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_winbond.c.obj +[662/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_hpm_enable.c.obj +[663/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp32s3/spi_flash_oct_flash_init.c.obj +[664/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_th.c.obj +[665/1344] Linking C static library esp-idf/esp_security/libesp_security.a +[666/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic.c.obj +[667/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_mxic_opi.c.obj +[668/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[669/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/memspi_host_driver.c.obj +[670/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_mmap.c.obj +[671/1344] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/port/esp32s3/ext_mem_layout.c.obj +[672/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/cache_utils.c.obj +[673/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/cpu_start.c.obj +[674/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_noos.c.obj +[675/1344] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/port/soc/esp32s3/clk.c.obj +[676/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_os_func_app.c.obj +[677/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/flash_ops.c.obj +[678/1344] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/heap_align_hw.c.obj +[679/1344] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_utils.c.obj +[680/1344] Linking C static library esp-idf/soc/libsoc.a +[681/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[682/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[683/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[684/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[685/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[686/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[687/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[688/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[689/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_chip_generic.c.obj +[690/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_spi_init.c.obj +[691/1344] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_cache_msync.c.obj +[692/1344] Linking C static library esp-idf/heap/libheap.a +[693/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[694/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[695/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[696/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/secure_boot_secure_features.c.obj +[697/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[698/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[699/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[700/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[701/1344] Building C object esp-idf/esp_mm/CMakeFiles/__idf_esp_mm.dir/esp_mmu_map.c.obj +[702/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[703/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[704/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[705/1344] Linking C static library esp-idf/log/liblog.a +[706/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[707/1344] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[708/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[709/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/debug.c.obj +[710/1344] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/esp_flash_api.c.obj +[711/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[712/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_startup.c.obj +[713/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_reader.c.obj +[714/1344] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_app_desc.c.obj +[715/1344] Building C object esp-idf/esp_app_format/CMakeFiles/__idf_esp_app_format.dir/esp_app_desc.c.obj +[716/1344] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[717/1344] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition_target.c.obj +[718/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[719/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/mps_trace.c.obj +[720/1344] Building C object esp-idf/esp_partition/CMakeFiles/__idf_esp_partition.dir/partition.c.obj +[721/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_server.c.obj +[722/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_keys.c.obj +[723/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_client.c.obj +[724/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_debug_helpers_generated.c.obj +[725/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ciphersuites.c.obj +[726/1344] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[727/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls13_generic.c.obj +[728/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cookie.c.obj +[729/1344] Linking C static library esp-idf/hal/libhal.a +[730/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_cache.c.obj +[731/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/mbedtls_debug.c.obj +[732/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_platform_time.c.obj +[733/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_ticket.c.obj +[734/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_client.c.obj +[735/1344] Linking C static library esp-idf/esp_rom/libesp_rom.a +[736/1344] Building C object esp-idf/app_update/CMakeFiles/__idf_app_update.dir/esp_ota_ops.c.obj +[737/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/pkcs7.c.obj +[738/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_create.c.obj +[739/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write.c.obj +[740/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_csr.c.obj +[741/1344] Linking C static library esp-idf/esp_common/libesp_common.a +[742/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crl.c.obj +[743/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_csr.c.obj +[744/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesni.c.obj +[745/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aesce.c.obj +[746/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509write_crt.c.obj +[747/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aes.c.obj +[748/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/net_sockets.c.obj +[749/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_client.c.obj +[750/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod.c.obj +[751/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1write.c.obj +[752/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_mod_raw.c.obj +[753/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/aria.c.obj +[754/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/block_cipher.c.obj +[755/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/asn1parse.c.obj +[756/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/camellia.c.obj +[757/1344] Linking C static library esp-idf/esp_system/libesp_system.a +[758/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls12_server.c.obj +[759/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509.c.obj +[760/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/base64.c.obj +[761/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chachapoly.c.obj +[762/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/chacha20.c.obj +[763/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_msg.c.obj +[764/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/des.c.obj +[765/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/dhm.c.obj +[766/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/constant_time.c.obj +[767/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecjpake.c.obj +[768/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ccm.c.obj +[769/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher_wrap.c.obj +[770/1344] Linking C static library esp-idf/spi_flash/libspi_flash.a +[771/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cmac.c.obj +[772/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ctr_drbg.c.obj +[773/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves_new.c.obj +[774/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdh.c.obj +[775/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecdsa.c.obj +[776/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum_core.c.obj +[777/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy_poll.c.obj +[778/1344] Linking C static library esp-idf/esp_mm/libesp_mm.a +[779/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/entropy.c.obj +[780/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hkdf.c.obj +[781/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/error.c.obj +[782/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/hmac_drbg.c.obj +[783/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md5.c.obj +[784/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/memory_buffer_alloc.c.obj +[785/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lmots.c.obj +[786/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/nist_kw.c.obj +[787/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/lms.c.obj +[788/1344] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[789/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/padlock.c.obj +[790/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/md.c.obj +[791/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/cipher.c.obj +[792/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_ecc.c.obj +[793/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pem.c.obj +[794/1344] Linking C static library esp-idf/efuse/libefuse.a +[795/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/bignum.c.obj +[796/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs12.c.obj +[797/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform.c.obj +[798/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedx509.dir/x509_crt.c.obj +[799/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp_curves.c.obj +[800/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/platform_util.c.obj +[801/1344] Linking C static library esp-idf/esp_partition/libesp_partition.a +[802/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/poly1305.c.obj +[803/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/oid.c.obj +[804/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkcs5.c.obj +[805/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk.c.obj +[806/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/gcm.c.obj +[807/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pk_wrap.c.obj +[808/1344] Linking C static library esp-idf/app_update/libapp_update.a +[809/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_client.c.obj +[810/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkwrite.c.obj +[811/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_driver_wrappers_no_static.c.obj +[812/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ecp.c.obj +[813/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ffdh.c.obj +[814/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_pake.c.obj +[815/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_se.c.obj +[816/1344] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[817/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_mac.c.obj +[818/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_cipher.c.obj +[819/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_hash.c.obj +[820/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedtls.dir/ssl_tls.c.obj +[821/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_storage.c.obj +[822/1344] Linking C static library esp-idf/esp_app_format/libesp_app_format.a +[823/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/ripemd160.c.obj +[824/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_its_file.c.obj +[825/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/pkparse.c.obj +[826/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_aead.c.obj +[827/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_rsa.c.obj +[828/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha1.c.obj +[829/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_util.c.obj +[830/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_ecp.c.obj +[831/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa_alt_helpers.c.obj +[832/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha3.c.obj +[833/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/threading.c.obj +[834/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/timing.c.obj +[835/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha512.c.obj +[836/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version.c.obj +[837/1344] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedtls.a +[838/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/sha256.c.obj +[839/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/version_features.c.obj +[840/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha_gdma_impl.c.obj +[841/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto_slot_management.c.obj +[842/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_timing.c.obj +[843/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_gdma_impl.c.obj +[844/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_mem.c.obj +[845/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_xts.c.obj +[846/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hardware.c.obj +[847/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_common.c.obj +[848/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/esp_sha.c.obj +[849/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/crypto_shared_gdma/esp_crypto_shared_gdma.c.obj +[850/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_hmac_pbkdf2.c.obj +[851/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes.c.obj +[852/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/bignum_alt.c.obj +[853/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_dec_alt.c.obj +[854/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/md/esp_md.c.obj +[855/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha256.c.obj +[856/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_ds_common.c.obj +[857/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha1.c.obj +[858/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/bignum/esp_bignum.c.obj +[859/1344] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m/p256-m.c.obj +[860/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/sha.c.obj +[861/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/sha/core/esp_sha512.c.obj +[862/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/esp_ds/esp_rsa_sign_alt.c.obj +[863/1344] Building C object esp-idf/mbedtls/mbedtls/3rdparty/p256-m/CMakeFiles/p256m.dir/p256-m_driver_entrypoints.c.obj +[864/1344] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/x25519.c.obj +[865/1344] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedx509.a +[866/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/dma/esp_aes_dma_core.c.obj +[867/1344] Creating directories for 'bootloader' +[868/1344] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/everest.c.obj +[869/1344] Building C object esp-idf/mbedtls/mbedtls/3rdparty/everest/CMakeFiles/everest.dir/library/Hacl_Curve25519_joined.c.obj +[870/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/Users/massif/esp/v5.5.2/esp-idf/components/mbedtls/port/aes/esp_aes_gcm.c.obj +[871/1344] No download step for 'bootloader' +[872/1344] No update step for 'bootloader' +[873/1344] No patch step for 'bootloader' +[874/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/rsa.c.obj +[875/1344] Minifying + gzipping web resources +Minifying web resources in /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/ts_webui/web_optimized... + JS js/terminal.js: 31,108 -> 20,066 (35.5% saved) + JS js/router.js: 6,414 -> 3,839 (40.1% saved) + JS js/dragSort.js: 11,460 -> 7,603 (33.7% saved) + JS js/api.js: 36,638 -> 24,339 (33.6% saved) + JS js/i18n.js: 7,208 -> 4,320 (40.1% saved) + JS js/app.js: 1,129,944 -> 840,829 (25.6% saved) + JS js/lang/en-US.js: 178,439 -> 143,161 (19.8% saved) + JS js/lang/zh-CN.js: 172,046 -> 137,314 (20.2% saved) + CSS css/style.css: 179,071 -> 129,275 (27.8% saved) + CSS fonts/remixicon.css: 5,940 -> 4,860 (18.2% saved) + + Total saved: 442,662 bytes (432.3 KB) + +Gzipping web resources in /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/ts_webui/web_optimized... + GZ js/terminal.js: 20,066 -> 5,565 (72.3% smaller) + GZ js/router.js: 3,839 -> 1,340 (65.1% smaller) + GZ js/dragSort.js: 7,603 -> 1,869 (75.4% smaller) + GZ js/api.js: 24,339 -> 6,163 (74.7% smaller) + GZ js/i18n.js: 4,320 -> 1,460 (66.2% smaller) + GZ js/app.js: 840,829 -> 167,747 (80.0% smaller) + GZ js/lang/en-US.js: 143,161 -> 43,017 (70.0% smaller) + GZ js/lang/zh-CN.js: 137,314 -> 45,286 (67.0% smaller) + GZ vendor/xterm/fit.min.js: 1,789 -> 822 (54.1% smaller) + GZ vendor/xterm/xterm.min.js: 283,670 -> 65,684 (76.8% smaller) + GZ css/style.css: 129,275 -> 20,658 (84.0% smaller) + GZ fonts/remixicon.css: 4,860 -> 1,263 (74.0% smaller) + GZ vendor/xterm/xterm.css: 5,383 -> 2,037 (62.2% smaller) + GZ index.html: 26,676 -> 7,261 (72.8% smaller) + + Gzipped 14 files: 1,633,124 -> 370,172 (77.3% overall) +Done. +[876/1344] cd /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/ts_webui && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/spiffs/spiffsgen.py 0x300000 /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/ts_webui/web_optimized /tmp/tianshan-ssh-stack-diagnostic/build/www.bin --page-size=256 --obj-name-len=32 --meta-len=4 --use-magic --use-magic-len +[877/1344] Building C object esp-idf/mbedtls/mbedtls/library/CMakeFiles/mbedcrypto.dir/psa_crypto.c.obj +[878/1344] Linking CXX static library esp-idf/mbedtls/mbedtls/library/libmbedcrypto.a +[879/1344] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/p256-m/libp256m.a +[880/1344] Linking CXX static library esp-idf/mbedtls/mbedtls/3rdparty/everest/libeverest.a +[881/1344] Generating x509_crt_bundle +[882/1344] Generating ../../x509_crt_bundle.S +[883/1344] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[884/1344] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr_asm.S.obj +[885/1344] Building ASM object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/__/__/x509_crt_bundle.S.obj +[886/1344] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_context.S.obj +[887/1344] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[888/1344] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_locks.c.obj +[889/1344] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_trace.c.obj +[890/1344] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_glitch_filter_ops.c.obj +[891/1344] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_intr.c.obj +[892/1344] Building ASM object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xtensa_vectors.S.obj +[893/1344] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio_pin_glitch_filter.c.obj +[894/1344] Building C object esp-idf/esp_pm/CMakeFiles/__idf_esp_pm.dir/pm_impl.c.obj +[895/1344] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/crc32.cpp.obj +[896/1344] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/dedic_gpio.c.obj +[897/1344] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/Partition.cpp.obj +[898/1344] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/SPI_Flash.cpp.obj +[899/1344] Building C object esp-idf/mbedtls/CMakeFiles/__idf_mbedtls.dir/esp_crt_bundle/esp_crt_bundle.c.obj +[900/1344] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Safe.cpp.obj +[901/1344] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Ext_Perf.cpp.obj +[902/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/port/freertos/ffsystem.c.obj +[903/1344] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/wear_levelling.cpp.obj +[904/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_rawflash.c.obj +[905/1344] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/rtc_io.c.obj +[906/1344] Linking C static library esp-idf/mbedtls/libmbedtls.a +[907/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio.c.obj +[908/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_wl.c.obj +[909/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ffunicode.c.obj +[910/1344] Linking C static library esp-idf/esp_pm/libesp_pm.a +[911/1344] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_cache.c.obj +[912/1344] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs_api.c.obj +[913/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/diskio/diskio_sdmmc.c.obj +[914/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_spiflash.c.obj +[915/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/split_argv.c.obj +[916/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_internal.c.obj +[917/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_common.c.obj +[918/1344] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_check.c.obj +[919/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/commands.c.obj +[920/1344] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_gc.c.obj +[921/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat_sdmmc.c.obj +[922/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dbl.c.obj +[923/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/esp_console_repl_chip.c.obj +[924/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/linenoise/linenoise.c.obj +[925/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_cmd.c.obj +[926/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_end.c.obj +[927/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_dstr.c.obj +[928/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_file.c.obj +[929/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_lit.c.obj +[930/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_date.c.obj +[931/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rem.c.obj +[932/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_hashtable.c.obj +[933/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_str.c.obj +[934/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_int.c.obj +[935/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_utils.c.obj +[936/1344] Building CXX object esp-idf/wear_levelling/CMakeFiles/__idf_wear_levelling.dir/WL_Flash.cpp.obj +[937/1344] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_hydrogen.c.obj +[938/1344] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/esp_spiffs.c.obj +[939/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/vfs/vfs_fat.c.obj +[940/1344] Building C object esp-idf/esp_driver_gpio/CMakeFiles/__idf_esp_driver_gpio.dir/src/gpio.c.obj +[941/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/arg_rex.c.obj +[942/1344] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth_netif_glue.c.obj +[943/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/compress.c.obj +[944/1344] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_phy_w5500.c.obj +[945/1344] Linking C static library esp-idf/esp_driver_gpio/libesp_driver_gpio.a +[946/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/adler32.c.obj +[947/1344] Building C object esp-idf/console/CMakeFiles/__idf_console.dir/argtable3/argtable3.c.obj +[948/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/crc32.c.obj +[949/1344] Building C object esp-idf/ts_event/CMakeFiles/__idf_ts_event.dir/src/ts_event.c.obj +[950/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzclose.c.obj +[951/1344] Linking C static library esp-idf/xtensa/libxtensa.a +[952/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzlib.c.obj +[953/1344] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON_Utils.c.obj +[954/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzwrite.c.obj +[955/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/gzread.c.obj +[956/1344] Building C object esp-idf/spiffs/CMakeFiles/__idf_spiffs.dir/spiffs/src/spiffs_nucleus.c.obj +[957/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/infback.c.obj +[958/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inffast.c.obj +[959/1344] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/phy/esp_eth_phy_802_3.c.obj +[960/1344] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/esp_eth.c.obj +[961/1344] Linking C static library esp-idf/wear_levelling/libwear_levelling.a +[962/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/uncompr.c.obj +[963/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inftrees.c.obj +[964/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/zutil.c.obj +[965/1344] Linking C static library esp-idf/spiffs/libspiffs.a +[966/1344] Linking C static library esp-idf/ts_event/libts_event.a +[967/1344] Linking C static library esp-idf/console/libconsole.a +[968/1344] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_api.c.obj +[969/1344] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_encoder.c.obj +[970/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/deflate.c.obj +[971/1344] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_rmt_dev.c.obj +[972/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/example.c.obj +[973/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/trees.c.obj +[974/1344] Building C object esp-idf/esp_eth/CMakeFiles/__idf_esp_eth.dir/src/spi/w5500/esp_eth_mac_w5500.c.obj +[975/1344] Building C object esp-idf/espressif__esp_jpeg/CMakeFiles/__idf_espressif__esp_jpeg.dir/jpeg_decoder.c.obj +[976/1344] Building C object esp-idf/espressif__led_strip/CMakeFiles/__idf_espressif__led_strip.dir/src/led_strip_spi_dev.c.obj +[977/1344] Linking C static library esp-idf/esp_eth/libesp_eth.a +[978/1344] Building C object esp-idf/espressif__zlib/CMakeFiles/__idf_espressif__zlib.dir/zlib/inflate.c.obj +[979/1344] Building C object esp-idf/ts_log/CMakeFiles/__idf_ts_log.dir/src/ts_log.c.obj +[980/1344] Building C object esp-idf/json/CMakeFiles/__idf_json.dir/cJSON/cJSON.c.obj +[981/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrio.c.obj +[982/1344] Building C object esp-idf/fatfs/CMakeFiles/__idf_fatfs.dir/src/ff.c.obj +[983/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngmem.c.obj +[984/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngerror.c.obj +[985/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngpread.c.obj +[986/1344] Building C object esp-idf/esp_https_server/CMakeFiles/__idf_esp_https_server.dir/src/https_server.c.obj +[987/1344] Linking C static library esp-idf/json/libjson.a +[988/1344] Linking C static library esp-idf/espressif__zlib/libespressif__zlib.a +[989/1344] Linking C static library esp-idf/fatfs/libfatfs.a +[990/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwio.c.obj +[991/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtrans.c.obj +[992/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwtran.c.obj +[993/1344] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_mem_caps.c.obj +[994/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngget.c.obj +[995/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngtest.c.obj +[996/1344] Building C object esp-idf/ts_jsonpath/CMakeFiles/__idf_ts_jsonpath.dir/src/ts_jsonpath.c.obj +[997/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngset.c.obj +[998/1344] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_networking_lwip.c.obj +[999/1344] Building C object esp-idf/espressif__esp_websocket_client/CMakeFiles/__idf_espressif__esp_websocket_client.dir/esp_websocket_client.c.obj +[1000/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwrite.c.obj +[1001/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/png.c.obj +[1002/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent_win.c.obj +[1003/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/agent.c.obj +[1004/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngwutil.c.obj +[1005/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/blowfish.c.obj +[1006/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/bcrypt_pbkdf.c.obj +[1007/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/crypt.c.obj +[1008/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/comp.c.obj +[1009/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/global.c.obj +[1010/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/keepalive.c.obj +[1011/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngread.c.obj +[1012/1344] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns_console.c.obj +[1013/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/libgcrypt.c.obj +[1014/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/hostkey.c.obj +[1015/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/openssl.c.obj +[1016/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrutil.c.obj +[1017/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mac.c.obj +[1018/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/os400qc3.c.obj +[1019/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/knownhost.c.obj +[1020/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/misc.c.obj +[1021/1344] Building C object esp-idf/espressif__libpng/CMakeFiles/__idf_espressif__libpng.dir/libpng/pngrtran.c.obj +[1022/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/publickey.c.obj +[1023/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/packet.c.obj +[1024/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/mbedtls.c.obj +[1025/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/channel.c.obj +[1026/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/scp.c.obj +[1027/1344] Linking C static library esp-idf/ts_log/libts_log.a +[1028/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/transport.c.obj +[1029/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/version.c.obj +[1030/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth_kbd_packet.c.obj +[1031/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/pem.c.obj +[1032/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/wincng.c.obj +[1033/1344] Linking C static library esp-idf/esp_https_server/libesp_https_server.a +[1034/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/session.c.obj +[1035/1344] Building C object esp-idf/ts_mempool/CMakeFiles/__idf_ts_mempool.dir/src/ts_mempool.c.obj +[1036/1344] Linking C static library esp-idf/espressif__esp_websocket_client/libespressif__esp_websocket_client.a +[1037/1344] Linking C static library esp-idf/espressif__esp_jpeg/libespressif__esp_jpeg.a +[1038/1344] Linking C static library esp-idf/espressif__led_strip/libespressif__led_strip.a +[1039/1344] Linking C static library esp-idf/ts_jsonpath/libts_jsonpath.a +[1040/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/kex.c.obj +[1041/1344] Linking C static library esp-idf/espressif__libpng/libespressif__libpng.a +[1042/1344] Building C object esp-idf/ts_service/CMakeFiles/__idf_ts_service.dir/src/ts_service.c.obj +[1043/1344] Linking C static library esp-idf/ts_mempool/libts_mempool.a +[1044/1344] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_json.c.obj +[1045/1344] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_nvs.c.obj +[1046/1344] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_schemas.c.obj +[1047/1344] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert_time.c.obj +[1048/1344] Linking C static library esp-idf/ts_service/libts_service.a +[1049/1344] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_meta.c.obj +[1050/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_security.c.obj +[1051/1344] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_file.c.obj +[1052/1344] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config.c.obj +[1053/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_auth.c.obj +[1054/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/userauth.c.obj +[1055/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_client.c.obj +[1056/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_scp.c.obj +[1057/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_known_hosts.c.obj +[1058/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_sftp.c.obj +[1059/1344] Building C object esp-idf/ts_config/CMakeFiles/__idf_ts_config.dir/src/ts_config_module.c.obj +[1060/1344] Building C object esp-idf/ts_config_pack/CMakeFiles/__idf_ts_config_pack.dir/src/ts_config_pack.c.obj +[1061/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_probe.c.obj +[1062/1344] Building C object esp-idf/ch405labs_esp_libssh2/CMakeFiles/__idf_ch405labs_esp_libssh2.dir/libssh2/src/sftp.c.obj +[1063/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_log_watch.c.obj +[1064/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_port_forward.c.obj +[1065/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_shell.c.obj +[1066/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_crypto.c.obj +[1067/1344] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_variable.c.obj +[1068/1344] Linking C static library esp-idf/ch405labs_esp_libssh2/libch405labs_esp_libssh2.a +[1069/1344] Building C object esp-idf/ts_cert/CMakeFiles/__idf_ts_cert.dir/src/ts_cert.c.obj +[1070/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_hosts_config.c.obj +[1071/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_keystore.c.obj +[1072/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_service.c.obj +[1073/1344] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_automation.c.obj +[1074/1344] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_codec.c.obj +[1075/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_compat.c.obj +[1076/1344] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_store.c.obj +[1077/1344] Building C object esp-idf/ts_security/CMakeFiles/__idf_ts_security.dir/src/ts_ssh_commands_config.c.obj +[1078/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_cache.c.obj +[1079/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_runner.c.obj +[1080/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_freertos.c.obj +[1081/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_utils_memory.c.obj +[1082/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity_port_esp32.c.obj +[1083/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/port/esp/unity_utils_memory_esp.c.obj +[1084/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/constants.pb-c.c.obj +[1085/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/session.pb-c.c.obj +[1086/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/common/protocomm.c.obj +[1087/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec1.pb-c.c.obj +[1088/1344] Building C object esp-idf/unity/CMakeFiles/__idf_unity.dir/unity/src/unity.c.obj +[1089/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec0.pb-c.c.obj +[1090/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_console.c.obj +[1091/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/transports/protocomm_httpd.c.obj +[1092/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/proto-c/sec2.pb-c.c.obj +[1093/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security0.c.obj +[1094/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp_mpi.c.obj +[1095/1344] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/host_file_io.c.obj +[1096/1344] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace_util.c.obj +[1097/1344] Building C object esp-idf/cmock/CMakeFiles/__idf_cmock.dir/CMock/src/cmock.c.obj +[1098/1344] Linking C static library esp-idf/unity/libunity.a +[1099/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/crypto/srp6a/esp_srp.c.obj +[1100/1344] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/port/port_uart.c.obj +[1101/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security1.c.obj +[1102/1344] Building C object esp-idf/app_trace/CMakeFiles/__idf_app_trace.dir/app_trace.c.obj +[1103/1344] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp_share_ctrl.c.obj +[1104/1344] Building C object esp-idf/protocomm/CMakeFiles/__idf_protocomm.dir/src/security/security2.c.obj +[1105/1344] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/esp_cam_ctlr.c.obj +[1106/1344] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_gdma.c.obj +[1107/1344] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidd.c.obj +[1108/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_io.c.obj +[1109/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_common.c.obj +[1110/1344] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hid_common.c.obj +[1111/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ssd1306.c.obj +[1112/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_nt35510.c.obj +[1113/1344] Building C object esp-idf/esp_hid/CMakeFiles/__idf_esp_hid.dir/src/esp_hidh.c.obj +[1114/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_ops.c.obj +[1115/1344] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/hw_ver2/touch_version_specific.c.obj +[1116/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/src/esp_lcd_panel_st7789.c.obj +[1117/1344] Building C object esp-idf/protobuf-c/CMakeFiles/__idf_protobuf-c.dir/protobuf-c/protobuf-c/protobuf-c.c.obj +[1118/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v2.c.obj +[1119/1344] Building C object esp-idf/espressif__mdns/CMakeFiles/__idf_espressif__mdns.dir/mdns.c.obj +[1120/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i2c/esp_lcd_panel_io_i2c_v1.c.obj +[1121/1344] Building C object esp-idf/esp_driver_touch_sens/CMakeFiles/__idf_esp_driver_touch_sens.dir/common/touch_sens_common.c.obj +[1122/1344] Linking C static library esp-idf/protobuf-c/libprotobuf-c.a +[1123/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_init.c.obj +[1124/1344] Building C object esp-idf/esp_driver_cam/CMakeFiles/__idf_esp_driver_cam.dir/dvp/src/esp_cam_ctlr_dvp_cam.c.obj +[1125/1344] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_rule_engine.c.obj +[1126/1344] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/proto-c/esp_local_ctrl.pb-c.c.obj +[1127/1344] Linking C static library esp-idf/espressif__mdns/libespressif__mdns.a +[1128/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/spi/esp_lcd_panel_io_spi.c.obj +[1129/1344] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_handler.c.obj +[1130/1344] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl_transport_httpd.c.obj +[1131/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_common.c.obj +[1132/1344] Building C object esp-idf/esp_local_ctrl/CMakeFiles/__idf_esp_local_ctrl.dir/src/esp_local_ctrl.c.obj +[1133/1344] Linking C static library esp-idf/protocomm/libprotocomm.a +[1134/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_sha.c.obj +[1135/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_uart.c.obj +[1136/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_crc.c.obj +[1137/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_binary.c.obj +[1138/1344] Linking C static library esp-idf/ts_config/libts_config.a +[1139/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_elf.c.obj +[1140/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/core_dump_flash.c.obj +[1141/1344] Building C object esp-idf/espcoredump/CMakeFiles/__idf_espcoredump.dir/src/port/xtensa/core_dump_port.c.obj +[1142/1344] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_masks.c.obj +[1143/1344] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_access.c.obj +[1144/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/i80/esp_lcd_panel_io_i80.c.obj +[1145/1344] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/platform_esp32_idf.c.obj +[1146/1344] Building C object esp-idf/perfmon/CMakeFiles/__idf_perfmon.dir/xtensa_perfmon_apis.c.obj +[1147/1344] Linking C static library esp-idf/ts_config_pack/libts_config_pack.a +[1148/1344] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_source_manager.c.obj +[1149/1344] Building C object esp-idf/ts_automation/CMakeFiles/__idf_ts_automation.dir/src/ts_action_manager.c.obj +[1150/1344] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_msg.c.obj +[1151/1344] Building C object esp-idf/nvs_sec_provider/CMakeFiles/__idf_nvs_sec_provider.dir/nvs_sec_provider.c.obj +[1152/1344] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/lib/mqtt_outbox.c.obj +[1153/1344] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_mqueue.c.obj +[1154/1344] Linking C static library esp-idf/ts_cert/libts_cert.a +[1155/1344] Building C object esp-idf/esp_lcd/CMakeFiles/__idf_esp_lcd.dir/rgb/esp_lcd_panel_rgb.c.obj +[1156/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_private.c.obj +[1157/1344] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_button.c.obj +[1158/1344] Building C object esp-idf/rt/CMakeFiles/__idf_rt.dir/FreeRTOS_POSIX_utils.c.obj +[1159/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_helpers.c.obj +[1160/1344] Linking C static library esp-idf/ts_security/libts_security.a +[1161/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hub.c.obj +[1162/1344] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_matrix.c.obj +[1163/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_config.c.obj +[1164/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_scan.c.obj +[1165/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/wifi_ctrl.c.obj +[1166/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/enum.c.obj +[1167/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_phy.c.obj +[1168/1344] Linking C static library esp-idf/ts_automation/libts_automation.a +[1169/1344] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_element.c.obj +[1170/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/handlers.c.obj +[1171/1344] Building C object esp-idf/touch_element/CMakeFiles/__idf_touch_element.dir/touch_slider.c.obj +[1172/1344] Generating ../../lpmu-agx-network-setup.tar.gz.S +[1173/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_scan.pb-c.c.obj +[1174/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_console.c.obj +[1175/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_constants.pb-c.c.obj +[1176/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_config.pb-c.c.obj +[1177/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usb_host.c.obj +[1178/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/proto-c/wifi_ctrl.pb-c.c.obj +[1179/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/scheme_softap.c.obj +[1180/1344] Linking C static library esp-idf/cmock/libcmock.a +[1181/1344] Linking C static library esp-idf/app_trace/libapp_trace.a +[1182/1344] Linking C static library esp-idf/esp_driver_cam/libesp_driver_cam.a +[1183/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/usbh.c.obj +[1184/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api.c.obj +[1185/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config.c.obj +[1186/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_fan.c.obj +[1187/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_service.c.obj +[1188/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_power.c.obj +[1189/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_network.c.obj +[1190/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_temp.c.obj +[1191/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_config_pack.c.obj +[1192/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_storage.c.obj +[1193/1344] Building C object esp-idf/usb/CMakeFiles/__idf_usb.dir/hcd_dwc.c.obj +[1194/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_monitor.c.obj +[1195/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_gpio.c.obj +[1196/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_system.c.obj +[1197/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_nat.c.obj +[1198/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_dhcp.c.obj +[1199/1344] Building C object esp-idf/wifi_provisioning/CMakeFiles/__idf_wifi_provisioning.dir/src/manager.c.obj +[1200/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_hosts.c.obj +[1201/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_device.c.obj +[1202/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_led.c.obj +[1203/1344] Building C object esp-idf/mqtt/CMakeFiles/__idf_mqtt.dir/esp-mqtt/mqtt_client.c.obj +[1204/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_key.c.obj +[1205/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_wifi.c.obj +[1206/1344] Building ASM object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/__/__/lpmu-agx-network-setup.tar.gz.S.obj +[1207/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_lpmu_access.c.obj +[1208/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_log.c.obj +[1209/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_auth.c.obj +[1210/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_sftp.c.obj +[1211/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_time.c.obj +[1212/1344] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_api.c.obj +[1213/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ui.c.obj +[1214/1344] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui.c.obj +[1215/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_cert.c.obj +[1216/1344] Performing configure step for 'bootloader' +-- Found Git: /opt/homebrew/bin/git (found version "2.51.0") +-- Minimal build - OFF +-- The C compiler identification is GNU 14.2.0 +-- The CXX compiler identification is GNU 14.2.0 +-- The ASM compiler identification is GNU +-- Found assembler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working C compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc - skipped +-- Detecting C compile features +-- Detecting C compile features - done +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Check for working CXX compiler: /Users/massif/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20251107/xtensa-esp-elf/bin/xtensa-esp32s3-elf-g++ - skipped +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Building ESP-IDF components for target esp32s3 +-- ESP-TEE is currently supported only on the esp32c6;esp32h2;esp32c5 SoCs +-- Project sdkconfig file /tmp/tianshan-ssh-stack-diagnostic/sdkconfig +-- Compiler supported targets: xtensa-esp-elf +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/soc/esp32s3/ld/esp32s3.peripherals.ld +-- Bootloader project name: "bootloader" version: 1 +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.api.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.bt_funcs.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libgcc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.wdt.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.version.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.libc.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom/esp32s3/ld/esp32s3.rom.newlib.ld +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.rom.ld +-- Components: bootloader bootloader_support efuse esp_app_format esp_bootloader_format esp_common esp_hw_support esp_rom esp_security esp_system esptool_py freertos hal log main micro-ecc newlib partition_table soc spi_flash xtensa +-- Component paths: /Users/massif/esp/v5.5.2/esp-idf/components/bootloader /Users/massif/esp/v5.5.2/esp-idf/components/bootloader_support /Users/massif/esp/v5.5.2/esp-idf/components/efuse /Users/massif/esp/v5.5.2/esp-idf/components/esp_app_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_bootloader_format /Users/massif/esp/v5.5.2/esp-idf/components/esp_common /Users/massif/esp/v5.5.2/esp-idf/components/esp_hw_support /Users/massif/esp/v5.5.2/esp-idf/components/esp_rom /Users/massif/esp/v5.5.2/esp-idf/components/esp_security /Users/massif/esp/v5.5.2/esp-idf/components/esp_system /Users/massif/esp/v5.5.2/esp-idf/components/esptool_py /Users/massif/esp/v5.5.2/esp-idf/components/freertos /Users/massif/esp/v5.5.2/esp-idf/components/hal /Users/massif/esp/v5.5.2/esp-idf/components/log /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/components/micro-ecc /Users/massif/esp/v5.5.2/esp-idf/components/newlib /Users/massif/esp/v5.5.2/esp-idf/components/partition_table /Users/massif/esp/v5.5.2/esp-idf/components/soc /Users/massif/esp/v5.5.2/esp-idf/components/spi_flash /Users/massif/esp/v5.5.2/esp-idf/components/xtensa +-- Adding linker script /Users/massif/esp/v5.5.2/esp-idf/components/bootloader/subproject/main/ld/esp32s3/bootloader.ld +-- Configuring done (4.5s) +-- Generating done (0.2s) +-- Build files have been written to: /tmp/tianshan-ssh-stack-diagnostic/build/bootloader +[1217/1344] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https.c.obj +[1218/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_i18n.c.obj +[1219/1344] Building C object esp-idf/ts_https/CMakeFiles/__idf_ts_https.dir/src/ts_https_auth.c.obj +[1220/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_args.c.obj +[1221/1344] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_api.c.obj +[1222/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ota.c.obj +[1223/1344] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_operation.c.obj +[1224/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console.c.obj +[1225/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_script.c.obj +[1226/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/src/ts_console_builtin.c.obj +[1227/1344] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_subscriptions.c.obj +[1228/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/linenoise/linenoise.c.obj +[1229/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_monitor.c.obj +[1230/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_auto.c.obj +[1231/1344] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_ws_transport.c.obj +[1232/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fan.c.obj +[1233/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_device.c.obj +[1234/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_hosts.c.obj +[1235/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_gpio.c.obj +[1236/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_config.c.obj +[1237/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_nat.c.obj +[1238/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_fs.c.obj +[1239/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_dhcp.c.obj +[1240/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_ssh.c.obj +[1241/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_key.c.obj +[1242/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_register.c.obj +[1243/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_net.c.obj +[1244/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ota.c.obj +[1245/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_pki.c.obj +[1246/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_service.c.obj +[1247/1344] Building C object esp-idf/ts_webui/CMakeFiles/__idf_ts_webui.dir/src/ts_webui_ws.c.obj +[1248/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_power.c.obj +[1249/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_sftp.c.obj +[1250/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_voltprot.c.obj +[1251/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota.c.obj +[1252/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_version.c.obj +[1253/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_system.c.obj +[1254/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_rollback.c.obj +[1255/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_temp.c.obj +[1256/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_sdcard.c.obj +[1257/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_wifi.c.obj +[1258/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_storage.c.obj +[1259/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_ssh.c.obj +[1260/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_recovery.c.obj +[1261/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_https.c.obj +[1262/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net.c.obj +[1263/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_wifi.c.obj +[1264/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_www.c.obj +[1265/1344] Building C object esp-idf/ts_ota/CMakeFiles/__idf_ts_ota.dir/src/ts_ota_download.c.obj +[1266/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_nat.c.obj +[1267/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_eth.c.obj +[1268/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_driver.c.obj +[1269/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_http_server.c.obj +[1270/1344] Building C object esp-idf/ts_console/CMakeFiles/__idf_ts_console.dir/commands/ts_cmd_led.c.obj +[1271/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_time_sync.c.obj +[1272/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led.c.obj +[1273/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_layer.c.obj +[1274/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color.c.obj +[1275/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_net_manager.c.obj +[1276/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_https_server.c.obj +[1277/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_qrcode.c.obj +[1278/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_animation.c.obj +[1279/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_drivers.c.obj +[1280/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_font.c.obj +[1281/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_color_correction.c.obj +[1282/1344] Building C object esp-idf/ts_net/CMakeFiles/__idf_ts_net.dir/src/ts_dhcp_server.c.obj +[1283/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power.c.obj +[1284/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_monitor.c.obj +[1285/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_usb_mux.c.obj +[1286/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_effect.c.obj +[1287/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_preset.c.obj +[1288/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_hal.c.obj +[1289/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/qrcodegen/qrcodegen.c.obj +[1290/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_text.c.obj +[1291/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_gpio.c.obj +[1292/1344] Building C object esp-idf/ts_api/CMakeFiles/__idf_ts_api.dir/src/ts_api_automation.c.obj +[1293/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pin_manager.c.obj +[1294/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_fan.c.obj +[1295/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_device_ctrl.c.obj +[1296/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_i2c.c.obj +[1297/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/platform/esp32s3/ts_platform_s3.c.obj +[1298/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_power_policy.c.obj +[1299/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_pwm.c.obj +[1300/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_uart.c.obj +[1301/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_temp_source.c.obj +[1302/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_adc.c.obj +[1303/1344] Building C object esp-idf/ts_drivers/CMakeFiles/__idf_ts_drivers.dir/src/ts_compute_monitor.c.obj +[1304/1344] Linking C static library esp-idf/esp_driver_touch_sens/libesp_driver_touch_sens.a +[1305/1344] Building C object esp-idf/ts_led/CMakeFiles/__idf_ts_led.dir/src/ts_led_image.c.obj +[1306/1344] Linking C static library esp-idf/esp_hid/libesp_hid.a +[1307/1344] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_spiffs.c.obj +[1308/1344] Linking C static library esp-idf/ts_api/libts_api.a +[1309/1344] Linking C static library esp-idf/esp_local_ctrl/libesp_local_ctrl.a +[1310/1344] Building C object esp-idf/ts_hal/CMakeFiles/__idf_ts_hal.dir/src/ts_spi.c.obj +[1311/1344] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_core_init.c.obj +[1312/1344] Linking C static library esp-idf/espcoredump/libespcoredump.a +[1313/1344] Linking C static library esp-idf/rt/librt.a +[1314/1344] Linking C static library esp-idf/nvs_sec_provider/libnvs_sec_provider.a +[1315/1344] Linking C static library esp-idf/perfmon/libperfmon.a +[1316/1344] Linking C static library esp-idf/mqtt/libmqtt.a +[1317/1344] Linking C static library esp-idf/esp_lcd/libesp_lcd.a +[1318/1344] Linking C static library esp-idf/touch_element/libtouch_element.a +[1319/1344] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage.c.obj +[1320/1344] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/main.c.obj +[1321/1344] Linking C static library esp-idf/ts_https/libts_https.a +[1322/1344] Building C object esp-idf/ts_storage/CMakeFiles/__idf_ts_storage.dir/src/ts_storage_sd.c.obj +[1323/1344] Linking C static library esp-idf/usb/libusb.a +[1324/1344] Linking C static library esp-idf/wifi_provisioning/libwifi_provisioning.a +[1325/1344] Linking C static library esp-idf/ts_webui/libts_webui.a +[1326/1344] Building C object esp-idf/ts_pki_client/CMakeFiles/__idf_ts_pki_client.dir/src/ts_pki_client.c.obj +[1327/1344] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/ts_services.c.obj +[1328/1344] Linking C static library esp-idf/ts_console/libts_console.a +[1329/1344] Linking C static library esp-idf/ts_ota/libts_ota.a +[1330/1344] Linking C static library esp-idf/ts_net/libts_net.a +[1331/1344] Linking C static library esp-idf/ts_led/libts_led.a +[1332/1344] Linking C static library esp-idf/ts_drivers/libts_drivers.a +[1333/1344] Linking C static library esp-idf/ts_hal/libts_hal.a +[1334/1344] Linking C static library esp-idf/ts_storage/libts_storage.a +[1335/1344] Linking C static library esp-idf/ts_pki_client/libts_pki_client.a +[1336/1344] Linking C static library esp-idf/main/libmain.a +[1337/1344] Performing build step for 'bootloader' +[1/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/util.c.obj +[2/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/util.c.obj +[3/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_lock.c.obj +[4/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_crc.c.obj +[5/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/buffer/log_buffers.c.obj +[6/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/noos/log_timestamp.c.obj +[7/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_efuse.c.obj +[8/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_print.c.obj +[9/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_gpio.c.obj +[10/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_format_text.c.obj +[11/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log_timestamp_common.c.obj +[12/123] Building C object esp-idf/log/CMakeFiles/__idf_log.dir/src/log.c.obj +[13/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_uart.c.obj +[14/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_sys.c.obj +[15/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_longjmp.S.obj +[16/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_spiflash.c.obj +[17/123] Building ASM object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_writeback_esp32s3.S.obj +[18/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_wdt.c.obj +[19/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_systimer.c.obj +[20/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_cache_esp32s2_esp32s3.c.obj +[21/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/cpu_region_protect.c.obj +[22/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/esp_memory_utils.c.obj +[23/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/cpu.c.obj +[24/123] Building C object esp-idf/esp_common/CMakeFiles/__idf_esp_common.dir/src/esp_err_to_name.c.obj +[25/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/esp_cpu_intr.c.obj +[26/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/chip_info.c.obj +[27/123] Linking C static library esp-idf/log/liblog.a +[28/123] Building C object esp-idf/esp_system/CMakeFiles/__idf_esp_system.dir/esp_err.c.obj +[29/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk_init.c.obj +[30/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_table.c.obj +[31/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_time.c.obj +[32/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_fields.c.obj +[33/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_rtc_calib.c.obj +[34/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_fields.c.obj +[35/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/esp32s3/esp_efuse_utility.c.obj +[36/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_sleep.c.obj +[37/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_api.c.obj +[38/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_mem.c.obj +[39/123] Building C object esp-idf/esp_rom/CMakeFiles/__idf_esp_rom.dir/patches/esp_rom_print.c.obj +[40/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_init.c.obj +[41/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_init.c.obj +[42/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_efuse.c.obj +[43/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random.c.obj +[44/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/secure_boot.c.obj +[45/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_random_esp32s3.c.obj +[46/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common.c.obj +[47/123] Building C object esp-idf/esp_hw_support/CMakeFiles/__idf_esp_hw_support.dir/port/esp32s3/rtc_clk.c.obj +[48/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_common_loader.c.obj +[49/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_encrypt.c.obj +[50/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/efuse_controller/keys/with_key_purposes/esp_efuse_api_key.c.obj +[51/123] Linking C static library esp-idf/esp_rom/libesp_rom.a +[52/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash_config_esp32s3.c.obj +[53/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_clock_loader.c.obj +[54/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/flash_qio_mode.c.obj +[55/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/flash_partitions.c.obj +[56/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_sha.c.obj +[57/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_soc.c.obj +[58/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console_loader.c.obj +[59/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_console.c.obj +[60/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_panic.c.obj +[61/123] Building C object esp-idf/efuse/CMakeFiles/__idf_efuse.dir/src/esp_efuse_utility.c.obj +[62/123] Linking C static library esp-idf/esp_common/libesp_common.a +[63/123] Building C object esp-idf/esp_bootloader_format/CMakeFiles/__idf_esp_bootloader_format.dir/esp_bootloader_desc.c.obj +[64/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mpu_hal.c.obj +[65/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/lldesc.c.obj +[66/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/efuse_hal.c.obj +[67/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/hal_utils.c.obj +[68/123] Building C object esp-idf/spi_flash/CMakeFiles/__idf_spi_flash.dir/spi_flash_wrap.c.obj +[69/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/esp32s3/efuse_hal.c.obj +[70/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/mmu_hal.c.obj +[71/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/dport_access_common.c.obj +[72/123] Building C object esp-idf/hal/CMakeFiles/__idf_hal.dir/cache_hal.c.obj +[73/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/interrupts.c.obj +[74/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_init.c.obj +[75/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp32s3/bootloader_esp32s3.c.obj +[76/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gpio_periph.c.obj +[77/123] Linking C static library esp-idf/esp_hw_support/libesp_hw_support.a +[78/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/uart_periph.c.obj +[79/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/dedic_gpio_periph.c.obj +[80/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/gdma_periph.c.obj +[81/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/adc_periph.c.obj +[82/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/ledc_periph.c.obj +[83/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdm_periph.c.obj +[84/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/bootloader_flash/src/bootloader_flash.c.obj +[85/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/spi_periph.c.obj +[86/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rmt_periph.c.obj +[87/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/pcnt_periph.c.obj +[88/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2s_periph.c.obj +[89/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/lcd_periph.c.obj +[90/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/i2c_periph.c.obj +[91/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/temperature_sensor_periph.c.obj +[92/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/timer_periph.c.obj +[93/123] Linking C static library esp-idf/esp_system/libesp_system.a +[94/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/touch_sensor_periph.c.obj +[95/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/twai_periph.c.obj +[96/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mcpwm_periph.c.obj +[97/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/mpi_periph.c.obj +[98/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/sdmmc_periph.c.obj +[99/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/usb_dwc_periph.c.obj +[100/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/power_supply_periph.c.obj +[101/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/wdt_periph.c.obj +[102/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/rtc_io_periph.c.obj +[103/123] Generating project_elf_src_esp32s3.c +[104/123] Building C object esp-idf/soc/CMakeFiles/__idf_soc.dir/esp32s3/cam_periph.c.obj +[105/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/eri.c.obj +[106/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/bootloader_utility.c.obj +[107/123] Building C object esp-idf/xtensa/CMakeFiles/__idf_xtensa.dir/xt_trax.c.obj +[108/123] Building C object esp-idf/bootloader_support/CMakeFiles/__idf_bootloader_support.dir/src/esp_image_format.c.obj +[109/123] Building C object CMakeFiles/bootloader.elf.dir/project_elf_src_esp32s3.c.obj +[110/123] Building C object esp-idf/main/CMakeFiles/__idf_main.dir/bootloader_start.c.obj +[111/123] Linking C static library esp-idf/efuse/libefuse.a +[112/123] Linking C static library esp-idf/bootloader_support/libbootloader_support.a +[113/123] Linking C static library esp-idf/esp_bootloader_format/libesp_bootloader_format.a +[114/123] Linking C static library esp-idf/spi_flash/libspi_flash.a +[115/123] Building C object esp-idf/micro-ecc/CMakeFiles/__idf_micro-ecc.dir/uECC_verify_antifault.c.obj +[116/123] Linking C static library esp-idf/hal/libhal.a +[117/123] Linking C static library esp-idf/micro-ecc/libmicro-ecc.a +[118/123] Linking C static library esp-idf/soc/libsoc.a +[119/123] Linking C static library esp-idf/xtensa/libxtensa.a +[120/123] Linking C static library esp-idf/main/libmain.a +[121/123] Linking C executable bootloader.elf +[122/123] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-ssh-stack-diagnostic/build/bootloader/bootloader.bin +[123/123] cd /tmp/tianshan-ssh-stack-diagnostic/build/bootloader/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 bootloader 0x0 /tmp/tianshan-ssh-stack-diagnostic/build/bootloader/bootloader.bin +Bootloader binary size 0x57e0 bytes. 0x2820 bytes (31%) free. +[1338/1344] No install step for 'bootloader' +[1339/1344] Completed 'bootloader' +[1340/1344] Generating esp-idf/esp_system/ld/sections.ld +[1341/1344] Building C object CMakeFiles/TianShanOS.elf.dir/project_elf_src_esp32s3.c.obj +[1342/1344] Linking CXX executable TianShanOS.elf +[1343/1344] Generating binary image from built executable +esptool.py v4.12.dev2 +Creating esp32s3 image... +Merged 2 ELF sections +Successfully created esp32s3 image. +Generated /tmp/tianshan-ssh-stack-diagnostic/build/TianShanOS.bin +[1344/1344] cd /tmp/tianshan-ssh-stack-diagnostic/build/esp-idf/esptool_py && /Users/massif/.espressif/python_env/idf5.5_py3.12_env/bin/python /Users/massif/esp/v5.5.2/esp-idf/components/partition_table/check_sizes.py --offset 0x8000 partition --type app /tmp/tianshan-ssh-stack-diagnostic/build/partition_table/partition-table.bin /tmp/tianshan-ssh-stack-diagnostic/build/TianShanOS.bin +TianShanOS.bin binary size 0x259ee0 bytes. Smallest app partition is 0x300000 bytes. 0xa6120 bytes (22%) free. + +Project build complete. To flash, run: + idf.py flash +or + idf.py -p PORT flash +or + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m 0x0 ../../../private/tmp/tianshan-ssh-stack-diagnostic/build/bootloader/bootloader.bin 0x8000 ../../../private/tmp/tianshan-ssh-stack-diagnostic/build/partition_table/partition-table.bin 0x16000 ../../../private/tmp/tianshan-ssh-stack-diagnostic/build/ota_data_initial.bin 0x20000 ../../../private/tmp/tianshan-ssh-stack-diagnostic/build/TianShanOS.bin 0x6a0000 ../../../private/tmp/tianshan-ssh-stack-diagnostic/build/www.bin +or from the "/private/tmp/tianshan-ssh-stack-diagnostic/build" directory + python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args" diff --git a/docs/repair/ssh-poll-stack/diagnostic/sdkconfig-evidence.txt b/docs/repair/ssh-poll-stack/diagnostic/sdkconfig-evidence.txt new file mode 100644 index 0000000..fbc9b61 --- /dev/null +++ b/docs/repair/ssh-poll-stack/diagnostic/sdkconfig-evidence.txt @@ -0,0 +1,2877 @@ +# +# Automatically generated file. DO NOT EDIT. +# Espressif IoT Development Framework (ESP-IDF) 5.5.2 Project Configuration +# +CONFIG_SOC_ADC_SUPPORTED=y +CONFIG_SOC_UART_SUPPORTED=y +CONFIG_SOC_PCNT_SUPPORTED=y +CONFIG_SOC_PHY_SUPPORTED=y +CONFIG_SOC_WIFI_SUPPORTED=y +CONFIG_SOC_TWAI_SUPPORTED=y +CONFIG_SOC_GDMA_SUPPORTED=y +CONFIG_SOC_UHCI_SUPPORTED=y +CONFIG_SOC_AHB_GDMA_SUPPORTED=y +CONFIG_SOC_GPTIMER_SUPPORTED=y +CONFIG_SOC_LCDCAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_CAM_SUPPORTED=y +CONFIG_SOC_LCDCAM_I80_LCD_SUPPORTED=y +CONFIG_SOC_LCDCAM_RGB_LCD_SUPPORTED=y +CONFIG_SOC_MCPWM_SUPPORTED=y +CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y +CONFIG_SOC_CACHE_SUPPORT_WRAP=y +CONFIG_SOC_ULP_SUPPORTED=y +CONFIG_SOC_ULP_FSM_SUPPORTED=y +CONFIG_SOC_RISCV_COPROC_SUPPORTED=y +CONFIG_SOC_BT_SUPPORTED=y +CONFIG_SOC_USB_OTG_SUPPORTED=y +CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y +CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y +CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y +CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y +CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y +CONFIG_SOC_EFUSE_SUPPORTED=y +CONFIG_SOC_SDMMC_HOST_SUPPORTED=y +CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y +CONFIG_SOC_RTC_MEM_SUPPORTED=y +CONFIG_SOC_PSRAM_DMA_CAPABLE=y +CONFIG_SOC_XT_WDT_SUPPORTED=y +CONFIG_SOC_I2S_SUPPORTED=y +CONFIG_SOC_RMT_SUPPORTED=y +CONFIG_SOC_SDM_SUPPORTED=y +CONFIG_SOC_GPSPI_SUPPORTED=y +CONFIG_SOC_LEDC_SUPPORTED=y +CONFIG_SOC_I2C_SUPPORTED=y +CONFIG_SOC_SYSTIMER_SUPPORTED=y +CONFIG_SOC_SUPPORT_COEXISTENCE=y +CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y +CONFIG_SOC_AES_SUPPORTED=y +CONFIG_SOC_MPI_SUPPORTED=y +CONFIG_SOC_SHA_SUPPORTED=y +CONFIG_SOC_HMAC_SUPPORTED=y +CONFIG_SOC_DIG_SIGN_SUPPORTED=y +CONFIG_SOC_FLASH_ENC_SUPPORTED=y +CONFIG_SOC_SECURE_BOOT_SUPPORTED=y +CONFIG_SOC_MEMPROT_SUPPORTED=y +CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y +CONFIG_SOC_BOD_SUPPORTED=y +CONFIG_SOC_CLK_TREE_SUPPORTED=y +CONFIG_SOC_MPU_SUPPORTED=y +CONFIG_SOC_WDT_SUPPORTED=y +CONFIG_SOC_SPI_FLASH_SUPPORTED=y +CONFIG_SOC_RNG_SUPPORTED=y +CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y +CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y +CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y +CONFIG_SOC_PM_SUPPORTED=y +CONFIG_SOC_SIMD_INSTRUCTION_SUPPORTED=y +CONFIG_SOC_XTAL_SUPPORT_40M=y +CONFIG_SOC_APPCPU_HAS_CLOCK_GATING_BUG=y +CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y +CONFIG_SOC_ADC_ARBITER_SUPPORTED=y +CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y +CONFIG_SOC_ADC_MONITOR_SUPPORTED=y +CONFIG_SOC_ADC_DMA_SUPPORTED=y +CONFIG_SOC_ADC_PERIPH_NUM=2 +CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 +CONFIG_SOC_ADC_ATTEN_NUM=4 +CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 +CONFIG_SOC_ADC_PATT_LEN_MAX=24 +CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 +CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 +CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 +CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 +CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 +CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 +CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 +CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y +CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y +CONFIG_SOC_ADC_SHARED_POWER=y +CONFIG_SOC_APB_BACKUP_DMA=y +CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y +CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y +CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y +CONFIG_SOC_CACHE_ACS_INVALID_STATE_ON_PANIC=y +CONFIG_SOC_CPU_CORES_NUM=2 +CONFIG_SOC_CPU_INTR_NUM=32 +CONFIG_SOC_CPU_HAS_FPU=y +CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y +CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 +CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40 +CONFIG_SOC_SIMD_PREFERRED_DATA_ALIGNMENT=16 +CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096 +CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 +CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 +CONFIG_SOC_AHB_GDMA_VERSION=1 +CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 +CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=5 +CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y +CONFIG_SOC_GPIO_PORT=1 +CONFIG_SOC_GPIO_PIN_COUNT=49 +CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y +CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y +CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y +CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y +CONFIG_SOC_GPIO_VALID_GPIO_MASK=0x1FFFFFFFFFFFF +CONFIG_SOC_GPIO_IN_RANGE_MAX=48 +CONFIG_SOC_GPIO_OUT_RANGE_MAX=48 +CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 +CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y +CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 +CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 +CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y +CONFIG_SOC_I2C_NUM=2 +CONFIG_SOC_HP_I2C_NUM=2 +CONFIG_SOC_I2C_FIFO_LEN=32 +CONFIG_SOC_I2C_CMD_REG_NUM=8 +CONFIG_SOC_I2C_SUPPORT_SLAVE=y +CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y +CONFIG_SOC_I2C_SUPPORT_XTAL=y +CONFIG_SOC_I2C_SUPPORT_RTC=y +CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y +CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y +CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y +CONFIG_SOC_I2S_NUM=2 +CONFIG_SOC_I2S_HW_VERSION_2=y +CONFIG_SOC_I2S_SUPPORTS_XTAL=y +CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y +CONFIG_SOC_I2S_SUPPORTS_PCM=y +CONFIG_SOC_I2S_SUPPORTS_PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y +CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y +CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y +CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y +CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 +CONFIG_SOC_I2S_PDM_MAX_RX_LINES=4 +CONFIG_SOC_I2S_SUPPORTS_TDM=y +CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y +CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_LEDC_TIMER_NUM=4 +CONFIG_SOC_LEDC_CHANNEL_NUM=8 +CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 +CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y +CONFIG_SOC_MCPWM_GROUPS=2 +CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 +CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 +CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 +CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 +CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y +CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 +CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 +CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y +CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 +CONFIG_SOC_MMU_PERIPH_NUM=1 +CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 +CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 +CONFIG_SOC_PCNT_GROUPS=1 +CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 +CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 +CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 +CONFIG_SOC_RMT_GROUPS=1 +CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=4 +CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 +CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 +CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y +CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y +CONFIG_SOC_RMT_SUPPORT_ASYNC_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y +CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y +CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y +CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y +CONFIG_SOC_RMT_SUPPORT_XTAL=y +CONFIG_SOC_RMT_SUPPORT_RC_FAST=y +CONFIG_SOC_RMT_SUPPORT_APB=y +CONFIG_SOC_RMT_SUPPORT_DMA=y +CONFIG_SOC_LCD_I80_SUPPORTED=y +CONFIG_SOC_LCD_RGB_SUPPORTED=y +CONFIG_SOC_LCD_I80_BUSES=1 +CONFIG_SOC_LCD_RGB_PANELS=1 +CONFIG_SOC_LCD_I80_BUS_WIDTH=16 +CONFIG_SOC_LCD_RGB_DATA_WIDTH=16 +CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_I80_NUM_BUSES=1 +CONFIG_SOC_LCDCAM_I80_BUS_WIDTH=16 +CONFIG_SOC_LCDCAM_RGB_NUM_PANELS=1 +CONFIG_SOC_LCDCAM_RGB_DATA_WIDTH=16 +CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549 +CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128 +CONFIG_SOC_RTCIO_PIN_COUNT=22 +CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y +CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y +CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y +CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y +CONFIG_SOC_SDM_GROUPS=1 +CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 +CONFIG_SOC_SDM_CLK_SUPPORT_APB=y +CONFIG_SOC_SPI_PERIPH_NUM=3 +CONFIG_SOC_SPI_MAX_CS_NUM=6 +CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 +CONFIG_SOC_SPI_SUPPORT_DDRCLK=y +CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y +CONFIG_SOC_SPI_SUPPORT_CD_SIG=y +CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y +CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y +CONFIG_SOC_SPI_SUPPORT_CLK_APB=y +CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y +CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y +CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y +CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 +CONFIG_SOC_SPI_SUPPORT_OCT=y +CONFIG_SOC_SPI_SCT_SUPPORTED=y +CONFIG_SOC_SPI_SCT_REG_NUM=14 +CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y +CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA +CONFIG_SOC_MEMSPI_SRC_FREQ_120M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y +CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y +CONFIG_SOC_SPIRAM_SUPPORTED=y +CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y +CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 +CONFIG_SOC_SYSTIMER_ALARM_NUM=3 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 +CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y +CONFIG_SOC_SYSTIMER_INT_LEVEL=y +CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y +CONFIG_SOC_TIMER_GROUPS=2 +CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 +CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 +CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y +CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y +CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32 +CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16 +CONFIG_SOC_TOUCH_SENSOR_VERSION=2 +CONFIG_SOC_TOUCH_SENSOR_NUM=15 +CONFIG_SOC_TOUCH_MIN_CHAN_ID=1 +CONFIG_SOC_TOUCH_MAX_CHAN_ID=14 +CONFIG_SOC_TOUCH_SUPPORT_BENCHMARK=y +CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y +CONFIG_SOC_TOUCH_SUPPORT_WATERPROOF=y +CONFIG_SOC_TOUCH_SUPPORT_PROX_SENSING=y +CONFIG_SOC_TOUCH_SUPPORT_DENOISE_CHAN=y +CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 +CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y +CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 +CONFIG_SOC_TWAI_CONTROLLER_NUM=1 +CONFIG_SOC_TWAI_MASK_FILTER_NUM=1 +CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y +CONFIG_SOC_TWAI_BRP_MIN=2 +CONFIG_SOC_TWAI_BRP_MAX=16384 +CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y +CONFIG_SOC_UART_NUM=3 +CONFIG_SOC_UART_HP_NUM=3 +CONFIG_SOC_UART_FIFO_LEN=128 +CONFIG_SOC_UART_BITRATE_MAX=5000000 +CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y +CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y +CONFIG_SOC_UART_SUPPORT_APB_CLK=y +CONFIG_SOC_UART_SUPPORT_RTC_CLK=y +CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y +CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y +CONFIG_SOC_UHCI_NUM=1 +CONFIG_SOC_USB_OTG_PERIPH_NUM=1 +CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 +CONFIG_SOC_SHA_SUPPORT_DMA=y +CONFIG_SOC_SHA_SUPPORT_RESUME=y +CONFIG_SOC_SHA_GDMA=y +CONFIG_SOC_SHA_SUPPORT_SHA1=y +CONFIG_SOC_SHA_SUPPORT_SHA224=y +CONFIG_SOC_SHA_SUPPORT_SHA256=y +CONFIG_SOC_SHA_SUPPORT_SHA384=y +CONFIG_SOC_SHA_SUPPORT_SHA512=y +CONFIG_SOC_SHA_SUPPORT_SHA512_224=y +CONFIG_SOC_SHA_SUPPORT_SHA512_256=y +CONFIG_SOC_SHA_SUPPORT_SHA512_T=y +CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 +CONFIG_SOC_MPI_OPERATIONS_NUM=3 +CONFIG_SOC_RSA_MAX_BIT_LEN=4096 +CONFIG_SOC_AES_SUPPORT_DMA=y +CONFIG_SOC_AES_GDMA=y +CONFIG_SOC_AES_SUPPORT_AES_128=y +CONFIG_SOC_AES_SUPPORT_AES_256=y +CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y +CONFIG_SOC_PM_SUPPORT_CPU_PD=y +CONFIG_SOC_PM_SUPPORT_TAGMEM_PD=y +CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y +CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y +CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y +CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y +CONFIG_SOC_PM_SUPPORT_MODEM_PD=y +CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y +CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y +CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y +CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=y +CONFIG_SOC_PM_MODEM_PD_BY_SW=y +CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y +CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y +CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y +CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y +CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y +CONFIG_SOC_EFUSE_DIS_DOWNLOAD_DCACHE=y +CONFIG_SOC_EFUSE_HARD_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_USB_JTAG=y +CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y +CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y +CONFIG_SOC_EFUSE_DIS_ICACHE=y +CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y +CONFIG_SOC_SECURE_BOOT_V2_RSA=y +CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 +CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y +CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y +CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y +CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_256=y +CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 +CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=256 +CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 +CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 +CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y +CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y +CONFIG_SOC_SPI_MEM_SUPPORT_FLASH_OPI_MODE=y +CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y +CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y +CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y +CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y +CONFIG_SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM=y +CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y +CONFIG_SOC_COEX_HW_PTI=y +CONFIG_SOC_EXTERNAL_COEX_LEADER_TX_LINE=y +CONFIG_SOC_SDMMC_USE_GPIO_MATRIX=y +CONFIG_SOC_SDMMC_NUM_SLOTS=2 +CONFIG_SOC_SDMMC_SUPPORT_XTAL_CLOCK=y +CONFIG_SOC_SDMMC_DELAY_PHASE_NUM=4 +CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y +CONFIG_SOC_WIFI_HW_TSF=y +CONFIG_SOC_WIFI_FTM_SUPPORT=y +CONFIG_SOC_WIFI_GCMP_SUPPORT=y +CONFIG_SOC_WIFI_WAPI_SUPPORT=y +CONFIG_SOC_WIFI_CSI_SUPPORT=y +CONFIG_SOC_WIFI_MESH_SUPPORT=y +CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y +CONFIG_SOC_WIFI_PHY_NEEDS_USB_WORKAROUND=y +CONFIG_SOC_BLE_SUPPORTED=y +CONFIG_SOC_BLE_MESH_SUPPORTED=y +CONFIG_SOC_BLE_50_SUPPORTED=y +CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y +CONFIG_SOC_BLUFI_SUPPORTED=y +CONFIG_SOC_ULP_HAS_ADC=y +CONFIG_SOC_PHY_COMBO_MODULE=y +CONFIG_SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV=y +CONFIG_SOC_LCDCAM_CAM_PERIPH_NUM=1 +CONFIG_SOC_LCDCAM_CAM_DATA_WIDTH_MAX=16 +CONFIG_IDF_CMAKE=y +CONFIG_IDF_TOOLCHAIN="gcc" +CONFIG_IDF_TOOLCHAIN_GCC=y +CONFIG_IDF_TARGET_ARCH_XTENSA=y +CONFIG_IDF_TARGET_ARCH="xtensa" +CONFIG_IDF_TARGET="esp32s3" +CONFIG_IDF_INIT_VERSION="5.5.2" +CONFIG_IDF_TARGET_ESP32S3=y +CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 + +# +# Build type +# +CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y +# CONFIG_APP_BUILD_TYPE_RAM is not set +CONFIG_APP_BUILD_GENERATE_BINARIES=y +CONFIG_APP_BUILD_BOOTLOADER=y +CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y +# CONFIG_APP_REPRODUCIBLE_BUILD is not set +# CONFIG_APP_NO_BLOBS is not set +# end of Build type + +# +# Bootloader config +# + +# +# Bootloader manager +# +CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y +CONFIG_BOOTLOADER_PROJECT_VER=1 +# end of Bootloader manager + +# +# Application Rollback +# +# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set +# end of Application Rollback + +# +# Recovery Bootloader and Rollback +# +# end of Recovery Bootloader and Rollback + +CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 +CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set + +# +# Log +# +CONFIG_BOOTLOADER_LOG_VERSION_1=y +CONFIG_BOOTLOADER_LOG_VERSION=1 +# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set +# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set +CONFIG_BOOTLOADER_LOG_LEVEL=3 + +# +# Format +# +# CONFIG_BOOTLOADER_LOG_COLORS is not set +CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y +# end of Format + +# +# Settings +# +CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y +CONFIG_BOOTLOADER_LOG_MODE_TEXT=y +# end of Settings +# end of Log + +# +# Serial Flash Configurations +# +# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set +CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y +# end of Serial Flash Configurations + +CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y +# CONFIG_BOOTLOADER_FACTORY_RESET is not set +# CONFIG_BOOTLOADER_APP_TEST is not set +CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y +CONFIG_BOOTLOADER_WDT_ENABLE=y +# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set +CONFIG_BOOTLOADER_WDT_TIME_MS=9000 +# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set +# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set +CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0 +# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set +# end of Bootloader config + +# +# Security features +# +CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y +CONFIG_SECURE_BOOT_V2_PREFERRED=y +# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set +# CONFIG_SECURE_BOOT is not set +# CONFIG_SECURE_FLASH_ENC_ENABLED is not set +CONFIG_SECURE_ROM_DL_MODE_ENABLED=y +# end of Security features + +# +# Application manager +# +CONFIG_APP_COMPILE_TIME_DATE=y +# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set +# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set +# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set +CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 +# end of Application manager + +CONFIG_ESP_ROM_HAS_CRC_LE=y +CONFIG_ESP_ROM_HAS_CRC_BE=y +CONFIG_ESP_ROM_HAS_MZ_CRC32=y +CONFIG_ESP_ROM_HAS_JPEG_DECODE=y +CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y +CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y +CONFIG_ESP_ROM_USB_OTG_NUM=3 +CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 +CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y +CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y +CONFIG_ESP_ROM_GET_CLK_FREQ=y +CONFIG_ESP_ROM_HAS_HAL_WDT=y +CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y +CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y +CONFIG_ESP_ROM_HAS_SPI_FLASH=y +CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y +CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y +CONFIG_ESP_ROM_HAS_NEWLIB=y +CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y +CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y +CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y +CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y +CONFIG_ESP_ROM_HAS_FLASH_COUNT_PAGES_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_SUSPEND_WAITI_BUG=y +CONFIG_ESP_ROM_HAS_CACHE_WRITEBACK_BUG=y +CONFIG_ESP_ROM_HAS_SW_FLOAT=y +CONFIG_ESP_ROM_HAS_VERSION=y +CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y +CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y +CONFIG_ESP_ROM_CONSOLE_OUTPUT_SECONDARY=y + +# +# Boot ROM Behavior +# +CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y +# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set +# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set +# end of Boot ROM Behavior + +# +# Serial flasher config +# +# CONFIG_ESPTOOLPY_NO_STUB is not set +# CONFIG_ESPTOOLPY_OCT_FLASH is not set +CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=y +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y +# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set +# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set +CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y +CONFIG_ESPTOOLPY_FLASHMODE="dio" +# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set +# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set +# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set +CONFIG_ESPTOOLPY_FLASHSIZE="16MB" +# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set +CONFIG_ESPTOOLPY_BEFORE_RESET=y +# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set +CONFIG_ESPTOOLPY_BEFORE="default_reset" +CONFIG_ESPTOOLPY_AFTER_RESET=y +# CONFIG_ESPTOOLPY_AFTER_NORESET is not set +CONFIG_ESPTOOLPY_AFTER="hard_reset" +CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 +# end of Serial flasher config + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +CONFIG_COMPILER_STACK_CHECK_MODE_ALL=y +CONFIG_COMPILER_STACK_CHECK=y +# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set +# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +CONFIG_COMPILER_RT_LIB_GCCLIB=y +CONFIG_COMPILER_RT_LIB_NAME="gcc" +CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y +# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set +# CONFIG_COMPILER_STATIC_ANALYZER is not set +# end of Compiler options + +# +# Component config +# + +# +# Application Level Tracing +# +# CONFIG_APPTRACE_DEST_JTAG is not set +CONFIG_APPTRACE_DEST_NONE=y +# CONFIG_APPTRACE_DEST_UART1 is not set +# CONFIG_APPTRACE_DEST_UART2 is not set +# CONFIG_APPTRACE_DEST_USB_CDC is not set +CONFIG_APPTRACE_DEST_UART_NONE=y +CONFIG_APPTRACE_UART_TASK_PRIO=1 +CONFIG_APPTRACE_LOCK_ENABLE=y +# end of Application Level Tracing + +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set + +# +# Common Options +# + +# +# BLE Log +# +# CONFIG_BLE_LOG_ENABLED is not set +# end of BLE Log + +# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set +# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set +# CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED is not set +# end of Common Options +# end of Bluetooth + +# +# Console Library +# +# CONFIG_CONSOLE_SORTED_HELP is not set +# end of Console Library + +# +# Driver Configurations +# + +# +# Legacy TWAI Driver Configurations +# +# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set +CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y +# end of Legacy TWAI Driver Configurations + +# +# Legacy ADC Driver Configuration +# +# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_ADC_SKIP_LEGACY_CONFLICT_CHECK is not set + +# +# Legacy ADC Calibration Configuration +# +# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set +# end of Legacy ADC Calibration Configuration +# end of Legacy ADC Driver Configuration + +# +# Legacy MCPWM Driver Configurations +# +# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_MCPWM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy MCPWM Driver Configurations + +# +# Legacy Timer Group Driver Configurations +# +# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_GPTIMER_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Timer Group Driver Configurations + +# +# Legacy RMT Driver Configurations +# +# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_RMT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy RMT Driver Configurations + +# +# Legacy I2S Driver Configurations +# +# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_I2S_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2S Driver Configurations + +# +# Legacy I2C Driver Configurations +# +# CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy I2C Driver Configurations + +# +# Legacy PCNT Driver Configurations +# +# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_PCNT_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy PCNT Driver Configurations + +# +# Legacy SDM Driver Configurations +# +# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_SDM_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy SDM Driver Configurations + +# +# Legacy Temperature Sensor Driver Configurations +# +# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Temperature Sensor Driver Configurations + +# +# Legacy Touch Sensor Driver Configurations +# +# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set +# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set +# end of Legacy Touch Sensor Driver Configurations +# end of Driver Configurations + +# +# eFuse Bit Manager +# +# CONFIG_EFUSE_CUSTOM_TABLE is not set +# CONFIG_EFUSE_VIRTUAL is not set +CONFIG_EFUSE_MAX_BLK_LEN=256 +# end of eFuse Bit Manager + +# +# ESP-TLS +# +CONFIG_ESP_TLS_USING_MBEDTLS=y +# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set +# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set +# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set +# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set +# CONFIG_ESP_TLS_PSK_VERIFICATION is not set +# CONFIG_ESP_TLS_INSECURE is not set +CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y +# end of ESP-TLS + +# +# ADC and ADC Calibration +# +# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set +# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set +# CONFIG_ADC_ENABLE_DEBUG_LOG is not set +# end of ADC and ADC Calibration + +# +# Wireless Coexistence +# +CONFIG_ESP_COEX_ENABLED=y +# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_ESP_COEX_GPIO_DEBUG is not set +# end of Wireless Coexistence + +# +# Common ESP-related +# +CONFIG_ESP_ERR_TO_NAME_LOOKUP=y +CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +# end of Common ESP-related + +# +# ESP-Driver:Camera Controller Configurations +# +# CONFIG_CAM_CTLR_DVP_CAM_ISR_CACHE_SAFE is not set +# end of ESP-Driver:Camera Controller Configurations + +# +# ESP-Driver:GPIO Configurations +# +# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:GPIO Configurations + +# +# ESP-Driver:GPTimer Configurations +# +CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y +# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set +# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set +CONFIG_GPTIMER_OBJ_CACHE_SAFE=y +# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:GPTimer Configurations + +# +# ESP-Driver:I2C Configurations +# +# CONFIG_I2C_ISR_IRAM_SAFE is not set +# CONFIG_I2C_ENABLE_DEBUG_LOG is not set +# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set +CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y +# end of ESP-Driver:I2C Configurations + +# +# ESP-Driver:I2S Configurations +# +# CONFIG_I2S_ISR_IRAM_SAFE is not set +# CONFIG_I2S_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:I2S Configurations + +# +# ESP-Driver:LEDC Configurations +# +# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set +# end of ESP-Driver:LEDC Configurations + +# +# ESP-Driver:MCPWM Configurations +# +CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y +# CONFIG_MCPWM_ISR_CACHE_SAFE is not set +# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set +CONFIG_MCPWM_OBJ_CACHE_SAFE=y +# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:MCPWM Configurations + +# +# ESP-Driver:PCNT Configurations +# +# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set +# CONFIG_PCNT_ISR_IRAM_SAFE is not set +# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:PCNT Configurations + +# +# ESP-Driver:RMT Configurations +# +CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y +CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y +CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y +# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set +# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set +# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set +CONFIG_RMT_OBJ_CACHE_SAFE=y +# CONFIG_RMT_ENABLE_DEBUG_LOG is not set +# CONFIG_RMT_ISR_IRAM_SAFE is not set +# end of ESP-Driver:RMT Configurations + +# +# ESP-Driver:Sigma Delta Modulator Configurations +# +# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set +# CONFIG_SDM_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Sigma Delta Modulator Configurations + +# +# ESP-Driver:SPI Configurations +# +# CONFIG_SPI_MASTER_IN_IRAM is not set +CONFIG_SPI_MASTER_ISR_IN_IRAM=y +# CONFIG_SPI_SLAVE_IN_IRAM is not set +CONFIG_SPI_SLAVE_ISR_IN_IRAM=y +# end of ESP-Driver:SPI Configurations + +# +# ESP-Driver:Touch Sensor Configurations +# +# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set +# CONFIG_TOUCH_ISR_IRAM_SAFE is not set +# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set +# CONFIG_TOUCH_SKIP_FSM_CHECK is not set +# end of ESP-Driver:Touch Sensor Configurations + +# +# ESP-Driver:Temperature Sensor Configurations +# +# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:Temperature Sensor Configurations + +# +# ESP-Driver:TWAI Configurations +# +# CONFIG_TWAI_ISR_IN_IRAM is not set +# CONFIG_TWAI_IO_FUNC_IN_IRAM is not set +# CONFIG_TWAI_ISR_CACHE_SAFE is not set +# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:TWAI Configurations + +# +# ESP-Driver:UART Configurations +# +# CONFIG_UART_ISR_IN_IRAM is not set +# end of ESP-Driver:UART Configurations + +# +# ESP-Driver:UHCI Configurations +# +# CONFIG_UHCI_ISR_HANDLER_IN_IRAM is not set +# CONFIG_UHCI_ISR_CACHE_SAFE is not set +# CONFIG_UHCI_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:UHCI Configurations + +# +# ESP-Driver:USB Serial/JTAG Configuration +# +CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y +# end of ESP-Driver:USB Serial/JTAG Configuration + +# +# Ethernet +# +CONFIG_ETH_ENABLED=y +CONFIG_ETH_USE_SPI_ETHERNET=y +# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set +CONFIG_ETH_SPI_ETHERNET_W5500=y +# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set +# CONFIG_ETH_USE_OPENETH is not set +# CONFIG_ETH_TRANSMIT_MUTEX is not set +# end of Ethernet + +# +# Event Loop Library +# +# CONFIG_ESP_EVENT_LOOP_PROFILING is not set +CONFIG_ESP_EVENT_POST_FROM_ISR=y +CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y +# end of Event Loop Library + +# +# GDB Stub +# +CONFIG_ESP_GDBSTUB_ENABLED=y +# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set +CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y +CONFIG_ESP_GDBSTUB_MAX_TASKS=32 +# end of GDB Stub + +# +# ESP HID +# +CONFIG_ESPHID_TASK_SIZE_BT=2048 +CONFIG_ESPHID_TASK_SIZE_BLE=4096 +# end of ESP HID + +# +# ESP HTTP client +# +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y +# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set +# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set +CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTP client + +# +# HTTP Server +# +CONFIG_HTTPD_MAX_REQ_HDR_LEN=1024 +CONFIG_HTTPD_MAX_URI_LEN=256 +CONFIG_HTTPD_ERR_RESP_NO_DELAY=y +CONFIG_HTTPD_PURGE_BUF_LEN=32 +# CONFIG_HTTPD_LOG_PURGE_DATA is not set +CONFIG_HTTPD_WS_SUPPORT=y +# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set +CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_HTTPD_WS_PRE_HANDSHAKE_CB_SUPPORT is not set +# end of HTTP Server + +# +# ESP HTTPS OTA +# +# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set +CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP=y +CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 +# end of ESP HTTPS OTA + +# +# ESP HTTPS server +# +# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set +CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 +# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set +# end of ESP HTTPS server + +# +# Hardware Settings +# + +# +# Chip revision +# +CONFIG_ESP32S3_REV_MIN_0=y +# CONFIG_ESP32S3_REV_MIN_1 is not set +# CONFIG_ESP32S3_REV_MIN_2 is not set +CONFIG_ESP32S3_REV_MIN_FULL=0 +CONFIG_ESP_REV_MIN_FULL=0 + +# +# Maximum Supported ESP32-S3 Revision (Rev v0.99) +# +CONFIG_ESP32S3_REV_MAX_FULL=99 +CONFIG_ESP_REV_MAX_FULL=99 +CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 +CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=199 + +# +# Maximum Supported ESP32-S3 eFuse Block Revision (eFuse Block Rev v1.99) +# +# end of Chip revision + +# +# MAC Config +# +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y +CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y +CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 +# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set +# end of MAC Config + +# +# Sleep Config +# +CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y +CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y +CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y +CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 +# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set +# CONFIG_ESP_SLEEP_DEBUG is not set +CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y +# end of Sleep Config + +# +# RTC Clock Config +# +CONFIG_RTC_CLK_SRC_INT_RC=y +# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_RTC_CLK_CAL_CYCLES=1024 +# end of RTC Clock Config + +# +# Peripheral Control +# +CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y +# end of Peripheral Control + +# +# GDMA Configurations +# +CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y +CONFIG_GDMA_ISR_HANDLER_IN_IRAM=y +CONFIG_GDMA_OBJ_DRAM_SAFE=y +# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set +# CONFIG_GDMA_ISR_IRAM_SAFE is not set +# end of GDMA Configurations + +# +# Main XTAL Config +# +CONFIG_XTAL_FREQ_40=y +CONFIG_XTAL_FREQ=40 +# end of Main XTAL Config + +# +# Power Supplier +# + +# +# Brownout Detector +# +CONFIG_ESP_BROWNOUT_DET=y +CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_ESP_BROWNOUT_DET_LVL=7 +CONFIG_ESP_BROWNOUT_USE_INTR=y +# end of Brownout Detector +# end of Power Supplier + +CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y +CONFIG_ESP_INTR_IN_IRAM=y +# end of Hardware Settings + +# +# ESP-Driver:LCD Controller Configurations +# +# CONFIG_LCD_RGB_ISR_IRAM_SAFE is not set +# CONFIG_LCD_RGB_RESTART_IN_VSYNC is not set +# CONFIG_LCD_ENABLE_DEBUG_LOG is not set +# end of ESP-Driver:LCD Controller Configurations + +# +# ESP-MM: Memory Management Configurations +# +# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set +# end of ESP-MM: Memory Management Configurations + +# +# ESP NETIF Adapter +# +CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 +# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set +CONFIG_ESP_NETIF_TCPIP_LWIP=y +# CONFIG_ESP_NETIF_LOOPBACK is not set +CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y +CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y +# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set +# CONFIG_ESP_NETIF_L2_TAP is not set +# CONFIG_ESP_NETIF_BRIDGE_EN is not set +# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set +# end of ESP NETIF Adapter + +# +# Partition API Configuration +# +# end of Partition API Configuration + +# +# PHY +# +CONFIG_ESP_PHY_ENABLED=y +CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP_PHY_MAX_TX_POWER=20 +# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set +CONFIG_ESP_PHY_ENABLE_USB=y +# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set +CONFIG_ESP_PHY_RF_CAL_PARTIAL=y +# CONFIG_ESP_PHY_RF_CAL_NONE is not set +# CONFIG_ESP_PHY_RF_CAL_FULL is not set +CONFIG_ESP_PHY_CALIBRATION_MODE=0 +CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000 +# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set +# CONFIG_ESP_PHY_RECORD_USED_TIME is not set +CONFIG_ESP_PHY_IRAM_OPT=y +# CONFIG_ESP_PHY_DEBUG is not set +# end of PHY + +# +# Power Management +# +CONFIG_PM_SLEEP_FUNC_IN_IRAM=y +# CONFIG_PM_ENABLE is not set +CONFIG_PM_SLP_IRAM_OPT=y +CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y +CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y +# end of Power Management + +# +# ESP PSRAM +# +CONFIG_SPIRAM=y + +# +# SPI RAM config +# +# CONFIG_SPIRAM_MODE_QUAD is not set +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_TYPE_AUTO=y +# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set +CONFIG_SPIRAM_CLK_IO=30 +CONFIG_SPIRAM_CS_IO=26 +# CONFIG_SPIRAM_XIP_FROM_PSRAM is not set +# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set +# CONFIG_SPIRAM_RODATA is not set +CONFIG_SPIRAM_SPEED_80M=y +# CONFIG_SPIRAM_SPEED_40M is not set +CONFIG_SPIRAM_SPEED=80 +# CONFIG_SPIRAM_ECC_ENABLE is not set +CONFIG_SPIRAM_BOOT_HW_INIT=y +CONFIG_SPIRAM_BOOT_INIT=y +CONFIG_SPIRAM_PRE_CONFIGURE_MEMORY_PROTECTION=y +# CONFIG_SPIRAM_USE_MEMMAP is not set +# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set +CONFIG_SPIRAM_USE_MALLOC=y +CONFIG_SPIRAM_MEMTEST=y +CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=64 +CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y +CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=16384 +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y +# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set +# end of SPI RAM config +# end of ESP PSRAM + +# +# ESP Ringbuf +# +# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set +# end of ESP Ringbuf + +# +# ESP-ROM +# +CONFIG_ESP_ROM_PRINT_IN_IRAM=y +# end of ESP-ROM + +# +# ESP Security Specific +# +# end of ESP Security Specific + +# +# ESP System Settings +# +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set +# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +# +# Cache config +# +CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB=y +# CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x4000 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y +CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_16B is not set +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y +CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 +# CONFIG_ESP32S3_DATA_CACHE_16KB is not set +CONFIG_ESP32S3_DATA_CACHE_32KB=y +# CONFIG_ESP32S3_DATA_CACHE_64KB is not set +CONFIG_ESP32S3_DATA_CACHE_SIZE=0x8000 +# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 +# CONFIG_ESP32S3_DATA_CACHE_LINE_16B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_32B=y +# CONFIG_ESP32S3_DATA_CACHE_LINE_64B is not set +CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32 +# end of Cache config + +# +# Memory +# +# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set +# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set +# end of Memory + +# +# Trace memory +# +# CONFIG_ESP32S3_TRAX is not set +CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 +# end of Trace memory + +CONFIG_ESP_SYSTEM_IN_IRAM=y +# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set +CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y +# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set +CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 +CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y +CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y + +# +# Memory protection +# +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y +CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y +# end of Memory protection + +CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=3584 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=4608 +CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y +# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set +# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 +CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 +CONFIG_ESP_CONSOLE_UART_DEFAULT=y +# CONFIG_ESP_CONSOLE_USB_CDC is not set +# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set +# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set +# CONFIG_ESP_CONSOLE_NONE is not set +# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y +CONFIG_ESP_CONSOLE_UART=y +CONFIG_ESP_CONSOLE_UART_NUM=0 +CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 +CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +CONFIG_ESP_INT_WDT=y +CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 +CONFIG_ESP_INT_WDT_CHECK_CPU1=y +CONFIG_ESP_TASK_WDT_EN=y +CONFIG_ESP_TASK_WDT_INIT=y +# CONFIG_ESP_TASK_WDT_PANIC is not set +CONFIG_ESP_TASK_WDT_TIMEOUT_S=30 +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP_PANIC_HANDLER_IRAM is not set +# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP_DEBUG_OCDAWARE=y +CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y +CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y +# end of ESP System Settings + +# +# IPC (Inter-Processor Call) +# +CONFIG_ESP_IPC_ENABLE=y +CONFIG_ESP_IPC_TASK_STACK_SIZE=1280 +CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y +CONFIG_ESP_IPC_ISR_ENABLE=y +# end of IPC (Inter-Processor Call) + +# +# ESP Timer (High Resolution Timer) +# +CONFIG_ESP_TIMER_IN_IRAM=y +# CONFIG_ESP_TIMER_PROFILING is not set +CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y +CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y +CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 +# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set +CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 +CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y +CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y +# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set +CONFIG_ESP_TIMER_IMPL_SYSTIMER=y +# end of ESP Timer (High Resolution Timer) + +# +# Wi-Fi +# +CONFIG_ESP_WIFI_ENABLED=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=4 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=16 +CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y +# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0 +CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=3 +# CONFIG_ESP_WIFI_CSI_ENABLED is not set +CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP_WIFI_TX_BA_WIN=6 +CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP_WIFI_RX_BA_WIN=6 +# CONFIG_ESP_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP_WIFI_NVS_ENABLED=y +CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP_WIFI_MGMT_SBUF_NUM=8 +CONFIG_ESP_WIFI_IRAM_OPT=y +# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set +CONFIG_ESP_WIFI_RX_IRAM_OPT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP_WIFI_ENABLE_SAE_PK=y +CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y +CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y +CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y +# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set +CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 +# CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT is not set +CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 +CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 +# CONFIG_ESP_WIFI_FTM_ENABLE is not set +CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y +# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set +CONFIG_ESP_WIFI_GMAC_SUPPORT=y +CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y +# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set +CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 +CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y +CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y +# CONFIG_ESP_WIFI_WAPI_PSK is not set +# CONFIG_ESP_WIFI_SUITE_B_192 is not set +# CONFIG_ESP_WIFI_11KV_SUPPORT is not set +# CONFIG_ESP_WIFI_MBO_SUPPORT is not set +# CONFIG_ESP_WIFI_DPP_SUPPORT is not set +# CONFIG_ESP_WIFI_11R_SUPPORT is not set +# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set + +# +# WPS Configuration Options +# +# CONFIG_ESP_WIFI_WPS_STRICT is not set +# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set +# CONFIG_ESP_WIFI_WPS_RECONNECT_ON_FAIL is not set +# end of WPS Configuration Options + +# CONFIG_ESP_WIFI_DEBUG_PRINT is not set +CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y +# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set +# end of Wi-Fi + +# +# Core dump +# +# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set +# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set +CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y +# end of Core dump + +# +# FAT Filesystem support +# +CONFIG_FATFS_VOLUME_COUNT=4 +# CONFIG_FATFS_LFN_NONE is not set +CONFIG_FATFS_LFN_HEAP=y +# CONFIG_FATFS_LFN_STACK is not set +# CONFIG_FATFS_SECTOR_512 is not set +CONFIG_FATFS_SECTOR_4096=y +# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set +CONFIG_FATFS_CODEPAGE_437=y +# CONFIG_FATFS_CODEPAGE_720 is not set +# CONFIG_FATFS_CODEPAGE_737 is not set +# CONFIG_FATFS_CODEPAGE_771 is not set +# CONFIG_FATFS_CODEPAGE_775 is not set +# CONFIG_FATFS_CODEPAGE_850 is not set +# CONFIG_FATFS_CODEPAGE_852 is not set +# CONFIG_FATFS_CODEPAGE_855 is not set +# CONFIG_FATFS_CODEPAGE_857 is not set +# CONFIG_FATFS_CODEPAGE_860 is not set +# CONFIG_FATFS_CODEPAGE_861 is not set +# CONFIG_FATFS_CODEPAGE_862 is not set +# CONFIG_FATFS_CODEPAGE_863 is not set +# CONFIG_FATFS_CODEPAGE_864 is not set +# CONFIG_FATFS_CODEPAGE_865 is not set +# CONFIG_FATFS_CODEPAGE_866 is not set +# CONFIG_FATFS_CODEPAGE_869 is not set +# CONFIG_FATFS_CODEPAGE_932 is not set +# CONFIG_FATFS_CODEPAGE_936 is not set +# CONFIG_FATFS_CODEPAGE_949 is not set +# CONFIG_FATFS_CODEPAGE_950 is not set +CONFIG_FATFS_CODEPAGE=437 +CONFIG_FATFS_MAX_LFN=255 +CONFIG_FATFS_API_ENCODING_ANSI_OEM=y +# CONFIG_FATFS_API_ENCODING_UTF_8 is not set +CONFIG_FATFS_FS_LOCK=0 +CONFIG_FATFS_TIMEOUT_MS=10000 +CONFIG_FATFS_PER_FILE_CACHE=y +CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y +# CONFIG_FATFS_USE_FASTSEEK is not set +CONFIG_FATFS_USE_STRFUNC_NONE=y +# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set +# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set +CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 +# CONFIG_FATFS_IMMEDIATE_FSYNC is not set +# CONFIG_FATFS_USE_LABEL is not set +CONFIG_FATFS_LINK_LOCK=y +# CONFIG_FATFS_USE_DYN_BUFFERS is not set + +# +# File system free space calculation behavior +# +CONFIG_FATFS_DONT_TRUST_FREE_CLUSTER_CNT=0 +CONFIG_FATFS_DONT_TRUST_LAST_ALLOC=0 +# end of File system free space calculation behavior +# end of FAT Filesystem support + +# +# FreeRTOS +# + +# +# Kernel +# +# CONFIG_FREERTOS_SMP is not set +# CONFIG_FREERTOS_UNICORE is not set +CONFIG_FREERTOS_HZ=1000 +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set +# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set +CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y +CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 +CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 +# CONFIG_FREERTOS_USE_IDLE_HOOK is not set +# CONFIG_FREERTOS_USE_TICK_HOOK is not set +CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 +# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set +CONFIG_FREERTOS_USE_TIMERS=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set +# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set +CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y +CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 +CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=3072 +CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 +CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 +CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y +# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set +CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y +CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y +CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U32=y +# CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U64 is not set +# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set +# end of Kernel + +# +# Port +# +CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y +CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y +CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y +# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set +# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set +CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y +CONFIG_FREERTOS_ISR_STACKSIZE=1536 +CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y +# CONFIG_FREERTOS_FPU_IN_ISR is not set +CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y +CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y +# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set +CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y +CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER=y +# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set +# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set +# end of Port + +# +# Extra +# +CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM=y +# end of Extra + +CONFIG_FREERTOS_PORT=y +CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF +CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y +CONFIG_FREERTOS_DEBUG_OCDAWARE=y +CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y +CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y +CONFIG_FREERTOS_NUMBER_OF_CORES=2 +CONFIG_FREERTOS_IN_IRAM=y +# end of FreeRTOS + +# +# Hardware Abstraction Layer (HAL) and Low Level (LL) +# +CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y +# CONFIG_HAL_ASSERTION_DISABLE is not set +# CONFIG_HAL_ASSERTION_SILENT is not set +# CONFIG_HAL_ASSERTION_ENABLE is not set +CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 +CONFIG_HAL_WDT_USE_ROM_IMPL=y +# end of Hardware Abstraction Layer (HAL) and Low Level (LL) + +# +# Heap memory debugging +# +# CONFIG_HEAP_POISONING_DISABLED is not set +CONFIG_HEAP_POISONING_LIGHT=y +# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set +CONFIG_HEAP_TRACING_OFF=y +# CONFIG_HEAP_TRACING_STANDALONE is not set +# CONFIG_HEAP_TRACING_TOHOST is not set +# CONFIG_HEAP_USE_HOOKS is not set +# CONFIG_HEAP_TASK_TRACKING is not set +# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set +# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set +# end of Heap memory debugging + +# +# Log +# +CONFIG_LOG_VERSION_1=y +# CONFIG_LOG_VERSION_2 is not set +CONFIG_LOG_VERSION=1 + +# +# Log Level +# +# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_LOG_DEFAULT_LEVEL=3 +# CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT is not set +CONFIG_LOG_MAXIMUM_LEVEL_DEBUG=y +# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set +CONFIG_LOG_MAXIMUM_LEVEL=4 + +# +# Level Settings +# +# CONFIG_LOG_MASTER_LEVEL is not set +CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y +# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set +# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y +# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set +CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y +CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 +# end of Level Settings +# end of Log Level + +# +# Format +# +# CONFIG_LOG_COLORS is not set +CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y +# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set +# end of Format + +# +# Settings +# +CONFIG_LOG_MODE_TEXT_EN=y +CONFIG_LOG_MODE_TEXT=y +# end of Settings + +CONFIG_LOG_IN_IRAM=y +# end of Log + +# +# LWIP +# +CONFIG_LWIP_ENABLE=y +CONFIG_LWIP_LOCAL_HOSTNAME="rm01" +CONFIG_LWIP_TCPIP_TASK_PRIO=18 +# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set +# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set +CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y +# CONFIG_LWIP_L2_TO_L3_COPY is not set +# CONFIG_LWIP_IRAM_OPTIMIZATION is not set +# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set +CONFIG_LWIP_TIMERS_ONDEMAND=y +CONFIG_LWIP_ND6=y +# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set +CONFIG_LWIP_MAX_SOCKETS=16 +# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set +# CONFIG_LWIP_SO_LINGER is not set +CONFIG_LWIP_SO_REUSE=y +CONFIG_LWIP_SO_REUSE_RXTOALL=y +# CONFIG_LWIP_SO_RCVBUF is not set +# CONFIG_LWIP_NETBUF_RECVINFO is not set +CONFIG_LWIP_IP_DEFAULT_TTL=64 +CONFIG_LWIP_IP4_FRAG=y +CONFIG_LWIP_IP6_FRAG=y +# CONFIG_LWIP_IP4_REASSEMBLY is not set +# CONFIG_LWIP_IP6_REASSEMBLY is not set +CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 +CONFIG_LWIP_IP_FORWARD=y +CONFIG_LWIP_IPV4_NAPT=y +CONFIG_LWIP_IPV4_NAPT_PORTMAP=y +# CONFIG_LWIP_STATS is not set +CONFIG_LWIP_ESP_GRATUITOUS_ARP=y +CONFIG_LWIP_GARP_TMR_INTERVAL=60 +CONFIG_LWIP_ESP_MLDV6_REPORT=y +CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=8 +CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y +# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set +# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set +# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set +CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y +# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set +CONFIG_LWIP_DHCP_OPTIONS_LEN=69 +CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 +CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 + +# +# DHCP server +# +CONFIG_LWIP_DHCPS=y +CONFIG_LWIP_DHCPS_LEASE_UNIT=60 +CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 +CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y +CONFIG_LWIP_DHCPS_ADD_DNS=y +# end of DHCP server + +# CONFIG_LWIP_AUTOIP is not set +CONFIG_LWIP_IPV4=y +CONFIG_LWIP_IPV6=y +# CONFIG_LWIP_IPV6_AUTOCONFIG is not set +CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 +# CONFIG_LWIP_IPV6_FORWARD is not set +# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set +CONFIG_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 + +# +# TCP +# +CONFIG_LWIP_MAX_ACTIVE_TCP=16 +CONFIG_LWIP_MAX_LISTENING_TCP=16 +CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y +CONFIG_LWIP_TCP_MAXRTX=12 +CONFIG_LWIP_TCP_SYNMAXRTX=12 +CONFIG_LWIP_TCP_MSS=1440 +CONFIG_LWIP_TCP_TMR_INTERVAL=250 +CONFIG_LWIP_TCP_MSL=60000 +CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 +CONFIG_LWIP_TCP_SND_BUF_DEFAULT=4096 +CONFIG_LWIP_TCP_WND_DEFAULT=4096 +CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 +CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 +CONFIG_LWIP_TCP_QUEUE_OOSEQ=y +CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 +CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=0 +# CONFIG_LWIP_TCP_SACK_OUT is not set +CONFIG_LWIP_TCP_OVERSIZE_MSS=y +# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set +# CONFIG_LWIP_WND_SCALE is not set +CONFIG_LWIP_TCP_RTO_TIME=1500 +# end of TCP + +# +# UDP +# +CONFIG_LWIP_MAX_UDP_PCBS=16 +CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 +# end of UDP + +# +# Checksums +# +# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set +# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set +CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y +# end of Checksums + +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF +CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 +CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 +CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 +CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 +CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 +# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set +# CONFIG_LWIP_PPP_SUPPORT is not set +# CONFIG_LWIP_SLIP_SUPPORT is not set + +# +# ICMP +# +CONFIG_LWIP_ICMP=y +# CONFIG_LWIP_MULTICAST_PING is not set +# CONFIG_LWIP_BROADCAST_PING is not set +# end of ICMP + +# +# LWIP RAW API +# +CONFIG_LWIP_MAX_RAW_PCBS=16 +# end of LWIP RAW API + +# +# SNTP +# +CONFIG_LWIP_SNTP_MAX_SERVERS=3 +# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set +CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 +CONFIG_LWIP_SNTP_STARTUP_DELAY=y +CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 +# end of SNTP + +# +# DNS +# +CONFIG_LWIP_DNS_MAX_HOST_IP=1 +CONFIG_LWIP_DNS_MAX_SERVERS=3 +# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set +# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set +# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set +# end of DNS + +CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 +CONFIG_LWIP_ESP_LWIP_ASSERT=y + +# +# Hooks +# +# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set +CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y +# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y +# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set +CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y +# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set +# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set +# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set +CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set +# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set +CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set +# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set +CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y +# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set +# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set +CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y +# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set +# end of Hooks + +# CONFIG_LWIP_DEBUG is not set +# end of LWIP + +# +# mbedTLS +# +# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set +CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y +# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set +# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set +CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y +CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=8192 +CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 +# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set +# CONFIG_MBEDTLS_DEBUG is not set + +# +# mbedTLS v3.x related +# +# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set +# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set +# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set +# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set +CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y +# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set +CONFIG_MBEDTLS_PKCS7_C=y +# end of mbedTLS v3.x related + +# +# Certificate Bundle +# +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set +# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set +# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 +# end of Certificate Bundle + +# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_HARDWARE_AES=y +CONFIG_MBEDTLS_AES_USE_INTERRUPT=y +CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y +CONFIG_MBEDTLS_HARDWARE_MPI=y +# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set +CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y +CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 +CONFIG_MBEDTLS_HARDWARE_SHA=y +CONFIG_MBEDTLS_ROM_MD5=y +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set +# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set +CONFIG_MBEDTLS_HAVE_TIME=y +# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set +# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set +CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y +CONFIG_MBEDTLS_SHA1_C=y +CONFIG_MBEDTLS_SHA512_C=y +# CONFIG_MBEDTLS_SHA3_C is not set +CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y +# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set +# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set +# CONFIG_MBEDTLS_TLS_DISABLED is not set +CONFIG_MBEDTLS_TLS_SERVER=y +CONFIG_MBEDTLS_TLS_CLIENT=y +CONFIG_MBEDTLS_TLS_ENABLED=y + +# +# TLS Key Exchange Methods +# +# CONFIG_MBEDTLS_PSK_MODES is not set +CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y +# end of TLS Key Exchange Methods + +CONFIG_MBEDTLS_SSL_RENEGOTIATION=y +CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y +# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set +# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set +CONFIG_MBEDTLS_SSL_ALPN=y +CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y +CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y + +# +# Symmetric Ciphers +# +CONFIG_MBEDTLS_AES_C=y +# CONFIG_MBEDTLS_CAMELLIA_C is not set +# CONFIG_MBEDTLS_DES_C is not set +# CONFIG_MBEDTLS_BLOWFISH_C is not set +# CONFIG_MBEDTLS_XTEA_C is not set +CONFIG_MBEDTLS_CCM_C=y +CONFIG_MBEDTLS_GCM_C=y +# CONFIG_MBEDTLS_NIST_KW_C is not set +# end of Symmetric Ciphers + +# CONFIG_MBEDTLS_RIPEMD160_C is not set + +# +# Certificates +# +CONFIG_MBEDTLS_PEM_PARSE_C=y +CONFIG_MBEDTLS_PEM_WRITE_C=y +CONFIG_MBEDTLS_X509_CRL_PARSE_C=y +CONFIG_MBEDTLS_X509_CSR_PARSE_C=y +# end of Certificates + +CONFIG_MBEDTLS_ECP_C=y +CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y +CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y +# CONFIG_MBEDTLS_DHM_C is not set +CONFIG_MBEDTLS_ECDH_C=y +CONFIG_MBEDTLS_ECDSA_C=y +# CONFIG_MBEDTLS_ECJPAKE_C is not set +CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y +CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y +CONFIG_MBEDTLS_ECP_NIST_OPTIM=y +# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set +# CONFIG_MBEDTLS_POLY1305_C is not set +# CONFIG_MBEDTLS_CHACHA20_C is not set +CONFIG_MBEDTLS_HKDF_C=y +# CONFIG_MBEDTLS_THREADING_C is not set +CONFIG_MBEDTLS_ERROR_STRINGS=y +CONFIG_MBEDTLS_FS_IO=y +# CONFIG_MBEDTLS_ALLOW_WEAK_CERTIFICATE_VERIFICATION is not set +# end of mbedTLS + +# +# ESP-MQTT Configurations +# +CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_5 is not set +CONFIG_MQTT_TRANSPORT_SSL=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET=y +CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y +# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set +# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set +# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set +# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set +# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set +# CONFIG_MQTT_CUSTOM_OUTBOX is not set +# end of ESP-MQTT Configurations + +# +# LibC +# +CONFIG_LIBC_NEWLIB=y +CONFIG_LIBC_MISC_IN_IRAM=y +CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y +CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set +# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set +CONFIG_LIBC_STDIN_LINE_ENDING_CR=y +# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set +CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y +# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set +# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set +# end of LibC + +CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND=y + +# +# NVS +# +# CONFIG_NVS_ENCRYPTION is not set +# CONFIG_NVS_ASSERT_ERROR_CHECK is not set +# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set +CONFIG_NVS_ALLOCATE_CACHE_IN_SPIRAM=y +# end of NVS + +# +# OpenThread +# +# CONFIG_OPENTHREAD_ENABLED is not set + +# +# OpenThread Spinel +# +# CONFIG_OPENTHREAD_SPINEL_ONLY is not set +# end of OpenThread Spinel + +# CONFIG_OPENTHREAD_DEBUG is not set +# end of OpenThread + +# +# Protocomm +# +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y +CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_PATCH_VERSION=y +# end of Protocomm + +# +# PThreads +# +CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_PTHREAD_STACK_MIN=768 +CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y +# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set +# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set +CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" +# end of PThreads + +# +# MMU Config +# +CONFIG_MMU_PAGE_SIZE_64KB=y +CONFIG_MMU_PAGE_MODE="64KB" +CONFIG_MMU_PAGE_SIZE=0x10000 +# end of MMU Config + +# +# Main Flash configuration +# + +# +# SPI Flash behavior when brownout +# +CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y +CONFIG_SPI_FLASH_BROWNOUT_RESET=y +# end of SPI Flash behavior when brownout + +# +# Optional and Experimental Features (READ DOCS FIRST) +# + +# +# Features here require specific hardware (READ DOCS FIRST!) +# +# CONFIG_SPI_FLASH_HPM_ENA is not set +CONFIG_SPI_FLASH_HPM_AUTO=y +# CONFIG_SPI_FLASH_HPM_DIS is not set +CONFIG_SPI_FLASH_HPM_ON=y +CONFIG_SPI_FLASH_HPM_DC_AUTO=y +# CONFIG_SPI_FLASH_HPM_DC_DISABLE is not set +# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set +CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 +# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set +# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set +CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y +# end of Optional and Experimental Features (READ DOCS FIRST) +# end of Main Flash configuration + +# +# SPI Flash driver +# +# CONFIG_SPI_FLASH_VERIFY_WRITE is not set +# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set +CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y +# CONFIG_SPI_FLASH_ROM_IMPL is not set +CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set +# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set +# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set +CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y +CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 +CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 +CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 +# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set +# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set +# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set + +# +# Auto-detect flash chips +# +CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_VENDOR_TH_SUPPORT_ENABLED=y +CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y +CONFIG_SPI_FLASH_SUPPORT_MXIC_OPI_CHIP=y +# end of Auto-detect flash chips + +CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y +# end of SPI Flash driver + +# +# SPIFFS Configuration +# +CONFIG_SPIFFS_MAX_PARTITIONS=3 + +# +# SPIFFS Cache Configuration +# +CONFIG_SPIFFS_CACHE=y +CONFIG_SPIFFS_CACHE_WR=y +# CONFIG_SPIFFS_CACHE_STATS is not set +# end of SPIFFS Cache Configuration + +CONFIG_SPIFFS_PAGE_CHECK=y +CONFIG_SPIFFS_GC_MAX_RUNS=10 +# CONFIG_SPIFFS_GC_STATS is not set +CONFIG_SPIFFS_PAGE_SIZE=256 +CONFIG_SPIFFS_OBJ_NAME_LEN=32 +# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set +CONFIG_SPIFFS_USE_MAGIC=y +CONFIG_SPIFFS_USE_MAGIC_LENGTH=y +CONFIG_SPIFFS_META_LENGTH=4 +CONFIG_SPIFFS_USE_MTIME=y + +# +# Debug Configuration +# +# CONFIG_SPIFFS_DBG is not set +# CONFIG_SPIFFS_API_DBG is not set +# CONFIG_SPIFFS_GC_DBG is not set +# CONFIG_SPIFFS_CACHE_DBG is not set +# CONFIG_SPIFFS_CHECK_DBG is not set +# CONFIG_SPIFFS_TEST_VISUALISATION is not set +# end of Debug Configuration +# end of SPIFFS Configuration + +# +# TCP Transport +# + +# +# Websocket +# +CONFIG_WS_TRANSPORT=y +CONFIG_WS_BUFFER_SIZE=1024 +# CONFIG_WS_DYNAMIC_BUFFER is not set +# end of Websocket +# end of TCP Transport + +# +# Ultra Low Power (ULP) Co-processor +# +# CONFIG_ULP_COPROC_ENABLED is not set + +# +# ULP Debugging Options +# +# end of ULP Debugging Options +# end of Ultra Low Power (ULP) Co-processor + +# +# Unity unit testing library +# +CONFIG_UNITY_ENABLE_FLOAT=y +CONFIG_UNITY_ENABLE_DOUBLE=y +# CONFIG_UNITY_ENABLE_64BIT is not set +# CONFIG_UNITY_ENABLE_COLOR is not set +CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y +# CONFIG_UNITY_ENABLE_FIXTURE is not set +# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set +# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set +# end of Unity unit testing library + +# +# USB-OTG +# +CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE=256 +CONFIG_USB_HOST_HW_BUFFER_BIAS_BALANCED=y +# CONFIG_USB_HOST_HW_BUFFER_BIAS_IN is not set +# CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT is not set + +# +# Hub Driver Configuration +# + +# +# Root Port configuration +# +CONFIG_USB_HOST_DEBOUNCE_DELAY_MS=250 +CONFIG_USB_HOST_RESET_HOLD_MS=30 +CONFIG_USB_HOST_RESET_RECOVERY_MS=30 +CONFIG_USB_HOST_SET_ADDR_RECOVERY_MS=10 +# end of Root Port configuration + +# CONFIG_USB_HOST_HUBS_SUPPORTED is not set +# end of Hub Driver Configuration + +# CONFIG_USB_HOST_ENABLE_ENUM_FILTER_CALLBACK is not set +CONFIG_USB_OTG_SUPPORTED=y +# end of USB-OTG + +# +# Virtual file system +# +CONFIG_VFS_SUPPORT_IO=y +CONFIG_VFS_SUPPORT_DIR=y +CONFIG_VFS_SUPPORT_SELECT=y +CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y +# CONFIG_VFS_SELECT_IN_RAM is not set +CONFIG_VFS_SUPPORT_TERMIOS=y +CONFIG_VFS_MAX_COUNT=16 + +# +# Host File System I/O (Semihosting) +# +CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# end of Host File System I/O (Semihosting) + +CONFIG_VFS_INITIALIZE_DEV_NULL=y +# end of Virtual file system + +# +# Wear Levelling +# +# CONFIG_WL_SECTOR_SIZE_512 is not set +CONFIG_WL_SECTOR_SIZE_4096=y +CONFIG_WL_SECTOR_SIZE=4096 +# end of Wear Levelling + +# +# Wi-Fi Provisioning Manager +# +CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 +CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 +CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y +# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set +# end of Wi-Fi Provisioning Manager + +# +# TianShanOS API Configuration +# +CONFIG_TS_API_MAX_ENDPOINTS=288 +CONFIG_TS_API_MAX_NAME_LENGTH=64 +CONFIG_TS_API_ENABLE_AUTH=y +# end of TianShanOS API Configuration + +# +# TianShanOS Automation Engine +# +CONFIG_TS_AUTOMATION_ENABLED=y +CONFIG_TS_AUTOMATION_CONFIG_PATH="/sdcard/config/automation.json" +CONFIG_TS_AUTOMATION_MAX_SOURCES=16 +CONFIG_TS_AUTOMATION_MAX_RULES=32 +CONFIG_TS_AUTOMATION_MAX_VARIABLES=512 +CONFIG_TS_AUTOMATION_TASK_STACK_SIZE=4096 +CONFIG_TS_AUTOMATION_TASK_PRIORITY=5 +# end of TianShanOS Automation Engine + +# +# TianShanOS PKI Certificate +# +CONFIG_TS_CERT_ENABLED=y +CONFIG_TS_CERT_DEFAULT_ORG="TianShanOS" +CONFIG_TS_CERT_DEFAULT_OU="Device" +CONFIG_TS_CERT_AUTO_INIT=y +CONFIG_TS_CERT_EXPIRY_WARNING_DAYS=30 +# end of TianShanOS PKI Certificate + +# +# TianShanOS Config Pack +# +CONFIG_TS_CONFIG_PACK_ENABLED=y +CONFIG_TS_CONFIG_PACK_MAX_SIZE=65536 +CONFIG_TS_CONFIG_PACK_VERIFY_CERT_CHAIN=y +# CONFIG_TS_CONFIG_PACK_REQUIRE_OFFICIAL_SIG is not set +# end of TianShanOS Config Pack + +# +# TianShanOS Console Configuration +# +CONFIG_TS_CONSOLE_MAX_LINE_LENGTH=256 +CONFIG_TS_CONSOLE_MAX_HISTORY=50 +CONFIG_TS_CONSOLE_TASK_PRIORITY=5 +CONFIG_TS_CONSOLE_TASK_STACK_SIZE=6144 +CONFIG_TS_CONSOLE_DEFAULT_PROMPT="tianshan> " +CONFIG_TS_CONSOLE_ENABLE_COLORS=y +CONFIG_TS_CONSOLE_HISTORY_FILE="/sdcard/.console_history" +# end of TianShanOS Console Configuration + +# +# TianShanOS Drivers Configuration +# +CONFIG_TS_DRIVERS_FAN_ENABLE=y +CONFIG_TS_DRIVERS_FAN_PWM_FREQ=25000 +CONFIG_TS_DRIVERS_FAN_TEMP_UPDATE_MS=1000 +CONFIG_TS_DRIVERS_POWER_ENABLE=y +CONFIG_TS_DRIVERS_POWER_ADC_SAMPLES=16 +CONFIG_TS_DRIVERS_DEVICE_ENABLE=y +CONFIG_TS_DRIVERS_AGX_POWER_ON_DELAY_MS=100 +CONFIG_TS_DRIVERS_USB_MUX_ENABLE=y +# end of TianShanOS Drivers Configuration + +# +# TianShanOS HAL Configuration +# +CONFIG_TS_HAL_MAX_PINS=48 +CONFIG_TS_HAL_MAX_GPIO_HANDLES=32 +CONFIG_TS_HAL_MAX_PWM_HANDLES=8 +CONFIG_TS_HAL_MAX_I2C_HANDLES=4 +CONFIG_TS_HAL_MAX_SPI_HANDLES=4 +CONFIG_TS_HAL_MAX_UART_HANDLES=3 +CONFIG_TS_HAL_MAX_ADC_HANDLES=8 +CONFIG_TS_HAL_PIN_CONFIG_PATH="/sdcard/config/pins.json" +CONFIG_TS_HAL_ENABLE_PIN_CONFLICT_CHECK=y +CONFIG_TS_HAL_PWM_DEFAULT_FREQ=25000 +CONFIG_TS_HAL_PWM_DEFAULT_RESOLUTION=8 +# end of TianShanOS HAL Configuration + +# +# TianShanOS HTTPS Server +# +# CONFIG_TS_HTTPS_ENABLED is not set +# end of TianShanOS HTTPS Server + +# +# TianShanOS LED Configuration +# +CONFIG_TS_LED_MAX_DEVICES=8 +CONFIG_TS_LED_MAX_LAYERS=8 +CONFIG_TS_LED_DEFAULT_BRIGHTNESS=128 +CONFIG_TS_LED_TASK_PRIORITY=5 +CONFIG_TS_LED_TASK_STACK_SIZE=3072 +CONFIG_TS_LED_REFRESH_RATE_HZ=60 + +# +# Touch LED Settings +# +CONFIG_TS_LED_TOUCH_COUNT=1 +CONFIG_TS_LED_TOUCH_DEFAULT_BRIGHTNESS=80 +# end of Touch LED Settings + +# +# Board LED Settings +# +CONFIG_TS_LED_BOARD_COUNT=28 +CONFIG_TS_LED_BOARD_DEFAULT_BRIGHTNESS=60 +# end of Board LED Settings + +# +# Matrix LED Settings +# +CONFIG_TS_LED_MATRIX_WIDTH=32 +CONFIG_TS_LED_MATRIX_HEIGHT=32 +CONFIG_TS_LED_MATRIX_DEFAULT_BRIGHTNESS=50 +# end of Matrix LED Settings + +# +# Image Support +# +CONFIG_TS_LED_ENABLE_BMP=y +CONFIG_TS_LED_ENABLE_PNG=y +CONFIG_TS_LED_ENABLE_JPG=y +CONFIG_TS_LED_ENABLE_GIF=y +# end of Image Support +# end of TianShanOS LED Configuration + +# +# TianShanOS Network Configuration +# +CONFIG_TS_NET_ETHERNET_ENABLE=y +CONFIG_TS_NET_ETH_SPI_HOST=2 +# CONFIG_TS_NET_WIFI_ENABLE is not set +CONFIG_TS_NET_DHCP_SERVER_ENABLE=y +# CONFIG_TS_NET_MDNS_ENABLE is not set +CONFIG_TS_NET_HTTP_SERVER_ENABLE=y +CONFIG_TS_NET_HTTP_PORT=80 +CONFIG_TS_NET_HTTPS_PORT=443 +# end of TianShanOS Network Configuration + +# +# TianShanOS OTA Configuration +# +CONFIG_TS_OTA_ENABLED=y +CONFIG_TS_OTA_ROLLBACK_TIMEOUT=60 +CONFIG_TS_OTA_HTTPS_ENABLED=y +CONFIG_TS_OTA_SDCARD_ENABLED=y +CONFIG_TS_OTA_WEBUI_UPLOAD_ENABLED=y +CONFIG_TS_OTA_BUFFER_SIZE=8192 +# CONFIG_TS_OTA_VERIFY_SIGNATURE is not set +# CONFIG_TS_OTA_ANTI_ROLLBACK is not set +CONFIG_TS_OTA_VERSION_CHECK=y +CONFIG_TS_OTA_DEFAULT_URL="https://ota.example.com/tianshanos" +CONFIG_TS_OTA_TASK_STACK_SIZE=8192 +CONFIG_TS_OTA_TASK_PRIORITY=5 +# end of TianShanOS OTA Configuration + +# +# TianShanOS Security Configuration +# +CONFIG_TS_SECURITY_ENABLE=y +CONFIG_TS_SECURITY_KEY_STORAGE_NVS=y +CONFIG_TS_SECURITY_MTLS_ENABLE=y +CONFIG_TS_SECURITY_TOKEN_EXPIRE_SEC=86400 +CONFIG_TS_SECURITY_MAX_SESSIONS=8 +CONFIG_TS_SECURITY_PERMISSION_LEVELS=4 +CONFIG_TS_SSH_LOG_WATCH_MAX=32 +# end of TianShanOS Security Configuration + +# +# TianShanOS Storage Configuration +# +CONFIG_TS_STORAGE_ENABLE_SPIFFS=y +CONFIG_TS_STORAGE_SPIFFS_MOUNT_POINT="/spiffs" +CONFIG_TS_STORAGE_SPIFFS_PARTITION="storage" +CONFIG_TS_STORAGE_SPIFFS_MAX_FILES=5 +CONFIG_TS_STORAGE_ENABLE_SD=y +CONFIG_TS_STORAGE_SD_MOUNT_POINT="/sdcard" +CONFIG_TS_STORAGE_SD_MAX_FREQ_KHZ=20000 +# CONFIG_TS_STORAGE_SD_MODE_SPI is not set +# CONFIG_TS_STORAGE_SD_MODE_SDIO_1BIT is not set +CONFIG_TS_STORAGE_SD_MODE_SDIO_4BIT=y + +# +# SD Card GPIO Configuration +# +CONFIG_TS_STORAGE_SD_CMD_GPIO=15 +CONFIG_TS_STORAGE_SD_CLK_GPIO=16 +CONFIG_TS_STORAGE_SD_D0_GPIO=4 +CONFIG_TS_STORAGE_SD_D1_GPIO=5 +CONFIG_TS_STORAGE_SD_D2_GPIO=6 +CONFIG_TS_STORAGE_SD_D3_GPIO=7 +# end of SD Card GPIO Configuration +# end of TianShanOS Storage Configuration + +# +# TianShanOS WebUI Configuration +# +CONFIG_TS_WEBUI_ENABLE=y +CONFIG_TS_WEBUI_API_PREFIX="/api/v1" +CONFIG_TS_WEBUI_WS_ENABLE=y +CONFIG_TS_WEBUI_WS_MAX_CLIENTS=8 +CONFIG_TS_WEBUI_TERMINAL_OUTPUT_BUF_SIZE=32768 +CONFIG_TS_WEBUI_AUTH_REQUIRED=y +CONFIG_TS_WEBUI_CORS_ENABLE=y +CONFIG_TS_WEBUI_STATIC_PATH="/www" +# end of TianShanOS WebUI Configuration + +# +# TianShanOS Configuration Management +# +CONFIG_TS_CONFIG_ENABLE=y +CONFIG_TS_CONFIG_MAX_KEY_LENGTH=64 +CONFIG_TS_CONFIG_MAX_VALUE_SIZE=512 +CONFIG_TS_CONFIG_MAX_LISTENERS=16 +CONFIG_TS_CONFIG_NVS_NAMESPACE="ts_config" + +# +# Configuration Backends +# +CONFIG_TS_CONFIG_NVS_BACKEND=y +CONFIG_TS_CONFIG_FILE_BACKEND=y +CONFIG_TS_CONFIG_FILE_PATH="/sdcard/config" +CONFIG_TS_CONFIG_FILE_FORMAT_JSON=y +# end of Configuration Backends + +# +# Configuration Priorities +# +CONFIG_TS_CONFIG_PRIORITY_CLI=100 +CONFIG_TS_CONFIG_PRIORITY_NVS=80 +CONFIG_TS_CONFIG_PRIORITY_FILE=60 +CONFIG_TS_CONFIG_PRIORITY_DEFAULT=0 +# end of Configuration Priorities + +CONFIG_TS_CONFIG_AUTO_SAVE=y +CONFIG_TS_CONFIG_AUTO_SAVE_DELAY_MS=1000 +# CONFIG_TS_CONFIG_DEBUG is not set +# end of TianShanOS Configuration Management + +# +# TianShanOS Logging +# +CONFIG_TS_LOG_ENABLE=y +# CONFIG_TS_LOG_DEFAULT_LEVEL_NONE is not set +# CONFIG_TS_LOG_DEFAULT_LEVEL_ERROR is not set +# CONFIG_TS_LOG_DEFAULT_LEVEL_WARN is not set +CONFIG_TS_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_TS_LOG_DEFAULT_LEVEL_DEBUG is not set +# CONFIG_TS_LOG_DEFAULT_LEVEL_VERBOSE is not set +CONFIG_TS_LOG_DEFAULT_LEVEL=3 +CONFIG_TS_LOG_COLORS=y +CONFIG_TS_LOG_TIMESTAMP=y +CONFIG_TS_LOG_TASK_NAME=y + +# +# Log Outputs +# +CONFIG_TS_LOG_OUTPUT_CONSOLE=y +# CONFIG_TS_LOG_OUTPUT_FILE is not set +CONFIG_TS_LOG_OUTPUT_BUFFER=y +CONFIG_TS_LOG_BUFFER_SIZE=500 +CONFIG_TS_LOG_CAPTURE_ESP_LOG=y +# end of Log Outputs + +CONFIG_TS_LOG_TAG_MAX_LENGTH=16 +CONFIG_TS_LOG_MESSAGE_MAX_LENGTH=256 +# end of TianShanOS Logging + +# +# TianShanOS Event System +# +CONFIG_TS_EVENT_ENABLE=y +CONFIG_TS_EVENT_LOOP_TASK_PRIORITY=5 +CONFIG_TS_EVENT_LOOP_TASK_STACK_SIZE=4096 +CONFIG_TS_EVENT_QUEUE_SIZE=32 +CONFIG_TS_EVENT_MAX_HANDLERS=64 +CONFIG_TS_EVENT_MAX_EVENT_TYPES=64 +CONFIG_TS_EVENT_DATA_MAX_SIZE=256 +CONFIG_TS_EVENT_ENABLE_STATS=y +# CONFIG_TS_EVENT_ENABLE_TRACING is not set +# end of TianShanOS Event System + +# +# TianShanOS Service Management +# +CONFIG_TS_SERVICE_ENABLE=y +CONFIG_TS_SERVICE_MAX_SERVICES=32 +CONFIG_TS_SERVICE_NAME_MAX_LENGTH=32 +CONFIG_TS_SERVICE_MAX_DEPENDENCIES=8 +CONFIG_TS_SERVICE_STARTUP_TIMEOUT_MS=30000 +CONFIG_TS_SERVICE_SHUTDOWN_TIMEOUT_MS=10000 + +# +# Startup Phases +# +CONFIG_TS_SERVICE_PHASE_PLATFORM_PRIORITY=10 +CONFIG_TS_SERVICE_PHASE_CORE_PRIORITY=20 +CONFIG_TS_SERVICE_PHASE_HAL_PRIORITY=30 +CONFIG_TS_SERVICE_PHASE_DRIVER_PRIORITY=40 +CONFIG_TS_SERVICE_PHASE_NETWORK_PRIORITY=50 +CONFIG_TS_SERVICE_PHASE_SECURITY_PRIORITY=60 +CONFIG_TS_SERVICE_PHASE_SERVICE_PRIORITY=70 +CONFIG_TS_SERVICE_PHASE_UI_PRIORITY=80 +# end of Startup Phases + +CONFIG_TS_SERVICE_ENABLE_WATCHDOG=y +CONFIG_TS_SERVICE_WATCHDOG_TIMEOUT_MS=60000 +# CONFIG_TS_SERVICE_DEBUG is not set +# end of TianShanOS Service Management + +# +# JPEG Decoder +# +CONFIG_JD_USE_ROM=y +# end of JPEG Decoder + +# +# ESP WebSocket client +# +# CONFIG_ESP_WS_CLIENT_ENABLE_DYNAMIC_BUFFER is not set +# CONFIG_ESP_WS_CLIENT_SEPARATE_TX_LOCK is not set +# end of ESP WebSocket client + +# +# mDNS +# +CONFIG_MDNS_MAX_INTERFACES=3 +CONFIG_MDNS_MAX_SERVICES=10 +CONFIG_MDNS_TASK_PRIORITY=1 +CONFIG_MDNS_ACTION_QUEUE_LEN=16 +CONFIG_MDNS_TASK_STACK_SIZE=4096 +# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set +CONFIG_MDNS_TASK_AFFINITY_CPU0=y +# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set +CONFIG_MDNS_TASK_AFFINITY=0x0 + +# +# MDNS Memory Configuration +# +# CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM is not set +CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL=y +# CONFIG_MDNS_MEMORY_ALLOC_SPIRAM is not set +CONFIG_MDNS_MEMORY_ALLOC_INTERNAL=y +# CONFIG_MDNS_MEMORY_CUSTOM_IMPL is not set +# end of MDNS Memory Configuration + +CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 +CONFIG_MDNS_TIMER_PERIOD_MS=100 +# CONFIG_MDNS_NETWORKING_SOCKET is not set +# CONFIG_MDNS_SKIP_SUPPRESSING_OWN_QUERIES is not set +# CONFIG_MDNS_ENABLE_DEBUG_PRINTS is not set +CONFIG_MDNS_ENABLE_CONSOLE_CLI=y +# CONFIG_MDNS_RESPOND_REVERSE_QUERIES is not set +CONFIG_MDNS_MULTIPLE_INSTANCE=y + +# +# MDNS Predefined interfaces +# +CONFIG_MDNS_PREDEF_NETIF_STA=y +CONFIG_MDNS_PREDEF_NETIF_AP=y +CONFIG_MDNS_PREDEF_NETIF_ETH=y +# end of MDNS Predefined interfaces +# end of mDNS +# end of Component config + +# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set + +# Deprecated options for backward compatibility +# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set +# CONFIG_NO_BLOBS is not set +# CONFIG_APP_ROLLBACK_ENABLE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set +CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y +# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set +# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set +CONFIG_LOG_BOOTLOADER_LEVEL=3 +# CONFIG_FLASH_ENCRYPTION_ENABLED is not set +CONFIG_FLASHMODE_QIO=y +# CONFIG_FLASHMODE_QOUT is not set +# CONFIG_FLASHMODE_DIO is not set +# CONFIG_FLASHMODE_DOUT is not set +CONFIG_MONITOR_BAUD=115200 +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_CXX_EXCEPTIONS is not set +# CONFIG_STACK_CHECK_NONE is not set +# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_STRONG is not set +CONFIG_STACK_CHECK_ALL=y +CONFIG_STACK_CHECK=y +# CONFIG_WARN_WRITE_STRINGS is not set +# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set +CONFIG_ESP32_APPTRACE_DEST_NONE=y +CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y +# CONFIG_EXTERNAL_COEX_ENABLE is not set +# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set +# CONFIG_CAM_CTLR_DVP_CAM_ISR_IRAM_SAFE is not set +# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set +# CONFIG_MCPWM_ISR_IRAM_SAFE is not set +# CONFIG_EVENT_LOOP_PROFILING is not set +CONFIG_POST_EVENTS_FROM_ISR=y +CONFIG_POST_EVENTS_FROM_IRAM_ISR=y +CONFIG_GDBSTUB_SUPPORT_TASKS=y +CONFIG_GDBSTUB_MAX_TASKS=32 +CONFIG_OTA_ALLOW_HTTP=y +CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 +CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set +# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set +CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 +CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y +CONFIG_BROWNOUT_DET=y +CONFIG_ESP32S3_BROWNOUT_DET=y +CONFIG_BROWNOUT_DET_LVL_SEL_7=y +CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y +# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set +# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set +# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set +CONFIG_BROWNOUT_DET_LVL=7 +CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 +CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y +CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y +# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set +CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 +CONFIG_ESP32_PHY_MAX_TX_POWER=20 +# CONFIG_REDUCE_PHY_TX_POWER is not set +# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set +CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y +CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y +CONFIG_ESP32S3_SPIRAM_SUPPORT=y +CONFIG_DEFAULT_PSRAM_CLK_IO=30 +CONFIG_DEFAULT_PSRAM_CS_IO=26 +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set +# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240 +CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=3584 +CONFIG_MAIN_TASK_STACK_SIZE=4608 +CONFIG_CONSOLE_UART_DEFAULT=y +# CONFIG_CONSOLE_UART_CUSTOM is not set +# CONFIG_CONSOLE_UART_NONE is not set +# CONFIG_ESP_CONSOLE_UART_NONE is not set +CONFIG_CONSOLE_UART=y +CONFIG_CONSOLE_UART_NUM=0 +CONFIG_CONSOLE_UART_BAUDRATE=115200 +CONFIG_INT_WDT=y +CONFIG_INT_WDT_TIMEOUT_MS=300 +CONFIG_INT_WDT_CHECK_CPU1=y +CONFIG_TASK_WDT=y +CONFIG_ESP_TASK_WDT=y +# CONFIG_TASK_WDT_PANIC is not set +CONFIG_TASK_WDT_TIMEOUT_S=30 +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y +CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y +# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set +CONFIG_ESP32S3_DEBUG_OCDAWARE=y +CONFIG_IPC_TASK_STACK_SIZE=1280 +CONFIG_TIMER_TASK_STACK_SIZE=3584 +CONFIG_ESP32_WIFI_ENABLED=y +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=4 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y +CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=0 +CONFIG_ESP32_WIFI_STATIC_TX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_CACHE_TX_BUFFER_NUM=16 +# CONFIG_ESP32_WIFI_CSI_ENABLED is not set +CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y +CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y +CONFIG_ESP32_WIFI_RX_BA_WIN=6 +# CONFIG_ESP32_WIFI_AMSDU_TX_ENABLED is not set +CONFIG_ESP32_WIFI_NVS_ENABLED=y +CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y +# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set +CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 +CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=8 +CONFIG_ESP32_WIFI_IRAM_OPT=y +CONFIG_ESP32_WIFI_RX_IRAM_OPT=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y +CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y +CONFIG_WPA_MBEDTLS_CRYPTO=y +CONFIG_WPA_MBEDTLS_TLS_CLIENT=y +# CONFIG_WPA_WAPI_PSK is not set +# CONFIG_WPA_SUITE_B_192 is not set +# CONFIG_WPA_11KV_SUPPORT is not set +# CONFIG_WPA_MBO_SUPPORT is not set +# CONFIG_WPA_DPP_SUPPORT is not set +# CONFIG_WPA_11R_SUPPORT is not set +# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set +# CONFIG_WPA_WPS_STRICT is not set +# CONFIG_WPA_DEBUG_PRINT is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set +# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set +CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y +CONFIG_TIMER_TASK_PRIORITY=1 +CONFIG_TIMER_TASK_STACK_DEPTH=3072 +CONFIG_TIMER_QUEUE_LENGTH=10 +# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set +CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y +# CONFIG_HAL_ASSERTION_SILIENT is not set +# CONFIG_L2_TO_L3_COPY is not set +CONFIG_ESP_GRATUITOUS_ARP=y +CONFIG_GARP_TMR_INTERVAL=60 +CONFIG_TCPIP_RECVMBOX_SIZE=8 +CONFIG_TCP_MAXRTX=12 +CONFIG_TCP_SYNMAXRTX=12 +CONFIG_TCP_MSS=1440 +CONFIG_TCP_MSL=60000 +CONFIG_TCP_SND_BUF_DEFAULT=4096 +CONFIG_TCP_WND_DEFAULT=4096 +CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_QUEUE_OOSEQ=y +CONFIG_TCP_OVERSIZE_MSS=y +# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set +# CONFIG_TCP_OVERSIZE_DISABLE is not set +CONFIG_UDP_RECVMBOX_SIZE=6 +CONFIG_TCPIP_TASK_STACK_SIZE=3072 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set +# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF +# CONFIG_PPP_SUPPORT is not set +CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set +# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set +# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set +CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y +# CONFIG_NEWLIB_NANO_FORMAT is not set +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y +CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y +# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set +# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set +# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set +CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 +CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 +CONFIG_ESP32_PTHREAD_STACK_MIN=768 +CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set +# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set +CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 +CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" +CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set +# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set +CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y +CONFIG_SUPPORT_TERMIOS=y +CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 +# End of deprecated options diff --git a/docs/repair/ssh-poll-stack/manifest.json b/docs/repair/ssh-poll-stack/manifest.json new file mode 100644 index 0000000..be0ec20 --- /dev/null +++ b/docs/repair/ssh-poll-stack/manifest.json @@ -0,0 +1,72 @@ +{ + "head": "3a19128d8638771c958fe47df1d6a7d339a10a4c", + "before_source": { + "path": "/tmp/ssh-poll-before.c", + "sha256": "cb8f801a18672c24636fe744cacf0f1e0379f75b579bcd4869bb9c9d8e541949" + }, + "after_source_sha256": "e53fa635a9775b571a143f9e54fdfd329eeb501345d878833b6567a3f41b21bb", + "builds": { + "candidate": { + "dir": "/tmp/tianshan-ssh-stack-candidate/build", + "config_sha256": "1340e033b5865e39dd6b8c3516dffb27d01da5aff41127c69b583cbfb99acef0", + "vendor": [ + { + "file": "xterm.min.js", + "sha256": "fc1dd31b221e3e5f929486e07a80b477a8aaf9dce2b4f9c3ffe7dd25f370655d", + "raw": 283670, + "gzip": 65684 + }, + { + "file": "xterm.css", + "sha256": "832f3f2c603b43ad4351ff04970150cc7a873014276db126a6065c6dd81e4872", + "raw": 5383, + "gzip": 2037 + }, + { + "file": "fit.min.js", + "sha256": "c78e5795c6487acdf24ab436798d4a9cec3848101b281bc65b061f39db714be1", + "raw": 1789, + "gzip": 822 + } + ], + "flash_files": { + "0x0": "bootloader/bootloader.bin", + "0x20000": "TianShanOS.bin", + "0x8000": "partition_table/partition-table.bin", + "0x16000": "ota_data_initial.bin", + "0x6a0000": "www.bin" + } + }, + "diagnostic": { + "dir": "/tmp/tianshan-ssh-stack-diagnostic/build", + "config_sha256": "cf1c9534a0686d9ce89fd3b31e3f1db2b8f984d1b646bad8bd467afae2c05e7c", + "vendor": [ + { + "file": "xterm.min.js", + "sha256": "fc1dd31b221e3e5f929486e07a80b477a8aaf9dce2b4f9c3ffe7dd25f370655d", + "raw": 283670, + "gzip": 65684 + }, + { + "file": "xterm.css", + "sha256": "832f3f2c603b43ad4351ff04970150cc7a873014276db126a6065c6dd81e4872", + "raw": 5383, + "gzip": 2037 + }, + { + "file": "fit.min.js", + "sha256": "c78e5795c6487acdf24ab436798d4a9cec3848101b281bc65b061f39db714be1", + "raw": 1789, + "gzip": 822 + } + ], + "flash_files": { + "0x0": "bootloader/bootloader.bin", + "0x20000": "TianShanOS.bin", + "0x8000": "partition_table/partition-table.bin", + "0x16000": "ota_data_initial.bin", + "0x6a0000": "www.bin" + } + } + } +} diff --git a/docs/repair/ssh-poll-stack/optimized-xterm.txt b/docs/repair/ssh-poll-stack/optimized-xterm.txt new file mode 100644 index 0000000..b0a08e5 --- /dev/null +++ b/docs/repair/ssh-poll-stack/optimized-xterm.txt @@ -0,0 +1,10 @@ +✔ en-US: cold offline real xterm and terminal lifecycle (969.883084ms) +✔ zh-CN: cold offline real xterm and terminal lifecycle (770.501209ms) +ℹ tests 2 +ℹ suites 0 +ℹ pass 2 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 1926.154667 diff --git a/docs/repair/ssh-poll-stack/optimized/browser.json b/docs/repair/ssh-poll-stack/optimized/browser.json new file mode 100644 index 0000000..a3ad5bd --- /dev/null +++ b/docs/repair/ssh-poll-stack/optimized/browser.json @@ -0,0 +1,31 @@ +[ + { + "name": "browser", + "command": [ + "npm", + "run", + "test:browser", + "--prefix", + "tests/prompts" + ], + "exit": 0 + }, + { + "name": "cross-browser-en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + }, + { + "name": "cross-browser-zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/optimized/browser.log b/docs/repair/ssh-poll-stack/optimized/browser.log new file mode 100644 index 0000000..7cc43c3 --- /dev/null +++ b/docs/repair/ssh-poll-stack/optimized/browser.log @@ -0,0 +1,56 @@ + +> test:browser +> cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs + +✔ zh-CN: real index cold start, safe toast/file text, current websocket state (707.620417ms) +✔ zh-CN: initial language failure blocks controls and retry recovers (325.03525ms) +✔ en-US: real index cold start, safe toast/file text, current websocket state (345.495583ms) +✔ en-US: initial language failure blocks controls and retry recovers (382.403125ms) +✔ delayed language package and rapid switches keep the latest requested language (302.962125ms) +✔ terminal resource failure presents retry; a rejected cached promise is not reused (366.256875ms) +✔ zh-CN: package confirmation treats names as text and applies only on explicit verified action (299.486791ms) +✔ en-US: package confirmation treats names as text and applies only on explicit verified action (329.599959ms) +✔ initial delayed language keeps controls inert until the real package arrives (243.382958ms) +✔ failed language switch preserves the loaded language; retry clears failure and stale toast (373.290458ms) +✔ terminal can initialize after failed resource load using newly served resources (390.703417ms) +{"case":"successful retry","language":"zh-CN","failure":"/sdcard/a.tscfg: 应用失败: 设备处理请求时发生错误,请查看详细原因。\n详细原因:fixture failure","afterSuccess":"/sdcard/a.tscfg: 配置包已应用。","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure zh-CN (643.640208ms) +{"case":"late completion","language":"zh-CN","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: 正在应用配置...","errors":[]} +✔ review2: prior completion closes new package confirmation zh-CN (179.028166ms) +{"case":"stale file list","language":"zh-CN","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close zh-CN (232.798042ms) +{"case":"successful retry","language":"en-US","failure":"/sdcard/a.tscfg: Apply failed: The device encountered an error while processing the request. See the details below.\nDetails: fixture failure","afterSuccess":"/sdcard/a.tscfg: The configuration package was applied.","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure en-US (295.160792ms) +{"case":"late completion","language":"en-US","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: Applying config...","errors":[]} +✔ review2: prior completion closes new package confirmation en-US (284.695ms) +{"case":"stale file list","language":"en-US","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close en-US (271.764041ms) +✔ R1: endpoint-specific logout and HTTP errors zh-CN (179.900042ms) +✔ R3: late validation cannot revive an old apply entry zh-CN (195.278792ms) +✔ R3: previously opened confirmation loses validity on reupload zh-CN (171.976583ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts zh-CN (188.442416ms) +✔ R6: fixed upload destination and separate refresh failure zh-CN (181.813125ms) +✔ R6: out-of-order directory success and error do not replace latest list zh-CN (199.995916ms) +✔ R1: endpoint-specific logout and HTTP errors en-US (270.188833ms) +✔ R3: late validation cannot revive an old apply entry en-US (275.258084ms) +✔ R3: previously opened confirmation loses validity on reupload en-US (261.444875ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts en-US (256.402625ms) +✔ R6: fixed upload destination and separate refresh failure en-US (238.494167ms) +✔ R6: out-of-order directory success and error do not replace latest list en-US (263.223375ms) +✔ R2: authenticated startup initializes once (280.434584ms) +✔ R2: obsolete system loader cannot update new page; failed navigation retries (239.107833ms) +✔ R4/R5: newest result wins over late success and late failure (254.992542ms) +✔ R3: overlapping writes to one path cannot claim current verified content (241.551542ms) +✔ R2: disposed page only removes its dashboard callback (267.447041ms) +✔ R2: stale finally cannot unlock the new page read (249.192417ms) +✔ R1: delayed sign-out does not clear a newer sign-in (258.742458ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements zh-CN (309.668791ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements en-US (392.888208ms) +ℹ tests 38 +ℹ suites 0 +ℹ pass 38 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 7494.396541 diff --git a/docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.json b/docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.log b/docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.log new file mode 100644 index 0000000..f832b4b --- /dev/null +++ b/docs/repair/ssh-poll-stack/optimized/cross-browser-en-US.log @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.json b/docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.log b/docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.log new file mode 100644 index 0000000..1f8c8bd --- /dev/null +++ b/docs/repair/ssh-poll-stack/optimized/cross-browser-zh-CN.log @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ssh-poll-stack/publication-gate.md b/docs/repair/ssh-poll-stack/publication-gate.md new file mode 100644 index 0000000..f4f3205 --- /dev/null +++ b/docs/repair/ssh-poll-stack/publication-gate.md @@ -0,0 +1,16 @@ +# PR #42 本轮提交前检查 + +结论:可以推送,限本轮 SSH poller 最小修复及证据。 + +- 远端 PR head 与本地基线均为 3a19128d8638771c958fe47df1d6a7d339a10a4c,分支一致。 +- 生产差异仅 8192 bytes PSRAM stack 预算与配套 vTaskDeleteWithCaps;不改变输出缓冲、优先级、协议、operation 或保护策略。 +- 当前生产文件 SHA256 与 manifest 中构建输入一致:e53fa635a9775b571a143f9e54fdfd329eeb501345d878833b6567a3f41b21bb。未因提交准备修改生产输入,未重复完整构建。 +- 本次重跑 `IDF_PATH=/Users/massif/esp/v5.5.2/esp-idf bash tests/ws_subscriptions/run_operation_adapter.sh` 退出0;涵盖生产调用方及10次关闭/回收,ASan/UBSan。首次未设 IDF_PATH 被脚本拒绝,补齐固定 SDK 路径后重跑。 +- 现存固定 SDK 两版构建及真机证据见 README;新 head CI 必须单独查看,不沿用旧 head 绿灯。 +- 凭据模式检查未发现提交材料含真实 SSH 密码、Bearer token 或明文 token。无固件二进制、node_modules 或构建目录纳入提交。 +- 排除原有 output/、tmp/、docs/runtime-repair/evidence/reviewer-fixes/diff-check.txt,保留原地。 +- 余下边界:30秒安全 debug_tick 不等于低压关机测试;未直接读取真机 operation ledger;小幅堆净差未归因,不能宣称零泄漏。多终端抢占现象如实记录。 + +用户授权更新 PR;本轮不合并、不打 tag、不发布。 + +暂存检查补充:全量 `git diff --cached --check` 报告原始构建/串口日志的尾随空格、CRLF,以及 change.patch 的空白上下文行。保留这些证据原文,不为消除格式告警改写日志;排除上述原始 .log、crash.txt、change.patch 后,生产、测试及文档差异检查通过。 diff --git a/docs/repair/ssh-poll-stack/requests-source-en-US.json b/docs/repair/ssh-poll-stack/requests-source-en-US.json new file mode 100644 index 0000000..59325af --- /dev/null +++ b/docs/repair/ssh-poll-stack/requests-source-en-US.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/en-US.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/requests-source-zh-CN.json b/docs/repair/ssh-poll-stack/requests-source-zh-CN.json new file mode 100644 index 0000000..ef547b7 --- /dev/null +++ b/docs/repair/ssh-poll-stack/requests-source-zh-CN.json @@ -0,0 +1,71 @@ +{ + "requests": [ + { + "url": "http://fixture.local/", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/css/style.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-48.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/api.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/router.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/terminal.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/dragSort.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/app.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/js/lang/zh-CN.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/fonts/remixicon.woff2", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/api/v1/ota/version", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/images/tslogo-32.png", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.css?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/xterm.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + }, + { + "url": "http://fixture.local/vendor/xterm/fit.min.js?v=20260928-local-xterm", + "origin": "http://fixture.local" + } + ], + "errors": [], + "realXterm": true, + "externalRequests": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/results/adapter.log b/docs/repair/ssh-poll-stack/results/adapter.log new file mode 100644 index 0000000..540987e --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/adapter.log @@ -0,0 +1,13 @@ +PASS G1 same observable assertion: old rejection callback cannot corrupt replacement Shell (whole production unit) +PASS G2 same observable assertion: pending A fails while B prepares; B settles before terminal, no output follows terminal +PASS B11 timer delete/barrier retry retains original params; busy stop recovers without new business; late timer cannot abort replacement +PASS bounded timer drain retry exhaustion is retained and explicitly resumed by stop retry +PASS B09 observation failure still executes actual matching and variable updates without aborting remote command +PASS original timeout and stop-on-match business abort semantics retained +PASS original cancel ID contract, user disconnecting status and frozen terminal recipient snapshot +PASS no recipients: no observation JSON/payload allocation; business executes and tickets retire +PASS task-create and allocation failure sweep: all actual contexts, credentials, output buffers and reservations reclaimed +PASS output encoding allocation sweep: no partial protocol objects escape, original ticket/resource ledgers drain +PASS healthy stop drains original Shell within bounded wait, worker self-stop rejected, timer barrier callback-before-return remains pinned +PASS timer allocation/start failure cleanup: no timer reference leak; underlying SSH deadline policy unchanged +PASS complete production WS unit: Shell output failure/close/startup failure, Exec task/callback/match/variables/timer cleanup and task-before-create-return; destroyed=94 diff --git a/docs/repair/ssh-poll-stack/results/browser.json b/docs/repair/ssh-poll-stack/results/browser.json new file mode 100644 index 0000000..a3ad5bd --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/browser.json @@ -0,0 +1,31 @@ +[ + { + "name": "browser", + "command": [ + "npm", + "run", + "test:browser", + "--prefix", + "tests/prompts" + ], + "exit": 0 + }, + { + "name": "cross-browser-en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + }, + { + "name": "cross-browser-zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs", + "--browser" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/results/browser.log b/docs/repair/ssh-poll-stack/results/browser.log new file mode 100644 index 0000000..bb86c35 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/browser.log @@ -0,0 +1,56 @@ + +> test:browser +> cd ../.. && node --test tests/prompts/browser.test.cjs tests/prompts/ownership.browser.test.cjs + +✔ zh-CN: real index cold start, safe toast/file text, current websocket state (1036.163125ms) +✔ zh-CN: initial language failure blocks controls and retry recovers (263.119625ms) +✔ en-US: real index cold start, safe toast/file text, current websocket state (680.450334ms) +✔ en-US: initial language failure blocks controls and retry recovers (1047.581292ms) +✔ delayed language package and rapid switches keep the latest requested language (1048.449708ms) +✔ terminal resource failure presents retry; a rejected cached promise is not reused (1051.696375ms) +✔ zh-CN: package confirmation treats names as text and applies only on explicit verified action (644.404208ms) +✔ en-US: package confirmation treats names as text and applies only on explicit verified action (678.549334ms) +✔ initial delayed language keeps controls inert until the real package arrives (538.8575ms) +✔ failed language switch preserves the loaded language; retry clears failure and stale toast (1110.103ms) +✔ terminal can initialize after failed resource load using newly served resources (1211.584709ms) +{"case":"successful retry","language":"zh-CN","failure":"/sdcard/a.tscfg: 应用失败: 设备处理请求时发生错误,请查看详细原因。\n详细原因:fixture failure","afterSuccess":"/sdcard/a.tscfg: 配置包已应用。","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure zh-CN (979.633417ms) +{"case":"late completion","language":"zh-CN","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: 正在应用配置...","errors":[]} +✔ review2: prior completion closes new package confirmation zh-CN (229.996375ms) +{"case":"stale file list","language":"zh-CN","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close zh-CN (178.120542ms) +{"case":"successful retry","language":"en-US","failure":"/sdcard/a.tscfg: Apply failed: The device encountered an error while processing the request. See the details below.\nDetails: fixture failure","afterSuccess":"/sdcard/a.tscfg: The configuration package was applied.","dialogClosed":true,"errors":[]} +✔ review2: successful retry retains old failure en-US (629.053625ms) +{"case":"late completion","language":"en-US","secondShown":true,"secondRemoved":false,"toast":"/sdcard/a.tscfg: Applying config...","errors":[]} +✔ review2: prior completion closes new package confirmation en-US (1071.191417ms) +{"case":"stale file list","language":"en-US","callsBefore":1,"callsAfter":2,"visibleAfterUpload":true,"visibleAfterManualRefresh":true,"errors":[]} +✔ review2: uploaded file missing after dialog close en-US (1020.171583ms) +✔ R1: endpoint-specific logout and HTTP errors zh-CN (675.362917ms) +✔ R3: late validation cannot revive an old apply entry zh-CN (692.278917ms) +✔ R3: previously opened confirmation loses validity on reupload zh-CN (375.477541ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts zh-CN (418.878958ms) +✔ R6: fixed upload destination and separate refresh failure zh-CN (403.24225ms) +✔ R6: out-of-order directory success and error do not replace latest list zh-CN (441.100041ms) +✔ R1: endpoint-specific logout and HTTP errors en-US (1124.800667ms) +✔ R3: late validation cannot revive an old apply entry en-US (1046.777ms) +✔ R3: previously opened confirmation loses validity on reupload en-US (899.396458ms) +✔ R4/R5: obsolete errors and finally cannot update newer attempts en-US (404.605125ms) +✔ R6: fixed upload destination and separate refresh failure en-US (1023.500125ms) +✔ R6: out-of-order directory success and error do not replace latest list en-US (2134.709708ms) +✔ R2: authenticated startup initializes once (2248.490209ms) +✔ R2: obsolete system loader cannot update new page; failed navigation retries (1706.593ms) +✔ R4/R5: newest result wins over late success and late failure (1642.570084ms) +✔ R3: overlapping writes to one path cannot claim current verified content (1668.063833ms) +✔ R2: disposed page only removes its dashboard callback (1266.6165ms) +✔ R2: stale finally cannot unlock the new page read (666.206542ms) +✔ R1: delayed sign-out does not clear a newer sign-in (264.284834ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements zh-CN (317.434333ms) +✔ WS protocol: actual page subscription class, independent intervals and acknowledgements en-US (1109.395041ms) +ℹ tests 38 +ℹ suites 0 +ℹ pass 38 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 25381.373 diff --git a/docs/repair/ssh-poll-stack/results/certificate.log b/docs/repair/ssh-poll-stack/results/certificate.log new file mode 100644 index 0000000..9512e4e --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/certificate.log @@ -0,0 +1,9 @@ +PASS UTC/serial bounds and bounded retry/control policy +PASS material: real SDK mbedTLS, mocked NVS/allocation/events, state/time/concurrent snapshots +PASS UI: error typing, bilingual/fallback, text output, uncertain POST, button recovery, refresh separation +PASS actual HTTPS lifecycle: init/start/URI/stop failures, retained ownership, duplicate start, loaded generation, optional CA +PASS actual coordinator with simulated scheduler: fallback, duplicate events, bounded retries, stop intent, explicit restart, stage errors +PASS actual cert API handlers: JSON validation, PEM installation, business errors, additive status, active/stored separation +PASS actual time notifications/UTC readiness and cooperative enrollment stop (syscalls/tasks mocked) +REPRODUCED manager stop bug: callback failure becomes success/stopped +PASS manager stop/restart: failed stop retained, restart aborted, successful/duplicate stop unchanged diff --git a/docs/repair/ssh-poll-stack/results/control.log b/docs/repair/ssh-poll-stack/results/control.log new file mode 100644 index 0000000..4a2046f --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/control.log @@ -0,0 +1,5 @@ +PASS actual WS controls: all four foreign controls rejected, owner controls work; borrowed original pinned, fd/epoch/server reuse and late close isolated; owner stop drains +PASS accepted cancellation persists through task/key/create/connect/auth; cancel/submit claim both orders and result freeze tested; duplicate/old/zero IDs isolated +PASS USER/TIMEOUT/MATCH keep distinct results; service stop busy does not cancel business, accepted user intent survives stop retry and all resource ledgers drain +PASS output failure seals observation without cancelling business; later explicit cancel still reaches original executor without rewriting terminal; earlier timeout retains reason +PASS actual ssh.cancel API exact-ID validation and accepted-intent response; ended operations reject without wildcard control diff --git a/docs/repair/ssh-poll-stack/results/cross-browser-en-US.json b/docs/repair/ssh-poll-stack/results/cross-browser-en-US.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-browser-en-US.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/results/cross-browser-en-US.log b/docs/repair/ssh-poll-stack/results/cross-browser-en-US.log new file mode 100644 index 0000000..f832b4b --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-browser-en-US.log @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.json b/docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.log b/docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.log new file mode 100644 index 0000000..1f8c8bd --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-browser-zh-CN.log @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Chrome zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ssh-poll-stack/results/cross-node-en-US.json b/docs/repair/ssh-poll-stack/results/cross-node-en-US.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-node-en-US.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/results/cross-node-en-US.log b/docs/repair/ssh-poll-stack/results/cross-node-en-US.log new file mode 100644 index 0000000..7c3e1b4 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-node-en-US.log @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Node en-US: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ssh-poll-stack/results/cross-node-zh-CN.json b/docs/repair/ssh-poll-stack/results/cross-node-zh-CN.json new file mode 100644 index 0000000..3899237 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-node-zh-CN.json @@ -0,0 +1,869 @@ +{ + "records": [ + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 0, + "state": 0, + "writes": 0, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 0, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 1, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "frame": { + "type": "power_event", + "state": "LOW_VOLTAGE", + "voltage": 10.5, + "countdown": 30, + "protection_count": 0, + "event": "low_voltage" + }, + "fd": 2, + "bytes": "{\"type\":\"power_event\",\"state\":\"LOW_VOLTAGE\",\"voltage\":10.5,\"countdown\":30,\"protection_count\":0,\"event\":\"low_voltage\"}" + }, + { + "identity": 1, + "state": 2, + "writes": 1, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 1, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Invalid SSH control parameters" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Invalid SSH control parameters\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH control request failed; input was not replayed" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH control request failed; input was not replayed\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 19, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 17, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 20, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "This connection does not own an active SSH session" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"This connection does not own an active SSH session\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 2, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 23, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Another SSH session is active" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Another SSH session is active\"}" + }, + { + "identity": 2, + "state": 2, + "writes": 2, + "live": 21, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "disconnecting", + "message": "Closing SSH session..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"disconnecting\",\"message\":\"Closing SSH session...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "done", + "code": 0 + }, + "fd": 1, + "bytes": "{\"type\":\"done\",\"code\":0}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Not a terminal session" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Not a terminal session\"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "connected", + "message": "Terminal session started", + "prompt": "tianshan> " + }, + "fd": 1, + "bytes": "{\"type\":\"connected\",\"message\":\"Terminal session started\",\"prompt\":\"tianshan> \"}" + }, + { + "identity": 2, + "state": 0, + "writes": 2, + "live": 8, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH channel failed; remote result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH channel failed; remote result is not confirmed\"}" + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 3, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 4, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 4, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "Failed to open shell" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"Failed to open shell\"}" + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 19, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 5, + "state": 0, + "writes": 2, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "SSH request rejected" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"SSH request rejected\"}" + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 2, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 6, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "error", + "message": "Unsupported SSH signal" + }, + "fd": 1, + "bytes": "{\"type\":\"error\",\"message\":\"Unsupported SSH signal\"}" + }, + { + "frame": { + "type": "ssh_output", + "data": "last output" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_output\",\"data\":\"last output\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "closed", + "message": "SSH session closed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"closed\",\"message\":\"SSH session closed\"}" + }, + { + "identity": 6, + "state": 0, + "writes": 3, + "live": 11, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "connecting", + "message": "Connecting to SSH server..." + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connecting\",\"message\":\"Connecting to SSH server...\"}" + }, + { + "frame": { + "type": "ssh_status", + "status": "connected", + "message": "SSH shell ready" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"connected\",\"message\":\"SSH shell ready\"}" + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 26, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 3, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 18, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 2, + "writes": 4, + "live": 13, + "channels": 1, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "identity": 7, + "state": 5, + "writes": 4, + "live": 8, + "channels": 0, + "refs": 1, + "preparing": 0, + "unsettled": 0 + }, + { + "frame": { + "type": "ssh_status", + "status": "error", + "message": "SSH output delivery incomplete; remote command result is not confirmed" + }, + "fd": 1, + "bytes": "{\"type\":\"ssh_status\",\"status\":\"error\",\"message\":\"SSH output delivery incomplete; remote command result is not confirmed\"}" + }, + { + "identity": 7, + "state": 0, + "writes": 4, + "live": 6, + "channels": 0, + "refs": 0, + "preparing": 0, + "unsettled": 0 + }, + { + "finished": true + } + ], + "stderr": "tests/ws_subscriptions/test_project.c:42:133: warning: format specifies type 'unsigned int' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]\n 42 | printf(\"{\\\"identity\\\":%u,\\\"state\\\":%d,\\\"writes\\\":%d,\\\"live\\\":%u,\\\"channels\\\":%d,\\\"refs\\\":%u,\\\"preparing\\\":%u,\\\"unsettled\\\":%u}\\n\",st.identity,st.phase,driver_writes,live_allocations,driver_channels,st.refs,st.preparing,st.unsettled);fflush(stdout);cJSON_Delete(j);\n | ~~ ^~~~~~~~~~~\n | %llu\n1 warning generated.\n", + "exit": 0 +} \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/results/cross-node-zh-CN.log b/docs/repair/ssh-poll-stack/results/cross-node-zh-CN.log new file mode 100644 index 0000000..4699bd2 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/cross-node-zh-CN.log @@ -0,0 +1,2 @@ +PASS J1 C power event -> actual JS -> original SSH input -> normal exit and channel cleanup +PASS Node zh-CN: actual C frames + JS dispatcher + next C requests; recoverable/fatal/start/EOF/owner/encoding/socket paths; C resources zero diff --git a/docs/repair/ssh-poll-stack/results/f1_f2.log b/docs/repair/ssh-poll-stack/results/f1_f2.log new file mode 100644 index 0000000..854d7e5 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/f1_f2.log @@ -0,0 +1,23 @@ +PASS F1: actual Shell output immediate/deferred failure settles original operation; early callbacks remain safe +PASS F2: protection transition survives ordinary log saturation +PASS F1: actual Shell output immediate/deferred failure settles original operation; early callbacks remain safe +PASS F1: actual Shell output immediate/deferred failure settles original operation; early callbacks remain safe +PASS original peer and operation identity isolation across reconnect +PASS actual Exec callback: partial failure settles each target; observation closes while business collection continues without remote abort or replay +PASS actual Exec callback: partial failure settles each target; observation closes while business collection continues without remote abort or replay +PASS protection queue recovery without new messages; partial socket failure never replays successful recipient +PASS separate ordinary slot/descriptor/byte exhaustion cannot consume power quota; power overload counted without construction +PASS persistent SDK rejection has bounded retry and observable terminal settlement +PASS ordinary class retained with completion; busy/timeout stop preserves output and protection progress +PASS ordinary class retained with completion; busy/timeout stop preserves output and protection progress +PASS ordinary class retained with completion; busy/timeout stop preserves output and protection progress +PASS ticks cannot evict transitions; four accepted transitions retain order, fifth overload is explicit +fair system.dashboard=25 +fair system.info=18 +fair system.memory=18 +fair system.cpu=24 +fair network.status=18 +fair power.status=18 +fair fan.status=18 +fair service.list=18 +PASS bounded sustained log/protection/topic competition: all eligible classes progress diff --git a/docs/repair/ssh-poll-stack/results/host.json b/docs/repair/ssh-poll-stack/results/host.json new file mode 100644 index 0000000..0454bdc --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/host.json @@ -0,0 +1,108 @@ +[ + { + "name": "host", + "command": [ + "bash", + "tests/ws_subscriptions/run_host.sh" + ], + "exit": 0 + }, + { + "name": "operation", + "command": [ + "bash", + "tests/ws_subscriptions/run_operation.sh" + ], + "exit": 0 + }, + { + "name": "adapter", + "command": [ + "bash", + "tests/ws_subscriptions/run_operation_adapter.sh" + ], + "exit": 0 + }, + { + "name": "control", + "command": [ + "bash", + "tests/ws_subscriptions/run_control.sh" + ], + "exit": 0 + }, + { + "name": "reviewer", + "command": [ + "bash", + "tests/ws_subscriptions/run_reviewer.sh" + ], + "exit": 0 + }, + { + "name": "f1_f2", + "command": [ + "bash", + "tests/ws_subscriptions/run_f1_f2.sh" + ], + "exit": 0 + }, + { + "name": "runtime", + "command": [ + "bash", + "tests/runtime/run_all.sh" + ], + "exit": 0 + }, + { + "name": "certificate", + "command": [ + "bash", + "tests/certificate/run_host.sh" + ], + "exit": 0 + }, + { + "name": "prompts", + "command": [ + "npm", + "test", + "--prefix", + "tests/prompts" + ], + "exit": 0 + }, + { + "name": "release", + "command": [ + "python3", + "tests/release/test_release.py" + ], + "exit": 0 + }, + { + "name": "shell_driver", + "command": [ + "bash", + "tests/ws_subscriptions/run_shell_driver.sh" + ], + "exit": 0 + }, + { + "name": "cross-node-en-US", + "command": [ + "node", + "tests/prompts/project-cross.cjs" + ], + "exit": 0 + }, + { + "name": "cross-node-zh-CN", + "command": [ + "node", + "tests/prompts/project-cross.cjs" + ], + "exit": 0 + } +] \ No newline at end of file diff --git a/docs/repair/ssh-poll-stack/results/host.log b/docs/repair/ssh-poll-stack/results/host.log new file mode 100644 index 0000000..88ff604 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/host.log @@ -0,0 +1,23 @@ +PASS T01 T02 T05 T06 T07 T08: demand, independent intervals, targeted fanout +PASS T09 T12 T16: shared batch, old revision cannot send or update new state +PASS T11 T14: standalone info, queued delivery cannot cross fd reuse +PASS T13: cancellation during API skips remaining metrics +PASS T17 T19 T20: queue failure backoff, completion-before-return ownership +PASS T23: ordered operation events own borrowed data +PASS T10 T34: interval validation and nonzero capped monotonic waits +PASS T15 T27 T28: no second HTTP owner, reused handle epoch isolation, stop timeout retains live resources and retries +PASS T27 T30: stop during API rejects new instance; worker/HTTPD self-wait refused +PASS T21 T22: allocation failure sweep across production JSON/TX paths; per-call results freed; allocation baseline restored +PASS T24 T25: bounded non-NUL event parse, retained paced events, original global recipient set +PASS T23: bounded event FIFO full is counted, accepted results remain ordered +PASS T26: task and partial handler registration rollback permit retry +PASS T29 T33: repeated lifecycle and notification at wait boundary +PASS T18 T19 T20: bounded slots/bytes, reserved global capacity, delayed completion cadence, separate queue/send counters +PASS T09 T14 T16: snapshot-before-collection and send-before-completion barriers with resubscribe/fd reuse +PASS T17 T28: HTTP handler barrier publication, timeout retention, single retry and callback-before-return +PASS T04 T20 T21: business-error results freed; send failure shuts down only the pinned session and invalidates demand +PASS cross matrix: 4 barriers x 5 mutations (cancel, resubscribe, disconnect, fd reuse, stop/restart exclusion); restart succeeds after every drain +PASS T18 configured 32-service escaped-name fixture: 9991 bytes within 32768-byte frame budget +PASS T32: self unregister, selected-node retirement, in-flight synchronous drain, unrelated handler retained +PASS actual HTTP/WebUI stop/deinit: hook timeout, HTTPD failure, self-stop rejection, truthful state, retained ownership and retry +PASS actual WebSocket initializer: server/transport/manager/two mutexes/buffer/URI/power-handler failures are not reported as success; duplicate/retry-state guards diff --git a/docs/repair/ssh-poll-stack/results/operation.log b/docs/repair/ssh-poll-stack/results/operation.log new file mode 100644 index 0000000..b6d8772 --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/operation.log @@ -0,0 +1,2 @@ +PASS 16 failure schedules: encode/SDK/socket/stale peer, early/deferred done, duplicate tokens do not double-settle +PASS production operation/TX: 36 barrier schedules, ticket/target ledgers and B09 executor retention; destroyed=36 diff --git a/docs/repair/ssh-poll-stack/results/pre-push-adapter.log b/docs/repair/ssh-poll-stack/results/pre-push-adapter.log new file mode 100644 index 0000000..540987e --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/pre-push-adapter.log @@ -0,0 +1,13 @@ +PASS G1 same observable assertion: old rejection callback cannot corrupt replacement Shell (whole production unit) +PASS G2 same observable assertion: pending A fails while B prepares; B settles before terminal, no output follows terminal +PASS B11 timer delete/barrier retry retains original params; busy stop recovers without new business; late timer cannot abort replacement +PASS bounded timer drain retry exhaustion is retained and explicitly resumed by stop retry +PASS B09 observation failure still executes actual matching and variable updates without aborting remote command +PASS original timeout and stop-on-match business abort semantics retained +PASS original cancel ID contract, user disconnecting status and frozen terminal recipient snapshot +PASS no recipients: no observation JSON/payload allocation; business executes and tickets retire +PASS task-create and allocation failure sweep: all actual contexts, credentials, output buffers and reservations reclaimed +PASS output encoding allocation sweep: no partial protocol objects escape, original ticket/resource ledgers drain +PASS healthy stop drains original Shell within bounded wait, worker self-stop rejected, timer barrier callback-before-return remains pinned +PASS timer allocation/start failure cleanup: no timer reference leak; underlying SSH deadline policy unchanged +PASS complete production WS unit: Shell output failure/close/startup failure, Exec task/callback/match/variables/timer cleanup and task-before-create-return; destroyed=94 diff --git a/docs/repair/ssh-poll-stack/results/prompts.log b/docs/repair/ssh-poll-stack/results/prompts.log new file mode 100644 index 0000000..0d43dee --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/prompts.log @@ -0,0 +1,53 @@ + +> test +> cd ../.. && node --test tests/prompts/static.test.cjs tests/prompts/regression.test.cjs + +✔ zh-CN: actual inline translator, cold language, missing/objects/parameters and confirmations (15.478792ms) +✔ zh-CN: REST business failure remains returned; strict operation rejects with original metadata (5.937417ms) +✔ zh-CN: timeout covers response body; result stays unknown for POST (7.435167ms) +✔ zh-CN: toast timer replacement, priority, safe multiline text (4.723791ms) +✔ zh-CN: actual mutations do not report success or close dialogs on business failures (5.639708ms) +✔ zh-CN: batch deletion all / partial / no success with business errors (5.28575ms) +✔ zh-CN: downloads propagate actual initiation failures and retain batch details (6.398292ms) +✔ zh-CN: file names are text; upload/verification/apply remain separate (6.13025ms) +✔ zh-CN: SSH actual event handler honors terminal states and diagnoses conflicts (5.63325ms) +✔ zh-CN: background command timeout is unconfirmed and never resubmitted (5.239875ms) +✔ zh-CN: terminal restoration waits for acknowledgement; timeout/failure stay distinct (5.615125ms) +✔ zh-CN: ping results are reachability only; failed probe is unknown and no pulse replay (5.210291ms) +✔ zh-CN: websocket label matches color across language changes and power warnings persist (4.657375ms) +✔ en-US: actual inline translator, cold language, missing/objects/parameters and confirmations (4.986208ms) +✔ en-US: REST business failure remains returned; strict operation rejects with original metadata (4.557917ms) +✔ en-US: timeout covers response body; result stays unknown for POST (6.237416ms) +✔ en-US: toast timer replacement, priority, safe multiline text (5.676083ms) +✔ en-US: actual mutations do not report success or close dialogs on business failures (5.802ms) +✔ en-US: batch deletion all / partial / no success with business errors (6.061792ms) +✔ en-US: downloads propagate actual initiation failures and retain batch details (5.611833ms) +✔ en-US: file names are text; upload/verification/apply remain separate (5.258625ms) +✔ en-US: SSH actual event handler honors terminal states and diagnoses conflicts (8.060875ms) +✔ en-US: background command timeout is unconfirmed and never resubmitted (5.021708ms) +✔ en-US: terminal restoration waits for acknowledgement; timeout/failure stay distinct (4.610625ms) +✔ en-US: ping results are reachability only; failed probe is unknown and no pulse replay (4.513125ms) +✔ en-US: websocket label matches color across language changes and power warnings persist (4.327458ms) +✔ zh-CN: upload and download aggregates cover all success and all failure (5.266417ms) +✔ zh-CN: key deployment requires successful business code and distinguishes verification (5.395334ms) +✔ zh-CN: real LED/status renderers localize finite built-in identifiers (4.610125ms) +✔ en-US: upload and download aggregates cover all success and all failure (4.95025ms) +✔ en-US: key deployment requires successful business code and distinguishes verification (4.6015ms) +✔ en-US: real LED/status renderers localize finite built-in identifiers (4.356875ms) +✔ zh-CN: widget dynamic families render real labels and literal braces in names remain valid (4.563125ms) +✔ zh-CN: unknown stop result never escalates to forced termination (5.351333ms) +✔ en-US: widget dynamic families render real labels and literal braces in names remain valid (4.395417ms) +✔ en-US: unknown stop result never escalates to forced termination (4.2265ms) +✔ zh-CN: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (5.034334ms) +✔ en-US: J1 power alerts preserve local line, SSH ownership, transition guards and filtering (4.587917ms) +Checked 3066 references including conditional and finite dynamic families. +✔ actual UI literal/conditional and finite dynamic keys exist in both languages with matching contracts (5.649333ms) +✔ production i18n is the inline entry; no second translator script is loaded (0.097625ms) +ℹ tests 40 +ℹ suites 0 +ℹ pass 40 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 256.662875 diff --git a/docs/repair/ssh-poll-stack/results/release.log b/docs/repair/ssh-poll-stack/results/release.log new file mode 100644 index 0000000..e76e6ef --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/release.log @@ -0,0 +1,5 @@ +... +---------------------------------------------------------------------- +Ran 3 tests in 0.003s + +OK diff --git a/docs/repair/ssh-poll-stack/results/reviewer.log b/docs/repair/ssh-poll-stack/results/reviewer.log new file mode 100644 index 0000000..5a5cfbd --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/reviewer.log @@ -0,0 +1,15 @@ +PASS R1/R4 real busy stop: existing task and full fanout continue with no new business message; retry succeeds +PASS HTTPD barrier timeout retains worker and retry state +PASS R3: real role change drops old queued logs, including unsubscribe/resubscribe ABA +R5 observed system.dashboard: 75 delivered frames +R5 observed system.info: 75 delivered frames +R5 observed system.memory: 75 delivered frames +R5 observed system.cpu: 75 delivered frames +R5 observed network.status: 75 delivered frames +R5 observed power.status: 75 delivered frames +R5 observed fan.status: 75 delivered frames +R5 observed service.list: 75 delivered frames +PASS R5: all eight topics progress under six-slot pressure; no API collection without message/descriptor/byte capacity +PASS R4 service: stop errors retain registry/dependencies; retry drains then releases ownership +PASS R4 core: real event drain timeout retains downstream resources; service/config/log errors propagate; partial deinit retries succeed +PASS R1 HTTP admission: stopping rejects writes before body/handler execution; reads and resumed admission remain valid diff --git a/docs/repair/ssh-poll-stack/results/runtime.log b/docs/repair/ssh-poll-stack/results/runtime.log new file mode 100644 index 0000000..616b71a --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/runtime.log @@ -0,0 +1,13 @@ +PASS actual log hook/parser: full 510..4096 output, bounded UTF-8 preview, ANSI, concurrent capture/drop, full own output, callback recursion, capture toggle +PASS rule codec: nine action types, conditions/repeats/explicit false, allocation failures, unsupported operator; rule=256 action=1000 +PASS actual rule persistence: NVS and SD fault injection, recovery boundaries, read-only rejection +PASS actual rule engine: revisions/no-op/allocation failures, stale-evaluation barrier, pinned old execution, retirement bound, enable/manual/allow matrix, recreate identity +PASS actual SSH client: pre-auth trust gate, six EAGAIN phase deadlines/cancellation, stderr-only cleanup, bounded wait +PASS actual service registry + watcher: duplicate admission, task failure, immediate finish, stale handle, cooperative cancellation, late READY rejection, truthful remote stop/unknown +PASS service protocol: stale credentials, cancellation cleanup, deletion barrier/failure/reuse, 70 replacements, missing config protection, physical identity, page-free recovery, 3-attempt budget, zero-I/O cached reads +PASS production synchronous action completion: timeout then late result, success, queue rejection; semaphore lifetime balanced +PASS actual configuration wrappers: host edit vs query, immutable target, failed delete preserves registration, successful delete then same-name replacement +PASS actual store -> current loader: normal/dot IDs, temporary files ignored, reload retains saved rule +PASS actual automation stop + engine: blocked action returns normally, leases/executing clear, async work prevents restart, independent remote ownership retained +PASS actual probe builder: quotes, spaces, leading dash, literal shell metacharacters, fail priority, exact tokens, overflow +PASS actual UI functions: bilingual states, one revisioned update, manual conditions/types, inline fields/repeat preservation, explicit false vs omitted, conflict/draft/uncertain write diff --git a/docs/repair/ssh-poll-stack/results/shell_driver.log b/docs/repair/ssh-poll-stack/results/shell_driver.log new file mode 100644 index 0000000..b96e08c --- /dev/null +++ b/docs/repair/ssh-poll-stack/results/shell_driver.log @@ -0,0 +1,6 @@ +PASS real Shell+client: zero data is not EOF; EOF then close releases wrapper/channel/session/socket; close callback exactly once +PASS real Shell+client: fatal write/timeout retires channel; persistent close EAGAIN falls back to local session teardown without waiting +PASS real Shell+client: partial initialization/open/PTY/shell-start failure and bounded EAGAIN all release owned resources +PASS Shell run: local exit requested by input callback stops before another network read; close still owns cleanup +PASS actual WebUI cleanup twice uses cleared handles; original operation/ticket/target and actual lower resources drain +PASS real lower resources survive stop timeout; accepted output and terminal drain on retry with no new business message diff --git a/docs/repair/ssh-poll-stack/xterm.txt b/docs/repair/ssh-poll-stack/xterm.txt new file mode 100644 index 0000000..aa02cfa --- /dev/null +++ b/docs/repair/ssh-poll-stack/xterm.txt @@ -0,0 +1,16 @@ + +> test:xterm +> cd ../.. && node --test tests/prompts/xterm-vendor.test.cjs tests/prompts/xterm-offline.test.cjs + +✔ en-US: cold offline real xterm and terminal lifecycle (838.75975ms) +✔ zh-CN: cold offline real xterm and terminal lifecycle (734.621083ms) +✔ fixed vendor integrity, skip minify, gzip identity, local loader only (43.82125ms) +✔ production lazy loader: same-origin cold load, shared promise and retry (1.851333ms) +ℹ tests 4 +ℹ suites 0 +ℹ pass 4 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 1755.460958 diff --git a/tests/ws_subscriptions/test_operation_adapter.c b/tests/ws_subscriptions/test_operation_adapter.c index 4a98321..d0e6245 100644 --- a/tests/ws_subscriptions/test_operation_adapter.c +++ b/tests/ws_subscriptions/test_operation_adapter.c @@ -42,6 +42,8 @@ static char *host_strdup(const char *s){size_t n=strlen(s)+1;char *p=tracked_mal static char *host_strndup(const char *s,size_t n){char *p=tracked_malloc(n+1);if(p){memcpy(p,s,n);p[n]=0;}return p;} static struct {void (*fn)(void *);void *arg;} shell_task,exec_task; static bool task_create_fail,close_during_create,inline_exec; +static unsigned caps_deletes; +static void adapter_delete_caps(TaskHandle_t task); static int adapter_create(void(*fn)(void*),const char *name,unsigned stack,void *arg,unsigned priority,TaskHandle_t *out){ (void)stack;(void)priority;(void)out;if(task_create_fail)return 0; if(!strcmp(name,"ssh_poll"))shell_task=(typeof(shell_task)){fn,arg};else exec_task=(typeof(exec_task)){fn,arg}; @@ -58,7 +60,9 @@ static int adapter_create_caps(void(*fn)(void*),const char *n,unsigned stack,voi #define heap_caps_calloc host_heap_calloc #define xTaskCreate adapter_create #define xTaskCreateWithCaps adapter_create_caps +#define vTaskDeleteWithCaps adapter_delete_caps #include "ts_webui_ws.c" +_Static_assert(SSH_POLL_STACK_SIZE == 8192, "SSH poll stack budget is bytes"); #undef malloc #undef calloc #undef free @@ -68,6 +72,7 @@ static int adapter_create_caps(void(*fn)(void*),const char *n,unsigned stack,voi #undef heap_caps_calloc #undef xTaskCreate #undef xTaskCreateWithCaps +#undef vTaskDeleteWithCaps #ifndef PROJECT_REAL_DRIVER struct ts_ssh_session_s {bool aborted;ts_ssh_config_t config;}; #endif @@ -130,11 +135,21 @@ esp_err_t ts_log_remove_callback(ts_log_callback_handle_t h){(void)h;return remo size_t ts_log_buffer_search(ts_log_entry_t *e,size_t n,ts_log_level_t min,ts_log_level_t max,const char *tag,const char *keyword){(void)e;(void)n;(void)min;(void)max;(void)tag;(void)keyword;return 0;} httpd_handle_t ts_http_server_get_handle(void){return (void*)11;} void ts_http_server_set_stop_hooks(esp_err_t(*stop)(httpd_handle_t),void(*stopped)(httpd_handle_t)){(void)stop;(void)stopped;} -static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){(void)caps; +static int adapter_create_caps(void(*fn)(void*),const char*n,unsigned stack,void*arg,unsigned p,TaskHandle_t*out,unsigned caps){ +assert(!strcmp(n,"ssh_poll") && stack==8192 && caps==MALLOC_CAP_SPIRAM); #ifndef PROJECT_REAL_DRIVER if(close_during_create)((ssh_shell_context_t*)arg)->shell->active=false; #endif return adapter_create(fn,n,stack,arg,p,out);} +static void adapter_delete_caps(TaskHandle_t task){ + assert(!task); + ts_ws_op_stats_t ledger;ts_ws_op_stats(TS_WS_OP_SHELL,&ledger); + assert(!ledger.executors); + /* The original context remains pinned until queued terminal settlement. */ + ts_ws_operation_t *op=ts_ws_op_shell_owner(); + if(op){ssh_shell_context_t *ctx=ts_ws_op_data(op);assert(!ctx->shell && !ctx->session);ts_ws_op_release(op);} + caps_deletes++; +} static void drive_all(void){for(unsigned i=0;i<12;i++){ts_ws_op_poll();pump();timer_pump();}assert(!timer_queued);} static void setup(void){start();memset(s_clients,0,sizeof(s_clients));s_server=(void*)11;s_ws_stopping=false;ts_ws_op_enable();transport_server.closed=peer_closed;for(int fd=1;fd<=2;fd++){reqs[fd]=(httpd_req_t){.handle=(void*)11,.fd=fd};current=(void*)3;assert(add_client(&reqs[fd],WS_CLIENT_TYPE_EVENT)==ESP_OK);}current=(void*)1;} static void finish_all(void){drive_all();assert(!ts_ws_op_busy());stop();assert(!live_allocations);} @@ -292,6 +307,13 @@ int main(void){ assert(ts_webui_ssh_exec_start_ex("fake",22,"user",NULL,"password","cmd",&opts,&id)==0); exec_task.fn(exec_task.arg);drive_all();assert(terminal_frames==2 && !output_after_terminal && variable_writes);finish_all(); setup();inline_exec=true;assert(ts_webui_ssh_exec_start("fake",22,"user",NULL,"password","cmd",&id)==0);inline_exec=false;finish_all(); + for(unsigned i=0;i<10;i++){ + setup();connect_shell();unsigned before=caps_deletes; + ssh_cleanup();shell_task.fn(shell_task.arg); + assert(caps_deletes==before+1);finish_all(); + ts_ws_op_stats_t ledger;ts_ws_op_stats(TS_WS_OP_SHELL,&ledger); + assert(ledger.phase==OP_FREE && !ledger.refs && !ledger.executors); + } operation_cross_tests(); printf("PASS complete production WS unit: Shell output failure/close/startup failure, Exec task/callback/match/variables/timer cleanup and task-before-create-return; destroyed=%u\n",session_destroys); return 0;

    Ed;ew;!}Co~x6TpJM0aVHvDQ#tZERdrF2;I# zo;xgb0VbIBesP1dCRm`}$y!6LacCP0JTb6)qn@Xv@-t z=a4!Fm+ZGNm?k;Cz%jP<#kv(iG(v|>Rjm1Hl@^rBhAnixI0yX>R{#D~hn9i>bM z3*w>GFk$x3+4Nf_8|}rO>=p-ctp%U!cW)XJ#d7uWadS>? zh)fe^F0j)1EQ4!$kkbKrvfxA4;NhXF`agR*A*Ca%DiAa6 zz1lBnN_j3@aQS{_uEA<`rS)QX3=zVV*b=kV!T_1{_Kfn=ccLbpIRrd z<7c6H%>|gZeR842NicG8JbmTp`@Zm?OMAvmW;PI;^wgSA=_nLBO-&5o5h(| zPhI`gK3H67hfm=(wS|tAjYF4&s}wwToz#XMof3ZW1D7pwt7d36=9vy4Y{+K&48P!f ziyrES6Ce0>l>!k!VmN*680`DOfxo+q3@IzDYfTBb0LN~o^8vv|GD25H||KK z?VfaxHKUFFaNWcH&$8N>%3;r-3j#Zl?do-c=$H?tmL_L+$1h4Y-v3?_C%J%qzcin7 z@H1|0t~9oExy#zSZPGcBg_caR8nW9 z)#>hI>-?|oeyqps`*C5eYsk`hY;EJb&c(mH(z<`Szl*MMzE&(S1eUun4YfREa)<29 z!(}ogb$9o)Q;6EW#33O+o#~?gg)JTWj4fTldkMDE2pwgm)^EUihrQunZpz$1>geV; zu!rL|4h8*>%v)<_{_`XMk)+>$%vy8aAju#+uy_!bAVeE^ltcT|q1Uh7JDE&pEbY32 z1P@equ&qL0p?FHKX@^n<4ZXbXPUC0hrPBGYFSmg=fD8_bOt0uS%rPP>X217x&({qP z|8QQv;ka&ld$b%V69A&9q9-g;@#`SqsfaL(lhl@Hjo}M;K%ax5wb?aGR8;&}OLQ^l zjzS6&3nVo`IL*5_g-owwz4u;vq0V^bhkYkIFEx-~WNktkl6!TEo8f4lT} z@{YO8S#>bu0(Mb5Ek6zvy^Dh8YIOm$1(HzC_*oD81CKJ*XB956gv5XuIem)&@s4_8 z#TDs=|D}8(Aal;|q~5{M!xLqqQwFF+l}R|M zOLyTDNgh}{m&S@?K*Xl$J{I>oY=VfUh&%3t)F2(fKMwXQtC{=2TrHb;e7Mi2M9u|a zx(lanLZ8(xZzYi=JOK$DXd$kIN*uPKaRS=-XaRustgh>t)(%+W@3J82oiTKu>WBd= z%PjEK3cq;cNp=Q0vq6CEmbRBwkmo{EYaV~DLNcw%i$8w?hIZyLfuJtf>Z+g_EfQ4q zof^234CB5yfnfhS&pQFx5Ie(mQ_L9yV%n(|xKeInNH>^6;&nk{sKw%T9VGs@MM@2w z6hC;#No`*{K_lyR>PR*%m)8U+-l;@K5abvTkEoWkRl62gzj);kGW5{{PuYfyRQArh z<97jTir83Z=u=~4BDAhS+O4OwbERl*N=(4|*mR?dO}P8>7CgsD&M4=7e*&F#8TWaQ zQqF6<=-mmv=tDwC*YCLd;alt4c8KQ2;vCf@WF$YT($mN`+oe*)cLIF@xn`!ZEy@`o ztuP5g5c5PkD!aE*CPd}Ys5YhUTWJ63U=}BiGtM);Kup#zRg#=GgQK&qPRoI)uA{arg|3(KUc`xCB zC__g@NLtQGN$syN3`?oZ6WVHBcG>M;nW8d|PlSwvNJ*P6Iy&Q0HkzIK2wP0!%M#lDEi z)}_aEO=L4yz!z7L&BWjBf7)|=03M6R1!AtiLs1c*nOx@;iqS>w4+vsk>p;NdFg;nG zE1BD(4k0y_o(~rTEXa{)ZKy7VERN=;y~K-cvQHFMB$yJG*$gJdSOrafiPmW;*@jf1 zw7LM~vuqTId|Uw&r4f(zLGtFz-=+jXg4+HbDS|Aiw#=6`qu^LB1cf5hs7tztXSs!y z@h9p=d~fsmeWfSN$HFF;50D4HtCOSTwh+u1jqfnD+TA48)4}f)k}rhL_DYmY*$9Rz z*2R)~;_cU_=GnTnbeU12E0h_ORl)eeG?`99(5BZDWe6hn4*Rap7QNV+`gJjvW(6j+CUTg}QzxIld<% zrBOjOEpa-#&5%Q{NHm^M)%mYr?p>;fBu4ZO^>9?zdmJq>H#@*`o@bl7}F;s+D$muGRV+H@KBXEe*^nY&bJJ-BSEn!OD9=|}J^t4SGfZpoi4b=Gr zvK(Qt3#j_k%LR!8Ksc_MTzO*Rq!v?k41dhw7V0KoOr+?*A6i;1)fI}_=k^Q& z3&ioo(X+xKLKW@7Ngl$1R$u)>vIQmpFhov{9YBe{;o^+DpYpjE&qW0u{pT}(fbhMe zQ;mV5AE8_BM>Rm3!xmaLSE8@eYu@et@~JZ<6i3ZE84#+?4?~6 z$GH%f6=G%k5lcR&R+7&wbmX)lED=H22yw~M(53;(UloY+Qob;|xq~-az~4di=Dp8A ze7((Dqh^rz{Z$yYAmu zb<(N%AXBOS-@eC?{H>+WX}X=UtZx*k9) zYRk2cOHm$4O5i9?<6^4Q$tYQQq=oe>HImZj6DUia}zh!3XUp8FEWa#rI<3|cf}YTC&R6b6 zzbBEtZ>ye*dh5&y%TQa^YzKk17gviP&S_f`!jK`jb}({gS_R5OwGD&AV-^-#{LVOI z=JgUZR$4#WIRALEK;pBLE2D0a#1*sX>owTCz75f=96d;#ULbMLKi*hBS~>>4m=pJp zHBa>eP;v}XynBGkWU;=mg!bknGWxSj*iK<<_cZ+j$BxGL_42I7#2 z+pA4|gV`I8iQor~c5Wz(%}Qv2nT^7Mg+0iF_+HSf`fo~&YKjEJ%GLXcvXr-w(f}Eh zC@2Un;#NUK4o&J7XFXzG3GVJ8*=yVLd<*<5f>>5Uv*C)Y_NxJaeaeMNtqLg$vG4lr zQ#K+h*eN9>F#B#s2i=?DR2(xHF~Y~ODeb485HWhS9=3PHAInEL&GJQh7RaE zl$ivUByh(ED2DU13?|Z(r#Bv2|B)xWaD6EcKq1N95hp7F+40@*9M4oIwP_se6-7m3 zV@5-zVA58ffj4Svtp;YSt;6@p-+%vTNmbPHrq@Pv^OCGA`=;pb*Bh5dRoNqFyTYV; z_ojLlKRmp$;1#Wjm`6`9c<#}Zbq}ouYI_PbloF+31FKXEwa{V)TpmseNB+V?r6?KV z<}1)`sNuM4h83Fd2%|TAJww126wVO-Fa|mT?mz^95D+vzAjEMNGu~HWG-e)mUEeBsaM&n zKmR(HevTnu+m{`;M>}q7_9ld`-y}q2h)n{Y$ha++go~#b?YLoVrzXX?{$>Z;fQX$P z4be@?R^K!ByaabYC>y|Axdp$3+H+p>+E>PhfGyI>m+C}g^PGLD%k%U<&IHZZ#x_}V z6iw(_vPnIA8*RIHVHo$~Qc`FfHgY9-fcC?M!NH`a;p#3%k>Xfxmo6wpPwsrB0%R0) zkXkufU47z&`x-L9s#>%*WP&Pq1>D^2D=WPT@-Vo$yn+f0WujKJ8;@`TM^_EYWW#d{ zqsfG*GqPp!_C3`h1ZkAZJoQMo#R!#%{DG96H-vX#9h1izumJ{`;4lv5y(tHh6@l3U zGqSj?E`ck%=Givvg}UTk_g=RJ12fry74JQ#(Kh2dgs=Lgi6CapXVp;psoLraG;!S{ zS^O{>)VXqw(##h`MpxF0MMy*|YO7D>xNH|U`rG&?iMPj8)w{la-yB=(FZZwL8p#bK zNHD>1VryeJ%U%x(6Pt`p5ba2jJ)b=ONHkdbIgtqi#fdBd5kZSzM}aDPSTWphtm|vJ zpV%Y;!|L_itW#9#JkpM#+$=#@=|Y_~)cxEr8oB=>sjsF})?!Oms7iFQLKv+?kLMmI zP@g2!Yz>d^w{%Dv{M9qm`359#nWwdBz#(epK*q#(0|g&K-5yc*bF54!5RFGOFf{#b~^R zBA7y38gjhp;^mTcfOWn(e*VmpKr;10t_d&c8g6=iTDx7e9ZLgE}lpjhv16LU!t`>XWm2g_U~(g^r{kwf=U1*gk0d_w!R@N5+qb$C{;Gp@?T!^$BC$jw z7G+g9womQxhJ@~SoOj;sDrs*OxsY2xUB+&@;(k_0WS^z|WAx;1gKq6kCzN1pV?EDi zq8y64(|0e!uLE**)=9PSK1=ia*CnH2X!3d_t()c9S1GOIj6d{pjE{obbQ+W5kt8i^O_1mZtbbTm4O8gxV)qprjM)v*LO?`Y0-7K!i;mXs4@yTRUW=2Q!I_YUmI>B8%M7Y6H8eC` zBvXl=HsF%CbWQ(7Ze&s$uFcAHd@?c;_pC%0F?Zc7&k1@I#gg!|=5FDVVk>Da4nG@{ z4=)0V&qqe)B6KCs;zq_#I{rhjl;#@*meTiA{go7d|H;vnG3%uny`8#@lbY8+6z(u5 z#rIdfpK2);DC(ugU6V%KGsx}h9KI^}>LZ6&M4*jOLZu#@(2pi3up47LFZ#>EH(X8l zKK8{p%`T@?K|R0*Z#c*uM(}vvO%Kzn4pi|}8F*t0I1S$>)lp8XA!Jr-iVILX@m#63 z#_m^%vS2{2h$tsWf64j$F&pxXpLqEUq@#El^#fk&kwdGnrBXjs<*T=4cwdndwHmbO((i&RAe}prHY54;#-Ml+(=OS!*;d=jJv;c?Pj8 zBhyj2Kxr;5g)~#a%pFyL6f!rJUKZP?vSOpV3^hKR^ql zT7a;~r1|CD*mYUjJJ4Q*lmLuGqG>0dV3KRB>8H|oK&P0gm^Fx3?p-+?i@(zA&3eFn z@f-#gHE94IK=4EAg82)wq2Uh?Sytq2zS^GWLRD|ie0W` znalIU&$)GLm_ZHPeEj$cY`FVvTm4+gwBcjYn!$k!1n9VzKGYxjzU%tIeE#G=XaeF5 zAbIl%`Rrs@=%w%Q1-z-sAz#)!dseO-9R;^L&gKFJGS=tgL3pRuk?4NbHi%ZpKrQ`( zDLp-!Ehk9VkayT~1%-`E%P%=1NnJTO5Qp}PT=1GFQ7!;BXsM!?O-P_TIAAVjyjh4& zq)C~Mpx_Xhi+LH_2|QxE!>CYNi|s;^q8hci+p@P9|6Ne4|JX%m(p8Q8`XjWMake3w zf{%@;y_>Bce)J~dUqO1m{>~T2{P%JF>mOhxhH(Z2btl?anZsSlnp))Os6iQrtzfa9 zsIaoUZC5q=jla#Z%qT;6r>+k=TKt%i2zNXkeVfRQj> z(G72?_~je2Lgj+R!Br#DP+4es2AwbV7y8w;dx$p%3WLOp@?*=G5!A)x$D*+^mnY-a zZ*$0}8B9Ba_gi9)&z9O9P^gX~OCHvBs* zl5xv!++10_ZArmNK5|&Zzp?YieR)=B&HLXvWYt`rTSDqoMgmdhy6|FIO!xV5Os&Qc z2^er?o!x|+AAR}7`@Dtj51Sq9>o0S<_CR z$btU7(7fDwALvoqJIlxir=$rfaZWa~6}*#`rkJn=0G*hL<_y=a2B z4C@MQzUoyepYNDQfkzRXi?Ewm*|_?;o}LKI*iq($MnN1iim#>AjM&ib_7MoSXWPLxN2W~CZJcZi)7j7N}_>cz=>@2p2}jttcWP|!Me z>H6Gx3EF>pS>H3|sy}rBj%wDk-*V##{qD_)9Nl4_4U@e$-W#af*Ml$NhA=!~HNp(F zQIDREoW8-sJQ8hz8mLoavk4Hg?7jnWoEzEM1k@S`f7<18Xf)6fR=I98Bx13SZ}Ra~ zlvL-C^hwWuiKzpJI0-ctE(>)Su1B^ZQ;2|Faxfga41v*#(ECFkraOeSk6YakGH!%cy}tY)9s28vIP=WcPb&5EJ#s{&@iZR;&CR+M3aRu| zoQ%pfF4Y0)y@*gfQ(NPPw3W%Ul63j+c43iJT2vTS&th7W@upf09827!$fwz_qr0rZ z)dt#wt$m*}irx6eiQ8og;rqor$H%xKG))yt<>63GQ@OwYw%>Jm*LX=-Swt_w5VOy>!z*W&`g|#gE|QSYQBUWiqRZwbXEOuQz%j2XbHes|27eA+ z)KU$u#E^Zwjiqy{UH$fFb`RvuqKoKEb~&>OIN14Q(}aqef8Bs4f7hIOkPtfgl-N`Ka#$kxOjs z3bnUBNRXt5n4u~~yd!W~B$}s#Q>>+yNz?@=TC#-tYkfb$_JhBhRxqxC?S)EK&@r!jPuWlV+!4;ROZ_#b``+6E!o zPxbd&1Hy9N4phVjC58B=m!osiTY{q`yfVC^f*LN7l^gAtmJ%Q7NNxXLW18b<-zRQA_bAoRhCGnNgmA;`QAVc2}wvOsBB*Apr^S#=6Eecxi7 ze$&hA0`vJE6%EdmL+uN#bP;fMi{r6Ey{!c$%tSEBX{`ix_6a_ZLP%(MJp3qx2JqLUIbe0w)68rH1n&WITz4Un6sXyqY@Bo>vfo()O+b*g@&tcYFQ7t;GjbX zTFRGyx(O2OnXrTzRyBWQ(i#MU-5d$9|3&u>2tV zG)&=s!TO5zImmLqNP(vhvMczTADxml;B;Y0yexxg{BCWNeF{}KFStrlYZgFs%!a~i znFt0hhACW|zL^`1*`g}+=StHMg#bmulKH414jHuuOg_KOPEARqj$Q%X?L6|;nTK5= zB#jt1v7Wg$UuKKJo&caGL67%Pum-9C4*nD$pa;i>LfFf^04F z?u++s$xfh#%@W80?aXHhI4S=onxFbnQRMvV^PWPS`%gXz53N^Pv|LC_kMqS{QSAtV zC5HwNXH|v35b65Zx|*|GdDEP|z>|+yWJ-tZ*J_4=M%$ z3Fbo!2_pOcfIkG8b_F6VmXTain249P$>fSDD@;r-sS_u)Cbth!U11+eZvXCph2>^w zZp3pepy%nGNT)Uuf1&`L-fR&5fEsapb7I>7?vL9*Vq1K3jhLvEC59D8l-DHk^3_C? zhZV~b`IVfDGvcLx_~Mz1oLIT;4647bdO74981tjWoGVe8#C(6=+#!wIJekJHJ#jmU z-kNwFL6+P}?1_6Dth$z_NO_f77(6XdV1ZqLFRwiA1sLQ`K?olhN9&!uv{vXPPy#zX zhL#nPUziCpFU<;Y9C0Zn(e`wX9IZ$?6p|!EBb;5JZy(XBdQ+&FAah^&32xJ(r$*Su z&sqmI*~oMCx`erZaWaUj^XCg@Z>Y+xCsmS6>K$snO*;dGB}ec=8F#1=i_JS2Ay&FD z+ClJxQ=L!9{Vb)JUDt#R2y(=++JAqi;JhEL{!yEnx&DJQx$`gh^b}Gm{oI7GWtGrc zUakc`Zd)QV7pr`{%TSFKfKfkbVIW&elE9&*BL=O8nE{kbpokL{cbpKEEk7k+Q&7)eTV3y{*b zfYDcn%g1g-9LY1Mvly`O4=Iz8Bz*$VmoLj1-TC6H^6dFwi%Az<62ZPmIjA`H3_IPu z#r|UE)lBWy8oQ!)$Of*<SJj1vy|He!39GooAzBd){4#aYc3hC5G=K690P-6S*YAJXDh}iq zu16|V>0O!)>gs}Qrnj7Kq^AGguIm%1gz*~B71EBF`o=rZx;JNxk>A?m&abjQg{E}v zM-l0NPl?FIjBoV%mMD}NcYToatdMz0jeGs9Diyz4g}o06k>5$xet~1BZRR^{m@!bI4*dKIfP1 zBnWvdI+b$!#B4PYrzP%wXaOHU=$r!2Ecw)EZ@bCFaM~L?VeU)UmB9oAd=THU}f8Ly5JK%!AQ?87eJ{T7SJ z9N+>VZQn3%?AmY2Ij zayU*-O$h-~-L2WZE2_(ABgzF#K;)x?8sgGF=|WBq$`~)NvFGC4uJQm44GuEipZmtG z)8hO%p~>*MeNhiFVGAdDNjRaKV7CK3HY%7AR@*800kXpVV&$k9zTuYoB^k)nu!z(O zQ(?`-)Du?c=ExJ<$fD%gieqs;X%dUezhjXCS9+Z?z}@aF)4J4FW}yfI6FVlzi^AH@ znWjOHkK_V%`7U@oe|lGzoSwt>@RCV`-ikI(k4}#jt(Flv-EA_pFwypbYz{w0IV;iJ;!xgq)BWm*7G`Fyj+uaJBut zRx4M18UYXu`d{zTQBJSpFS6 zKBegRRjedeUsjxkVDPfbCW>JvzJK5J!$w?9!o!Up>btZshgt(;qq#qdg4U#K0y-pO z`0=2j#@p{(0smSqp`nqCkkLGL$Dr4_xz%Y6jhARy3747vA*8n;-mWC8D^!H+Zj=ph z%jEEZp})MYy-69L*yaJKu*;eCI)_}R10)a^7;kY+(=yqfbCQnDSv!Tgl%B6eg9Z)lH7!7a>4ryui@vDmj5(5h(EeKJYv4mc80#J-^riHcu zB~)8Xms}V`s7^$xN+6dFWD$y$k%S5$?_Ni9c^Bn`AVP%!3D^lXT4f7N@FQPU%p83hr;-+6vgicmXw`QS5OT(Vyg1ojS)ER>tdOpjz!n{@EEo4R z#ISwgMe{y>tzLZ2kW~J906e%@5;-Stis+IAIePG{*IXoE5Z)OwZe!} zA`e@Cl!n7odsY^0{RRA@r%#e2d!Z0Y6LwTvMRmu9hkJ2+@$M<4nIB>3N9AJ()<#VT zTgaSQyH>#rvpB9_yk0#|@1*P=gi8&HNA(#)n}!U4>)lCAZc&9Cboh@9L7hQ`qsp;u zzP>nHS;*o)jU2qGML~**$7Mv!gCbIqs=;W57K{`ZA7QSByb&toV068LnwU)1em`@u zYRJaApk}lLrw_HL0us@3R6DS3)jT9Hal&c*>v3fliZYcVrx3>EX@|vSHLG!@txV(4 zHiZDetUhX_Ur|PtC5kI!vT(Y+>PTomm6Ir|bd|;EaDPAFPj)Lx$dW{9QEU=H2^mrW zZfGBclPE27mBeas9LH{Eq4R zTeVl1D~qB_$-|1V9|v%(wJz;T&o;lz=A>)cCH*4-_*)M}o~bq-|3gR_GsN%qg5O|u zn9sKs&GZY-D7BfPzm)t7sQUid^oZyqe%*I2NGumk?b@TluM+nM?WM6k#|i;2;Bt69 zlKIV8B>rn~7SB&Tmc_kqI0c7o*Hcb)Y7VZ0mD^3l>7=7|CC3F3YQNefJh3L&1}(OV zQO6xMyVfe2xpjtWBao$kFr&D;LaM*^BwfiYhz~YyuoN}BV;B|q*>a6nciVWhF-m@% z0Eyf6y5(50$B4jK0AW`AnanV8lM^<+8=K*A1kPpR5y@SVLPcQ70)sPqVK*b4uK3K5 zMES6T^7NYTwW_o9yU54j1fjC4RoJtC!uT12YR|EOp|S)jQ9F%R(&TJ#AML{6)w67k)m^?Rjpmtxm~tBhoGL%x$6#LEDLXY zJ;hmOf4bGT`%`GQ!eWi*)Abg!w9o=4b59D_9kTs+LFV5Xqe4xexP*Ub4%g;$xV z{zS%>qT0Rq*fmcu=L0fBpCsewcnvVXl-6Y;OvzUE06~HYjv;}22$Ihxg+Yi65G0u3 zKmwGOc}hyId1R+ilig2{V1mQh7zv8reM5~$%+S(ty$49U)wVuM-YPph`P+Bryejfz z@@qjDa)QJ9=7PGoB4kw)!Z0_rX6rrLh?<#dBbVb!B8dLA2VqLH(zxWNsOL&XuK?8X z`|H9zv)M*Q4pp4C{8j+5a@FoQ0WPe+D(M1^->l2rTyw5V)lI%IYyPjV_E%ng`LYac zvVyr5BgU|&b1Yuym7E#K3S`a&(WQf-B6HFdgh$T8I- zLH0fqR&E0#I0RbmgyE^i`0-1&y0vmzwYu}9lQQ*&^ahbYaNd0uYMJz(FMhrTS;c$x z&@2#9k?@~x#^SeXtVEOs-Cj1TI=s+gA@?gdD9?Bbq{YGo|9<+(e+HT3w_UK$#kK{w z=$FY1xkh#4eka@xzEz4wzFw~>9d{5&lWI~=a5*2Y))E-2K|3RI zZMUyVyrx@(72e}kN2Yiwe>EV!lG*T6VG(v2c_k@R4#_LAl>p!nSKLodUU2EX__~x# z)3#@A?M}y>>f5&cV$Mv7ue(X2P5&7$f{h9o)dJn zkF2=INFvIAdMQ!cI#<^v+B<^ci#y~T9;$kv=uot>Dd#w(IHo;8UP~1O1z_m*UU7fP zF2|Sohz$58Ivw!%CYj-%h}HBntd-oA;WTokWDI%EZ!tp`p5kk7>0z2P;_n8b1PBol zISw1EC1)8|&u$QP1$~8Ncw4_kfhm?w&DeBt54{31d~ZBOJ`*(y3%klK3mPYK(^vzt z`kwc;*l()gyR~SrTMo5xX6QH%jeeQa0$yE!E8;SUA&@m*J>1FigB2~jN>mmnkkriw zZRO}u$X$)U-eXxdwt%CND8Ljw*(q>`z^x%gDlAjd?Qt`SD5ef_+sN1{-8-b&ZV1gIpk(P2nn=YKet@y8E`k=93=>{ugS}Pc5<-(0o(CP#_`|<$_#+V2`s-^vxOu%Hu6D@8LR)hf6 z=j3_Zi{)ctls3Bm96a!k@HYz08psOJl?Bqp(b zNMg?FQ+==DuA~TbPJ4F8Ic$bj+QZg{sE3fq%=Ni>rBke&;e2X1*M8Im6rceuPhPY3 zvm@XwBz0JT$zCZk$5^F$`S`ji(NNg@5gF-^ z0TF-|D;bGOmOnKVLi6Ym(Y;{>vi(M5q_#sns{}hL2OKn4;`!7;*}na;sd`qG;e>Z| zsnM6GzO!XI@BSY5QV$r9P9e$rm)64A_T!1=o*Qa%@if(EYlT zPtxY^PC1OVK530TY`v{dbQc3LqHaI!+DDgRAp4yUP*!kqjAa@K#d>>J_p`uN1KWEb z)Vf4_N}D+Zd#6N z(I0~Jx>fyb{g|<_Q1h_5AA1$h1#iXnAN&wwocNgi1!ml#!5g8q9Tt zUyPzsycTqb46u|59h`|EwG%M_7e3iLJiyQBcmO*<#J?1tUhv84;%u8`yulJ*;eyjv zZ8RGxq~#KQg0nU|QQe^Rtu8M-DV6FHosMSnHbTm;s=V-&ozyWrOvL{rTc`+mdt>Nc z52WGMTKpk?5R~jY?oYgt^h6{b8Aw?lv-vF1uN^4y%OeG&ecVX0c+;l2@VVL9`S5wY z{_?VMUDoSKbKd*#xlNmVupyvut7CUQ{4c(+ABW4&g!~FgyJPG z=#)1X3+b{tz&PQ_n7t~#1_vK;eoQsZTI`W^zq^sCA5XZ9DVd@Sw)!xY5{5(~U=GoA zXnX9rT)OUtiFd1Ro{#N`n2+S_z%oY;lUC9*jKie=Y^%?9$1$N#CC~zgKZS{w6tc{Z zt4CbdKUX!HWGrMgkwVdppD+EPqKdhb58-4fmQg2p%@;+Tp&%K5j(=OEHFn#t6n+M? zJuz+Q5;nRrB1J+MsVwDtbP=S*-d(zSj?Gq)Sz#+zF4u%3qC9IC4XWoNt_FV2jnd;X zo!py%C79zwuVa?J_%$^Ny6*h_w_D10IbGlE#|M8X_;8yV^f>(IJ3LzsufW7ze zxpi*!!6uiHw=iZkk9W+7AA8nYae;Q)@Q%RLT(IDMK}lRT321I7`&&PKTX1!ke|&`S zwl(oeGwcoV0e07AOMPi%D&Ph{xF8_^JSh8uwoE*NRGCO};lkD!qT=5=&RIik9Lkat z5ygPMl@snYfkuRQCJnugiROU0RkEWlwUSqR0vKcF~KX?A@iHr~-TxP1{S4jW9 zbT>TY+4>$itlSV`4DYD(&B)LsM6vyEb(b{3qpA~BU)`iRdw;~q zRr8vvpM26T^5gZpVTaM0MS~IqfA1`FSFh&8L#qw=egT59+^M1Igv)b5?Ji;d@10@8 z8f}<72YmfeXiT4b`_hWO!-8Z^*m&q3w>)-ILr)clO(k*q)Da6ydrC2Lb(vJn&Pt>l zjv{*M#LmZ3P6{hInKG7ZJi|7K!)^X9x>r_@$Oyn`MrNL8d{psBvF}vNvzEYXW1`1Mopib3;T7_lomtHQG5|SR|egS&g+` zkZA&hd7?Z0#$m37>Z|T|n$<`V)J{1r4Xm{i`&h;r2PZR6Wt{eeVq3zxs~H3eZDjb6|Mgv2HD z2%h&+?XSxr4)19RmWNDMQfYfNNOdbJ3yxX7liSyVqwnWU z3yCQ{56U4^M5{g~0#%Jq!Z6>!D_ak}V@xIVi?m)(K#cbwH}z}DjU-3$12!wvjAkVn z__v0_5p^oi)@1B#2AKp7fwsgYXaHOsin+Y!d&@_?YlxmEGel<65DwG^c9D?$+=M7< zW`SVif7@XvjL?V^*kh^8Yh0+{Fg&~=bfo9OwpB55d3(FjQ({F_qW5V;GKGw)u4yXw z@9(>_@Pu1;H*e21^VQz%M9h`G{rg2A${hXuy~+=lNP_=rluCpCJk8P%Qb^-F?f0=p z_>Sw=IkNVN3BghSW+g#E)wR=+>0T0**68?Iu+8ilKS5?@MPS2Ozh5ND4+SYBp)KyK z_V+0^I+M`8A~tdj%|U1X{+pGi9lR|ro3h!PY~`1}w+G7r5z8_+HW&2lonq+NVpUOM=-E(2ZM!gKVw9l*i4@kV8DbFg61&sm z-@j-;s6_SbGJe|{3P+5(r49Z__0NJS%?d1(aim_(d&|GU1pbsw#*-3+=0OlMAWLY! z@ih-DVhVPUn%fz%N3d-!ShGg`?AELiMI-8B=6v_p5J-H}iV18Go-Q&pQrS3lY!#_l zO=>mo3iY97{!)&aHM6~#&taOX&J_|utY(}KH9-0%C`-9&W%ujZ zG8wzx$Nq zho?m1>EYe&JP{XgmDcruLSiCa)6Gubnw}w%*e{v)*0HB!5nJ4-%-C4~3Q-#9p&sxI z0iEJ?JJdkt%ZGvFkai(&(@#R(bQGh5SF51+6NIL9xd;l2dv(43bd|%% zRsXiC?E_yw12am7YD8^!4CL|^YmX6Sf%EFZa}H!!&5|sWp23s)jV$4U|wCaa{D*@M9Bg zb60%#=K$ncGUGVeCkcXLhs|kN4t6LOp)-IPURU z8wi?pe>%6b7YspH4wR>~GwFaD@zKb3j^;i+KF|wWW2m$mk)fKVqI}^M?(5O2_Cr3B zK?Y`QWLV)KLwzb^4w_P!Qphgxp-D=6IlNKol$uI`O09Y|*2k4Gdb|w9IDzfRrKWLDWqIK}h_0(Jqh7md?9w4ql)ZlfL5Quo65o)8IMBtUt-G1{uX z`jWW`dUE12%xKQl9g61nZh9x{Se1IoAkbNul6v>Jq0r&rk3q9BdEJGb+0Cae_v)SAypDM`@8S_fzcu=#qLd3lkkRz{Aav=TyK-VdUi1gg41w2f zk7oU2E&64vU3@ z+d@~@^JmWv3@l2ar+4(s7yOt2nDemy`QoqEaaPO|9krm4?O#{K@fU=ZM|xF~@{YVoP@QZwBK_*G&d|zQyj7wf- ztQRPA=iHW$0*DDOw?8YJEoBvQh45~HK1mi!#y%IsmdwazvgB+_tI{B*tKbg0*;_n< z=xN9;Ep^4ldY)NsB*9sdwQT|K-M@a#+qwG%|QR6C#+$mZ(Q9HZbV$s zy_l&{?PRm8&0MOxptDXzKi%^C`<<85@A!>?Q+h?RiJ0))zcIw@f5vXj#J&h#zEXT? zh!~bimy0YxONq98)~e7-seuLE*brR7or{gH1>In>3{pqII!-9x#;^nh(d7lHlm%yt zU7!5)Yy6V&a}n^53t3}HUZHvGR}A$|Asn9QD?H!17c=>p3!;{*b%;OGcgOQ6Qn`fk za0ttT#AMC%IEEUegvesLyR}mV#1-mNI`ZozW-mQ$wu(GAT%1zZYqN!jp`W6m6aT!w z74u=uwWnnI3%ZY=d;cp2H3BxTE6ZkktGZfOw*aZ=d5S}t0OtPcc`wRObbW6BEms!z zP_WFGcY=F?7oMrR`XER>+B}<1vKI}dBv2v>)of)m&6K5V69h3$)q!@B%8d%JSf>}t zaF`pp57k443?hJ;rc6eOm%22i6gUl)!s#+uT;S_Yj{GyHDA*UV+yPtg*VFur`eE8r4X~F<)2x|c{n3O6$+#*pKf3tF|WEg5s?T{ zOd&I4z*GIcPx6FMEHDvNX?y%Y^R%CWs1j((?wUiO;j3H<_cPbcO9Y{1<-y1x=!=yO zgfp|5CV_g`9?r(rdm(Q#g5x@=M^8OPU#Q&v+3n_qZ?{M_d{((<2s5a#$jSiRySq2b z>t!5IG0*B|7#Oz&`fS!>9>>!xYm(2Ke=1_fHURiolt3zCH8>_G!CE*VW3yqC=o|6- z%|Nr`oTbGbu~(YDZl*nyRhK%T*|Cyoz30Tw9>^%JU(xgm(HUZYq#X}_cjiK=1 zSIFXACFUG71CfHsd=o*fAoF_V&ptq>U)7&;7lsHRY73yF(kP=D8)U`)lqdI7wP(;z zD=SRy+sE3zz5ny4u+3mY*yGRrN25;k@|yOMtai)vR$MQWdH90q%@IX%ZATcMSUmm$ zFb3`RWH7*i_{^^=e_=Phz`pEX^^-#0aRH3AjgwayV&qz7pj_fwrWNrR0I;rQ{S0>_ z#J1BL35dP67{{8dLBsG$)j_UG##gU#W(JZ$qH%B|k@n-q6hcxZwkI)dK(ptZrHlnR zl)_8NP*_?0@Tk;QJ&QHKo4s+(o>hP1)%>?JbKwR&DA_8WRU16d#gwa9?1@~r2g
    !yaq|>thxyuc7xK=Nj=V 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