From ae260da3ebf22e26ae033a92d9f7bae5468e1a93 Mon Sep 17 00:00:00 2001 From: hailin Date: Sun, 5 Apr 2026 12:05:11 -0700 Subject: [PATCH] add frontend code --- frontend/.clang-format | 126 + .../ISSUE_TEMPLATE/01_build_install_bug.yml | 103 + .../.github/ISSUE_TEMPLATE/02_runtime_bug.yml | 115 + .../ISSUE_TEMPLATE/03_feature_request.yml | 34 + frontend/.github/ISSUE_TEMPLATE/config.yml | 8 + frontend/.github/workflows/build.yml | 111 + frontend/.gitignore | 20 + frontend/CMakeLists.txt | 13 + frontend/LICENSE | 22 + frontend/README.md | 173 + frontend/README_ja.md | 169 + frontend/README_zh.md | 169 + frontend/docs/blufi.md | 37 + frontend/docs/code_style.md | 91 + frontend/docs/custom-board.md | 453 +++ frontend/docs/mcp-based-graph.jpg | Bin 0 -> 97848 bytes frontend/docs/mcp-protocol.md | 269 ++ frontend/docs/mcp-usage.md | 115 + frontend/docs/mqtt-udp.md | 393 ++ frontend/docs/v0/AtomMatrix-echo-base.jpg | Bin 0 -> 37326 bytes frontend/docs/v0/ESP32-BreadBoard.jpg | Bin 0 -> 96480 bytes frontend/docs/v0/atoms3r-echo-base.jpg | Bin 0 -> 25250 bytes frontend/docs/v0/esp32s3-box3.jpg | Bin 0 -> 17509 bytes frontend/docs/v0/lichuang-s3.jpg | Bin 0 -> 20482 bytes frontend/docs/v0/m5stack-cores3.jpg | Bin 0 -> 19191 bytes frontend/docs/v0/magiclick-2p4.jpg | Bin 0 -> 11988 bytes .../waveshare-esp32-s3-touch-amoled-1.8.jpg | Bin 0 -> 47563 bytes frontend/docs/v0/wiring.jpg | Bin 0 -> 124026 bytes frontend/docs/v1/atoms3r.jpg | Bin 0 -> 28224 bytes frontend/docs/v1/electron-bot.png | Bin 0 -> 21247 bytes frontend/docs/v1/esp-hi.jpg | Bin 0 -> 17933 bytes frontend/docs/v1/esp-sparkbot.jpg | Bin 0 -> 36275 bytes frontend/docs/v1/espbox3.jpg | Bin 0 -> 31581 bytes frontend/docs/v1/lichuang-s3.jpg | Bin 0 -> 39732 bytes frontend/docs/v1/lilygo-t-circle-s3.jpg | Bin 0 -> 48137 bytes frontend/docs/v1/m5cores3.jpg | Bin 0 -> 23993 bytes frontend/docs/v1/magiclick.jpg | Bin 0 -> 44916 bytes frontend/docs/v1/movecall-cuican-esp32s3.jpg | Bin 0 -> 50781 bytes frontend/docs/v1/movecall-moji-esp32s3.jpg | Bin 0 -> 46522 bytes frontend/docs/v1/otto-robot.png | Bin 0 -> 27392 bytes frontend/docs/v1/sensecap_watcher.jpg | Bin 0 -> 39233 bytes frontend/docs/v1/waveshare.jpg | Bin 0 -> 23034 bytes frontend/docs/v1/wiring2.jpg | Bin 0 -> 58797 bytes frontend/docs/v1/wmnologo_xingzhi_0.96.jpg | Bin 0 -> 24754 bytes frontend/docs/v1/wmnologo_xingzhi_1.54.jpg | Bin 0 -> 52550 bytes frontend/docs/v1/xmini-c3.jpg | Bin 0 -> 30530 bytes frontend/docs/websocket.md | 495 +++ frontend/main/CMakeLists.txt | 1175 ++++++ frontend/main/Kconfig.projbuild | 953 +++++ frontend/main/application.cc | 1116 ++++++ frontend/main/application.h | 189 + frontend/main/assets.cc | 562 +++ frontend/main/assets.h | 89 + frontend/main/assets/common/exclamation.ogg | Bin 0 -> 1663 bytes frontend/main/assets/common/low_battery.ogg | Bin 0 -> 2269 bytes frontend/main/assets/common/popup.ogg | Bin 0 -> 1148 bytes frontend/main/assets/common/success.ogg | Bin 0 -> 2012 bytes frontend/main/assets/common/vibration.ogg | Bin 0 -> 1574 bytes frontend/main/assets/locales/ar-SA/0.ogg | Bin 0 -> 1940 bytes frontend/main/assets/locales/ar-SA/1.ogg | Bin 0 -> 1658 bytes frontend/main/assets/locales/ar-SA/2.ogg | Bin 0 -> 1938 bytes frontend/main/assets/locales/ar-SA/3.ogg | Bin 0 -> 1861 bytes frontend/main/assets/locales/ar-SA/4.ogg | Bin 0 -> 1949 bytes frontend/main/assets/locales/ar-SA/5.ogg | Bin 0 -> 1755 bytes frontend/main/assets/locales/ar-SA/6.ogg | Bin 0 -> 1825 bytes frontend/main/assets/locales/ar-SA/7.ogg | Bin 0 -> 1721 bytes frontend/main/assets/locales/ar-SA/8.ogg | Bin 0 -> 1977 bytes frontend/main/assets/locales/ar-SA/9.ogg | Bin 0 -> 2063 bytes .../main/assets/locales/ar-SA/activation.ogg | Bin 0 -> 13539 bytes .../main/assets/locales/ar-SA/err_pin.ogg | Bin 0 -> 4416 bytes .../main/assets/locales/ar-SA/err_reg.ogg | Bin 0 -> 9211 bytes .../main/assets/locales/ar-SA/language.json | 59 + .../main/assets/locales/ar-SA/upgrade.ogg | Bin 0 -> 4104 bytes .../main/assets/locales/ar-SA/welcome.ogg | Bin 0 -> 2971 bytes .../main/assets/locales/ar-SA/wificonfig.ogg | Bin 0 -> 5461 bytes frontend/main/assets/locales/bg-BG/0.ogg | Bin 0 -> 2369 bytes frontend/main/assets/locales/bg-BG/1.ogg | Bin 0 -> 1867 bytes frontend/main/assets/locales/bg-BG/2.ogg | Bin 0 -> 2356 bytes frontend/main/assets/locales/bg-BG/3.ogg | Bin 0 -> 2245 bytes frontend/main/assets/locales/bg-BG/4.ogg | Bin 0 -> 2611 bytes frontend/main/assets/locales/bg-BG/5.ogg | Bin 0 -> 2015 bytes frontend/main/assets/locales/bg-BG/6.ogg | Bin 0 -> 2231 bytes frontend/main/assets/locales/bg-BG/7.ogg | Bin 0 -> 2276 bytes frontend/main/assets/locales/bg-BG/8.ogg | Bin 0 -> 2133 bytes frontend/main/assets/locales/bg-BG/9.ogg | Bin 0 -> 1770 bytes .../main/assets/locales/bg-BG/activation.ogg | Bin 0 -> 14501 bytes .../main/assets/locales/bg-BG/err_pin.ogg | Bin 0 -> 4716 bytes .../main/assets/locales/bg-BG/err_reg.ogg | Bin 0 -> 10755 bytes .../main/assets/locales/bg-BG/language.json | 59 + .../main/assets/locales/bg-BG/upgrade.ogg | Bin 0 -> 6374 bytes .../main/assets/locales/bg-BG/welcome.ogg | Bin 0 -> 3502 bytes .../main/assets/locales/bg-BG/wificonfig.ogg | Bin 0 -> 7569 bytes frontend/main/assets/locales/ca-ES/0.ogg | Bin 0 -> 1790 bytes frontend/main/assets/locales/ca-ES/1.ogg | Bin 0 -> 2616 bytes frontend/main/assets/locales/ca-ES/2.ogg | Bin 0 -> 1737 bytes frontend/main/assets/locales/ca-ES/3.ogg | Bin 0 -> 2088 bytes frontend/main/assets/locales/ca-ES/4.ogg | Bin 0 -> 1897 bytes frontend/main/assets/locales/ca-ES/5.ogg | Bin 0 -> 1733 bytes frontend/main/assets/locales/ca-ES/6.ogg | Bin 0 -> 1923 bytes frontend/main/assets/locales/ca-ES/7.ogg | Bin 0 -> 1674 bytes frontend/main/assets/locales/ca-ES/8.ogg | Bin 0 -> 1892 bytes frontend/main/assets/locales/ca-ES/9.ogg | Bin 0 -> 1986 bytes .../main/assets/locales/ca-ES/activation.ogg | Bin 0 -> 11679 bytes .../main/assets/locales/ca-ES/err_pin.ogg | Bin 0 -> 5439 bytes .../main/assets/locales/ca-ES/err_reg.ogg | Bin 0 -> 8509 bytes .../main/assets/locales/ca-ES/language.json | 59 + .../main/assets/locales/ca-ES/upgrade.ogg | Bin 0 -> 3717 bytes .../main/assets/locales/ca-ES/welcome.ogg | Bin 0 -> 2876 bytes .../main/assets/locales/ca-ES/wificonfig.ogg | Bin 0 -> 5347 bytes frontend/main/assets/locales/cs-CZ/0.ogg | Bin 0 -> 1781 bytes frontend/main/assets/locales/cs-CZ/1.ogg | Bin 0 -> 2000 bytes frontend/main/assets/locales/cs-CZ/2.ogg | Bin 0 -> 1788 bytes frontend/main/assets/locales/cs-CZ/3.ogg | Bin 0 -> 1531 bytes frontend/main/assets/locales/cs-CZ/4.ogg | Bin 0 -> 1880 bytes frontend/main/assets/locales/cs-CZ/5.ogg | Bin 0 -> 1857 bytes frontend/main/assets/locales/cs-CZ/6.ogg | Bin 0 -> 1871 bytes frontend/main/assets/locales/cs-CZ/7.ogg | Bin 0 -> 2052 bytes frontend/main/assets/locales/cs-CZ/8.ogg | Bin 0 -> 2057 bytes frontend/main/assets/locales/cs-CZ/9.ogg | Bin 0 -> 1876 bytes .../main/assets/locales/cs-CZ/activation.ogg | Bin 0 -> 9954 bytes .../main/assets/locales/cs-CZ/err_pin.ogg | Bin 0 -> 4045 bytes .../main/assets/locales/cs-CZ/err_reg.ogg | Bin 0 -> 7830 bytes .../main/assets/locales/cs-CZ/language.json | 59 + .../main/assets/locales/cs-CZ/upgrade.ogg | Bin 0 -> 4499 bytes .../main/assets/locales/cs-CZ/welcome.ogg | Bin 0 -> 2672 bytes .../main/assets/locales/cs-CZ/wificonfig.ogg | Bin 0 -> 5169 bytes frontend/main/assets/locales/da-DK/0.ogg | Bin 0 -> 1986 bytes frontend/main/assets/locales/da-DK/1.ogg | Bin 0 -> 1916 bytes frontend/main/assets/locales/da-DK/2.ogg | Bin 0 -> 2185 bytes frontend/main/assets/locales/da-DK/3.ogg | Bin 0 -> 2178 bytes frontend/main/assets/locales/da-DK/4.ogg | Bin 0 -> 2143 bytes frontend/main/assets/locales/da-DK/5.ogg | Bin 0 -> 1974 bytes frontend/main/assets/locales/da-DK/6.ogg | Bin 0 -> 1874 bytes frontend/main/assets/locales/da-DK/7.ogg | Bin 0 -> 2125 bytes frontend/main/assets/locales/da-DK/8.ogg | Bin 0 -> 1519 bytes frontend/main/assets/locales/da-DK/9.ogg | Bin 0 -> 1790 bytes .../main/assets/locales/da-DK/activation.ogg | Bin 0 -> 11373 bytes .../main/assets/locales/da-DK/err_pin.ogg | Bin 0 -> 3600 bytes .../main/assets/locales/da-DK/err_reg.ogg | Bin 0 -> 9516 bytes .../main/assets/locales/da-DK/language.json | 59 + .../main/assets/locales/da-DK/upgrade.ogg | Bin 0 -> 3074 bytes .../main/assets/locales/da-DK/welcome.ogg | Bin 0 -> 2849 bytes .../main/assets/locales/da-DK/wificonfig.ogg | Bin 0 -> 5526 bytes frontend/main/assets/locales/de-DE/0.ogg | Bin 0 -> 1829 bytes frontend/main/assets/locales/de-DE/1.ogg | Bin 0 -> 1801 bytes frontend/main/assets/locales/de-DE/2.ogg | Bin 0 -> 2010 bytes frontend/main/assets/locales/de-DE/3.ogg | Bin 0 -> 1756 bytes frontend/main/assets/locales/de-DE/4.ogg | Bin 0 -> 1868 bytes frontend/main/assets/locales/de-DE/5.ogg | Bin 0 -> 1979 bytes frontend/main/assets/locales/de-DE/6.ogg | Bin 0 -> 1943 bytes frontend/main/assets/locales/de-DE/7.ogg | Bin 0 -> 2139 bytes frontend/main/assets/locales/de-DE/8.ogg | Bin 0 -> 1751 bytes frontend/main/assets/locales/de-DE/9.ogg | Bin 0 -> 1835 bytes .../main/assets/locales/de-DE/activation.ogg | Bin 0 -> 14512 bytes .../main/assets/locales/de-DE/err_pin.ogg | Bin 0 -> 4396 bytes .../main/assets/locales/de-DE/err_reg.ogg | Bin 0 -> 11221 bytes .../main/assets/locales/de-DE/language.json | 59 + .../main/assets/locales/de-DE/upgrade.ogg | Bin 0 -> 4370 bytes .../main/assets/locales/de-DE/welcome.ogg | Bin 0 -> 2814 bytes .../main/assets/locales/de-DE/wificonfig.ogg | Bin 0 -> 6587 bytes frontend/main/assets/locales/el-GR/0.ogg | Bin 0 -> 2138 bytes frontend/main/assets/locales/el-GR/1.ogg | Bin 0 -> 1744 bytes frontend/main/assets/locales/el-GR/2.ogg | Bin 0 -> 2003 bytes frontend/main/assets/locales/el-GR/3.ogg | Bin 0 -> 1767 bytes frontend/main/assets/locales/el-GR/4.ogg | Bin 0 -> 2010 bytes frontend/main/assets/locales/el-GR/5.ogg | Bin 0 -> 1882 bytes frontend/main/assets/locales/el-GR/6.ogg | Bin 0 -> 1717 bytes frontend/main/assets/locales/el-GR/7.ogg | Bin 0 -> 1795 bytes frontend/main/assets/locales/el-GR/8.ogg | Bin 0 -> 1788 bytes frontend/main/assets/locales/el-GR/9.ogg | Bin 0 -> 1561 bytes .../main/assets/locales/el-GR/activation.ogg | Bin 0 -> 14003 bytes .../main/assets/locales/el-GR/err_pin.ogg | Bin 0 -> 4867 bytes .../main/assets/locales/el-GR/err_reg.ogg | Bin 0 -> 9306 bytes .../main/assets/locales/el-GR/language.json | 59 + .../main/assets/locales/el-GR/upgrade.ogg | Bin 0 -> 4139 bytes .../main/assets/locales/el-GR/welcome.ogg | Bin 0 -> 2936 bytes .../main/assets/locales/el-GR/wificonfig.ogg | Bin 0 -> 6031 bytes frontend/main/assets/locales/en-US/0.ogg | Bin 0 -> 1924 bytes frontend/main/assets/locales/en-US/1.ogg | Bin 0 -> 1569 bytes frontend/main/assets/locales/en-US/2.ogg | Bin 0 -> 1532 bytes frontend/main/assets/locales/en-US/3.ogg | Bin 0 -> 1445 bytes frontend/main/assets/locales/en-US/4.ogg | Bin 0 -> 1944 bytes frontend/main/assets/locales/en-US/5.ogg | Bin 0 -> 1586 bytes frontend/main/assets/locales/en-US/6.ogg | Bin 0 -> 1764 bytes frontend/main/assets/locales/en-US/7.ogg | Bin 0 -> 2110 bytes frontend/main/assets/locales/en-US/8.ogg | Bin 0 -> 1571 bytes frontend/main/assets/locales/en-US/9.ogg | Bin 0 -> 1653 bytes .../main/assets/locales/en-US/activation.ogg | Bin 0 -> 8855 bytes .../main/assets/locales/en-US/err_pin.ogg | Bin 0 -> 3805 bytes .../main/assets/locales/en-US/err_reg.ogg | Bin 0 -> 7780 bytes .../main/assets/locales/en-US/language.json | 59 + .../main/assets/locales/en-US/upgrade.ogg | Bin 0 -> 3112 bytes .../main/assets/locales/en-US/welcome.ogg | Bin 0 -> 2765 bytes .../main/assets/locales/en-US/wificonfig.ogg | Bin 0 -> 4634 bytes frontend/main/assets/locales/es-ES/0.ogg | Bin 0 -> 1841 bytes frontend/main/assets/locales/es-ES/1.ogg | Bin 0 -> 1519 bytes frontend/main/assets/locales/es-ES/2.ogg | Bin 0 -> 1880 bytes frontend/main/assets/locales/es-ES/3.ogg | Bin 0 -> 1747 bytes frontend/main/assets/locales/es-ES/4.ogg | Bin 0 -> 1871 bytes frontend/main/assets/locales/es-ES/5.ogg | Bin 0 -> 2111 bytes frontend/main/assets/locales/es-ES/6.ogg | Bin 0 -> 1960 bytes frontend/main/assets/locales/es-ES/7.ogg | Bin 0 -> 2157 bytes frontend/main/assets/locales/es-ES/8.ogg | Bin 0 -> 1863 bytes frontend/main/assets/locales/es-ES/9.ogg | Bin 0 -> 2020 bytes .../main/assets/locales/es-ES/activation.ogg | Bin 0 -> 14758 bytes .../main/assets/locales/es-ES/err_pin.ogg | Bin 0 -> 5458 bytes .../main/assets/locales/es-ES/err_reg.ogg | Bin 0 -> 10160 bytes .../main/assets/locales/es-ES/language.json | 59 + .../main/assets/locales/es-ES/upgrade.ogg | Bin 0 -> 3947 bytes .../main/assets/locales/es-ES/welcome.ogg | Bin 0 -> 2909 bytes .../main/assets/locales/es-ES/wificonfig.ogg | Bin 0 -> 6979 bytes frontend/main/assets/locales/fa-IR/0.ogg | Bin 0 -> 1975 bytes frontend/main/assets/locales/fa-IR/1.ogg | Bin 0 -> 2234 bytes frontend/main/assets/locales/fa-IR/2.ogg | Bin 0 -> 1626 bytes frontend/main/assets/locales/fa-IR/3.ogg | Bin 0 -> 1792 bytes frontend/main/assets/locales/fa-IR/4.ogg | Bin 0 -> 2043 bytes frontend/main/assets/locales/fa-IR/5.ogg | Bin 0 -> 3109 bytes frontend/main/assets/locales/fa-IR/6.ogg | Bin 0 -> 1909 bytes frontend/main/assets/locales/fa-IR/7.ogg | Bin 0 -> 2461 bytes frontend/main/assets/locales/fa-IR/8.ogg | Bin 0 -> 2679 bytes frontend/main/assets/locales/fa-IR/9.ogg | Bin 0 -> 2393 bytes .../main/assets/locales/fa-IR/activation.ogg | Bin 0 -> 12991 bytes .../main/assets/locales/fa-IR/err_pin.ogg | Bin 0 -> 4750 bytes .../main/assets/locales/fa-IR/err_reg.ogg | Bin 0 -> 11655 bytes .../main/assets/locales/fa-IR/language.json | 59 + .../main/assets/locales/fa-IR/upgrade.ogg | Bin 0 -> 3495 bytes .../main/assets/locales/fa-IR/welcome.ogg | Bin 0 -> 3309 bytes .../main/assets/locales/fa-IR/wificonfig.ogg | Bin 0 -> 4700 bytes frontend/main/assets/locales/fi-FI/0.ogg | Bin 0 -> 2108 bytes frontend/main/assets/locales/fi-FI/1.ogg | Bin 0 -> 2169 bytes frontend/main/assets/locales/fi-FI/2.ogg | Bin 0 -> 2158 bytes frontend/main/assets/locales/fi-FI/3.ogg | Bin 0 -> 2159 bytes frontend/main/assets/locales/fi-FI/4.ogg | Bin 0 -> 2233 bytes frontend/main/assets/locales/fi-FI/5.ogg | Bin 0 -> 2147 bytes frontend/main/assets/locales/fi-FI/6.ogg | Bin 0 -> 2133 bytes frontend/main/assets/locales/fi-FI/7.ogg | Bin 0 -> 2468 bytes frontend/main/assets/locales/fi-FI/8.ogg | Bin 0 -> 2240 bytes frontend/main/assets/locales/fi-FI/9.ogg | Bin 0 -> 2328 bytes .../main/assets/locales/fi-FI/activation.ogg | Bin 0 -> 10121 bytes .../main/assets/locales/fi-FI/err_pin.ogg | Bin 0 -> 3567 bytes .../main/assets/locales/fi-FI/err_reg.ogg | Bin 0 -> 8709 bytes .../main/assets/locales/fi-FI/language.json | 59 + .../main/assets/locales/fi-FI/upgrade.ogg | Bin 0 -> 4239 bytes .../main/assets/locales/fi-FI/welcome.ogg | Bin 0 -> 2828 bytes .../main/assets/locales/fi-FI/wificonfig.ogg | Bin 0 -> 5423 bytes frontend/main/assets/locales/fil-PH/0.ogg | Bin 0 -> 1571 bytes frontend/main/assets/locales/fil-PH/1.ogg | Bin 0 -> 1537 bytes frontend/main/assets/locales/fil-PH/2.ogg | Bin 0 -> 1628 bytes frontend/main/assets/locales/fil-PH/3.ogg | Bin 0 -> 1514 bytes frontend/main/assets/locales/fil-PH/4.ogg | Bin 0 -> 1395 bytes frontend/main/assets/locales/fil-PH/5.ogg | Bin 0 -> 1497 bytes frontend/main/assets/locales/fil-PH/6.ogg | Bin 0 -> 1480 bytes frontend/main/assets/locales/fil-PH/7.ogg | Bin 0 -> 1527 bytes frontend/main/assets/locales/fil-PH/8.ogg | Bin 0 -> 1647 bytes frontend/main/assets/locales/fil-PH/9.ogg | Bin 0 -> 1604 bytes .../main/assets/locales/fil-PH/activation.ogg | Bin 0 -> 12289 bytes .../main/assets/locales/fil-PH/err_pin.ogg | Bin 0 -> 4032 bytes .../main/assets/locales/fil-PH/err_reg.ogg | Bin 0 -> 7125 bytes .../main/assets/locales/fil-PH/language.json | 59 + .../main/assets/locales/fil-PH/upgrade.ogg | Bin 0 -> 3478 bytes .../main/assets/locales/fil-PH/welcome.ogg | Bin 0 -> 3754 bytes .../main/assets/locales/fil-PH/wificonfig.ogg | Bin 0 -> 6006 bytes frontend/main/assets/locales/fr-FR/0.ogg | Bin 0 -> 2291 bytes frontend/main/assets/locales/fr-FR/1.ogg | Bin 0 -> 2472 bytes frontend/main/assets/locales/fr-FR/2.ogg | Bin 0 -> 2555 bytes frontend/main/assets/locales/fr-FR/3.ogg | Bin 0 -> 2243 bytes frontend/main/assets/locales/fr-FR/4.ogg | Bin 0 -> 2326 bytes frontend/main/assets/locales/fr-FR/5.ogg | Bin 0 -> 2558 bytes frontend/main/assets/locales/fr-FR/6.ogg | Bin 0 -> 2377 bytes frontend/main/assets/locales/fr-FR/7.ogg | Bin 0 -> 2321 bytes frontend/main/assets/locales/fr-FR/8.ogg | Bin 0 -> 2362 bytes frontend/main/assets/locales/fr-FR/9.ogg | Bin 0 -> 2100 bytes .../main/assets/locales/fr-FR/activation.ogg | Bin 0 -> 17207 bytes .../main/assets/locales/fr-FR/err_pin.ogg | Bin 0 -> 6043 bytes .../main/assets/locales/fr-FR/err_reg.ogg | Bin 0 -> 9869 bytes .../main/assets/locales/fr-FR/language.json | 59 + .../main/assets/locales/fr-FR/upgrade.ogg | Bin 0 -> 3757 bytes .../main/assets/locales/fr-FR/welcome.ogg | Bin 0 -> 2927 bytes .../main/assets/locales/fr-FR/wificonfig.ogg | Bin 0 -> 5157 bytes frontend/main/assets/locales/he-IL/0.ogg | Bin 0 -> 1753 bytes frontend/main/assets/locales/he-IL/1.ogg | Bin 0 -> 1921 bytes frontend/main/assets/locales/he-IL/2.ogg | Bin 0 -> 2000 bytes frontend/main/assets/locales/he-IL/3.ogg | Bin 0 -> 1970 bytes frontend/main/assets/locales/he-IL/4.ogg | Bin 0 -> 2095 bytes frontend/main/assets/locales/he-IL/5.ogg | Bin 0 -> 2220 bytes frontend/main/assets/locales/he-IL/6.ogg | Bin 0 -> 3459 bytes frontend/main/assets/locales/he-IL/7.ogg | Bin 0 -> 2222 bytes frontend/main/assets/locales/he-IL/8.ogg | Bin 0 -> 3889 bytes frontend/main/assets/locales/he-IL/9.ogg | Bin 0 -> 3396 bytes .../main/assets/locales/he-IL/activation.ogg | Bin 0 -> 8528 bytes .../main/assets/locales/he-IL/err_pin.ogg | Bin 0 -> 5032 bytes .../main/assets/locales/he-IL/err_reg.ogg | Bin 0 -> 7378 bytes .../main/assets/locales/he-IL/language.json | 59 + .../main/assets/locales/he-IL/upgrade.ogg | Bin 0 -> 3648 bytes .../main/assets/locales/he-IL/welcome.ogg | Bin 0 -> 3037 bytes .../main/assets/locales/he-IL/wificonfig.ogg | Bin 0 -> 4292 bytes frontend/main/assets/locales/hi-IN/0.ogg | Bin 0 -> 2313 bytes frontend/main/assets/locales/hi-IN/1.ogg | Bin 0 -> 1490 bytes frontend/main/assets/locales/hi-IN/2.ogg | Bin 0 -> 1609 bytes frontend/main/assets/locales/hi-IN/3.ogg | Bin 0 -> 1530 bytes frontend/main/assets/locales/hi-IN/4.ogg | Bin 0 -> 1530 bytes frontend/main/assets/locales/hi-IN/5.ogg | Bin 0 -> 1837 bytes frontend/main/assets/locales/hi-IN/6.ogg | Bin 0 -> 1503 bytes frontend/main/assets/locales/hi-IN/7.ogg | Bin 0 -> 1803 bytes frontend/main/assets/locales/hi-IN/8.ogg | Bin 0 -> 1590 bytes frontend/main/assets/locales/hi-IN/9.ogg | Bin 0 -> 1550 bytes .../main/assets/locales/hi-IN/activation.ogg | Bin 0 -> 10626 bytes .../main/assets/locales/hi-IN/err_pin.ogg | Bin 0 -> 2949 bytes .../main/assets/locales/hi-IN/err_reg.ogg | Bin 0 -> 7548 bytes .../main/assets/locales/hi-IN/language.json | 59 + .../main/assets/locales/hi-IN/upgrade.ogg | Bin 0 -> 3315 bytes .../main/assets/locales/hi-IN/welcome.ogg | Bin 0 -> 2582 bytes .../main/assets/locales/hi-IN/wificonfig.ogg | Bin 0 -> 4698 bytes frontend/main/assets/locales/hr-HR/0.ogg | Bin 0 -> 2514 bytes frontend/main/assets/locales/hr-HR/1.ogg | Bin 0 -> 2662 bytes frontend/main/assets/locales/hr-HR/2.ogg | Bin 0 -> 2174 bytes frontend/main/assets/locales/hr-HR/3.ogg | Bin 0 -> 3902 bytes frontend/main/assets/locales/hr-HR/4.ogg | Bin 0 -> 1876 bytes frontend/main/assets/locales/hr-HR/5.ogg | Bin 0 -> 1996 bytes frontend/main/assets/locales/hr-HR/6.ogg | Bin 0 -> 2249 bytes frontend/main/assets/locales/hr-HR/7.ogg | Bin 0 -> 2586 bytes frontend/main/assets/locales/hr-HR/8.ogg | Bin 0 -> 2509 bytes frontend/main/assets/locales/hr-HR/9.ogg | Bin 0 -> 2187 bytes .../main/assets/locales/hr-HR/activation.ogg | Bin 0 -> 14451 bytes .../main/assets/locales/hr-HR/err_pin.ogg | Bin 0 -> 7108 bytes .../main/assets/locales/hr-HR/err_reg.ogg | Bin 0 -> 13477 bytes .../main/assets/locales/hr-HR/language.json | 59 + .../main/assets/locales/hr-HR/upgrade.ogg | Bin 0 -> 4241 bytes .../main/assets/locales/hr-HR/welcome.ogg | Bin 0 -> 5092 bytes .../main/assets/locales/hr-HR/wificonfig.ogg | Bin 0 -> 6223 bytes frontend/main/assets/locales/hu-HU/0.ogg | Bin 0 -> 1582 bytes frontend/main/assets/locales/hu-HU/1.ogg | Bin 0 -> 1963 bytes frontend/main/assets/locales/hu-HU/2.ogg | Bin 0 -> 2418 bytes frontend/main/assets/locales/hu-HU/3.ogg | Bin 0 -> 1966 bytes frontend/main/assets/locales/hu-HU/4.ogg | Bin 0 -> 2161 bytes frontend/main/assets/locales/hu-HU/5.ogg | Bin 0 -> 2173 bytes frontend/main/assets/locales/hu-HU/6.ogg | Bin 0 -> 2251 bytes frontend/main/assets/locales/hu-HU/7.ogg | Bin 0 -> 1531 bytes frontend/main/assets/locales/hu-HU/8.ogg | Bin 0 -> 2119 bytes frontend/main/assets/locales/hu-HU/9.ogg | Bin 0 -> 2049 bytes .../main/assets/locales/hu-HU/activation.ogg | Bin 0 -> 15641 bytes .../main/assets/locales/hu-HU/err_pin.ogg | Bin 0 -> 6545 bytes .../main/assets/locales/hu-HU/err_reg.ogg | Bin 0 -> 10408 bytes .../main/assets/locales/hu-HU/language.json | 59 + .../main/assets/locales/hu-HU/upgrade.ogg | Bin 0 -> 3811 bytes .../main/assets/locales/hu-HU/welcome.ogg | Bin 0 -> 3060 bytes .../main/assets/locales/hu-HU/wificonfig.ogg | Bin 0 -> 5701 bytes frontend/main/assets/locales/id-ID/0.ogg | Bin 0 -> 2025 bytes frontend/main/assets/locales/id-ID/1.ogg | Bin 0 -> 2633 bytes frontend/main/assets/locales/id-ID/2.ogg | Bin 0 -> 2273 bytes frontend/main/assets/locales/id-ID/3.ogg | Bin 0 -> 2252 bytes frontend/main/assets/locales/id-ID/4.ogg | Bin 0 -> 1806 bytes frontend/main/assets/locales/id-ID/5.ogg | Bin 0 -> 2342 bytes frontend/main/assets/locales/id-ID/6.ogg | Bin 0 -> 2178 bytes frontend/main/assets/locales/id-ID/7.ogg | Bin 0 -> 2101 bytes frontend/main/assets/locales/id-ID/8.ogg | Bin 0 -> 2409 bytes frontend/main/assets/locales/id-ID/9.ogg | Bin 0 -> 2484 bytes .../main/assets/locales/id-ID/activation.ogg | Bin 0 -> 17124 bytes .../main/assets/locales/id-ID/err_pin.ogg | Bin 0 -> 5087 bytes .../main/assets/locales/id-ID/err_reg.ogg | Bin 0 -> 7716 bytes .../main/assets/locales/id-ID/language.json | 59 + .../main/assets/locales/id-ID/upgrade.ogg | Bin 0 -> 3823 bytes .../main/assets/locales/id-ID/welcome.ogg | Bin 0 -> 2537 bytes .../main/assets/locales/id-ID/wificonfig.ogg | Bin 0 -> 8706 bytes frontend/main/assets/locales/it-IT/0.ogg | Bin 0 -> 1877 bytes frontend/main/assets/locales/it-IT/1.ogg | Bin 0 -> 1423 bytes frontend/main/assets/locales/it-IT/2.ogg | Bin 0 -> 1436 bytes frontend/main/assets/locales/it-IT/3.ogg | Bin 0 -> 1302 bytes frontend/main/assets/locales/it-IT/4.ogg | Bin 0 -> 1404 bytes frontend/main/assets/locales/it-IT/5.ogg | Bin 0 -> 1607 bytes frontend/main/assets/locales/it-IT/6.ogg | Bin 0 -> 1457 bytes frontend/main/assets/locales/it-IT/7.ogg | Bin 0 -> 1632 bytes frontend/main/assets/locales/it-IT/8.ogg | Bin 0 -> 1494 bytes frontend/main/assets/locales/it-IT/9.ogg | Bin 0 -> 1888 bytes .../main/assets/locales/it-IT/activation.ogg | Bin 0 -> 12274 bytes .../main/assets/locales/it-IT/err_pin.ogg | Bin 0 -> 3023 bytes .../main/assets/locales/it-IT/err_reg.ogg | Bin 0 -> 8416 bytes .../main/assets/locales/it-IT/language.json | 59 + .../main/assets/locales/it-IT/upgrade.ogg | Bin 0 -> 4059 bytes .../main/assets/locales/it-IT/welcome.ogg | Bin 0 -> 3063 bytes .../main/assets/locales/it-IT/wificonfig.ogg | Bin 0 -> 5995 bytes frontend/main/assets/locales/ja-JP/0.ogg | Bin 0 -> 1499 bytes frontend/main/assets/locales/ja-JP/1.ogg | Bin 0 -> 1459 bytes frontend/main/assets/locales/ja-JP/2.ogg | Bin 0 -> 1203 bytes frontend/main/assets/locales/ja-JP/3.ogg | Bin 0 -> 1312 bytes frontend/main/assets/locales/ja-JP/4.ogg | Bin 0 -> 1372 bytes frontend/main/assets/locales/ja-JP/5.ogg | Bin 0 -> 1085 bytes frontend/main/assets/locales/ja-JP/6.ogg | Bin 0 -> 1482 bytes frontend/main/assets/locales/ja-JP/7.ogg | Bin 0 -> 1503 bytes frontend/main/assets/locales/ja-JP/8.ogg | Bin 0 -> 1663 bytes frontend/main/assets/locales/ja-JP/9.ogg | Bin 0 -> 1565 bytes .../main/assets/locales/ja-JP/activation.ogg | Bin 0 -> 12162 bytes .../main/assets/locales/ja-JP/err_pin.ogg | Bin 0 -> 4547 bytes .../main/assets/locales/ja-JP/err_reg.ogg | Bin 0 -> 10168 bytes .../main/assets/locales/ja-JP/language.json | 59 + .../main/assets/locales/ja-JP/upgrade.ogg | Bin 0 -> 4754 bytes .../main/assets/locales/ja-JP/welcome.ogg | Bin 0 -> 3403 bytes .../main/assets/locales/ja-JP/wificonfig.ogg | Bin 0 -> 6770 bytes frontend/main/assets/locales/ko-KR/0.ogg | Bin 0 -> 1696 bytes frontend/main/assets/locales/ko-KR/1.ogg | Bin 0 -> 1687 bytes frontend/main/assets/locales/ko-KR/2.ogg | Bin 0 -> 1475 bytes frontend/main/assets/locales/ko-KR/3.ogg | Bin 0 -> 1588 bytes frontend/main/assets/locales/ko-KR/4.ogg | Bin 0 -> 1426 bytes frontend/main/assets/locales/ko-KR/5.ogg | Bin 0 -> 1490 bytes frontend/main/assets/locales/ko-KR/6.ogg | Bin 0 -> 1516 bytes frontend/main/assets/locales/ko-KR/7.ogg | Bin 0 -> 1734 bytes frontend/main/assets/locales/ko-KR/8.ogg | Bin 0 -> 1454 bytes frontend/main/assets/locales/ko-KR/9.ogg | Bin 0 -> 2430 bytes .../main/assets/locales/ko-KR/activation.ogg | Bin 0 -> 11193 bytes .../main/assets/locales/ko-KR/err_pin.ogg | Bin 0 -> 4725 bytes .../main/assets/locales/ko-KR/err_reg.ogg | Bin 0 -> 10954 bytes .../main/assets/locales/ko-KR/language.json | 59 + .../main/assets/locales/ko-KR/upgrade.ogg | Bin 0 -> 5335 bytes .../main/assets/locales/ko-KR/welcome.ogg | Bin 0 -> 4566 bytes .../main/assets/locales/ko-KR/wificonfig.ogg | Bin 0 -> 6474 bytes frontend/main/assets/locales/ms-MY/0.ogg | Bin 0 -> 2176 bytes frontend/main/assets/locales/ms-MY/1.ogg | Bin 0 -> 1639 bytes frontend/main/assets/locales/ms-MY/2.ogg | Bin 0 -> 2159 bytes frontend/main/assets/locales/ms-MY/3.ogg | Bin 0 -> 1571 bytes frontend/main/assets/locales/ms-MY/4.ogg | Bin 0 -> 1680 bytes frontend/main/assets/locales/ms-MY/5.ogg | Bin 0 -> 1565 bytes frontend/main/assets/locales/ms-MY/6.ogg | Bin 0 -> 1661 bytes frontend/main/assets/locales/ms-MY/7.ogg | Bin 0 -> 1486 bytes frontend/main/assets/locales/ms-MY/8.ogg | Bin 0 -> 2181 bytes frontend/main/assets/locales/ms-MY/9.ogg | Bin 0 -> 2479 bytes .../main/assets/locales/ms-MY/activation.ogg | Bin 0 -> 12883 bytes .../main/assets/locales/ms-MY/err_pin.ogg | Bin 0 -> 4105 bytes .../main/assets/locales/ms-MY/err_reg.ogg | Bin 0 -> 10706 bytes .../main/assets/locales/ms-MY/language.json | 59 + .../main/assets/locales/ms-MY/upgrade.ogg | Bin 0 -> 4065 bytes .../main/assets/locales/ms-MY/welcome.ogg | Bin 0 -> 5732 bytes .../main/assets/locales/ms-MY/wificonfig.ogg | Bin 0 -> 5042 bytes frontend/main/assets/locales/nb-NO/0.ogg | Bin 0 -> 1541 bytes frontend/main/assets/locales/nb-NO/1.ogg | Bin 0 -> 1448 bytes frontend/main/assets/locales/nb-NO/2.ogg | Bin 0 -> 2024 bytes frontend/main/assets/locales/nb-NO/3.ogg | Bin 0 -> 1767 bytes frontend/main/assets/locales/nb-NO/4.ogg | Bin 0 -> 1898 bytes frontend/main/assets/locales/nb-NO/5.ogg | Bin 0 -> 1778 bytes frontend/main/assets/locales/nb-NO/6.ogg | Bin 0 -> 1997 bytes frontend/main/assets/locales/nb-NO/7.ogg | Bin 0 -> 1647 bytes frontend/main/assets/locales/nb-NO/8.ogg | Bin 0 -> 1507 bytes frontend/main/assets/locales/nb-NO/9.ogg | Bin 0 -> 1782 bytes .../main/assets/locales/nb-NO/activation.ogg | Bin 0 -> 12110 bytes .../main/assets/locales/nb-NO/err_pin.ogg | Bin 0 -> 4175 bytes .../main/assets/locales/nb-NO/err_reg.ogg | Bin 0 -> 8992 bytes .../main/assets/locales/nb-NO/language.json | 59 + .../main/assets/locales/nb-NO/upgrade.ogg | Bin 0 -> 3155 bytes .../main/assets/locales/nb-NO/welcome.ogg | Bin 0 -> 2512 bytes .../main/assets/locales/nb-NO/wificonfig.ogg | Bin 0 -> 6131 bytes frontend/main/assets/locales/nl-NL/0.ogg | Bin 0 -> 1859 bytes frontend/main/assets/locales/nl-NL/1.ogg | Bin 0 -> 1553 bytes frontend/main/assets/locales/nl-NL/2.ogg | Bin 0 -> 1712 bytes frontend/main/assets/locales/nl-NL/3.ogg | Bin 0 -> 1547 bytes frontend/main/assets/locales/nl-NL/4.ogg | Bin 0 -> 1885 bytes frontend/main/assets/locales/nl-NL/5.ogg | Bin 0 -> 2010 bytes frontend/main/assets/locales/nl-NL/6.ogg | Bin 0 -> 1872 bytes frontend/main/assets/locales/nl-NL/7.ogg | Bin 0 -> 1981 bytes frontend/main/assets/locales/nl-NL/8.ogg | Bin 0 -> 1787 bytes frontend/main/assets/locales/nl-NL/9.ogg | Bin 0 -> 2154 bytes .../main/assets/locales/nl-NL/activation.ogg | Bin 0 -> 13132 bytes .../main/assets/locales/nl-NL/err_pin.ogg | Bin 0 -> 3190 bytes .../main/assets/locales/nl-NL/err_reg.ogg | Bin 0 -> 10114 bytes .../main/assets/locales/nl-NL/language.json | 59 + .../main/assets/locales/nl-NL/upgrade.ogg | Bin 0 -> 3529 bytes .../main/assets/locales/nl-NL/welcome.ogg | Bin 0 -> 2917 bytes .../main/assets/locales/nl-NL/wificonfig.ogg | Bin 0 -> 5759 bytes frontend/main/assets/locales/pl-PL/0.ogg | Bin 0 -> 2138 bytes frontend/main/assets/locales/pl-PL/1.ogg | Bin 0 -> 2152 bytes frontend/main/assets/locales/pl-PL/2.ogg | Bin 0 -> 1762 bytes frontend/main/assets/locales/pl-PL/3.ogg | Bin 0 -> 1821 bytes frontend/main/assets/locales/pl-PL/4.ogg | Bin 0 -> 1883 bytes frontend/main/assets/locales/pl-PL/5.ogg | Bin 0 -> 2067 bytes frontend/main/assets/locales/pl-PL/6.ogg | Bin 0 -> 2430 bytes frontend/main/assets/locales/pl-PL/7.ogg | Bin 0 -> 2142 bytes frontend/main/assets/locales/pl-PL/8.ogg | Bin 0 -> 1963 bytes frontend/main/assets/locales/pl-PL/9.ogg | Bin 0 -> 2386 bytes .../main/assets/locales/pl-PL/activation.ogg | Bin 0 -> 10689 bytes .../main/assets/locales/pl-PL/err_pin.ogg | Bin 0 -> 4294 bytes .../main/assets/locales/pl-PL/err_reg.ogg | Bin 0 -> 7341 bytes .../main/assets/locales/pl-PL/language.json | 59 + .../main/assets/locales/pl-PL/upgrade.ogg | Bin 0 -> 3937 bytes .../main/assets/locales/pl-PL/welcome.ogg | Bin 0 -> 3562 bytes .../main/assets/locales/pl-PL/wificonfig.ogg | Bin 0 -> 4551 bytes frontend/main/assets/locales/pt-PT/0.ogg | Bin 0 -> 1977 bytes frontend/main/assets/locales/pt-PT/1.ogg | Bin 0 -> 1496 bytes frontend/main/assets/locales/pt-PT/2.ogg | Bin 0 -> 1876 bytes frontend/main/assets/locales/pt-PT/3.ogg | Bin 0 -> 2119 bytes frontend/main/assets/locales/pt-PT/4.ogg | Bin 0 -> 1843 bytes frontend/main/assets/locales/pt-PT/5.ogg | Bin 0 -> 2197 bytes frontend/main/assets/locales/pt-PT/6.ogg | Bin 0 -> 1886 bytes frontend/main/assets/locales/pt-PT/7.ogg | Bin 0 -> 2094 bytes frontend/main/assets/locales/pt-PT/8.ogg | Bin 0 -> 1973 bytes frontend/main/assets/locales/pt-PT/9.ogg | Bin 0 -> 1809 bytes .../main/assets/locales/pt-PT/activation.ogg | Bin 0 -> 14660 bytes .../main/assets/locales/pt-PT/err_pin.ogg | Bin 0 -> 3457 bytes .../main/assets/locales/pt-PT/err_reg.ogg | Bin 0 -> 8363 bytes .../main/assets/locales/pt-PT/language.json | 59 + .../main/assets/locales/pt-PT/upgrade.ogg | Bin 0 -> 4051 bytes .../main/assets/locales/pt-PT/welcome.ogg | Bin 0 -> 3053 bytes .../main/assets/locales/pt-PT/wificonfig.ogg | Bin 0 -> 5471 bytes frontend/main/assets/locales/ro-RO/0.ogg | Bin 0 -> 1958 bytes frontend/main/assets/locales/ro-RO/1.ogg | Bin 0 -> 1870 bytes frontend/main/assets/locales/ro-RO/2.ogg | Bin 0 -> 1839 bytes frontend/main/assets/locales/ro-RO/3.ogg | Bin 0 -> 1566 bytes frontend/main/assets/locales/ro-RO/4.ogg | Bin 0 -> 2149 bytes frontend/main/assets/locales/ro-RO/5.ogg | Bin 0 -> 1766 bytes frontend/main/assets/locales/ro-RO/6.ogg | Bin 0 -> 1947 bytes frontend/main/assets/locales/ro-RO/7.ogg | Bin 0 -> 2318 bytes frontend/main/assets/locales/ro-RO/8.ogg | Bin 0 -> 2000 bytes frontend/main/assets/locales/ro-RO/9.ogg | Bin 0 -> 2279 bytes .../main/assets/locales/ro-RO/activation.ogg | Bin 0 -> 15258 bytes .../main/assets/locales/ro-RO/err_pin.ogg | Bin 0 -> 5609 bytes .../main/assets/locales/ro-RO/err_reg.ogg | Bin 0 -> 9224 bytes .../main/assets/locales/ro-RO/language.json | 59 + .../main/assets/locales/ro-RO/upgrade.ogg | Bin 0 -> 4479 bytes .../main/assets/locales/ro-RO/welcome.ogg | Bin 0 -> 2592 bytes .../main/assets/locales/ro-RO/wificonfig.ogg | Bin 0 -> 5552 bytes frontend/main/assets/locales/ru-RU/0.ogg | Bin 0 -> 1661 bytes frontend/main/assets/locales/ru-RU/1.ogg | Bin 0 -> 1847 bytes frontend/main/assets/locales/ru-RU/2.ogg | Bin 0 -> 1215 bytes frontend/main/assets/locales/ru-RU/3.ogg | Bin 0 -> 854 bytes frontend/main/assets/locales/ru-RU/4.ogg | Bin 0 -> 2328 bytes frontend/main/assets/locales/ru-RU/5.ogg | Bin 0 -> 2106 bytes frontend/main/assets/locales/ru-RU/6.ogg | Bin 0 -> 1091 bytes frontend/main/assets/locales/ru-RU/7.ogg | Bin 0 -> 1103 bytes frontend/main/assets/locales/ru-RU/8.ogg | Bin 0 -> 2557 bytes frontend/main/assets/locales/ru-RU/9.ogg | Bin 0 -> 1986 bytes .../main/assets/locales/ru-RU/activation.ogg | Bin 0 -> 12285 bytes .../main/assets/locales/ru-RU/err_pin.ogg | Bin 0 -> 5773 bytes .../main/assets/locales/ru-RU/err_reg.ogg | Bin 0 -> 9221 bytes .../main/assets/locales/ru-RU/language.json | 59 + .../main/assets/locales/ru-RU/upgrade.ogg | Bin 0 -> 3396 bytes .../main/assets/locales/ru-RU/welcome.ogg | Bin 0 -> 2327 bytes .../main/assets/locales/ru-RU/wificonfig.ogg | Bin 0 -> 7563 bytes frontend/main/assets/locales/sk-SK/0.ogg | Bin 0 -> 1640 bytes frontend/main/assets/locales/sk-SK/1.ogg | Bin 0 -> 1940 bytes frontend/main/assets/locales/sk-SK/2.ogg | Bin 0 -> 1620 bytes frontend/main/assets/locales/sk-SK/3.ogg | Bin 0 -> 2105 bytes frontend/main/assets/locales/sk-SK/4.ogg | Bin 0 -> 1893 bytes frontend/main/assets/locales/sk-SK/5.ogg | Bin 0 -> 1815 bytes frontend/main/assets/locales/sk-SK/6.ogg | Bin 0 -> 1924 bytes frontend/main/assets/locales/sk-SK/7.ogg | Bin 0 -> 1886 bytes frontend/main/assets/locales/sk-SK/8.ogg | Bin 0 -> 2521 bytes frontend/main/assets/locales/sk-SK/9.ogg | Bin 0 -> 1858 bytes .../main/assets/locales/sk-SK/activation.ogg | Bin 0 -> 10223 bytes .../main/assets/locales/sk-SK/err_pin.ogg | Bin 0 -> 3467 bytes .../main/assets/locales/sk-SK/err_reg.ogg | Bin 0 -> 8656 bytes .../main/assets/locales/sk-SK/language.json | 59 + .../main/assets/locales/sk-SK/upgrade.ogg | Bin 0 -> 3417 bytes .../main/assets/locales/sk-SK/welcome.ogg | Bin 0 -> 2630 bytes .../main/assets/locales/sk-SK/wificonfig.ogg | Bin 0 -> 5506 bytes frontend/main/assets/locales/sl-SI/0.ogg | Bin 0 -> 1907 bytes frontend/main/assets/locales/sl-SI/1.ogg | Bin 0 -> 1324 bytes frontend/main/assets/locales/sl-SI/2.ogg | Bin 0 -> 1552 bytes frontend/main/assets/locales/sl-SI/3.ogg | Bin 0 -> 1385 bytes frontend/main/assets/locales/sl-SI/4.ogg | Bin 0 -> 1638 bytes frontend/main/assets/locales/sl-SI/5.ogg | Bin 0 -> 1308 bytes frontend/main/assets/locales/sl-SI/6.ogg | Bin 0 -> 1913 bytes frontend/main/assets/locales/sl-SI/7.ogg | Bin 0 -> 1623 bytes frontend/main/assets/locales/sl-SI/8.ogg | Bin 0 -> 1652 bytes frontend/main/assets/locales/sl-SI/9.ogg | Bin 0 -> 1522 bytes .../main/assets/locales/sl-SI/activation.ogg | Bin 0 -> 14764 bytes .../main/assets/locales/sl-SI/err_pin.ogg | Bin 0 -> 5445 bytes .../main/assets/locales/sl-SI/err_reg.ogg | Bin 0 -> 9313 bytes .../main/assets/locales/sl-SI/language.json | 59 + .../main/assets/locales/sl-SI/upgrade.ogg | Bin 0 -> 3282 bytes .../main/assets/locales/sl-SI/welcome.ogg | Bin 0 -> 3786 bytes .../main/assets/locales/sl-SI/wificonfig.ogg | Bin 0 -> 7214 bytes .../main/assets/locales/sr-RS/language.json | 59 + frontend/main/assets/locales/sv-SE/0.ogg | Bin 0 -> 2303 bytes frontend/main/assets/locales/sv-SE/1.ogg | Bin 0 -> 2228 bytes frontend/main/assets/locales/sv-SE/2.ogg | Bin 0 -> 1995 bytes frontend/main/assets/locales/sv-SE/3.ogg | Bin 0 -> 2018 bytes frontend/main/assets/locales/sv-SE/4.ogg | Bin 0 -> 2010 bytes frontend/main/assets/locales/sv-SE/5.ogg | Bin 0 -> 1938 bytes frontend/main/assets/locales/sv-SE/6.ogg | Bin 0 -> 1900 bytes frontend/main/assets/locales/sv-SE/7.ogg | Bin 0 -> 1894 bytes frontend/main/assets/locales/sv-SE/8.ogg | Bin 0 -> 2028 bytes frontend/main/assets/locales/sv-SE/9.ogg | Bin 0 -> 2597 bytes .../main/assets/locales/sv-SE/activation.ogg | Bin 0 -> 14059 bytes .../main/assets/locales/sv-SE/err_pin.ogg | Bin 0 -> 5779 bytes .../main/assets/locales/sv-SE/err_reg.ogg | Bin 0 -> 8675 bytes .../main/assets/locales/sv-SE/language.json | 59 + .../main/assets/locales/sv-SE/upgrade.ogg | Bin 0 -> 4643 bytes .../main/assets/locales/sv-SE/welcome.ogg | Bin 0 -> 2490 bytes .../main/assets/locales/sv-SE/wificonfig.ogg | Bin 0 -> 6484 bytes frontend/main/assets/locales/th-TH/0.ogg | Bin 0 -> 2279 bytes frontend/main/assets/locales/th-TH/1.ogg | Bin 0 -> 2055 bytes frontend/main/assets/locales/th-TH/2.ogg | Bin 0 -> 2086 bytes frontend/main/assets/locales/th-TH/3.ogg | Bin 0 -> 2251 bytes frontend/main/assets/locales/th-TH/4.ogg | Bin 0 -> 1919 bytes frontend/main/assets/locales/th-TH/5.ogg | Bin 0 -> 1961 bytes frontend/main/assets/locales/th-TH/6.ogg | Bin 0 -> 1889 bytes frontend/main/assets/locales/th-TH/7.ogg | Bin 0 -> 1590 bytes frontend/main/assets/locales/th-TH/8.ogg | Bin 0 -> 1560 bytes frontend/main/assets/locales/th-TH/9.ogg | Bin 0 -> 1646 bytes .../main/assets/locales/th-TH/activation.ogg | Bin 0 -> 9627 bytes .../main/assets/locales/th-TH/err_pin.ogg | Bin 0 -> 3382 bytes .../main/assets/locales/th-TH/err_reg.ogg | Bin 0 -> 9745 bytes .../main/assets/locales/th-TH/language.json | 59 + .../main/assets/locales/th-TH/upgrade.ogg | Bin 0 -> 3404 bytes .../main/assets/locales/th-TH/welcome.ogg | Bin 0 -> 3788 bytes .../main/assets/locales/th-TH/wificonfig.ogg | Bin 0 -> 5596 bytes frontend/main/assets/locales/tr-TR/0.ogg | Bin 0 -> 1972 bytes frontend/main/assets/locales/tr-TR/1.ogg | Bin 0 -> 1983 bytes frontend/main/assets/locales/tr-TR/2.ogg | Bin 0 -> 1699 bytes frontend/main/assets/locales/tr-TR/3.ogg | Bin 0 -> 1767 bytes frontend/main/assets/locales/tr-TR/4.ogg | Bin 0 -> 1972 bytes frontend/main/assets/locales/tr-TR/5.ogg | Bin 0 -> 1868 bytes frontend/main/assets/locales/tr-TR/6.ogg | Bin 0 -> 2014 bytes frontend/main/assets/locales/tr-TR/7.ogg | Bin 0 -> 1818 bytes frontend/main/assets/locales/tr-TR/8.ogg | Bin 0 -> 2196 bytes frontend/main/assets/locales/tr-TR/9.ogg | Bin 0 -> 2002 bytes .../main/assets/locales/tr-TR/activation.ogg | Bin 0 -> 10808 bytes .../main/assets/locales/tr-TR/err_pin.ogg | Bin 0 -> 4456 bytes .../main/assets/locales/tr-TR/err_reg.ogg | Bin 0 -> 9495 bytes .../main/assets/locales/tr-TR/language.json | 59 + .../main/assets/locales/tr-TR/upgrade.ogg | Bin 0 -> 4021 bytes .../main/assets/locales/tr-TR/welcome.ogg | Bin 0 -> 3010 bytes .../main/assets/locales/tr-TR/wificonfig.ogg | Bin 0 -> 5432 bytes frontend/main/assets/locales/uk-UA/0.ogg | Bin 0 -> 2003 bytes frontend/main/assets/locales/uk-UA/1.ogg | Bin 0 -> 1902 bytes frontend/main/assets/locales/uk-UA/2.ogg | Bin 0 -> 2026 bytes frontend/main/assets/locales/uk-UA/3.ogg | Bin 0 -> 1765 bytes frontend/main/assets/locales/uk-UA/4.ogg | Bin 0 -> 2327 bytes frontend/main/assets/locales/uk-UA/5.ogg | Bin 0 -> 1989 bytes frontend/main/assets/locales/uk-UA/6.ogg | Bin 0 -> 1975 bytes frontend/main/assets/locales/uk-UA/7.ogg | Bin 0 -> 1678 bytes frontend/main/assets/locales/uk-UA/8.ogg | Bin 0 -> 2279 bytes frontend/main/assets/locales/uk-UA/9.ogg | Bin 0 -> 2146 bytes .../main/assets/locales/uk-UA/activation.ogg | Bin 0 -> 14195 bytes .../main/assets/locales/uk-UA/err_pin.ogg | Bin 0 -> 4537 bytes .../main/assets/locales/uk-UA/err_reg.ogg | Bin 0 -> 9545 bytes .../main/assets/locales/uk-UA/language.json | 59 + .../main/assets/locales/uk-UA/upgrade.ogg | Bin 0 -> 3642 bytes .../main/assets/locales/uk-UA/welcome.ogg | Bin 0 -> 2803 bytes .../main/assets/locales/uk-UA/wificonfig.ogg | Bin 0 -> 5981 bytes frontend/main/assets/locales/vi-VN/0.ogg | Bin 0 -> 1446 bytes frontend/main/assets/locales/vi-VN/1.ogg | Bin 0 -> 1635 bytes frontend/main/assets/locales/vi-VN/2.ogg | Bin 0 -> 1857 bytes frontend/main/assets/locales/vi-VN/3.ogg | Bin 0 -> 1656 bytes frontend/main/assets/locales/vi-VN/4.ogg | Bin 0 -> 1649 bytes frontend/main/assets/locales/vi-VN/5.ogg | Bin 0 -> 1443 bytes frontend/main/assets/locales/vi-VN/6.ogg | Bin 0 -> 1786 bytes frontend/main/assets/locales/vi-VN/7.ogg | Bin 0 -> 1967 bytes frontend/main/assets/locales/vi-VN/8.ogg | Bin 0 -> 1494 bytes frontend/main/assets/locales/vi-VN/9.ogg | Bin 0 -> 1733 bytes .../main/assets/locales/vi-VN/activation.ogg | Bin 0 -> 9747 bytes .../main/assets/locales/vi-VN/err_pin.ogg | Bin 0 -> 3806 bytes .../main/assets/locales/vi-VN/err_reg.ogg | Bin 0 -> 8213 bytes .../main/assets/locales/vi-VN/language.json | 59 + .../main/assets/locales/vi-VN/upgrade.ogg | Bin 0 -> 4162 bytes .../main/assets/locales/vi-VN/welcome.ogg | Bin 0 -> 2929 bytes .../main/assets/locales/vi-VN/wificonfig.ogg | Bin 0 -> 5203 bytes frontend/main/assets/locales/zh-CN/0.ogg | Bin 0 -> 1438 bytes frontend/main/assets/locales/zh-CN/1.ogg | Bin 0 -> 1485 bytes frontend/main/assets/locales/zh-CN/2.ogg | Bin 0 -> 1250 bytes frontend/main/assets/locales/zh-CN/3.ogg | Bin 0 -> 1503 bytes frontend/main/assets/locales/zh-CN/4.ogg | Bin 0 -> 1634 bytes frontend/main/assets/locales/zh-CN/5.ogg | Bin 0 -> 1512 bytes frontend/main/assets/locales/zh-CN/6.ogg | Bin 0 -> 1496 bytes frontend/main/assets/locales/zh-CN/7.ogg | Bin 0 -> 1652 bytes frontend/main/assets/locales/zh-CN/8.ogg | Bin 0 -> 1473 bytes frontend/main/assets/locales/zh-CN/9.ogg | Bin 0 -> 1421 bytes .../main/assets/locales/zh-CN/activation.ogg | Bin 0 -> 8402 bytes .../main/assets/locales/zh-CN/err_pin.ogg | Bin 0 -> 3538 bytes .../main/assets/locales/zh-CN/err_reg.ogg | Bin 0 -> 6747 bytes .../main/assets/locales/zh-CN/language.json | 59 + .../main/assets/locales/zh-CN/upgrade.ogg | Bin 0 -> 2847 bytes .../main/assets/locales/zh-CN/welcome.ogg | Bin 0 -> 3493 bytes .../main/assets/locales/zh-CN/wificonfig.ogg | Bin 0 -> 3155 bytes frontend/main/assets/locales/zh-TW/0.ogg | Bin 0 -> 1438 bytes frontend/main/assets/locales/zh-TW/1.ogg | Bin 0 -> 1485 bytes frontend/main/assets/locales/zh-TW/2.ogg | Bin 0 -> 1250 bytes frontend/main/assets/locales/zh-TW/3.ogg | Bin 0 -> 1503 bytes frontend/main/assets/locales/zh-TW/4.ogg | Bin 0 -> 1634 bytes frontend/main/assets/locales/zh-TW/5.ogg | Bin 0 -> 1512 bytes frontend/main/assets/locales/zh-TW/6.ogg | Bin 0 -> 1496 bytes frontend/main/assets/locales/zh-TW/7.ogg | Bin 0 -> 1652 bytes frontend/main/assets/locales/zh-TW/8.ogg | Bin 0 -> 1473 bytes frontend/main/assets/locales/zh-TW/9.ogg | Bin 0 -> 1421 bytes .../main/assets/locales/zh-TW/activation.ogg | Bin 0 -> 8402 bytes .../main/assets/locales/zh-TW/err_pin.ogg | Bin 0 -> 3538 bytes .../main/assets/locales/zh-TW/err_reg.ogg | Bin 0 -> 6747 bytes .../main/assets/locales/zh-TW/language.json | 59 + .../main/assets/locales/zh-TW/upgrade.ogg | Bin 0 -> 2847 bytes .../main/assets/locales/zh-TW/welcome.ogg | Bin 0 -> 3493 bytes .../main/assets/locales/zh-TW/wificonfig.ogg | Bin 0 -> 3155 bytes frontend/main/audio/README.md | 88 + frontend/main/audio/audio_codec.cc | 67 + frontend/main/audio/audio_codec.h | 61 + frontend/main/audio/audio_processor.h | 26 + frontend/main/audio/audio_service.cc | 734 ++++ frontend/main/audio/audio_service.h | 195 + frontend/main/audio/codecs/box_audio_codec.cc | 247 ++ frontend/main/audio/codecs/box_audio_codec.h | 40 + .../main/audio/codecs/dummy_audio_codec.cc | 20 + .../main/audio/codecs/dummy_audio_codec.h | 16 + .../main/audio/codecs/es8311_audio_codec.cc | 199 + .../main/audio/codecs/es8311_audio_codec.h | 42 + .../main/audio/codecs/es8374_audio_codec.cc | 200 + .../main/audio/codecs/es8374_audio_codec.h | 41 + .../main/audio/codecs/es8388_audio_codec.cc | 220 ++ .../main/audio/codecs/es8388_audio_codec.h | 40 + .../main/audio/codecs/es8389_audio_codec.cc | 206 + .../main/audio/codecs/es8389_audio_codec.h | 40 + frontend/main/audio/codecs/no_audio_codec.cc | 385 ++ frontend/main/audio/codecs/no_audio_codec.h | 41 + frontend/main/audio/demuxer/ogg_demuxer.cc | 311 ++ frontend/main/audio/demuxer/ogg_demuxer.h | 63 + .../audio/processors/afe_audio_processor.cc | 201 + .../audio/processors/afe_audio_processor.h | 48 + .../main/audio/processors/audio_debugger.cc | 68 + .../main/audio/processors/audio_debugger.h | 22 + .../audio/processors/no_audio_processor.cc | 71 + .../audio/processors/no_audio_processor.h | 35 + frontend/main/audio/wake_word.h | 26 + .../main/audio/wake_words/afe_wake_word.cc | 263 ++ .../main/audio/wake_words/afe_wake_word.h | 62 + .../main/audio/wake_words/custom_wake_word.cc | 303 ++ .../main/audio/wake_words/custom_wake_word.h | 71 + .../main/audio/wake_words/esp_wake_word.cc | 110 + .../main/audio/wake_words/esp_wake_word.h | 45 + frontend/main/boards/aipi-lite/README.md | 41 + frontend/main/boards/aipi-lite/README_en.md | 40 + frontend/main/boards/aipi-lite/aipi-lite.cc | 246 ++ frontend/main/boards/aipi-lite/config.h | 53 + frontend/main/boards/aipi-lite/config.json | 12 + frontend/main/boards/aipi-lite/config_en.json | 17 + .../main/boards/aipi-lite/power_manager.h | 187 + .../atk-dnesp32s3-box/atk_dnesp32s3_box.cc | 299 ++ .../main/boards/atk-dnesp32s3-box/config.h | 46 + .../main/boards/atk-dnesp32s3-box/config.json | 11 + .../atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc | 388 ++ .../main/boards/atk-dnesp32s3-box0/config.h | 84 + .../boards/atk-dnesp32s3-box0/config.json | 9 + .../boards/atk-dnesp32s3-box0/power_manager.h | 193 + .../atk_dnesp32s3_box2.cc | 477 +++ .../boards/atk-dnesp32s3-box2-4g/config.h | 80 + .../boards/atk-dnesp32s3-box2-4g/config.json | 9 + .../atk-dnesp32s3-box2-4g/power_manager.h | 195 + .../atk_dnesp32s3_box2.cc | 456 +++ .../boards/atk-dnesp32s3-box2-wifi/config.h | 71 + .../atk-dnesp32s3-box2-wifi/config.json | 9 + .../atk-dnesp32s3-box2-wifi/power_manager.h | 195 + .../boards/atk-dnesp32s3/atk_dnesp32s3.cc | 225 ++ frontend/main/boards/atk-dnesp32s3/config.h | 64 + .../main/boards/atk-dnesp32s3/config.json | 13 + .../atk-dnesp32s3m-4g/atk_dnesp32s3m.cc | 220 ++ .../main/boards/atk-dnesp32s3m-4g/config.h | 53 + .../atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc | 230 ++ .../main/boards/atk-dnesp32s3m-wifi/config.h | 52 + frontend/main/boards/atom-echos3r/README.md | 45 + .../main/boards/atom-echos3r/atom_echos3r.cc | 91 + frontend/main/boards/atom-echos3r/config.h | 29 + frontend/main/boards/atom-echos3r/config.json | 12 + .../boards/atommatrix-echo-base/README.md | 25 + .../atommatrix_echo_base.cc | 133 + .../main/boards/atommatrix-echo-base/config.h | 29 + .../boards/atommatrix-echo-base/config.json | 10 + .../main/boards/atoms3-echo-base/README.md | 49 + .../atoms3-echo-base/atoms3_echo_base.cc | 232 ++ .../main/boards/atoms3-echo-base/config.h | 43 + .../main/boards/atoms3-echo-base/config.json | 13 + .../atoms3r-cam-m12-echo-base/README.md | 54 + .../atoms3r_cam_m12_echo_base.cc | 190 + .../boards/atoms3r-cam-m12-echo-base/config.h | 49 + .../atoms3r-cam-m12-echo-base/config.json | 12 + .../main/boards/atoms3r-echo-base/README.md | 43 + .../atoms3r-echo-base/atoms3r_echo_base.cc | 312 ++ .../main/boards/atoms3r-echo-base/config.h | 43 + .../main/boards/atoms3r-echo-base/config.json | 12 + .../boards/bread-compact-esp32-lcd/config.h | 278 ++ .../bread-compact-esp32-lcd/config.json | 11 + .../esp32_bread_board_lcd.cc | 200 + .../main/boards/bread-compact-esp32/README.md | 25 + .../main/boards/bread-compact-esp32/config.h | 58 + .../boards/bread-compact-esp32/config.json | 17 + .../bread-compact-esp32/esp32_bread_board.cc | 162 + .../compact_ml307_board.cc | 191 + .../main/boards/bread-compact-ml307/config.h | 59 + .../boards/bread-compact-ml307/config.json | 17 + .../bread-compact-nt26/compact_nt26_board.cc | 181 + .../main/boards/bread-compact-nt26/config.h | 61 + .../boards/bread-compact-nt26/config.json | 11 + .../compact_wifi_board_lcd.cc | 183 + .../boards/bread-compact-wifi-lcd/config.h | 289 ++ .../boards/bread-compact-wifi-s3cam/README.md | 31 + .../compact_wifi_board_s3cam.cc | 214 ++ .../boards/bread-compact-wifi-s3cam/config.h | 308 ++ .../bread-compact-wifi/compact_wifi_board.cc | 188 + .../main/boards/bread-compact-wifi/config.h | 59 + .../boards/bread-compact-wifi/config.json | 17 + .../main/boards/common/adc_battery_monitor.cc | 116 + .../main/boards/common/adc_battery_monitor.h | 30 + frontend/main/boards/common/afsk_demod.cc | 375 ++ frontend/main/boards/common/afsk_demod.h | 177 + frontend/main/boards/common/axp2101.cc | 41 + frontend/main/boards/common/axp2101.h | 20 + frontend/main/boards/common/backlight.cc | 121 + frontend/main/boards/common/backlight.h | 36 + frontend/main/boards/common/blufi.cpp | 899 +++++ frontend/main/boards/common/blufi.h | 147 + frontend/main/boards/common/board.cc | 178 + frontend/main/boards/common/board.h | 92 + frontend/main/boards/common/button.cc | 125 + frontend/main/boards/common/button.h | 49 + frontend/main/boards/common/camera.h | 16 + .../main/boards/common/dual_network_board.cc | 98 + .../main/boards/common/dual_network_board.h | 60 + frontend/main/boards/common/esp32_camera.cc | 322 ++ frontend/main/boards/common/esp32_camera.h | 44 + frontend/main/boards/common/esp_video.cc | 1041 ++++++ frontend/main/boards/common/esp_video.h | 53 + frontend/main/boards/common/i2c_device.cc | 35 + frontend/main/boards/common/i2c_device.h | 18 + frontend/main/boards/common/knob.cc | 52 + frontend/main/boards/common/knob.h | 25 + frontend/main/boards/common/lamp_controller.h | 48 + frontend/main/boards/common/ml307_board.cc | 270 ++ frontend/main/boards/common/ml307_board.h | 38 + frontend/main/boards/common/nt26_board.cc | 269 ++ frontend/main/boards/common/nt26_board.h | 62 + .../main/boards/common/power_save_timer.cc | 132 + .../main/boards/common/power_save_timer.h | 34 + .../boards/common/press_to_talk_mcp_tool.cc | 57 + .../boards/common/press_to_talk_mcp_tool.h | 29 + frontend/main/boards/common/rndis_board.cc | 247 ++ frontend/main/boards/common/rndis_board.h | 74 + frontend/main/boards/common/sleep_timer.cc | 133 + frontend/main/boards/common/sleep_timer.h | 32 + frontend/main/boards/common/sy6970.cc | 65 + frontend/main/boards/common/sy6970.h | 21 + frontend/main/boards/common/system_reset.cc | 72 + frontend/main/boards/common/system_reset.h | 21 + frontend/main/boards/common/wifi_board.cc | 357 ++ frontend/main/boards/common/wifi_board.h | 69 + frontend/main/boards/df-k10/README.md | 57 + frontend/main/boards/df-k10/config.h | 76 + frontend/main/boards/df-k10/config.json | 15 + frontend/main/boards/df-k10/df_k10_board.cc | 299 ++ .../main/boards/df-k10/k10_audio_codec.cc | 227 ++ frontend/main/boards/df-k10/k10_audio_codec.h | 37 + frontend/main/boards/df-k10/led_control.cc | 124 + frontend/main/boards/df-k10/led_control.h | 18 + frontend/main/boards/df-s3-ai-cam/README.md | 76 + frontend/main/boards/df-s3-ai-cam/config.h | 63 + frontend/main/boards/df-s3-ai-cam/config.json | 19 + .../main/boards/df-s3-ai-cam/df_s3_ai_cam.cc | 112 + frontend/main/boards/doit-s3-aibox/README.md | 42 + frontend/main/boards/doit-s3-aibox/config.h | 29 + .../main/boards/doit-s3-aibox/config.json | 10 + .../boards/doit-s3-aibox/doit_s3_aibox.cc | 137 + frontend/main/boards/du-chatx/config.h | 40 + frontend/main/boards/du-chatx/config.json | 9 + .../main/boards/du-chatx/du-chatx-wifi.cc | 164 + frontend/main/boards/du-chatx/power_manager.h | 186 + frontend/main/boards/electron-bot/README.md | 75 + frontend/main/boards/electron-bot/config.h | 51 + frontend/main/boards/electron-bot/config.json | 9 + .../main/boards/electron-bot/electron_bot.cc | 123 + .../electron-bot/electron_bot_controller.cc | 376 ++ .../electron-bot/electron_emoji_display.cc | 105 + .../electron-bot/electron_emoji_display.h | 23 + .../main/boards/electron-bot/movements.cc | 470 +++ frontend/main/boards/electron-bot/movements.h | 89 + .../main/boards/electron-bot/oscillator.cc | 149 + .../main/boards/electron-bot/oscillator.h | 83 + .../main/boards/electron-bot/otto_icon_font.c | 121 + .../main/boards/electron-bot/power_manager.h | 128 + frontend/main/boards/esp-box-3/README.md | 132 + frontend/main/boards/esp-box-3/config.h | 41 + frontend/main/boards/esp-box-3/config.json | 11 + .../main/boards/esp-box-3/esp_box3_board.cc | 175 + .../esp-box-lite/box_audio_codec_lite.cc | 274 ++ .../esp-box-lite/box_audio_codec_lite.h | 41 + frontend/main/boards/esp-box-lite/config.h | 39 + frontend/main/boards/esp-box-lite/config.json | 11 + .../boards/esp-box-lite/esp_box_lite_board.cc | 237 ++ frontend/main/boards/esp-box/config.h | 41 + frontend/main/boards/esp-box/config.json | 9 + frontend/main/boards/esp-box/esp_box_board.cc | 174 + frontend/main/boards/esp-hi/README.md | 51 + .../main/boards/esp-hi/adc_pdm_audio_codec.cc | 250 ++ .../main/boards/esp-hi/adc_pdm_audio_codec.h | 37 + frontend/main/boards/esp-hi/config.h | 47 + frontend/main/boards/esp-hi/config.json | 34 + frontend/main/boards/esp-hi/emoji_display.cc | 178 + frontend/main/boards/esp-hi/emoji_display.h | 55 + frontend/main/boards/esp-hi/esp_hi.cc | 422 +++ .../boards/esp-p4-function-ev-board/README.md | 41 + .../boards/esp-p4-function-ev-board/config.h | 11 + .../esp-p4-function-ev-board/config.json | 16 + .../esp-p4-function-ev-board.cc | 233 ++ .../boards/esp-s3-lcd-ev-board-2/README.md | 10 + .../boards/esp-s3-lcd-ev-board-2/config.h | 42 + .../boards/esp-s3-lcd-ev-board-2/config.json | 9 + .../esp-s3-lcd-ev-board-2.cc | 280 ++ .../esp-s3-lcd-ev-board-2/esp_lcd_gc9503.c | 504 +++ .../esp-s3-lcd-ev-board-2/esp_lcd_gc9503.h | 146 + .../boards/esp-s3-lcd-ev-board-2/pin_config.h | 52 + .../main/boards/esp-s3-lcd-ev-board/README.md | 11 + .../main/boards/esp-s3-lcd-ev-board/config.h | 53 + .../boards/esp-s3-lcd-ev-board/config.json | 17 + .../esp-s3-lcd-ev-board.cc | 240 ++ .../esp_io_expander_tca9554.c | 154 + .../esp_io_expander_tca9554.h | 90 + .../esp-s3-lcd-ev-board/esp_lcd_gc9503.c | 504 +++ .../esp-s3-lcd-ev-board/esp_lcd_gc9503.h | 167 + .../boards/esp-s3-lcd-ev-board/pin_config.h | 62 + .../main/boards/esp-sensairshuttle/README.md | 39 + .../esp-sensairshuttle/adc_pdm_audio_codec.cc | 250 ++ .../esp-sensairshuttle/adc_pdm_audio_codec.h | 37 + .../main/boards/esp-sensairshuttle/config.h | 40 + .../boards/esp-sensairshuttle/config.json | 29 + .../esp-sensairshuttle/esp-sensairshuttle.cc | 315 ++ frontend/main/boards/esp-sparkbot/config.h | 99 + frontend/main/boards/esp-sparkbot/config.json | 13 + .../boards/esp-sparkbot/esp_sparkbot_board.cc | 302 ++ frontend/main/boards/esp-spot/README.md | 63 + frontend/main/boards/esp-spot/config.h | 79 + frontend/main/boards/esp-spot/config.json | 14 + .../main/boards/esp-spot/esp_spot_board.cc | 436 +++ frontend/main/boards/esp-vocat/README.md | 82 + frontend/main/boards/esp-vocat/config.h | 88 + frontend/main/boards/esp-vocat/config.json | 13 + frontend/main/boards/esp-vocat/esp_vocat.cc | 696 ++++ frontend/main/boards/esp-vocat/touch.h | 51 + frontend/main/boards/esp32-cgc-144/README.md | 30 + frontend/main/boards/esp32-cgc-144/config.h | 73 + .../main/boards/esp32-cgc-144/config.json | 10 + .../esp32-cgc-144/esp32_cgc_144_board.cc | 192 + .../main/boards/esp32-cgc-144/power_manager.h | 186 + .../boards/esp32-cgc-144/power_manager_lite.h | 185 + frontend/main/boards/esp32-cgc/README.md | 36 + frontend/main/boards/esp32-cgc/config.h | 271 ++ frontend/main/boards/esp32-cgc/config.json | 11 + .../main/boards/esp32-cgc/esp32_cgc_board.cc | 180 + .../boards/esp32s3-korvo2-v3-rndis/config.h | 81 + .../esp32s3-korvo2-v3-rndis/config.json | 10 + .../esp32s3_korvo2_v3_board.cc | 449 +++ .../esp32s3-korvo2-v3-rndis/power_manager.h | 249 ++ .../main/boards/esp32s3-korvo2-v3/config.h | 81 + .../main/boards/esp32s3-korvo2-v3/config.json | 10 + .../esp32s3_korvo2_v3_board.cc | 454 +++ .../boards/esp32s3-korvo2-v3/power_manager.h | 250 ++ .../ReadMe.md | 5 + .../freenove-esp32s3-display-2.8-lcd/config.h | 53 + .../config.json | 15 + .../freenove-esp32s3-display-2.8-lcd.cc | 140 + .../main/boards/genjutech-s3-1.54tft/config.h | 43 + .../boards/genjutech-s3-1.54tft/config.json | 9 + .../genjutech-s3-1.54tft.cc | 259 ++ .../genjutech-s3-1.54tft/power_manager.h | 186 + frontend/main/boards/hu-087/README.md | 7 + frontend/main/boards/hu-087/config.h | 28 + frontend/main/boards/hu-087/config.json | 9 + frontend/main/boards/hu-087/hu_087_board.cc | 151 + frontend/main/boards/jiuchuan-s3/README.md | 39 + frontend/main/boards/jiuchuan-s3/config.h | 52 + frontend/main/boards/jiuchuan-s3/config.json | 9 + .../boards/jiuchuan-s3/esp_lcd_panel_gc9301.c | 384 ++ .../boards/jiuchuan-s3/esp_lcd_panel_gc9301.h | 31 + .../main/boards/jiuchuan-s3/gpio_manager.h | 62 + .../boards/jiuchuan-s3/jiuchuan_dev_board.cc | 395 ++ .../boards/jiuchuan-s3/power_controller.h | 58 + .../main/boards/jiuchuan-s3/power_manager.h | 201 + frontend/main/boards/kevin-box-2/config.h | 41 + frontend/main/boards/kevin-box-2/config.json | 9 + .../boards/kevin-box-2/kevin_box_board.cc | 270 ++ frontend/main/boards/kevin-c3/config.h | 24 + frontend/main/boards/kevin-c3/config.json | 13 + .../main/boards/kevin-c3/kevin_c3_board.cc | 90 + .../main/boards/kevin-c3/led_strip_control.cc | 129 + .../main/boards/kevin-c3/led_strip_control.h | 18 + frontend/main/boards/kevin-sp-v3-dev/config.h | 64 + .../kevin-sp-v3-dev/kevin-sp-v3_board.cc | 157 + frontend/main/boards/kevin-sp-v4-dev/config.h | 66 + .../main/boards/kevin-sp-v4-dev/config.json | 10 + .../kevin-sp-v4-dev/kevin-sp-v4_board.cc | 173 + .../main/boards/kevin-yuying-313lcd/config.h | 35 + .../boards/kevin-yuying-313lcd/config.json | 9 + .../kevin-yuying-313lcd/esp_lcd_gc9503.c | 478 +++ .../kevin-yuying-313lcd/esp_lcd_gc9503.h | 145 + .../kevin_yuying_313lcd.cc | 163 + .../boards/kevin-yuying-313lcd/pin_config.h | 47 + .../main/boards/labplus-ledong-v2/README.md | 62 + .../main/boards/labplus-ledong-v2/config.h | 44 + .../main/boards/labplus-ledong-v2/config.json | 9 + .../labplus-ledong-v2/labplus_ledong_v2.cc | 163 + .../main/boards/labplus-mpython-v3/README.md | 61 + .../main/boards/labplus-mpython-v3/config.h | 44 + .../boards/labplus-mpython-v3/config.json | 9 + .../boards/labplus-mpython-v3/mpython_pro.cc | 143 + .../eda-robot-pro/README.md | 14 + .../eda-robot-pro/config.h | 40 + .../eda-robot-pro/config.json | 13 + .../eda-robot-pro/eda_dog_controller.cc | 399 ++ .../eda-robot-pro/eda_dog_movements.cc | 577 +++ .../eda-robot-pro/eda_dog_movements.h | 92 + .../eda-robot-pro/eda_robot_pro.cc | 133 + .../eda-robot-pro/oscillator.cc | 161 + .../eda-robot-pro/oscillator.h | 91 + .../eda-super-bear/README.md | 14 + .../eda-super-bear/config.h | 29 + .../eda-super-bear/config.json | 12 + .../eda-super-bear/eda_super_bear.cc | 58 + .../eda_super_bear_controller.cc | 493 +++ .../eda_super_bear_movements.cc | 763 ++++ .../eda-super-bear/eda_super_bear_movements.h | 105 + .../eda-super-bear/oscillator.cc | 161 + .../eda-super-bear/oscillator.h | 91 + .../eda-tv-pro/README.md | 13 + .../lceda-course-examples/eda-tv-pro/config.h | 35 + .../eda-tv-pro/config.json | 12 + .../eda-tv-pro/eda-tv-pro.cc | 122 + .../main/boards/lichuang-c3-dev/README.md | 11 + frontend/main/boards/lichuang-c3-dev/config.h | 45 + .../main/boards/lichuang-c3-dev/config.json | 14 + .../lichuang-c3-dev/lichuang_c3_dev_board.cc | 129 + frontend/main/boards/lichuang-dev/config.h | 62 + frontend/main/boards/lichuang-dev/config.json | 11 + .../boards/lichuang-dev/lichuang_dev_board.cc | 296 ++ .../boards/lilygo-t-cameraplus-s3/README.md | 47 + .../boards/lilygo-t-cameraplus-s3/config.h | 57 + .../boards/lilygo-t-cameraplus-s3/config.json | 23 + .../ir_filter_controller.h | 44 + .../lilygo-t-cameraplus-s3.cc | 350 ++ .../lilygo-t-cameraplus-s3/pin_config.h | 154 + .../tcamerapluss3_audio_codec.cc | 169 + .../tcamerapluss3_audio_codec.h | 37 + .../main/boards/lilygo-t-circle-s3/README.md | 28 + .../main/boards/lilygo-t-circle-s3/config.h | 46 + .../boards/lilygo-t-circle-s3/config.json | 9 + .../lilygo-t-circle-s3/esp_lcd_gc9d01n.c | 353 ++ .../lilygo-t-circle-s3/esp_lcd_gc9d01n.h | 99 + .../lilygo-t-circle-s3/lilygo-t-circle-s3.cc | 258 ++ .../boards/lilygo-t-circle-s3/pin_config.h | 47 + .../tcircles3_audio_codec.cc | 147 + .../tcircles3_audio_codec.h | 37 + .../main/boards/lilygo-t-display-p4/README.md | 42 + .../main/boards/lilygo-t-display-p4/config.h | 76 + .../lilygo-t-display-p4/hi8561_driver.cc | 404 ++ .../lilygo-t-display-p4/hi8561_driver.h | 66 + .../lilygo-t-display-p4.cc | 397 ++ .../lilygo-t-display-p4/rm69a10_driver.cc | 377 ++ .../lilygo-t-display-p4/rm69a10_driver.h | 68 + .../lilygo-t-display-p4/t_display_p4_config.h | 233 ++ .../README.md | 32 + .../lilygo-t-display-s3-pro-mvsrlora/config.h | 47 + .../config.json | 9 + .../lilygo-t-display-s3-pro-mvsrlora.cc | 283 ++ .../pin_config.h | 80 + .../tdisplays3promvsrlora_audio_codec.cc | 150 + .../tdisplays3promvsrlora_audio_codec.h | 37 + .../boards/m5stack-cardputer-adv/README.md | 48 + .../boards/m5stack-cardputer-adv/config.h | 58 + .../boards/m5stack-cardputer-adv/config.json | 13 + .../m5stack_cardputer_adv.cc | 158 + .../main/boards/m5stack-core-s3/README.md | 22 + frontend/main/boards/m5stack-core-s3/config.h | 66 + .../main/boards/m5stack-core-s3/config.json | 14 + .../m5stack-core-s3/cores3_audio_codec.cc | 246 ++ .../m5stack-core-s3/cores3_audio_codec.h | 37 + .../boards/m5stack-core-s3/m5stack_core_s3.cc | 396 ++ frontend/main/boards/m5stack-tab5/README.md | 66 + frontend/main/boards/m5stack-tab5/config.h | 325 ++ frontend/main/boards/m5stack-tab5/config.json | 19 + .../main/boards/m5stack-tab5/esp_lcd_st7123.c | 381 ++ .../main/boards/m5stack-tab5/esp_lcd_st7123.h | 125 + .../main/boards/m5stack-tab5/m5stack_tab5.cc | 574 +++ .../main/boards/m5stack-tab5/sdkconfig.tab5 | 14 + .../boards/m5stack-tab5/tab5_audio_codec.cc | 245 ++ .../boards/m5stack-tab5/tab5_audio_codec.h | 37 + frontend/main/boards/magiclick-2p4/config.h | 50 + .../main/boards/magiclick-2p4/config.json | 9 + .../magiclick-2p4/magiclick_2p4_board.cc | 272 ++ frontend/main/boards/magiclick-2p5/config.h | 56 + .../main/boards/magiclick-2p5/config.json | 10 + .../magiclick-2p5/magiclick_2p5_board.cc | 424 +++ .../main/boards/magiclick-2p5/power_manager.h | 195 + frontend/main/boards/magiclick-c3-v2/config.h | 47 + .../main/boards/magiclick-c3-v2/config.json | 13 + .../magiclick-c3-v2/magiclick_c3_v2_board.cc | 233 ++ frontend/main/boards/magiclick-c3/config.h | 47 + frontend/main/boards/magiclick-c3/config.json | 13 + .../boards/magiclick-c3/magiclick_c3_board.cc | 191 + frontend/main/boards/minsi-k08-dual/README.md | 36 + frontend/main/boards/minsi-k08-dual/config.h | 47 + .../main/boards/minsi-k08-dual/config.json | 9 + .../boards/minsi-k08-dual/minsi_k08_dual.cc | 246 ++ .../boards/minsi-k08-dual/power_manager.h | 187 + frontend/main/boards/mixgo-nova/README.md | 72 + frontend/main/boards/mixgo-nova/config.h | 42 + frontend/main/boards/mixgo-nova/config.json | 14 + frontend/main/boards/mixgo-nova/mixgo-nova.cc | 168 + .../boards/movecall-cuican-esp32s3/README.md | 44 + .../boards/movecall-cuican-esp32s3/config.h | 45 + .../movecall-cuican-esp32s3/config.json | 13 + .../movecall_cuican_esp32s3.cc | 123 + .../boards/movecall-moji-esp32s3/README.md | 26 + .../boards/movecall-moji-esp32s3/config.h | 45 + .../boards/movecall-moji-esp32s3/config.json | 9 + .../movecall_moji_esp32s3.cc | 150 + .../boards/movecall-moji2-esp32c5/README.md | 57 + .../movecall-moji2-esp32c5/README_zh.md | 57 + .../boards/movecall-moji2-esp32c5/config.h | 68 + .../boards/movecall-moji2-esp32c5/config.json | 17 + .../movecall_moji2_esp32s3.cc | 393 ++ frontend/main/boards/otto-robot/README.md | 207 ++ frontend/main/boards/otto-robot/config.h | 176 + frontend/main/boards/otto-robot/config.json | 17 + frontend/main/boards/otto-robot/oscillator.cc | 161 + frontend/main/boards/otto-robot/oscillator.h | 91 + .../main/boards/otto-robot/otto_controller.cc | 849 +++++ .../boards/otto-robot/otto_emoji_display.cc | 134 + .../boards/otto-robot/otto_emoji_display.h | 24 + .../main/boards/otto-robot/otto_icon_font.c | 121 + .../main/boards/otto-robot/otto_movements.cc | 964 +++++ .../main/boards/otto-robot/otto_movements.h | 117 + frontend/main/boards/otto-robot/otto_robot.cc | 417 +++ .../main/boards/otto-robot/power_manager.h | 151 + .../otto-robot/websocket_control_server.cc | 192 + .../otto-robot/websocket_control_server.h | 33 + .../main/boards/sensecap-watcher/README.md | 52 + .../main/boards/sensecap-watcher/README_en.md | 53 + .../main/boards/sensecap-watcher/config.h | 152 + .../main/boards/sensecap-watcher/config.json | 16 + .../boards/sensecap-watcher/config_en.json | 20 + .../sensecap-watcher/sensecap_audio_codec.cc | 216 ++ .../sensecap-watcher/sensecap_audio_codec.h | 38 + .../sensecap-watcher/sensecap_watcher.cc | 668 ++++ .../boards/sensecap-watcher/sscma_camera.cc | 743 ++++ .../boards/sensecap-watcher/sscma_camera.h | 75 + .../boards/sp-esp32-s3-1.28-box/README.md | 31 + .../main/boards/sp-esp32-s3-1.28-box/config.h | 56 + .../boards/sp-esp32-s3-1.28-box/config.json | 9 + .../sp-esp32-s3-1.28-box/power_manager.h | 189 + .../sp-esp32-s3-1.28-box.cc | 491 +++ .../boards/sp-esp32-s3-1.54-muma/README.md | 34 + .../boards/sp-esp32-s3-1.54-muma/config.h | 58 + .../boards/sp-esp32-s3-1.54-muma/config.json | 9 + .../sp-esp32-s3-1.54-muma/power_manager.h | 186 + .../sp-esp32-s3-1.54-muma.cc | 325 ++ .../main/boards/surfer-c3-1.14tft/README.md | 5 + .../main/boards/surfer-c3-1.14tft/config.h | 45 + .../main/boards/surfer-c3-1.14tft/config.json | 14 + .../boards/surfer-c3-1.14tft/power_manager.h | 201 + .../surfer-c3-1.14tft/surfer-c3-1.14tft.cc | 210 ++ frontend/main/boards/taiji-pi-s3/README.md | 45 + frontend/main/boards/taiji-pi-s3/config.h | 66 + frontend/main/boards/taiji-pi-s3/config.json | 19 + .../main/boards/taiji-pi-s3/taiji_pi_s3.cc | 663 ++++ frontend/main/boards/tudouzi/config.h | 41 + frontend/main/boards/tudouzi/config.json | 13 + .../main/boards/tudouzi/kevin_box_board.cc | 255 ++ .../waveshare/esp32-c6-lcd-1.69/README.md | 56 + .../waveshare/esp32-c6-lcd-1.69/config.h | 54 + .../waveshare/esp32-c6-lcd-1.69/config.json | 12 + .../esp32-c6-lcd-1.69/esp32-c6-lcd-1.69.cc | 262 ++ .../esp32-c6-lcd-1.69/power_manager.h | 174 + .../esp32-c6-touch-amoled-1.32/README.md | 48 + .../esp32-c6-touch-amoled-1.32/config.h | 44 + .../esp32-c6-touch-amoled-1.32/config.json | 12 + .../esp32-c6-touch-amoled-1.32.cc | 223 ++ .../esp32-c6-touch-amoled-1.43/README.md | 49 + .../esp32-c6-touch-amoled-1.43/config.h | 49 + .../esp32-c6-touch-amoled-1.43/config.json | 12 + .../esp32-c6-touch-amoled-1.43.cc | 292 ++ .../esp32-c6-touch-amoled-1.8/README.md | 4 + .../esp32-c6-touch-amoled-1.8/config.h | 41 + .../esp32-c6-touch-amoled-1.8/config.json | 12 + .../esp32-c6-touch-amoled-1.8.cc | 352 ++ .../esp32-c6-touch-amoled-2.06/README.md | 4 + .../esp32-c6-touch-amoled-2.06/config.h | 46 + .../esp32-c6-touch-amoled-2.06/config.json | 12 + .../esp32-c6-touch-amoled-2.06.cc | 322 ++ .../esp32-c6-touch-amoled-2.16/README.md | 48 + .../esp32-c6-touch-amoled-2.16/config.h | 46 + .../esp32-c6-touch-amoled-2.16/config.json | 14 + .../esp32-c6-touch-amoled-2.16.cc | 352 ++ .../esp32-c6-touch-lcd-1.83/README.md | 49 + .../esp32-c6-touch-lcd-1.83/config.h | 50 + .../esp32-c6-touch-lcd-1.83/config.json | 13 + .../esp32-c6-touch-lcd-1.83.cc | 274 ++ .../boards/waveshare/esp32-p4-nano/README.md | 43 + .../boards/waveshare/esp32-p4-nano/config.h | 44 + .../waveshare/esp32-p4-nano/config.json | 16 + .../waveshare/esp32-p4-nano/esp32-p4-nano.cc | 284 ++ .../waveshare/esp32-p4-nano/lcd_init_cmds.h | 224 ++ .../esp32-p4-wifi6-touch-lcd-3.5/README.md | 11 + .../esp32-p4-wifi6-touch-lcd-3.5/config.h | 45 + .../esp32-p4-wifi6-touch-lcd-3.5/config.json | 17 + .../esp32-p4-wifi6-touch-lcd-3.5.cc | 191 + .../esp32-p4-wifi6-touch-lcd/README.md | 18 + .../esp32-p4-wifi6-touch-lcd/config.h | 98 + .../esp32-p4-wifi6-touch-lcd/config.json | 118 + .../esp32-p4-wifi6-touch-lcd.cc | 458 +++ .../esp32-p4-wifi6-touch-lcd/lcd_init_cmds.h | 1124 ++++++ .../waveshare/esp32-s3-audio-board/README.md | 3 + .../waveshare/esp32-s3-audio-board/config.h | 95 + .../esp32-s3-audio-board/config.json | 20 + .../esp32-s3-audio_board.cc | 239 ++ .../esp32-s3-audio-board/esp_lcd_jd9853.c | 460 +++ .../esp32-s3-audio-board/esp_lcd_jd9853.h | 102 + .../boards/waveshare/esp32-s3-cam/README.md | 6 + .../boards/waveshare/esp32-s3-cam/config.h | 115 + .../boards/waveshare/esp32-s3-cam/config.json | 38 + .../esp32-s3-cam/esp32-s3-cam-xxxx.cc | 282 ++ .../waveshare/esp32-s3-epaper-1.54/README.md | 55 + .../esp32-s3-epaper-1.54/board_power_bsp.cc | 59 + .../esp32-s3-epaper-1.54/board_power_bsp.h | 23 + .../waveshare/esp32-s3-epaper-1.54/config.h | 50 + .../esp32-s3-epaper-1.54/config.json | 23 + .../custom_lcd_display.cc | 403 ++ .../esp32-s3-epaper-1.54/custom_lcd_display.h | 75 + .../waveshare-s3-epaper-1.54.cc | 172 + .../waveshare/esp32-s3-epaper-3.97/README.md | 48 + .../waveshare/esp32-s3-epaper-3.97/config.h | 44 + .../esp32-s3-epaper-3.97/config.json | 12 + .../custom_lcd_display.cc | 393 ++ .../esp32-s3-epaper-3.97/custom_lcd_display.h | 74 + .../waveshare-s3-epaper-3.97.cc | 178 + .../waveshare/esp32-s3-lcd-0.85/README.md | 60 + .../waveshare/esp32-s3-lcd-0.85/config.h | 56 + .../waveshare/esp32-s3-lcd-0.85/config.json | 15 + .../esp32-s3-lcd-0.85/esp32-s3-lcd-0.85.cc | 311 ++ .../esp32-s3-lcd-0.85/led_strip_control.cc | 130 + .../esp32-s3-lcd-0.85/led_strip_control.h | 18 + .../esp32-s3-lcd-0.85/power_manager.h | 212 ++ .../waveshare/esp32-s3-rlcd-4.2/README.md | 48 + .../waveshare/esp32-s3-rlcd-4.2/config.h | 46 + .../waveshare/esp32-s3-rlcd-4.2/config.json | 13 + .../esp32-s3-rlcd-4.2/custom_lcd_display.cc | 338 ++ .../esp32-s3-rlcd-4.2/custom_lcd_display.h | 57 + .../waveshare-s3-rlcd-4.2.cc | 170 + .../esp32-s3-touch-amoled-1.32/README.md | 48 + .../esp32-s3-touch-amoled-1.32/config.h | 47 + .../esp32-s3-touch-amoled-1.32/config.json | 13 + .../esp32-s3-touch-amoled-1.32.cc | 223 ++ .../esp32-s3-touch-amoled-1.75/README.md | 15 + .../esp32-s3-touch-amoled-1.75/config.h | 57 + .../esp32-s3-touch-amoled-1.75/config.json | 22 + .../esp32-s3-touch-amoled-1.75.cc | 370 ++ .../esp32-s3-touch-amoled-1.8/config.h | 41 + .../esp32-s3-touch-amoled-1.8/config.json | 12 + .../esp32-s3-touch-amoled-1.8.cc | 352 ++ .../esp32-s3-touch-amoled-2.06/README.md | 11 + .../esp32-s3-touch-amoled-2.06/config.h | 43 + .../esp32-s3-touch-amoled-2.06/config.json | 13 + .../esp32-s3-touch-amoled-2.06.cc | 363 ++ .../esp32-s3-touch-lcd-1.46/README.md | 4 + .../esp32-s3-touch-lcd-1.46/config.h | 70 + .../esp32-s3-touch-lcd-1.46/config.json | 10 + .../esp32-s3-touch-lcd-1.46.cc | 245 ++ .../esp32-s3-touch-lcd-1.54/README.md | 49 + .../esp32-s3-touch-lcd-1.54/config.h | 56 + .../esp32-s3-touch-lcd-1.54/config.json | 13 + .../esp32-s3-touch-lcd-1.54.cc | 355 ++ .../esp32-s3-touch-lcd-1.54/power_manager.h | 212 ++ .../esp32-s3-touch-lcd-1.83/README.md | 4 + .../esp32-s3-touch-lcd-1.83/config.h | 47 + .../esp32-s3-touch-lcd-1.83/config.json | 13 + .../esp32-s3-touch-lcd-1.83.cc | 274 ++ .../esp32-s3-touch-lcd-1.85/README.md | 3 + .../esp32-s3-touch-lcd-1.85/config.h | 69 + .../esp32-s3-touch-lcd-1.85/config.json | 10 + .../esp32-s3-touch-lcd-1.85.cc | 447 +++ .../esp32-s3-touch-lcd-1.85c/README.md | 3 + .../esp32-s3-touch-lcd-1.85c/config.h | 90 + .../esp32-s3-touch-lcd-1.85c/config.json | 10 + .../esp32-s3-touch-lcd-1.85c.cc | 407 ++ .../esp32-s3-touch-lcd-3.49/README.md | 3 + .../esp32-s3-touch-lcd-3.49/config.h | 62 + .../esp32-s3-touch-lcd-3.49/config.json | 13 + .../custom_lcd_display.cc | 147 + .../custom_lcd_display.h | 17 + .../waveshare-s3-touch-lcd-3.49.cc | 253 ++ .../esp32-s3-touch-lcd-3.5/README.md | 3 + .../waveshare/esp32-s3-touch-lcd-3.5/config.h | 69 + .../esp32-s3-touch-lcd-3.5/config.json | 20 + .../esp32-s3-touch-lcd-3.5.cc | 382 ++ .../esp32-s3-touch-lcd-3.5b/README.md | 3 + .../esp32-s3-touch-lcd-3.5b/config.h | 78 + .../esp32-s3-touch-lcd-3.5b/config.json | 20 + .../custom_lcd_display.cc | 286 ++ .../custom_lcd_display.h | 19 + .../waveshare-s3-touch-lcd-3.5b.cc | 365 ++ .../esp32-s3-touch-lcd-4.3c/README.md | 43 + .../esp32-s3-touch-lcd-4.3c/config.h | 89 + .../esp32-s3-touch-lcd-4.3c/config.json | 15 + .../esp32_s3_touch_lcd_4.3c.cc | 252 ++ .../esp32-s3-touch-lcd-4.3c/sdkconfig.4_3c | 3306 +++++++++++++++++ .../waveshare/esp32-s3-touch-lcd-4b/README.md | 12 + .../waveshare/esp32-s3-touch-lcd-4b/config.h | 65 + .../esp32-s3-touch-lcd-4b/config.json | 13 + .../esp32-s3-touch-lcd-4b.cc | 440 +++ .../waveshare/esp32-touch-lcd-3.5/README.md | 3 + .../waveshare/esp32-touch-lcd-3.5/config.h | 55 + .../waveshare/esp32-touch-lcd-3.5/config.json | 9 + .../esp32-touch-lcd-3.5.cc | 341 ++ .../boards/wireless-tag-wtp4c5mp07s/README.md | 45 + .../boards/wireless-tag-wtp4c5mp07s/config.h | 104 + .../wireless-tag-wtp4c5mp07s/config.json | 16 + .../wireless-tag-wtp4c5mp07s.cc | 306 ++ .../main/boards/xingzhi-abs-2.0/README.md | 78 + frontend/main/boards/xingzhi-abs-2.0/config.h | 70 + .../main/boards/xingzhi-abs-2.0/config.json | 10 + .../boards/xingzhi-abs-2.0/customlcddisplay.h | 94 + .../boards/xingzhi-abs-2.0/power_manager.h | 305 ++ .../boards/xingzhi-abs-2.0/xingzhi-abs-2.0.cc | 389 ++ .../xingzhi-cube-0.85tft-ml307/config.h | 40 + .../xingzhi-cube-0.85tft-ml307/config.json | 9 + .../xingzhi-cube-0.85tft-ml307.cc | 239 ++ .../boards/xingzhi-cube-0.85tft-wifi/config.h | 37 + .../xingzhi-cube-0.85tft-wifi/config.json | 9 + .../xingzhi-cube-0.85tft-wifi.cc | 244 ++ .../xingzhi-cube-0.96oled-ml307/config.h | 30 + .../xingzhi-cube-0.96oled-ml307/config.json | 9 + .../xingzhi-cube-0.96oled-ml307.cc | 234 ++ .../xingzhi-cube-0.96oled-wifi/config.h | 27 + .../xingzhi-cube-0.96oled-wifi/config.json | 9 + .../xingzhi-cube-0.96oled-wifi.cc | 225 ++ .../xingzhi-cube-1.54tft-ml307/config.h | 40 + .../xingzhi-cube-1.54tft-ml307/config.json | 15 + .../xingzhi-cube-1.54tft-ml307.cc | 212 ++ .../boards/xingzhi-cube-1.54tft-wifi/config.h | 36 + .../xingzhi-cube-1.54tft-wifi/config.json | 9 + .../xingzhi-cube-1.54tft-wifi/power_manager.h | 186 + .../xingzhi-cube-1.54tft-wifi.cc | 201 + .../boards/xingzhi-metal-1.54-wifi/README.md | 61 + .../boards/xingzhi-metal-1.54-wifi/config.h | 53 + .../xingzhi-metal-1.54-wifi/config.json | 10 + .../boards/xingzhi-metal-1.54-wifi/cst816x.cc | 213 ++ .../boards/xingzhi-metal-1.54-wifi/cst816x.h | 90 + .../xingzhi-metal-1.54-wifi/power_manager.h | 314 ++ .../xingzhi-metal-1.54-wifi.cc | 201 + frontend/main/boards/xmini-c3-4g/README.md | 4 + frontend/main/boards/xmini-c3-4g/config.h | 32 + frontend/main/boards/xmini-c3-4g/config.json | 15 + .../boards/xmini-c3-4g/xmini_c3_4g_board.cc | 203 + frontend/main/boards/xmini-c3-v3/README.md | 4 + frontend/main/boards/xmini-c3-v3/config.h | 28 + frontend/main/boards/xmini-c3-v3/config.json | 14 + .../main/boards/xmini-c3-v3/xmini_c3_board.cc | 201 + frontend/main/boards/xmini-c3/config.h | 28 + frontend/main/boards/xmini-c3/config.json | 14 + .../main/boards/xmini-c3/xmini_c3_board.cc | 182 + frontend/main/boards/yunliao-s3/README.md | 98 + frontend/main/boards/yunliao-s3/config.h | 61 + frontend/main/boards/yunliao-s3/config.json | 11 + .../main/boards/yunliao-s3/power_manager.cc | 278 ++ .../main/boards/yunliao-s3/power_manager.h | 45 + frontend/main/boards/yunliao-s3/yunliao_s3.cc | 295 ++ .../boards/zhengchen-1.54tft-ml307/README.md | 45 + .../boards/zhengchen-1.54tft-ml307/config.h | 42 + .../zhengchen-1.54tft-ml307/config.json | 9 + .../zhengchen-1.54tft-ml307.cc | 211 ++ .../boards/zhengchen-1.54tft-wifi/README.md | 45 + .../boards/zhengchen-1.54tft-wifi/config.h | 39 + .../boards/zhengchen-1.54tft-wifi/config.json | 9 + .../zhengchen-1.54tft-wifi/power_manager.h | 238 ++ .../zhengchen-1.54tft-wifi.cc | 228 ++ .../zhengchen_lcd_display.h | 66 + .../main/boards/zhengchen-cam-ml307/README.md | 50 + .../main/boards/zhengchen-cam-ml307/config.h | 70 + .../boards/zhengchen-cam-ml307/config.json | 17 + .../zhengchen-cam-ml307/mcp_controller.cc | 94 + .../zhengchen-cam-ml307/power_manager.h | 237 ++ .../zhengchen_cam_board_ml307.cc | 340 ++ frontend/main/boards/zhengchen-cam/README.md | 49 + frontend/main/boards/zhengchen-cam/config.h | 68 + .../main/boards/zhengchen-cam/config.json | 17 + .../boards/zhengchen-cam/mcp_controller.cc | 94 + .../main/boards/zhengchen-cam/power_manager.h | 237 ++ .../zhengchen-cam/zhengchen_cam_board.cc | 333 ++ frontend/main/device_state.h | 18 + frontend/main/device_state_machine.cc | 161 + frontend/main/device_state_machine.h | 83 + frontend/main/display/display.cc | 60 + frontend/main/display/display.h | 87 + frontend/main/display/emote_display.cc | 250 ++ frontend/main/display/emote_display.h | 42 + frontend/main/display/lcd_display.cc | 1310 +++++++ frontend/main/display/lcd_display.h | 85 + .../display/lvgl_display/emoji_collection.cc | 123 + .../display/lvgl_display/emoji_collection.h | 34 + .../main/display/lvgl_display/gif/LICENSE.txt | 2 + .../main/display/lvgl_display/gif/README.md | 17 + .../main/display/lvgl_display/gif/gifdec.c | 821 ++++ .../main/display/lvgl_display/gif/gifdec.h | 68 + .../display/lvgl_display/gif/gifdec_mve.h | 140 + .../main/display/lvgl_display/gif/lvgl_gif.cc | 252 ++ .../main/display/lvgl_display/gif/lvgl_gif.h | 117 + .../lvgl_display/jpg/image_to_jpeg.cpp | 467 +++ .../display/lvgl_display/jpg/image_to_jpeg.h | 86 + .../display/lvgl_display/jpg/jpeg_to_image.c | 264 ++ .../display/lvgl_display/jpg/jpeg_to_image.h | 62 + .../main/display/lvgl_display/lvgl_display.cc | 274 ++ .../main/display/lvgl_display/lvgl_display.h | 53 + .../main/display/lvgl_display/lvgl_font.cc | 13 + .../main/display/lvgl_display/lvgl_font.h | 31 + .../main/display/lvgl_display/lvgl_image.cc | 64 + .../main/display/lvgl_display/lvgl_image.h | 53 + .../main/display/lvgl_display/lvgl_theme.cc | 30 + .../main/display/lvgl_display/lvgl_theme.h | 94 + frontend/main/display/oled_display.cc | 408 ++ frontend/main/display/oled_display.h | 41 + frontend/main/idf_component.yml | 126 + frontend/main/led/circular_strip.cc | 245 ++ frontend/main/led/circular_strip.h | 52 + frontend/main/led/gpio_led.cc | 263 ++ frontend/main/led/gpio_led.h | 49 + frontend/main/led/led.h | 17 + frontend/main/led/single_led.cc | 167 + frontend/main/led/single_led.h | 38 + frontend/main/main.cc | 29 + frontend/main/mcp_server.cc | 563 +++ frontend/main/mcp_server.h | 344 ++ frontend/main/ota.cc | 492 +++ frontend/main/ota.h | 58 + frontend/main/protocols/mqtt_protocol.cc | 389 ++ frontend/main/protocols/mqtt_protocol.h | 65 + frontend/main/protocols/protocol.cc | 90 + frontend/main/protocols/protocol.h | 98 + frontend/main/protocols/websocket_protocol.cc | 254 ++ frontend/main/protocols/websocket_protocol.h | 34 + frontend/main/settings.cc | 108 + frontend/main/settings.h | 28 + frontend/main/system_info.cc | 156 + frontend/main/system_info.h | 23 + frontend/partitions/v1/16m.csv | 8 + .../partitions/v1/16m_custom_wakeword.csv | 8 + frontend/partitions/v1/16m_echoear.csv | 9 + frontend/partitions/v1/32m.csv | 10 + frontend/partitions/v1/4m.csv | 7 + frontend/partitions/v1/4m_esp-hi.csv | 8 + frontend/partitions/v1/8m.csv | 8 + frontend/partitions/v2/16m.csv | 8 + frontend/partitions/v2/16m_c3.csv | 8 + frontend/partitions/v2/32m.csv | 9 + frontend/partitions/v2/4m.csv | 7 + frontend/partitions/v2/8m.csv | 8 + frontend/partitions/v2/README.md | 107 + frontend/scripts/Image_Converter/LVGLImage.py | 1426 +++++++ frontend/scripts/Image_Converter/README.md | 45 + .../scripts/Image_Converter/lvgl_tools_gui.py | 253 ++ .../scripts/Image_Converter/requirements.txt | 3 + frontend/scripts/acoustic_check/demod.py | 280 ++ frontend/scripts/acoustic_check/graphic.py | 444 +++ frontend/scripts/acoustic_check/main.py | 18 + frontend/scripts/acoustic_check/readme.md | 23 + .../scripts/acoustic_check/requirements.txt | 4 + frontend/scripts/audio_debug_server.py | 54 + frontend/scripts/build_default_assets.py | 934 +++++ frontend/scripts/download_github_runs.py | 294 ++ frontend/scripts/gen_lang.py | 187 + frontend/scripts/mp3_to_ogg.sh | 3 + frontend/scripts/ogg_converter/README.md | 36 + .../ogg_converter/xiaozhi_ogg_converter.py | 230 ++ frontend/scripts/p3_tools/README.md | 95 + .../scripts/p3_tools/batch_convert_gui.py | 221 ++ .../scripts/p3_tools/convert_audio_to_p3.py | 62 + .../scripts/p3_tools/convert_p3_to_audio.py | 51 + frontend/scripts/p3_tools/img/img.png | Bin 0 -> 144945 bytes frontend/scripts/p3_tools/p3_gui_player.py | 241 ++ frontend/scripts/p3_tools/play_p3.py | 71 + frontend/scripts/p3_tools/requirements.txt | 7 + frontend/scripts/release.py | 456 +++ frontend/scripts/sonic_wifi_config.html | 208 ++ frontend/scripts/spiffs_assets/README.md | 110 + frontend/scripts/spiffs_assets/build.py | 400 ++ frontend/scripts/spiffs_assets/build_all.py | 148 + frontend/scripts/spiffs_assets/pack_model.py | 123 + .../spiffs_assets/spiffs_assets_gen.py | 647 ++++ frontend/scripts/versions.py | 250 ++ frontend/sdkconfig.defaults | 78 + frontend/sdkconfig.defaults.esp32 | 6 + frontend/sdkconfig.defaults.esp32c3 | 15 + frontend/sdkconfig.defaults.esp32c5 | 14 + frontend/sdkconfig.defaults.esp32c6 | 5 + frontend/sdkconfig.defaults.esp32p4 | 31 + frontend/sdkconfig.defaults.esp32s3 | 31 + 1483 files changed, 115287 insertions(+) create mode 100644 frontend/.clang-format create mode 100644 frontend/.github/ISSUE_TEMPLATE/01_build_install_bug.yml create mode 100644 frontend/.github/ISSUE_TEMPLATE/02_runtime_bug.yml create mode 100644 frontend/.github/ISSUE_TEMPLATE/03_feature_request.yml create mode 100644 frontend/.github/ISSUE_TEMPLATE/config.yml create mode 100644 frontend/.github/workflows/build.yml create mode 100644 frontend/.gitignore create mode 100755 frontend/CMakeLists.txt create mode 100644 frontend/LICENSE create mode 100644 frontend/README.md create mode 100644 frontend/README_ja.md create mode 100644 frontend/README_zh.md create mode 100644 frontend/docs/blufi.md create mode 100644 frontend/docs/code_style.md create mode 100644 frontend/docs/custom-board.md create mode 100644 frontend/docs/mcp-based-graph.jpg create mode 100644 frontend/docs/mcp-protocol.md create mode 100644 frontend/docs/mcp-usage.md create mode 100644 frontend/docs/mqtt-udp.md create mode 100644 frontend/docs/v0/AtomMatrix-echo-base.jpg create mode 100644 frontend/docs/v0/ESP32-BreadBoard.jpg create mode 100755 frontend/docs/v0/atoms3r-echo-base.jpg create mode 100644 frontend/docs/v0/esp32s3-box3.jpg create mode 100644 frontend/docs/v0/lichuang-s3.jpg create mode 100644 frontend/docs/v0/m5stack-cores3.jpg create mode 100644 frontend/docs/v0/magiclick-2p4.jpg create mode 100644 frontend/docs/v0/waveshare-esp32-s3-touch-amoled-1.8.jpg create mode 100644 frontend/docs/v0/wiring.jpg create mode 100644 frontend/docs/v1/atoms3r.jpg create mode 100644 frontend/docs/v1/electron-bot.png create mode 100644 frontend/docs/v1/esp-hi.jpg create mode 100644 frontend/docs/v1/esp-sparkbot.jpg create mode 100644 frontend/docs/v1/espbox3.jpg create mode 100644 frontend/docs/v1/lichuang-s3.jpg create mode 100644 frontend/docs/v1/lilygo-t-circle-s3.jpg create mode 100644 frontend/docs/v1/m5cores3.jpg create mode 100644 frontend/docs/v1/magiclick.jpg create mode 100755 frontend/docs/v1/movecall-cuican-esp32s3.jpg create mode 100644 frontend/docs/v1/movecall-moji-esp32s3.jpg create mode 100644 frontend/docs/v1/otto-robot.png create mode 100644 frontend/docs/v1/sensecap_watcher.jpg create mode 100644 frontend/docs/v1/waveshare.jpg create mode 100644 frontend/docs/v1/wiring2.jpg create mode 100644 frontend/docs/v1/wmnologo_xingzhi_0.96.jpg create mode 100644 frontend/docs/v1/wmnologo_xingzhi_1.54.jpg create mode 100644 frontend/docs/v1/xmini-c3.jpg create mode 100644 frontend/docs/websocket.md create mode 100644 frontend/main/CMakeLists.txt create mode 100644 frontend/main/Kconfig.projbuild create mode 100644 frontend/main/application.cc create mode 100644 frontend/main/application.h create mode 100644 frontend/main/assets.cc create mode 100644 frontend/main/assets.h create mode 100644 frontend/main/assets/common/exclamation.ogg create mode 100644 frontend/main/assets/common/low_battery.ogg create mode 100644 frontend/main/assets/common/popup.ogg create mode 100644 frontend/main/assets/common/success.ogg create mode 100644 frontend/main/assets/common/vibration.ogg create mode 100644 frontend/main/assets/locales/ar-SA/0.ogg create mode 100644 frontend/main/assets/locales/ar-SA/1.ogg create mode 100644 frontend/main/assets/locales/ar-SA/2.ogg create mode 100644 frontend/main/assets/locales/ar-SA/3.ogg create mode 100644 frontend/main/assets/locales/ar-SA/4.ogg create mode 100644 frontend/main/assets/locales/ar-SA/5.ogg create mode 100644 frontend/main/assets/locales/ar-SA/6.ogg create mode 100644 frontend/main/assets/locales/ar-SA/7.ogg create mode 100644 frontend/main/assets/locales/ar-SA/8.ogg create mode 100644 frontend/main/assets/locales/ar-SA/9.ogg create mode 100644 frontend/main/assets/locales/ar-SA/activation.ogg create mode 100644 frontend/main/assets/locales/ar-SA/err_pin.ogg create mode 100644 frontend/main/assets/locales/ar-SA/err_reg.ogg create mode 100644 frontend/main/assets/locales/ar-SA/language.json create mode 100644 frontend/main/assets/locales/ar-SA/upgrade.ogg create mode 100644 frontend/main/assets/locales/ar-SA/welcome.ogg create mode 100644 frontend/main/assets/locales/ar-SA/wificonfig.ogg create mode 100644 frontend/main/assets/locales/bg-BG/0.ogg create mode 100644 frontend/main/assets/locales/bg-BG/1.ogg create mode 100644 frontend/main/assets/locales/bg-BG/2.ogg create mode 100644 frontend/main/assets/locales/bg-BG/3.ogg create mode 100644 frontend/main/assets/locales/bg-BG/4.ogg create mode 100644 frontend/main/assets/locales/bg-BG/5.ogg create mode 100644 frontend/main/assets/locales/bg-BG/6.ogg create mode 100644 frontend/main/assets/locales/bg-BG/7.ogg create mode 100644 frontend/main/assets/locales/bg-BG/8.ogg create mode 100644 frontend/main/assets/locales/bg-BG/9.ogg create mode 100644 frontend/main/assets/locales/bg-BG/activation.ogg create mode 100644 frontend/main/assets/locales/bg-BG/err_pin.ogg create mode 100644 frontend/main/assets/locales/bg-BG/err_reg.ogg create mode 100644 frontend/main/assets/locales/bg-BG/language.json create mode 100644 frontend/main/assets/locales/bg-BG/upgrade.ogg create mode 100644 frontend/main/assets/locales/bg-BG/welcome.ogg create mode 100644 frontend/main/assets/locales/bg-BG/wificonfig.ogg create mode 100644 frontend/main/assets/locales/ca-ES/0.ogg create mode 100644 frontend/main/assets/locales/ca-ES/1.ogg create mode 100644 frontend/main/assets/locales/ca-ES/2.ogg create mode 100644 frontend/main/assets/locales/ca-ES/3.ogg create mode 100644 frontend/main/assets/locales/ca-ES/4.ogg create mode 100644 frontend/main/assets/locales/ca-ES/5.ogg create mode 100644 frontend/main/assets/locales/ca-ES/6.ogg create mode 100644 frontend/main/assets/locales/ca-ES/7.ogg create mode 100644 frontend/main/assets/locales/ca-ES/8.ogg create mode 100644 frontend/main/assets/locales/ca-ES/9.ogg create mode 100644 frontend/main/assets/locales/ca-ES/activation.ogg create mode 100644 frontend/main/assets/locales/ca-ES/err_pin.ogg create mode 100644 frontend/main/assets/locales/ca-ES/err_reg.ogg create mode 100644 frontend/main/assets/locales/ca-ES/language.json create mode 100644 frontend/main/assets/locales/ca-ES/upgrade.ogg create mode 100644 frontend/main/assets/locales/ca-ES/welcome.ogg create mode 100644 frontend/main/assets/locales/ca-ES/wificonfig.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/0.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/1.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/2.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/3.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/4.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/5.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/6.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/7.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/8.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/9.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/activation.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/err_pin.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/err_reg.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/language.json create mode 100644 frontend/main/assets/locales/cs-CZ/upgrade.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/welcome.ogg create mode 100644 frontend/main/assets/locales/cs-CZ/wificonfig.ogg create mode 100644 frontend/main/assets/locales/da-DK/0.ogg create mode 100644 frontend/main/assets/locales/da-DK/1.ogg create mode 100644 frontend/main/assets/locales/da-DK/2.ogg create mode 100644 frontend/main/assets/locales/da-DK/3.ogg create mode 100644 frontend/main/assets/locales/da-DK/4.ogg create mode 100644 frontend/main/assets/locales/da-DK/5.ogg create mode 100644 frontend/main/assets/locales/da-DK/6.ogg create mode 100644 frontend/main/assets/locales/da-DK/7.ogg create mode 100644 frontend/main/assets/locales/da-DK/8.ogg create mode 100644 frontend/main/assets/locales/da-DK/9.ogg create mode 100644 frontend/main/assets/locales/da-DK/activation.ogg create mode 100644 frontend/main/assets/locales/da-DK/err_pin.ogg create mode 100644 frontend/main/assets/locales/da-DK/err_reg.ogg create mode 100644 frontend/main/assets/locales/da-DK/language.json create mode 100644 frontend/main/assets/locales/da-DK/upgrade.ogg create mode 100644 frontend/main/assets/locales/da-DK/welcome.ogg create mode 100644 frontend/main/assets/locales/da-DK/wificonfig.ogg create mode 100644 frontend/main/assets/locales/de-DE/0.ogg create mode 100644 frontend/main/assets/locales/de-DE/1.ogg create mode 100644 frontend/main/assets/locales/de-DE/2.ogg create mode 100644 frontend/main/assets/locales/de-DE/3.ogg create mode 100644 frontend/main/assets/locales/de-DE/4.ogg create mode 100644 frontend/main/assets/locales/de-DE/5.ogg create mode 100644 frontend/main/assets/locales/de-DE/6.ogg create mode 100644 frontend/main/assets/locales/de-DE/7.ogg create mode 100644 frontend/main/assets/locales/de-DE/8.ogg create mode 100644 frontend/main/assets/locales/de-DE/9.ogg create mode 100644 frontend/main/assets/locales/de-DE/activation.ogg create mode 100644 frontend/main/assets/locales/de-DE/err_pin.ogg create mode 100644 frontend/main/assets/locales/de-DE/err_reg.ogg create mode 100644 frontend/main/assets/locales/de-DE/language.json create mode 100644 frontend/main/assets/locales/de-DE/upgrade.ogg create mode 100644 frontend/main/assets/locales/de-DE/welcome.ogg create mode 100644 frontend/main/assets/locales/de-DE/wificonfig.ogg create mode 100644 frontend/main/assets/locales/el-GR/0.ogg create mode 100644 frontend/main/assets/locales/el-GR/1.ogg create mode 100644 frontend/main/assets/locales/el-GR/2.ogg create mode 100644 frontend/main/assets/locales/el-GR/3.ogg create mode 100644 frontend/main/assets/locales/el-GR/4.ogg create mode 100644 frontend/main/assets/locales/el-GR/5.ogg create mode 100644 frontend/main/assets/locales/el-GR/6.ogg create mode 100644 frontend/main/assets/locales/el-GR/7.ogg create mode 100644 frontend/main/assets/locales/el-GR/8.ogg create mode 100644 frontend/main/assets/locales/el-GR/9.ogg create mode 100644 frontend/main/assets/locales/el-GR/activation.ogg create mode 100644 frontend/main/assets/locales/el-GR/err_pin.ogg create mode 100644 frontend/main/assets/locales/el-GR/err_reg.ogg create mode 100644 frontend/main/assets/locales/el-GR/language.json create mode 100644 frontend/main/assets/locales/el-GR/upgrade.ogg create mode 100644 frontend/main/assets/locales/el-GR/welcome.ogg create mode 100644 frontend/main/assets/locales/el-GR/wificonfig.ogg create mode 100644 frontend/main/assets/locales/en-US/0.ogg create mode 100644 frontend/main/assets/locales/en-US/1.ogg create mode 100644 frontend/main/assets/locales/en-US/2.ogg create mode 100644 frontend/main/assets/locales/en-US/3.ogg create mode 100644 frontend/main/assets/locales/en-US/4.ogg create mode 100644 frontend/main/assets/locales/en-US/5.ogg create mode 100644 frontend/main/assets/locales/en-US/6.ogg create mode 100644 frontend/main/assets/locales/en-US/7.ogg create mode 100644 frontend/main/assets/locales/en-US/8.ogg create mode 100644 frontend/main/assets/locales/en-US/9.ogg create mode 100644 frontend/main/assets/locales/en-US/activation.ogg create mode 100644 frontend/main/assets/locales/en-US/err_pin.ogg create mode 100644 frontend/main/assets/locales/en-US/err_reg.ogg create mode 100644 frontend/main/assets/locales/en-US/language.json create mode 100644 frontend/main/assets/locales/en-US/upgrade.ogg create mode 100644 frontend/main/assets/locales/en-US/welcome.ogg create mode 100644 frontend/main/assets/locales/en-US/wificonfig.ogg create mode 100644 frontend/main/assets/locales/es-ES/0.ogg create mode 100644 frontend/main/assets/locales/es-ES/1.ogg create mode 100644 frontend/main/assets/locales/es-ES/2.ogg create mode 100644 frontend/main/assets/locales/es-ES/3.ogg create mode 100644 frontend/main/assets/locales/es-ES/4.ogg create mode 100644 frontend/main/assets/locales/es-ES/5.ogg create mode 100644 frontend/main/assets/locales/es-ES/6.ogg create mode 100644 frontend/main/assets/locales/es-ES/7.ogg create mode 100644 frontend/main/assets/locales/es-ES/8.ogg create mode 100644 frontend/main/assets/locales/es-ES/9.ogg create mode 100644 frontend/main/assets/locales/es-ES/activation.ogg create mode 100644 frontend/main/assets/locales/es-ES/err_pin.ogg create mode 100644 frontend/main/assets/locales/es-ES/err_reg.ogg create mode 100644 frontend/main/assets/locales/es-ES/language.json create mode 100644 frontend/main/assets/locales/es-ES/upgrade.ogg create mode 100644 frontend/main/assets/locales/es-ES/welcome.ogg create mode 100644 frontend/main/assets/locales/es-ES/wificonfig.ogg create mode 100644 frontend/main/assets/locales/fa-IR/0.ogg create mode 100644 frontend/main/assets/locales/fa-IR/1.ogg create mode 100644 frontend/main/assets/locales/fa-IR/2.ogg create mode 100644 frontend/main/assets/locales/fa-IR/3.ogg create mode 100644 frontend/main/assets/locales/fa-IR/4.ogg create mode 100644 frontend/main/assets/locales/fa-IR/5.ogg create mode 100644 frontend/main/assets/locales/fa-IR/6.ogg create mode 100644 frontend/main/assets/locales/fa-IR/7.ogg create mode 100644 frontend/main/assets/locales/fa-IR/8.ogg create mode 100644 frontend/main/assets/locales/fa-IR/9.ogg create mode 100644 frontend/main/assets/locales/fa-IR/activation.ogg create mode 100644 frontend/main/assets/locales/fa-IR/err_pin.ogg create mode 100644 frontend/main/assets/locales/fa-IR/err_reg.ogg create mode 100644 frontend/main/assets/locales/fa-IR/language.json create mode 100644 frontend/main/assets/locales/fa-IR/upgrade.ogg create mode 100644 frontend/main/assets/locales/fa-IR/welcome.ogg create mode 100644 frontend/main/assets/locales/fa-IR/wificonfig.ogg create mode 100644 frontend/main/assets/locales/fi-FI/0.ogg create mode 100644 frontend/main/assets/locales/fi-FI/1.ogg create mode 100644 frontend/main/assets/locales/fi-FI/2.ogg create mode 100644 frontend/main/assets/locales/fi-FI/3.ogg create mode 100644 frontend/main/assets/locales/fi-FI/4.ogg create mode 100644 frontend/main/assets/locales/fi-FI/5.ogg create mode 100644 frontend/main/assets/locales/fi-FI/6.ogg create mode 100644 frontend/main/assets/locales/fi-FI/7.ogg create mode 100644 frontend/main/assets/locales/fi-FI/8.ogg create mode 100644 frontend/main/assets/locales/fi-FI/9.ogg create mode 100644 frontend/main/assets/locales/fi-FI/activation.ogg create mode 100644 frontend/main/assets/locales/fi-FI/err_pin.ogg create mode 100644 frontend/main/assets/locales/fi-FI/err_reg.ogg create mode 100644 frontend/main/assets/locales/fi-FI/language.json create mode 100644 frontend/main/assets/locales/fi-FI/upgrade.ogg create mode 100644 frontend/main/assets/locales/fi-FI/welcome.ogg create mode 100644 frontend/main/assets/locales/fi-FI/wificonfig.ogg create mode 100644 frontend/main/assets/locales/fil-PH/0.ogg create mode 100644 frontend/main/assets/locales/fil-PH/1.ogg create mode 100644 frontend/main/assets/locales/fil-PH/2.ogg create mode 100644 frontend/main/assets/locales/fil-PH/3.ogg create mode 100644 frontend/main/assets/locales/fil-PH/4.ogg create mode 100644 frontend/main/assets/locales/fil-PH/5.ogg create mode 100644 frontend/main/assets/locales/fil-PH/6.ogg create mode 100644 frontend/main/assets/locales/fil-PH/7.ogg create mode 100644 frontend/main/assets/locales/fil-PH/8.ogg create mode 100644 frontend/main/assets/locales/fil-PH/9.ogg create mode 100644 frontend/main/assets/locales/fil-PH/activation.ogg create mode 100644 frontend/main/assets/locales/fil-PH/err_pin.ogg create mode 100644 frontend/main/assets/locales/fil-PH/err_reg.ogg create mode 100644 frontend/main/assets/locales/fil-PH/language.json create mode 100644 frontend/main/assets/locales/fil-PH/upgrade.ogg create mode 100644 frontend/main/assets/locales/fil-PH/welcome.ogg create mode 100644 frontend/main/assets/locales/fil-PH/wificonfig.ogg create mode 100644 frontend/main/assets/locales/fr-FR/0.ogg create mode 100644 frontend/main/assets/locales/fr-FR/1.ogg create mode 100644 frontend/main/assets/locales/fr-FR/2.ogg create mode 100644 frontend/main/assets/locales/fr-FR/3.ogg create mode 100644 frontend/main/assets/locales/fr-FR/4.ogg create mode 100644 frontend/main/assets/locales/fr-FR/5.ogg create mode 100644 frontend/main/assets/locales/fr-FR/6.ogg create mode 100644 frontend/main/assets/locales/fr-FR/7.ogg create mode 100644 frontend/main/assets/locales/fr-FR/8.ogg create mode 100644 frontend/main/assets/locales/fr-FR/9.ogg create mode 100644 frontend/main/assets/locales/fr-FR/activation.ogg create mode 100644 frontend/main/assets/locales/fr-FR/err_pin.ogg create mode 100644 frontend/main/assets/locales/fr-FR/err_reg.ogg create mode 100644 frontend/main/assets/locales/fr-FR/language.json create mode 100644 frontend/main/assets/locales/fr-FR/upgrade.ogg create mode 100644 frontend/main/assets/locales/fr-FR/welcome.ogg create mode 100644 frontend/main/assets/locales/fr-FR/wificonfig.ogg create mode 100644 frontend/main/assets/locales/he-IL/0.ogg create mode 100644 frontend/main/assets/locales/he-IL/1.ogg create mode 100644 frontend/main/assets/locales/he-IL/2.ogg create mode 100644 frontend/main/assets/locales/he-IL/3.ogg create mode 100644 frontend/main/assets/locales/he-IL/4.ogg create mode 100644 frontend/main/assets/locales/he-IL/5.ogg create mode 100644 frontend/main/assets/locales/he-IL/6.ogg create mode 100644 frontend/main/assets/locales/he-IL/7.ogg create mode 100644 frontend/main/assets/locales/he-IL/8.ogg create mode 100644 frontend/main/assets/locales/he-IL/9.ogg create mode 100644 frontend/main/assets/locales/he-IL/activation.ogg create mode 100644 frontend/main/assets/locales/he-IL/err_pin.ogg create mode 100644 frontend/main/assets/locales/he-IL/err_reg.ogg create mode 100644 frontend/main/assets/locales/he-IL/language.json create mode 100644 frontend/main/assets/locales/he-IL/upgrade.ogg create mode 100644 frontend/main/assets/locales/he-IL/welcome.ogg create mode 100644 frontend/main/assets/locales/he-IL/wificonfig.ogg create mode 100644 frontend/main/assets/locales/hi-IN/0.ogg create mode 100644 frontend/main/assets/locales/hi-IN/1.ogg create mode 100644 frontend/main/assets/locales/hi-IN/2.ogg create mode 100644 frontend/main/assets/locales/hi-IN/3.ogg create mode 100644 frontend/main/assets/locales/hi-IN/4.ogg create mode 100644 frontend/main/assets/locales/hi-IN/5.ogg create mode 100644 frontend/main/assets/locales/hi-IN/6.ogg create mode 100644 frontend/main/assets/locales/hi-IN/7.ogg create mode 100644 frontend/main/assets/locales/hi-IN/8.ogg create mode 100644 frontend/main/assets/locales/hi-IN/9.ogg create mode 100644 frontend/main/assets/locales/hi-IN/activation.ogg create mode 100644 frontend/main/assets/locales/hi-IN/err_pin.ogg create mode 100644 frontend/main/assets/locales/hi-IN/err_reg.ogg create mode 100644 frontend/main/assets/locales/hi-IN/language.json create mode 100644 frontend/main/assets/locales/hi-IN/upgrade.ogg create mode 100644 frontend/main/assets/locales/hi-IN/welcome.ogg create mode 100644 frontend/main/assets/locales/hi-IN/wificonfig.ogg create mode 100644 frontend/main/assets/locales/hr-HR/0.ogg create mode 100644 frontend/main/assets/locales/hr-HR/1.ogg create mode 100644 frontend/main/assets/locales/hr-HR/2.ogg create mode 100644 frontend/main/assets/locales/hr-HR/3.ogg create mode 100644 frontend/main/assets/locales/hr-HR/4.ogg create mode 100644 frontend/main/assets/locales/hr-HR/5.ogg create mode 100644 frontend/main/assets/locales/hr-HR/6.ogg create mode 100644 frontend/main/assets/locales/hr-HR/7.ogg create mode 100644 frontend/main/assets/locales/hr-HR/8.ogg create mode 100644 frontend/main/assets/locales/hr-HR/9.ogg create mode 100644 frontend/main/assets/locales/hr-HR/activation.ogg create mode 100644 frontend/main/assets/locales/hr-HR/err_pin.ogg create mode 100644 frontend/main/assets/locales/hr-HR/err_reg.ogg create mode 100644 frontend/main/assets/locales/hr-HR/language.json create mode 100644 frontend/main/assets/locales/hr-HR/upgrade.ogg create mode 100644 frontend/main/assets/locales/hr-HR/welcome.ogg create mode 100644 frontend/main/assets/locales/hr-HR/wificonfig.ogg create mode 100644 frontend/main/assets/locales/hu-HU/0.ogg create mode 100644 frontend/main/assets/locales/hu-HU/1.ogg create mode 100644 frontend/main/assets/locales/hu-HU/2.ogg create mode 100644 frontend/main/assets/locales/hu-HU/3.ogg create mode 100644 frontend/main/assets/locales/hu-HU/4.ogg create mode 100644 frontend/main/assets/locales/hu-HU/5.ogg create mode 100644 frontend/main/assets/locales/hu-HU/6.ogg create mode 100644 frontend/main/assets/locales/hu-HU/7.ogg create mode 100644 frontend/main/assets/locales/hu-HU/8.ogg create mode 100644 frontend/main/assets/locales/hu-HU/9.ogg create mode 100644 frontend/main/assets/locales/hu-HU/activation.ogg create mode 100644 frontend/main/assets/locales/hu-HU/err_pin.ogg create mode 100644 frontend/main/assets/locales/hu-HU/err_reg.ogg create mode 100644 frontend/main/assets/locales/hu-HU/language.json create mode 100644 frontend/main/assets/locales/hu-HU/upgrade.ogg create mode 100644 frontend/main/assets/locales/hu-HU/welcome.ogg create mode 100644 frontend/main/assets/locales/hu-HU/wificonfig.ogg create mode 100644 frontend/main/assets/locales/id-ID/0.ogg create mode 100644 frontend/main/assets/locales/id-ID/1.ogg create mode 100644 frontend/main/assets/locales/id-ID/2.ogg create mode 100644 frontend/main/assets/locales/id-ID/3.ogg create mode 100644 frontend/main/assets/locales/id-ID/4.ogg create mode 100644 frontend/main/assets/locales/id-ID/5.ogg create mode 100644 frontend/main/assets/locales/id-ID/6.ogg create mode 100644 frontend/main/assets/locales/id-ID/7.ogg create mode 100644 frontend/main/assets/locales/id-ID/8.ogg create mode 100644 frontend/main/assets/locales/id-ID/9.ogg create mode 100644 frontend/main/assets/locales/id-ID/activation.ogg create mode 100644 frontend/main/assets/locales/id-ID/err_pin.ogg create mode 100644 frontend/main/assets/locales/id-ID/err_reg.ogg create mode 100644 frontend/main/assets/locales/id-ID/language.json create mode 100644 frontend/main/assets/locales/id-ID/upgrade.ogg create mode 100644 frontend/main/assets/locales/id-ID/welcome.ogg create mode 100644 frontend/main/assets/locales/id-ID/wificonfig.ogg create mode 100644 frontend/main/assets/locales/it-IT/0.ogg create mode 100644 frontend/main/assets/locales/it-IT/1.ogg create mode 100644 frontend/main/assets/locales/it-IT/2.ogg create mode 100644 frontend/main/assets/locales/it-IT/3.ogg create mode 100644 frontend/main/assets/locales/it-IT/4.ogg create mode 100644 frontend/main/assets/locales/it-IT/5.ogg create mode 100644 frontend/main/assets/locales/it-IT/6.ogg create mode 100644 frontend/main/assets/locales/it-IT/7.ogg create mode 100644 frontend/main/assets/locales/it-IT/8.ogg create mode 100644 frontend/main/assets/locales/it-IT/9.ogg create mode 100644 frontend/main/assets/locales/it-IT/activation.ogg create mode 100644 frontend/main/assets/locales/it-IT/err_pin.ogg create mode 100644 frontend/main/assets/locales/it-IT/err_reg.ogg create mode 100644 frontend/main/assets/locales/it-IT/language.json create mode 100644 frontend/main/assets/locales/it-IT/upgrade.ogg create mode 100644 frontend/main/assets/locales/it-IT/welcome.ogg create mode 100644 frontend/main/assets/locales/it-IT/wificonfig.ogg create mode 100644 frontend/main/assets/locales/ja-JP/0.ogg create mode 100644 frontend/main/assets/locales/ja-JP/1.ogg create mode 100644 frontend/main/assets/locales/ja-JP/2.ogg create mode 100644 frontend/main/assets/locales/ja-JP/3.ogg create mode 100644 frontend/main/assets/locales/ja-JP/4.ogg create mode 100644 frontend/main/assets/locales/ja-JP/5.ogg create mode 100644 frontend/main/assets/locales/ja-JP/6.ogg create mode 100644 frontend/main/assets/locales/ja-JP/7.ogg create mode 100644 frontend/main/assets/locales/ja-JP/8.ogg create mode 100644 frontend/main/assets/locales/ja-JP/9.ogg create mode 100644 frontend/main/assets/locales/ja-JP/activation.ogg create mode 100644 frontend/main/assets/locales/ja-JP/err_pin.ogg create mode 100644 frontend/main/assets/locales/ja-JP/err_reg.ogg create mode 100644 frontend/main/assets/locales/ja-JP/language.json create mode 100644 frontend/main/assets/locales/ja-JP/upgrade.ogg create mode 100644 frontend/main/assets/locales/ja-JP/welcome.ogg create mode 100644 frontend/main/assets/locales/ja-JP/wificonfig.ogg create mode 100644 frontend/main/assets/locales/ko-KR/0.ogg create mode 100644 frontend/main/assets/locales/ko-KR/1.ogg create mode 100644 frontend/main/assets/locales/ko-KR/2.ogg create mode 100644 frontend/main/assets/locales/ko-KR/3.ogg create mode 100644 frontend/main/assets/locales/ko-KR/4.ogg create mode 100644 frontend/main/assets/locales/ko-KR/5.ogg create mode 100644 frontend/main/assets/locales/ko-KR/6.ogg create mode 100644 frontend/main/assets/locales/ko-KR/7.ogg create mode 100644 frontend/main/assets/locales/ko-KR/8.ogg create mode 100644 frontend/main/assets/locales/ko-KR/9.ogg create mode 100644 frontend/main/assets/locales/ko-KR/activation.ogg create mode 100644 frontend/main/assets/locales/ko-KR/err_pin.ogg create mode 100644 frontend/main/assets/locales/ko-KR/err_reg.ogg create mode 100644 frontend/main/assets/locales/ko-KR/language.json create mode 100644 frontend/main/assets/locales/ko-KR/upgrade.ogg create mode 100644 frontend/main/assets/locales/ko-KR/welcome.ogg create mode 100644 frontend/main/assets/locales/ko-KR/wificonfig.ogg create mode 100644 frontend/main/assets/locales/ms-MY/0.ogg create mode 100644 frontend/main/assets/locales/ms-MY/1.ogg create mode 100644 frontend/main/assets/locales/ms-MY/2.ogg create mode 100644 frontend/main/assets/locales/ms-MY/3.ogg create mode 100644 frontend/main/assets/locales/ms-MY/4.ogg create mode 100644 frontend/main/assets/locales/ms-MY/5.ogg create mode 100644 frontend/main/assets/locales/ms-MY/6.ogg create mode 100644 frontend/main/assets/locales/ms-MY/7.ogg create mode 100644 frontend/main/assets/locales/ms-MY/8.ogg create mode 100644 frontend/main/assets/locales/ms-MY/9.ogg create mode 100644 frontend/main/assets/locales/ms-MY/activation.ogg create mode 100644 frontend/main/assets/locales/ms-MY/err_pin.ogg create mode 100644 frontend/main/assets/locales/ms-MY/err_reg.ogg create mode 100644 frontend/main/assets/locales/ms-MY/language.json create mode 100644 frontend/main/assets/locales/ms-MY/upgrade.ogg create mode 100644 frontend/main/assets/locales/ms-MY/welcome.ogg create mode 100644 frontend/main/assets/locales/ms-MY/wificonfig.ogg create mode 100644 frontend/main/assets/locales/nb-NO/0.ogg create mode 100644 frontend/main/assets/locales/nb-NO/1.ogg create mode 100644 frontend/main/assets/locales/nb-NO/2.ogg create mode 100644 frontend/main/assets/locales/nb-NO/3.ogg create mode 100644 frontend/main/assets/locales/nb-NO/4.ogg create mode 100644 frontend/main/assets/locales/nb-NO/5.ogg create mode 100644 frontend/main/assets/locales/nb-NO/6.ogg create mode 100644 frontend/main/assets/locales/nb-NO/7.ogg create mode 100644 frontend/main/assets/locales/nb-NO/8.ogg create mode 100644 frontend/main/assets/locales/nb-NO/9.ogg create mode 100644 frontend/main/assets/locales/nb-NO/activation.ogg create mode 100644 frontend/main/assets/locales/nb-NO/err_pin.ogg create mode 100644 frontend/main/assets/locales/nb-NO/err_reg.ogg create mode 100644 frontend/main/assets/locales/nb-NO/language.json create mode 100644 frontend/main/assets/locales/nb-NO/upgrade.ogg create mode 100644 frontend/main/assets/locales/nb-NO/welcome.ogg create mode 100644 frontend/main/assets/locales/nb-NO/wificonfig.ogg create mode 100644 frontend/main/assets/locales/nl-NL/0.ogg create mode 100644 frontend/main/assets/locales/nl-NL/1.ogg create mode 100644 frontend/main/assets/locales/nl-NL/2.ogg create mode 100644 frontend/main/assets/locales/nl-NL/3.ogg create mode 100644 frontend/main/assets/locales/nl-NL/4.ogg create mode 100644 frontend/main/assets/locales/nl-NL/5.ogg create mode 100644 frontend/main/assets/locales/nl-NL/6.ogg create mode 100644 frontend/main/assets/locales/nl-NL/7.ogg create mode 100644 frontend/main/assets/locales/nl-NL/8.ogg create mode 100644 frontend/main/assets/locales/nl-NL/9.ogg create mode 100644 frontend/main/assets/locales/nl-NL/activation.ogg create mode 100644 frontend/main/assets/locales/nl-NL/err_pin.ogg create mode 100644 frontend/main/assets/locales/nl-NL/err_reg.ogg create mode 100644 frontend/main/assets/locales/nl-NL/language.json create mode 100644 frontend/main/assets/locales/nl-NL/upgrade.ogg create mode 100644 frontend/main/assets/locales/nl-NL/welcome.ogg create mode 100644 frontend/main/assets/locales/nl-NL/wificonfig.ogg create mode 100644 frontend/main/assets/locales/pl-PL/0.ogg create mode 100644 frontend/main/assets/locales/pl-PL/1.ogg create mode 100644 frontend/main/assets/locales/pl-PL/2.ogg create mode 100644 frontend/main/assets/locales/pl-PL/3.ogg create mode 100644 frontend/main/assets/locales/pl-PL/4.ogg create mode 100644 frontend/main/assets/locales/pl-PL/5.ogg create mode 100644 frontend/main/assets/locales/pl-PL/6.ogg create mode 100644 frontend/main/assets/locales/pl-PL/7.ogg create mode 100644 frontend/main/assets/locales/pl-PL/8.ogg create mode 100644 frontend/main/assets/locales/pl-PL/9.ogg create mode 100644 frontend/main/assets/locales/pl-PL/activation.ogg create mode 100644 frontend/main/assets/locales/pl-PL/err_pin.ogg create mode 100644 frontend/main/assets/locales/pl-PL/err_reg.ogg create mode 100644 frontend/main/assets/locales/pl-PL/language.json create mode 100644 frontend/main/assets/locales/pl-PL/upgrade.ogg create mode 100644 frontend/main/assets/locales/pl-PL/welcome.ogg create mode 100644 frontend/main/assets/locales/pl-PL/wificonfig.ogg create mode 100644 frontend/main/assets/locales/pt-PT/0.ogg create mode 100644 frontend/main/assets/locales/pt-PT/1.ogg create mode 100644 frontend/main/assets/locales/pt-PT/2.ogg create mode 100644 frontend/main/assets/locales/pt-PT/3.ogg create mode 100644 frontend/main/assets/locales/pt-PT/4.ogg create mode 100644 frontend/main/assets/locales/pt-PT/5.ogg create mode 100644 frontend/main/assets/locales/pt-PT/6.ogg create mode 100644 frontend/main/assets/locales/pt-PT/7.ogg create mode 100644 frontend/main/assets/locales/pt-PT/8.ogg create mode 100644 frontend/main/assets/locales/pt-PT/9.ogg create mode 100644 frontend/main/assets/locales/pt-PT/activation.ogg create mode 100644 frontend/main/assets/locales/pt-PT/err_pin.ogg create mode 100644 frontend/main/assets/locales/pt-PT/err_reg.ogg create mode 100644 frontend/main/assets/locales/pt-PT/language.json create mode 100644 frontend/main/assets/locales/pt-PT/upgrade.ogg create mode 100644 frontend/main/assets/locales/pt-PT/welcome.ogg create mode 100644 frontend/main/assets/locales/pt-PT/wificonfig.ogg create mode 100644 frontend/main/assets/locales/ro-RO/0.ogg create mode 100644 frontend/main/assets/locales/ro-RO/1.ogg create mode 100644 frontend/main/assets/locales/ro-RO/2.ogg create mode 100644 frontend/main/assets/locales/ro-RO/3.ogg create mode 100644 frontend/main/assets/locales/ro-RO/4.ogg create mode 100644 frontend/main/assets/locales/ro-RO/5.ogg create mode 100644 frontend/main/assets/locales/ro-RO/6.ogg create mode 100644 frontend/main/assets/locales/ro-RO/7.ogg create mode 100644 frontend/main/assets/locales/ro-RO/8.ogg create mode 100644 frontend/main/assets/locales/ro-RO/9.ogg create mode 100644 frontend/main/assets/locales/ro-RO/activation.ogg create mode 100644 frontend/main/assets/locales/ro-RO/err_pin.ogg create mode 100644 frontend/main/assets/locales/ro-RO/err_reg.ogg create mode 100644 frontend/main/assets/locales/ro-RO/language.json create mode 100644 frontend/main/assets/locales/ro-RO/upgrade.ogg create mode 100644 frontend/main/assets/locales/ro-RO/welcome.ogg create mode 100644 frontend/main/assets/locales/ro-RO/wificonfig.ogg create mode 100644 frontend/main/assets/locales/ru-RU/0.ogg create mode 100644 frontend/main/assets/locales/ru-RU/1.ogg create mode 100644 frontend/main/assets/locales/ru-RU/2.ogg create mode 100644 frontend/main/assets/locales/ru-RU/3.ogg create mode 100644 frontend/main/assets/locales/ru-RU/4.ogg create mode 100644 frontend/main/assets/locales/ru-RU/5.ogg create mode 100644 frontend/main/assets/locales/ru-RU/6.ogg create mode 100644 frontend/main/assets/locales/ru-RU/7.ogg create mode 100644 frontend/main/assets/locales/ru-RU/8.ogg create mode 100644 frontend/main/assets/locales/ru-RU/9.ogg create mode 100644 frontend/main/assets/locales/ru-RU/activation.ogg create mode 100644 frontend/main/assets/locales/ru-RU/err_pin.ogg create mode 100644 frontend/main/assets/locales/ru-RU/err_reg.ogg create mode 100644 frontend/main/assets/locales/ru-RU/language.json create mode 100644 frontend/main/assets/locales/ru-RU/upgrade.ogg create mode 100644 frontend/main/assets/locales/ru-RU/welcome.ogg create mode 100644 frontend/main/assets/locales/ru-RU/wificonfig.ogg create mode 100644 frontend/main/assets/locales/sk-SK/0.ogg create mode 100644 frontend/main/assets/locales/sk-SK/1.ogg create mode 100644 frontend/main/assets/locales/sk-SK/2.ogg create mode 100644 frontend/main/assets/locales/sk-SK/3.ogg create mode 100644 frontend/main/assets/locales/sk-SK/4.ogg create mode 100644 frontend/main/assets/locales/sk-SK/5.ogg create mode 100644 frontend/main/assets/locales/sk-SK/6.ogg create mode 100644 frontend/main/assets/locales/sk-SK/7.ogg create mode 100644 frontend/main/assets/locales/sk-SK/8.ogg create mode 100644 frontend/main/assets/locales/sk-SK/9.ogg create mode 100644 frontend/main/assets/locales/sk-SK/activation.ogg create mode 100644 frontend/main/assets/locales/sk-SK/err_pin.ogg create mode 100644 frontend/main/assets/locales/sk-SK/err_reg.ogg create mode 100644 frontend/main/assets/locales/sk-SK/language.json create mode 100644 frontend/main/assets/locales/sk-SK/upgrade.ogg create mode 100644 frontend/main/assets/locales/sk-SK/welcome.ogg create mode 100644 frontend/main/assets/locales/sk-SK/wificonfig.ogg create mode 100644 frontend/main/assets/locales/sl-SI/0.ogg create mode 100644 frontend/main/assets/locales/sl-SI/1.ogg create mode 100644 frontend/main/assets/locales/sl-SI/2.ogg create mode 100644 frontend/main/assets/locales/sl-SI/3.ogg create mode 100644 frontend/main/assets/locales/sl-SI/4.ogg create mode 100644 frontend/main/assets/locales/sl-SI/5.ogg create mode 100644 frontend/main/assets/locales/sl-SI/6.ogg create mode 100644 frontend/main/assets/locales/sl-SI/7.ogg create mode 100644 frontend/main/assets/locales/sl-SI/8.ogg create mode 100644 frontend/main/assets/locales/sl-SI/9.ogg create mode 100644 frontend/main/assets/locales/sl-SI/activation.ogg create mode 100644 frontend/main/assets/locales/sl-SI/err_pin.ogg create mode 100644 frontend/main/assets/locales/sl-SI/err_reg.ogg create mode 100644 frontend/main/assets/locales/sl-SI/language.json create mode 100644 frontend/main/assets/locales/sl-SI/upgrade.ogg create mode 100644 frontend/main/assets/locales/sl-SI/welcome.ogg create mode 100644 frontend/main/assets/locales/sl-SI/wificonfig.ogg create mode 100644 frontend/main/assets/locales/sr-RS/language.json create mode 100644 frontend/main/assets/locales/sv-SE/0.ogg create mode 100644 frontend/main/assets/locales/sv-SE/1.ogg create mode 100644 frontend/main/assets/locales/sv-SE/2.ogg create mode 100644 frontend/main/assets/locales/sv-SE/3.ogg create mode 100644 frontend/main/assets/locales/sv-SE/4.ogg create mode 100644 frontend/main/assets/locales/sv-SE/5.ogg create mode 100644 frontend/main/assets/locales/sv-SE/6.ogg create mode 100644 frontend/main/assets/locales/sv-SE/7.ogg create mode 100644 frontend/main/assets/locales/sv-SE/8.ogg create mode 100644 frontend/main/assets/locales/sv-SE/9.ogg create mode 100644 frontend/main/assets/locales/sv-SE/activation.ogg create mode 100644 frontend/main/assets/locales/sv-SE/err_pin.ogg create mode 100644 frontend/main/assets/locales/sv-SE/err_reg.ogg create mode 100644 frontend/main/assets/locales/sv-SE/language.json create mode 100644 frontend/main/assets/locales/sv-SE/upgrade.ogg create mode 100644 frontend/main/assets/locales/sv-SE/welcome.ogg create mode 100644 frontend/main/assets/locales/sv-SE/wificonfig.ogg create mode 100644 frontend/main/assets/locales/th-TH/0.ogg create mode 100644 frontend/main/assets/locales/th-TH/1.ogg create mode 100644 frontend/main/assets/locales/th-TH/2.ogg create mode 100644 frontend/main/assets/locales/th-TH/3.ogg create mode 100644 frontend/main/assets/locales/th-TH/4.ogg create mode 100644 frontend/main/assets/locales/th-TH/5.ogg create mode 100644 frontend/main/assets/locales/th-TH/6.ogg create mode 100644 frontend/main/assets/locales/th-TH/7.ogg create mode 100644 frontend/main/assets/locales/th-TH/8.ogg create mode 100644 frontend/main/assets/locales/th-TH/9.ogg create mode 100644 frontend/main/assets/locales/th-TH/activation.ogg create mode 100644 frontend/main/assets/locales/th-TH/err_pin.ogg create mode 100644 frontend/main/assets/locales/th-TH/err_reg.ogg create mode 100644 frontend/main/assets/locales/th-TH/language.json create mode 100644 frontend/main/assets/locales/th-TH/upgrade.ogg create mode 100644 frontend/main/assets/locales/th-TH/welcome.ogg create mode 100644 frontend/main/assets/locales/th-TH/wificonfig.ogg create mode 100644 frontend/main/assets/locales/tr-TR/0.ogg create mode 100644 frontend/main/assets/locales/tr-TR/1.ogg create mode 100644 frontend/main/assets/locales/tr-TR/2.ogg create mode 100644 frontend/main/assets/locales/tr-TR/3.ogg create mode 100644 frontend/main/assets/locales/tr-TR/4.ogg create mode 100644 frontend/main/assets/locales/tr-TR/5.ogg create mode 100644 frontend/main/assets/locales/tr-TR/6.ogg create mode 100644 frontend/main/assets/locales/tr-TR/7.ogg create mode 100644 frontend/main/assets/locales/tr-TR/8.ogg create mode 100644 frontend/main/assets/locales/tr-TR/9.ogg create mode 100644 frontend/main/assets/locales/tr-TR/activation.ogg create mode 100644 frontend/main/assets/locales/tr-TR/err_pin.ogg create mode 100644 frontend/main/assets/locales/tr-TR/err_reg.ogg create mode 100644 frontend/main/assets/locales/tr-TR/language.json create mode 100644 frontend/main/assets/locales/tr-TR/upgrade.ogg create mode 100644 frontend/main/assets/locales/tr-TR/welcome.ogg create mode 100644 frontend/main/assets/locales/tr-TR/wificonfig.ogg create mode 100644 frontend/main/assets/locales/uk-UA/0.ogg create mode 100644 frontend/main/assets/locales/uk-UA/1.ogg create mode 100644 frontend/main/assets/locales/uk-UA/2.ogg create mode 100644 frontend/main/assets/locales/uk-UA/3.ogg create mode 100644 frontend/main/assets/locales/uk-UA/4.ogg create mode 100644 frontend/main/assets/locales/uk-UA/5.ogg create mode 100644 frontend/main/assets/locales/uk-UA/6.ogg create mode 100644 frontend/main/assets/locales/uk-UA/7.ogg create mode 100644 frontend/main/assets/locales/uk-UA/8.ogg create mode 100644 frontend/main/assets/locales/uk-UA/9.ogg create mode 100644 frontend/main/assets/locales/uk-UA/activation.ogg create mode 100644 frontend/main/assets/locales/uk-UA/err_pin.ogg create mode 100644 frontend/main/assets/locales/uk-UA/err_reg.ogg create mode 100644 frontend/main/assets/locales/uk-UA/language.json create mode 100644 frontend/main/assets/locales/uk-UA/upgrade.ogg create mode 100644 frontend/main/assets/locales/uk-UA/welcome.ogg create mode 100644 frontend/main/assets/locales/uk-UA/wificonfig.ogg create mode 100644 frontend/main/assets/locales/vi-VN/0.ogg create mode 100644 frontend/main/assets/locales/vi-VN/1.ogg create mode 100644 frontend/main/assets/locales/vi-VN/2.ogg create mode 100644 frontend/main/assets/locales/vi-VN/3.ogg create mode 100644 frontend/main/assets/locales/vi-VN/4.ogg create mode 100644 frontend/main/assets/locales/vi-VN/5.ogg create mode 100644 frontend/main/assets/locales/vi-VN/6.ogg create mode 100644 frontend/main/assets/locales/vi-VN/7.ogg create mode 100644 frontend/main/assets/locales/vi-VN/8.ogg create mode 100644 frontend/main/assets/locales/vi-VN/9.ogg create mode 100644 frontend/main/assets/locales/vi-VN/activation.ogg create mode 100644 frontend/main/assets/locales/vi-VN/err_pin.ogg create mode 100644 frontend/main/assets/locales/vi-VN/err_reg.ogg create mode 100644 frontend/main/assets/locales/vi-VN/language.json create mode 100644 frontend/main/assets/locales/vi-VN/upgrade.ogg create mode 100644 frontend/main/assets/locales/vi-VN/welcome.ogg create mode 100644 frontend/main/assets/locales/vi-VN/wificonfig.ogg create mode 100644 frontend/main/assets/locales/zh-CN/0.ogg create mode 100644 frontend/main/assets/locales/zh-CN/1.ogg create mode 100644 frontend/main/assets/locales/zh-CN/2.ogg create mode 100644 frontend/main/assets/locales/zh-CN/3.ogg create mode 100644 frontend/main/assets/locales/zh-CN/4.ogg create mode 100644 frontend/main/assets/locales/zh-CN/5.ogg create mode 100644 frontend/main/assets/locales/zh-CN/6.ogg create mode 100644 frontend/main/assets/locales/zh-CN/7.ogg create mode 100644 frontend/main/assets/locales/zh-CN/8.ogg create mode 100644 frontend/main/assets/locales/zh-CN/9.ogg create mode 100644 frontend/main/assets/locales/zh-CN/activation.ogg create mode 100644 frontend/main/assets/locales/zh-CN/err_pin.ogg create mode 100644 frontend/main/assets/locales/zh-CN/err_reg.ogg create mode 100644 frontend/main/assets/locales/zh-CN/language.json create mode 100644 frontend/main/assets/locales/zh-CN/upgrade.ogg create mode 100644 frontend/main/assets/locales/zh-CN/welcome.ogg create mode 100644 frontend/main/assets/locales/zh-CN/wificonfig.ogg create mode 100644 frontend/main/assets/locales/zh-TW/0.ogg create mode 100644 frontend/main/assets/locales/zh-TW/1.ogg create mode 100644 frontend/main/assets/locales/zh-TW/2.ogg create mode 100644 frontend/main/assets/locales/zh-TW/3.ogg create mode 100644 frontend/main/assets/locales/zh-TW/4.ogg create mode 100644 frontend/main/assets/locales/zh-TW/5.ogg create mode 100644 frontend/main/assets/locales/zh-TW/6.ogg create mode 100644 frontend/main/assets/locales/zh-TW/7.ogg create mode 100644 frontend/main/assets/locales/zh-TW/8.ogg create mode 100644 frontend/main/assets/locales/zh-TW/9.ogg create mode 100644 frontend/main/assets/locales/zh-TW/activation.ogg create mode 100644 frontend/main/assets/locales/zh-TW/err_pin.ogg create mode 100644 frontend/main/assets/locales/zh-TW/err_reg.ogg create mode 100644 frontend/main/assets/locales/zh-TW/language.json create mode 100644 frontend/main/assets/locales/zh-TW/upgrade.ogg create mode 100644 frontend/main/assets/locales/zh-TW/welcome.ogg create mode 100644 frontend/main/assets/locales/zh-TW/wificonfig.ogg create mode 100644 frontend/main/audio/README.md create mode 100644 frontend/main/audio/audio_codec.cc create mode 100644 frontend/main/audio/audio_codec.h create mode 100644 frontend/main/audio/audio_processor.h create mode 100644 frontend/main/audio/audio_service.cc create mode 100644 frontend/main/audio/audio_service.h create mode 100644 frontend/main/audio/codecs/box_audio_codec.cc create mode 100644 frontend/main/audio/codecs/box_audio_codec.h create mode 100644 frontend/main/audio/codecs/dummy_audio_codec.cc create mode 100644 frontend/main/audio/codecs/dummy_audio_codec.h create mode 100644 frontend/main/audio/codecs/es8311_audio_codec.cc create mode 100644 frontend/main/audio/codecs/es8311_audio_codec.h create mode 100644 frontend/main/audio/codecs/es8374_audio_codec.cc create mode 100644 frontend/main/audio/codecs/es8374_audio_codec.h create mode 100644 frontend/main/audio/codecs/es8388_audio_codec.cc create mode 100644 frontend/main/audio/codecs/es8388_audio_codec.h create mode 100644 frontend/main/audio/codecs/es8389_audio_codec.cc create mode 100644 frontend/main/audio/codecs/es8389_audio_codec.h create mode 100644 frontend/main/audio/codecs/no_audio_codec.cc create mode 100644 frontend/main/audio/codecs/no_audio_codec.h create mode 100644 frontend/main/audio/demuxer/ogg_demuxer.cc create mode 100644 frontend/main/audio/demuxer/ogg_demuxer.h create mode 100644 frontend/main/audio/processors/afe_audio_processor.cc create mode 100644 frontend/main/audio/processors/afe_audio_processor.h create mode 100644 frontend/main/audio/processors/audio_debugger.cc create mode 100644 frontend/main/audio/processors/audio_debugger.h create mode 100644 frontend/main/audio/processors/no_audio_processor.cc create mode 100644 frontend/main/audio/processors/no_audio_processor.h create mode 100644 frontend/main/audio/wake_word.h create mode 100644 frontend/main/audio/wake_words/afe_wake_word.cc create mode 100644 frontend/main/audio/wake_words/afe_wake_word.h create mode 100644 frontend/main/audio/wake_words/custom_wake_word.cc create mode 100644 frontend/main/audio/wake_words/custom_wake_word.h create mode 100644 frontend/main/audio/wake_words/esp_wake_word.cc create mode 100644 frontend/main/audio/wake_words/esp_wake_word.h create mode 100644 frontend/main/boards/aipi-lite/README.md create mode 100644 frontend/main/boards/aipi-lite/README_en.md create mode 100644 frontend/main/boards/aipi-lite/aipi-lite.cc create mode 100644 frontend/main/boards/aipi-lite/config.h create mode 100644 frontend/main/boards/aipi-lite/config.json create mode 100644 frontend/main/boards/aipi-lite/config_en.json create mode 100644 frontend/main/boards/aipi-lite/power_manager.h create mode 100644 frontend/main/boards/atk-dnesp32s3-box/atk_dnesp32s3_box.cc create mode 100644 frontend/main/boards/atk-dnesp32s3-box/config.h create mode 100644 frontend/main/boards/atk-dnesp32s3-box/config.json create mode 100644 frontend/main/boards/atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc create mode 100644 frontend/main/boards/atk-dnesp32s3-box0/config.h create mode 100644 frontend/main/boards/atk-dnesp32s3-box0/config.json create mode 100644 frontend/main/boards/atk-dnesp32s3-box0/power_manager.h create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-4g/atk_dnesp32s3_box2.cc create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-4g/config.h create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-4g/config.json create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-4g/power_manager.h create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-wifi/atk_dnesp32s3_box2.cc create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-wifi/config.h create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-wifi/config.json create mode 100644 frontend/main/boards/atk-dnesp32s3-box2-wifi/power_manager.h create mode 100644 frontend/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc create mode 100644 frontend/main/boards/atk-dnesp32s3/config.h create mode 100644 frontend/main/boards/atk-dnesp32s3/config.json create mode 100644 frontend/main/boards/atk-dnesp32s3m-4g/atk_dnesp32s3m.cc create mode 100644 frontend/main/boards/atk-dnesp32s3m-4g/config.h create mode 100644 frontend/main/boards/atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc create mode 100644 frontend/main/boards/atk-dnesp32s3m-wifi/config.h create mode 100644 frontend/main/boards/atom-echos3r/README.md create mode 100644 frontend/main/boards/atom-echos3r/atom_echos3r.cc create mode 100644 frontend/main/boards/atom-echos3r/config.h create mode 100644 frontend/main/boards/atom-echos3r/config.json create mode 100644 frontend/main/boards/atommatrix-echo-base/README.md create mode 100644 frontend/main/boards/atommatrix-echo-base/atommatrix_echo_base.cc create mode 100644 frontend/main/boards/atommatrix-echo-base/config.h create mode 100644 frontend/main/boards/atommatrix-echo-base/config.json create mode 100644 frontend/main/boards/atoms3-echo-base/README.md create mode 100644 frontend/main/boards/atoms3-echo-base/atoms3_echo_base.cc create mode 100644 frontend/main/boards/atoms3-echo-base/config.h create mode 100644 frontend/main/boards/atoms3-echo-base/config.json create mode 100644 frontend/main/boards/atoms3r-cam-m12-echo-base/README.md create mode 100644 frontend/main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc create mode 100644 frontend/main/boards/atoms3r-cam-m12-echo-base/config.h create mode 100644 frontend/main/boards/atoms3r-cam-m12-echo-base/config.json create mode 100644 frontend/main/boards/atoms3r-echo-base/README.md create mode 100644 frontend/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc create mode 100644 frontend/main/boards/atoms3r-echo-base/config.h create mode 100644 frontend/main/boards/atoms3r-echo-base/config.json create mode 100644 frontend/main/boards/bread-compact-esp32-lcd/config.h create mode 100644 frontend/main/boards/bread-compact-esp32-lcd/config.json create mode 100644 frontend/main/boards/bread-compact-esp32-lcd/esp32_bread_board_lcd.cc create mode 100644 frontend/main/boards/bread-compact-esp32/README.md create mode 100644 frontend/main/boards/bread-compact-esp32/config.h create mode 100644 frontend/main/boards/bread-compact-esp32/config.json create mode 100644 frontend/main/boards/bread-compact-esp32/esp32_bread_board.cc create mode 100644 frontend/main/boards/bread-compact-ml307/compact_ml307_board.cc create mode 100644 frontend/main/boards/bread-compact-ml307/config.h create mode 100644 frontend/main/boards/bread-compact-ml307/config.json create mode 100644 frontend/main/boards/bread-compact-nt26/compact_nt26_board.cc create mode 100644 frontend/main/boards/bread-compact-nt26/config.h create mode 100644 frontend/main/boards/bread-compact-nt26/config.json create mode 100644 frontend/main/boards/bread-compact-wifi-lcd/compact_wifi_board_lcd.cc create mode 100644 frontend/main/boards/bread-compact-wifi-lcd/config.h create mode 100644 frontend/main/boards/bread-compact-wifi-s3cam/README.md create mode 100644 frontend/main/boards/bread-compact-wifi-s3cam/compact_wifi_board_s3cam.cc create mode 100644 frontend/main/boards/bread-compact-wifi-s3cam/config.h create mode 100644 frontend/main/boards/bread-compact-wifi/compact_wifi_board.cc create mode 100644 frontend/main/boards/bread-compact-wifi/config.h create mode 100644 frontend/main/boards/bread-compact-wifi/config.json create mode 100644 frontend/main/boards/common/adc_battery_monitor.cc create mode 100644 frontend/main/boards/common/adc_battery_monitor.h create mode 100644 frontend/main/boards/common/afsk_demod.cc create mode 100644 frontend/main/boards/common/afsk_demod.h create mode 100644 frontend/main/boards/common/axp2101.cc create mode 100644 frontend/main/boards/common/axp2101.h create mode 100644 frontend/main/boards/common/backlight.cc create mode 100644 frontend/main/boards/common/backlight.h create mode 100644 frontend/main/boards/common/blufi.cpp create mode 100644 frontend/main/boards/common/blufi.h create mode 100644 frontend/main/boards/common/board.cc create mode 100644 frontend/main/boards/common/board.h create mode 100644 frontend/main/boards/common/button.cc create mode 100644 frontend/main/boards/common/button.h create mode 100644 frontend/main/boards/common/camera.h create mode 100644 frontend/main/boards/common/dual_network_board.cc create mode 100644 frontend/main/boards/common/dual_network_board.h create mode 100644 frontend/main/boards/common/esp32_camera.cc create mode 100644 frontend/main/boards/common/esp32_camera.h create mode 100644 frontend/main/boards/common/esp_video.cc create mode 100644 frontend/main/boards/common/esp_video.h create mode 100644 frontend/main/boards/common/i2c_device.cc create mode 100644 frontend/main/boards/common/i2c_device.h create mode 100644 frontend/main/boards/common/knob.cc create mode 100644 frontend/main/boards/common/knob.h create mode 100644 frontend/main/boards/common/lamp_controller.h create mode 100644 frontend/main/boards/common/ml307_board.cc create mode 100644 frontend/main/boards/common/ml307_board.h create mode 100644 frontend/main/boards/common/nt26_board.cc create mode 100644 frontend/main/boards/common/nt26_board.h create mode 100644 frontend/main/boards/common/power_save_timer.cc create mode 100644 frontend/main/boards/common/power_save_timer.h create mode 100644 frontend/main/boards/common/press_to_talk_mcp_tool.cc create mode 100644 frontend/main/boards/common/press_to_talk_mcp_tool.h create mode 100644 frontend/main/boards/common/rndis_board.cc create mode 100644 frontend/main/boards/common/rndis_board.h create mode 100644 frontend/main/boards/common/sleep_timer.cc create mode 100644 frontend/main/boards/common/sleep_timer.h create mode 100644 frontend/main/boards/common/sy6970.cc create mode 100644 frontend/main/boards/common/sy6970.h create mode 100644 frontend/main/boards/common/system_reset.cc create mode 100644 frontend/main/boards/common/system_reset.h create mode 100644 frontend/main/boards/common/wifi_board.cc create mode 100644 frontend/main/boards/common/wifi_board.h create mode 100644 frontend/main/boards/df-k10/README.md create mode 100644 frontend/main/boards/df-k10/config.h create mode 100644 frontend/main/boards/df-k10/config.json create mode 100644 frontend/main/boards/df-k10/df_k10_board.cc create mode 100644 frontend/main/boards/df-k10/k10_audio_codec.cc create mode 100644 frontend/main/boards/df-k10/k10_audio_codec.h create mode 100644 frontend/main/boards/df-k10/led_control.cc create mode 100644 frontend/main/boards/df-k10/led_control.h create mode 100644 frontend/main/boards/df-s3-ai-cam/README.md create mode 100644 frontend/main/boards/df-s3-ai-cam/config.h create mode 100644 frontend/main/boards/df-s3-ai-cam/config.json create mode 100644 frontend/main/boards/df-s3-ai-cam/df_s3_ai_cam.cc create mode 100644 frontend/main/boards/doit-s3-aibox/README.md create mode 100644 frontend/main/boards/doit-s3-aibox/config.h create mode 100644 frontend/main/boards/doit-s3-aibox/config.json create mode 100644 frontend/main/boards/doit-s3-aibox/doit_s3_aibox.cc create mode 100644 frontend/main/boards/du-chatx/config.h create mode 100644 frontend/main/boards/du-chatx/config.json create mode 100644 frontend/main/boards/du-chatx/du-chatx-wifi.cc create mode 100644 frontend/main/boards/du-chatx/power_manager.h create mode 100644 frontend/main/boards/electron-bot/README.md create mode 100644 frontend/main/boards/electron-bot/config.h create mode 100644 frontend/main/boards/electron-bot/config.json create mode 100644 frontend/main/boards/electron-bot/electron_bot.cc create mode 100644 frontend/main/boards/electron-bot/electron_bot_controller.cc create mode 100644 frontend/main/boards/electron-bot/electron_emoji_display.cc create mode 100644 frontend/main/boards/electron-bot/electron_emoji_display.h create mode 100644 frontend/main/boards/electron-bot/movements.cc create mode 100644 frontend/main/boards/electron-bot/movements.h create mode 100644 frontend/main/boards/electron-bot/oscillator.cc create mode 100644 frontend/main/boards/electron-bot/oscillator.h create mode 100644 frontend/main/boards/electron-bot/otto_icon_font.c create mode 100644 frontend/main/boards/electron-bot/power_manager.h create mode 100644 frontend/main/boards/esp-box-3/README.md create mode 100644 frontend/main/boards/esp-box-3/config.h create mode 100644 frontend/main/boards/esp-box-3/config.json create mode 100644 frontend/main/boards/esp-box-3/esp_box3_board.cc create mode 100644 frontend/main/boards/esp-box-lite/box_audio_codec_lite.cc create mode 100644 frontend/main/boards/esp-box-lite/box_audio_codec_lite.h create mode 100644 frontend/main/boards/esp-box-lite/config.h create mode 100644 frontend/main/boards/esp-box-lite/config.json create mode 100644 frontend/main/boards/esp-box-lite/esp_box_lite_board.cc create mode 100644 frontend/main/boards/esp-box/config.h create mode 100644 frontend/main/boards/esp-box/config.json create mode 100644 frontend/main/boards/esp-box/esp_box_board.cc create mode 100644 frontend/main/boards/esp-hi/README.md create mode 100644 frontend/main/boards/esp-hi/adc_pdm_audio_codec.cc create mode 100644 frontend/main/boards/esp-hi/adc_pdm_audio_codec.h create mode 100644 frontend/main/boards/esp-hi/config.h create mode 100644 frontend/main/boards/esp-hi/config.json create mode 100644 frontend/main/boards/esp-hi/emoji_display.cc create mode 100644 frontend/main/boards/esp-hi/emoji_display.h create mode 100644 frontend/main/boards/esp-hi/esp_hi.cc create mode 100644 frontend/main/boards/esp-p4-function-ev-board/README.md create mode 100644 frontend/main/boards/esp-p4-function-ev-board/config.h create mode 100644 frontend/main/boards/esp-p4-function-ev-board/config.json create mode 100644 frontend/main/boards/esp-p4-function-ev-board/esp-p4-function-ev-board.cc create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board-2/README.md create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board-2/config.h create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board-2/config.json create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board-2/esp-s3-lcd-ev-board-2.cc create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board-2/esp_lcd_gc9503.c create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board-2/esp_lcd_gc9503.h create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board-2/pin_config.h create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/README.md create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/config.h create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/config.json create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/esp-s3-lcd-ev-board.cc create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/esp_io_expander_tca9554.c create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/esp_io_expander_tca9554.h create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/esp_lcd_gc9503.c create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/esp_lcd_gc9503.h create mode 100644 frontend/main/boards/esp-s3-lcd-ev-board/pin_config.h create mode 100644 frontend/main/boards/esp-sensairshuttle/README.md create mode 100644 frontend/main/boards/esp-sensairshuttle/adc_pdm_audio_codec.cc create mode 100644 frontend/main/boards/esp-sensairshuttle/adc_pdm_audio_codec.h create mode 100644 frontend/main/boards/esp-sensairshuttle/config.h create mode 100644 frontend/main/boards/esp-sensairshuttle/config.json create mode 100644 frontend/main/boards/esp-sensairshuttle/esp-sensairshuttle.cc create mode 100644 frontend/main/boards/esp-sparkbot/config.h create mode 100644 frontend/main/boards/esp-sparkbot/config.json create mode 100644 frontend/main/boards/esp-sparkbot/esp_sparkbot_board.cc create mode 100644 frontend/main/boards/esp-spot/README.md create mode 100644 frontend/main/boards/esp-spot/config.h create mode 100644 frontend/main/boards/esp-spot/config.json create mode 100644 frontend/main/boards/esp-spot/esp_spot_board.cc create mode 100644 frontend/main/boards/esp-vocat/README.md create mode 100644 frontend/main/boards/esp-vocat/config.h create mode 100644 frontend/main/boards/esp-vocat/config.json create mode 100644 frontend/main/boards/esp-vocat/esp_vocat.cc create mode 100644 frontend/main/boards/esp-vocat/touch.h create mode 100644 frontend/main/boards/esp32-cgc-144/README.md create mode 100644 frontend/main/boards/esp32-cgc-144/config.h create mode 100644 frontend/main/boards/esp32-cgc-144/config.json create mode 100644 frontend/main/boards/esp32-cgc-144/esp32_cgc_144_board.cc create mode 100644 frontend/main/boards/esp32-cgc-144/power_manager.h create mode 100644 frontend/main/boards/esp32-cgc-144/power_manager_lite.h create mode 100644 frontend/main/boards/esp32-cgc/README.md create mode 100644 frontend/main/boards/esp32-cgc/config.h create mode 100644 frontend/main/boards/esp32-cgc/config.json create mode 100644 frontend/main/boards/esp32-cgc/esp32_cgc_board.cc create mode 100644 frontend/main/boards/esp32s3-korvo2-v3-rndis/config.h create mode 100644 frontend/main/boards/esp32s3-korvo2-v3-rndis/config.json create mode 100644 frontend/main/boards/esp32s3-korvo2-v3-rndis/esp32s3_korvo2_v3_board.cc create mode 100644 frontend/main/boards/esp32s3-korvo2-v3-rndis/power_manager.h create mode 100644 frontend/main/boards/esp32s3-korvo2-v3/config.h create mode 100644 frontend/main/boards/esp32s3-korvo2-v3/config.json create mode 100644 frontend/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc create mode 100644 frontend/main/boards/esp32s3-korvo2-v3/power_manager.h create mode 100644 frontend/main/boards/freenove-esp32s3-display-2.8-lcd/ReadMe.md create mode 100644 frontend/main/boards/freenove-esp32s3-display-2.8-lcd/config.h create mode 100644 frontend/main/boards/freenove-esp32s3-display-2.8-lcd/config.json create mode 100644 frontend/main/boards/freenove-esp32s3-display-2.8-lcd/freenove-esp32s3-display-2.8-lcd.cc create mode 100644 frontend/main/boards/genjutech-s3-1.54tft/config.h create mode 100644 frontend/main/boards/genjutech-s3-1.54tft/config.json create mode 100644 frontend/main/boards/genjutech-s3-1.54tft/genjutech-s3-1.54tft.cc create mode 100644 frontend/main/boards/genjutech-s3-1.54tft/power_manager.h create mode 100644 frontend/main/boards/hu-087/README.md create mode 100644 frontend/main/boards/hu-087/config.h create mode 100644 frontend/main/boards/hu-087/config.json create mode 100644 frontend/main/boards/hu-087/hu_087_board.cc create mode 100644 frontend/main/boards/jiuchuan-s3/README.md create mode 100644 frontend/main/boards/jiuchuan-s3/config.h create mode 100644 frontend/main/boards/jiuchuan-s3/config.json create mode 100644 frontend/main/boards/jiuchuan-s3/esp_lcd_panel_gc9301.c create mode 100644 frontend/main/boards/jiuchuan-s3/esp_lcd_panel_gc9301.h create mode 100644 frontend/main/boards/jiuchuan-s3/gpio_manager.h create mode 100644 frontend/main/boards/jiuchuan-s3/jiuchuan_dev_board.cc create mode 100644 frontend/main/boards/jiuchuan-s3/power_controller.h create mode 100644 frontend/main/boards/jiuchuan-s3/power_manager.h create mode 100644 frontend/main/boards/kevin-box-2/config.h create mode 100644 frontend/main/boards/kevin-box-2/config.json create mode 100644 frontend/main/boards/kevin-box-2/kevin_box_board.cc create mode 100644 frontend/main/boards/kevin-c3/config.h create mode 100644 frontend/main/boards/kevin-c3/config.json create mode 100644 frontend/main/boards/kevin-c3/kevin_c3_board.cc create mode 100644 frontend/main/boards/kevin-c3/led_strip_control.cc create mode 100644 frontend/main/boards/kevin-c3/led_strip_control.h create mode 100644 frontend/main/boards/kevin-sp-v3-dev/config.h create mode 100644 frontend/main/boards/kevin-sp-v3-dev/kevin-sp-v3_board.cc create mode 100644 frontend/main/boards/kevin-sp-v4-dev/config.h create mode 100644 frontend/main/boards/kevin-sp-v4-dev/config.json create mode 100644 frontend/main/boards/kevin-sp-v4-dev/kevin-sp-v4_board.cc create mode 100644 frontend/main/boards/kevin-yuying-313lcd/config.h create mode 100644 frontend/main/boards/kevin-yuying-313lcd/config.json create mode 100644 frontend/main/boards/kevin-yuying-313lcd/esp_lcd_gc9503.c create mode 100644 frontend/main/boards/kevin-yuying-313lcd/esp_lcd_gc9503.h create mode 100644 frontend/main/boards/kevin-yuying-313lcd/kevin_yuying_313lcd.cc create mode 100644 frontend/main/boards/kevin-yuying-313lcd/pin_config.h create mode 100644 frontend/main/boards/labplus-ledong-v2/README.md create mode 100644 frontend/main/boards/labplus-ledong-v2/config.h create mode 100644 frontend/main/boards/labplus-ledong-v2/config.json create mode 100644 frontend/main/boards/labplus-ledong-v2/labplus_ledong_v2.cc create mode 100644 frontend/main/boards/labplus-mpython-v3/README.md create mode 100644 frontend/main/boards/labplus-mpython-v3/config.h create mode 100644 frontend/main/boards/labplus-mpython-v3/config.json create mode 100644 frontend/main/boards/labplus-mpython-v3/mpython_pro.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/README.md create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/config.h create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/config.json create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/eda_dog_controller.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/eda_dog_movements.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/eda_dog_movements.h create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/eda_robot_pro.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/oscillator.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-robot-pro/oscillator.h create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/README.md create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/config.h create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/config.json create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/eda_super_bear.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/eda_super_bear_controller.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/eda_super_bear_movements.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/eda_super_bear_movements.h create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/oscillator.cc create mode 100644 frontend/main/boards/lceda-course-examples/eda-super-bear/oscillator.h create mode 100644 frontend/main/boards/lceda-course-examples/eda-tv-pro/README.md create mode 100644 frontend/main/boards/lceda-course-examples/eda-tv-pro/config.h create mode 100644 frontend/main/boards/lceda-course-examples/eda-tv-pro/config.json create mode 100644 frontend/main/boards/lceda-course-examples/eda-tv-pro/eda-tv-pro.cc create mode 100644 frontend/main/boards/lichuang-c3-dev/README.md create mode 100644 frontend/main/boards/lichuang-c3-dev/config.h create mode 100644 frontend/main/boards/lichuang-c3-dev/config.json create mode 100644 frontend/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc create mode 100644 frontend/main/boards/lichuang-dev/config.h create mode 100644 frontend/main/boards/lichuang-dev/config.json create mode 100644 frontend/main/boards/lichuang-dev/lichuang_dev_board.cc create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/README.md create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/config.h create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/config.json create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/ir_filter_controller.h create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/lilygo-t-cameraplus-s3.cc create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/pin_config.h create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/tcamerapluss3_audio_codec.cc create mode 100644 frontend/main/boards/lilygo-t-cameraplus-s3/tcamerapluss3_audio_codec.h create mode 100644 frontend/main/boards/lilygo-t-circle-s3/README.md create mode 100644 frontend/main/boards/lilygo-t-circle-s3/config.h create mode 100644 frontend/main/boards/lilygo-t-circle-s3/config.json create mode 100644 frontend/main/boards/lilygo-t-circle-s3/esp_lcd_gc9d01n.c create mode 100644 frontend/main/boards/lilygo-t-circle-s3/esp_lcd_gc9d01n.h create mode 100644 frontend/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc create mode 100644 frontend/main/boards/lilygo-t-circle-s3/pin_config.h create mode 100644 frontend/main/boards/lilygo-t-circle-s3/tcircles3_audio_codec.cc create mode 100644 frontend/main/boards/lilygo-t-circle-s3/tcircles3_audio_codec.h create mode 100644 frontend/main/boards/lilygo-t-display-p4/README.md create mode 100644 frontend/main/boards/lilygo-t-display-p4/config.h create mode 100644 frontend/main/boards/lilygo-t-display-p4/hi8561_driver.cc create mode 100644 frontend/main/boards/lilygo-t-display-p4/hi8561_driver.h create mode 100644 frontend/main/boards/lilygo-t-display-p4/lilygo-t-display-p4.cc create mode 100644 frontend/main/boards/lilygo-t-display-p4/rm69a10_driver.cc create mode 100644 frontend/main/boards/lilygo-t-display-p4/rm69a10_driver.h create mode 100644 frontend/main/boards/lilygo-t-display-p4/t_display_p4_config.h create mode 100644 frontend/main/boards/lilygo-t-display-s3-pro-mvsrlora/README.md create mode 100644 frontend/main/boards/lilygo-t-display-s3-pro-mvsrlora/config.h create mode 100644 frontend/main/boards/lilygo-t-display-s3-pro-mvsrlora/config.json create mode 100644 frontend/main/boards/lilygo-t-display-s3-pro-mvsrlora/lilygo-t-display-s3-pro-mvsrlora.cc create mode 100644 frontend/main/boards/lilygo-t-display-s3-pro-mvsrlora/pin_config.h create mode 100644 frontend/main/boards/lilygo-t-display-s3-pro-mvsrlora/tdisplays3promvsrlora_audio_codec.cc create mode 100644 frontend/main/boards/lilygo-t-display-s3-pro-mvsrlora/tdisplays3promvsrlora_audio_codec.h create mode 100644 frontend/main/boards/m5stack-cardputer-adv/README.md create mode 100644 frontend/main/boards/m5stack-cardputer-adv/config.h create mode 100644 frontend/main/boards/m5stack-cardputer-adv/config.json create mode 100644 frontend/main/boards/m5stack-cardputer-adv/m5stack_cardputer_adv.cc create mode 100644 frontend/main/boards/m5stack-core-s3/README.md create mode 100644 frontend/main/boards/m5stack-core-s3/config.h create mode 100644 frontend/main/boards/m5stack-core-s3/config.json create mode 100644 frontend/main/boards/m5stack-core-s3/cores3_audio_codec.cc create mode 100644 frontend/main/boards/m5stack-core-s3/cores3_audio_codec.h create mode 100644 frontend/main/boards/m5stack-core-s3/m5stack_core_s3.cc create mode 100644 frontend/main/boards/m5stack-tab5/README.md create mode 100644 frontend/main/boards/m5stack-tab5/config.h create mode 100644 frontend/main/boards/m5stack-tab5/config.json create mode 100644 frontend/main/boards/m5stack-tab5/esp_lcd_st7123.c create mode 100644 frontend/main/boards/m5stack-tab5/esp_lcd_st7123.h create mode 100644 frontend/main/boards/m5stack-tab5/m5stack_tab5.cc create mode 100644 frontend/main/boards/m5stack-tab5/sdkconfig.tab5 create mode 100644 frontend/main/boards/m5stack-tab5/tab5_audio_codec.cc create mode 100644 frontend/main/boards/m5stack-tab5/tab5_audio_codec.h create mode 100644 frontend/main/boards/magiclick-2p4/config.h create mode 100644 frontend/main/boards/magiclick-2p4/config.json create mode 100644 frontend/main/boards/magiclick-2p4/magiclick_2p4_board.cc create mode 100644 frontend/main/boards/magiclick-2p5/config.h create mode 100644 frontend/main/boards/magiclick-2p5/config.json create mode 100644 frontend/main/boards/magiclick-2p5/magiclick_2p5_board.cc create mode 100644 frontend/main/boards/magiclick-2p5/power_manager.h create mode 100644 frontend/main/boards/magiclick-c3-v2/config.h create mode 100644 frontend/main/boards/magiclick-c3-v2/config.json create mode 100644 frontend/main/boards/magiclick-c3-v2/magiclick_c3_v2_board.cc create mode 100644 frontend/main/boards/magiclick-c3/config.h create mode 100644 frontend/main/boards/magiclick-c3/config.json create mode 100644 frontend/main/boards/magiclick-c3/magiclick_c3_board.cc create mode 100644 frontend/main/boards/minsi-k08-dual/README.md create mode 100644 frontend/main/boards/minsi-k08-dual/config.h create mode 100644 frontend/main/boards/minsi-k08-dual/config.json create mode 100644 frontend/main/boards/minsi-k08-dual/minsi_k08_dual.cc create mode 100644 frontend/main/boards/minsi-k08-dual/power_manager.h create mode 100644 frontend/main/boards/mixgo-nova/README.md create mode 100644 frontend/main/boards/mixgo-nova/config.h create mode 100644 frontend/main/boards/mixgo-nova/config.json create mode 100644 frontend/main/boards/mixgo-nova/mixgo-nova.cc create mode 100644 frontend/main/boards/movecall-cuican-esp32s3/README.md create mode 100644 frontend/main/boards/movecall-cuican-esp32s3/config.h create mode 100644 frontend/main/boards/movecall-cuican-esp32s3/config.json create mode 100644 frontend/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc create mode 100644 frontend/main/boards/movecall-moji-esp32s3/README.md create mode 100644 frontend/main/boards/movecall-moji-esp32s3/config.h create mode 100644 frontend/main/boards/movecall-moji-esp32s3/config.json create mode 100644 frontend/main/boards/movecall-moji-esp32s3/movecall_moji_esp32s3.cc create mode 100644 frontend/main/boards/movecall-moji2-esp32c5/README.md create mode 100644 frontend/main/boards/movecall-moji2-esp32c5/README_zh.md create mode 100644 frontend/main/boards/movecall-moji2-esp32c5/config.h create mode 100644 frontend/main/boards/movecall-moji2-esp32c5/config.json create mode 100644 frontend/main/boards/movecall-moji2-esp32c5/movecall_moji2_esp32s3.cc create mode 100644 frontend/main/boards/otto-robot/README.md create mode 100644 frontend/main/boards/otto-robot/config.h create mode 100644 frontend/main/boards/otto-robot/config.json create mode 100644 frontend/main/boards/otto-robot/oscillator.cc create mode 100644 frontend/main/boards/otto-robot/oscillator.h create mode 100644 frontend/main/boards/otto-robot/otto_controller.cc create mode 100644 frontend/main/boards/otto-robot/otto_emoji_display.cc create mode 100644 frontend/main/boards/otto-robot/otto_emoji_display.h create mode 100644 frontend/main/boards/otto-robot/otto_icon_font.c create mode 100644 frontend/main/boards/otto-robot/otto_movements.cc create mode 100644 frontend/main/boards/otto-robot/otto_movements.h create mode 100644 frontend/main/boards/otto-robot/otto_robot.cc create mode 100644 frontend/main/boards/otto-robot/power_manager.h create mode 100644 frontend/main/boards/otto-robot/websocket_control_server.cc create mode 100644 frontend/main/boards/otto-robot/websocket_control_server.h create mode 100644 frontend/main/boards/sensecap-watcher/README.md create mode 100644 frontend/main/boards/sensecap-watcher/README_en.md create mode 100644 frontend/main/boards/sensecap-watcher/config.h create mode 100644 frontend/main/boards/sensecap-watcher/config.json create mode 100644 frontend/main/boards/sensecap-watcher/config_en.json create mode 100644 frontend/main/boards/sensecap-watcher/sensecap_audio_codec.cc create mode 100644 frontend/main/boards/sensecap-watcher/sensecap_audio_codec.h create mode 100644 frontend/main/boards/sensecap-watcher/sensecap_watcher.cc create mode 100644 frontend/main/boards/sensecap-watcher/sscma_camera.cc create mode 100644 frontend/main/boards/sensecap-watcher/sscma_camera.h create mode 100644 frontend/main/boards/sp-esp32-s3-1.28-box/README.md create mode 100644 frontend/main/boards/sp-esp32-s3-1.28-box/config.h create mode 100644 frontend/main/boards/sp-esp32-s3-1.28-box/config.json create mode 100644 frontend/main/boards/sp-esp32-s3-1.28-box/power_manager.h create mode 100644 frontend/main/boards/sp-esp32-s3-1.28-box/sp-esp32-s3-1.28-box.cc create mode 100644 frontend/main/boards/sp-esp32-s3-1.54-muma/README.md create mode 100644 frontend/main/boards/sp-esp32-s3-1.54-muma/config.h create mode 100644 frontend/main/boards/sp-esp32-s3-1.54-muma/config.json create mode 100644 frontend/main/boards/sp-esp32-s3-1.54-muma/power_manager.h create mode 100644 frontend/main/boards/sp-esp32-s3-1.54-muma/sp-esp32-s3-1.54-muma.cc create mode 100644 frontend/main/boards/surfer-c3-1.14tft/README.md create mode 100644 frontend/main/boards/surfer-c3-1.14tft/config.h create mode 100644 frontend/main/boards/surfer-c3-1.14tft/config.json create mode 100644 frontend/main/boards/surfer-c3-1.14tft/power_manager.h create mode 100644 frontend/main/boards/surfer-c3-1.14tft/surfer-c3-1.14tft.cc create mode 100644 frontend/main/boards/taiji-pi-s3/README.md create mode 100644 frontend/main/boards/taiji-pi-s3/config.h create mode 100644 frontend/main/boards/taiji-pi-s3/config.json create mode 100644 frontend/main/boards/taiji-pi-s3/taiji_pi_s3.cc create mode 100644 frontend/main/boards/tudouzi/config.h create mode 100644 frontend/main/boards/tudouzi/config.json create mode 100644 frontend/main/boards/tudouzi/kevin_box_board.cc create mode 100644 frontend/main/boards/waveshare/esp32-c6-lcd-1.69/README.md create mode 100644 frontend/main/boards/waveshare/esp32-c6-lcd-1.69/config.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-lcd-1.69/config.json create mode 100644 frontend/main/boards/waveshare/esp32-c6-lcd-1.69/esp32-c6-lcd-1.69.cc create mode 100644 frontend/main/boards/waveshare/esp32-c6-lcd-1.69/power_manager.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.32/README.md create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.32/config.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.32/config.json create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.32/esp32-c6-touch-amoled-1.32.cc create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.43/README.md create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.43/config.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.43/config.json create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.43/esp32-c6-touch-amoled-1.43.cc create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.8/README.md create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.8/config.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.8/config.json create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-1.8/esp32-c6-touch-amoled-1.8.cc create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.06/README.md create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.06/config.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.06/config.json create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.06/esp32-c6-touch-amoled-2.06.cc create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.16/README.md create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.16/config.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.16/config.json create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-amoled-2.16/esp32-c6-touch-amoled-2.16.cc create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-lcd-1.83/README.md create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-lcd-1.83/config.h create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-lcd-1.83/config.json create mode 100644 frontend/main/boards/waveshare/esp32-c6-touch-lcd-1.83/esp32-c6-touch-lcd-1.83.cc create mode 100644 frontend/main/boards/waveshare/esp32-p4-nano/README.md create mode 100644 frontend/main/boards/waveshare/esp32-p4-nano/config.h create mode 100644 frontend/main/boards/waveshare/esp32-p4-nano/config.json create mode 100644 frontend/main/boards/waveshare/esp32-p4-nano/esp32-p4-nano.cc create mode 100644 frontend/main/boards/waveshare/esp32-p4-nano/lcd_init_cmds.h create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd-3.5/README.md create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd-3.5/config.h create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd-3.5/config.json create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd-3.5/esp32-p4-wifi6-touch-lcd-3.5.cc create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd/README.md create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd/config.h create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd/config.json create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd/esp32-p4-wifi6-touch-lcd.cc create mode 100644 frontend/main/boards/waveshare/esp32-p4-wifi6-touch-lcd/lcd_init_cmds.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-audio-board/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-audio-board/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-audio-board/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-audio-board/esp32-s3-audio_board.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-audio-board/esp_lcd_jd9853.c create mode 100644 frontend/main/boards/waveshare/esp32-s3-audio-board/esp_lcd_jd9853.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-cam/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-cam/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-cam/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-cam/esp32-s3-cam-xxxx.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/board_power_bsp.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/board_power_bsp.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/custom_lcd_display.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/custom_lcd_display.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-1.54/waveshare-s3-epaper-1.54.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-3.97/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-3.97/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-3.97/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-3.97/custom_lcd_display.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-3.97/custom_lcd_display.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-epaper-3.97/waveshare-s3-epaper-3.97.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-lcd-0.85/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-lcd-0.85/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-lcd-0.85/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-lcd-0.85/esp32-s3-lcd-0.85.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-lcd-0.85/led_strip_control.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-lcd-0.85/led_strip_control.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-lcd-0.85/power_manager.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-rlcd-4.2/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-rlcd-4.2/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-rlcd-4.2/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-rlcd-4.2/custom_lcd_display.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-rlcd-4.2/custom_lcd_display.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-rlcd-4.2/waveshare-s3-rlcd-4.2.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.32/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.32/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.32/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.32/esp32-s3-touch-amoled-1.32.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.75/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.75/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.75/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.75/esp32-s3-touch-amoled-1.75.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.8/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.8/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-2.06/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-2.06/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-2.06/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-amoled-2.06/esp32-s3-touch-amoled-2.06.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.46/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.46/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.46/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.46/esp32-s3-touch-lcd-1.46.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.54/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.54/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.54/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.54/esp32-s3-touch-lcd-1.54.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.54/power_manager.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.83/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.83/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.83/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.83/esp32-s3-touch-lcd-1.83.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85/esp32-s3-touch-lcd-1.85.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85c/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85c/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85c/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-1.85c/esp32-s3-touch-lcd-1.85c.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.49/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.49/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.49/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.49/custom_lcd_display.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.49/custom_lcd_display.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.49/waveshare-s3-touch-lcd-3.49.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5/esp32-s3-touch-lcd-3.5.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5b/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5b/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5b/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5b/custom_lcd_display.cc create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5b/custom_lcd_display.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-3.5b/waveshare-s3-touch-lcd-3.5b.cc create mode 100755 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4.3c/README.md create mode 100755 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4.3c/config.h create mode 100755 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4.3c/config.json create mode 100755 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4.3c/esp32_s3_touch_lcd_4.3c.cc create mode 100755 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4.3c/sdkconfig.4_3c create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4b/README.md create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4b/config.h create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4b/config.json create mode 100644 frontend/main/boards/waveshare/esp32-s3-touch-lcd-4b/esp32-s3-touch-lcd-4b.cc create mode 100644 frontend/main/boards/waveshare/esp32-touch-lcd-3.5/README.md create mode 100644 frontend/main/boards/waveshare/esp32-touch-lcd-3.5/config.h create mode 100644 frontend/main/boards/waveshare/esp32-touch-lcd-3.5/config.json create mode 100644 frontend/main/boards/waveshare/esp32-touch-lcd-3.5/esp32-touch-lcd-3.5.cc create mode 100644 frontend/main/boards/wireless-tag-wtp4c5mp07s/README.md create mode 100644 frontend/main/boards/wireless-tag-wtp4c5mp07s/config.h create mode 100644 frontend/main/boards/wireless-tag-wtp4c5mp07s/config.json create mode 100644 frontend/main/boards/wireless-tag-wtp4c5mp07s/wireless-tag-wtp4c5mp07s.cc create mode 100644 frontend/main/boards/xingzhi-abs-2.0/README.md create mode 100644 frontend/main/boards/xingzhi-abs-2.0/config.h create mode 100644 frontend/main/boards/xingzhi-abs-2.0/config.json create mode 100644 frontend/main/boards/xingzhi-abs-2.0/customlcddisplay.h create mode 100644 frontend/main/boards/xingzhi-abs-2.0/power_manager.h create mode 100644 frontend/main/boards/xingzhi-abs-2.0/xingzhi-abs-2.0.cc create mode 100644 frontend/main/boards/xingzhi-cube-0.85tft-ml307/config.h create mode 100644 frontend/main/boards/xingzhi-cube-0.85tft-ml307/config.json create mode 100644 frontend/main/boards/xingzhi-cube-0.85tft-ml307/xingzhi-cube-0.85tft-ml307.cc create mode 100644 frontend/main/boards/xingzhi-cube-0.85tft-wifi/config.h create mode 100644 frontend/main/boards/xingzhi-cube-0.85tft-wifi/config.json create mode 100644 frontend/main/boards/xingzhi-cube-0.85tft-wifi/xingzhi-cube-0.85tft-wifi.cc create mode 100644 frontend/main/boards/xingzhi-cube-0.96oled-ml307/config.h create mode 100644 frontend/main/boards/xingzhi-cube-0.96oled-ml307/config.json create mode 100644 frontend/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc create mode 100644 frontend/main/boards/xingzhi-cube-0.96oled-wifi/config.h create mode 100644 frontend/main/boards/xingzhi-cube-0.96oled-wifi/config.json create mode 100644 frontend/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc create mode 100644 frontend/main/boards/xingzhi-cube-1.54tft-ml307/config.h create mode 100644 frontend/main/boards/xingzhi-cube-1.54tft-ml307/config.json create mode 100644 frontend/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc create mode 100644 frontend/main/boards/xingzhi-cube-1.54tft-wifi/config.h create mode 100644 frontend/main/boards/xingzhi-cube-1.54tft-wifi/config.json create mode 100644 frontend/main/boards/xingzhi-cube-1.54tft-wifi/power_manager.h create mode 100644 frontend/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc create mode 100644 frontend/main/boards/xingzhi-metal-1.54-wifi/README.md create mode 100644 frontend/main/boards/xingzhi-metal-1.54-wifi/config.h create mode 100644 frontend/main/boards/xingzhi-metal-1.54-wifi/config.json create mode 100644 frontend/main/boards/xingzhi-metal-1.54-wifi/cst816x.cc create mode 100644 frontend/main/boards/xingzhi-metal-1.54-wifi/cst816x.h create mode 100644 frontend/main/boards/xingzhi-metal-1.54-wifi/power_manager.h create mode 100644 frontend/main/boards/xingzhi-metal-1.54-wifi/xingzhi-metal-1.54-wifi.cc create mode 100644 frontend/main/boards/xmini-c3-4g/README.md create mode 100644 frontend/main/boards/xmini-c3-4g/config.h create mode 100644 frontend/main/boards/xmini-c3-4g/config.json create mode 100644 frontend/main/boards/xmini-c3-4g/xmini_c3_4g_board.cc create mode 100644 frontend/main/boards/xmini-c3-v3/README.md create mode 100644 frontend/main/boards/xmini-c3-v3/config.h create mode 100644 frontend/main/boards/xmini-c3-v3/config.json create mode 100644 frontend/main/boards/xmini-c3-v3/xmini_c3_board.cc create mode 100644 frontend/main/boards/xmini-c3/config.h create mode 100644 frontend/main/boards/xmini-c3/config.json create mode 100644 frontend/main/boards/xmini-c3/xmini_c3_board.cc create mode 100644 frontend/main/boards/yunliao-s3/README.md create mode 100644 frontend/main/boards/yunliao-s3/config.h create mode 100644 frontend/main/boards/yunliao-s3/config.json create mode 100644 frontend/main/boards/yunliao-s3/power_manager.cc create mode 100644 frontend/main/boards/yunliao-s3/power_manager.h create mode 100644 frontend/main/boards/yunliao-s3/yunliao_s3.cc create mode 100644 frontend/main/boards/zhengchen-1.54tft-ml307/README.md create mode 100644 frontend/main/boards/zhengchen-1.54tft-ml307/config.h create mode 100644 frontend/main/boards/zhengchen-1.54tft-ml307/config.json create mode 100644 frontend/main/boards/zhengchen-1.54tft-ml307/zhengchen-1.54tft-ml307.cc create mode 100644 frontend/main/boards/zhengchen-1.54tft-wifi/README.md create mode 100644 frontend/main/boards/zhengchen-1.54tft-wifi/config.h create mode 100644 frontend/main/boards/zhengchen-1.54tft-wifi/config.json create mode 100644 frontend/main/boards/zhengchen-1.54tft-wifi/power_manager.h create mode 100644 frontend/main/boards/zhengchen-1.54tft-wifi/zhengchen-1.54tft-wifi.cc create mode 100644 frontend/main/boards/zhengchen-1.54tft-wifi/zhengchen_lcd_display.h create mode 100644 frontend/main/boards/zhengchen-cam-ml307/README.md create mode 100644 frontend/main/boards/zhengchen-cam-ml307/config.h create mode 100644 frontend/main/boards/zhengchen-cam-ml307/config.json create mode 100644 frontend/main/boards/zhengchen-cam-ml307/mcp_controller.cc create mode 100644 frontend/main/boards/zhengchen-cam-ml307/power_manager.h create mode 100644 frontend/main/boards/zhengchen-cam-ml307/zhengchen_cam_board_ml307.cc create mode 100644 frontend/main/boards/zhengchen-cam/README.md create mode 100644 frontend/main/boards/zhengchen-cam/config.h create mode 100644 frontend/main/boards/zhengchen-cam/config.json create mode 100644 frontend/main/boards/zhengchen-cam/mcp_controller.cc create mode 100644 frontend/main/boards/zhengchen-cam/power_manager.h create mode 100644 frontend/main/boards/zhengchen-cam/zhengchen_cam_board.cc create mode 100644 frontend/main/device_state.h create mode 100644 frontend/main/device_state_machine.cc create mode 100644 frontend/main/device_state_machine.h create mode 100644 frontend/main/display/display.cc create mode 100644 frontend/main/display/display.h create mode 100644 frontend/main/display/emote_display.cc create mode 100644 frontend/main/display/emote_display.h create mode 100644 frontend/main/display/lcd_display.cc create mode 100644 frontend/main/display/lcd_display.h create mode 100644 frontend/main/display/lvgl_display/emoji_collection.cc create mode 100644 frontend/main/display/lvgl_display/emoji_collection.h create mode 100644 frontend/main/display/lvgl_display/gif/LICENSE.txt create mode 100644 frontend/main/display/lvgl_display/gif/README.md create mode 100644 frontend/main/display/lvgl_display/gif/gifdec.c create mode 100644 frontend/main/display/lvgl_display/gif/gifdec.h create mode 100644 frontend/main/display/lvgl_display/gif/gifdec_mve.h create mode 100644 frontend/main/display/lvgl_display/gif/lvgl_gif.cc create mode 100644 frontend/main/display/lvgl_display/gif/lvgl_gif.h create mode 100644 frontend/main/display/lvgl_display/jpg/image_to_jpeg.cpp create mode 100644 frontend/main/display/lvgl_display/jpg/image_to_jpeg.h create mode 100644 frontend/main/display/lvgl_display/jpg/jpeg_to_image.c create mode 100644 frontend/main/display/lvgl_display/jpg/jpeg_to_image.h create mode 100644 frontend/main/display/lvgl_display/lvgl_display.cc create mode 100644 frontend/main/display/lvgl_display/lvgl_display.h create mode 100644 frontend/main/display/lvgl_display/lvgl_font.cc create mode 100644 frontend/main/display/lvgl_display/lvgl_font.h create mode 100644 frontend/main/display/lvgl_display/lvgl_image.cc create mode 100644 frontend/main/display/lvgl_display/lvgl_image.h create mode 100644 frontend/main/display/lvgl_display/lvgl_theme.cc create mode 100644 frontend/main/display/lvgl_display/lvgl_theme.h create mode 100644 frontend/main/display/oled_display.cc create mode 100644 frontend/main/display/oled_display.h create mode 100644 frontend/main/idf_component.yml create mode 100644 frontend/main/led/circular_strip.cc create mode 100644 frontend/main/led/circular_strip.h create mode 100644 frontend/main/led/gpio_led.cc create mode 100644 frontend/main/led/gpio_led.h create mode 100644 frontend/main/led/led.h create mode 100644 frontend/main/led/single_led.cc create mode 100644 frontend/main/led/single_led.h create mode 100755 frontend/main/main.cc create mode 100644 frontend/main/mcp_server.cc create mode 100644 frontend/main/mcp_server.h create mode 100644 frontend/main/ota.cc create mode 100644 frontend/main/ota.h create mode 100644 frontend/main/protocols/mqtt_protocol.cc create mode 100644 frontend/main/protocols/mqtt_protocol.h create mode 100644 frontend/main/protocols/protocol.cc create mode 100644 frontend/main/protocols/protocol.h create mode 100644 frontend/main/protocols/websocket_protocol.cc create mode 100644 frontend/main/protocols/websocket_protocol.h create mode 100644 frontend/main/settings.cc create mode 100644 frontend/main/settings.h create mode 100644 frontend/main/system_info.cc create mode 100644 frontend/main/system_info.h create mode 100644 frontend/partitions/v1/16m.csv create mode 100644 frontend/partitions/v1/16m_custom_wakeword.csv create mode 100644 frontend/partitions/v1/16m_echoear.csv create mode 100644 frontend/partitions/v1/32m.csv create mode 100644 frontend/partitions/v1/4m.csv create mode 100644 frontend/partitions/v1/4m_esp-hi.csv create mode 100644 frontend/partitions/v1/8m.csv create mode 100644 frontend/partitions/v2/16m.csv create mode 100644 frontend/partitions/v2/16m_c3.csv create mode 100644 frontend/partitions/v2/32m.csv create mode 100644 frontend/partitions/v2/4m.csv create mode 100644 frontend/partitions/v2/8m.csv create mode 100644 frontend/partitions/v2/README.md create mode 100644 frontend/scripts/Image_Converter/LVGLImage.py create mode 100644 frontend/scripts/Image_Converter/README.md create mode 100644 frontend/scripts/Image_Converter/lvgl_tools_gui.py create mode 100644 frontend/scripts/Image_Converter/requirements.txt create mode 100644 frontend/scripts/acoustic_check/demod.py create mode 100644 frontend/scripts/acoustic_check/graphic.py create mode 100644 frontend/scripts/acoustic_check/main.py create mode 100644 frontend/scripts/acoustic_check/readme.md create mode 100644 frontend/scripts/acoustic_check/requirements.txt create mode 100644 frontend/scripts/audio_debug_server.py create mode 100755 frontend/scripts/build_default_assets.py create mode 100644 frontend/scripts/download_github_runs.py create mode 100644 frontend/scripts/gen_lang.py create mode 100644 frontend/scripts/mp3_to_ogg.sh create mode 100644 frontend/scripts/ogg_converter/README.md create mode 100644 frontend/scripts/ogg_converter/xiaozhi_ogg_converter.py create mode 100644 frontend/scripts/p3_tools/README.md create mode 100644 frontend/scripts/p3_tools/batch_convert_gui.py create mode 100644 frontend/scripts/p3_tools/convert_audio_to_p3.py create mode 100644 frontend/scripts/p3_tools/convert_p3_to_audio.py create mode 100644 frontend/scripts/p3_tools/img/img.png create mode 100644 frontend/scripts/p3_tools/p3_gui_player.py create mode 100644 frontend/scripts/p3_tools/play_p3.py create mode 100644 frontend/scripts/p3_tools/requirements.txt create mode 100755 frontend/scripts/release.py create mode 100644 frontend/scripts/sonic_wifi_config.html create mode 100644 frontend/scripts/spiffs_assets/README.md create mode 100644 frontend/scripts/spiffs_assets/build.py create mode 100644 frontend/scripts/spiffs_assets/build_all.py create mode 100644 frontend/scripts/spiffs_assets/pack_model.py create mode 100644 frontend/scripts/spiffs_assets/spiffs_assets_gen.py create mode 100644 frontend/scripts/versions.py create mode 100644 frontend/sdkconfig.defaults create mode 100644 frontend/sdkconfig.defaults.esp32 create mode 100644 frontend/sdkconfig.defaults.esp32c3 create mode 100644 frontend/sdkconfig.defaults.esp32c5 create mode 100644 frontend/sdkconfig.defaults.esp32c6 create mode 100644 frontend/sdkconfig.defaults.esp32p4 create mode 100644 frontend/sdkconfig.defaults.esp32s3 diff --git a/frontend/.clang-format b/frontend/.clang-format new file mode 100644 index 0000000..9b71362 --- /dev/null +++ b/frontend/.clang-format @@ -0,0 +1,126 @@ +--- +Language: Cpp +BasedOnStyle: Google +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Left +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: ExceptShortType +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: Yes +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 100 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - cJSON_ArrayForEach +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^' + Priority: 1 + - Regex: '^' + Priority: 1 + - Regex: '^<.*\.h>' + Priority: 2 + - Regex: '^<.*' + Priority: 3 + - Regex: '.*' + Priority: 4 +IncludeIsMainRegex: '([-_](test|unittest))?$' +IndentCaseLabels: true +IndentPPDirectives: None +IndentWidth: 4 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Left +RawStringFormats: + - Language: Cpp + Delimiters: + - cc + - CC + - cpp + - Cpp + - CPP + - 'c++' + - 'C++' + CanonicalDelimiter: '' + BasedOnStyle: google +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Latest +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +UseTab: Never \ No newline at end of file diff --git a/frontend/.github/ISSUE_TEMPLATE/01_build_install_bug.yml b/frontend/.github/ISSUE_TEMPLATE/01_build_install_bug.yml new file mode 100644 index 0000000..d3489e2 --- /dev/null +++ b/frontend/.github/ISSUE_TEMPLATE/01_build_install_bug.yml @@ -0,0 +1,103 @@ +name: Installation or build bug report +description: Report installation or build bugs +labels: ['bug'] +body: + - type: checkboxes + id: checklist + attributes: + label: Answers checklist. + description: Before submitting a new issue, please follow the checklist and try to find the answer. + options: + - label: I have read the documentation [XiaoZhi AI Programming Guide](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb) and the issue is not addressed there. + required: true + - label: I have updated my branch (master or release) to the latest version and checked that the issue is present there. + required: true + - label: I have searched the issue tracker for a similar issue and not found a similar issue. + required: true + - type: input + id: xiaozhi_ai_version + attributes: + label: XiaoZhi AI version. + description: On which XiaoZhi AI version does this issue occur on? Run `git describe --tags` to find it. + placeholder: ex. v1.1.0-44-g140aab8 + validations: + required: true + - type: dropdown + id: operating_system + attributes: + label: Operating System used. + multiple: false + options: + - Windows + - Linux + - macOS + validations: + required: true + - type: dropdown + id: build + attributes: + label: How did you build your project? + multiple: false + options: + - Command line with CMake + - Command line with idf.py + - CLion IDE + - VS Code IDE/Cursor + - Other (please specify in More Information) + validations: + required: true + - type: dropdown + id: windows_comand_line + attributes: + label: If you are using Windows, please specify command line type. + multiple: false + options: + - PowerShell + - CMD + validations: + required: false + - type: textarea + id: expected + attributes: + label: What is the expected behavior? + description: Please provide a clear and concise description of the expected behavior. + placeholder: I expected it to... + validations: + required: true + - type: textarea + id: actual + attributes: + label: What is the actual behavior? + description: Please describe actual behavior. + placeholder: Instead it... + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce. + description: 'How do you trigger this bug? Please walk us through it step by step. If this is build bug, please attach sdkconfig file (from your project folder). Please attach your code here.' + value: | + 1. Step + 2. Step + 3. Step + ... + validations: + required: true + - type: textarea + id: debug_logs + attributes: + label: Build or installation Logs. + description: Build or installation log goes here, should contain the backtrace, as well as the reset source if it is a crash. + placeholder: Your log goes here. + render: plain + validations: + required: false + - type: textarea + id: more-info + attributes: + label: More Information. + description: Do you have any other information from investigating this? + placeholder: ex. Any more. + validations: + required: false \ No newline at end of file diff --git a/frontend/.github/ISSUE_TEMPLATE/02_runtime_bug.yml b/frontend/.github/ISSUE_TEMPLATE/02_runtime_bug.yml new file mode 100644 index 0000000..60a62f8 --- /dev/null +++ b/frontend/.github/ISSUE_TEMPLATE/02_runtime_bug.yml @@ -0,0 +1,115 @@ +name: Runtime bug report +description: Report runtime bugs +labels: ['bug'] +body: + - type: checkboxes + id: checklist + attributes: + label: Answers checklist. + description: Before submitting a new issue, please follow the checklist and try to find the answer. + options: + - label: I have read the documentation [XiaoZhi AI Programming Guide](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb) and the issue is not addressed there. + required: true + - label: I have updated my firmware to the latest version and checked that the issue is present there. + required: true + - label: I have searched the issue tracker for a similar issue and not found a similar issue. + required: true + - type: input + id: xiaozhi_ai_firmware_version + attributes: + label: XiaoZhi AI firmware version. + description: On which firmware version does this issue occur on? + placeholder: ex. v1.2.1_bread-compact-wifi + validations: + required: true + - type: dropdown + id: operating_system + attributes: + label: Operating System used. + multiple: false + options: + - Windows + - Linux + - macOS + validations: + required: true + - type: dropdown + id: build + attributes: + label: How did you build your project? + multiple: false + options: + - Command line with CMake + - Command line with idf.py + - CLion IDE + - VS Code IDE/Cursor + - Other (please specify in More Information) + validations: + required: true + - type: dropdown + id: windows_comand_line + attributes: + label: If you are using Windows, please specify command line type. + multiple: false + options: + - PowerShell + - CMD + validations: + required: false + - type: dropdown + id: power_supply + attributes: + label: Power Supply used. + multiple: false + options: + - USB + - External 5V + - External 3.3V + - Battery + validations: + required: true + - type: textarea + id: expected + attributes: + label: What is the expected behavior? + description: Please provide a clear and concise description of the expected behavior. + placeholder: I expected it to... + validations: + required: true + - type: textarea + id: actual + attributes: + label: What is the actual behavior? + description: Please describe actual behavior. + placeholder: Instead it... + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce. + description: 'How do you trigger this bug? Please walk us through it step by step. Please attach your code here.' + value: | + 1. Step + 2. Step + 3. Step + ... + validations: + required: true + - type: textarea + id: debug_logs + attributes: + label: Debug Logs. + description: Debug log goes here, should contain the backtrace, as well as the reset source if it is a crash. + placeholder: Your log goes here. + render: plain + validations: + required: false + - type: textarea + id: more-info + attributes: + label: More Information. + description: Do you have any other information from investigating this? + placeholder: ex. Any more. + validations: + required: false \ No newline at end of file diff --git a/frontend/.github/ISSUE_TEMPLATE/03_feature_request.yml b/frontend/.github/ISSUE_TEMPLATE/03_feature_request.yml new file mode 100644 index 0000000..79cb921 --- /dev/null +++ b/frontend/.github/ISSUE_TEMPLATE/03_feature_request.yml @@ -0,0 +1,34 @@ +name: Feature request +description: Suggest an idea for this project. +labels: ['enhancement'] +body: + - type: markdown + attributes: + value: | + * We welcome any ideas or feature requests! It’s helpful if you can explain exactly why the feature would be useful. + * There are usually some outstanding feature requests in the [existing issues list](https://github.com/78/xiaozhi-esp32/labels/enhancement), feel free to add comments to them. + * If you would like to contribute, please read the [contributions guide](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb). + - type: textarea + id: problem-related + attributes: + label: Is your feature request related to a problem? + description: Please provide a clear and concise description of what the problem is. + placeholder: ex. I'm always frustrated when ... + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like. + description: Please provide a clear and concise description of what you want to happen. + placeholder: ex. When using XiaoZhi ... + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered. + description: Please provide a clear and concise description of any alternative solutions or features you've considered. + placeholder: ex. Choosing other approach wouldn't work, because ... + - type: textarea + id: context + attributes: + label: Additional context. + description: Please add any other context or screenshots about the feature request here. + placeholder: ex. This would work only when ... \ No newline at end of file diff --git a/frontend/.github/ISSUE_TEMPLATE/config.yml b/frontend/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..d663ce7 --- /dev/null +++ b/frontend/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: 小智 AI 官方网站 + url: https://xiaozhi.me/ + about: 激活设备、配置 AI、声纹识别、声音克隆等应有尽有,DIY 属于你自己的小智 + - name: 小智 AI 聊天机器人百科全书 + url: https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb + about: 开发文档、硬件制作、烧录教程、FAQ尽在小智百科 \ No newline at end of file diff --git a/frontend/.github/workflows/build.yml b/frontend/.github/workflows/build.yml new file mode 100644 index 0000000..e559641 --- /dev/null +++ b/frontend/.github/workflows/build.yml @@ -0,0 +1,111 @@ +name: Build Boards + +on: + push: + branches: + - main + - ci/* # for ci test + pull_request: + branches: + - main + +permissions: + contents: read + +jobs: + prepare: + name: Determine variants to build + runs-on: ubuntu-latest + outputs: + variants: ${{ steps.select.outputs.variants }} + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Install jq + run: sudo apt-get update && sudo apt-get install -y jq + + - id: list + name: Get all variant list + run: | + echo "all_variants=$(python scripts/release.py --list-boards --json)" >> $GITHUB_OUTPUT + + - id: select + name: Select variants based on changes + env: + ALL_VARIANTS: ${{ steps.list.outputs.all_variants }} + run: | + EVENT_NAME="${{ github.event_name }}" + + # push 到 main 分支,编译全部变体 + if [[ "$EVENT_NAME" == "push" ]]; then + echo "variants=$ALL_VARIANTS" >> $GITHUB_OUTPUT + exit 0 + fi + + # pull_request 场景 + BASE_SHA="${{ github.event.pull_request.base.sha }}" + HEAD_SHA="${{ github.event.pull_request.head.sha }}" + echo "Base: $BASE_SHA, Head: $HEAD_SHA" + + CHANGED=$(git diff --name-only $BASE_SHA $HEAD_SHA || true) + echo -e "Changed files:\n$CHANGED" + + NEED_ALL=0 + declare -A AFFECTED + while IFS= read -r file; do + if [[ "$file" == main/* && "$file" != main/boards/* ]]; then + NEED_ALL=1 + fi + + if [[ "$file" == main/boards/common/* ]]; then + NEED_ALL=1 + fi + + if [[ "$file" == main/boards/* ]]; then + board=$(echo "$file" | cut -d '/' -f3) + AFFECTED[$board]=1 + fi + done <<< "$CHANGED" + + if [[ "$NEED_ALL" -eq 1 ]]; then + echo "variants=$ALL_VARIANTS" >> $GITHUB_OUTPUT + else + if [[ ${#AFFECTED[@]} -eq 0 ]]; then + echo "variants=[]" >> $GITHUB_OUTPUT + else + BOARDS_JSON=$(printf '%s\n' "${!AFFECTED[@]}" | sort -u | jq -R -s -c 'split("\n")[:-1]') + FILTERED=$(echo "$ALL_VARIANTS" | jq -c --argjson boards "$BOARDS_JSON" 'map(select(.board as $b | $boards | index($b)))') + echo "variants=$FILTERED" >> $GITHUB_OUTPUT + fi + fi + + build: + name: Build ${{ matrix.full_name }} + needs: prepare + if: ${{ needs.prepare.outputs.variants != '[]' }} + strategy: + fail-fast: false # 单个变体失败不影响其它变体 + matrix: + include: ${{ fromJson(needs.prepare.outputs.variants) }} + runs-on: ubuntu-latest + container: + image: espressif/idf:v5.5.2 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Build current variant + shell: bash + run: | + source $IDF_PATH/export.sh + python scripts/release.py ${{ matrix.board }} --name ${{ matrix.name }} + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: xiaozhi_${{ matrix.full_name }}_${{ github.sha }} + path: build/merged-binary.bin + if-no-files-found: error diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..5326d47 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,20 @@ +tmp/ +components/ +managed_components/ +build/ +dist/ +.vscode/ +.devcontainer/ +sdkconfig.old +sdkconfig +dependencies.lock +.env +releases/ +main/assets/lang_config.h +main/mmap_generate_emoji.h +.DS_Store +.cache +*.pyc +*.bin +mmap_generate_*.h +.clangd diff --git a/frontend/CMakeLists.txt b/frontend/CMakeLists.txt new file mode 100755 index 0000000..8681fa4 --- /dev/null +++ b/frontend/CMakeLists.txt @@ -0,0 +1,13 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +# Add this line to disable the specific warning +add_compile_options(-Wno-missing-field-initializers) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# "Trim" the build. Include the minimal set of components, main, and anything it depends on. +idf_build_set_property(MINIMAL_BUILD ON) + +set(PROJECT_VER "2.2.5") +project(xiaozhi) diff --git a/frontend/LICENSE b/frontend/LICENSE new file mode 100644 index 0000000..e90b554 --- /dev/null +++ b/frontend/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2025 Shenzhen Xinzhi Future Technology Co., Ltd. +Copyright (c) 2025 Project Contributors + +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/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..de296d1 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,173 @@ +# An MCP-based Chatbot + +(English | [中文](README_zh.md) | [日本語](README_ja.md)) + +## Introduction + +👉 [Human: Give AI a camera vs AI: Instantly finds out the owner hasn't washed hair for three days【bilibili】](https://www.bilibili.com/video/BV1bpjgzKEhd/) + +👉 [Handcraft your AI girlfriend, beginner's guide【bilibili】](https://www.bilibili.com/video/BV1XnmFYLEJN/) + +As a voice interaction entry, the XiaoZhi AI chatbot leverages the AI capabilities of large models like Qwen / DeepSeek, and achieves multi-terminal control via the MCP protocol. + +Control everything via MCP + +## Version Notes + +The current v2 version is incompatible with the v1 partition table, so it is not possible to upgrade from v1 to v2 via OTA. For partition table details, see [partitions/v2/README.md](partitions/v2/README.md). + +All hardware running v1 can be upgraded to v2 by manually flashing the firmware. + +The stable version of v1 is 1.9.2. You can switch to v1 by running `git checkout v1`. The v1 branch will be maintained until February 2026. + +### Features Implemented + +- Wi-Fi / ML307 Cat.1 4G +- Offline voice wake-up [ESP-SR](https://github.com/espressif/esp-sr) +- Supports two communication protocols ([Websocket](docs/websocket.md) or MQTT+UDP) +- Uses OPUS audio codec +- Voice interaction based on streaming ASR + LLM + TTS architecture +- Speaker recognition, identifies the current speaker [3D Speaker](https://github.com/modelscope/3D-Speaker) +- OLED / LCD display, supports emoji display +- Battery display and power management +- Multi-language support (Chinese, English, Japanese) +- Supports ESP32-C3, ESP32-S3, ESP32-P4 chip platforms +- Device-side MCP for device control (Speaker, LED, Servo, GPIO, etc.) +- Cloud-side MCP to extend large model capabilities (smart home control, PC desktop operation, knowledge search, email, etc.) +- Customizable wake words, fonts, emojis, and chat backgrounds with online web-based editing ([Custom Assets Generator](https://github.com/78/xiaozhi-assets-generator)) + +## Hardware + +### Breadboard DIY Practice + +See the Feishu document tutorial: + +👉 ["XiaoZhi AI Chatbot Encyclopedia"](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb?from=from_copylink) + +Breadboard demo: + +![Breadboard Demo](docs/v1/wiring2.jpg) + +### Supports 70+ Open Source Hardware (Partial List) + +- LiChuang ESP32-S3 Development Board +- Espressif ESP32-S3-BOX3 +- M5Stack CoreS3 +- M5Stack AtomS3R + Echo Base +- Magic Button 2.4 +- Waveshare ESP32-S3-Touch-AMOLED-1.8 +- LILYGO T-Circle-S3 +- XiaGe Mini C3 +- CuiCan AI Pendant +- WMnologo-Xingzhi-1.54TFT +- SenseCAP Watcher +- ESP-HI Low Cost Robot Dog + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +## Software + +### Firmware Flashing + +For beginners, it is recommended to use the firmware that can be flashed without setting up a development environment. + +The firmware connects to the official [xiaozhi.me](https://xiaozhi.me) server by default. Personal users can register an account to use the Qwen real-time model for free. + +👉 [Beginner's Firmware Flashing Guide](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS) + +### Development Environment + +- Cursor or VSCode +- Install ESP-IDF plugin, select SDK version 5.4 or above +- Linux is better than Windows for faster compilation and fewer driver issues +- This project uses Google C++ code style, please ensure compliance when submitting code + +### Developer Documentation + +- [Custom Board Guide](docs/custom-board.md) - Learn how to create custom boards for XiaoZhi AI +- [MCP Protocol IoT Control Usage](docs/mcp-usage.md) - Learn how to control IoT devices via MCP protocol +- [MCP Protocol Interaction Flow](docs/mcp-protocol.md) - Device-side MCP protocol implementation +- [MQTT + UDP Hybrid Communication Protocol Document](docs/mqtt-udp.md) +- [A detailed WebSocket communication protocol document](docs/websocket.md) + +## Large Model Configuration + +If you already have a XiaoZhi AI chatbot device and have connected to the official server, you can log in to the [xiaozhi.me](https://xiaozhi.me) console for configuration. + +👉 [Backend Operation Video Tutorial (Old Interface)](https://www.bilibili.com/video/BV1jUCUY2EKM/) + +## Related Open Source Projects + +For server deployment on personal computers, refer to the following open-source projects: + +- [xinnan-tech/xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) Python server +- [joey-zhou/xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) Java server +- [AnimeAIChat/xiaozhi-server-go](https://github.com/AnimeAIChat/xiaozhi-server-go) Golang server +- [hackers365/xiaozhi-esp32-server-golang](https://github.com/hackers365/xiaozhi-esp32-server-golang) Golang server + +Other client projects using the XiaoZhi communication protocol: + +- [huangjunsen0406/py-xiaozhi](https://github.com/huangjunsen0406/py-xiaozhi) Python client +- [TOM88812/xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) Android client +- [100askTeam/xiaozhi-linux](http://github.com/100askTeam/xiaozhi-linux) Linux client by 100ask +- [78/xiaozhi-sf32](https://github.com/78/xiaozhi-sf32) Bluetooth chip firmware by Sichuan +- [QuecPython/solution-xiaozhiAI](https://github.com/QuecPython/solution-xiaozhiAI) QuecPython firmware by Quectel + +Custom Assets Tools: + +- [78/xiaozhi-assets-generator](https://github.com/78/xiaozhi-assets-generator) Custom Assets Generator (Wake words, fonts, emojis, backgrounds) + +## About the Project + +This is an open-source ESP32 project, released under the MIT license, allowing anyone to use it for free, including for commercial purposes. + +We hope this project helps everyone understand AI hardware development and apply rapidly evolving large language models to real hardware devices. + +If you have any ideas or suggestions, please feel free to raise Issues or join our [Discord](https://discord.gg/C759fGMBcZ) or QQ group: 994694848 + +## Star History + + + + + + Star History Chart + + \ No newline at end of file diff --git a/frontend/README_ja.md b/frontend/README_ja.md new file mode 100644 index 0000000..d052162 --- /dev/null +++ b/frontend/README_ja.md @@ -0,0 +1,169 @@ +# MCP ベースのチャットボット + +(日本語 | [中文](README_zh.md) | [English](README.md)) + +## はじめに + +👉 [人間:AIにカメラを装着 vs AI:その場で飼い主が3日間髪を洗っていないことを発見【bilibili】](https://www.bilibili.com/video/BV1bpjgzKEhd/) + +👉 [手作りでAIガールフレンドを作る、初心者入門チュートリアル【bilibili】](https://www.bilibili.com/video/BV1XnmFYLEJN/) + +シャオジーAIチャットボットは音声インタラクションの入口として、Qwen / DeepSeekなどの大規模モデルのAI能力を活用し、MCPプロトコルを通じてマルチエンド制御を実現します。 + +MCPであらゆるものを制御 + +## バージョンノート + +現在のv2バージョンはv1パーティションテーブルと互換性がないため、v1からv2へOTAでアップグレードすることはできません。パーティションテーブルの詳細については、[partitions/v2/README.md](partitions/v2/README.md)をご参照ください。 + +v1を実行しているすべてのハードウェアは、ファームウェアを手動で書き込むことでv2にアップグレードできます。 + +v1の安定版は1.9.2です。`git checkout v1`でv1に切り替えることができます。v1ブランチは2026年2月まで継続的にメンテナンスされます。 + +### 実装済み機能 + +- Wi-Fi / ML307 Cat.1 4G +- オフライン音声ウェイクアップ [ESP-SR](https://github.com/espressif/esp-sr) +- 2種類の通信プロトコルに対応([Websocket](docs/websocket.md) または MQTT+UDP) +- OPUSオーディオコーデックを採用 +- ストリーミングASR + LLM + TTSアーキテクチャに基づく音声インタラクション +- 話者認識、現在話している人を識別 [3D Speaker](https://github.com/modelscope/3D-Speaker) +- OLED / LCDディスプレイ、表情表示対応 +- バッテリー表示と電源管理 +- 多言語対応(中国語、英語、日本語) +- ESP32-C3、ESP32-S3、ESP32-P4チッププラットフォーム対応 +- デバイス側MCPによるデバイス制御(音量・明るさ調整、アクション制御など) +- クラウド側MCPで大規模モデル能力を拡張(スマートホーム制御、PCデスクトップ操作、知識検索、メール送受信など) +- カスタマイズ可能なウェイクワード、フォント、絵文字、チャット背景、オンラインWeb編集に対応 ([カスタムアセットジェネレーター](https://github.com/78/xiaozhi-assets-generator)) + +## ハードウェア + +### ブレッドボード手作り実践 + +Feishuドキュメントチュートリアルをご覧ください: + +👉 [「シャオジーAIチャットボット百科事典」](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb?from=from_copylink) + +ブレッドボードのデモ: + +![ブレッドボードデモ](docs/v1/wiring2.jpg) + +### 70種類以上のオープンソースハードウェアに対応(一部のみ表示) + +- 立創・実戦派 ESP32-S3 開発ボード +- 楽鑫 ESP32-S3-BOX3 +- M5Stack CoreS3 +- M5Stack AtomS3R + Echo Base +- マジックボタン2.4 +- 微雪電子 ESP32-S3-Touch-AMOLED-1.8 +- LILYGO T-Circle-S3 +- エビ兄さん Mini C3 +- CuiCan AIペンダント +- 無名科技Nologo-星智-1.54TFT +- SenseCAP Watcher +- ESP-HI 超低コストロボット犬 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +## ソフトウェア + +### ファームウェア書き込み + +初心者の方は、まず開発環境を構築せずに書き込み可能なファームウェアを使用することをおすすめします。 + +ファームウェアはデフォルトで公式 [xiaozhi.me](https://xiaozhi.me) サーバーに接続します。個人ユーザーはアカウント登録でQwenリアルタイムモデルを無料で利用できます。 + +👉 [初心者向けファームウェア書き込みガイド](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS) + +### 開発環境 + +- Cursor または VSCode +- ESP-IDFプラグインをインストールし、SDKバージョン5.4以上を選択 +- LinuxはWindowsよりも優れており、コンパイルが速く、ドライバの問題も少ない +- 本プロジェクトはGoogle C++コードスタイルを採用、コード提出時は準拠を確認してください + +### 開発者ドキュメント + +- [カスタム開発ボードガイド](docs/custom-board.md) - シャオジーAI用のカスタム開発ボード作成方法 +- [MCPプロトコルIoT制御使用法](docs/mcp-usage.md) - MCPプロトコルでIoTデバイスを制御する方法 +- [MCPプロトコルインタラクションフロー](docs/mcp-protocol.md) - デバイス側MCPプロトコルの実装方法 +- [MQTT + UDP ハイブリッド通信プロトコルドキュメント](docs/mqtt-udp.md) +- [詳細なWebSocket通信プロトコルドキュメント](docs/websocket.md) + +## 大規模モデル設定 + +すでにシャオジーAIチャットボットデバイスをお持ちで、公式サーバーに接続済みの場合は、[xiaozhi.me](https://xiaozhi.me) コンソールで設定できます。 + +👉 [バックエンド操作ビデオチュートリアル(旧インターフェース)](https://www.bilibili.com/video/BV1jUCUY2EKM/) + +## 関連オープンソースプロジェクト + +個人PCでサーバーをデプロイする場合は、以下のオープンソースプロジェクトを参照してください: + +- [xinnan-tech/xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) Pythonサーバー +- [joey-zhou/xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) Javaサーバー +- [AnimeAIChat/xiaozhi-server-go](https://github.com/AnimeAIChat/xiaozhi-server-go) Golangサーバー +- [hackers365/xiaozhi-esp32-server-golang](https://github.com/hackers365/xiaozhi-esp32-server-golang) Golangサーバー + +シャオジー通信プロトコルを利用した他のクライアントプロジェクト: + +- [huangjunsen0406/py-xiaozhi](https://github.com/huangjunsen0406/py-xiaozhi) Pythonクライアント +- [TOM88812/xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) Androidクライアント +- [100askTeam/xiaozhi-linux](http://github.com/100askTeam/xiaozhi-linux) 百問科技提供のLinuxクライアント +- [78/xiaozhi-sf32](https://github.com/78/xiaozhi-sf32) 思澈科技のBluetoothチップファームウェア +- [QuecPython/solution-xiaozhiAI](https://github.com/QuecPython/solution-xiaozhiAI) 移遠提供のQuecPythonファームウェア + +## プロジェクトについて + +これはエビ兄さんがオープンソースで公開しているESP32プロジェクトで、MITライセンスのもと、誰でも無料で、商用利用も可能です。 + +このプロジェクトを通じて、AIハードウェア開発を理解し、急速に進化する大規模言語モデルを実際のハードウェアデバイスに応用できるようになることを目指しています。 + +ご意見やご提案があれば、いつでもIssueを提出するか、[Discord](https://discord.gg/C759fGMBcZ) または QQグループ:1011329060 にご参加ください。 + +## スター履歴 + + + + + + Star History Chart + + diff --git a/frontend/README_zh.md b/frontend/README_zh.md new file mode 100644 index 0000000..7921b74 --- /dev/null +++ b/frontend/README_zh.md @@ -0,0 +1,169 @@ +# An MCP-based Chatbot + +(中文 | [English](README.md) | [日本語](README_ja.md)) + +## 介绍 + +👉 [人类:给 AI 装摄像头 vs AI:当场发现主人三天没洗头【bilibili】](https://www.bilibili.com/video/BV1bpjgzKEhd/) + +👉 [手工打造你的 AI 女友,新手入门教程【bilibili】](https://www.bilibili.com/video/BV1XnmFYLEJN/) + +小智 AI 聊天机器人作为一个语音交互入口,利用 Qwen / DeepSeek 等大模型的 AI 能力,通过 MCP 协议实现多端控制。 + +通过MCP控制万物 + +### 版本说明 + +当前 v2 版本与 v1 版本分区表不兼容,所以无法从 v1 版本通过 OTA 升级到 v2 版本。分区表说明参见 [partitions/v2/README.md](partitions/v2/README.md)。 + +使用 v1 版本的所有硬件,可以通过手动烧录固件来升级到 v2 版本。 + +v1 的稳定版本为 1.9.2,可以通过 `git checkout v1` 来切换到 v1 版本,该分支会持续维护到 2026 年 2 月。 + +### 已实现功能 + +- Wi-Fi / ML307 Cat.1 4G +- 离线语音唤醒 [ESP-SR](https://github.com/espressif/esp-sr) +- 支持两种通信协议([Websocket](docs/websocket.md) 或 MQTT+UDP) +- 采用 OPUS 音频编解码 +- 基于流式 ASR + LLM + TTS 架构的语音交互 +- 声纹识别,识别当前说话人的身份 [3D Speaker](https://github.com/modelscope/3D-Speaker) +- OLED / LCD 显示屏,支持表情显示 +- 电量显示与电源管理 +- 支持多语言(中文、英文、日文) +- 支持 ESP32-C3、ESP32-S3、ESP32-P4 芯片平台 +- 通过设备端 MCP 实现设备控制(音量、灯光、电机、GPIO 等) +- 通过云端 MCP 扩展大模型能力(智能家居控制、PC桌面操作、知识搜索、邮件收发等) +- 自定义唤醒词、字体、表情与聊天背景,支持网页端在线修改 ([自定义Assets生成器](https://github.com/78/xiaozhi-assets-generator)) + +## 硬件 + +### 面包板手工制作实践 + +详见飞书文档教程: + +👉 [《小智 AI 聊天机器人百科全书》](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb?from=from_copylink) + +面包板效果图如下: + +![面包板效果图](docs/v1/wiring2.jpg) + +### 支持 70 多个开源硬件(仅展示部分) + +- 立创·实战派 ESP32-S3 开发板 +- 乐鑫 ESP32-S3-BOX3 +- M5Stack CoreS3 +- M5Stack AtomS3R + Echo Base +- 神奇按钮 2.4 +- 微雪电子 ESP32-S3-Touch-AMOLED-1.8 +- LILYGO T-Circle-S3 +- 虾哥 Mini C3 +- 璀璨·AI 吊坠 +- 无名科技 Nologo-星智-1.54TFT +- SenseCAP Watcher +- ESP-HI 超低成本机器狗 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +## 软件 + +### 固件烧录 + +新手第一次操作建议先不要搭建开发环境,直接使用免开发环境烧录的固件。 + +固件默认接入 [xiaozhi.me](https://xiaozhi.me) 官方服务器,个人用户注册账号可以免费使用 Qwen 实时模型。 + +👉 [新手烧录固件教程](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS) + +### 开发环境 + +- Cursor 或 VSCode +- 安装 ESP-IDF 插件,选择 SDK 版本 5.4 或以上 +- Linux 比 Windows 更好,编译速度快,也免去驱动问题的困扰 +- 本项目使用 Google C++ 代码风格,提交代码时请确保符合规范 + +### 开发者文档 + +- [自定义开发板指南](docs/custom-board.md) - 学习如何为小智 AI 创建自定义开发板 +- [MCP 协议物联网控制用法说明](docs/mcp-usage.md) - 了解如何通过 MCP 协议控制物联网设备 +- [MCP 协议交互流程](docs/mcp-protocol.md) - 设备端 MCP 协议的实现方式 +- [MQTT + UDP 混合通信协议文档](docs/mqtt-udp.md) +- [一份详细的 WebSocket 通信协议文档](docs/websocket.md) + +## 大模型配置 + +如果你已经拥有一个小智 AI 聊天机器人设备,并且已接入官方服务器,可以登录 [xiaozhi.me](https://xiaozhi.me) 控制台进行配置。 + +👉 [后台操作视频教程(旧版界面)](https://www.bilibili.com/video/BV1jUCUY2EKM/) + +## 相关开源项目 + +在个人电脑上部署服务器,可以参考以下第三方开源的项目: + +- [xinnan-tech/xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) Python 服务器 +- [joey-zhou/xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) Java 服务器 +- [AnimeAIChat/xiaozhi-server-go](https://github.com/AnimeAIChat/xiaozhi-server-go) Golang 服务器 +- [hackers365/xiaozhi-esp32-server-golang](https://github.com/hackers365/xiaozhi-esp32-server-golang) Golang 服务器 + +使用小智通信协议的第三方客户端项目: + +- [huangjunsen0406/py-xiaozhi](https://github.com/huangjunsen0406/py-xiaozhi) Python 客户端 +- [TOM88812/xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) Android 客户端 +- [100askTeam/xiaozhi-linux](http://github.com/100askTeam/xiaozhi-linux) 百问科技提供的 Linux 客户端 +- [78/xiaozhi-sf32](https://github.com/78/xiaozhi-sf32) 思澈科技的蓝牙芯片固件 +- [QuecPython/solution-xiaozhiAI](https://github.com/QuecPython/solution-xiaozhiAI) 移远提供的 QuecPython 固件 + +## 关于项目 + +这是一个由虾哥开源的 ESP32 项目,以 MIT 许可证发布,允许任何人免费使用,修改或用于商业用途。 + +我们希望通过这个项目,能够帮助大家了解 AI 硬件开发,将当下飞速发展的大语言模型应用到实际的硬件设备中。 + +如果你有任何想法或建议,请随时提出 Issues 或加入 [Discord](https://discord.gg/C759fGMBcZ) 或 QQ 群:1011329060 + +## Star History + + + + + + Star History Chart + + diff --git a/frontend/docs/blufi.md b/frontend/docs/blufi.md new file mode 100644 index 0000000..992872d --- /dev/null +++ b/frontend/docs/blufi.md @@ -0,0 +1,37 @@ +# BluFi 配网(集成 esp-wifi-connect) + +本文档说明如何在小智固件中启用和使用 BluFi(BLE Wi‑Fi 配网),并结合项目内置的 `esp-wifi-connect` 组件完成 Wi‑Fi 连接与存储。官方 +BluFi +协议说明请参考 [Espressif 文档](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/ble/blufi.html)。 + +## 前置条件 + +- 需要支持 BLE 的芯片与固件配置。 +- 在 `idf.py menuconfig` 中启用 `WiFi Configuration Method -> Esp Blufi`(`CONFIG_USE_ESP_BLUFI_WIFI_PROVISIONING=y` + )。如果想使用 BluFi,必须关闭同一菜单下的 Hotspot 选项,否则默认使用 Hotspot 配网模式。 + +- 保持默认的 NVS 与事件循环初始化(项目的 `app_main` 已处理)。 +- CONFIG_BT_BLUEDROID_ENABLED、CONFIG_BT_NIMBLE_ENABLED这两个宏应二选一,不能同时启用。 +## 工作流程 + +1) 手机端通过 BluFi(如官方 EspBlufi App 或自研客户端)连接设备,发送 Wi‑Fi SSID/密码,手机端可以通过blufi协议获取设备端扫描到的WiFi列表。 +2) 设备侧在 `ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP` 中将凭据写入 `SsidManager`(存储到 NVS,属于 `esp-wifi-connect` 组件)。 +3) 随后启动 `WifiStation` 扫描并连接;状态通过 BluFi 返回。 +4) 配网成功后设备会自动连接新 Wi‑Fi;失败则返回失败状态。 + +## 使用步骤 + +1. 配置:在 menuconfig 开启 `Esp Blufi`。编译并烧录固件。 +2. 触发配网:设备首次启动且没有已保存的 Wi‑Fi 时会自动进入配网。 +3. 手机端操作:打开 EspBlufi App(或其他 BluFi 客户端),搜索并连接设备,可以选择是否加密,按提示输入 Wi‑Fi SSID/密码并发送。 +4. 观察结果: + - 成功:BluFi 报告连接成功,设备自动连接 Wi‑Fi。 + - 失败:BluFi 返回失败状态,可重新发送或检查路由器。 + +## 注意事项 + +- BluFi 配网不支持与热点配网同时开启。如果热点配网已经启动,则默认使用热点配网。请在 menuconfig 中只保留一种配网方式。 +- 若多次测试,建议清除或覆盖存储的 SSID(`wifi` 命名空间),避免旧配置干扰。 +- 如果使用自定义 BluFi 客户端,需遵循官方协议帧格式,参考上文官方文档链接。 +- 官方文档中已提供EspBlufi APP下载地址 +- 由于IDF5.5.2的blufi接口发生变化,5.5.2版本编译后蓝牙名称为"Xiaozhi-Blufi",5.5.1版本中蓝牙名称为"BLUFI_DEVICE" diff --git a/frontend/docs/code_style.md b/frontend/docs/code_style.md new file mode 100644 index 0000000..e096762 --- /dev/null +++ b/frontend/docs/code_style.md @@ -0,0 +1,91 @@ +# 代码风格指南 + +## 代码格式化工具 + +本项目使用 clang-format 工具来统一代码风格。我们已经在项目根目录下提供了 `.clang-format` 配置文件,该配置基于 Google C++ 风格指南,并做了一些自定义调整。 + +### 安装 clang-format + +在使用之前,请确保你已经安装了 clang-format 工具: + +- **Windows**: + ```powershell + winget install LLVM + # 或者使用 Chocolatey + choco install llvm + ``` + +- **Linux**: + ```bash + sudo apt install clang-format # Ubuntu/Debian + sudo dnf install clang-tools-extra # Fedora + ``` + +- **macOS**: + ```bash + brew install clang-format + ``` + +### 使用方法 + +1. **格式化单个文件**: + ```bash + clang-format -i path/to/your/file.cpp + ``` + +2. **格式化整个项目**: + ```bash + # 在项目根目录下执行 + find main -iname *.h -o -iname *.cc | xargs clang-format -i + ``` + +3. **在提交代码前检查格式**: + ```bash + # 检查文件格式是否符合规范(不修改文件) + clang-format --dry-run -Werror path/to/your/file.cpp + ``` + +### IDE 集成 + +- **Visual Studio Code**: + 1. 安装 C/C++ 扩展 + 2. 在设置中启用 `C_Cpp.formatting` 为 `clang-format` + 3. 可以设置保存时自动格式化:`editor.formatOnSave: true` + +- **CLion**: + 1. 在设置中选择 `Editor > Code Style > C/C++` + 2. 将 `Formatter` 设置为 `clang-format` + 3. 选择使用项目中的 `.clang-format` 配置文件 + +### 主要格式规则 + +- 缩进使用 4 个空格 +- 行宽限制为 100 字符 +- 大括号采用 Attach 风格(与控制语句在同一行) +- 指针和引用符号靠左对齐 +- 自动排序头文件包含 +- 类访问修饰符缩进为 -4 空格 + +### 注意事项 + +1. 提交代码前请确保代码已经过格式化 +2. 不要手动调整已格式化的代码对齐 +3. 如果某段代码不希望被格式化,可以使用以下注释包围: + ```cpp + // clang-format off + // 你的代码 + // clang-format on + ``` + +### 常见问题 + +1. **格式化失败**: + - 检查 clang-format 版本是否过低 + - 确认文件编码为 UTF-8 + - 验证 .clang-format 文件语法是否正确 + +2. **与期望格式不符**: + - 检查是否使用了项目根目录下的 .clang-format 配置 + - 确认没有其他位置的 .clang-format 文件被优先使用 + +如有任何问题或建议,欢迎提出 issue 或 pull request。 \ No newline at end of file diff --git a/frontend/docs/custom-board.md b/frontend/docs/custom-board.md new file mode 100644 index 0000000..9e7bd8f --- /dev/null +++ b/frontend/docs/custom-board.md @@ -0,0 +1,453 @@ +# 自定义开发板指南 + +本指南介绍如何为小智AI语音聊天机器人项目定制一个新的开发板初始化程序。小智AI支持70多种ESP32系列开发板,每个开发板的初始化代码都放在对应的目录下。 + +## 重要提示 + +> **警告**: 对于自定义开发板,当IO配置与原有开发板不同时,切勿直接覆盖原有开发板的配置编译固件。必须创建新的开发板类型,或者通过config.json文件中的builds配置不同的name和sdkconfig宏定义来区分。使用 `python scripts/release.py [开发板目录名字]` 来编译打包固件。 +> +> 如果直接覆盖原有配置,将来OTA升级时,您的自定义固件可能会被原有开发板的标准固件覆盖,导致您的设备无法正常工作。每个开发板有唯一的标识和对应的固件升级通道,保持开发板标识的唯一性非常重要。 + +## 目录结构 + +每个开发板的目录结构通常包含以下文件: + +- `xxx_board.cc` - 主要的板级初始化代码,实现了板子相关的初始化和功能 +- `config.h` - 板级配置文件,定义了硬件管脚映射和其他配置项 +- `config.json` - 编译配置,指定目标芯片和特殊的编译选项 +- `README.md` - 开发板相关的说明文档 + +## 定制开发板步骤 + +### 1. 创建新的开发板目录 + +首先在`boards/`目录下创建一个新的目录,命名方式应使用 `[品牌名]-[开发板类型]` 的形式,例如 `m5stack-tab5`: + +```bash +mkdir main/boards/my-custom-board +``` + +### 2. 创建配置文件 + +#### config.h + +在`config.h`中定义所有的硬件配置,包括: + +- 音频采样率和I2S引脚配置 +- 音频编解码芯片地址和I2C引脚配置 +- 按钮和LED引脚配置 +- 显示屏参数和引脚配置 + +参考示例(来自lichuang-c3-dev): + +```c +#ifndef _BOARD_CONFIG_H_ +#define _BOARD_CONFIG_H_ + +#include + +// 音频配置 +#define AUDIO_INPUT_SAMPLE_RATE 24000 +#define AUDIO_OUTPUT_SAMPLE_RATE 24000 + +#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_10 +#define AUDIO_I2S_GPIO_WS GPIO_NUM_12 +#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_8 +#define AUDIO_I2S_GPIO_DIN GPIO_NUM_7 +#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_11 + +#define AUDIO_CODEC_PA_PIN GPIO_NUM_13 +#define AUDIO_CODEC_I2C_SDA_PIN GPIO_NUM_0 +#define AUDIO_CODEC_I2C_SCL_PIN GPIO_NUM_1 +#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR + +// 按钮配置 +#define BOOT_BUTTON_GPIO GPIO_NUM_9 + +// 显示屏配置 +#define DISPLAY_SPI_SCK_PIN GPIO_NUM_3 +#define DISPLAY_SPI_MOSI_PIN GPIO_NUM_5 +#define DISPLAY_DC_PIN GPIO_NUM_6 +#define DISPLAY_SPI_CS_PIN GPIO_NUM_4 + +#define DISPLAY_WIDTH 320 +#define DISPLAY_HEIGHT 240 +#define DISPLAY_MIRROR_X true +#define DISPLAY_MIRROR_Y false +#define DISPLAY_SWAP_XY true + +#define DISPLAY_OFFSET_X 0 +#define DISPLAY_OFFSET_Y 0 + +#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_2 +#define DISPLAY_BACKLIGHT_OUTPUT_INVERT true + +#endif // _BOARD_CONFIG_H_ +``` + +#### config.json + +在`config.json`中定义编译配置,这个文件用于 `scripts/release.py` 脚本自动化编译: + +```json +{ + "target": "esp32s3", // 目标芯片型号: esp32, esp32s3, esp32c3, esp32c6, esp32p4等 + "builds": [ + { + "name": "my-custom-board", // 开发板名称,用于生成固件包 + "sdkconfig_append": [ + // 特别 Flash 大小配置 + "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", + // 特别分区表配置 + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" + ] + } + ] +} +``` + +**配置项说明:** +- `target`: 目标芯片型号,必须与硬件匹配 +- `name`: 编译输出的固件包名称,建议与目录名一致 +- `sdkconfig_append`: 额外的 sdkconfig 配置项数组,会追加到默认配置中 + +**常用的 sdkconfig_append 配置:** +```json +// Flash 大小 +"CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y" // 4MB Flash +"CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y" // 8MB Flash +"CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y" // 16MB Flash + +// 分区表 +"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/4m.csv\"" // 4MB 分区表 +"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" // 8MB 分区表 +"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/16m.csv\"" // 16MB 分区表 + +// 语言配置 +"CONFIG_LANGUAGE_EN_US=y" // 英语 +"CONFIG_LANGUAGE_ZH_CN=y" // 简体中文 + +// 唤醒词配置 +"CONFIG_USE_DEVICE_AEC=y" // 启用设备端 AEC +"CONFIG_WAKE_WORD_DISABLED=y" // 禁用唤醒词 +``` + +### 3. 编写板级初始化代码 + +创建一个`my_custom_board.cc`文件,实现开发板的所有初始化逻辑。 + +一个基本的开发板类定义包含以下几个部分: + +1. **类定义**:继承自`WifiBoard`或`Ml307Board` +2. **初始化函数**:包括I2C、显示屏、按钮、IoT等组件的初始化 +3. **虚函数重写**:如`GetAudioCodec()`、`GetDisplay()`、`GetBacklight()`等 +4. **注册开发板**:使用`DECLARE_BOARD`宏注册开发板 + +```cpp +#include "wifi_board.h" +#include "codecs/es8311_audio_codec.h" +#include "display/lcd_display.h" +#include "application.h" +#include "button.h" +#include "config.h" +#include "mcp_server.h" + +#include +#include +#include + +#define TAG "MyCustomBoard" + +class MyCustomBoard : public WifiBoard { +private: + i2c_master_bus_handle_t codec_i2c_bus_; + Button boot_button_; + LcdDisplay* display_; + + // I2C初始化 + void InitializeI2c() { + i2c_master_bus_config_t i2c_bus_cfg = { + .i2c_port = I2C_NUM_0, + .sda_io_num = AUDIO_CODEC_I2C_SDA_PIN, + .scl_io_num = AUDIO_CODEC_I2C_SCL_PIN, + .clk_source = I2C_CLK_SRC_DEFAULT, + .glitch_ignore_cnt = 7, + .intr_priority = 0, + .trans_queue_depth = 0, + .flags = { + .enable_internal_pullup = 1, + }, + }; + ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_)); + } + + // SPI初始化(用于显示屏) + void InitializeSpi() { + spi_bus_config_t buscfg = {}; + buscfg.mosi_io_num = DISPLAY_SPI_MOSI_PIN; + buscfg.miso_io_num = GPIO_NUM_NC; + buscfg.sclk_io_num = DISPLAY_SPI_SCK_PIN; + buscfg.quadwp_io_num = GPIO_NUM_NC; + buscfg.quadhd_io_num = GPIO_NUM_NC; + buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t); + ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO)); + } + + // 按钮初始化 + void InitializeButtons() { + boot_button_.OnClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetDeviceState() == kDeviceStateStarting) { + EnterWifiConfigMode(); + return; + } + app.ToggleChatState(); + }); + } + + // 显示屏初始化(以ST7789为例) + void InitializeDisplay() { + esp_lcd_panel_io_handle_t panel_io = nullptr; + esp_lcd_panel_handle_t panel = nullptr; + + esp_lcd_panel_io_spi_config_t io_config = {}; + io_config.cs_gpio_num = DISPLAY_SPI_CS_PIN; + io_config.dc_gpio_num = DISPLAY_DC_PIN; + io_config.spi_mode = 2; + io_config.pclk_hz = 80 * 1000 * 1000; + io_config.trans_queue_depth = 10; + io_config.lcd_cmd_bits = 8; + io_config.lcd_param_bits = 8; + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &panel_io)); + + esp_lcd_panel_dev_config_t panel_config = {}; + panel_config.reset_gpio_num = GPIO_NUM_NC; + panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB; + panel_config.bits_per_pixel = 16; + ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io, &panel_config, &panel)); + + esp_lcd_panel_reset(panel); + esp_lcd_panel_init(panel); + esp_lcd_panel_invert_color(panel, true); + esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY); + esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y); + + // 创建显示屏对象 + display_ = new SpiLcdDisplay(panel_io, panel, + DISPLAY_WIDTH, DISPLAY_HEIGHT, + DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, + DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); + } + + // MCP Tools 初始化 + void InitializeTools() { + // 参考 MCP 文档 + } + +public: + // 构造函数 + MyCustomBoard() : boot_button_(BOOT_BUTTON_GPIO) { + InitializeI2c(); + InitializeSpi(); + InitializeDisplay(); + InitializeButtons(); + InitializeTools(); + GetBacklight()->SetBrightness(100); + } + + // 获取音频编解码器 + virtual AudioCodec* GetAudioCodec() override { + static Es8311AudioCodec audio_codec( + codec_i2c_bus_, + I2C_NUM_0, + AUDIO_INPUT_SAMPLE_RATE, + AUDIO_OUTPUT_SAMPLE_RATE, + AUDIO_I2S_GPIO_MCLK, + AUDIO_I2S_GPIO_BCLK, + AUDIO_I2S_GPIO_WS, + AUDIO_I2S_GPIO_DOUT, + AUDIO_I2S_GPIO_DIN, + AUDIO_CODEC_PA_PIN, + AUDIO_CODEC_ES8311_ADDR); + return &audio_codec; + } + + // 获取显示屏 + virtual Display* GetDisplay() override { + return display_; + } + + // 获取背光控制 + virtual Backlight* GetBacklight() override { + static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT); + return &backlight; + } +}; + +// 注册开发板 +DECLARE_BOARD(MyCustomBoard); +``` + +### 4. 添加构建系统配置 + +#### 在 Kconfig.projbuild 中添加开发板选项 + +打开 `main/Kconfig.projbuild` 文件,在 `choice BOARD_TYPE` 部分添加新的开发板配置项: + +```kconfig +choice BOARD_TYPE + prompt "Board Type" + default BOARD_TYPE_BREAD_COMPACT_WIFI + help + Board type. 开发板类型 + + # ... 其他开发板选项 ... + + config BOARD_TYPE_MY_CUSTOM_BOARD + bool "My Custom Board (我的自定义开发板)" + depends on IDF_TARGET_ESP32S3 # 根据你的目标芯片修改 +endchoice +``` + +**注意事项:** +- `BOARD_TYPE_MY_CUSTOM_BOARD` 是配置项名称,需要全大写,使用下划线分隔 +- `depends on` 指定了目标芯片类型(如 `IDF_TARGET_ESP32S3`、`IDF_TARGET_ESP32C3` 等) +- 描述文字可以使用中英文 + +#### 在 CMakeLists.txt 中添加开发板配置 + +打开 `main/CMakeLists.txt` 文件,在开发板类型判断部分添加新的配置: + +```cmake +# 在 elseif 链中添加你的开发板配置 +elseif(CONFIG_BOARD_TYPE_MY_CUSTOM_BOARD) + set(BOARD_TYPE "my-custom-board") # 与目录名一致 + set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) # 根据屏幕大小选择合适的字体 + set(BUILTIN_ICON_FONT font_awesome_20_4) + set(DEFAULT_EMOJI_COLLECTION twemoji_64) # 可选,如果需要表情显示 +endif() +``` + +**字体和表情配置说明:** + +根据屏幕分辨率选择合适的字体大小: +- 小屏幕(128x64 OLED):`font_puhui_basic_14_1` / `font_awesome_14_1` +- 中小屏幕(240x240):`font_puhui_basic_16_4` / `font_awesome_16_4` +- 中等屏幕(240x320):`font_puhui_basic_20_4` / `font_awesome_20_4` +- 大屏幕(480x320+):`font_puhui_basic_30_4` / `font_awesome_30_4` + +表情集合选项: +- `twemoji_32` - 32x32 像素表情(小屏幕) +- `twemoji_64` - 64x64 像素表情(大屏幕) + +### 5. 配置和编译 + +#### 方法一:使用 idf.py 手动配置 + +1. **设置目标芯片**(首次配置或更换芯片时): + ```bash + # 对于 ESP32-S3 + idf.py set-target esp32s3 + + # 对于 ESP32-C3 + idf.py set-target esp32c3 + + # 对于 ESP32 + idf.py set-target esp32 + ``` + +2. **清理旧配置**: + ```bash + idf.py fullclean + ``` + +3. **进入配置菜单**: + ```bash + idf.py menuconfig + ``` + + 在菜单中导航到:`Xiaozhi Assistant` -> `Board Type`,选择你的自定义开发板。 + +4. **编译和烧录**: + ```bash + idf.py build + idf.py flash monitor + ``` + +#### 方法二:使用 release.py 脚本(推荐) + +如果你的开发板目录下有 `config.json` 文件,可以使用此脚本自动完成配置和编译: + +```bash +python scripts/release.py my-custom-board +``` + +此脚本会自动: +- 读取 `config.json` 中的 `target` 配置并设置目标芯片 +- 应用 `sdkconfig_append` 中的编译选项 +- 完成编译并打包固件 + +### 6. 创建README.md + +在README.md中说明开发板的特性、硬件要求、编译和烧录步骤: + + +## 常见开发板组件 + +### 1. 显示屏 + +项目支持多种显示屏驱动,包括: +- ST7789 (SPI) +- ILI9341 (SPI) +- SH8601 (QSPI) +- 等... + +### 2. 音频编解码器 + +支持的编解码器包括: +- ES8311 (常用) +- ES7210 (麦克风阵列) +- AW88298 (功放) +- 等... + +### 3. 电源管理 + +一些开发板使用电源管理芯片: +- AXP2101 +- 其他可用的PMIC + +### 4. MCP设备控制 + +可以添加各种MCP工具,让AI能够使用: +- Speaker (扬声器控制) +- Screen (屏幕亮度调节) +- Battery (电池电量读取) +- Light (灯光控制) +- 等... + +## 开发板类继承关系 + +- `Board` - 基础板级类 + - `WifiBoard` - Wi-Fi连接的开发板 + - `Ml307Board` - 使用4G模块的开发板 + - `DualNetworkBoard` - 支持Wi-Fi与4G网络切换的开发板 + +## 开发技巧 + +1. **参考相似的开发板**:如果您的新开发板与现有开发板有相似之处,可以参考现有实现 +2. **分步调试**:先实现基础功能(如显示),再添加更复杂的功能(如音频) +3. **管脚映射**:确保在config.h中正确配置所有管脚映射 +4. **检查硬件兼容性**:确认所有芯片和驱动程序的兼容性 + +## 可能遇到的问题 + +1. **显示屏不正常**:检查SPI配置、镜像设置和颜色反转设置 +2. **音频无输出**:检查I2S配置、PA使能引脚和编解码器地址 +3. **无法连接网络**:检查Wi-Fi凭据和网络配置 +4. **无法与服务器通信**:检查MQTT或WebSocket配置 + +## 参考资料 + +- ESP-IDF 文档: https://docs.espressif.com/projects/esp-idf/ +- LVGL 文档: https://docs.lvgl.io/ +- ESP-SR 文档: https://github.com/espressif/esp-sr \ No newline at end of file diff --git a/frontend/docs/mcp-based-graph.jpg b/frontend/docs/mcp-based-graph.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af81cd27499443c528bd39a72eac67dd225c728e GIT binary patch literal 97848 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:sf2WB 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 XT#jI{_n7)fr)Jt{c-iXLf9wAr@v)z; literal 0 HcmV?d00001 diff --git a/frontend/docs/mcp-protocol.md b/frontend/docs/mcp-protocol.md new file mode 100644 index 0000000..0c8ec90 --- /dev/null +++ b/frontend/docs/mcp-protocol.md @@ -0,0 +1,269 @@ +# MCP (Model Context Protocol) 交互流程 + +NOTICE: AI 辅助生成, 在实现后台服务时, 请参照代码确认细节!! + +本项目中的 MCP 协议用于后台 API(MCP 客户端)与 ESP32 设备(MCP 服务器)之间的通信,以便后台能够发现和调用设备提供的功能(工具)。 + +## 协议格式 + +根据代码 (`main/protocols/protocol.cc`, `main/mcp_server.cc`),MCP 消息是封装在基础通信协议(如 WebSocket 或 MQTT)的消息体中的。其内部结构遵循 [JSON-RPC 2.0](https://www.jsonrpc.org/specification) 规范。 + +整体消息结构示例: + +```json +{ + "session_id": "...", // 会话 ID + "type": "mcp", // 消息类型,固定为 "mcp" + "payload": { // JSON-RPC 2.0 负载 + "jsonrpc": "2.0", + "method": "...", // 方法名 (如 "initialize", "tools/list", "tools/call") + "params": { ... }, // 方法参数 (对于 request) + "id": ..., // 请求 ID (对于 request 和 response) + "result": { ... }, // 方法执行结果 (对于 success response) + "error": { ... } // 错误信息 (对于 error response) + } +} +``` + +其中,`payload` 部分是标准的 JSON-RPC 2.0 消息: + +- `jsonrpc`: 固定的字符串 "2.0"。 +- `method`: 要调用的方法名称 (对于 Request)。 +- `params`: 方法的参数,一个结构化值,通常为对象 (对于 Request)。 +- `id`: 请求的标识符,客户端发送请求时提供,服务器响应时原样返回。用于匹配请求和响应。 +- `result`: 方法成功执行时的结果 (对于 Success Response)。 +- `error`: 方法执行失败时的错误信息 (对于 Error Response)。 + +## 交互流程及发送时机 + +MCP 的交互主要围绕客户端(后台 API)发现和调用设备上的“工具”(Tool)进行。 + +1. **连接建立与能力通告** + + - **时机:** 设备启动并成功连接到后台 API 后。 + - **发送方:** 设备。 + - **消息:** 设备发送基础协议的 "hello" 消息给后台 API,消息中包含设备支持的能力列表,例如通过支持 MCP 协议 (`"mcp": true`)。 + - **示例 (非 MCP 负载,而是基础协议消息):** + ```json + { + "type": "hello", + "version": ..., + "features": { + "mcp": true, + ... + }, + "transport": "websocket", // 或 "mqtt" + "audio_params": { ... }, + "session_id": "..." // 设备收到服务器hello后可能设置 + } + ``` + +2. **初始化 MCP 会话** + + - **时机:** 后台 API 收到设备 "hello" 消息,确认设备支持 MCP 后,通常作为 MCP 会话的第一个请求发送。 + - **发送方:** 后台 API (客户端)。 + - **方法:** `initialize` + - **消息 (MCP payload):** + + ```json + { + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "capabilities": { + // 客户端能力,可选 + + // 摄像头视觉相关 + "vision": { + "url": "...", //摄像头: 图片处理地址(必须是http地址, 不是websocket地址) + "token": "..." // url token + } + + // ... 其他客户端能力 + } + }, + "id": 1 // 请求 ID + } + ``` + + - **设备响应时机:** 设备收到 `initialize` 请求并处理后。 + - **设备响应消息 (MCP payload):** + ```json + { + "jsonrpc": "2.0", + "id": 1, // 匹配请求 ID + "result": { + "protocolVersion": "2024-11-05", + "capabilities": { + "tools": {} // 这里的 tools 似乎不列出详细信息,需要 tools/list + }, + "serverInfo": { + "name": "...", // 设备名称 (BOARD_NAME) + "version": "..." // 设备固件版本 + } + } + } + ``` + +3. **发现设备工具列表** + + - **时机:** 后台 API 需要获取设备当前支持的具体功能(工具)列表及其调用方式时。 + - **发送方:** 后台 API (客户端)。 + - **方法:** `tools/list` + - **消息 (MCP payload):** + ```json + { + "jsonrpc": "2.0", + "method": "tools/list", + "params": { + "cursor": "" // 用于分页,首次请求为空字符串 + }, + "id": 2 // 请求 ID + } + ``` + - **设备响应时机:** 设备收到 `tools/list` 请求并生成工具列表后。 + - **设备响应消息 (MCP payload):** + ```json + { + "jsonrpc": "2.0", + "id": 2, // 匹配请求 ID + "result": { + "tools": [ // 工具对象列表 + { + "name": "self.get_device_status", + "description": "...", + "inputSchema": { ... } // 参数 schema + }, + { + "name": "self.audio_speaker.set_volume", + "description": "...", + "inputSchema": { ... } // 参数 schema + } + // ... 更多工具 + ], + "nextCursor": "..." // 如果列表很大需要分页,这里会包含下一个请求的 cursor 值 + } + } + ``` + - **分页处理:** 如果 `nextCursor` 字段非空,客户端需要再次发送 `tools/list` 请求,并在 `params` 中带上这个 `cursor` 值以获取下一页工具。 + +4. **调用设备工具** + + - **时机:** 后台 API 需要执行设备上的某个具体功能时。 + - **发送方:** 后台 API (客户端)。 + - **方法:** `tools/call` + - **消息 (MCP payload):** + ```json + { + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "self.audio_speaker.set_volume", // 要调用的工具名称 + "arguments": { + // 工具参数,对象格式 + "volume": 50 // 参数名及其值 + } + }, + "id": 3 // 请求 ID + } + ``` + - **设备响应时机:** 设备收到 `tools/call` 请求,执行相应的工具函数后。 + - **设备成功响应消息 (MCP payload):** + ```json + { + "jsonrpc": "2.0", + "id": 3, // 匹配请求 ID + "result": { + "content": [ + // 工具执行结果内容 + { "type": "text", "text": "true" } // 示例:set_volume 返回 bool + ], + "isError": false // 表示成功 + } + } + ``` + - **设备失败响应消息 (MCP payload):** + ```json + { + "jsonrpc": "2.0", + "id": 3, // 匹配请求 ID + "error": { + "code": -32601, // JSON-RPC 错误码,例如 Method not found (-32601) + "message": "Unknown tool: self.non_existent_tool" // 错误描述 + } + } + ``` + +5. **设备主动发送消息 (Notifications)** + - **时机:** 设备内部发生需要通知后台 API 的事件时(例如,状态变化,虽然代码示例中没有明确的工具发送此类消息,但 `Application::SendMcpMessage` 的存在暗示了设备可能主动发送 MCP 消息)。 + - **发送方:** 设备 (服务器)。 + - **方法:** 可能是以 `notifications/` 开头的方法名,或者其他自定义方法。 + - **消息 (MCP payload):** 遵循 JSON-RPC Notification 格式,没有 `id` 字段。 + ```json + { + "jsonrpc": "2.0", + "method": "notifications/state_changed", // 示例方法名 + "params": { + "newState": "idle", + "oldState": "connecting" + } + // 没有 id 字段 + } + ``` + - **后台 API 处理:** 接收到 Notification 后,后台 API 进行相应的处理,但不回复。 + +## 交互图 + +下面是一个简化的交互序列图,展示了主要的 MCP 消息流程: + +```mermaid +sequenceDiagram + participant Device as ESP32 Device + participant BackendAPI as 后台 API (Client) + + Note over Device, BackendAPI: 建立 WebSocket / MQTT 连接 + + Device->>BackendAPI: Hello Message (包含 "mcp": true) + + BackendAPI->>Device: MCP Initialize Request + Note over BackendAPI: method: initialize + Note over BackendAPI: params: { capabilities: ... } + + Device->>BackendAPI: MCP Initialize Response + Note over Device: result: { protocolVersion: ..., serverInfo: ... } + + BackendAPI->>Device: MCP Get Tools List Request + Note over BackendAPI: method: tools/list + Note over BackendAPI: params: { cursor: "" } + + Device->>BackendAPI: MCP Get Tools List Response + Note over Device: result: { tools: [...], nextCursor: ... } + + loop Optional Pagination + BackendAPI->>Device: MCP Get Tools List Request + Note over BackendAPI: method: tools/list + Note over BackendAPI: params: { cursor: "..." } + Device->>BackendAPI: MCP Get Tools List Response + Note over Device: result: { tools: [...], nextCursor: "" } + end + + BackendAPI->>Device: MCP Call Tool Request + Note over BackendAPI: method: tools/call + Note over BackendAPI: params: { name: "...", arguments: { ... } } + + alt Tool Call Successful + Device->>BackendAPI: MCP Tool Call Success Response + Note over Device: result: { content: [...], isError: false } + else Tool Call Failed + Device->>BackendAPI: MCP Tool Call Error Response + Note over Device: error: { code: ..., message: ... } + end + + opt Device Notification + Device->>BackendAPI: MCP Notification + Note over Device: method: notifications/... + Note over Device: params: { ... } + end +``` + +这份文档概述了该项目中 MCP 协议的主要交互流程。具体的参数细节和工具功能需要参考 `main/mcp_server.cc` 中 `McpServer::AddCommonTools` 以及各个工具的实现。 diff --git a/frontend/docs/mcp-usage.md b/frontend/docs/mcp-usage.md new file mode 100644 index 0000000..fa50a39 --- /dev/null +++ b/frontend/docs/mcp-usage.md @@ -0,0 +1,115 @@ +# MCP 协议物联网控制用法说明 + +> 本文档介绍如何基于 MCP 协议实现 ESP32 设备的物联网控制。详细协议流程请参考 [`mcp-protocol.md`](./mcp-protocol.md)。 + +## 简介 + +MCP(Model Context Protocol)是新一代推荐用于物联网控制的协议,通过标准 JSON-RPC 2.0 格式在后台与设备间发现和调用"工具"(Tool),实现灵活的设备控制。 + +## 典型使用流程 + +1. 设备启动后通过基础协议(如 WebSocket/MQTT)与后台建立连接。 +2. 后台通过 MCP 协议的 `initialize` 方法初始化会话。 +3. 后台通过 `tools/list` 获取设备支持的所有工具(功能)及参数说明。 +4. 后台通过 `tools/call` 调用具体工具,实现对设备的控制。 + +详细协议格式与交互请见 [`mcp-protocol.md`](./mcp-protocol.md)。 + +## 设备端工具注册方法说明 + +设备通过 `McpServer::AddTool` 方法注册可被后台调用的"工具"。其常用函数签名如下: + +```cpp +void AddTool( + const std::string& name, // 工具名称,建议唯一且有层次感,如 self.dog.forward + const std::string& description, // 工具描述,简明说明功能,便于大模型理解 + const PropertyList& properties, // 输入参数列表(可为空),支持类型:布尔、整数、字符串 + std::function callback // 工具被调用时的回调实现 +); +``` +- name:工具唯一标识,建议用"模块.功能"命名风格。 +- description:自然语言描述,便于 AI/用户理解。 +- properties:参数列表,支持类型有布尔、整数、字符串,可指定范围和默认值。 +- callback:收到调用请求时的实际执行逻辑,返回值可为 bool/int/string。 + +## 典型注册示例(以 ESP-Hi 为例) + +```cpp +void InitializeTools() { + auto& mcp_server = McpServer::GetInstance(); + // 例1:无参数,控制机器人前进 + mcp_server.AddTool("self.dog.forward", "机器人向前移动", PropertyList(), [this](const PropertyList&) -> ReturnValue { + servo_dog_ctrl_send(DOG_STATE_FORWARD, NULL); + return true; + }); + // 例2:带参数,设置灯光 RGB 颜色 + mcp_server.AddTool("self.light.set_rgb", "设置RGB颜色", PropertyList({ + Property("r", kPropertyTypeInteger, 0, 255), + Property("g", kPropertyTypeInteger, 0, 255), + Property("b", kPropertyTypeInteger, 0, 255) + }), [this](const PropertyList& properties) -> ReturnValue { + int r = properties["r"].value(); + int g = properties["g"].value(); + int b = properties["b"].value(); + led_on_ = true; + SetLedColor(r, g, b); + return true; + }); +} +``` + +## 常见工具调用 JSON-RPC 示例 + +### 1. 获取工具列表 +```json +{ + "jsonrpc": "2.0", + "method": "tools/list", + "params": { "cursor": "" }, + "id": 1 +} +``` + +### 2. 控制底盘前进 +```json +{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "self.chassis.go_forward", + "arguments": {} + }, + "id": 2 +} +``` + +### 3. 切换灯光模式 +```json +{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "self.chassis.switch_light_mode", + "arguments": { "light_mode": 3 } + }, + "id": 3 +} +``` + +### 4. 摄像头翻转 +```json +{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "self.camera.set_camera_flipped", + "arguments": {} + }, + "id": 4 +} +``` + +## 备注 +- 工具名称、参数及返回值请以设备端 `AddTool` 注册为准。 +- 推荐所有新项目统一采用 MCP 协议进行物联网控制。 +- 详细协议与进阶用法请查阅 [`mcp-protocol.md`](./mcp-protocol.md)。 \ No newline at end of file diff --git a/frontend/docs/mqtt-udp.md b/frontend/docs/mqtt-udp.md new file mode 100644 index 0000000..478e466 --- /dev/null +++ b/frontend/docs/mqtt-udp.md @@ -0,0 +1,393 @@ +# MQTT + UDP 混合通信协议文档 + +基于代码实现整理的 MQTT + UDP 混合通信协议文档,概述设备端与服务器之间如何通过 MQTT 进行控制消息传输,通过 UDP 进行音频数据传输的交互方式。 + +--- + +## 1. 协议概览 + +本协议采用混合传输方式: +- **MQTT**:用于控制消息、状态同步、JSON 数据交换 +- **UDP**:用于实时音频数据传输,支持加密 + +### 1.1 协议特点 + +- **双通道设计**:控制与数据分离,确保实时性 +- **加密传输**:UDP 音频数据使用 AES-CTR 加密 +- **序列号保护**:防止数据包重放和乱序 +- **自动重连**:MQTT 连接断开时自动重连 + +--- + +## 2. 总体流程概览 + +```mermaid +sequenceDiagram + participant Device as ESP32 设备 + participant MQTT as MQTT 服务器 + participant UDP as UDP 服务器 + + Note over Device, UDP: 1. 建立 MQTT 连接 + Device->>MQTT: MQTT Connect + MQTT->>Device: Connected + + Note over Device, UDP: 2. 请求音频通道 + Device->>MQTT: Hello Message (type: "hello", transport: "udp") + MQTT->>Device: Hello Response (UDP 连接信息 + 加密密钥) + + Note over Device, UDP: 3. 建立 UDP 连接 + Device->>UDP: UDP Connect + UDP->>Device: Connected + + Note over Device, UDP: 4. 音频数据传输 + loop 音频流传输 + Device->>UDP: 加密音频数据 (Opus) + UDP->>Device: 加密音频数据 (Opus) + end + + Note over Device, UDP: 5. 控制消息交换 + par 控制消息 + Device->>MQTT: Listen/TTS/MCP 消息 + MQTT->>Device: STT/TTS/MCP 响应 + end + + Note over Device, UDP: 6. 关闭连接 + Device->>MQTT: Goodbye Message + Device->>UDP: Disconnect +``` + +--- + +## 3. MQTT 控制通道 + +### 3.1 连接建立 + +设备通过 MQTT 连接到服务器,连接参数包括: +- **Endpoint**:MQTT 服务器地址和端口 +- **Client ID**:设备唯一标识符 +- **Username/Password**:认证凭据 +- **Keep Alive**:心跳间隔(默认240秒) + +### 3.2 Hello 消息交换 + +#### 3.2.1 设备端发送 Hello + +```json +{ + "type": "hello", + "version": 3, + "transport": "udp", + "features": { + "mcp": true + }, + "audio_params": { + "format": "opus", + "sample_rate": 16000, + "channels": 1, + "frame_duration": 60 + } +} +``` + +#### 3.2.2 服务器响应 Hello + +```json +{ + "type": "hello", + "transport": "udp", + "session_id": "xxx", + "audio_params": { + "format": "opus", + "sample_rate": 24000, + "channels": 1, + "frame_duration": 60 + }, + "udp": { + "server": "192.168.1.100", + "port": 8888, + "key": "0123456789ABCDEF0123456789ABCDEF", + "nonce": "0123456789ABCDEF0123456789ABCDEF" + } +} +``` + +**字段说明:** +- `udp.server`:UDP 服务器地址 +- `udp.port`:UDP 服务器端口 +- `udp.key`:AES 加密密钥(十六进制字符串) +- `udp.nonce`:AES 加密随机数(十六进制字符串) + +### 3.3 JSON 消息类型 + +#### 3.3.1 设备端→服务器 + +1. **Listen 消息** + ```json + { + "session_id": "xxx", + "type": "listen", + "state": "start", + "mode": "manual" + } + ``` + +2. **Abort 消息** + ```json + { + "session_id": "xxx", + "type": "abort", + "reason": "wake_word_detected" + } + ``` + +3. **MCP 消息** + ```json + { + "session_id": "xxx", + "type": "mcp", + "payload": { + "jsonrpc": "2.0", + "id": 1, + "result": {...} + } + } + ``` + +4. **Goodbye 消息** + ```json + { + "session_id": "xxx", + "type": "goodbye" + } + ``` + +#### 3.3.2 服务器→设备端 + +支持的消息类型与 WebSocket 协议一致,包括: +- **STT**:语音识别结果 +- **TTS**:语音合成控制 +- **LLM**:情感表达控制 +- **MCP**:物联网控制 +- **System**:系统控制 +- **Custom**:自定义消息(可选) + +--- + +## 4. UDP 音频通道 + +### 4.1 连接建立 + +设备收到 MQTT Hello 响应后,使用其中的 UDP 连接信息建立音频通道: +1. 解析 UDP 服务器地址和端口 +2. 解析加密密钥和随机数 +3. 初始化 AES-CTR 加密上下文 +4. 建立 UDP 连接 + +### 4.2 音频数据格式 + +#### 4.2.1 加密音频包结构 + +``` +|type 1byte|flags 1byte|payload_len 2bytes|ssrc 4bytes|timestamp 4bytes|sequence 4bytes| +|payload payload_len bytes| +``` + +**字段说明:** +- `type`:数据包类型,固定为 0x01 +- `flags`:标志位,当前未使用 +- `payload_len`:负载长度(网络字节序) +- `ssrc`:同步源标识符 +- `timestamp`:时间戳(网络字节序) +- `sequence`:序列号(网络字节序) +- `payload`:加密的 Opus 音频数据 + +#### 4.2.2 加密算法 + +使用 **AES-CTR** 模式加密: +- **密钥**:128位,由服务器提供 +- **随机数**:128位,由服务器提供 +- **计数器**:包含时间戳和序列号信息 + +### 4.3 序列号管理 + +- **发送端**:`local_sequence_` 单调递增 +- **接收端**:`remote_sequence_` 验证连续性 +- **防重放**:拒绝序列号小于期望值的数据包 +- **容错处理**:允许轻微的序列号跳跃,记录警告 + +### 4.4 错误处理 + +1. **解密失败**:记录错误,丢弃数据包 +2. **序列号异常**:记录警告,但仍处理数据包 +3. **数据包格式错误**:记录错误,丢弃数据包 + +--- + +## 5. 状态管理 + +### 5.1 连接状态 + +```mermaid +stateDiagram + direction TB + [*] --> Disconnected + Disconnected --> MqttConnecting: StartMqttClient() + MqttConnecting --> MqttConnected: MQTT Connected + MqttConnecting --> Disconnected: Connect Failed + MqttConnected --> RequestingChannel: OpenAudioChannel() + RequestingChannel --> ChannelOpened: Hello Exchange Success + RequestingChannel --> MqttConnected: Hello Timeout/Failed + ChannelOpened --> UdpConnected: UDP Connect Success + UdpConnected --> AudioStreaming: Start Audio Transfer + AudioStreaming --> UdpConnected: Stop Audio Transfer + UdpConnected --> ChannelOpened: UDP Disconnect + ChannelOpened --> MqttConnected: CloseAudioChannel() + MqttConnected --> Disconnected: MQTT Disconnect +``` + +### 5.2 状态检查 + +设备通过以下条件判断音频通道是否可用: +```cpp +bool IsAudioChannelOpened() const { + return udp_ != nullptr && !error_occurred_ && !IsTimeout(); +} +``` + +--- + +## 6. 配置参数 + +### 6.1 MQTT 配置 + +从设置中读取的配置项: +- `endpoint`:MQTT 服务器地址 +- `client_id`:客户端标识符 +- `username`:用户名 +- `password`:密码 +- `keepalive`:心跳间隔(默认240秒) +- `publish_topic`:发布主题 + +### 6.2 音频参数 + +- **格式**:Opus +- **采样率**:16000 Hz(设备端)/ 24000 Hz(服务器端) +- **声道数**:1(单声道) +- **帧时长**:60ms + +--- + +## 7. 错误处理与重连 + +### 7.1 MQTT 重连机制 + +- 连接失败时自动重试 +- 支持错误上报控制 +- 断线时触发清理流程 + +### 7.2 UDP 连接管理 + +- 连接失败时不自动重试 +- 依赖 MQTT 通道重新协商 +- 支持连接状态查询 + +### 7.3 超时处理 + +基类 `Protocol` 提供超时检测: +- 默认超时时间:120 秒 +- 基于最后接收时间计算 +- 超时时自动标记为不可用 + +--- + +## 8. 安全考虑 + +### 8.1 传输加密 + +- **MQTT**:支持 TLS/SSL 加密(端口8883) +- **UDP**:使用 AES-CTR 加密音频数据 + +### 8.2 认证机制 + +- **MQTT**:用户名/密码认证 +- **UDP**:通过 MQTT 通道分发密钥 + +### 8.3 防重放攻击 + +- 序列号单调递增 +- 拒绝过期数据包 +- 时间戳验证 + +--- + +## 9. 性能优化 + +### 9.1 并发控制 + +使用互斥锁保护 UDP 连接: +```cpp +std::lock_guard lock(channel_mutex_); +``` + +### 9.2 内存管理 + +- 动态创建/销毁网络对象 +- 智能指针管理音频数据包 +- 及时释放加密上下文 + +### 9.3 网络优化 + +- UDP 连接复用 +- 数据包大小优化 +- 序列号连续性检查 + +--- + +## 10. 与 WebSocket 协议的比较 + +| 特性 | MQTT + UDP | WebSocket | +|------|------------|-----------| +| 控制通道 | MQTT | WebSocket | +| 音频通道 | UDP (加密) | WebSocket (二进制) | +| 实时性 | 高 (UDP) | 中等 | +| 可靠性 | 中等 | 高 | +| 复杂度 | 高 | 低 | +| 加密 | AES-CTR | TLS | +| 防火墙友好度 | 低 | 高 | + +--- + +## 11. 部署建议 + +### 11.1 网络环境 + +- 确保 UDP 端口可达 +- 配置防火墙规则 +- 考虑 NAT 穿透 + +### 11.2 服务器配置 + +- MQTT Broker 配置 +- UDP 服务器部署 +- 密钥管理系统 + +### 11.3 监控指标 + +- 连接成功率 +- 音频传输延迟 +- 数据包丢失率 +- 解密失败率 + +--- + +## 12. 总结 + +MQTT + UDP 混合协议通过以下设计实现高效的音视频通信: + +- **分离式架构**:控制与数据通道分离,各司其职 +- **加密保护**:AES-CTR 确保音频数据安全传输 +- **序列化管理**:防止重放攻击和数据乱序 +- **自动恢复**:支持连接断开后的自动重连 +- **性能优化**:UDP 传输保证音频数据的实时性 + +该协议适用于对实时性要求较高的语音交互场景,但需要在网络复杂度和传输性能之间做出权衡。 \ No newline at end of file diff --git a/frontend/docs/v0/AtomMatrix-echo-base.jpg b/frontend/docs/v0/AtomMatrix-echo-base.jpg new file mode 100644 index 0000000000000000000000000000000000000000..979cf811aa9ff19af701b2babe7ae3eb500be560 GIT binary patch literal 37326 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 z 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 CIiv#s literal 0 HcmV?d00001 diff --git a/frontend/docs/v0/ESP32-BreadBoard.jpg b/frontend/docs/v0/ESP32-BreadBoard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7a6fd4f9598b38253be543d1d30ab7c1fb046be GIT binary patch literal 96480 zcmb5VWl$Vl&@hSwmq2iLcNT}m-Q5;Fr-5nN!I|O$L?hA0HKyFi?nBj1$1e z`#+PwqoJW;Vqg+uVG;Avkkjz~|AzmD;c!tAd=W_y;c4LzaN!Yg;r|DnOwC;xoIr1U(m(Z~lE+tPc9NMKaK zas2Y~u)3uKO}RYsMwh>xmvY*K$ybh}siel-mocW|w#z9PTvRx_mLbwMn~q1123=)T z#h(4bD4D^nl!rLBc#!U%E;&Dsmi}RCm}Q%)YOYK|RD!?W^gMZaMWJri5lb)N;TI7_ z`)V41bCb(W{BN`u`L$r{0Mg6P&GvorOUEkJ)(kteBN0R@B54|3frL|JeZq?=&miG` zW8*(Rv-hpqafzo!zb>H=Y8oh{rw5(D9_&`LtQi4deN#dik;$#iYy{kFu<2Gqg*=A~ zhy51*jX}uU5NyvZqs@cH-|P>_QN6Hy+%13mIiq3uvUEyV*)uub_9i6a-1Kd?jV*ynkplNTY9|~jOvfO z&+gGr>4^mm>ToVIT`+ri@d!ESu;6xv6F(;jKM8-fF1*%AHhVpux)Rj@2*xwSqFXFS z$|HeCH#}rzu8(%>f=(_3tO`XQYyvrZ`L&;9KE?EWuTRoQY5*H<@GX#WXBlSl2DDV- zHeqV2i0hZD>Qv&A2_cFC6ElP}^IEPn(1hEithZ37MPF`|^tJ5ONuUVti$GX1R}umx z|MCp}^M-t%bDcfbOGVXafrhDdY#&4*rwNfVRSemaDg>t}lnuQQP*BPmPTH`n z)t&{B5lWSj5lSXwjY>q}y{d%&4dS2FUrk+^qG@a4lC`2vCJBG=rYvlTz_j7~r&DP# z2fdi;B`xEup~F}Fp6fkfg=`9TnEUi_s=I{hj9ZAx9jyIB+uj<`Lc)k*^W}f+q?Uz= zH*i-llSDW_0t?D-1B2*ltK-pQLJ)j;%j9Pe?2qkmUIiX-hwORpF|5}kikGo6+dEGZ zX4+i)YMHB%@`3?vv^ScTd#uIj1dMIsr0Ct;fk?{ln6S_1cGSla z5B?{e2c0<^OD5I2ssfj#0vL9hX8~8jhM2;iw_cQ>*TtFh8;f-^aA(%ibYtd>d2o8-}z%HeXiv@qjhBE}5MfVZ^YLWL7OgHdRl z{FRO@^TAxbTD>_c*5|BZc*Nqq3OlB#t2WRK#IZkEbGJ;8^?f>SIdva*Q@B4#7wDLY z(aAjTRqmNka_W2FKx|FZdHch6AaqXr*}AMuwK=KG0s~Y>$lsn9=k{G$`RyP^;L?DD zc{pbq|}0(hry4DIb(y>M?M$xD(37q)RKylXJZHP0*=J?K;+8h;(*`1JKz@A z2Fy1&V9U`Q~eIR7R%lPP5;ksv#@y&co0x~pK1l#}HS`Ut`9N)Vd z-U8y%2SR6ahfUTbObKVoLha&pwOSnlIo~}z;%HOga22ebMQE#Uz?#u#SKli~?^vf) zlD_*%6|H<|e!eCTI$M67QleuxPue})0`Xf!gI+L~7t-B(>r9!8x`}^Ff;pa*cc|y@ zX_|#u_1kEt3i(;CCoE0BU^jI210qqDX84D4v2nHSc)p(8eO*qh>VPhTuWXLJFLcbc zeQe|R=9}d6<{OwNIQtebM1s={^xVm_R0=jawzsl|Be~P_W$`GMvTV^Y9Rw9pr`S#} zp=S8NIDGzPd4)_4F?(>|99x8_cX+!)7R55|Uos%LIS`X4*>^ z3_;qq6>aJt`O>Sc_ zJ8>XL-VQPfrdeY-n$hIn02J#fNl1`E(ok+%qC{G@~k_{LT}Sh z3oCuqqR6FF%BwgW1WRj)`uJH8AALRa&cCZ7Xc9w;BuRoNM_T+$7|B&E4h-v24$5xP`KT!?t)D*v4}>^~ZUzfWG6l4id2`SXZ%x zjw^BMfHcaj443?$UOJ#qY$B%}d6UEnDiWLBt~=)4R2Abuq){JGF2Rmv%YQ@+#>kD2 zjNDvss?1TiXc>*_PPyx3Z!ouUHZ4O64m6`=#z`uf%)|jciJ~-I5|afX0-?V-lG-txlErbo;>ok@MO;G?%J-mV8c)`(cyE3$z8h9Q;bw!v?M-= z#e*dV*_-g6lajfhg{+qh9XalFtk6cAGO-o!65$U54=sdj6wAyq3~gu|0A4Dw!D*X9 zhD&iJADSYcp{Bm6(qacm|FA$E=VHT@b)!odVAp(kex1xb&#yZDAtT~`Kj{#*kJ5_E z!q8L%*+#S3Dk#`Is~+TYR!{8S6EXBLU<02_>9;2&8GGR@r1;pbNHziHE~v&8(PTFR z!UNsiFj7OKtBMO_)Y?G?3fsCz*Kzx9-pJ~hGadh z;3*LY^WU?O3sY8Q-dKPrB7N%Y4H5y4uOe+a>AUquU*@3!_|h%BCqLORsk^7`5ab@l zNcQF8L9qW)^fbd})S&FfN(jmi@>#fp8X2q z0c3GrmA6fz))>tQ#gdVj%UTqs;#dfDonJ@#xTkf*4vG@#5z&%^pADvc{`_5#(CZbr zRdIwb5O28GR{lMkpxK7YnW}8nScE>aD3eMRQ)%JbS33$Xh7!gj%64**uA8okIX`LV zA09z%mw{j}V^jE^gNo8rsz%PwF}`QaQWT_#3w+>7fdB#YT7D>D`m(=T*;YYY4tAP) z8UZ~nC;PvUG*n5ukTfOl05k}KaQHTm9r+6df)GVnpaTAAD_vK0va7gfkM(+c=G2Zz zVM0$nRI5JMF7Fk^M1M|*U5|KDps?RpxqU%{{Ozy_8&S|csY>36m5JTa(T83E{p)MX z^@$%{*7m=e60|H-q(!f{ml}rPogk44%BJjJ7UNsSl*H#3G0>FarOUTQ!S;mReM{jbV^WK0nJB2Lm< zMTNX`9}&$QRB-x;a&oQ#n>d*}i{Q#hmX*r{OGy$3cBtqI-0_U>Mt!AlqdM!`+?ysJ z%ssgH#dol>dd2EEE!;Fg7gr9)DmL#?&yAci7Hh^LYsBSEB^0p9#g6*rd28`hU4b6J?}h8fk? zh{-4L%%(s#);l9elua#d1qq#!zqIpAR`26)M6(+E-z{glHxrD>BJ# zSTB#GxKjA5=MQ=wNBXMq1U2Tu0Wl&9&PW}O^44zuo}%o^SdLmpm&OBXwLIor>exs> z%|PHuc`L!$_=H#FF&rcmJjagUhl$3H1&}r7nz=mYn{&?$;G&>`$on|FRrs|^VCmjD zIk_x#c`grumg|UL_d043rR0=I3ac+E@Nn1kbj=L-ddjJ~rrh>P;-l=HNzg-H>30o_ z=e6g4+y{1*n4O9u{pRe)>b5V1338v?)j*TX!H{kKqswz**e1=0vDcg6x< zbO)cBN-1SHSUu`Z$RNT+RTCUJ&^11-Lt73hVSVmm*sJ4$)H?1G#%3F>w7Bo$Y1gAZIN!52S+7Y zUl3#9o9rDO65Q8|>_Z@|g>Kb4_fu5QgJQ8Je0%d=!QW&2gE;{fGb{qCg=DG-uxfsw zSyq9wKJ~^Nu$;{djhk817|@Q=K^xxu zJrS{;*0x(-aYAF{1ozj-{26xjDZ=bk+4LOeUIDVIh=w4WTCVb<5|G;^P~VPKu(kv< zKhU(7yWY)}89HZFs!V))dy1H+7|U79Z4bYGf-YAy3;)v};VcWflkZrc=zA9+a=vS_ zXHwb3k~`&W&S8;o8maqm2c@UiH4?UAP;IqwEt4$pHLV_!A;H0GqFi|y%~8d>2;dwM zoW+CWBSm%IS!UU|xN5|L&i09ugnA))+Zzl_w zARI4(=R6mBc3qI`vp#_W8uLEE3h7ntrcgnUgG8r^8n*U*YLfeSfiHK2Cc*}`OAI2| zVRdsaQ@zujbHbva56s`%%htd=8nhzzW#nxdRO+?LOI+A-(zk;gOg?u3Z`i>7`O86J zkrEw-;M*SllLYzyPvQcR(ptHj0XBWL}=G2;5G-2lya|m<5C`uAq z?pY7#zewk9NG8tS9N}v!sY8!lrBO4?6wizev0}1Fw`4&UiZ@}2{GANzX4})64>L-k zS4<-nW~cm2V8DGW*Bkm7SCV;gfIqt)O8Dx5H${Ovt^?e+1FjOIkb}i@RT__aVA?%( zpGqgxX-W$aRDVl{+o|ZYjmUkf!Bq-x623PVsj}Oab9AmVYcvfA80+!c2^~sSF6h|B z>e9~Vd0cYI91!oM=Z+5f6B-Wx+SmITwuNzeY+2ba%;tO~wtmS*_ERuawYU9XEVgdU z2pD{x9`$o`iQY<#fOO(t_EFp=E_wePQS1T{OLE8FGs;6{`d z2{s*ZsX;pNwoTL^u`v>hHwo^FDF*vS>GL(v)?Geti0`}HN0S2*f6lirRY2i3W93hThxoAw6iDG> zbH9rStvfmOdtJ`YVDje08GVZB#6EX?texOnN3Fb>Vq>Fa8>r643R9@=wAC7SZS7_a zs7hdTPOmm{xi1{cMw*2e;b=WQGY)HyF`)%ouoa52H1LOr&ilrY^f+B9XV$Lm$vkf_3Ng{HJrVU9j4&XZnH2<~J;0k)zy(LJ)Bo6B2kW4wDk=r3Bfb6uyd^ zS4)w)m8j5vF;)AbT1K5AZSl~9w&W`L<6#Q_<@#&DUs1l3f#cX?#zvyJs~3p$ae~Mh zS{%!23QMx!)en1tzU_g}B}@o=d|2TuoyZt~-R-6_5jkE5d!yF9G*Z{v?Njym4qzRj@-BV^SKIAx5^uH7s2oVdWEFR7Ya55 zr8y^+kljGn`C=lj*uXX|YxG0UgAt1E=oepMeND?Pr^-!>DRtY@;%1e2JQrWJ=@3#oVxq-WkQm3>(9B0{=zBXkz@vr--U(JrR8 z?kxgF7!L35XGJU|QoT z>}NQx@>l99WoSu0C^M7urJgIlqLpg)Z1}0&S7?d&z%4`DJ_8n;$&tO^D6lWbTY?p& zI(Bd-7hS&L5=x?;va%yDU`;PzoWFds)K{6HEX%pKlC(c>sW|=J)6)>*hv~vuT6ZU{ znP$=k{@fJNB$TAQ^6N6y~)TI8!`T+q3ra3B}l9!834eO@o}wH1GpqLmrFxANq-b zzV%w~DdB!ajwla8u;}j}F8D5TOOS64?GEUEOP(y8LZ7jCQnZDfIt_Zxlx!IauXRv!Rp)9CIj@Mj9}Bo;U(3ernLNlgM;k@^5I?Fx?6 z&!tW@ZqDyl2x(-Q*xdG5ea-pA&-99A*=O+IzZUk=?IrhctP*v22nfH3apwg!0kY6Zz`~edSB^b8 zH9_E*T1GD8G&JYZB--xUmw$Zj>yNsl_Qfu-7m){7_Ne@G`sGmu$GT1_~{M40M(?UCG)lckH%j_Zjt)vSKjz0^!EXr=E^k3JNBUw%no+EmK@EQ4^FiVXLHr zsYc;@FP8Y#F0=LAK|VLo^p#)ow71~;t!XD>k>C>ZKm%u;idk9?5}g?#B#)md@eAOa z9OO&7yLzhmAkvSgEgcyqA4NV;j4|OCq~)xis_paiou-bMA8st*e1F7zPh*x(kvQYS z!^XUNQ&>1W_eh}@-(XWTxALRSi5s2kFGfmy*_;6myk8RCYogH79nf-ko!y$%*g&%cuwx+?N zp}|fMd78}3m33vC%^63(UdqJPg36W*g~br2{V1f}AXN}?FU~pd=0dc^)X?^Gui$Ka zskb#bjJFk?6LGN!pv$n#MAwT=;M&8_+BlQvRzQQMo3gZMWO(C?$J~^i{S>g{8#_Jn z2@N4PQsE1Zq(FK%DVZ=B+cTWF-KfOJyNuByLllu&kzzTbN2)sZHgDz8Zs(&<3Tfe% z45@mJVVcQhsz*(Z>;nZ{>9Z~!nC5%EMMH^x-fnBFF`WwUgEYn}CMlu!J8@u$U|~T3 zGAD{Ft<;OHU*Bmk`|M@>#qiafA^9&BXuncO*-m((-hX-fADF&=3TB`0ln=x%b)x4} zI*PB{Ea6jL3N)ucCc6}>k6hlDjS-YjqWwqJi2Cu4 z!+=;ZoA3%7gq1VAa?)um76_=7u?7vK_RC?h5d0&aN#sbJpLaLNs#L{NEyd2Bh$+#8 z229%EWhzHNL%O-v8td?8IvJzcbg~#=&|H62idx|X^a3>cm41j;w9)a}U#xqP^6s0k z%(ce)xihwu7RSJ6AV$2#%3XXt>CoTgz)*Q7;Oq1@!y((9x?cD*wtoIrPjn>5t8zE2 zy1Q2DRdW8#&`>wJEO2XHz_jCTm~l%sI=Xo{cXa4Q6_N!AR->O~n(3(f4CWWYjtl;h zG>=7QCchGG+7|=@FYC=xJYt|%_aOHpBPQ7e4QyAp1KexsGw!KFo4Wg`&&zn&wsOv^2*Jh~iP&uy|-23UjZLE^F56QK!z0Z0Ne) zeAOYW{}TK&T=d(8tP=!GEExcYUo1I3p(_LYa2xSMftFt#%A45xJHgg<=;>sUL@;Gj zO!W7a!Y7yuaEh;`k}^9)R9ge}J2kooHC{WTK^isJLixHhEy>#N{VK+Ikc)ZYIgp?)fO1*dM9f_o@15ywvHcKacVU?mt_W=gr;MP@}D+ zS<|oaz!<{{l^|SVsVVV_0&>)|w$zPn5s))&V(A+GXeI1z7I@7X>O1;X%O41Q^g>`o zWKt!#1$wIYia8Gs90CFYJOUEp2Ly!o+WC8R903mT1MVk08YCQiS{`a%DLQTd9|66j zG=q#LzwCP<9rgVwcqD|F|KOVMc+L(uTN8bcR;yTizF`G)!gQVh5IHi5&J=qLE~VdL zKkp49O6$*%2x;qu&RV9`ES;N@+Px1}3SFu`E7$rvl@pd$5Uf#d5*XFN(r3nA%`fgX zxiCGjJKqqS|AWg)l5KuYsL!PF?U@Hu3{kPNeOfqc&6a9~@GhfaaMq zJF==Rt0!)e5bR)GL(?Y60x4-=nsvP0CD>Uld&!!Kjc2#ByZOaNrM_RiL1;)7?D|;?bjISWqSOV&mJ!D6fn!%y-oO>)M5gK+WVou^8LP%X@H6kjFDn zkKY$95v{wxE$n73dfj<=2R5cqEDD)fvLJn`DL-DHKI67V3K#joE*I&_n3+m}^6m z%VJIQeZYwB>A_JQ@cr`*slDHv2i1Xvt1dR`Jzt47DQ5^)IZy|xw0of#eiFY$1Dr3O z>C;2A%+$2e>w4x?>Y-XhMA3|&s%i%&!B6Xf>xtLmN&w7%J(U;Ra$Fy+BC01gWi7{D zo!b!G*8XHP&!_=8rkgfr{_g$~+VZfk8M}W!9ov~1=D$A- z1B79C3hEcKOuFKsh88Iua%*VY1RrqsZ0DKn&WzU`_o7El*e&xSnQT6pM>(eNAdgFV z**pd+=-ukl>r6G&I9CMCe^zF+Usx(J{qz}vfwT4m$7;NDNJp=0&qqghmcFtPftT1V z;(I{Nkq$R$%whRG5w2NhInd>z>(I3Q$g5@L&`Zmy{v}ULXXfV3{`B#tCV5+K-N~=H z`DVOyhp ze{dZiVgJDa1^)`whJ~pp6m-FDzVHFV77ug*0#US{;5UpC*bj z^35RgkortTx9Rzr2%@vXHbJqMu-H@jL{KQVx$8fxW()-ukSEkn!b^8DwKSWW{2d;^ zCtUXSOHk;gq6oVs3NnrqcNfTFUd{uy8ZWLEe+Tic zGfdDnOwu;e(=Lz>Z$s0I&pI?_^{~68+(%)K|xx21r3clDO#1QBpR;3i8Zi@wtQIvQNNS35ixcyKy;!iVg=;yLkptlxMR26jD>8l#g6--FIjZ ztsg%Ndn)RF3Rg@dWySD8mkFD+tuH9e0t&tHf%BC5{Q@nE4?jx#BAnXg1RdHzRCres zRmEw)glr6W`zMGtJS)Va@<{nLYhAuYqyPr8Jj-T_pXyNeHK$sk6HD6<#kH|ByMr z@n8kJ^(e@=Y&9t7Ggiy0_r)<`gD$9FH%C>cYUba_o2`?Jv%we2Lt9(q{f6v@F?rbR zb#aNucHJWEe%*jSynnS+_P(i(m7h2k?8z7Ab#pvfHWUj8pP{8+4pfqciJA|cvD7x436skF_d)!em6(0_26mZ6bTV#&0m zu9Fr&%F&;MoGv6iRS=VBreEXlb#H>3PI_&{BrJ~q?5Fsel;47j4=Vz*xBdn|?(RW< z2n@9@>;4wudm8($GHFkH)2@g}fActpy&4lBwgNh{B&rO4{S$lGJO5K$+(bs@k%Al2 z+Mjf6epCFjdCZ9|$g-nWt~=_pui^Zx0f(Yf*1j}$yCD9&CP`OA_cYDP8cqeM0A#Kf zpq{7PE!&V3bgj*wv41;obY=V`5RTbeOsp2&MLJ?K|H{wtkF?fmb%Tnd;b6!59Q~eA z(9-{$HB7$g+$xQPw1avMeDoF;baUJ+@pvgmRycdyLY}_o9&>s=QB~k8*Ryd6w%nSN zNZLw5EsQvD6enD$*a zot3RpU*mE2#!15QMjx^$-*(%=R?IrdAkrxrR^z#;LFdptu8AC$|KK_^sq9nzN93uB zEAx|*jM0BwFmw>I@`+7s&aHrZA9z|sh=6}8;~*ds4La5-r?ckG$zFM?+H6_4dRcZ% zM4QJuWWTl3-UvfNGLvLkRdDpmtXRaIik_&50KbwKIW$7*Yn`IrCTeuj#5 zlf1t)?MquohIQzq`n#`5)A*LA8E@HDJdT@x^(sTE{c-aOEi%#4mX<(eYK z6yEa-tyq(zUr#&)1c#_$Rdx%aIF`=I1y)g$#F(v9J6YFwIo)J}p$>~Ed!ZUEU9k(q zPTJnMFC72Dg~UYp2l`C|ZwB?ZnynqC}OQGD89GSQz zxWYuPLn9ZvQe=-1j?_Ulcp#&^w!|G3)o<=>MfI3fV}{r*|2-6Dv_*h zj_MVcda>pur=~Jq_*EbN^b4Zc2|MC4BaNq}zpiG*lm%+1WLLw@71{iirmx;1VJV!9 z&U>Rny+$3{V0)?BNj#E{17-^KlcBPzEn)5Z;l&ZkCv9~BlPir0i_2lLULRZA&?t=T& z4($h4^>CFue;b_O9(1|+(hfbRqAa=GQBD~xv&;5CC+%~*Xub&xBHUGuW)YXIAr7g3k(&NyHrYOO`(SqCMb)fbB zw=$+!w#2>}UIQI7NtgO7gIpYXf_dBtIFP-TQy~+{xZqrjZl2;!pl{b@my-0{*X(J{lO~< zt|!gEqJLcle!ND97!iN>a{YS9&}B^lBC0$hno!rb5p?4rM6(V5Hg8h<)L3G&p7%^K z_jhN!0LOKzCRt$iGkMgGhpu~5o4C;+m1OM*35nIpH3i8>`8nP!ZiM5SX8AbA1WANI z=gRgYf`X?o%AlvYb5BMDS$2)Qm(mPp{RC|r^X`z|*g<)I&k=S}{xI4ug3a$=a&&rX znjq^|);h5$bY`fZ7Hez`vyHuYoW_cI%L(Z4tk+{zP4pm0c;&6J*&D1Ma%`oId$KE5 zRt|+`|?@p+bG^H#` zGiEP%c=Mo7mNo^Axo?*6x_R?iaS3!HV0fBojO`WoX%a*XH~u|6`O)QoDG;-vOTMDk zd6G#1JUT~mPEku!xU7L@eaC0bf$myVUT+fR;B0`IFKB(6rMYf=Un!y+m~B#`Q!VU0 zto?{242K@mu5;yjir%Q?{?qBN!9cSvN?PDE7t4=B1EIDIBRs(2nKNmR*?5bA^Ewy0 z{)My(r!#fn=iQ$Lib8THk*GV%ReIxx}k%$d5t2I`I)?Q=P{S~1K|G{C$ zwf+ZpocFHu$sfSJs%m5-XG8Ee=&30LaL&itwhELb@(9zbR-a>Mt9$A^?fzddCL^tP zPjD&Ge>F>?AqC!t(6S!T|`jFVZe(__= zF4eu1e`?#cCJu!gFWl%*(FEm$B${Q z>a1$7*((?5GgwUzy5_4j=t(!bd_n5C6)0Ux*#1k<#8mIDS|FgYlql#^X^o}R-4(F` zlFvFYolF=)(NYW1f^$m4hx+Aq&45M?Y}LzebvDYW3?ea>TQCzj3U& zI^WQqz7h)oO`>y$RBa2rL=b!Q1R|Lh?r+YysEhQ)^rJI_-ZT*V@<+W z&rN^rAL~0i5N6n_p55!bfZp!qOk4)5y@Mt_~ke9fR26w+OI;>-Ed(&9lpoMMr?(<=vlu^Z&sez!@$@ z2;c+rvrW4|p-S7`R}b2K_0L2StI0jJhdbh1G;g^G07>ipb9ue>*cC6!I3#qMgN#C= zx7V`LCy&6v@HY`JjBQ@B#1TucV_!ZA{fQrVH(6#QkGXE9Sgvw8R8B*`mdUVZGkme| zr)wK0CMRl;?DtY3qP7_S@?1#k{sI8v3tM}CjA71Lx)tyZ+d*Z}L7=Of&gsRNDT?d7 z@4Ie58SlL{Quw%<6Xz- zmPzs+|AwVJ-&+$wQu*^!yy=U-7H?3o3avZFz{X9XLFeorn1i=N66*X{qoecW#0!Wx z=g^vXj=Q_NNKwB04CuDLk-82B!6)&uiPeqj6^C03OxNWSj9QFq{c*X9}GT&zQvs9R4B9~F)2ab) zP6(O3GW17_p3VdL4E6$HK0w~#g&L;iHEN~OY~3%tm33rfG<2B$*y+5$tL+X*Tu+lw zKjo0J2wz>z_7a7y$Jt{>a9##HZV4Mx>zS7}HSb^Qy2MzX<~@eUT-`QwGo>}o{qAt@ z@#ygwaC&*Y`y2OfbmuPX4sr)shP2jz&!HksSaX#DyW^l4fO(p? zRT7Ga0<(Zz5ek(fQw}`m=pN@Wq+J{B;}eaf+N9au|AT9kxy8Kum0GP0vSb2+jFM(! zVzq599^b}BmcCLZF_q!$qn({rBwaO*Y!p4~7BtpC9NKT)fnVy}+ z{)3~tx~+Qtm-ONW+gn@s`h7DHM5-U&4t?c4?|9x2R29>!;A@SaXA@%o*;<)Vo>5^k z{bM3`1GX5FF*bTM>|-ayf3SPEAJ8|^o_?_&wM!fZ74q49Bnees&su`ui7*PSh$iJY zxat4s4NNOU1#g`5o%7i-a?T=pED*e~loLm`bKE4)Hq68RAB4^w<^^1d3Gw?p)I*$^ zOi$mj%49(csF3?Y<+id%+-}k>Z_BAs*A&8qdw%~%v~Fq8s*sGA^p10K%4Cq%lKiWd zs9M~ly0j;r6*%Bb9S{l28y!D|=P4ZR?EkrON)ZRb*Bk2`9oI*XUjvTLNX2-z=jKky zPP-aB`#q+@+&WbVw!K)epb(Cu2nguA~%O4Wi7(jKe=Uz zah{5VdlsHDPqgL*f!F$W+hJ>%&jq)8E8+?hmsDS6_>W6YztQ+ZnVWUL?F+??YFH$K zf?7NSRvgzL9!Lj1Rr+3d&4sc*-sVx4rb`Qjh2lt}R-3{N4-z<*nup-QNkLyLabbZ`7gH2Ru)-tWV!jNyMsWcXF8*Kp4eM zn^NuML)wn2yyqstw!{4`tleFDarvI?Jgw8a>RG=Kg7RFxgelvZSlMJ4t|m?u@UaXRk)>+v9-pm=d3E=V`1WM8ZA#h%0q&BtDTG9pLHG#UqI;7 z^~d4_n`XbU3YB|w$D&a!5NBdvQ5FtBTB~|IO|wbgwOOL`H{E0z;c9@r3$P@Z)k{kC^0hUy;311lGfHVNl|2kt1*pfZUN`0MJ1|7N$8_J)8TeC zIfkS~Iv&0AQdJt7Yn2qJM6H9uO$-gCtL&z{zK8?BLFe>O+4d>QX>q#N93cq4?kuO^ z>HeDB2}po`e(h-6j_KTRy=p|-N6VCK*U7^Z@oQQEIJkg7Bba?fQSO5J@^asq*qM=t zzK>AL7xdMDn;LMI-@cI~%u!8&PR>%}ZM@{`uTXu<3`H`JO9~D3v zm{U~o-fGA>ZlRdJ|9C1CTA zdpwR{w{yLLAe2?t<>gCDVOQwmNyuZPPgn)W?1Lac9VFO#p7N=|VhOELX0@GB^8xAHgL^S?>HCD5y^_70ZETHR(MgG)EzA6x&P+j!*qV>Mwr9ci z&r0tqMA5kZImupZq2glT+}zxBSe51Nc%9UI)S7~;eEZRAGWy4&lT(&1wA<~yBCf~2 zhrLInKp#^o_HDQIpLIY927XF8cE{_AEovdAw1i!^?k5^G4OB6^lXp0PDsSW;b`R3V zFEvX==NKwM5^X=@JKdt=Ps@M#a(koVZ%q&iN5q|A3D^-<_bNOE zwzlmN&rG|s5uXt#`@Ox{6eH-K(t0I!Y?NC`naZyZ&}`9bQ9`$s!z>d z6w;hlH+|mN*sw(}axv=UY)8$OPz*9k*{`wE3w;$Q@5D@e+K*M-%$S}5E0}wBwjgeW zn#dmcos$k5Dm%77GlBGzNYwziY!y)hxyHxem+L~4Qd^uOMoWiB9MoXGz-|>5+uO#< zZ~KdEgsyKj<wLB%zu)_G$+=AQR)`$IKFNb(=waOTQqV zF-XuRo!O(%74aLN5a7sSoptX#GKxwu>1dZL!^;vhFjn;zF!DjoDAxlL9~>rDQEsKL zpgUIYxokvNOFr#UV`ty4e*!to3k-|=c;GTraE=ZB{5?{QWGcoVUT zvR?l*iwM{#pCjyy@mSU7WsTRY;RuZX`7vJaqnE5?P#?GdADlf_)I_~Hupbz-R<_b4 z;^gcxmU(+iRjJ^!2q;fu-S#_Xsfz7cOz>GMIETd~Z1RUFDgOrHRcGq`&?nE%M*{rj z@!y(QKzxhDBLgJM^R_XNv3Ww1!-;NRbR;X^@!-cEbSV~5<*J}rwx4c=}9@oo6}LG+7|O!ypCM{3qX`9wfx&<7RLUlnqGmNk)35?B%zMDuEu2L1=D%1WVhG9>?Pzc%K<)OZ(WnHXcc$ z4D|nrdL$VO^x9Uh!(+)iMxF|*FWV}g7`A5Feb2oe6J~NY7N4EalkrDxnk(D>k?7lB zQ{iaP8awbjH&`FsZyWEMtq;yU*K?DxHEhdYTF>(Dy3$&=8UJQ;b2s#FS8c{Lzvi5`!Sx*%lVeowU&Ev+w_`C_x zclGs!&i_$Qvo;@Z*=h})LFpU||LLuHtFf@9q7+btCiie-rO@c8AjD%G!DDbc_>FkLT+};dJNLK*K*W z7rkosRf|1`d;R(bfj@Yu6@;PbB@|H0%;)gm;7kuQTN$b~eb>1*vyI%!6`^cTuz`=z zW7qu?YS*Ja5Li1wICt%5wO(xks>4uOH+{%TFc5jR*)DfJqmn2h6MNbGz)Qc_- z;+tHj3A#~@H_V~LR?Ug=P!fUP&P0-QB^}AdwFf;nw8+|2E4{Ukq}Pi=-(ABrAYQB9 z^wJ;8-{&~LD?I%_T)hQc8$r`QPFvbiDDG~>t-;;h0|b}i6eqa1I0Sch*Wy}eaiF88^;B)hY7v-6$RaDRV5Jj+#S4MLdCt5p9{MUGXDCdZAL zBh$Ti#P2=P<>=E&H?EWEEA)?s3nyoZkM`!r_y9_rJa;}6Go(qzLe%|iJKW2DUt~LT zgEhR1Iw_f=H_r?|c#F0)LU{6pOZ?2~J}! z>P<5-AbywuaNs3K7sDu}XL!YUjLo@H3H`M3KJ_p>GVoq#QDVhZgBkJ6`zt$@-!2+R zxhL*|x2U5;I^GL+D*Z*OAlx;PxKnd`rBvj;M0C3--B`+xw?5xHR%-gB(6?RdqK*o8{dr(q zn zXL{W9NPl}(+WXi^omiV|k!47+NRMPf$q}yLI%I4Dz#iV~`Y)~9P`bVOI8EvC6@v5z zbd-}xg^KAMQNj0Go>b#`HmNAeJ;{Spr0sT{t$yK~aJiwdqd+oHQM#s@+pr=g&XPq< zYuqfwV7@4EML)iIp&)UkY^R&vuE9rC%{tsdBz5jmgx0=Dz~xk|=rV9Mz?adaaV+3> zf703*?R|o%OY@vb8Y&YdpF>>%KVAQ_yF8%Y)@YMY;hcFNni{O;)^nnT!QvWcdoaL* zwDctQ;7m86GFIFl&5#VzPqK-z@GWZpwQaEgY`*A$Ar>fekubRGPW0?{x$;`3Vj$v~1&;1a zx+IWwOIgH!5%&nMtvBA;-B#TScTQmq*ES|fc!v)IFZJD)jTHAs=6D15*g=*U9v=~H z*f7;Xv_7g6DWp=d~*VdUT0h|XwJza*Lz^y}>IMtBXBz5oQQUo4M?Y%TI$R-TRu zwpuKTsuKN0GI(A?cOP+U&_7r>InRMcvsCDvIIXUT`*o^9(?iPw=`U*4dk*|ft^(;E zf{94p2KBuzMT;hEB1RWcl1PNkX5>ApJvRF{|3xCqi=4Bc>TDc0x|hdn9X;v5%*~TR z&q~@vqkKyp+Ac~OKC5*4`?0coP9@##y|6?zCM}-tZzh}ZQ}jtRVt4+BtmBK}=X62H z4ad~B9IgC*&A4Mn3o4D@izT@>Y3qLzq|jLgH~7~Nb~b*5@PyUZQL`1 zJX?ZmJ`9Pocs?|2@ig=|`E|oKOrnwgky0%t?g9iqFA}rYL=JBAysx{^yY}{! zC;lFm3#K~B2mZ1!^9$eKn3<-}s57ks93w4;=VA73Ppu%%I{fG?{z8iOWTxc(xAt@ThQ)cFjS zjs*=Tdt3W_9j0=kwG67Y;*p#NpLL zJ2xvCk&$wjT|;A!hn?u$8_LYml&*2q%VP}pE&-N`Mw^a@2{L$w7qyXq1!djDB-)iPZ`fk_ESMKLDldV?|9oMu(HRPfCF41`C| z4IZd?>V5iPZjTlSQKt19?XUieR4H2e;CTC3_WNO{VRbZM`I@=^!`xq_p$Mb6jkNlP zE3UxW@d{z#b30CEYN3y3q%XHDx}{%PlLvw-YQQegvcNJ|2mXytpU=R`6k4c0Gebd` z+I`W~a?d19qvgipbO(GC{;!_0o$omtPZM|!zL*>jd{en@%0mDQ9dWP60hq()e+8G{^ljg9m7~M zU&d>s-j^LoRO`N9SxbnyHV|XF`MLE?1~K~E4X^pWThDVuV1~P+v86kN%1STnAZ=^eDBT^= zAuhJW5*}|BK89{Qwx)J9^pvm|D+emD`g4SDo+_DWQfD0Nd4ZiW@~)5*oRPq=R`*lRm7#kd+E*D>YM_T+`eLF*;z(C$6-e(E1;0G&I^9KHEX?;$?x z+uO#Rtiu#rvL#1nih{}#?iIPrjxT`;Y&@4osU%+X{~|4nn>cAofBg892hSF}9sK&^ zIQRvW?Q8!+7H;CC9eMY*IJYrn1o>B7fXkXOUYtYL1{H`@HxVmMxdIR7SzGUgus!xb<$-(Sk;;Wo_-^SHD+T^1d^mJP_ z#`=p$H$<;gw?%@u4b>pKaUsT9gEEP4)jryL!rQ6kF>`X|A%Nv!B3p6r+lT6NjE$zs zpEmzqrW@WFYw&btX6E9FNqsmQRC34CoHoW=EgY^2nTz&n-L-yB0;*_m0f4 zN^!c*?fXZSjo(xPRi;4Zg7?43G81g@smqA5U@A&erDdE;$$BaJY`j{9nV&UPMI;iK zrQ(5av}Hd31lehS4wmCJ9{}59v2jJveX21w|59W;t|+CZdeavj;qd#Wtm$T~tK@?X zqQ{Li9V9l$>uv@;^(@013XT(4H0UW@ zA1t!SN0NdHb6%fr{F>gxmiqgkrmuXi=Cj@nFS(8Fa9{wH&hQv&RKRKF!f~&czx&D^ zg9^wP7w85W>7!6r0T5{VgsoN$VRaHdy6jihlIZp+7N;;5zCoir7q=5=;MC ziiv3U^a^OrSLQ4~%Q26Wi;xSyfNBmLkgjKjkJlgwPh6- zqI*Rev+T?oL6iIa)na1pI=_dNsv8>4OJ>&ee9jJeiegGd9Q1HH$Pq!Hxb9mGo7t;* z)Dstkm!W^qpdpRC0<6k+$|wG78ADK)qJ&g36wx4G!R z2@k91`D6=*OK(h=w@k8$*d=x^DzhjFd{4gtSns4#uqymnm>)GTPuH_V^VMaxey|HeBk?nj@S^f6#r|RbiiAu~mQx58DE?hpUwuvGj_REG>LIJj z+^VF^CoMKl>zZ740ri+s+kiS9jjI3~k#?lBVhUdW-~hSZ>w||if9W*vo3HTkH7P7y zP!Y%s%%zd)nz6gyGkgBw-GuNJ&%Y$n)%>6RKPHfx^38kD)+ICBs(`$)YBK|15R?5! zS02BeS1jDr)&Di-ecXnA74nbFlsIb|GYWAeaT&cn?A=1_x`}?%jaGo?NVlH0gJg9U z3CN#Ee=){#);ua9{@|0GxRCaIDD6P;z>74_XyN5Cmn1P#j4ukMO-o-O40yzoG^ z(b2j7KUw!jlE2I;(vCjrv=o%wKT6w9ViSYfu4he~YHPlOqHH@RS>y;z2ufkMRleQL62>>a^IRiDiJ124-uR@4sEy}SpDtJQs3hC0 zQ{G2+qLag+hY)Oi?-r25mrY`~KlG3vNqF7GcWsIv-Lx3RW-Tygc-c|hXd1eIKd%D)mE|)VZa$Uge(Mr58Kgh>t+ntSOegoB=L4rYs z-k1ep10ny6w$66~g^BQJ&cHC(oHukZIMq~>^5ZoSWL`|PFTyDi-3YC|JQRHChJ3l< z#vtj&P=*VgQe`N`g`&7fV6Nli{Ki5SC9QZCeed|HNKiAMdLTD>N)bBKr0lO6a=F2V zWj>`MB76yjs;P(wSb0I2j@Y9mV;}ppLdL%5$Ku+WNIY>fB$xjMRb&-Zq3-gjNGM~Z{C;WaA=f| zj}5g;VwpOC(@&!QxNfCekHD?6cS6AWOeZ3XGkj1jg3K@Un5$v(!(i*IW{PQHHfx@C zW@d=om}phWGAC53@Z2zUFDek^a7{PTW>WALe1oBS1Wg&oZ+K2nNKa@o`a?Y(3+v(dZP zLt26m$+uFAXNmKweF55x?xj)t4C^k;24VzeFbBwjg?j6#9X?w*t3IQ?>G{WvIr~SG z=+uV!em%uSocOPYTe##JF7Wi>Y66$cRP|ImGMVO@Diu3*ml5UyW&mK?;o|fJ@dd;p zHI0&JIlIi`z*`{qDjBaun8kwiouJS8<3W9H)$8Uv+zOqDY4?T`>_P~zy;K$C)ksRs zsj>VTw7CmQLil*l$r(%@CWZ`+*3kntn9fky8}v4~K{m(j0z8|F_J&c%G?n|`IkNrW z6QyagTdfxJ(xtQC9ch{>?@#EsahXf&<*ddk%QWkI80zix8*Dpp^D~-+o+&w_R#gWU zd8V1`?F}68*>p;JoyK6W*+-)!Bi8OS|0?l{Ianj8M!N*6kH2OVi#(swjz6P*L9o!w zrd?Bz6$DE%8hoD_lN&((gvqQ5zW{s#!XGU*YNa-3nX2du-1*b(VoW2~_t-Ls?2;T9 zS*k|58Gk4`qn?irp(FvxQnZ5TgUFt$=J#4;}d{F-^ z+(1~NP4RKi^~@McId0(A?C|ix)n!n6P&Gx*{p$12BIrxMNg@H3>+KB)yxc{(LvWKI zH^#F}qs!1#n$}L1sPbeeRr_Omh4H%-9sMr-j(0ZO#_W6&C0^O!G6bINBQ^q0_Tts6 ze{eDcpzL3i))z0aUt!@;BjW<7B!GA{A33=s#Z757)Ljzlr~d;dL%`0&UI3kb)@Kpd zuac5a*RPVdFt+Fr*qg@$h6FzL&=sa9$9h2VPLjC@M}(Cn zX&;cM5PdIfJ#8);^>$irYbv~DoQMFlb&q-NkNF@P`j{vAtX3FEFK?e>=cH7)*q+M7 z?HGU#Z{3Sa0^jm+1pf~s=U=NUpK3pfgqqf>t~muaCBtvgJ#fqBUc%6uboMwtQqF ze-$6Z!1ahbqwtoBT=_1nF1$ORFtimG(Gf2CtGjW?`X_9y&l8V#f00i9BK5KVMe2Ce zd-4}(xSo!}{7{oa!P6EVWb7WKa?XHPt|eOoaX9twjEaeo;RMDkCIV{Z`bSlTvoxj6 z%A-Y>ltXL|dJ^`L+wGS!+j3eY`L=*U0dF?pG6q+D^4k+n26S17ALDys*joFO2ySLj z3-9^(K%@jY16-zrLV1y9ZOM^+Sb?S=z7dj$qmZ0L21<-NSLGW?yD^L1BX#^>emzap zOad5kdJB5Yl&RIkoAtv8eE+*upRcOXXFblTenYhFbF6ln*rG3xBv&m@w7+pHE!EQZ z+uiEO6Ta)J?Mrr$?GQPLtzkiYZQ1_ISkF zX)*9rjU{mz9;o6IJ>M&6FSfW3!5tomF+a5m_4zb>&KUIu`ZG!7G}?=fU5}?l%QsR` zppZ8KO@62|OE7N>O4-(`cU^@Gwwm1%6LZnQKz@qPV;)=%BE&}26iZau_E5)QMc!YW zNndFz#CSkeWT+`tnsNR>i@|o>UmoHqC{0!08!30xSZ;{N&J#(%1khb&u`--=On{Wt zTIeOLMBL%x(lOJVsFvMvEA+gX|Fd*is%fTj`-lZ4kasy6C97{8Wk@1RHl3hlmv1W{ zT6hjK?DUeRIp+ibwVL+MG*-s%ybHUb6^8gFpHUXcR3NzI5(b>xsXFpMq44cH#ysrC zl^=C9jJ3)M-STXLd27l6M8)lrAdeBPjJOdB0W;5^s(V?xFidU3EI_1i^w8_q`lexb zKqgjavgOpxvI*AMj6B@TKQ4108wt4E&GUZj6g|haGMAeFs2|?BqiZ`Tp0!g=0WUg+ zGRPjI3_}_#o-Q@)es;_57A8q%NoFHFD6h(7ubr$A*|^AzY&T^ZLJ~D!IwXH^9%v+p zzYY1BM6o+cfL`q{xZ+Uv%4s22B|_0VBaGB*MlDgpS|@S4RT<3!?T^MEWe5%YpvRvk zg?H3xVeyooRKR9&f>fZed+oJ<7pf>fO%2xWLR_A<;pj_^EWjpk{ypDlxOz-t>aLF) z#F2&ePg1};g;gBuAa5;fA~lvq5_LmVZMbIRh;TMe>b@SzGJB!POTTvs7J9INds!`~ zx;OVvay)P+*{f5gB5!-#vJ@mPU%KffEaO>E^ZXDA<)ZuUk_Or2R87 zTYef>l?AX$?#gIrxuw2Q%s>s1;b7HhwK}vq39d?!Qq5#yG5^f23dh;f`y^Ay&3r9b zxAsV^AUBdEl!gs(JG!7r22tDLJBGA~kFd>r7xZ!*4&O?8cte}=N4=4N?kyNE@tnRL zS6kodYm;Tz9{$va`%r^Vad(_(r3njGy9DN?w3SbPk$z0%NQKY|R}X!aK4teOC*xC{ zto1e5zjP^Yj~{V0%O3HZkMK0Y$oK-?vKVsWFJ6Tu#R&PMJmL)yMK+ zGb5gECa3Dd(luXCaN9G+?!8dn-f<4JBlev0icCx1+}KLi*%$*Z3)hSrS&19z7Nft- zL49C7I4={NVR0>DIoe!mDkQc@LG{Hf7tKE@>WV!VE$yPzetxGgvMk8EHztyur%CC0 z@X23V7h$regtM2vo&7PvBcOjd$X%t#SQtezT__@~+4#9>!GX8PmY4cdk2$&&j`V4} z;vRf_@3iSg{=jORjgm3MW(1$sj5pH9WfQy=1|leoEfuQIQYll59JL0r)l<^XpKIRn zj%_V-D-j_U;C0ohcqNqiafI-IPQ@7h|*~v2ceVrPjoelU%k}ow;59?yw z^Wbpc!cpJzkfYeOkW1i#?*5WR{&{D7z3iLY2hsw}Jgzv2PgG`jr(7m=pkU`V&6Me?t7-H>G~d+Or~re}+;vPnn*UBPS-7 zIjxUnXoz*3EQu;)o{DMGlG!TGAwW;5#BOW>`Y}FdldU+^$t;S8M&_lxhM3Zsj94LW z29CB4>e;PR2{Bh*OAM^lgB~1dWw&9*I{MqO5DNt_PJ*$(ROW>{i#9Dc+kAJ91E62jNh}C<-bx8{#R3kxQNlpd2)tBTJJyWY7G#3y^!lwZ!BzkBl!sC^V z{)^O}M6j^Pqjjmg;s|g%&rAFm_QC4FDIz8rXcA1pz1f~J*)*R+P1l()d2W(mW#iiY zZfH&K?oo8xSx#+^{@u}Vh8VrcLhqcereL%$Ra2={S$4EPx9J$etSlKVy|vgFu{K`h z-3;?8af%AUui@RXn?Mh;^~h@82w#A#($vPvWf1*cf%mDbL4lRpLa>WR^kQecpd2P# ziJe=m!nnV2Qf9A*{+KZ}9rt(n_;ObLK00<6_;D8;hVDnq%Dqkr%5TYq^Y0(k7D?(;v7Yk$m&u;Y)Z~>tB!7|E&<}D5qXJvsnkrpd4Y?_b z^gJax8V7Pds(sLDM+l?;UtSF#S&jRb|M&cGX18VGUJu|vxsY<0{L@P)Qa0m`BjEq(&F3Chj)wx=MMTF zo2RTUx4Z}mBz@F>^uJsGf67Dp2stJ@>oL6?i6G;$yBY*o)TOTZ;7Sq}2ignV4Mgbj zTnJtMpDOf{ zm35dSw{=yHD6%yt^q^e8a_&tL;xYh0-}`9G1eMtt!297bcJKQG6qjcB)CBwxbIi*J z&V!cND73ZR(n*5YcaO~Q#M%QH*0=WC#?qc+Lz10OGs)ix&xc9Co{Ph>E9)$OU)nu~ zH{j7k9MMjhTYy?;@)N>p#b^K@>nYHVy-8ObH$9ooN)+1+>{i@s99je3X*YM1FH~8Q z4xqLGM;Xg_c-$15OQLkBfhtD0M z$uxEo`5$0;Lk~b=JqGuc;n2;8eg3M}hrA47(#2!`-fa8jl^6xh(gYPh%G4nq)QPc0 z9LW7vi+$p)bGIFNx`!5n7WV+fRg`v_5aV$P-Ez9@G)fe6!CSw**cYtKD{q8jms+Af^T zq~K`(YbGX*II`RdzPBxFBihhgnpTTH``v{r6Q*fFLAHE;-McHlH&m7HL8*xzlB=l; z$y!QL#vA6Ji4C2kYn>H!B(YVTN>oUuW3Vdz&G2pZ2Y_bKxlO4_XAB+ zePZL7PBx&s*Rh`Ca>$F1}oe;OwaiL{r+kW-b#Vba_mgqQE~>KhM~!1YoDsB)TPkMHlp zig2NQY~#vG1b~l%X4>>0%*Kf!(4UZx79RRjax9(u;O((Aj*^T>a~wiQ2eVf87}o{| zZTW~IJjTFVFo9XcIf5;0Y~hN_HABV}jkuA0XHaG_BO_K?dmC=?JvyyE@tQL>3EpGN z+4@G=9f#b!hFYtf31%2og|ErqxNcrTAf_5Fk;AK3crKVoi|<>nAeP`bC*e8nf5Txe zA6NFFwlA<)bog9_t-96=z#djY0*gZ{rSqmnaR9O_aY3N5j$u!Hc z>lPV9U(cy6>Bb~M3+*{tixJ&ZrNn+q##5;|6|mf##JL|X-TtRr%Hl+FCb`7HEp|l@ z54Z;WB%d7PQ4_e&foljH#@;Hua7>wPycGY~g%_^_U?3_^Zfs>vuSpr{DU>;K~vbtjJhLen#!LE0@!1~x5O4^x$5C{R=xp9JwLRY|k@kSMaBEY;b zTqV7}w7;e(Xa)fHzrdZj2SiB{IzEl*l+8qm;ksHx>=lnMW~4^{0k;!fci-7uB{+n$ z+|F>w9-W(4vHDaj@y9D-QEbVuK$HvJX#~^gxIAP@4BP!F-HK04(;9H+l+2b1SlQ@) zbW6)MaCs8{K!hP2?8Zh5QXCKNoY_ny3nh)>oq4Kjf0EqPJu3;T*3FyYj6-g_159hg zoRn2mMBDq=m_ew|<-YbuyI36SMbXpfi|%{Y(EX&~@!|204Uw0SGc)u{zvhFLOXX00 z@WQ%kNt?bdG&+>6W#2CDR(8Jv0b&^o&}iu5K2Vgmno-))t@*Q^n~X&IlCd=Uq_DGv zC~9+f$bCj}lA~69ifhLFer_WDETwY?5U?)KyDSW0>rPjMHp zal8h%G_zw8r!l;eQkCm*4ENIW+#v+hH{HG`7ge*J^^ycSFx(q9&z8tI(0QI;IB)d$ zVtld1|0F951{b&my>>;2qLP5!h!umm5PB9NDK1A~^27Gj9*rosMg#N2Y=UGiOQS2_ z*6`@|yw6FR-yN&2*4AY5_t<~=AItu4@&EGwo{J`-KENx9gj!c51@&Lf)}H%ZF8mo2 z5wveA$dSWoqhX~ylEKAmHNKb~y_m&i1?IA}HQ2@xtt?!)t(=5M z4d@YCDIak08f9<^(3X!cW(h_kju4tc!mQ<31H6;{ALFvJpU9CbZih?W5gfT~Zlf}} zl=K*|4?_^k7oq7CO`~1)Aap<(ETk8&UcP#R{OawCH^{GFBh0yowYYGoUts~LXgDQ+ zrnp=#Uq4DFAk&I#n1Kt_@q!ZTf3APvPMVf-Ej&GYZEg|V@INub-iWD;`SL(vuiPA_N$`x+b2YkF#LBfqR^eGhS@#F&6f=gzf`!7IRBAZip2Nu2 z*@a$2Z^+@_Z@aozmb84D7Q!AR!7Ds^xuG9gt{)Ra010)j#c5LvMJU8=G|=YP2LZK*hqupygiX1IOmsq+v*Rc9}nK#RF+4EN;!|;*P&+%PiZlz zes1$JBMFv7C&7%_kDrn${KbydCb^Cl@^6P1laA>LGwOe+9p&X>xE3T>E+W9f+KXI51KHzNum%jXZPrI{ zyVDPc&BQ;{c~l2H%D>-pd134&b}E)(#ymPMT!XgEB~qwmbw=;hSZlINA9?>G=_l3t z|0;_FPRp}^NZEz~T`&gS(c1E4!zhGFpJo`ToTU7PqEe@8tCcL-8xz?HLrqDXQ0O27yt+ATir$5aq zlc~xCZjkke=IP<<0V_EVX$a@(ykT9@$To*>FU*?fOV>HGK$X4<35xxGU)+*LNa`1M za%7Y!r+NM&aj|N@!E`pv-^=N8*S)yY)Vw?4K(9U>YY)+@NY^-m8|UDAW#1K^MH&bO zC-i%wAs22=S&eS8)M!l&C6)g04V{$g_*%N=SosByS-gWGW3)*zR|1bDpIQBdWUi%c z_60l_S04<|r}`Bpo&&B~P#XXA{prmzu1MQ7T6N9UJ>_xDIj#!VeV>f(F%Pb4)YvsOz?)L8sAB2F_IJrDBN2Z zjnTt{**ek_mMwR@q_=iw*+xDmC(hj`({n(nrYocaUV3orGu|e;CdI3aTDquNRq)G- zXm75nu~fL`P*kcIKj6lDN=r+^-rz}wer%?wKI1765Ray&!Pfhj2VHoX7-5G>?oOCTH zTZ?v<1B*|(g*Cl`)jC&=+DuQ3W=&&0Zn}Bx<_zn3 z*^JIQBk8o;gjbK47>10wigTI?w_IcV3n;iFUTvA@3HbJ>1wDWFWAH|7y*m>3rAL2+$v+M^sY2Enaj?lbJY51c$(= zl57o13C^42Q!J5b^v&!+Z|VOc$?r5Z?36i*Vruys;ds}a{}}#VA^bJ?&x<;qaJ(RI z%WCU*383kPp<> zBewz@{Q%V_o?IE`n-i)$L3(7Pq zSr!qfbGns4X?3;s zv7+`;(v6U5^6)G|_(BMTzs9)TNUWwc<=2-f@BAy&_(S`uss1F|Gc9~z>Tw*v{55=i z9mB{2N$!scdx^rl6(=QnPlWSZh)HDm7%5Jfsr#`&e73H~>ytW^8chR}^9xbI@h-8+8k2h}LPMw_JTOu$Nb}_Eybub=z-^|r z?Bv%RC>v)YYlylY9UfuD>lxDA|Vo>W=vEk3|1AFXed9v7#nk+fKEUhaZjk_Daj zTroLxFa!9$!XYod?Zi@`hx54)o0_36X=Vyg&6-P?-a;%%U7OxoOs`6Ye});a_GTm` zv)%Y}?h!_&J8`OaUfx(UX6B&xRPb z3#SoU7UK(qV||)`VV8!iZh*J&0-%`{>IT zl07`A>b9XeGWPklA(tbK2|1h$+ao#`c|ODUvOo+Cp{DdY{I#L`CZMa>~F$z%m> zb@uJ=gCMfm7_Ez83VG&sdqPV9IJ%69W%1oXm~(ik%3{q6ex+CA=rA7N%V1MLRx9&TQcQD-@0wwyRwIQI#1M}e1sAVa^yX8CPS z^80-1yV<-5AxjZei*4aX{<75E_P3onmh$VUsT^3V)0e{(83tm?kSGsoSu8TBzCa2& zR+(W<d%F~?g%RT(XGfaeGLjlQoR3ToLwCyS-x>5{+Jk?IPg%qrHXQU$^Rk(-46r7NVo?=46h zcSZalSRw2}yHPfnmiSE!XT!Ayz9BSqrzy*489{`8s@~ zp>DGitXKy5rZ2w7*%`D+tZeZrL8D@alk!(Sb3GoHmEy_S!9f8suD^ORQy1G2+NbiD z!`V%S4WTb2Q<$3!J86P79zF+amH_N?>vyiF{nH=s(+UuV4AvMLQX zjWjKNdxx^{A~1C4FB00sGhwDEWZd?Gq;07!v)T5c7w`3Z939N_w!oDC+(P4e&>)8W z(pa+_G8#DTt$NSFwkEUPx!2X|Pxz`k>WEepr-?`>!=jXPS=m03;P~Tm`Rup8{~akwhqUK<8j;DSH$k}sDmkWnz3iFo3|=KrVd(x`ViEpisle7w^I*pQ>D4W-4(dihc5NOnDKhZLJl?^>NXvVabHe6Y z-fE$Kwt1si^8>9+EI&mB`y`?FbmzVDHcF>BLFGMKm1XT@l~EKW1Y@tXqWni7tqrC9$%#adarT8+{;qCnI&^tZ@}H)r&l+t2au_A`dyoAA-^k1(0+=h4yYT3cshhB$vOL&pj~|0Nsnlu zxC)<6Ttf?;YubtBeVDevs7zEj95igfgcBT9{u+n{>7ccVjwJ_>zIb0CJ~a-$AnTgv z;2E0$Uqt;6>11}ny6VOr$Rn2B=Nf$F7<%w!P3v?;1aS@?g`sMNK&UkbtUhE!ZKT1vRTMz0oowJ!h6lk%FX4 zTL^|0rg*weM zYWo>)7XmtQPbDy#Wv1T^I;uKy2xg#usIX=OMM07d$|P$SgaEIMysJ{8MR;Rq31pg> zp(l-&mR(#GEzFN|?a+CeOStlPe2`@7BRXfUqO4}aOJXgz#Z`lOQhL1GARoCOeOCrk zHdibY*0&Ae*_9qqrQ@DseGVWWOH79S)bpAS3w`JZ+X_z@KWTi7)#$MC=$MRYy?{@s zD_R7la7~_(i4g$i6{ujyX z_Wf}9yVp*_ul=loFdDk%{DGLh<}d=UBfgX!zJu70gBETnJ6w-S<2L@9oP?wSRo+Jt z!oT`FXq7#I>S_a+cx^Uqy%p)v!PVtN77w*JP5KCxPx2p+ED=|&oM{FnSe8rlsaC0H z>Uk-Dp2L2RquC|yzLQ7N%QLU+swPsz!swXwspb$F$QJfoJhx5>3fruNA0uG-^`Fu1QmftOVNy@`)v?-zOfiiq`%}ji>T;jL5cEdMf$L6*_fp!CC=u<&t6*_V3}a9GLpY=?T4ab#r&-6P)~t zh{coS5wwUJHJA$`x`7yoC$DnT6NWIq6%7Q!9G^;HZi#i*;r=?=+oIea%oqSUtT;C| z|MrD1twAr^`8`Mbm`d-Q-f3B`F>RG}_OTI)cd?3aem#9LdVtUTGQ^yD*R;HEb5RII z#{Mpj+bDwSo@yt^d+`l6+aZdcI7o2j+nP#js7acPe1|LTLM4p?yyHvoZ$k8Dd`1$y zkAoExknvvrZ^-A$t~KshY!jOAnwt3gvA_@0b*Pyn3v;-}Uba9fg@dxpwAa`Z8ed+i z+W6GAb0@ZH)4Bl(RTva>_D5_oG%f4%HAW&^bPURciVIe zp&h19&0wu&PsB2`+j8KBKs}-Ys|?fHVN~2k7aq4w z@mq%R$~8t}6mj75?6)4`IwrO4Y4*`M*j2FpofOynBZTI7f@KQu+(_i(EA9&e4d@|L z3@Nh#-l*0qVHZyf=l)7s`eT}_$E&m|qtGqpEg^2os8c=AnnKY#j42m+}J3LzS@FFI@lM~K$F zVotJ${6i)*P%*Hh-~P+~V+1expR5Q zGA8{00NqQQ5b9^Y{nv?yhb=tN`-6Vz=k1lX)l&)1!|`88(5wddAlcCFkX){_h_ zvV381wjAntrZnNzi4_}iPu-f|xdDBl&SvXk026e;_R<4o!WI~&D>gBzdBbk*l|(Bt zX=eSjOf*g=q;^iQJJ1#&bTl`rU?PzcQz>nWqI#lOEIw#nV;7jk#^0*qXVr1x{{V?` zv;0|s60enKQlL_z*#)RvmnAt)&Z||fQ8qb)@~T_-k?5|_eM0+2Bd%KODnX@gTz4q8 zO!H}2ZNuCw<^rm!i;T$-jwM)d1eSuSXp&U4H_)4?al;*|MT!nAdns?)qx-0`uzSH# zs?y_@L9Yb9pQ`(e0BUi2gM`ofpv+NYFxIzq%9m8!2HA}t>N%l`*@E{+(Wv71=L?qT zQgLxhhK7|6#l?54RVNo34zd*^8y=rU48_K1=o+P%xUHRRZmaRJ3%b%}2OqRPMv~KI zy^iDk(y2dceLWzmTlS}h^Z>2Tw77GyDegWa@f>*=PJR<{JVw3&HkbJn zyp%>K=3F5VBSg>|ONi>L3^B=1hCmvWJWLnPlGpQ3ZXXkQ6UF}M7PbkyqvrJPu4M8f zn!#`ut^WY%z1E9NwD_2(oO}R-Mu9>&#dTIjP*+A2ty)pD#5G~I7! zY_Irp`&DgwnC{%xBgOZM-okM`thcZneu&Y8>E$V}#$%~y(Wt<(9aEnA_=7-d#5LkF zkIi)+DgOWpA+MJ~1WF7X$_yDa^%9Q2j+q|W*=V#{Wpb<(y|(V5qdRQ! zT$d%L*rftdb9GYW;yNc)%Oi$#%4k30TexobaxwW=5Y`qa?kY%Ye{oXg?)4X14LPkc zgia8bc%3JaUu!OPCwF-AUTzsaj#XAP((0x;`k7PWD;N8@QZU-%15kj(WJ$YpQT?5f z+?C;$rKKFzqc^16+7n3zwlqII&hY3#(R?aX-ZRYugig1TtgY^PFAv7>pIpp# zSlE6$OWzl8fUk@8Z~Cjmem(|~XRj0Q?|Xo&Z}}%UzZ3Nc3j-4kuv|-byCQca8R!;+ z{>xta17X|6X9P(&s~~TUJIptS0^$HXr4N~hXg>5pjmDxbfV#8g! zzF>hF1sMwY1LTS>;;}9G+{H{MTJ{zixiR7LM`?otq z378N2tQ}oWt|_IyFM8oNpk|XkskZqqKbbm^C&Q0*1^9vV&uLg(>Yti zc~aS>451DC-9|-OT~h0{bqKF@G4L<4?YDX%kW-b^DoTKe z>WObWyh$^i`K(BtI;Q$3c#d=1@(zg52q(TzIE<>~)ly&|mm=c$jRb6pr`RFmIqd=F zibdR@AGG}f`#UgerGeaQ3OY)^Ouf@uc`-G|Nlq0yz>PIb_1GEe6b)9PT?7Hx#oB5w zDv{Lz%~Vz??1LW5L`YVU{XLTd`J$NMc%=t)DsbjIn=cO(eAK5F;Y2p6o@tu`@P*|=R5@8{yKQ2t zY(kYt=7UC7SoL!mHwc!Bxs+Jwwpvb5ytkh4hls)@46X_`y180|v7*yp`X~PFw|abW zlf6@YHY+DiT~?E9oXSkbv$ENrY~8)kWi$T(hDs^KpP3TZ5L!$Sn98o}k`9UVeAp?I$L*u?Zkp)Qqkx(=zf&?2fDgybixhT=F|kwvE!#CIrZ zlc$S7h^O6XAsF~4(L48TyVEhXqS0uyS}hRuMiZnRMylF?iTf{z>Eo8p_cZVA01lFf z7L`l9J=R5(oQ+yIMU)AMP9kjC_eZb=IP~tQslmrW;bc$tj1bz01e6|eSotIob;x=lb>Ay1Y+@-HRCEZQK?b1EqhbDuq{q4yJXJkbxjV5!d9Oq&(1n8M zKohB0fW&r1JJC9G*GG^*`#1aQ?%GhWG^B={~)a z-H9!z$Q5Xs>fAlmMb$b}n%pugAk|VTgNW#z6T6vODe*_qd86o@`o)Ckv|Fwt(M#>! z7Y8ti5U{^)!%){^>c}lNF*1cf=BWy|YI5z6q!iiJVt(AYqn0p17HiD|(Z~Ylv%aXt zBZx&nQ6w)h-&N*0Yn7GJAzbEd$rkelR1KrC83@Wkl8HugIB>Pk6V*C;CO}tJ2NF6J zTT`4x%EV&^Gql~peJSr9S}va9qjkE80e1<9s9)}% z`${;J8YU`>XN1ig;Wic@r{Er>BZyIPSI}h}FZ9{O9Y#!lvLQ60oPzNOy1w1B64sd? zGTmJY)oQg`g~X&1*6dDK89`Q1t(9T7*u?$FMALctDg$iMb3gm&stT5gB~hw;w})QK z5zlyJ$0@QH*mq!wI#iteI>khjQfbrxzqB>5*-yg8!*hXfcIk||pG7@#19ZaqQQ<55 zFk@+okD|JS+kfFV{F4QIt~xF-xWeOHVR41TxYruuTuX^@E+xdck!xI`P!tWV)EsqB z^vb5Qcd4?f1BdB!sR)&9s1rL6 z{mJDY4fZ;yYjDr9^05AhMJ)6hr?kfTlV#guz^wRv6lJE>fPuX7=X2_R?43|OcfMcL zd-g}ent4jXfA)gRL53PZVL~uk_$Eu6s>f%9*_jgAga?BFw}oK+$Q#gOn#3Lu1RFRA zU-IJY)idrxy2#aHj}Az8H0Z$jczP@e!HeIz@?!dg{{XofSjLHtI8q|${n$I))+iW$ z-4jQJ^5~l_ruxE=XDZH6UrO_&^rdN*@Rb2S_OBJ1T#>?J%0uVX3Fp%2v9boT?Ml}D5#4j$%AAHHBi%a@ z+LJj|L8q$HR0!*Gx4yrZx~BvhCz;gsJ=B!fNR#sPQYvdoF06+hYs46YkcDnGPObJT zj~dDbH}_F^Cwl6j^H)^a#M4RSoiC^YuJalySmR3P2)lSrsA3ZREMaeANF7ul(4!|x zs5F+hh{lQzR|q*j_OG)ys6_NsvSl2C>|10V^+i-QrV&mu1uZ7&zqL4b$mMlqC0P7@ za=ubZvC79NsB9nHo?6D$2JnmDQ5@k_He1aQFJ((@3WELGkN_Cur9H0eFpLfr6K|PA zL2X>(B{0Bvo*t>BH|Q>&>#g7^8mcgstp}h&27^EmHl9+QQX-g5FKt7jhKnGB#<8IP z05s;9o~2@VqHSbaSq=12s0atM?m3akRNfP$uM_7-5NpgHXyVsjVmYV_!pCH{s8xqR zp;Bs8?9HT#ksY$OmEx=!?6lHVB@&XLLv4Cm{$Z3JM_^$h_&We{$ZF z*`at?ZE<1NMZi$Z107MP1iZ&1qI=F8tNlr?ICFgo)eJL+>@YN3CJ^0qTj=6WTvwFn z^j;h~1>o6PgQo$qDG#-i=E{J%7h*iC@@0CI$*Dc6FuGJQV z>c&CPDfP$}!T_g^`8lfjRTh;B5bKlPbOPB~Z#b2r?xEP88T~@Y0C2Gf>2juuedQc7 z@l@!Z2SnobkTNERMM~-zB~ zAk1ukdp+U@s^f3h;L{>{d^6$TmjGgB5#22V6H>f2ZMYwf;T__l{+*7E?ohp8H;hJ19niAjTst>X-{C>BfsiG)Ra3pyX_kvcrdlmBxK|5Br^Y)~ zMg9l(wxP!BiE%C^#JHCd<6LWvajrGSxYruvTx*GOt~JKE*BawoYm6>1ng#FviwpoR z&`Dk{7~STXyf{MR3YM8rwOhnbRrh$H`m3l+Kd3Gyt{}LA;tNo<3tz%P`l1{?_H5F) zO5r<4;}27wCURN|;BV1zkD}opMZ!LdfPEJTTm$I18}wWQ=(rp7Tn+jz2K^TUev5&> zMZnd-K8u0BMZgyWev5!E0rXrA`Yr&t8n^=B3l5PJE5dh~hx~;Fa0S2=fdu7KmkQxc z@Y`=y!Y8|ytop7M!njuo(P^JG&2wDVrD|5CYURY`#8(rS5nM%axp6shxpBF1xpBEc zaZ(=OywmhvVfrsK_)#TlwaU(1ONcHYwOWdvLg*y$PKtQI_HB~qw z=IRrJfVRaAXeblWG_*{rh=g1e5g80J-g!|(pnB$B28r90#$FGH@0W++)!tN~X{u9k zA|)4rFo~ukW5TDNQ4*z0Dv@&2DkESDWdqe!603+s-4PVTW#Lipu-{YgCXqQ@1C$*W z>p;qAY~?OsKB@qLu_28IDxAiXmhc5`fC7arU>Q|IXRgE%BP%&?8OoEBrV3q#buk> zOPeYd@Rb6=L0h9LgKx3C*+3|8l}khfTh&WOUL;>(zNg?85a|Xo0}^l13`R^IsNy?7 zi*V|;UKBoRrz$ZfVo-Z@I}O8aQhQ`@-Bm-f4&+erCjAvmn3%dRc7aicRK(ve3wo)I zHYDZ#J?wLc(DGFSwZi=F}4pg+?Vjf{g z(M!w)EHV)%K(`$^cwzh9HW}}pFYehdCsR6PB*Y-Wphpatlw2J%Z88{@8yV9oi=xn) z!JrYaF)ETfWb8*fUQmEd1jH%{UQPttoQg1H(|NtX^b;pg|~Y!qpYvJ%=!0)<7+YW2PpOcMZi<5vM4l zSZ^j{&C;pu7tvG|fJ_ck7>h&7UYsvnR4)a%GoSXP%+D-e=rLqL@f@?C{(@WE;$lc@ z=31RV9Nni7?$q0-+6&7cc4zHr#DP=wNbhDQSc7N(00$5Rta7P(UhcSXQnaX@!7ZRu zL~7ngfifFaOEIFbHj2up1l|Wx#G!Drguei!!e6PYA_H%KOw97-LXKXLQqAK5Dl9i_ zpAkXp!LB6?NSHPU)Yu8{>w2&M07m}+qccLA>V1U3cDDmPcn>jMA+dK)TsM88lYox# zI2rk6@8LWZ3zzKr7!%d=Jzq1&`RKg4u|-jt%+Nt!QPpL^>1_7dN_X)c zzAl--nxA4(+3`FNiT-r|00MuXKhBqb=Rd}b=Xxy9(f|PLC{FlDJoU(D8cjPVI7q@Tl=~-gSgzNGn>o=`<_hUF2_tgT(|xc&vv{)3zwIg^*=2> zh*}4SAD|XWB8a2Bq9}?Yh@u-iB@sw*kEl>ak}6AFzf+Kg4tbTF#%@Vg3sE-a350aL z-wA5Wxnrf_6nQLvU?vKN8*zDqYHNrg_K3>`;v}84En*OkJ6LizD9~;zt>q$%3b|xg z545wq6{)F;NbEfHE%@!%UsXh#{R`_~M;!rZUteE6Im~{JKCWK>08H67exfQN;G%+N zLOo_wMY7B~&EQ{njja5`ksmU_Yw|+EX7d?LDZy<*6_`J6h^<93kD1FXyKzsm0>PPa z9wj3L4IU?YOt1-1LkM3Pg)A554eh~A*|;GbL%k$P)DfZZJIy8nWL&nxh^VU^twKR| z%w(&~*mU@h(oz;6cAOmgSzz03!7y{?#Q+q@7{?g=Eh0MyMxkcb0DxYPQumN!U+hC7rv%8ca*2gR>X4I@G2gUSqrs%hs!*uBPVRu97OfDe z%hhdkw zqy@F#!0%Xm`W~h#jJ`inwW^h%l*10^F40eXLb)ZlbO`~IT~ zcur#y(PP9lR%(cA783ZB16Gh}K}iOL$^QUz{OLy#v)x5Gt$&GzfItmYWh+;Infd)1#S~&J(YBYq?)z5L55>Jv*vjd`H?9vx(2&R)e=`+X>--TWb4D z;@I^vgQLU+;l75+v)}2hL^WB7ft3PwLQ_SD-DJja(pdME_0%9w7^RwS5cLqN6)6y? zbeOX(4dsD!ZPm-`q6a*~G1^9a}6GOq0rI;cdH$yNMaiH6}XD@ zMIg}1#as|E@I(=ZFH0g?NEX|*JZ$$jT&Fa{wpChW5eI!l~ zeU@Y?e2jsD?5-eaM}ZhN>BHRN0h!=IdV)Nq*?y*Q+_IoLB7CZQaS*o!)OIr}V)hfC zVX8E-Wm$ZG$!BBvE(iPCfz$lj@z zf2Bw@1RbU3Vz5J^^#)mkk6hejBv{)UtV^cj4p!VHq_lu`a}Ufi<(WB_q`ea04EC5Z z^C&ig;2Dq=Qy$YYJHl4Ikdt-U;ufv;jdM}$-Z~5?5rjlRc#C!GC z4#Ryh32L_3Ac+mVrtm?o^Z zfSF-}{ov9mt8uNu4~RTLrk@hvY&?;JsVS8*{{a0Tr0?kG@94g)^{$!dX*T=)3zfm5 zQaO%800kXC8h$M9S4Vl2ou~6DzGNHzuEMr%XE!!5Kb#ewfE zB1vL3W6^!eO2HU2tV$x?GY&k*Q!G|Fygp(@Gr$b7qWPIT&nKivmhGvN?gpDT;tQ$P zE?F|Sw&o$BQ{FRgU!+$Z;u|L+ClN(JFkynd#)L2H4r3`SH18eQ3S;k*m!CFBBrv45bo0bdLnvg@Ee%X-3<$S5 zE={6#F23^YgUljlh*ra8=a>NivRt4CU`0_Xv=tVs%-HkLSDXoc$;8Frtz~sTYHHjp z20cY|Hhn?kL^E$sq^&`$5E^9d1gvQ%nSIENmbqDNeF!5!YYFd>i?|3fEh;8zy`AE9 z%e1Iect-S^fiz}Uc)O8(H~Jvw8mG5k=hynqjlYg&T=k;}JxlT%n|=LMFvO-xZ!?@w zeBVdnK;q28t(kU+PT`^vtB&^KERbY@tk@-2Z0+2uM%Un6!oLDCLoL5v7_v2Axe=Kh zLlKf_m^8$wTpXpx8|ff6m6WW$+2o$mk#n*tqPV)dQvU!hlfK}OWESIB6^p`98piv= z&juIN<~uMx!fA)hXW)GtO-5gj(6S7F_&NLNIi9bMpI5|7WvtNk8g&Z|g7GYrHch_% zk^rB$VT6{bN*3+wZ6ejUm1>nQSDPr$vZf+MTeruUlP5N1$EiR}u<5Tkn9wgWwSMgN z6p@&_nV7wA!oS{BzZKWz;!#6zDrGu#G6(vNln}Udy_k0wd`z3aG2~-pbi^VlJx6lD z=2tNDcaCsu5t3B1o5-H-=CXJIjcCBc%XWw<6$DTd%dJXu9Rq4E!_eR8aV$?h5}{+= z+|>bUv`aPq7jOx|Te%F@y(bWBLnsDle`MjOlEkbvS#7-E|_DZkKW z;nxQyMqQ9y(%)0E3q}SJ9JHr&E$bf((^WM%45|0gtdGn zd;ZiY!^F`Wz>KRSFu!;HWu1x&<_)k4)pYXr=p4QDspm@gC!G-v+m)Hz3$ zn?3cb#MC*3P4bvr%Wrh*Wv;BH&^OUw0?C?%Lcq!80gqKeC3pZO+{zP`^9+2UFCX1S zYv{ebOx!{p$VfnU`cHmxlVHm^_(1pq20|{&FWsXZrQ`vT#)g^90x+2sB%tlvkt@907j-J;?;m8kZX{$XZXGlIWCR%$zy znDjYK#Ff(%kFJ)$sII-S^z!%9nf*^g{<(bCYqZ!S?JSp+3E=cMHhbs^5pl0ac*!j1 zME2cOL@IfkCeyqaMd({LK~4>FuW}H%hDcLqV-n_8;o<6R^~VZlSGh}d;XSS-*W-^4 zd6_g(xdDt%P$`>hI08Mr2uP24WajR24wu4ws@Sx?(!b;3nnQ-d761?5e2vpEVauzfSy`_c8 zSYVszYPdGLeK*p+ujTYtmZJr-q6%X`)B=~GxwG68h`l%oVQn8Im$DV7GUL~Bgx%0)MG4^5i8EO-aI*TJa;%qf5Y+xsFoGx9ksne%m@<=kNgPs z5F8OuKF-sAvzhxvf@2wfa%m|j%FC|oz?YYZ-ze|pbhfn@YZmXb4ZAMWs2HOdzLL1S zqO$0BOb+2mM_^pz^x8U$HBGXI+_)gIjm$B6mLN+dT%etI#%tU6BJVV`L|m^=IW77t zmpJLq-$(RKk;pM~(>Baic;JkvF+Ph>;Q|fOTbPWfm3AH{+YB#a&zuy>sO- zQI?Tt<7x%KN)Rmmkx?^=`@^Z0qqQDk&W_)AB{@DKWGR^EO(5u z^PDp*Xy#D2i0viC#SN1NSZ*9ZgH#YZE>i4Th0f&7;hFl(8KCC})=YG4#BE?}5nq_s zOuPat21KdA(V&NIskYgkByYk1FwXRj6=Qw}Fvz#r8p*`dNatiWRxC&FZhb*#@PqYv z`{}>Ystg>%j;yvmWic!LBChi^cqQ^EO58HXiky>=l8(~Up5dP11nzSjjAk1z+9ti~QeOlD znvtFJJ&P=14Xg@!Y6}x=6)s^^GMHsEFU7fkbzWmpHi}9ig5D8b_r*XB z0AOg0+zeel(=Y}J4Kkb?h}4Q=vAOh`Yl&OF5{T((wUm8gyU)4L>W(;`iGC9NB|9ZM zC!%^KJ0&|Ip!=VFN~xhhR7FA}yQo!t6lFs6Oz_*kqXV#>t(ng+WnYNfjo6p~>%?YN zs2cXeHK-%YJ=iS0_xwg}U->ytPzwlDG>jD%{L2l!qW2F*1J&MR!HEj}%TTYca}MOT zR%pu1F?p6Q!7QUjCSj-~9c7u4=60ixVl!)*$zG8ZTR6B2jmpA5K+IO==K4F8H`3+H z>ec;eU;IM@UEy$Nyr`Io2Q$biPF=rE1>x5EYs=8Go+l~`oXM3CyJ->Os*Qg#*kUV7 zal5UGhT7P>{{X~Vlfk2yd10zEEp`qGVO|c?I(LnlOzq*brUm_5GL0FAZ=6P~V673A zb|P2tsbI3G$(J=*H|~@Tvy6BoDciy@{@G>#KCH^yf&AoVU${UlS>L}$66~DjRH~l- zf*k>l410Ht98CeZ4!AUG!^kL-#lrj3FmTq^UePYY>31M(5%SKDZ|o1$DZ%Xmj(KG) z+qbWcfL;JMB+OA`F936-a zxtS9+aT1c(n9N1Nil9-Yxa?l>DO>L-@MXlM9i)LwZVsnn5{JtZ&KrakuyErHEBZ?t zl!bUyPjMJE8sMbQlr+FHW82wB>Ry=en90KC3$98>Y<9U#V+%Y-I5M{^uKm}NQC*7B zF!xp&g#c2}-lJ3?s$_#O*M@nC0=AZF1rbg5ZU`Zvv~_8F9wj%lg3Dj{j3wn-WWPi`ImE#&^o0^Y+hrc2%5^lON-==?e@R|x?fzjCMW0{ z=}6v*!#?Hb?LqpD#(jiBn~Hw)0Bx8eqZTlt4A%LKtSjX>gOe~B=!n5wiGc{;mk$lL84M^^?ZXSy9@5riSC z3rm}Q104`hf~p8GtyrXNmX57^@lyBEEK2BY5sryg9wlyX7pPSwHFwOwn|2`A85B6l zE)eFMn6f9e;%iWc<{(rVfDPQXNInJ&FEjBU$3!(DrrC&ivx``vV&&t^Ol0LT!#$yI zv^_yn^f{>9PRMZRF+-Ti%)0I}z{KG7i|W87Sumtl^{J>l%%|S6pMf@&Fa>#LWrL(8 z!BNl_oWS|A2(-jfd19e}wDwG0R{-y5jSvfS80{P--N})RH_$ruIVY&wwdsnj zuF~a=FH3oJ8q-}avvn5S^%o&X+so8h5mmL9(T;22e?dd-hcm%=4j~j#9^-)5Ffo8N z=fpPJU(=THEE#Lox*?8QivvMY&*6!uq`Lbh<{!*iI#@eIBT0r|Q+bG+%$CbuCjvU{ z66T`nTg+1J+~&c|8pB4c{ISp5iM6zFHbQGyBKRi(8J71PRNPyeX2Ce70>XmWW#(CV zM-=p3Kuf+LGy|eKP=sm7wq`sIfo*PBk-ErDzLwqMVzn+`)6Y&K#lE*M=(&9?OSy98 z%a<-()Q;(2sMnHNfsEw`LZ08NZAy4lOBBAhJb2uu<#OA&@d_wdvhXlgC7$vc_T||m`UeZmX~p;RXo#T z3K~PpaalZI%L_Y@E3cMgr8`M57BG61OQ~NV;gp8Ri#$ZUNw?Ho%rc0b9&nBfGw3@MYG z=4V(Cxh4F31Q9C-9{~Ho?UaPk8WR*)HlMmvA@)R8_D^wKuoU6YD6T@IXJCxAF0<45 z{{Thzj^*Mx%&a=IpQ^r#m-W@koDBn5uQ0=zblUZ01tFie)-IFR6AfHe{W;c$=1^eC z0KMR{pn4gnJDTHD#z!z_7bE#6t!gHEDpV5V(?K7uunhc zVCw4SQ{5VpiK^)>S54}-&=J8n?n()Wt9(Y!;h*PE@F$V+GumebWkz1|kOyLC3wxdB zdnXg77(hF-ysZ(p;w*bo(;2C3zM}{Z!{&d|Kqi>&AHgYWwkwXtZv_y73Wj{nTYN$I z(&ELKc-0OcGZp4}F@l4)Tl#-JIX%z9bmB4Y>tvKWRQ}?4KNI}P{v7`RK37a%XVB&^ z3+8`wKcSvq%>MvtDIYA|m^Eg(NpUVsPw^-C9T z{{Vhp)Zb}|mYZ)ec$@HQSV z(Be`VB9KNXH31w;A=c)var~ZGzbGI3$>5gum*QMJ2o5{T9k5sn@5KKADu0DP%%9>< z^Cg`w8bY(8Kg=dcNHD_mPC#S5Am{T4pq3_Ui<`5Exd~3=;>VW4(s!P+CE0>C;$~W* zf3(7~*`lhSl)Nx>i(conMO#qx-+aY}`Bejk}2}0$3nCtz+ofDHU!s zjzxs4wWvW`1>B;EyT+K6f_9ptMR%xW3pD7U@<5Ya0EyfX8~n^U>+g1XXKp-@e9TLw zd&~Eaa#7|1rNSDRBXim;CK@1>(7{WPjn31~jfIg!qRL^|z(=_nlw&m&KrG^>F&;-B z_XN)5&^fp52_HBiHe+x`2+VKqhYVt&iz@#B(J=lc5~`S*vPHOV97#8C=`FO+GJ=FV zji{oH?d>Q@PnKaD95B^XG~*APObp98jMu!&rT}IVD7#pFw3kKY3(XR}`dKbKPG-Mz z@ZVDyS49(vL;&hL76a}&!(C7#r z5FC=;CCNy%VR2^?#}b)dC#3Nv$WAjckr%-p(-R|IqSQM~cmk~0>PAu23;W~y=b=)H zCBj&R#i-9KsecYukFkh|r0Sj&11kZwaXSjp0|DPavCC_0y3~7#L`OVmo+2w$y6&-T zr6(LhKe#~|Cem3m9b$28b5hU4n6BSGCSKXZw-zEwF-xB`B+eSHh6zD^Qv8qFel{Gw)f_uoV7{`LwR*JB`lbKGJabb2ZmCD^r<&3f> zBo3-B`=TB4chiM9?nb5vt~=atg36^pg#!#eCNe2l?NawNck?p^+;JDdJ0aQMrjiak z_kr6I*9Ja`NR3xIGo#$!TkkZ`hSNJ;QjoKyfK7({NU= z69`ojRpK)Alz9os6(~N@U}YMlb)&LSHx%HTQk=fTInI#8c6t`KnPIW!H3~aMHdhzZ zwajK^GJyzL5q3nGl6yn@%}NV|PWcr+2@-sZxo*FiIP~ZUix?;%Be0mQ z#u{Q!`@kFouT4v^iUMya7O17p1&|JzE3|yZgP(b(LNF8D4*~)A zn#`{ei)=FE@ftIz2#{Ff4~RX81Bq(8gr)GB0R`q+%(@_g;rmVf*pJIk3|Gw0NS(6^ z7KgNBN|%JU-Y2p*J1d%1c%BL3=)Xdp58QC=w+e#3-cLFm z+&VgTbH(a!)sExPvu8~`--(?SLFd& z)HNW-YGei(m8nmq(#)n3p$yE<5(=7lpS%3#B^{+5pcz5LQ4ER^X9YZ!H^CpACf{T+ zB#VKYR71f|5a|T0*SLp;rR+m-2XX2%66W!+-&7*TH_eX@@-u>zRP zs3W*9y2q$+d_};&o@N~PE|x~)aXsg}_m!w=vlMP)tfj*+H!?9uO5jvyh%mS*e$ZW@ zr;#m#pLFN0JC8~TVRHGGE?l{C<;#hPb{*IM0I?sntQ7`abS7*ZN|-0O*~~1Uu^+rd zC*3D_Ig{QAkb_65SD4zGfgH0>;T{84Wx4tK0npzoMd5jmC^p_S!=Z<8%#$^Tso%sF zD2dX3^9b#_?DT>7dSKheYcj5NFFtTV6QR{K@FSRxjpJB z(>$k+G4v(eJ(uWW9Iz^PmQ#sxnz)oper7yz0^-)Gfg&Mox&tmU1*a0dj?B0zo{N|C z;X-QBf?T5a!Z?<|DQB5?Xyg=joQEq3Nq8sA;|S2hD?r_13tAg(s=N~~Z>1_xw^M=p zR-$jQ*vzR4tHe$LnyKxOfmC%bg{fysh^UOgxkPf9fgfplcgc;X%p)Gc9MMWs*k&Z* zCB9*4M>ByaZKz$1Wf)P27G;+ytBmbZ$yv7k^BM5PpoR*!DSfaBG>J!&l=n*{ zsO1g^JFnt-6BMN~`R!#8(NQZY^A1zbGVkR=&tq>hOY=%segwv;$cfV1q68Jt?3ZL@ zs+Bx>H31Djl2}#=KsMKiTI2+wE)oZoI08N6VlZ4A)YSVyc!DT%3uEsY)jN`&(u$SdT^iYqTqYuP z#bM044wVhWGbPH`42qkTgBJ?XbumE?GcD*YItz~Q!Yd<5eujSM_UW7)Lw=9_mUbAv ze9G3bLcD&^@S?)YOX5{lTTHc2wmet&amNKakb5aX7GTukWPrYJQz%DC}TIwN2Vx=xwHmoRG#h9T<;hekW zW&kM477sT7Tz(>`271oye&<=uFVyK3h(2A*HH7Xl{iKr6jqbH@v0=%aO}Z3k2`-hk z9r@xClMF_;IDsph-#r=>nes@jPNKFW>L&tmZz)lTmLF-NV~-I~(lbI5@WNToDO-rV zYL~e$+FhVK^Yar6&CFE>Z#kDkKR{%Q5r&lrf^h@`1(R0>!pLjhOyPGb2}-rpv~$z( zU)pEI$|yAVj84Ye?`yOWxiTf5;Q;7l3*u1gAbVE zi?%C&d0{IniC|D2w9N?GYT^v6S2cjvG>pirEkT?97?@Cg1U2NAO*iG;1q%V$i??Yo zoJ(5+Q0zdkV~9i>P`TL+1eYu$$TL|O5)BNX6$}$ZG#OVlDSM#_4x{ZT^q7Y61s+ntb1Z*l#&^BpaV%y)w<>fJzQk@(sfNu& zYHhLF=4wZEn`L)py+t^2P#PJA8n^d|Ur{!h`#^WQhIPW{imu z?x0kwv&^qHLWaZfGLr3Kl*Hvz_=vAtj@RNm0>@p+f*GuwAK`@>m}GL6M+i}k6YiE7 zsLb)cCS)IVKyE^?WAQ0dxuf9>HyUt_UxEGdweH6Re$dH0YFFk`GUvf>JQNel*PZu5tH7 zY46Gl9tnyeqQKv2b$hvEYLpS0hsrP@c|Q=KLaMgm$|gYTyd9HR{gHtz7DY;b-Twf| z;qpvX5VG9?lkvs5QsB&^PO4j;xa}=!T42vD>^|Wo@PUL2vY40E;)PerQo3NMEXY`% zY|tn}%tM;&g+!?T05E!CV${H78o)%sJOh{^)$Nd0{KT5`9FKTf4FN*-RyFdU59xgX zN|gW%hcb;dc!{#ukJ=+GV-bl_x8>XF8Zl8D3+_z=T+9r`@c_CM?=c~SEPde9*p#x( zcq2|M?2+SMk4gMei`Wk=MWP(VU|5Xpq{G#DgfSi^8BjyzGocY%0x@6GO;IH-VnJwM zP#o_uq*uZjp|^x6i%Ou)3zz2?1xwM(6x$Idv2UNb&a4oq(4i1UA?%>Rv*d(3XL z0_Du1;fNy-xf@!OyxRu?p$b%n)}4~HS|dXgTwj(1NZB5y7qp{WzgIgb;v*R&B4)GY z<83IBuH#UI65L)@MJ-Kn`5+(&x~}q^+>Tw_u-qTHrdE|P?J^=*1Ho)spn({xA@3+6 z-g+8&`xDjZoTEA+`46&2ND474ooKOsrnT;kOY^KOX`yy2jwT0t?U^>cKD0BVlv7Z!L+?^?a+ zK(4-j(L~KJT=wUbL)9OXZ@b=#>A63|4Rr7)WW-e54H3Q7>7Q0{3W=aHdR|t~8A7XK zo4B%-{3b+3zmD9arNX1rg!DZmTp#x{!BlNMxCi@mgLN<@kx-$hhN^oYiMKIM z9G$_%w3*rYmf9T;UndIe_fnZu_^YBO1iPPZum0@?53S;x1}UB?+I1{r!sR+`Ke2Lg z%oYvbKfn-n+hA#-WsAqy>ReOIKPYnCFLTNobO*+S=G}QoLcl>`TweH|xbReFWcfEv zgAB^;z%r_l?l3rYkXCZ;2PP#N8w;-F#4dG3g6=XwWSP&Nc@7hvzD)$Xlvgx9#r#yc z3pq`eJo!L3t$lZnU%+lPhi{KvX+cOw0YaUAD*QB4c&cn>C!o?Gs0ntN?G_}T6X1}p ziqgQm+=s~svoMG}^ZpEW)`}t7&04eDOO)^6-?j~)Z5?c+w|%tD@bJU(w7*ml9!R(! zrmM_#PHFl|q3Ja+dEiI*GdrEH_P{lRAJh)wdXzK0S(gNR*(xyx4F~oNZ-Vho)3@x%mCvg8DOMu1X*L6TrkA?O)PGWH3 z587AkE&Rmb^$Ts1Nlw?Z8<;fndX<@(7odF-5t2dRhg8g&HTV5kOSdrcvODJW^*=yX z02rjzg)6EB4~Y^ibp!9eVfGH%=Z$W@0geSq74rBG%^?{(9TUZnWabGb-E^<(ru=WZ(>CIl-B`iQ`vF z=}jaUHj>G%yDL%~jOy8o5tMIU$DESaY!-c1>dy4+xIaM37TiQoyOA+jM0p~iPuZxD zPJ`uZJ>${DWBPciM=S$L&95svLN&+SS`&IjX9lUm@GJ;N{MDQB^n^7`a3b^s-J+>B; z;bF1VlHBA;!Eif?qGT1v11b?TzeH601JnErXjn2td0A(ptS$OPE+&R6@pTeCJhqFrYA`7TH{yTEW>u%7GM%W7)QEUlG);U|+$8lVN2Z{L&y8pw=PB&QZZlm(m z47pSETX2W5JJ0#vk^`Em#TZPS#7ZQ1QCcx2Zr0%Dzd|BLrq|V2Z)GBx-C-x+6;ky1 zi1Z?j^(AceXQ>9*g^i-X4$owG;DqX|6X)qS&R)wz4cykwmiVJ9jxjXnJhMt9$IJl>b-L@Jx-LcU=;i2?bL1Fjb#c_ITw%BD&MimWroyN$Q$tf-m z@IgST;A_Mr?ZBtoJH{wm(&Mz|3!U|ii=4wxmqJ%jBuV|o4#RYHi^|wu>pJ={PQ-Sn zd6^zyH&$I_JIBxd%eNg|v0LcteU=}8+4zd>@>#ohiPG!UyqSl8z1~e#uHc!ckgTNS z5M1Ld;d^H}DHxG$it+}tc9tOlT{k->U73u|9D!Y6@@lnvk{kYL@MjA}?a?YsTx+ggFN!s{X^VllSaQ4C zQ`l#l^+@}$cFV^B%vB~drIJ8lIk*W~)#`)dFE{v!kW9K9S@-5t=-i5N+fdtI0LH!r zGVA4=#9*#Owy58Der9j}LPn+Y$lnyepo7*TN_8>4-%v4zND-J`YE5e6v$#Hjy=Y~;ZZw?LGX&`U7@epk?UOG~a zu-M{JtVs(TzgKUJ`-z(dlE=}~^SlZYiaje88qk?z&CvxH#@W-yGSUN}4G`~aY_K+!*cTf}O~qLO1JonSSI$Mf0{ zr()U$ZwQPCvoy&Cy}p@w5vYOXGdkC-%lUlF!u*O9a;*O@k58;iS2<06BI%aiKTerN5UAU`%5@64hR#%GI}Y8-q?rUz3sJ{>@2W{=-nvdyj=qWK;?ktkk>@WSTh3rUHM zZnZMZH*<+9x#>X0^I<)1Ub@HHeQY zPrttBrK_P_isnc)edqI1IqMSp^aGY)(4T)a)#E8sXaJw5(`>gKP)i|PX>b&V_>?Z(j+p3X=-rzkmL#XrmNKSmY`vt$SW%y5GWLp)q4$B)p)>S;X-nIH z{fQs=sYxLc5f($Ria(JBjUixk8i{8jx*D*Ppm zJKAI^3=YCOJx9^w?T$LnHHp0a2PiU;Ae1<16HprBF;~$anzZ>ePeHAVO;>cQh-Nyi z(Bs4^u1G7BELUa_dwvhuv-Hbvnb0yCrCNnp>~ZP+`F{2N&p*HoEA_55Sm@r~h<^dS zzDEC?-YefH$|8S`g8ONxEd=s2Nn}b;u~k!CMa(9-7WJykq8kZ*Dro0aXU|qQyfTZ< z7?WtLr0T4x{x^q$+>=qi{pZ;LSrjL_z`mf@iOq_4(~@(JBl&4)(nrj2m4|c~!Uzq8^WGNbx^Uf}>ln0&98hhn-!_gL}{izQ+YsbM1#2@ydmaaU- zdTBgU1GV{Heat9>-r;D01*)Y;elyFu$-_QiQrqc%h6m)`51;rpSs?<+#)wrNceUuB z*p{(aC*h#rpmM2v@B~GN0px>1wu1wXM=HV^hRn#%o8nQ}|*;4Hg z0G0Z740(2;gvZ|LJ-ZV=nK4z#+;hjm#LbX^eHMYdng?Je_!5&NQA+4Hu7W5prA>{R z!|+TjH&Ugl&oy?FkSl@k5t@ukQR*@4*{@7ls^?bv*_+IozX~g4xx%%gBjh4zI*%|i zJfPcKd@!L|>sS-cF>?7i-9^5S@}1K$uOvD{!nDNKVK-dg8CCw#3UJY{Q{H2v_H32F zGi~X#>z;jk51ohD`!}+h5(|EWi^6^C9=yy=&o5)HLO;?We)e=z>;(n9FC;z)amVnK zyQj1kb%U2fW1?1c1MVih&qto=m=*el%gPQ5CRo9txMkM}{-7=!vaNf-hAwz5BNx9e z_d{3nSgy0=ht@pQu5rl+WcWPD@zVCC^EF4)W)erF{+_H9(v$h$-9&0O87QLOG7 z3X$Mp)>zxvO&fl`tXgBaV}TJ_DtT%2J(tna0SlGsc=ZDNuAy{lPj|k2YD| zU=t59J_{%K(CZxwkeV;&3A=-mA$5=FK)Z?$afXBaFpqI|^DJ3L?2ZRW1q`mqORo@( z3arSnRJd5ED^vWi^^McPU#97&SK$OM3dd`vm4|`d9~F^WSG$jPd+M5P6vrYsdb~F^ zdJXwOUGMK4@KdwQ1~<=YR{6_8@^XP#bgUqyF>CQ3N#BQ`eZrTq+ zL^kCOkc@c>yBbG8JgBL93e9qancpt#y+8a;Opy44X0W;IH#qOq5WA53YdF#;k7X{G zK!c-y0IYw2_XJHmfPfRjPVamnH!*Sp&d+B#p&{RSP2&tK2{YWR27an=8r>p zHRGJ?uy18A`Yp<0e1s+QOLL1uMK!!`BWGS@$Sc6iuA6@hI^>rr-OMT9?OYN8Q>SKU zFP)L}p`sQvy9KY{6s);ZU321RBicU9Cc0R6?+1PaeZ*;FHe=uYV(%V4J@q^*z_Xj0z;d!YWazb4x)F;4mIbVmssD~j#uTN zX`v{@slwHcNq;|-+AWTijZ{8f8pO^X`Z96{eq>_y%y8>GIdUGX_2s4heE$k8lKBS< zq8)IkA3vSdHO!a3Og;RO*K4X4__d(X5bC)K-TvIo;q*~KOPCf2H%o7x7ReScyyA|8 zH;Uo2e}MbSU?t!BjeM<_*EIU|gMq|35!RG=q%AZAYtAHh6wP7L;v%vL3!@G)yZ{L+_G%i2d zxt=vbb!^_0Ig(Dp<(r6PC&e{94c-)$uHDg0wyzg(P(2fuW6Vh%Mi5x!%Gu$+E6$1c zj=@ho>e;-5QjpHAkS^$u;6K|_O<^L{Mv;jRaubuCl8JPb=d468SgG6>mHRmV*24{< zZ6hv4dWy$vM#^vx)6}nDToa|T3&q_}8zy`IWne;KRADb}kw9>GLJfgBB0)zi?#x~m zfZOWlp*YN><@!=m5R=F^*)*b{Iq;CdxR9&~wbN>b8x*o%u(fAdlD%e=QmFM5tCHw+ zGGnL8SjUfgC;D}%WSn-RCyQ1V;S!x^=C(W1d^b?#mL9QMxF7?piz)HJ(f=`y{xw*` zDjc(6u8E~`+Km;QF_=9OHzW=XnPoHJUFKP?2fM*4p*E$ zxd*3LtgH=VzIO_$u~LaRfG7N*TU1yj`$J{W{Yv^3$H!~PAKDf!uAk)}DrNi)n|M}D zU*2y%YvHC((EL!{M`?QHAOpO~$*or+vB*Qw4hOGw5)B`WLOd*rW~q%t^D$nA$r4u! z_6;zTE@I!J3V9P(Lxhmq{yNyA^WPJZ19Ok$Vtr~?BR*vDw3@vxdOj13+rR-E7N~ZDNoz?ak;RF1Y1DH5 z1Aqa@$p&R)b6>kR6!t;iU7*GDud2c{|M${ueb8;~C*GKQ)VldyJbx_mv&u0{xAnWr z4fOc+y2xtaV&piamY;>m{X+?Em_Y{f3YId=Ow)2*SJv6ap&|}EJ3v&lJB-EDS)oEe zJVxkhECYi%JZiCWeZ&31(!t4%fv&1Y47g-4#o~&-*wM&SeFXpOnw~IIi9g-4#>72S2{t&6Ew<3E0;F zN(S#oufDros;0L`uD)a51u$qRNHZ~P!9&KVIJwah#PG8$#l%+dKY(rZ zp!tK)0OlC=+4)O^-GnHE1Dd1F`a!10{M&H6-?(TQwgyYqLC*@-Pr8Tp&t1<~7*7Mf z_nEf$(cX{WuQ(p&zufDb?#a!TTz&or=#iT%`J;Q|^w*%|HuoQ(xB7|WuRg=o%e^a( zzr=SOj?8CI)2M1h9GsLNgLM5(L%{u=x&(-*7=k-Jom&LDGE(w_Tussg$IUBMR?9<` zXn&+71bp3CixLQ*R)f(n`y-6k(X2a#-iJ$d=Eok>%38?}k~*yDc;rY}wVjx%+OkYQ z&C>rW)}4#}HAUe4E^C1^48TYn-GNhP+dM>o5ugt;vCh#~Q#d0v%M0KeKr9G_PJ zGIg<%bv?1XW|GzWoHv+b;+%iSTCDX)0y-!%;= znyaA!GtZW%Bz|7_+HKUP!*POJmn2V=e=0){A=JJ#rszDZNVMXw{x;pYBmORD!f^8n z_3954r*2&d`3;ZQ3$p?EBVSI|1UXgJ=8WEh1WX}7615audZKhxRZQOwP%SdDq|}Yh z$#}HQks7`-*761k08i8mMhkA^=PS4$J`Xz&o(Qm3CZBR5k$?2fB13hCAMWV|VrgKW zO)7yFjIMAwa)_|2l8uODCa8}Ii|TTHD~3#{C?d#W=nw=gWp+Ys&60`_Q%aP@C+(Ce z=qDga2O*d|FyDc$jGJQVaQ;heJ9nD{0_G{oW`Yu#Dilr zreGQGX$!F!v6K{@x+dA>%By}=|U0$>Q6dCOpGmBX& zcxddkFHD5WLpZK1hCC735(NLi`eocQeeqZ%CHVK}A#p9CFqO2M16`+hwqU+woWy-s zgV6x0BLBzDb^7$|t5>3SA-$NQ;6`m%<{)fBo`TMltoC=azTdtv1Pm+py4qk)S+Tx> zw)B#S+N&QjqU3OX!-i+SHEn7450NOttTH^0qhJg zBq0E~c9oZ8+1m=OMep5(t3XjC(ScCeK_>F2a61U{7mCoB2n&#KM1qnvj7QAk6KPHx zgW(98e^2o`2AsV#~R$hUrGTpX!rqnrAQf`QfSmR6tOzwG;9a zu4^)zD9PU}#o33F&Y5k~Q4IYDpp18vEzDv1aQ~idx%MniY}UAbQPSmLn7`-2w-gow z7Ec^EHn};q@uFqr<>8NvvizbI#(7jnDwP;}@%@PWo#rP@AS$z_r_WnqgId}|)-2C^ z{RYKh*%*3;MR`r!L1(_yA)9DpF1JiiF?D{|-%b z*!(^FXJ$^mfho`0jn?4OPg2a?%cc00R5EF0ya=p)bXiuiVDK9$Or;`Ev^9GVdE?i0 zbCPVvfK$}Hz}P&WLg}z)F6QBFV&nT}z1<_CS9diS&5x%$yp80%N~rVqena#R6_Qbu z??Y+rcuK7SyEDHM37yR4cUV2LZxzF_ZOm@J$l+CnAG#nYJJh7Gdd4J`rShytcs!wuIMWUZ9wgCKL{)bo!>2sL@oZqTCR(kTkAVjGchr$WdMB8s_$7xGb zmMTbrEVn>zTuEc+yZF#`q7bxlQZplgB%9JQ??93+B<$n3m5A5K57J825+Mi?*?1-` zOU>1xQvY|5%i059cFDGcO%c}NT_z7mF-}J`L;RP+H$Fn???)EDv+G1~Vy|;Be~Nl=dUndPZ;oE}I03#C9zKUywUiwQfnwU>t<0G;^?Jqnx zmAT_FW}Ly2XWq<-90V(vKk;o#QjRqhf+aPE{|waaYHbVbmMw8(+DadOMEV(X4shqS z9M23bt;1=Jlqzr5KH}$2RA$MqTf8`|vh0d3$wKC)V6iLc-rLYG0EbT)N2V_LZ?CGz zeBbtvd3w~NkBBDQf$eQzBWzWMUh*5RJR!N+UAuZ!f>+;9H+vK9Jguue9`NtCZM#^B zXj@(GnvwB1GV5dXpcM!DEYHk_DG^2E`%@N*#gRqNld616kzY*>DK<6mWp?#`w5_`C z;{tiSTsS2LyAtVNwg((1G99aGUvwb5`&B~eY|{6)Ltw3`I_;Q(GjT++iG$4iEWw1L ze0m`D@gyJNw1&i<7esCI&|*W@A2%%fiBj#_jc-GWCI(ja0lu>JK|^9)WUTsymeeO= ze?Sa!bwkA}3({H&7FuX8Z`bmvO>hJ<)vsPXVBLQ-a3NXFAwB9XYe~%FmiS_Q#gb>9 zlzW{!YW@#!%I3Iog`1LS`O1Km?xW#%xw{Qr&#o0`@dt>-YcHpiMHrt+8kI=JstECZ zSshazP7!rTTR@lf*H;rum$;kd!E?oWUvyRDuMzgMGcV^m+JlqDvX0(0zs1Gd;+pzr zDyB&<_&O7jq_ibNPM>=b3h6WRH?42SZxVB+eBaLCJLZM_ZpFuft(@D(DPS=*NcN*9 zk^y9!c;f^<1fzsdWVp%A3RUuhI7_T~p%@zO9Ql>QL2yULQ+{;skAHvJ-me+c zM^k`Bo>5g6k>i!@=7lTJzw6l)$HPl&L~ruSQ9PQskP_c>d^mr{35W3O;9MlxK#^-r zivT%Jj*hw){M=vNxs8MQ z{3+DZYQzlFg`PcWXq;G=wvWF^yYNxqPlF;RY$hB#wqcxqfB`SOolAbJc7%b4{XR2d zz$nlP>GGVA*~j`YwqDLUinu#x=KF&|>AQ#xj;}8eC44}YqJT|c_#Xf*agS>Ixhs92 zU1}0?&cjA<4Htg8w*`9?Lyt;C!_&g2&TFhJ>=Vj?n#;+O$`NQ{I1PKBEd=odalUQE z;M@Fgd|~bqc@1ueOx{o(`~%3XT}73ggvx!teZ}zWp*ZvMX$nyHaH@mtf!kyzrC7w) zCNHYV(3Kv&vIQx|6fJ;YQlg5ZZ~q*}!hqV!cf3>;YEB$BoyiHA-BHF|DfTtBIhLqP zo<_Fe;d~!u#(3v-35}I-T7=?FafYn9E{ANsWFUAQDEMPtN`*wiSMDO$k?Atosv?=D zl8P8iN%++&A;v+S%W_@!kutTuO{IXJ0=24aFAM#>K5}AY(d>7o>n}pxRPwEU*#Se9qQPDCa!iC>W6;Co3}A#&-vFUU zMst>KsK95h{POe}{bpkP4dnAc!*7RW-YOS};~BdSbcczKi)W&Zq_5A{5b2VVoz|yD zrMPle*_W~&8c;)`HV2r6Svp_IP&772f>W&1eoCwd-0HNPzfos|^o^S_4#|K>q4Tdg zQoz&L4>ChO;VR*1E` ze*l{Nh&Yb4ok$&yy}REU*A*5*nEHf!ik>99IrK?ksUFwW>I<)#eLP*w^RRp$6359a zvlsm}CH!aj9fk!>YQXt6BZ-WfSRbu{p%yte?vHZLUV;v|3_-ESPgOb?Rh#>qe2zXL zTe1woBcE0RH-D5s5JtPj@0T!IE0w33^P5_AqHBE1mSOH|>L49-Zv_%z&x9V}E@Oy_ z5!h2C3P|3TIVF~=D?5TQnBOkyu`kH>E0g$sfnbTMM|p}pQOYzla1&m%F%EPwCE+vC81~5F&L*d71@{mkh+GS3)?w!NyGy>X zv+`$OoZbM;M>H*pO`;tBHn(<*`9{y!3{FqutbAAFXgCZR zZ*8O|KmI(J3!cZd~*z!QvM1Q z_Q?cn{2;D(v`$m3?O1ulW+ssig5G<%>c5k<17lSG;;u5yq7zr<`cFtf-*62RBl0gP zomuRE%1(pnD+padhTxRL%93WIf(1w4y5x!lOiutmnc@`sp~vrRwlqAHs!LA6#(QBd zP4f2UT&ea?&)nEKUyWK5U&QC}65Pj$!L1r7?&O5n>9Z=Dze@W9!BiePmNI@j4^;2P zBuyNDu$lW&EjqT|Ii~|t`ej%<-V!U=2)dNQUjpn4EE~Y1zS}N}cM;DZX0X01` z_%zJzl(zP8*w7jmzHR6^h7fe{>VaDNrYgXqU68rQeG*gDp@ZaD(IPgG(oEqR&=8$l zA9V${(6*2!j<9Du1*G|f=@(^pF6*~HUk|ql3p913?uw`SbME`zZ#}Vv%V``&rrk%T z39zNP$IZq1$vL1Kb5y?4IAPQM#?n_ghBSqoAoNikB*@v^$0(~b_==D-ov@-*W#Evg zl^kE#&7ah7ae&OHF(Mz!#Hivd7Y70un%4d#mNSu;qlv53Ozp{fa!uWwl^- znd59HvQ)_t>xhfXq-?h#Z7aqLrbGS)RmJ)Ubr9H#yBJW}iUaXy`VJ705kY;p9YG|x zl?~-IsS9L_M565S(jq?jcUx%)ZyV`&>IBhmsx<2L??K;3jZelTl||9un+#kVHu0Xp&8=o#Y#I!@az~I6(_R(IxRSJpNOc&ok>E0NSK^S z0K%{~RL+vwO=H^$-A+W(^CP=v$-!Y3o5MQi#t^0kOj$yEm{pb>3s?{-dr6{1Xv9#b zKgq$%R|=(T9+qeuNDzU~pamOW>vD25Uq8y9O$#cxAZO)){OaM}M zKK^)iJMGySSP0q3{mS&kbTE{SL+WalS2>9`%T*a09jov~_#1xWy!f&j62Csy!*}(A zp7Baxdj&{1_DA^@^lShs^1;DZbCiE?R6x~}!~HFW2z~_?!l06!DWgnlL}7)GRiO`g z6=rfeVZ0SHHRACl6*BjiPCBW;Cc{p118JPj@~G)@QEyU@PLq@?LtVKmqjik1R?7`_t3~gst4?JqIGmvr*sVNNoAIU+1*@>A zn~ep|xXM0IGmR^d{R%>Sf?<(SHk-T9yTkL*4Lr(3Y$ch}VC;h1>&a&M58!ByKPsN_ z4mvtlT7S6 zk{@X^Uw`>TazT=)DK+l^N`i{pz6@s)=A)*an|_B{_YEvZCAr8MgwzRc%!kGsbxt&t z!UxUO5H#k6PsGBld&e!&MU%*Nc0BMA7Ei`<8dq!=yD_!8C#0i~wK*}J?UPk_J()Oh zDSv)lsmCy@W@GVnNJWP;ceP%V+Zn59wW#um%^u3>v3LvllzHdY<~68~7;HeakOJZXc%m2eaC)V%ndx=fqHrX>3ro9Th_itIA9C1$4zA#|A-&YTzK-l!b; zlB^)sqJ#2;oemq7Nz=OtO)A+(&n6>N5!r;@fLCT53eA4Y?}L^H>tmkS2hsdzy>svK zJvWSK_a6F9Br&VC>5?~tfQX=-jcD5#75O*L$nbndg}uXuU}$NN8eth!`m+IR{M?6q zriL7i#JpWCIwNOFQH<#^zW#~Qx5EGVJEAv`_^hMki`X>o^P=A z-_v};u1?vmfbU+p9O+tw&My^rEQONH73W-6*S~UJWJ+apX=a?ms*SbVN&XY-_iCnl z0ZUz=*kR5gH#hfa$;7b!hF6m8BB9%pqkZGY|)320K;p!NUz_U-`}QBSNb`g|dMZjcR#jH3E0Uf{SYo zi~HiS^z!y4xL_cRQsv+Ilu3$cQ^uQ0<-k7lF1Q$U2jhw8kz#*@@$Gsh;}eXZk6)fpnC?FYh>59o$JVXr}v2EAfc;p zcS}EX3z!lU(joO@+={|^o8lElKD=f5U~j}xf8Y4`16O4K`9A=XbEjpO!91?3Ju-o7 zCiBnCn2!-8vz%~?60OE$YvMkRa-)_s&dx4dYmEx(gjt3<4Mzd)H;`&%DJp# z>5t8MB9Cn_{TtoewE%^`=5OAe@R(OTM9n^4v`b#2n5`X8M=-8Li3R8R)kI~m8^nRL zNWn((%&aKykw-zoe~83jd_z}jMv2FS9_g<88AO|=PaHe9+~GtI@4Eg0GKB!`>3Jik zM|}-d?pOiA{nGycH8!c9tHNGAig!W*QM$rw zwz@0T52<2${B=FcS6@`)-uQizo*QIpfn)+?% zDB&+g2A_Dn!9gt`G;hRE(8$h!s1;~|Sy{Q$Y~`%!4lj_b5Hro|)+NX%QP8WWczmwf znk4>n8n!@(ViIA{ukvJuNjz|=A9G;1s99dem$9Wl@GZ>pG{Kby$(zQM&mFn%Ith_MhgoZOB9KTB3 zX;f1k`)OQ{4Dq00X3b_Bd>ZhOYSC;@k@+QZU$K79M)}emNi(?4t|M@vGB-!wn!B#}poJJ#UVEtt{PMm{yK__jB@uuf?g@NVEOW90u#m7A5+LZVVe7_GML8 zC!aO@&EG&6FokX-65Y$v(%U4fK`|vvYyEHnSpWp|Y>B zpb&OakiZGCf61aPnDM>(^0eRUe;u~N{(Z4=w48SA=krd-!Ow?pkr!8knS;yIs8e+> z3;7k1yaf5>NV*?+a%a643RhWjtRyogJ7aK9Ea^$J$97ZzFN7kbSiL#}6oLNxj<#9O#ew3xsrMjwoWb2g^`4Q>V`uM%< zK6wzz80{R3D80S71dabrA53i1w3~IOnj81M{z)ei;u0+7Z0$pDgU!Uh_wI1}6HNmF zp^xx4a<)lurwpt%g*kTb6E^m6vtcKubtiLlW$}HcZ^MuGz)549l$iE+sDNm895&8F zAxx!LQ{l>R3JAD5S(ot0;Gk*~3sRBJywIt{4aslv5g_3Lv5ZSh(I@Yucn|UFte~x6 za?`OMD!6hC)pj;%iN@Q$9Es@p*{0Zd1&8JgJb7{;$u% zxvLzQ#>h%P3Y<4dNEyj7R#C;-;9YQqVWdvdj%bV5n8zx_aLN$Iv^o&w9KF6LUoPDs zysjox+Ne`_YjXP_ncJwwpi-foY$ixcc!);7UP(~6#<}uSes~oJW!$_hGhbR3dG=gl zxoNl{mABa!`GoAsC0kE!qagldV4{7ihBe&|xKYp(-<3~{ydw4o|5tH%yWZfIxsl1s z5t49N2*>**3(wO*5E{NG%b1VwcTf)j0x6Rnu;S%GxFf!4y+jQbcOJsR19$^sD8Y98 zY0FO) zVq}spwD_*j4!OEh$(wJg%1{I}DQrL4Wn(%)+ekA|jxaY*^}QxbvqNM1I6s1uXkrY^ z0p4Yx@=hSNQ#Ui2qq9w9zU96opsj^zqP|iwS2ZL1CcjBHyoJqdHt3Si(!dJ8{I z+ljbvT>n`uA(5sdTRY%BIDsXaxR`KT&-u$sM#?-wMIUme)$)d`mC{IT^z#C8jbA&C zMtsn-aEyCcC}WubNq7*Zx(-QVCv`#ia;ih~52zysfGaj7zH?uaaVdjtZ7%4Uh(b)Z zbgB_4Z_Qp}M=xe@Gy(;0j%I)$(B;o|%hp_EQJ>)yor$q=9Y{4-mf zU2K)uLU#sn<+Px!=vE}&3)IgWBxB1@%^yz4yLbtsL{Ia~sA8Dr+^~`uz=E0(!FyQB zw$ifmIKqjNzj|-(iy+akLF33d$VLd6=sI_5bGhw|D&R{vT=|0PI4L z1b=?`&7HLX?~ICZmK`4Ru>@%@x)s|Pa7gP?S({76OA4m~oip8)) z$x02$9g)u!+kYmI4Pc0F6ON~|8J;L!xDr_{zPhPydsXvCSLs#qiGs;HZ0=X~veBdE zaM@wja6&p@DgVBnGHGk;%c~X7Pi1ppKzP<*Zp}TO{Cq%rz%S5A}i!YZF8FDM(xtVOjh zzef!R`5sa;o?yJKb+D$BhmpNF#i1r=@PWT%$bxCSaefOLTD%1itUhs_vJ5P1k?j_` zA?X5LOsTCQ7rJ+Y)0$I1A^PS6mawh{{x%E>0m52LkCorXY z@P`+z@?;CS?GUMZ5(DfnC90+gsiQ>0Z78Gh9urFPv;OEJ9Q*6feB<)ex7@bQSaSD? zXB9A0*835D35C=85=JcTS!r z-12WBJ=0`0rGCL3ydSs3;<-#)Q6;^| zm-Z~}ZDL&7=D#JQ{s_WQm?0Dbor5)$PyrsU4a7YPSw_)Oa+^WxqKSr?vD1g-ae)zB zsAq*nYq4q1o8DnBBXyj!yF$9s&77)>?q6af-w9pAriljB{Ji}D+zqqh9B{s&AnZEb zkPacPbAIXK`DFO!T;su^(emuCqjKtai|KQNExuNpH4_P1;hcN)jk4ZOxxxI>qJ?w% z_vTa50GT!|(e7L-+9A3W! z_p9$mQ{!X#_^J7hgmyXTH|fK}n{tP~?_AQwxXyB+87fhrdfscf>&Nnw9ft*J}cqWyTbtDt3V`6_r)?5J$=o|S{@|aiB6wiuaukT``(s7 zM3ZtNC>B8YEd1e7gyMJRBWH>9Rk0I%FcxK=f@H~c2g_Qs?hTXnQJh73OEQLVUFjC@ zJqtf3i1$U)>dBDEmU7owY;B8WzGs7f!d8P1eFpil&w0#%B~?mOwVc|!HHxgnpb-Z20kRh zzlfWsRY7Qa7U#U`Zq~qQV8P#-_F0*80xS9Gw-vB!Du<*D@-i4&(p)dS|o`*MYh(AX`mYeagIW`yHOUYsbI!-ZI0)y*au^tO!y{&)xMqF{5G#1-dooy zA?OKWxA?LHt}ZI25r*9-h+*?OVEyF?8b~>Q%3gmA?pt0MkxLZlPattZsOXN-GQ^Uj zfP=1n9o)j{F$VzQL-J&CNVmBeRXEz~8hrLJ7L{~5l1xIvXTU+>r{;PaM#ce#IbNl} zv7sqjKHejZW_M~=xY2=M(pm^(iGro54d@UZP1jW=+YLH7yx-4hQ(X?qHl zwHu{Wx?UBuzWZU*S}oIa((Y7XJMC_CophvM5J^~KXaONSHYjrPJSvJJD2*n-C zqzK<0h-(nnlwk^(n?JFGMWuD^JjYt&5u*5PU4S#jSZU>BqlP)TC;`K6<=Qc{DEV4up2JlYfH zQUE~~_&l(~vfCK-2NI*Q5Dr)ZVXG{MJpTaSpwoDM<&`zeSc{KH&rhOY-e(f?3-1v8 z&&=^(OZu$tY5ICg6)zq#$w4T@8x1*?G*%(-Ic38Ik#`hgAUmJN)l^%atNxLr{4M()LuB=SQY(gH0SLaD+Oia^DoRR zUXh2G!w7mQg*bzEjsy~yP%~w$c!!cPLy1d95N56o3T4QQF#}_b{K0AfD-2=|JTPsk z+|Pe`-evI02dlrtT-OsKI({JrE4AnLKki_&zF&wczjCWLmc2hRk|fouEnDgLj7d{c z)2sOSfP7gl+Q<8dY<(G^V%zh7VqIMB7kuS}&S*`DBlW}9*~NV0NU#jY(<@R8(seZyvEiz z3$vQ}J>c6`;m3vl0DhG-D#H&4uRhUbw|mX~AA$RhCAC)wO(w4M1%|9SG3GX*V)taG zD=~{qof!>Zya+>?`!@rYJ4&8zU*4VmQ(KqxH5fCSn}^z0v;c}`Qvd@8L=vYrf+!2O z1nXTBL|GL?y}K`14aY6*i*n8cV4W+PG_NcQX&aeBm(*QTed93fG)5SMmGKH6OY@0b z3v@ic-0*g3--b(O77!E#Xg?wu>F>LlRHKW8BCMIwXp{Xzk2f+6)v7w3i?synG}2t7}U=DCFr)^ zKQqE2j?hh#(>wZAnt3+@JaESc5Bs@z6nsFbp#@^7{zfY0g~ z#eo$la3Aht_Dy2156o?Q4O@5vgK(v-J=Y2T>QxprY~t7THMC0B*Yr+|;1`o4Uq3Ke zQGm?{^h*r`Laf2RyiP@O1>HPE4#T2wzT5SQ)wCJ_nS8u^z?==XSZmVZyxYW&o0mE) zS6Vgfu^ZB=En<<}X<8dASA2C4i1aNb)6Qk(in9ysbo@Td^p4nlhwe1136q!eU#LGejx@~R zb7z&}UAH#rk~9_vRAboUF?9@vE^ox96r&S-Glw~z9wDVZj!V78_?q>urP(ZL%+-)+i+PQ!9GGD424Tz^ zKv0Dav-H$6|mLdBIK)d7~r7R+@EuLfeZy@Vjw2-NQxsbO;rY*3*@;<%YGImDzFiq;0# z9w7J?q!GZ~(+?NoJHY`r!caD)wxQmbOxOBf2;@kDux|xk$4tzoYbUZ~H zy^};eG;Mid6GMUA4}c;dLYFbbNN`K?jK_+Gj#qNPt3)mq%d!jgVIjP4xqtL5;6h7Y z1h{5UIfb|6PP|1LyYU&pg>67ei?3XBh~1xXoKJtFO}s!s5xPH#MZ>nFt68#j74I@{ z46fys$Fk9Dc+_$i$KEaGD_-Z{?7^9K174?zN&!`>Ho~B3Y5SMshRA-=Jtkzu7SMmH zE2v2mi&yS%!PGvI^^JeAjxsIl%5Pm1`>2weuSz>5KPY2;V4}v&MHe;Atr>I71 zDqGnZVgkU}d6$y5v+jwXu8sFAA5L7$%q`43#|xFz5zK1iK>&T>1qV$;Jd8x85!a-S zj+_tXTq9Ov#9@?`L?(H8NAmm3>%l(`=rInZ=M3wfwMy#=N+Pr|Tmu|1L+}Gw&YTFnO4+fQ&(55vyh-N&sIRLosdR#mx1i^ISs8fI~)s+bml5Oa#b53vBj; zeRApsy5*h1;i3IZTajLng&uNCtZJH$=iH&s(vJSpt4)yZG`~=Z)2~SQ?m8eKI0fm`-K^*6CX-_BtsA{$T^C&m$_fJWy4c5=RSVG0HdvORc&?;J&r8z$VE4{zq;f;V& zcLt00l&NtB(g)1VaokrZdddn)+;nab0BtUbo?r`kfiRi`$&GG=4GgqHIbEGG5pqkB zK&Pv4Go~4N*=T$a6sEJbA?8AR%$ikW-XL3ZT(dbSE(oey4%Zlo!L>kjgwro8zGE<} zW1Ut3G|BXq(sWyoJq9k5LlXCDwHxqpDqy+1OMghwlYGDs0IRPV%a zC|OpyE7SEF#^HJZ;u2zG+c=|-_NV)u&R}J>p75y)M|7Ws_=^}W6vB2q%-KaH52OHU zlm^xsCgL1qKkqT>Sy_gCqp5iCOL&D7(A4MXxSN`-L}_>cediFNw76>gvi0-&jqX0T zgI#B#`%6B80x%H+j6Sf2BAPWhkx#lO-lv=T2hoH+&~n5WP$-6DZLz{*whb*2)XhUc znu;r3eE5uMxt+)Miw3Uny1^R;lIF4fGVH)Y^_~SqUh^;SRYV_&z2%at)kl;>kVxuJ42*-4cowlioEiS3J*xfN75W7*vt?eC*5qt~c z5mEmD$y$V034-g@fbfU7l&B$03fJxtjxsrp#P9Tsz3W?yxqpEjV7MxYH54rPj6l@& z9Kuy+AP4~Z!qEWL97;7ZPCG)%BV5hgPrE?+W@Y1vR69cIJ|SM7V822DVoFAlm<5AK zB0c5U<&1dsKvy3A^9V$!+17n#Xn{chdL=+2VRl@2vqqp~1iZ7=b1^{33ak}g0$@PW zDtp7W!7vIvqD<6~yWoEPqitz#mTNMbaf#^`_=8J3xZ-gRV*-mmf*iujn_0`z`<#6# z#1H5CjS+Tt27ut#`_gHgLsVx9X_RYb#g(tD`_$+E0E5g4Xt`i;1sm=eAC{vxRf$SA z+bTNx3lSPRgObI6fb=B|QnKLcGRPJ;G^fw<9#d}Arxsmbf;?-^)@%x9rT2{I`0$>|*t0~J!j zXJu%QW(os`aV;Zw?g1ov^D-t-2f?36u3{7%HRfo~xlaC{?Z(bmrk*9VaKU*n%v3`2 zD>d=-^D&W@(K!4|zCEE;kW#LgD+_VW@lunBrb039Yd+)cW71yKbQ;EJX*9$m+%p>8{>1kvC0&J@&I=(o0biq4>; z!J-qS+$b0#J~Hw=jZ39c^Fj-F)HI@#j8a|D;x}d8Gm;2+2|nGy8jQ`!ZsWRmW$^z1 zk%SqC6UoF@f}Grt9fxXh8BNHz0Su22afCU7HKJ(7${5dj!ogtJswP(9@%DI`1*-Gh zP`U(g(J+qh=(wwNE&Lma*_K#eM7aE#2c-W1$!kL+>>-@1-K*E*=08r- z7WgAzLw4*}_GLraa6JT4Sx{`#?ERu{Q6FR_(s+dnWVPPuVliDjj+h_(j~93C7Qh-T>Z*TTU_bZ7yh?CG{Zf$d!e1mqM;=hUA8(13 zp99?Iy+-tD1OdW4gy6hM4lV-(IZ~Ch6|!*;%|87qRv?fvx~R97 zXphBXP9`tb=2=~KJj`g+s8AfR_gKUrh9LOB za23AD4q7;u0dua=QsR0NnME2WOn_A;APuNlxa&8BaxaeMlYGE9s*YBxnf4LBVYV4y z_=j;XEV-AU&OVnHlH#Q83iDokLJ4dPQ_kZByCw>GC2~uKh4J@~;qjrTtV~-uhQJMw zgt^WWUsFrR6z`%S|U9d`SHkQol8!qFA zvQ*J{e&)1dd&9<;?SE3kho*m91SZn@H91`N!3nmY3?8%Ief0bH<`5OeW1^-)rc4-N z)Vi5lR^ygv+8~?(^vGbiZyMY;fGVNgxoYAh8;oM{ekKSZtuS?wNgfhc6M#kyU;-Cm z7*rf228x%ca)J+&?Fv;9or2p35rf1Xg!Yvjt@RKCB7Nf>YN#*PUT#qOE(D-%SQhE=JCrb6YKdN{7|VcQP6r+nHxXwN!>Fm9)WrIJ@KZ8@O~CgQ_4bKF18kx^zGE!H zsus=4u)m3Fm2qr!9m;ugGc_y2F_!#9Y%Z^xn06dOgEvIVnaijf;i%`<^)Rr+X;K7A zm^Cae<*b(++796_62ps#EaMJf^wt8VaeE_{vmHzkM5QYZVvDG}R4O~f{7>Akm;*}- zd4?5+Z%;p{ir&Z^qcvVqw*E zsc^E!A=S%oa<_Y&P1r3#f`nSiN;3_kXsgzkwv00MYGdj~B5s)f01_e*%7)^y-~|}l zRe0GHpkYlR1@OD581%9(Cl#$2g^jaCYeADe%7FuEPWUu#@RF9+fQ}(-Zeejg7>GU7 z*ND(<{u1rEdgX!Xj)Zi&gT%X`{{Y#1Mi!Zh;&4XcuUuNyJST!#bW2Q0lVXTDRb&Wm zYOASKWWwdDV(CYS8@hu)P|CvM$u6fQ#*teml4dHnE179tW(N~**Xh5ZKxjeC&sd~} zg|t`~*kJs}FX?>xOb}BET8g+76$@Bc@i>BzTM?X=;Mc8cKTyE6hl~qSnmwakf`D4g zYL6&C7jcA?AWVrb7tB|+6GOIp%*u|Sy`x!bQF*A9=^SzKEAKIEJi(;+e&#M-H80X# zk1n~?rQex%Z)tW36>s!QU{0c})9XI{4lP%$!J$jtVktnty+^-Wd`-UcKV7hGfNJ2= zK#Ng{MZ1;s7iG+-1St$<5Cu5%E$Y-!YsT>pt4JIer>|I7koT8U7Os{p7mD_kObR&| zS_*D_Jlh<64K(>K*rSzj5spGxE)7)xyg@_4nPylgDFLb;uq&@*sNq4C+);)1KghHa za-~6|X&1+O@6qB_wrXGP9V?!s0*^%FFc%9CRkhq!y|DQN1|gncQJG9y%CbJCUL_#Y zu#CiBY2p}AMPd!h665vy7d@DI`!hAl%A6ahjqKBV)yuJ`l7oA%Xk*iC|jR4%M3}U>+M^2?74qhOty-LZj-gO9L z%}2mNMeDL2d|exM;gw%nm+bM~e$u2vy49xb>x{v>wQ5 zu24WHdk}+f%n;zH@^xtRyO}P9WPWZdeZH zsyGmqQJl&O7e_Hc_+e>ZXk#5m%NQbL+bUHI4qM^{v~ckO!g9VM5q46`fFuXJd%Fwr zM(7OPPHi%92!tF{8wKU_Cvvr|K!D?aUuFS!xv{BgI;z>`S_~?H{1U#cvzPuopq53W zR&qr7pc0-XM@}^aD>4dea@5Z)SZ`}LxKk*=H5SA%1gg!@)%twL2Y}z~KiGn-hSqTi zasr!8UHpbqOht)H~5-8rKMJZ<-mrZt#pl`1&Y;&D?kCm&D1{4tK#%+VVb zTx+Rwv+2tKBV*Dx=>mGoF&c@NN5rEd`c#om(;5FHwp^ww^OxtnHPoxn?{ z;t!?Iyt@iHW)!Q;CvKL`C$Ka}5rXY>z>3v(})71QmOkj|#iBFe%f_Xt-a4 zwB{Tt>(V%%*(-qeOb<5ZznhHLQk29003kfl!`yl)(>tP7Hjr~zRUMrrSZVkX-@cr^6mg8WgOr@U%p=RKOFtTA=Q`_hAJuB3mzpgSpqK zn1CvR@C^hy5EqB;JVF~~VIm&xs_)0rRAfG*60L#zeDrI#? z;snLO0nMmZJGe}()oWMcZsHHU^}f*p@DlP@Gdp3pWzrP|WsYN=^%l*QeMe?;k@ASm zZeJDmg^jAR-L0?;zYz<;Ddu-IwqW$02$a4{i=U(18reCHyuhTn=^gzZp{S)o8qD{V z3N*fH_=O0rdPF%re&ZrmH!&%~I*fSf?ety6l_BYJ#%5k~o0fY^`I{mavOe=!=`Sr; z^jp6{Zj_R&H(B+IWI07&RYEw4qD}Ld-Jv8=Uw#PGy<%zba zSB=ZTQibXun%V;M)H+iloF6`A0MH*;sD;v3R1|?R94d=#5hj6@NuRwYRnXW~LxW+f z`IZ(n8sd3ED5@=BdGk2M*@ZYQmznO+oDEm=~K5+HTi#Cm4+_ zZ5%&D)VgBUYd5j#0a_IaPYcALux8uG`-f4Iib!lPM^^DM;GG)B3ELj*Ad4OvKYr20 zbc8b9<-int%EXH)Y1p3s01#XTg4w(u64qx3)zwbrI}Sv76jsP`vr_JN6R(+~afr$@ zD-#t1ATDXY1RRtwaULP#7u<5`s8aCb-J9eZGnmVZ4dyIiYjpd{S8gJ+H!E?2NrwG@ zbDNo2Ne_b`*kg7BS@A3tX@*XUh|Iz?pwa7yl|VC$c`P#*s=|%?7W_*{Q}V+tuJ5z% z?qES%gWpSA2e-Cbqp2HXmggt4`!9xI01F+wQN@^H;to9${V-Bol8$?(9!fK_d|VaaOhFsBz7%|r_A+z7O=avEWYq^Pl2U$kmi zTdht`p??sCg0g}d?v=~Cp1VumKYy9W<#2UmEap*RtGQzgL{V4M(l9-S&n~EgfkY;d z`SQd7D&P#PtR(gT{{RAU6otSzK~oZbn+PML>by?K)HN#`l>0=%+gpd3LXdrk!BF3i z`vw}ULEXM{3rLo|kdV}K9KMfJ?1UOlW3{}?SYZ09mZ`r#sZiK&h-K_6)yw&ctH7TW5#%ZB>?z*Igo`kltkKnvkdZ^XOH z0V>-}uz0qQ3A}yZhyj3Wg&p6lH0HywrHk>XvqPZ{dC#Hq6kR%ph$+lx1u_B~@74H% zs}e#e<*i@p8>3-0lz>tNVWKz9Qkj#^CW9TRqFo-R#8jhI`K4DkZf~<;u_QX z5aG-^V6w9KKPF&o%31x~5cU(bfsGhoY#*b7OIXe5Z>YqDs|K+fowr(Y*#Vs zAiWxn=5C&t?CeHfgCfMho6hPYEdq#%+qs0MEv;@N2lZ{l#URHA z>lpZsRGa1oXb(+XOhV-#N@WLamOp>;(Sm2JUxTE9)n9C}gRuqfo zadFELIU1L=y{*a@bsa=kf>G<)YnVK;z?M{8R=%Zksm>tvr$l7UfS-a`1#5p$h#1Qo zns+uv)Cj_9dh9jEsHpEObXlid*hr0}psSc`9j8*Dd{9HCB z>+LMo^87*cfoMGg`#Ikg#t~W#n=RxYzsyZh#1MC61Fe&)BDLm-y`hBA>IF747i43( zkc_2Wmzd>L>8r$`Si*iIv~yzMXtj2*WqKRxRJu~-Nv@^A^LDVru?{~-xRwm}#2aAL z6!4U4=^PjVjwL?gz%dD!2v}Gzj#_Mt1V#eUMdea%)y8OPt+IY12~TG z>^Na!ZtkvAa=@$1Q&)H(l-jE?VchQXIc{;>uUHjU4>4%b^^`4qYGtR)#^yH+xxZ)+ zEK5fcg5_mWon`Y7#SHZobrrTMx4C~oM{wU!+cMkSJd$4~JSMd-FE4O$q%~!^WUPvr z{{XWvcfr)O(mX_2#B&X@t}=MCDmfQx+c?I)rAw=*2@YC;Ov*$@dYh%qtd_ZXm&5@t znRmXrKi(xJ%WzD7D@3O!2wK}DI-Lp_jecrh#42;I!Z-4f9PNg+P<<3W@U+Vk=kM(Q6|2X>o;fSU`wfYT&3Kr%tUj<6|HwJ{i9l`QM}BN zobwNqux@g((uCQFlI+j4D7FCPxxDJ-cNSt^*;vFb^Er-lIMn>YE?of@fDGG2YC9_& z$Lqe*!zMdyB)J%5^(fuQKY5BX6CX;8H!Cq&>xo8+2{LCT>Gnl5W9Kj~K4%mk}&!^U+W>?Y28Pp}rb$r~Zsko3PvwDoaR1t{EvJ@b%LR2xf zy7YxY1qg`oTq9e{)+%1j9h}ke_l?rTs23EK{jkbEw%KaccnFP2cDF2)FhaODxm_19 zFdWvgp+n3t(Bn^+KI!Q#VXy=7iIh)btA$yoZfg`<7lo>q7vow%EvqW{irf>kOPP@3 z9$dG}0+2P|nUWeO=mazg>;rHWR$m}P4bk=Y(bHv#S=TZ*iW+TLPN)Vn2J z!wa$i;^rK|Dw(U69%VRSJ>urOic9H^s!(G@0=GSg+XP?=c$HcLp_6FV1@tEIM_)jc zS~kKY&n&YP#8jby1L%i|Obb>J7>ZmjdHU{FAvq1tb`Rgg+H>L}E0wi{)K!Qgs{kq& z?nF$kM&ArgKvk5FS|y+%4uZS2{K4%kw{>ad)O#-6{Tu2K0WdCZrVL{D0a=fX&bUXE zf-$(PR*^dDTa{wCo;izzSuCRTa?E_8=G;AAeW8$Pj)U4?rk%z)E#Q{{9%_hv(dxnm z6EKmUM-qffSs@VEaTr-w#1}NegSfuXWJo)x`OLw*%KCdnD+4m*M7pS+Co66AV*dc> z`@}lEKcrRH{CSFAXZr3T!TL$!4@VWn>Hh#R?)ZO^*0i{6Rdk! zn%AJ8>`sUM^Al`d{{Z(F!+O8$co)@2ce;W%P3nIU?|uIOi0L2Q{E3Y>qy9@6jN5fO zDzOvv#BW8#qwg#&{-4@a!Sw!-Hog)4hMvl_&!ITmbt;tEN`!VkbauW>Lw_zJ$@}G7 z_Z)Q(x@G;3k(F&=^^|Qr{{ZZxZ|KhFiuNBxDl-27 z&q>+--jF^20GFgdHQJY}PFI;~GT>Y@%M3h&9mhTA0jL+5y&R{*`!Y}wkh&mxA-R@W z!S0{rFzI|V{{UWaK1e>IW|C=ZiWPB7lMf}tKm4;p(j{A^Ih zUo&kI&!|)fU-F3(@6rlBi|_PE5(ea`TPQM1ayKbuK{W0#ggl(Oh~{9j(#FieM*EXMfpT*psd|a0jzrNT=`wX^U=vD?06GVasqsxe?)_Mj|ozNELvAF zE?0n5Wuhd}X+9wZ%kX2X8#b)ue&Q{1od(t6f>@xL4JTwJd=z319O1piu!>IElV9Ns z8gq9Xgj@$+(ZlQrfIzl3R8_)pR?n=jN=TRO( zeT)JulgZ)*4sTMiDBT^-Gw&wd{{Y^x&;GvfMrw(_ZrECDv|&A%(FGR|nR&ir*QjZN za>VtVxejk_hKJgjn=bJK+`Hxf0GR+1UEm}2LHVEJbs1T>0YDuXi4}`8*>vh104jL8 zf8?d0-YP=9F00I8Q74mhUHilvysaL^d8v@5rK?nT?-C*hwo0#hmvqHaU&N(1s3?_4 zl||;gVKC|;2d;XFXV7jaIVU+oT`D2W4pzi>$NdN-0>wSf6Pad|SjWyC!XSD}OriD` zrT+lL8I0BQDkmnsZsFqLM0>Cl?hXtT^DTfWxb|LzM*w2kVI&y|RnP`j6rzd%z)DfW zZHyQo5gXx#&C0!TH~l{e%m6E>YU}~$sdleSNK!fFG1461LW+xun1dD!Ma-=2l3qQ_F>G?l#6&8URV zp==PTsH<*QnUI7t67TN_DQANyZHaqeHl>@Bwg_+#qbksrtU@X*9m4F4a4NpC>Z$J> zqC945dCu(Shth3S+P@O4hFIE9`V*bK<8(81j|v6E))4bh`X%%`N)=$2<|^z(ww}`2 zZ?v_rmF=SHP^-S!=TYM2t4EiYw2<`hEW~IhyDo(L_u(^NswZzHg@$?5bkgT?I<{JgFyGV_O?VzQ+dP^%Ywx|r} z)-4oTcSWzX%@NUUc$WxuIBq8=ny3ZaiD6rz)JZ@saWDKJz-`Vhw_mvWfuar<+?)a6 zCOndj1fxX5qFPw{&EaJW7W_`LaU(4Eiw^;8yz7WH7RfUFde=}v&ee!V216M6hyoh1 z2gDa8JzS``izIJqC~7ZH$q-v3+WR7Tk4SPu1YJT?5{iWog>1QX5{{<@y)ShuFe}Qk z#7Kx5M#t?Ej8^ofPnZO%)}qqPRuK#75L_53R+b@ek?{>n1}+`OAx9ju8V8giQ0?;{ z(=g^BqYn@mS|NalkASWsRTbcHLTXktx(Q)2H}L?sN9HD*(WQ%ks1=}gvF{&4z~)k= z+qes~2?0n{}Vu-Gws#@#mo;!4su zPl<$;SvB)6h;CmH6>WQgOIPML6sFoPUsw=pQ0B4BNJlNGMXnpATy9cFjr>gE9Z7hP z%D9`W7(oQoi5C#%ZkXku$DY>=z<88xeDMiccrhjTxCLvOdcs-lJBW3Ih@REmD3k;< zq7~g`=WNm^U88W)A)sAEqIvEznnDXp4>^J&m70xpU{}K{ZxqEfII+S)cuJ*9crjE! z(kmS0(Jz={qLo{A%JX?+3Ic;rEUwUDOUcxuf@;l6GZba2j#ArdJlE!3!Yfx}Few$2 zO#c8EFqTIL4en69;|BdN;w%h6M0p`MH3Nv^IkULfqCQ{y5y$)Yi!>kaSxHCT{>ruY zzpyMHfBOw@z5SJ+vkLco!18;fyaWw4<{`;FZ}|Zc;29-$ZM>=wdEgvU=hLg8R;Nk2r&%KCmXo$W#rtq7a$XfxHzMGJwCPVSpgbm#Kxh zW`~GY_2|H$JmcD4>58wC$Q^q!k3$D`yxe%nZIGAdI2=JGAoj6L1E82!@t%{w`Id3_ zWszt$K1feDlr!cpVHE)rP9Bg8SYlOUh1AJO?Hr}E7+Z8ks3#^FmQReadVz|Y17LiN!y&S`A?5dOGBs>w z3=3y%C+;~>@FOh`gtM7z>FEoCv|LbfWw}IHcvxL9YzvPxdy51S?mjI%h|vig+KE0& zMM6`?r7^MWnDrewh|4sIZF%ajN?{D&6#`V6SDBT;$8ySCVd)U%^AOTK;`~1_JU=tk zB|XmTd(1Hy1&Mp4=#~IJu&RsHCZ0!VhPt?+3e`n!d7iLo%w=KsVDp>Rm+|tmjqHh;iY>dF=oDfbJfT-h8DGK=(ESUROP3H? z9n2JcRygr88q(F%)6)dz31kK)O?$D4P=&x$62~aFemagh$0OSF6>NoklO9KtmD%E2 zrf6>$RCyvK0-J*JO_I7b1vMO_0KL%%1r6Vp{yfY)tshj#4nZs0eI)Rq*7%$e@dIh` zHk9u`($HNGK4lD4)i*rFU2Hh1gOxGkVGII|Z z<`2mgXl8*&xD10fqv-_&`3w=to>Z_m5CaB6JA(Cd zhB=mYBDOZ_qnRud>OGogEfx)OO=H>-nAeRV+A`X~N7#Av$%7u0Y~O@Ce#n6B?5vtdGN|04ssZ{*b2DFV${M=t=%%_-Rxqvdtz6FPhSyKtHPg!xb9!R2^_m2xtWXUKv zS1FX&FoA<;dt=4CF*qgX)rIX*2nJ{~3`QVY`b<_eerRohQ^a?yoeVQy*k-T$FM_32C1*CaITADpW29%vxDtca5!m&K+hkn4{{ZAFaA@Sr zAQTO*VOC%xkMWf+co$Bi75iHa`H#!ObEoc5tQr}NR01ekriQPWF)%E2TGIj&&O(3a zm3E_o7IQH1X$eu#e&P+x5yvFt!O{K1z>Sm1GQjLwxw&tIVS;!@KEP8DTV-e>(dMNT zJPs};RLofwNFf+f5Q}R~oWX5POX+;v!b83gTCL!2B}dYJVjEu&S7b&A_KL5ul+ABP zf&l==SpAHB;$-u{)OP3o%iH27(WBNSngS%M&`TgZ6#&Xijto@5iwJLQR8q{TR^Yvu zTqNAeCQM>@e$gS9H`G?|6E6w*rS3M}&=Cry8E*}Nt}~$>bv0Yc-I3-)5G@=Mz_q5v zo#zcXzW=dGTfma4A8GI}`B;B?FabVce{0gCLD!1*J9^&|W=n6!@*m5R=lQwz#Q;R<_ve z_=E}axcEVz8~NX_TnNpV+B2c|~cm6aAP{ z;=m$mVvA+$C7+1+WtM|r3-`fR5Z$tXe2qrjL#6)!Q8uNJ73>!iv{|~QO^9k8;QGQU zzSE4jCbRC8qSY}=4Aij&Ov{A2C1D35GJ!e{Vz;gD z49q~pvY>0ESU|76!!6RVven85%nJn0O#tNX8XY>>>lVuFM%fP03xQ8>g92*yJ8Ag5sr}9 z#%KAdu^o`3Lz8Cb|tTfbx38k07oIzPx#?;fvkI z5Em(dc#T!=o`TGAl|}_#MpIoCff#(-CfUGSQ6ZF_##{EKKX-7{CK^1FGXN z5H}RndG3jHb2DYEUGVqhf#ryx*=_liiLWF9%dH{eF)=YlRmq=9h>WGVD5$dRL~&Mykd|l;qR0AG=X4X;js+?SnMRD2I{H>HA&Q~FrG==zb2a{u8IfJ1wKTjlNOqkqShYsVqg^=AxJjZTO_?r zgi9KLD(7HgEig95dW$jV$1yBISX^+jX4V*t$Bn_H%fg6UVIUnUV!AwuIYmQ@iSC{4Y09e-w5%m6hn=sqrI3~ecb z0JBpXpz7iQdLHF4j@Awhm2eQ?3s;Dm8#;ita7EgSRC6ik;DMWlZ>f$Aeq_Y;gue2$ zdEH;$77<}?9z|#3KPJS2SXp=}8Lv18EB?5>v4~44g zkY6#avy}DfR?H~~ELeg3`%Rf%qgSEH_LiUv&vRE60-&qf=G2#2GbkG19D3Y7aI7Y% ztD(!2sN6WhACzFj<6PX)(=05i(KLC30yj_wO7mXtQQRp6(D&V)_=$jZWnj_!?kb?+ z1(bq#Y4wgWjhnBlWpPr;SC!@{Ns2v!!Y~5KTU~Wb)CRxq>SD^gj~%0Ow;|^VHYM8feUC` z?KOEQZq!E*AQq+48&{Yl!s936)f0imuaB8Gju6v=yWCrYuEi0r7=&R4LtdkYj{SCQ zE*H*yB5na_jZ+f}u4*L#0AQp6A2`2xqmVJhwNXDY6M){4Q#s1TAG(=NQ53)(-6l^k zz^QgVc)(m#)hL3A9Mw8VPe=d+XV9$h?{=n}Q7M<4Bbz#ltpjlkc^W0S(eYrWlR8pF zBY~e_FdgzD9Ka}sow1QCVuMXtMO}gMgox-26^N_V)=TB)IaL^G5+lYA9x5N=fd<|g zV^Xv#y4D)SoSNUFOmOt#DawyR;F0VLJ59_ncpddCCJtagl+KCfS9!(&kGfItOAHiVU~Te1 zNR!rDRJewT&`eqjS(psc;XyJ)w&q%52;@U#9*qA0yPI8JUUU0)(sBO4E9J^}P3cbkHX{KtjJmyfluW%Nn-J+{)>_Eqd-Uo~qZ3Luv zPX0n0lNKfbav1j#1xOJVYg!bmU{wiAOIZwso5^*Zt>dU__yH~Bn$&Z^tijG|hWeN=z?2akG||*2W|ULrirynh0eucy&)>EJ%#GlldtR<9 z;8a8{9x`#_Vu1yq!lm2gf@Lg{I!I0l3xe*esK1J<;@*wm%nUduRfZ$BJVgap5vWqE zaO-yw>``e3FjB|FU@inQw_s7+z7%FVbVc4qSCNTHZUah9knkPUcTwsOT(w=06+y&u z^%|$%9W607auC_y0Dd4DSCOjth0C3ak_9yV$ggH2 zBv)5*9vEAA;rY3p@(GTcJj<>wMrmG(rgrtbpJ*Pkaj#9m@5wH7FJQ*MZV1l980*TgNfO{pq6 z3m|Z(e(@T$rZLTq%b<+6hWO$0Af2K6ox_AEyvww9GWrd~XO z=46K73g9%O_ZXF}3WGe~5aB>z4Me<~NK)O@Phpe|R-brPkYFiH+H}g{OiRhX81;ZQ zWUE|-S#@zzh0xKp;0=!(8&+voCh5(Nb+3Ugr9q;l^;j|IheHSyCDCafmY;|gZX`2N zal+MG#N5-2vgmnRlm67Q??-magNBXHShISbUyNZ!hr zrcjNOOvE)U=$0+PwFdJ^EJO{<7Bvdca}{T>J9~q% ze89sBo6-LOU|rx!{-T2o=Kkg=3b0f$cQsLJ=PWq2)Hzxb&!#|fWGeg--$r0Y2nsu5 zT`Yq#rN;99po}H220SOu?V+MFQjX+VbsK_zEA@QdX z(z#fQt*JrPqGsMEMx1vq8v1bzLL#6aScIj)TKr4U+;r9%U|%o;2ixcXXqEA@Tn@EN`dTK^M1tg33ud|0MxF4#nx&G zF}ChYEwx0V!x2l#kBm%(k&Xiu`nN%C%CD3+76rs3; zutPSna=>UmVkvWZk;jQ(fon>aDQb5tik0{+`@(|sc6!T>29&{Bg5_SMuu_4&a}qMD z&$3IhYLr@;0hO|hRZm0-QJj8b4k;AI`Q@AB%hgV5If7y0CX)OFK<_<4A=-_Z`@>+N zTRog&GVv8F%unbS?H?E&FoH`!XWmj&)xeLe63D^dafkO)ZUdalT+T~DDkpJ>me(T* zW+n@-cu45rDj90-FBcxMigcCkVTPN5L}BH>(k#EQCUB%u{7RG$+lgckHx!6HMHWYh zVXqV}I}0fuz*cOIMTNBwG74OhzuZbHP!*x;7rqryUqn+S6_zKjnaXA>!r+RqK29lvS`T zlxxIX`ygvBu;(tIA*`S%Y|70X%gtiSGty6#3IjudQycmk{{RFJXjrMBzTPF;;NuMm z0!SIWxKYnN5o9ciZ^?mRP=K&I5q zs5mrrbm}KGc`IM>mIa}A=4b}^8|xR+^Zg8V)YE%G}Y{!DK9xVzg9eD^f6OlISjHch7dzm`GWZy zVI>r5kY$qhPzngx0(MIH13?W|{0o$Gt0isf$4`*I?j}3SOP0xEv@sYr5_?OHpPgRXOg({F5svN zo7mF%f>c1zP)o)yxQnb9Y88WrBn!+(ETwUh72;9avbH(pR8M#)L2jjAc2-=Q0M@UZ zti*%KV^-0NmzlsV6`M)Mpd*=ti^p}+efUQ~1gkgkuLwZ7a#CC_)#{>^g1Bm0h+R3G zMnwKluzm7&NlbsU9?Avit2gVJX~Abk`TI;DQA&BZh4-#FmWGc~Dq)UUL;nC6(5>~V zNW??d~F;LlO7MhOuF#N$PO}fVA zKonVU@V=s32Ksb-yt1=pv*0cf0@iN%L@(N75VmbAd^H&ZnQE>s^<_I817zaq0omNN z6s$BOBFL&6A~R&g`oj0>v>d?6B?V^XDQ@Gppc*l7KnFE;!A7SRZWB#vpcbI_idK3M zcLAD)oI{kA2wJ9-dbyc~m;l^w1QJvLf#{W*fl(u4QOT;?gSde#L1z5p5E#86#o-?z z9%G#|Qi`^mGM1n<7!07IJ=9$y!bqaixyy`PuzbR_L1!4AsZl!w&!b@DKlVQ?lcfV- zIgC8)FtV->S*}U88bFw_tgwXwrWc$>G*ogC8MGw70O~I)bB=HqDT$X+Zdh zBPfB63+n}c;0`^nVH<@sLt-OlOq1c^yVbXh#j2`aX%xnbld~)g2=8*P6ZG0_3}r#Q zLOW5{ye)~Pj!z78>n+v_ldF(c#>$uti1xwa95|{ahFf$dfQ{=NSKdOut`9GQ<#90 zS|`ekUufA)aTr)8cdCj7w!==QjSYreZZ3>CF-)Vp07}MMU{!ID!zAjKG& zpYMsbotcd+;c!#}=FvR8rAQ#Vq~8xd@Ff93Kn2$20}v5wS6`McaPd{BQRqCtq%KP9 z!~p?tUWn3-E-;wG;-f$Tt;M4298Lziml|>W{V_3CF^V~ypEAF>MVYfv5P+qV+sh1+ zwQQma3WthdeBU${1t@d40XlqSU&m2G&yCkK`J4zTkpK!FJV9_i@l3NfRpne|$Gkzr zC}Ngy`jJz`FWzE%v(hmZ4&&I2>ZPk5m;`-AVT(j=vxsa#Bo7jSSnAe2qC;J_K&xC4 zI&n;Ese~LyshghhYUA-riEg1dOoPH23BqPsQRysWCvwhaD!33eP`io#?o;_xRKrMd zGKMegAINB%MD`-aw7d0+w{q7q2C-D?;K2e!FNO6;?c(`!3NTq>=0%PrUrEXK^A$7K zQnG3Firb^wTvy0~il$=t!#5x+tN~g8G|i-3JyaQsQ3_;f%d#G3mIRbzY5s0udc_wT z3ChwedWj0aOG+$V1@j8%8`^IJPuscEF9Ud0(cE1|%bU~jD&hgRTs0Mrzu*7umQR&jY_LZjhl0i#N0l>)7`>EAOPbTZ`hAknG|@5 zML>#GHM`bt;uT%TC+a7?L&vtCl3pKBLe?T-AQEV-q`M@f*~x)~3^OUXsaDQNWfGi&W07Q&bME?M3!uOyIue%Np zm59f^Z2th)W3b|X88-Jx`?AI5A7=y=0?sdqToqazM-0?#TfQM=Occ5Wzl(@?9tLJ| zqOSXxF+wQ@MPTudAvzVlUDQx4XlVNGylQOZ+$>x6I*c}rryi z{94YA}OX;BJTKIFDhB`Fcp zF4j9fj5Loigl}+xfO9Xzav>4Ky}Z9M_Vb&Xb-iF^R!VVT%EKai3`Yg5EmxDge8jj# zVGimodZ^~&T_~L2=2qEGPf{b#9hXr+UOE%jvjTv{a4x*VUYRltgD6fZ>Mv3iXoldk zWt(~b0B!`GF+rXBM7k+a!Sp8hB;-CN-@`(g`3MH+^<;Dt8R zP-Un!==w`NUo3jgL_0-a7>$Sk1%|8r)JdB`g%uSx71m~C5Fu;~Il<*7islMe9&TM# z=G(fKvRxsevJPjw#bOXr6`|$kWoW@h)gd4$5t-TMFirK;wL|%t09MiqgKa1f4n5-k z0Q4Z{q=QY%HbRN-OztjzU%|;+)Hbf}+3l69u7z)M&I|R8D^P2jn>d6Z63yM~KYz@z zL^u!4#3o zl;jYERgL*>8lD(#$4q5o7-z~l;#k>hMEA=uiyQ}ubiuKdgehm?mc}(MrFh4m)Ni{| z;4`Aj`G{&esv)*qtBC6bny=<)`BnA2!fIf+^=tD{=mjE;OS3~bec}^hEI7PH*D`<= zVSO_Ov}B+amwmw&!Q|_ChfW=yx`4RXtT3;LrbF!kwLTy&x#|eTw0I&dp_NPx{{X<0 zCV>)$6&&x0QhlVi8dSAk63!^r4=_>x06RsYLbJz+bLmw@HWQ}0mpLGA6lxCCV3oj@ zSj$%VSxyHP^Wq|+4&tLpP;lnEHvvc$WkE$>EprMDC?$f;;LD#8TS+H#n6*`Cmw1F_ zG!~0>)+Z?UQW@ss2bhyc5u6tQ+03*h1cj0|6y%AJxI43#W z%NUEK8->wXyT4EUf{w%(3-_6YCLpz4QsOGs`V}i#gl3dXpK z3&9AUr_IEoKm*aF}ES^=$k>A=!~3ly?_kS#SJD zO7CwYF}&*Fvsk&-?@?O^;$GjT+eg1K_SWe|6i{c|9U8Kx3 zy5`)>!n|UO$I-y7Ih2=Gc#S7BBJN0OSj0Qr`{)6<3BQSwJog-N4_7Fwx!(KAP%clI zgDl;T&tn*m2{n2$BeaRXP&JwvLgmG<$Lw>DQRA7qb=i$cx}^Db_9hEXL` zf+N7E$qP7M;DL}g;w`AP0YZZc=JR{RvGNkYh+AWg1Q)k#&aTxE6uIi-cw@z~>0lx9 zk#(#BL#tZ8cTqSHTnW1OQ}GLe$=K2Yh+c*wfOtCp076+%RPVcpyMjK4h*=1*r$v=2 zbxsGUX=T-8r~tsQ`?0cIIs<3KU0RW#-JSOQ5ezDo_x{nKJ>JsGZ1#>KS2qekxoTOy zV!?&w8sN#|piA1!37^aZNGRTN_$$&EIdDY*&LOyx+O@{0XB#L`vCB?$;#`8-%}NXb zt&45whB8+=`$0$1c+_wjDUzarTee}2suu}yW)Yf1t^xuHRpICUO^-febuqnn2rkix z?y+4vxTBxmpg+mY0CGZ&eiCEyay{0Xqfbf6f zT|DTAnyw?hu^L}wG7EJ_qmX^22*t2A>giYK?J`zrK+LsE=0yEYKq`^7<2GN+qGMGs z+YV?m*((o-!rJiJ%P=@&!B`JbXsA2GW8%QR9B~3RI+taa4Sk@L4p~svdNRt|m^S&Y zy~Yvg^aKPc@DLSP*@w1l0WTX8{{RxM2`p?(<4{~0vpTB(0J4=EwSdCWCj+)1fB*;) z$$Z98701M@tG@e-jso9^1uJ((Hwy|gT*pCe@f;GnBi$BBkIu3hNmg;%oVEFl4MP(u_yDA%?>?r26bkTBUbS*68yo!{Yt^S{6<9$gXx=x!n!S@ z`x5od^Tl)sM9G}Y${v~K3;?x}hJN=e)D$W=0h4AQ}qDE1H=azgNc`w>uPQ$>Nh z8ARDFVEe^*u>& zTYGs~e}#RaN29gKa`i3(cU*O`rMNN?K0!i3@ZS7I7z?qKdk8f`CZtybLY^hHP$U6D ztK9y^kAu<8U2M|WW8x6$g&GDJ&qd+@>Z&1hH~f`egsR`ZyhdmUv4u5{_Y$}Qk`0wS z`4v$s)w^qNxkJIyNVWj$#99ELPa2g8S_90$B7{2fTnlyDXHZ`T(okC|DQjw9Q#%&l z5VV*|3Ykk*peSgXviX8r0=f2tsRLi0;j?%G+l>RkxWSXid`IyG+U3q6gcXP^b8j(m z0W9Hx17pXgBdD}@nyQ;ZQ<;jIk5d)2HF+zDT5Q)CBWS936$zN+=B3`Q`WzE5Ys_zEkeZ77qHz_)hQy)lxl^oH?g6p^b3-j^``L~?5WBU+Q1J^I z)dS{Y2qpEJmGeCtmvs=c+9{AMrF#JWW?GdjLETWo_-(*0%Ue{pvNu6KU^ob95m6w8 z?O{72Ws@rxif&s~w;cd5$_BxWOIsB(9a2BIFx3%q>AM6!*fMAUxMYb3#9jmIH;uCy zxyTf2F%7M&hUG{TK0Lv7I7T+HI!DSV`4>?UAcZod2MUaiEl)_|O@;E7tR=Joy-Mi# zh^kD=>N@qq_GRs^UsEUCB56eukOp0EFXmqz|a~63W7WuN3^mrBs0PaU-meL7HpRB;UR8E{0RD zNZFHH3ur#mCde9=v=-%Q!7RYNE&_)x1B~ue(%b?LMi0|{X3*ym%ez!?{6bon1B9^V zshI)L+in~T#~8`q%&^^LxL-sijpHy?eOq5xaj2wbho44Xp;bcQ5*?Vv;^u3C(Fldy zb$k#S@x(xxXsAw8FldTGWhj9gQt2wEwqj_?m3j4qA+bEjhIUklUi!Tt(Rm($XW}+p zb4954*iL|Q%w!GTqq1W25Fn^E%TKrND&7ZV102d!7l~H@>5CKxh~*YIMr`n8hchP4 zwERM?CCd1)nwN&lyGL5oO4pTz?8g59(8_v!Xa0=fkwU&RW|Ky(SbNbg*m@g^ke?1! z+uBj7h!+LTK^2KgkHa#&v_KLeN#Z^^)F_bvMZRs%EMrwnL&PPMFl4HP=(}6O@7|-8 zBd{nK4R}4@BnTMfu00^>N)|kqK?h`_ya~(gDh6XTtSL)2)Wg`*z(fMsY?Q#pY+J0DoZ*!u%yp4@f;)fFrmrTJ46yp{T5xN*qR~1uCZJ zFg%LnnT;Cy%CdI{w5Z;rZwy~5E+hu-<~;`B4}%8wM3#KGw!&3rz*od)Im0moj=VVi zAsFP!N{>Q?`oM9aT#@LBLK`4IaShWHdY-W`9`6?t?B!%YP`asz3LB|Ws#J9i%jp>y zwQivp01KjG9W;onGma8qWPD9aLv>ItEcA+B9-##%j7GZU#j#|D%Jq*U<`F{TV5GH2 z3WgbgW2OQamYJh44XvPc0!?h(pfbh58!?IGfs@uQZpDyLbNZk*K#zm=h;_*Pt97jS zo1mlsIWE8U2}t_?08C7X&1i7bYmZ1(jXFJ!cB?h1RG1qq8vg*;)X)p6%odz_wK34O zRyjERz!N7VD=nqf)w;P!%*6=sGsX?Tv(^h-vZ7LPT7r$K=tE!fD$3ESB>?Di5Hw|8TD?5f=g>Qh=6)10-5UwADsa(3CI+Q_+Ufy0+zkSi*q6h_P&bW6Ign6^(UZ>RBR1s~ROktAh@L71kwU zA@ANTaOh0kbPHmV3N~&4U^i?9+$yP=Cz~U}_Y?do!m};vR$^hqy@nU~LWyfNf_85( zS@9rK*2_Cww?e~8sst#R#!~`3STeD0-Dt z%7Gp|10K=Zi)?WhN0Kgr>n@>i4sJu$OufjqB8KYxO4{7IKsC6RORIG1WY=7fxz^WK zIH0*g8H+SsKkjC;3>5_e*;%(6E6EgpkcAH2VEaJQBS30b>+LIwN}xO9zxFoanwA*2 z)=Xdj5}S zbFx#F)v(j2QKdyp0pl2!%hoK17iqZn%t8s-cj6tZQc{irwm^d&g=4G)M~IaK7M9mU zC`Azrrd+I{T2#Ey*0FS>LtA6Cf-TvYv9{%utwS9_fr7y{L=vA?sGnpSJ>Yak_vZ!z zRHk^1GiiYKe(1&eE=EjY{7hUFyS|tN<+5anopW>_+8}zs@921j;;x73sxs|yQsBprJarul>Y#A2bq=(zJG+U(ScaGtCx{dy3Tnh zuHo#n1}gVk&vOHUYeeBn-Ec%HfTl+)Y}>rUF>B+FMRmM$5So$(+39Y4!Jq=AW}&vi z5wHc(dE+q&>~?_b#Nd%tsbFrCxOJ{Q0OKWAyYn*=dZUoM)B-Bx9@_8?2fo-vp^Ae3 z;JKX2Ljf_Ia^&&r9@w%kyK7y}2^bmD+6pn4ojd?g9ztr{{{WKRMF64hk2|PnDq!0B z51+Q8?iMiTqWYAv8(HdK%skl%EQ4TaPUTMsYbE0$$0lk%vqpp*DJiEmmPZ42AY~WrGe|uT4z4gzqNbLHFYg~) zPaMxMxpYU~;dE2Fcw-9#O9Rc(h4_TIjgk)yZ1sk+1-OF7thPrj=Y-r~+1ywQS7dZ< zcJ=|-=38G17hIe%?Bjq@&3S=NA=4U!=7~wXIF4CsLyFWnaRY0+6OokDZ5v_DZYB*R zNP=H04&tX?BSn3KOM&sstm$fMY_{f9LJHeG%WyVx%(mvB^mhnssELBPm>qY-I_RS2 zr@s(3jF4&)i|-q_;fXoceu20b3J|yWLm+9)qz@6hyDh1yAV&Jrm>kTw%xn!Wf2Y5Sxjx40q9GEW*M!BrZwXe8e|1fR?D2<+8;hzR7?K= zf(R>u_45~>N&?HyBf4QkTAHsAxftP<9)A%M8U*MFf^(34r8{F4z-yl_`;3Bhkpfn$ zw$N?qFa{RjQ6DxNa7PbKe&)SR7`a-%Ru}-c%2ef%O|6wKfr;ka!7MNnGYDYZz+qHg z&rs$yrOyM1C9KWh{(d8sbTuxmJ>pBVtH{A^E$nwW;sI9#Br3#a@m;DV&*@9hn;^qT zJCaVS{7OomL1FT{_?vsUgUa&xf;u=S%4!e=B8Juf0La})`9IxhL#rPMR7 zVd*>~l^ps<7e2{X?FeD}g&=O&!n%Ph$J+yXYcUF zE`{ZQYr|omSyIF4kfUcgafoDECY=I1ZMJ6h#H^vrvM8`2WHGs0ny7B8%^Uknc(to9 znE9F|x-^p_C@%X8@#ZZTd`J9SqWCMgwR(*<8L>~9LPHJG0R$zQL4Pvq2SCDuiHQ`@ z;DvsWWG}$nby)a~Own{;6jDp{SaDoBN^C4;UBFPbm80ecSqN>P5}t1n&J?h`ZxXnz z5KSBlQy@c+3(|BMs(OZWclVb;YNFltbfcsCbRDnV^IsZZASDllbi6wur^A;9|Epc>ibs^H9^P*$(?3_N5DIYar$I9x`V@AphWOXzrPfT|q+Qvw<_5W4eN`brp&{-u}|ccV_m*fvQUGrDT<1I+KpyTLOA#yZ|Zy z`Ta0lqGk8h5q(<*ytE+xVjU4Z9}yiAog#XO=@V5*7lSgalGIS{w=UpeR+TH&dP=xU zj0sHOhy00l!|fmV5l13t(w1c?1DqmFE|3*aGANXg8u%p>Nk(ZdG>h;@8ov>hfLu(0 zEB%%G+^}szP*Xt;?1t<<5)96-#|DsQAPL4%0lEVul?ZVyFv zzYz+)V;c(usz>4sOa})QGQ8xlv(aH;1)>y>Oi|*FNp_;zuSU#~zYE%rcy6&2C+WO`8H4t%O#zX8Ym&+moE3CgM3@(^7``IfQc*Ui|b_DN^ zCNjUx@bLz)K~&4u9Y~Y}nKNkTfjuTW7-p#j&kg`BeTW)|HAr7_S;RU5u`pQgQnz06 zvj{lD^duXXINz*ys6$wT7f|(O`j=rqf}nQi=z$D2+2<_w|4ucEQS3M0u;s_829i2bTjA_m*J zSOC?!Q|`i36I^56Tq?23%TfAu zd|bH!mRB@NB{go3NmcEr!ckNmRtrHp{5XcmL)>3;yf5_ zO8Ww3rQvBhyrQb31Gva~g)7{=vW@dE=U}Le$Q7L(RI*q`4m$hC91od?{Y&imo!R?mzkCI!{6>!7JE$uI|Tb!l#OM6W8%Iuaa z@C5w~U04?{5|Yug)=~fg&tBRG1{eKvGo-oX zUBLKE1xFtDx&q-aHFa?*x3L+?@k*~Jv`#+6R{l8W@{6z01*kvpp9aDoKaLg z(vRq$`fud_0MmaZ{{Yqeo3H0b{^Eb=KaoG^{z{Ak-Tar|=6@%L@|<}+Q2zj+{zmm% zci^Lh$*F@_fX(K46uyy=S=*?p5{lhJKYQSEND*h>U^BY+^?1 zm?66sETcHwT%~3@8mY(fv1CtU6mAM=q4byvZ&Hiq0X2zoy(bmi!`5)P@nSd%g>n;! z)T?k4T$z{Q^E>L{;tKOO-Z5nYh}28vPCI0}=3O`1F;phAg z7^@05LjM2>P|%ZL!aX$mK{C{dVnGB-imemM*gtcWW}>o(tfr7w%dX-rl_gj204Y-f z8^+}n)L>EU5elg;>b@a$pOm=A-i|+{UcU6WMGG(nXR#9;<=kTCY0lW;doW4`z(pys zVoLQV9NiKI?~8LaUqDNFg8e{&h`1m`x4eTcVmF8nnPjZ;f3pj3il4Yr`!xQ-g)5z0 z66cBk0K7(@tC)dMbVSU5pS-JIGB0%cr7=~sR7T}d0r!@{&C?s8cx4SuY&YT!^NY+@ zgZG27v(|s=OFdzGC9;2pFVT+d#%$lwYB7;qK|`i1vi)N%yNQ6*B9(<_%L(CBP*J1z z17x8VDo?{3*^5fhZv3&7T~r&YIo^}Lqi(-2Wcd+rD(v7Ph*~8BBNyO{B1_=9%rP1u zkj}F-?<8y9r(10E0q{2r3Kmrr^Cek|ok$E&-dDLu`Gm1T$U@4hjg`%_7`@vsc~#+< z*aw8R!K>KloVrSeE7cnJBm|<^a)KbRqrH7Hz>vEypYkoXus4wNHH_D}D=KIL!giQI z);(c9g1}h7Xo5H9Sv<1f#E^OSuZARRv^`}LwcFaeE|MQS}DLGU&%?7aMwS z%%ec|d0pSEC?fz1l(G-=1>r#G4+K}TX#&!he8KD-7SDJ94b8L|YXOh}KyX2~n-^0M zF=ZMq0db&olLHQrrlw5hpuuYqTkc^mGf8T8tSo7=0J!)TBZLpcFu-)NC_n=MMikk) zvVZ_64hdG57V10O8VHLSoeX-_ifYJ^#WW(v>{=KA3Il=}oUp#)#SGZ*-VOA^I$|XP zlwty_Brsv1-sTA5B9v!kx`e`j0Vwk@`G)kgj>yTv6iuG&U~^F*ZCvcW@q?PEfTvcU zh8{fuUeb!POp1goxV6+$U4_gE1F$YxO58bd39%s%iZ0l}C?Jrt17g1OPeofb4Fnn% zp?c=6bDxSkjBKuHbMq|`VpA+j?5GsRWerM(r4iK@kHkFG!tW5k19f!>1r@8j`^({K zH0+hTwB6%gTuND7-OjC?? zm2az;a*Rbso)xtD-0^lt96A74I>Z=mJGcDfff}NF+I-YocS) zBrA0&nrayDFk27QtrTu1#CT0brRB6-Um8|*E=bB&e-LevLY+)61*3vcKG?BDvPIEw zLa`QXfEJa=HIU{I0v0DE(lfMwqfl<`juO={7QpKZfg2&1X_XVuv6w*Wiyq;+8xf`o zaoBSg9aOy%?EEU}>T;i@y@ISd*6t?bnQ+=z+-P=IJ|lC&6Ejn6MmG;EU#-}xh6@Fl zw6-j6DqASH0M1x<3uTO~VRi^i=+&h&-B?PZST{u4{(!0{Cvxt#QM)Ddg0XN_9R6h5 zI4zC}4i~|hsibu?;$ZEttO!H^B{+@PyvuD zCI0~ALg7%XpnjuIMFQ&Ost6Kd@AWBrIGs;mccSmO_xcNPtAZ%DnSK_brlA1oraa;a zHfa-ON{0%D)CQ;x--%zLu>aX|+my=GMXNWcZH1z^lo&qLyjb*QRI>Iix#Kc&wG^bbO-=Rg%yd_E_3P^EHUL*y0i*zcgM$Moy(PfwF5D_eR`!FYwuS;o zRsO930Dv0@yb&Td004IN_S9CCp*1uzrbXEXz`dpaAxmp7_y2|dAM-b^+vWeoyTI}P z$npPOiDqN#W&Or-`E~$3-){b<6X6>swEth2`9Ey+zp(g!*w5SD`;ABQKkTWiE&GOT z-Y~QM|ADRk4{Yu3`5%Ac8;>~H#pl0!{YU@x4%60EPv`B7`gTwPya3t&MS#qI{eLUJ zky|MMAbbM=Af){7I;$K2pfd^pAYK38b--c(04EXv=$QH6b^rS}akuoe{2y_MZ#lf3 z9RP4u1pr_f0RRNE006ql|Fpej|1Y}HzBN(4>E-s8>;WzSTL3Kp1aJjd132FhFMu1s z0}y=O0LTJRk&#i5kx)@kP|(m&(J=|JFflMN$?yqq2&u?vsHw;)DQSV6OtkOV=_x6h zg;?0RdHDJHX_!PLgn7j|`S^MN69R{ZhK7lONs5I<%1cK{$NT@AUIzepsBqhG+X!&) z0PuKl2zYR>-`_d_fJ6H4IsCr~9sq}ch=h!S`qnCi`&K|efJb~IBt&>Pq_;l@9sv=L z4hf$}S__%roh2c!N0^LuY6(iq;2aUXtd%E_Z|9HBWjF(WT50Q>1ade4!khU2Lp}iR zO#%|~TN^VT03IF=5&n(gP3r$B00)nUfQV1WgCtGxPK(!4#zR&+^>rP9iSWjOhkyr= z1YA$B0w`;V1U@^v`NSDC@QOXG@R{wB^p3P_J~o;L1d7_{(EI5u87>!T9~{;3c4dNY zaB@}xnOVM^2XjMS~X*+CNnN&jt>O*mU zYuK-V+N67>EeJbv`i~CRe5C+OY3C$u5>!=P6YGHk$(+^Ns0laLJG|yD287ed30ESs zyVDpC(6|$dhJajan)y|5213SDhGnn`kc3$F@#v&)bPuDG>^MNG}E!jc(B%yZ} zpUWHZK#V-rW|MYPSgofOUkaMXLOUFLKu@RH{Y+p!VWg|p%@abkD3-PvSj?Q#4}+6X zrka4)6h%L|qZ3ipL=2nw-b*M!a4l8c%yi zpti-Tx9WBP6DQzSotnctTISX;u-L^2k~+=ltD9(ri#hIEFGzv-`x=SQ6wt4yG%aPw z&rE#)Oe4}Z5~XWluvU8X(}U5e(LXQBuV}Be#@fk_%zp8KB=(?U#Ov$fli`w7L){b5 zaXgeVfF+y^VpRA9)=^}@j0pzo5=Obq)=+w3HP6rEI=JEQaU(ySgia*SNy;&002(uA zVQj@H;&jRXdt?`m4a4dXRr!H5 z!e-BL3cx)d)9C%Y4gjRqH#9!1sEdtIDisR!44rVH^@`qwliIUom=iO7e`;~bt0&ma zx6ip3i9{l|;xh*+hqKKE(jinxEHtm#PB;Y;>0N!XI^`G#DMPhNCi@O}{H$V_gp@FW zn)@&`rHmD+@A#@B%ExdE2pM;3L7T-gAYcl2T5pPLt4H@L7VwdgP6TTyYj#O8mim1u zRI6+;zjv-Vu$$wL`B;0uJg#SvPgVkdwQK{2;Va+|c(I|Z*m5TO6;Px7cMxYUHPbWq zdm(Y%b_M+cQSW&%kHSj8holMiIjfKR@#b3UveyO4fs;rm{ zu8fgTcOo$TzAYU|Yie^i(dU|BcyErgNEvj&Au*O=nbdlD3@*~J{!g69p0KLrvnRC z1tBrCPqWor^Q>X5jFr~}MkvPikG|C!3&Qd=8p)_|C-sjlTlzr3f<(WQfA`pB{*ghp z!{FYT8V}vQiKo6pS(4?8UfUNzJJD<;vTzvj*X-$W@s3-C*`GhY;{c2*pX{UOS&@*6hMn>cpt2y40`XK@MT1mE>!BYHaKrY~Ul& zHCU_48l$;mV=Ba0bEYgRi``?v@5RPJcWB17Nis@)+_HQ$a?m+>0Mkd*T;G%K3@5lM zZr1;-eV^)#naq<^=-)z#FZsg3@F8M2Uoqv&p$1=slSiw>|23MooqH=wIK{2dvbeGZN1$|m(lfIikE>->qg7mg`jT40p(yIUrL8Bb~2 zhF}b7-^MXf<9iFb<*SQd?{^#wJ{krsx?+9xTp>tnJ}PM_y8#h|o;Ut>S2M7;CJAf1 z@4oU16og?m=r}gBOxR-lViv2ECR~tJFfsWBf`kbdEcIE z5d(JFdTAsE5&3m%kHk#Ah`P&yAQB#8)s0~Ep+dBp370vMB&wksqgwhZ*Aq^P#Za|= zd2Qob)>zp!oRRPDd$`#2rzGkUx+_8X3-i)9g9i$l=;rPRe)GqDG)r7q{GX$%UIB@) zMw%A}tCf$$tr)p}9ayobk4>fuePo9TLiy4fM z6DpNnP)>=oocMSUNJ95JhI<(YWnCHn;9p9l*2>T42(^*$AI=)u3lmDP5~+3FQdVnn zmk?J4)zYMUzi+WBh)f^roLz6eOKz1nJPJW4xoGW>AA^J|;1{6rCQJ^2=i%m5kK;tt z4sbI`91=;^50tT@CZLR?;30b)XCpoQRT;Cgj1PDxdWFA`$Wkn5nLAj~1kpbTNAGAQ z96~x))>ox+;88pu;$lrZI3lPmb3GgALrdf~|_vPy{H+Zpr4j&Wz@Y!RnQrOMnL#v(h&-V2si3d=kKLDe@z=T#!TRhKOM+ftf$VHrQw zs0@)=1jXvi#@0MH;#1SRtB~ZerzYCE$+8~$cU^1x$VfeLbxzae<%YpD-`DO~(-(_HN7!lHo*z!`m%r;2z~i9tCi0o77ptMbB=UHw_=}Nj#gQRuUQxe9!dpphTu|kb*ta5d+k)PKKIsif z&PF(fX_#o-=TiN87G)W+E0Wmzm{ss>d`lv9qsRJ9qI|J`>dL01sBG=H<rDYwafw$bt{AT7|KxOK@OhWQsM0{KGi^?^qw7Mzx$UyI7(B?%-_zzkSefs9to3}xEyviBRYNptI@Xm@K}HD z)!YvreEDTePwsKO(*Yu#^MVwh$DW96%zcxr9e?}o z0~YwYwsJ1%RFnR0X=Wa3a1iCco3~78xD0HMfJ;udwC64vmj@w7lc!3DL`; z#U7`PTCO1DBpcsj?$a{+nN?{COUqv{)O#wSdS+VG1Kd zb*NGmT*R0-S<;{v;J#WzYN_M0)NzE4V${}5NDYU378yIgzi8%G1Ims;j+?3=(qs)P#c#TYNxZg&vsS?`AWsrT0tO`(X*pW z{1jMQ?!XcDh2&`r;h`ZnM>W|)tzwj=Er${*G5I-EQ+P9T|CDM!WangC?=!q>nsa#z zKOT#jz*!b90!-K+k#2_<&seB>IwnIusUx0xnI_fydCJvNmRrAnl-u#EITf9vrCGa(?#5V zEwq79X<5b}H-u}-Ge$Vh4#h184e|_|D*U~3UDBi^DHT2af>EBo*xJe^ zvS*PpI_^`NSuNdvihl88IVw#FsZrks7~|fjt7RK4{Np-ZL*8I^x}gF!ZOJ*DT0Z6V z$_rThh&R5|nZ9TBA+39dFmFbE^r;x8?1M_{kjBTs@6qFzgD^MsD7x@ z>x6m)$*-~(WHYrMc{9#C(dwRf#X1?YA5M50i+Nd*D4n9mnFPeGF?UWJgraHhrs`Wd znZqwQ52mJ&#=Qcxb5@^)4LL3a)CdX~Bs|iE9Vs+UA^kD+<$+X=RvbP9RUYoQU99@f zd>wz5WS}u$O!;2{S(jU%PE1oezVA4()UnVwS_LXi|N3-ia4fD>tC_OA2vNWp6sqQ2 zYSq*egKq7Qd$ek~e>yF&k2-OJ`xqKBO&{rIJ`4U7>+sD7;cR`~Kp~)y-s6Gh93m>A z9N(K)!)l%KVzRbXVoGEm#TbjALg#sl>EG8gDa4y%|62c|{QXlhs6kku0J&xONfw0L zQ=dX$ecPp;cE<6*E@>K)MI{3_^21~@@69Z6e~~wik1x_ICzz}n@%quG0XKX)-*(;g zP5jR*K-IlHksfp(*2K4F(V>jlR6^K@|y{zmqZrFHm^ zx`o;rPF6>oq~XJk!iXc$}gCYaDFsp3Qmkt zq6Z!*t^OWRkKC6b)sUzCT%x|J(h$XGfshHpW68`T6G!5s?Ne?Ze?$_q)GxJWkMfm1 ztFj^6QC*I{BusRdAga#p<|ZR`Y8`-eX$o&Nr0SR(XYbO)4bWZIXXF=9VeU4%gXv(-IIyrO$dF;s+z40MbkIp4W=?3Tz;TRmBaIExmci7O%ns z&E)p9(CE$}?WyVQqz^Pv)z^v;B^vsD_ZF{5ju-A44e`drSoSqh*B!f%c&D~TNdoyJ zzQ3~1sXw}DP>(5R)s|f=pG8S0e_3!6cN~s&MNv{S6sO}~M8V354RSun3STeEy%`R) zk+}#(9YtEC`~fNMG$$IT&x)*uFaiFC)w`IDcrUx67VXn@;xDFS%9P_3Wcb{x;a%C{ zikzu66KeX0OT0p0{I7?dOJ>H5$JfLL`ocxAxWW92A-Ze23HiAR@_&o z0L`rUvLFpo?4x5nP@Wd{vaZbPj>8Rc!uc)qbKUG&ufa}kKy*wjxyiq>@#ilhMmx%} zji&}~ojbnh>s3p%#r|y#_TX02PhqAJ-#r$`m!~MTdA1Vv-Cs_EQ?%_7v=j~07%D80 zpF*2v@5}T`*U9wnnm?fhTi=<@iUxZn@{E)J`e4)0fBw}uh(Uvvq4{?|b~2rSz?sR1 zQdSzOG5Xx~b+ypHK*m?VD?sOYMOLxNF|%}bS+VPKzi8EWJ6^wk?BN48gZDIG1!P#Up4=KT5kApWml>){Wv+pXY6Lsk7-vJuJ;hm^P z{@b`D?kM4c6J3ahVa{$A2-%wR!b#~V)YIW=rQw5_>i>*Q@0*mdK=Iz0li2+2S<&Aj z^C6)z);?d|e<$%XH-?FICc>yXp{6cMD#eUAk$7qs20Y0p@pz}X5n*9bTZ7KU^0>|+ z`=P(Kc7+5U&^g>KgxHoyuF5_oV~>SxOZ8KCilJH_Pm#msLft8QTQOQrKlDjjgwlPb ziwtOeXrb;|DE1fq$PYG_4Q{&gd|q@mz-w)P4g}_J8m>Y}VLz$uK|xV`j~^`+jKSaxu`lu39pKJNWN2 zF?kMnbn5!@TWqKH^HtYlHQqPa7)-$+KG{az)>-?Xw`)uLa*pX;tld`x_^w+<&$Mt; z4G476F15*;e3vJPsPPvidkwunZV#QCfk4?WpEX1;wOQ37onmJyc5T$32)X79R$}2z z3%^>@9gVFe#xPcQ%Azt_wBIu-kFPF+y`)Kr4Ig4cy(Og5XzvY*Mlc#4DY?|m1$T4p zQ*k(m7|XkaAIyxtqsR)oKQuT9)Q9A5bs6QxT+ZlJr1Yy++sX!DocUcO!@T~A8P4rr z{c_v~x4c+$JT_uNM26b}gnhbNL)fo{>q;^(#3V9Pw&e%S{nQ!U}J4P5HLl!hUJ#Yhsfa51>$ zE{#;WB=X+alb0)#cs=I&iR2T4e@(jBF{-dxjj0Oki==f2!zf~0Yl6szOFsIw9&GUC zx{Bx*FEYf2Q%cLIp&%EiQ2@JYDy*L;^@DPezld}tKqY?*8hbU7(TI z4^Z4-)^QNbw<{|?@gDe>nTdr`W~zJ?om?>?P-9)__u&r(m&Oi z%t=M)e$1!jx44-9LcBv9o@3mkJ%3V2hH1Gh;!NQNlM`V1RpP?2AU-N|z~DMqI;(^6 zPkQ?NtZwk^b1_db+?vXGFOK8X!pZtz25D%xkhS$z7t*qp&f=_`(75R?=Psp^9+jpW z^aJT(P-E+~+IYoafKv&52-7UQ4X4l2T22adEmOcA`7qwh)yLQ^spSrGh z`7}HY_1n+My7{sze&nvF1@WFUo@Wxu6|=q5o*Zk!Mcu_`BT|%KOYXmHueHS5QXd6% z#Y-5(S~Z)5ui-rReb)SRiEqtJ8`p;dk%musb6E3(m$O%Zpi3?B>L+?7=Wiye*s`{~ zG-Y1T1bR@*$~5V4Wa5j<(G*aPo^H>xunUgW-gB6FQZ7Yh>Tqr0rstboBDDE_Z2#v{Cel2pmLT$(VXhy-OBPVXEE89zfZT3`in2~iDS_Vkp@z5MQZ7l z$mqY`mAQ`O)SxVs;?+;R@o4n%B}qvRM)bn$shub{sv^GIrv6MNidGsm!^fgEd>s%G zGmQaq>QdFzmTOOfA51hQ7#WQ(6u$`NCMu^{jfDYce#go;7J@qsl%4@)$fJWtiS@jW ze`eZzc2?}h&MxCv1+4oYIc1!`^!7C zh0PDL^iIa2Z%%`fvGW#S-6H>qIOM^IG~mM0(UiTgT9iw`T zJIi7stxkB9C?G{Rsa9Y0@J6pG!;-Gjap6=)HmfVVt#}!ZIJ0EMbXyJ$-JwpjlUy`9 zhJS4=-}ywP zaddi-@&{Ayd7|^qAc+K+cm*w9YkuGrhBThqd)Y2P@~H`N$`IXqsbaFeQclF}J{8{x zL5{cN_)he;WW*TS+EaO= zDBYmBNHLXw((p-}Rc4?^iyV!wx0Z0R91gI0lbvv#;#{E1_mm~E31XAj^e;v)bt|(nMqUrTQaYyv?C> z)e!Txl4@4r1YJQw)FXi?(>&*XM&)2K67feMs_h_nMupDXud|we_vgg=JRGe>pl7&@ z2R3+9>LqS)Dp$fx6D7LnFI=}1x9PSD*d~(9+4boCIRGC#vt~C&TT#hXN}zh$SwBlkQ(L8mJRLg;l)=#bby*W?|izFdI(g=?O6GM?Fp^P zQG+pFBO&pVDa~x-f4;cHzYs4SOgrsSp2#cxz*cw!?fI10PbIXu@T`Sqz@ww9*q%!OpijjnReXI`= zL2rKL#oOBC=g6&V$vImr1t)`lK5bWWuYf!L@NZ}TGok77$^LIbgL>#ZGKi!^iN43u zF4)8K<9%dK>X$jpG#!$vvHehUXh~wr4=c@z0-#)DBL*>f+^;H@}~H1x&C-V$6Gov+&m%e&k3b z307A=UTA91U$4B?7R29YrqIM;pvj%@(cp5%3|nOW0cMT}+pdx#YXs+OyS}eZXyh#2 z6f&)!F1`zBEb={nTd43>9W#XSAaBD*ji`MSflKg&hmP#ObHqlSl5Dl(vy{gkb4Hch z20-OcSs2{B-J>Q&)sRYA(Q6=G(KsC;)#`UPHPyLvvo#xoX%~_q&#dPn=EVN4<7?-Z zNt=%F*;P_|7Roa;qdw0Nn!^1TnNY%ZJ)zyiF7)izLfPip^ zhN572h$~yjtEhXAJmV|Usru+emb;Q{u?3pJu?W*le+c2iS5nr1=U|mqjit zpO}b`V1)Ci0!Fn?R$jY2(fpkZm3PAWdsn-Gh2+cMcBTO~h}veC69-@q4nf2_<$n}k z6a<)ybK@IZlCSo?qXrP#RxLP;nIsl*$@0zUvoYc{$0~JlQCW^YcUpT{rfGhb?>Vv? zlc(Y)35*JJYpuFH*7h~^LI|VysC#<-puB1d%{44{Jih%2U0_IZSikM9Xd-b$IYj-l zh!J?B^}?%@@d1UP`W1lPcKU^kg(;XnhE`~CYqsdLJH841*MoI(8ifJr-sI6W+j4?i z$U+8FQjvV(^=j3+Sc^a9{ey2Zv1|1)1CQP?kQc#>+co+L~PSTg-<(G7mbabqWYPadM(iHx+OkEA?p z`UDZ6&^xcRmG)_EX>?`RTlek3@SZl3r@#}>vo*HVEk;2ez*5qyd!uD>m!! zJkxENBY@@GbV)+Wm&hPNZNYbYL(6jx-(c$bcqiD{lF~)Tt$EcQ&Pbk0$86+uHk#P< z7H-ExD4q?={XrLgDz(l-J^Qy0x(rAvw=ze*=spE?DhG2to2+KB`)o9QetBDLY})Cz z^bPmTZ45#lh7Vsa4iqaTw_@RP(6f z{A(Pixr&mf$S7B4fmpDU<~z1y{?v^)8lI-Yv#C!=_Q>ILuK9bxENju9dIa!)VAtq(jAMqp_bT9=19q)lXG~3kI$q zXcMWCqD5Yg>p3QbAc%CG?i}FXsh`FR=xK$r6k5tdF$yg7)k~_U7&Pa-m&NwX;k?Vu zniH-<9+xz2sbkc1S=x;uIj6=TUKRJDy{YulMGm8Ro=fp8X`rhY2oW9)rM1X%kcqx@ z{LAoq(3#DmI{)En8p-<0%duk}EB|_!eD#kLYyYZhAzXec(RfMl-OhcZ_M4tx>QXFvRnl635T= zgZGK(m{ilk$DKZO2vIbW=;Z}XKQs>Oq}z&pLDPS}N^&7bB;4_Ke4 zUsFB7;qp5pjsb+1mM23iJ{QP(-DvkDG#<0Y3m^V&b)fL$2>AGC=tnsMhG$M0`rJ(F zrBOWX`&xH)d}k@t`uYQx0pxp@jxz*1VZ1~zPwV2~d z%}N9|zY`&=`lS_2neV{wdJK<<>_naGQnfcqJI1ASQ}c4vMOC~_jK$vxO$qcVjnn8v znK(EYoV)@i7l0wJ0Q$4{5w8GeEYpr%y9fS*9Ku5(f7W-O|1qQg(Eumvqr@_7;M&97 zs7Y9wCLzI{JEmd`*OomDR{H6J#iTg!gJALXqw}xcPQItq43)9)#{Y7uuKNsJupJ=> zg-a#c@f_qyIYT4OZ6-fgB)i!_Wff=e#C#6T%~Zh|9q=n8^u*^R^YY+$rGJ?7Fu{=t z3h93AyE~<>w2dpSq!Wx73>u~PX@N{A^9U44($6}4mS?~i!NIb9su>&j?`=X%Fz)7V z#>alEWQK2sCiMSkqY;|1F5FyC#9LCk_i;x%Jv@%#eb++qVXLE}%)e*_bQg4DC_rSE zLc4pV&aKMt3BuP6n=-!WE_KfYPE3F=-)9@tlAhFARq=bwsL{T+hAp%XE!x*DY{*t= zE(+3tpnz*7S5&K<~D;>%O10zjt?)c*R?|CkMmSZ(^aa1 z*(y2XD$h{L0-`v~XlpCIC0}dSAFKy=$hH=rg%%JuEdK;db6` z3fkWg53FLiwJxgp6x+4uF1|-uHEtXBXheIqikTjsx72qof_y@j0M2tsU!KUnVxI+X zR(W6{Cb_Ml-C%mH0mQQBC1hT96pklNmAX)2Vv^|Dn!q4noTktX`@9Gw5zG%=1JvM64rP~!WEi7NIb{=^? zDQX!$8EN)HTl61$4KNOh>{sZ{Qw2d7Q@Of{!z+v%WKMfFLjG(eEB2dLoZZ7|5T0vW zL0}rl!A|%A0G=2>0|&Ni)aBH&j?5hQ*rm57&P zA&88Yhh`PbwpyI5b(fVchFV7(O_e70z#OE@Q)H`BC_WK4p!*l+6z%81&A&zcbeIYM z8S9(&pO!{cCux@APWt6VtbuUm(oS2wuAoorJ6{QwrqYxvvsYMemXVC3S`lCW3Zoef zto_Oqn>p{Rg=?-AZDyDRe;&^{1);U^JFXv5)sS~3H({Gw2o+YN7g4RjVx}S*--c5q zg_j>-@BDNcyGz+S*k5~m z!-ON=@{Qjx_)9@!5js;%@tDE8h;EtuO15dmQboG2AX9}ZrX1bBpXyo~(TJbVtMxgIWKdh+cM{2a zMXPHA z+JbS8Yn+t3aM!}ZG|rK^je{d4>i}STCzVDkxcKw5NIycYbfs*Ji7?G4f@g|ApR;h% z+#?hCf%My3xzRQu#&hw)aTkoyBaFukgR8dyiM)+k%(a;X%~wE@6Zt(CPs?CNLtuaj z(;W?@&0EwM{R3~AUM(0XU*-4_t~^9;Udv!^MZ=`>J)0_A8k(>NmEw{jh5(goaBdWv zqk|PKdfaB-PwXU#IvG0dpiIW~7)yj3Y|s*S@FsNH>G+Ph zLCKZ6_V45;@gk)m&>e;G zAv6b=Dl*&So;LPX|1kequAYXvd1*0A56mSk1s*Z-^KT9UO(4YM;YuAR`EKh1CbLP^^q!d#~N z`2ssRZn<=e31SYb6LznMIsK6^A!Q z$zzLV9BJ>XYxSZjMUke1`JH)@BZUYWgoYOcQXRcf#pGjZckdLP zDf(92sE-8;zGWr5mA)evzDe`=6a|WH-WD`PSiF`~n?O0#-Kx`SZB#ZY=b0eI_TZrF zzSF1AB`f%7V?C^ve|QLUjkms*#loT#ql7Y>w2TbTb5g;Ky&8k%5}!(t!G09>rJkZ; z32Rsz9V*~UZcd*+7J=pD3MyejW33iP7UF;B-m@$1KBogB@}-CYf#oWGhM&LF9doKn zdPhXHB-|-U!+EN>qRjC%jQsW9-D5g@>KjL!Xr4G)L!kO@LXQ$2`XE2}2y|6Ya4jns zWu|^%=M2sSq7cr*H15NX;C!`5QD*->8~itFdcDVR`#x2Ds!o<`ZT&m2;h_q4`+;xY z(`|;f#jLo-bHP^*f{TF@TqC#}qRO=LTr=dg_=z$VywKv&A4uGVbm!zK!6XQojLg4i{C zYc(5%IY8)=)QMu5tExMei97#_Me_d@M9aNXSmT)6sDf(d2#HMX48Vg zIGWU*L$N=qS9{mnA;5Eb*2UB(2`YYsXW?9&yhkTRE`pcjh_E%7czaR-@ny8h}!25HB zS7mh--h$j;i^K5UT@95zjBi&foDp`-?`fY*5OI}8W6iM-mE`ZJhN-eL*QvV8#jbX& zPY4(0^+6gnV0@86A2vgfjhdvG{6hnIT$R_91dwTpqdR4%Wh>%hiD5=ISE~$og;<&V@&aMG(b>(dhx^XOOq%KOY-zD2(Ifox3T-l29+6kI%g<`YyGrMU^v2}>oyEO-2w>rkkkf=@lWV zju-yXF=`7S2Y3DPT4kYaaLM@7r_i0m`;QacPos6MsV`4acgWqI0y=mF6!0bQv^Ti9 z9oeev7`=sEFHC4*GD`pQdr0!j+@HcB~R#Ya3+L%_rV52b;a4KUE1(U)uo0C- zlEC_jWVqc^;MRAl^r%m=cB5~eV`SXaKI!mpS!uD`l$LN8RaAeMhVS=-d&d}>i7f7C z+qdm8+CfY)w1`GC6f-alzQ!xP(gP%#W7r*It{3Jafj2})YbLNVFe>ROlR5fYN6fYh~dYl*W?EM z>iGSC-ahb_QO)agYabS_=Rj2p1O7?eI4e!(jj{B1-Fz%xA9qNG*d|hC{*kHdNTlR`uniVSmA>NRbxQR7dQiBZRLcZC5<@~I z7GlL0t&OJbVPFEV7fh23`KBPvFuV`LqlgFuqIu>t;2bEgvb*DN3dS1YdE6O8)KCli zh{eMHcylj2ay;W_3)=s1r?-^+Bw0Jd-?8WN(SN+uurWR8oIat}R)wuoyvPUtQp1G+ zI+o0vWz6;3>WAr2w>eA;8YnL((>d`pYenUtT7UubVgG z1%oPE1HXdeN)L~E>vKQS)>?q&z(F#PATqbvQrqs{0bhyqgpPyNe)@-oX&KP~jhKQ; z(KyNh3{}s9Tk2^Mgrr(5JxF~?Vp(cKt$D*WXLL##lCAUD`wZh{ngainTi@Ne=7dq zS2i9(9XK4+W2KvE{w(~Gu`csVy?;>TyStgdBfl4F$7;)JN^Gz`ekCK=iEyddnHL5V zqZ|w}wXUs{#!Jvco%by*Ts-_;X%DBiy&{HcynurD<*ZKsJ_C6trS%W-x~Byh$7sWr zGzb@c8oz;Y0?qt*et(VWM$#`7Ql$M`ds<7nx^9)0Q|vDbE6aNeY(J)AUw3B69QzS` zJ8snWyBmJ5w_evnU$sQlpa1^nmFX@E&&nKI64;Odtu)d>(p5M??6ZU|_X#Lm-!_`&t-2rw^mva#b{Q^0x zbp6Tq#IGDjo^ERDkMkhFd*!!wR&}KB^fY< zsy^M?%{k92(4tNeF@>{k?t$5Ge!1m)UVHtT^$NN+$l(HJLtq-aNwFGCLSU>=vG?#1 zwa1Yj+i&sck#lw@dLP5Rs~-&~ak(9=deE5B9<%WZ&^KK_Ia`=~-o6%Bmw1SL^V%1- zEE5|YW!g2Y1l0Gb^=UMlp^1X>UC>xCzppTD;9(@C!1fy>%<{a(AxG-UC!<}w9F9J7yMa@J90PeuNgR@mYL`a=fm{g697ZoYH;$Rt&_7RQ`DVr$XIL?ukOq_F# z-gCiu&4{tFU`Ij$GM!VJOTR3A`iQi0(nq@B{ksv*e?IZzi{Sg=(3Wa(H$LB12=e$( zjJ1dd&QkP;0I2Vb2CWy)DUR(*n02tP|N564zd4r_TrzSZGNWNuTAmH(|HQ zxyKd-RMIrMnmMGNdXUimDPlK`nD^`SQ^i`~&;H0{rmmna6!9>$hDW|Pmb^wCkz#C3 zt}pJd)m1W^Om#>3z&0>)F5!y|cgh-lS_!7|{JC07p4gmQaUfwgx9Fv(t){I7u*wXL z0`a(6!|YW%yJ(p{D2j#v+IG(8nP!ofe9smn6MPPx6_+?RM}w%{63uBM8ITo+Y?>7M{W(~%@;|F7XLj65N zsi|fxiIpaa@kJv6acj5k?C$B+J_^{;rz41SNU#^}$^h%~cu&9ro>vFhLgi^Im6X0-hS#I987=1Y3SNLbyJ25bsV4G%W@b+ zCZ7x=hA=nwUQd^uMle2)!Q=YNAy#8~3W*bq%4PG%(1}M-{gF7SRUJxAl`ZtB$DWW94r}K=GBr`%|raUcb{u4NIg$;z0*jR zP7!S2mjDwas6mGY@H5=5yTk8vI!^Z+86I3doPR~f*t)^IoCVlM-zuIso5LCc>C(pK zXC|&+RErYS+?=Yz-64+$U>^C>c2*U?I3AH*$cxY6Ls2 zl^@|bNzPG{KuMY;Y!WPloF}!0I8nH)n>N}-DZ+Re!X3Nc?5|ToNf=o-Y`&49M-}ab zvlBM8RHTb-u&;{%wTh#UB(05Qaa0xd@UZq4Ts}d46FYosskBuoigHq3 zS?mLAl@Zef@@@^i`YF1rRCPW~pq7FMLW`iHS}za7AhfZEGlOub>fgg{BE7FLGs%!} z=3?uvqtz+i)&VD#V{!<=D%5S4%LTEUJAy1mdm&_!d2&IkD2`g} zg~>^#_@~0sIL2lX4y^Ss{lD&OkCV3hBN4PWA1Drq`jl*mR#nkb<0ycxs=)B)d z{v#Fv7NJZ>LnK)Jmu05w+HR@=rm17xc?8+trz_Ehe0hJCd0BM1aeqkMYnc;dkbLeQ zt8?s)r)hZ}fqz#;S9y%x*~UfrQU`Y(aqpE*Cq1$T#aBMB1d}#DhNlm7ZfmYwTr4g- z+Uo5@qLzwT+->Et&)a^%3mv-KNU_bm(@zvtFghuHOp^{5Abk>j@=l~wv{ehQ)iQz#Y*D;K zz}vfXt&5v-sk=p~x(VT+fs>r5+Dl0!!QViV+7Xs=3;Sjx^dk-IUBSxOOD} z0N^f`vDR&Z=6o~-Z;CaIM*El_~W2BNu0qljYX?EVd(!L$~ z1i_)Q3wBDviq-DB8q46Dl|`)#!$uXFx9+GTqeYYpM7T3=ktCkUiefEkk$Jj|AdCaJ z{g+VZc365NEcsc8J%kYAl??3I){sFC zbGqY|6X1?uLzvU-;mX5#VkvZ18@g>{-w@dr(;conRDEQE{S)XV*O3%;$=DC^>LDj6Hw z)I2UHSpFDLRF^)2Lr*6la@FZ!@^g<3o^F2^k0+y|rm2RmKQ^9d<&2A6j|3|_{abk# z;{O1;@+z+lc$dR+nQ6?0jsE~r0#E7{%{%yus8SZksKh1!<-lxs{_E4lug5>@gT~L| zvO}2idYCtLhir96&Bg6*1(!Fa_`^rkhS=&nsa^OcvvcftD{pZP4l-G!+!33buE@1M zV$Uvkrw8^y#S3Dne6hyB>2Tw>Cf&-J#1?_Lu#v%02?T_0Hv;&!cupMC^K;+XQ%~6e zG=qj(-P1bzUE75dUeX8x!`V5-#_N|3J&{3UyJ-iT0;9;q@KcgS!);-bP>>5ZTQ*dN zglt?(O@YO|)lE*RlsbI%1*XwP=O3-GtoH`i{%fA`yz)ii(+f^&Wo$#=ApZbF?`pPQ zI62Kldl!OfypInyR|`6K84cEi?%g5Evq=D=(%^s#d2xpRfm41-E8{cIeA_0NV@E&8ckvHCNK-uFAXx?K|t1nXlFd!{8ll52Oo zG;-r)0l%h2<>~A;%dX@1R!z?d?d8T8H~<8iFuf=$Ngj0hb~wULI8Iu4Ok1^RW<*X= zF#Dk(?m}I(;VT^$w~{cUbBP&Hi9&xeV570Y%9|;b3m1veG&xlhH^Ryvk2yGiiO5Z8LK-+fGV9gu2sg03z~*k+feSizPPDRR^@O z_FL5rXu8Iz`POnqk#<<6kdOgagz`u8G`+u>ysXMlOM=*hS+`lw1ahuTBdL}rz){pk zFUsrtDKFVWBoRt(TVgtl6%Us@ChUIp{!_}~$)lWkk0*95b~*6)WyIH2MOXw08e=}; zSZl+D!MfyWt{K>xYS8@>!dOg@#eAa@IB-xVKo{xt8Q?yN2>KPT4!ya|^O`+9TZPQs zIC4}6Z4{KU#dzgwpUZ=SmF(DeTx3{+JN8^mbq-;{T2%VX(bzrP+B!KZ8NX3ZS#a!`3_*r0Q+|06vwCnB=*(1b&NB4O*U4$Cl&Qp!zGUj6OdwS>T_UrswXeGjZrn zDfW3Lx%@M!YmAzF&2R$@a1F=QE^(EfBk;_EH;LHRpOxct5A^*Py*kB(`-aTfy;XXe z2&!4-%?NOC%Un7xtXjFjoY{1+n&lp0rvCsDqL{UsjX95@d?)#|uDXX;)AbgQgs5z` z$rrPS)N-im-@~0UvvcX1>S+#a&M)*_MycS9drCfSIdw#1A<^F9dYF8p_sQgE@bG-c zgVUZ%MqOdlT{~UXqoxY-YCjljT2q8oca^RD6E`F8%Ih@$03PYp!K|BgD~Qil{;Sl- zti_Yv9!75+n;%Ni*E`<8b6}BhB!S3P;Hjpmh)GW~W(0D>aHq4lxBxDdPn2uo1=bi6;%iZx`q2lL0luU?EhmccqN(ZmoJpq#N6^ z&#Q2CN&f(70XX(dx*@n|yN!Z-gTkqEB;?-!*ehYY1)?BDThk%)D;h|+XQ-$f89g$# zD4_Ugi6hkReU_Nvaw2l1T6>P}Q8n2elukE99btvqnaa^=r9}7S_ffh-izyy?Ddv}XC?bfx;b+;h;T9<(z$;Onkf4Gs zper`Q(HKqJ7epmFLYV_N2Lc=c9f(!UFloF`bZ56AS+Zpl#R>laNW6Kcjs00)&YCa# zvF-!$H!4`?j!|~F6h{gfA&yLz+1n?1!JdvUBkE|e%1Wlnh95)x!P(d;x*!fdrjn$NXE5ES$x!U=9LHdswD3^5tbe58ow*@% z^!m+2Z456aG5ATs)q_^2n-dL$@>-QJDe9gY(=`z0RMWunKM)_tt{YhX6|@5;ol~@& zhC4sH^%&!a%WRFAkHz+bk@ZC8?>8+VUmX^a%_#I|EOC+Zhz*)?KTDjX#PaC9vP|l+Y>qi8om1>B?};ZUq-#^?xlbF#WBJK;3QnxZ=DZ~?;Ss-yKT zwzA$@=4$L*eyS(grZ>US)KplTl@lipHdL#;z;L3cF24n5Zp%?rZnO(s6QtS|HcCTm z0%G?#sv?P>J-AgRk|orUL;G~XjCFyh_~lsG18rqSz+osSo5f|C80meK1~ltgTm z#iQ_?h0@S?zBgI5EG$2mWGvn`i&9MMld6>3jXhICqmiy2#aa#ri!90sHIW3YfDpQN zypE{=m5?&Tb#h0RxUFhkaqO^^2ecd5tQ#T;0ocJ`Pg3%C?QtKAs<1r3cHYhFVz{Qr z=Ji);^*N#8=RB!sqoAv^$rs1bVrmjKqhn5brkhof;OCypI!O!MNhzTboTmXYbi_GW zdgR+6Ed^~j*{hWC1mw7dQS4H5j&4_Oc_oCM^Q3bl8QR`Y_FaaVr%}*A8%+yXNXxC0^(&dDn6%)n$~w?( zcP`vej1COal+A+Mg-W6e-wM=o2aZvehXu1Z`e!v&OMBsE$xP-OfV%lE(yBg<&2d4do%{yadf^|kRcE~jefN2+8-AnG` zRr<<{gO!Ioh0od+a(2#)ain(hQtmklAxs)D7So{wcS0Z?liFgk8A1{|DH~2o(J%ms zv4Dyf$Wmo6Rv8Eidn8jK$*?wnmsCltJ0?gektQerNV*FnDT)9BnLU#f0Fg%-nr22h zak2t(v~);J+MIS5+m)VK?Sql72ye)uYtIuQba1o_M!*(rOfk$0WNTj2$RTv`=|V?7 zT8A6B{G+00>9o1DU%L6t+@DO5<{GDisH(2&W8}ZE;c>c`hHGeCOQSDn{7qi%E|X6F z8)CESG%`U9cyR3CwT@aQSkpd#F&4VU;Ew7$*sovJd?ig#*BNQHxc(*u#%dl5o*TNA z+s9(Ij#SKC8abFMrGeqm$mWsM6}>~^%9v~?0!H`XtU8(sidT^|E@iugUc@VDNJ>o} zl|$lMI;#Txjy)ZPvmEirF4qDVk2U0Qv?%q8sxx@zb-NRVo5lEA$@+S*w{%O4q4A4N zn^3|%#|xyT)v2nQ405#lU1s3XX{KmdDTaW?G&{nB~ryD{mK=0_e)OMFC(0MTKDoYLWA!fV{x#W*&2 z&KFM9mj^cH-y|iahT%^Xtk&ecRB&7tZ?xP2ywksI!sm)A&$lz+s{{Vv> zlZqe@%C4H2{giI2VC;?qkQqyEig3m-WmA&8a0;moi?L?h(jyZpso@gnPtp3NjRh z2?>DL=8doJI;|r%iE&Kv8s80S6hxB|dwaJlA@Mzz+|n$)lBO9c+*O+GChqP6=#F30Cy(&+OOS2CmO7bXaC00%?h5E?ba-0p7LoK+-=s7jOOM@XrkR_I zMASYitfnmzf0*BXS5>F@qL!op^ReBEZQdpl$z}HNUEZhpta*Z z>R>?&iH2vyz#8HJ?6hFkB#eOLaH?8K)uI-r7fk7sEZ8-8WVOwepN@v#I9$#WTr_T^ zpGA{}8{`aWB=D)rslvveSU+`#U8>13Esp_IamrmGN@;dBvtDF*jfAXLz)nfBv1_{L zB%`smSEqwZO5}O@wKnP`AT_rDDH`<77E#}6U9pN?9BxismN%3Rb#sC121RuR<`t9pX6EaSmUca8}~2GnaB77grr3pdRTxL zRdoq02v^cD?VV~#5}6~MWRmKV0SrbE@Q9!{KrtpM(-gpBn2V&9&;t;K5@X5&fGA2c zWF!KRQ1tN`s$-0D=K#GturZOuECU(^mkHsjZ$Ddx;^CKZ`!4QRdfrFTc>YFrB@^25 zu&6nHm1H?87ZoFvMR}*DF(^u6Q(Z6|pdl60APC8_iRDb|C?re@HI(e0GS`o~l6<=A_z!f!Rh@e~(LWSUR1l$z*sDJH~}K!T(E zTqHhZB#<`QI2pQMRUZ5#Uxh>t_MSoj)7OOlX&5Mj!R0#@0k;T9zeP2-@Nki7zR;Kv zHMhA)n*}!83k3_?b6}7R9fV^)MGp?LFzi_aNKbIxVt|{J&Lo?1h&QlOXn{8-=r;FL z?Z>)e+vPe7L`MUZOu)G*o%0KXV#I)igxL15O5M@eT}FGAWLWsRAR2v?eydy*LBu!J z%9b>Slo4#!9!^xwM6@SQ)x_+l3ynqOJ_{{Y}E zDGx>AYG=PAXSt__%xMrjsGOvFh0C1W5}2nbQvqEGDasOn1i3*Yu%&XZAxsL>JJPxR zMob*7s+U=%b9#)NtBNIbmsG zy;1roYZI^9z_{{Zb! zm)!8BveFIi>Ppqqo;L-G=M&1mK`^*ee2zuD?VATe(D=KApj?raUdM1=^}L1kwV{^M~087Dkl??R`-HvO?QeZ0T*m;^AFoA zpCq=$v#%U&q&&sh+;L{yGZo)Q=ZF+@<5 z#tA}E6eR&fPAa^I3U{i~oD|TE+P8X2=4;>TD}K55Y0Bm+Uw0L(NoG{;E`C%^9;8n< zaZE7MR>;kOa{MNeL%4y!!gk;}-G$X)Z_4k}D&*qSJK&f|K~C3;+^9kJPkdo@*~>(w z;G3awKnS=;xukH53J}0jH-Hpn-pWSta8)KtK|6~DUQ%t{PEInQaB%EU*hLkA^;u|B zz$5@FL8o^sN{;PtP+YnvZk{_~N+?I=TC~h;jUCmmhXGnvb4qO(Vt{rZqJQx5eiq-7 z-pP4EJ*0f5C%_NNqLWX*MbP;m^g!qV$~K3}a}U$;!m9cgH-*)@n*9}dD92>Bma?3i zgpr#Rgrln6si6cMELy5ZGUdGzwvA%b2XkCN9Hq4MRpN0D^#yH?+|^1}HmDNYVC1A4 zdLzK)F)i<9WLO2RP`D6stPP}I>Nf$KjO-A##c!VpB1@UN0f48;hTIUN^&fPLopI-r%hxCSL~I*lJqaxSyxs?JIcBLdvjBxDsvTA)-emE463nt3T3Mk113+!YzdN+8|5 zsNUhl)U!lHM)%k+NB$X5TB53~j5VR4{eSeh3V4H@3idArQVL%V2ine+#oy6!YUNNm z^y=nq$ZkpQt2n9NRd+8O^oYq(lx{#!P$)_wgr)$L1xQqGK&*x8q|UQSwINh$9fFz> zi(c_#mCV*ZmA$AxmCaT=)$F!`5-J{2b{X|cl9Zf)wnl6Rov@#CWnSX;DtTDvwT*Ao zp=~42LcJU+qHtt)A_q8kO}fJ4D&uHea8-us)@8_A*_ER&dAAAL^Yl~CPFr$MSXP8O(#!y^_V#3n7rDq9{CZ3J4#Xlam}+T9dSAgg7Bal)xPY;dAT(k$20 Z4-2NH`Byikw*hq2!_oFm2R?4k|Jf{`g)IO8 literal 0 HcmV?d00001 diff --git a/frontend/docs/v0/esp32s3-box3.jpg b/frontend/docs/v0/esp32s3-box3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53c4b550257fc352380dd275b246af2e0f177bd0 GIT binary patch literal 17509 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 literal 0 HcmV?d00001 diff --git a/frontend/docs/v0/lichuang-s3.jpg b/frontend/docs/v0/lichuang-s3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..721e0a07ff43d5a7bcfe98340a5bb9961dea5281 GIT binary patch literal 20482 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 literal 0 HcmV?d00001 diff --git a/frontend/docs/v0/m5stack-cores3.jpg b/frontend/docs/v0/m5stack-cores3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b123f73afa948885ce66a1ef4dfda66a8c134c78 GIT binary patch literal 19191 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